summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/ISSUE_TEMPLATE/report-a-bug-or-issue.md30
-rw-r--r--.github/workflows/build_cmake.yml360
-rw-r--r--.gitignore4
-rw-r--r--.travis.yml103
-rw-r--r--BUILD.txt2
-rw-r--r--CMakeLists.txt29
-rw-r--r--Doxyfile9
-rw-r--r--INSTALL2
-rw-r--r--README.md9
-rw-r--r--VERSION2
-rw-r--r--addon/CMakeLists.txt4
-rw-r--r--addon/doxmlparser/Doxyfile1
-rw-r--r--addon/doxmlparser/Doxyfile.impl1
-rw-r--r--addon/doxmlparser/examples/metrics/CMakeLists.txt4
-rw-r--r--addon/doxmlparser/examples/metrics/main.cpp21
-rw-r--r--addon/doxmlparser/src/CMakeLists.txt2
-rw-r--r--addon/doxmlparser/src/stringimpl.h24
-rw-r--r--addon/doxmlparser/test/CMakeLists.txt5
-rw-r--r--addon/doxmlparser/test/main.cpp21
-rw-r--r--addon/doxyapp/CMakeLists.txt28
-rw-r--r--addon/doxyapp/doxyapp.cpp148
-rw-r--r--addon/doxyparse/CMakeLists.txt16
-rw-r--r--addon/doxyparse/README40
-rw-r--r--addon/doxyparse/README.md52
-rw-r--r--addon/doxyparse/doxyparse.cpp246
-rw-r--r--addon/doxysearch/CMakeLists.txt16
-rw-r--r--addon/doxysearch/doxyindexer.cpp59
-rw-r--r--addon/doxysearch/doxysearch.cpp86
-rw-r--r--addon/doxywizard/CMakeLists.txt26
-rw-r--r--addon/doxywizard/config_doxyw.l458
-rw-r--r--addon/doxywizard/config_msg.cpp56
-rw-r--r--addon/doxywizard/config_msg.h10
-rwxr-xr-xaddon/doxywizard/doxywizard.cpp212
-rwxr-xr-xaddon/doxywizard/doxywizard.h25
-rw-r--r--addon/doxywizard/expert.cpp48
-rw-r--r--addon/doxywizard/expert.h4
-rw-r--r--addon/doxywizard/input.h1
-rw-r--r--addon/doxywizard/inputbool.cpp47
-rw-r--r--addon/doxywizard/inputbool.h1
-rw-r--r--addon/doxywizard/inputint.cpp47
-rw-r--r--addon/doxywizard/inputint.h1
-rw-r--r--addon/doxywizard/inputstring.cpp22
-rw-r--r--addon/doxywizard/inputstring.h3
-rw-r--r--addon/doxywizard/inputstrlist.cpp79
-rw-r--r--addon/doxywizard/inputstrlist.h1
-rwxr-xr-x[-rw-r--r--]addon/doxywizard/wizard.cpp106
-rw-r--r--addon/doxywizard/wizard.h7
-rw-r--r--appveyor.yml60
-rw-r--r--cmake/CompilerWarnings.cmake119
-rw-r--r--cmake/Coverage.cmake39
-rw-r--r--cmake/FindIconv.cmake2
-rwxr-xr-xcmake/FindJavacc.cmake17
-rw-r--r--cmake/Findxapian.cmake (renamed from cmake/FindXapian.cmake)22
-rw-r--r--cmake/Sanitizers/FindASan.cmake59
-rw-r--r--cmake/Sanitizers/FindMSan.cmake57
-rw-r--r--cmake/Sanitizers/FindSanitizers.cmake94
-rw-r--r--cmake/Sanitizers/FindTSan.cmake65
-rw-r--r--cmake/Sanitizers/FindUBSan.cmake46
-rw-r--r--cmake/Sanitizers/asan-wrapper55
-rw-r--r--cmake/Sanitizers/sanitize-helpers.cmake177
-rw-r--r--cmake/SearchReplace.cmake4
-rw-r--r--cmake/doxygen_version.cmake2
-rw-r--r--cmake/git_watcher.cmake15
-rw-r--r--cmake/packaging.cmake2
-rw-r--r--doc/CMakeLists.txt91
-rw-r--r--doc/Doxyfile7
-rw-r--r--doc/arch.doc120
-rw-r--r--doc/archoverview.gifbin7822 -> 0 bytes
-rw-r--r--doc/archoverview.svg625
-rw-r--r--doc/autolink.doc2
-rw-r--r--[-rwxr-xr-x]doc/changelog.doc3197
-rw-r--r--doc/commands.doc181
-rw-r--r--doc/custcmd.doc26
-rw-r--r--doc/customize.doc3
-rw-r--r--doc/docblocks.doc88
-rw-r--r--doc/doxygen_logo.eps6322
-rw-r--r--doc/doxygen_logo.gifbin29863 -> 0 bytes
-rw-r--r--doc/doxygen_logo.pdfbin0 -> 10234 bytes
-rw-r--r--doc/doxygen_logo.svg26
-rw-r--r--doc/doxygen_logo_low.gifbin3952 -> 0 bytes
-rw-r--r--doc/doxygen_manual.tex60
-rw-r--r--doc/doxywizard.gifbin18928 -> 0 bytes
-rw-r--r--doc/doxywizard_expert.pngbin24299 -> 38516 bytes
-rw-r--r--doc/doxywizard_main.pngbin39432 -> 24624 bytes
-rw-r--r--doc/doxywizard_menu.pngbin46176 -> 0 bytes
-rw-r--r--doc/doxywizard_menu_file.pngbin0 -> 5242 bytes
-rw-r--r--doc/doxywizard_menu_help.pngbin0 -> 2035 bytes
-rw-r--r--doc/doxywizard_menu_settings.pngbin0 -> 2903 bytes
-rw-r--r--doc/doxywizard_page1.pngbin29943 -> 23796 bytes
-rw-r--r--doc/doxywizard_page2.pngbin29907 -> 26879 bytes
-rw-r--r--doc/doxywizard_page3.pngbin38861 -> 25940 bytes
-rw-r--r--doc/doxywizard_page4.pngbin33348 -> 24864 bytes
-rw-r--r--doc/doxywizard_run.pngbin0 -> 16756 bytes
-rw-r--r--doc/doxywizard_usage.doc318
-rw-r--r--doc/emojisup.doc12
-rw-r--r--doc/expert_bool.pngbin0 -> 753 bytes
-rw-r--r--doc/expert_enum.pngbin0 -> 1126 bytes
-rw-r--r--doc/expert_int.pngbin0 -> 988 bytes
-rw-r--r--doc/expert_list_dir.pngbin0 -> 3674 bytes
-rw-r--r--doc/expert_list_file.pngbin0 -> 3956 bytes
-rw-r--r--doc/expert_list_filedir.pngbin0 -> 4295 bytes
-rw-r--r--doc/expert_list_string.pngbin0 -> 4585 bytes
-rw-r--r--doc/expert_string_dir.pngbin0 -> 2196 bytes
-rw-r--r--doc/expert_string_file.pngbin0 -> 2167 bytes
-rw-r--r--doc/expert_string_image.pngbin0 -> 3193 bytes
-rw-r--r--doc/expert_string_string.pngbin0 -> 1458 bytes
-rw-r--r--doc/faq.doc105
-rw-r--r--doc/features.doc4
-rw-r--r--doc/formulas.doc3
-rw-r--r--doc/htmlcmds.doc1
-rw-r--r--doc/index.doc95
-rw-r--r--doc/index.hhp.txt8
-rw-r--r--doc/install.doc120
-rw-r--r--doc/language.tpl28
-rw-r--r--doc/manual.sty50
-rw-r--r--doc/markdown.doc5
-rw-r--r--doc/output.doc2
-rw-r--r--doc/starting.doc246
-rw-r--r--doc/translator.py30
-rw-r--r--doc/xmlcmds.doc2
-rw-r--r--examples/CMakeLists.txt284
-rw-r--r--examples/afterdoc.cfg5
-rw-r--r--examples/author.cfg5
-rw-r--r--examples/autolink.cfg5
-rw-r--r--examples/class.cfg5
-rw-r--r--examples/define.cfg5
-rw-r--r--examples/diagrams.cfg5
-rw-r--r--examples/docstring.cfg5
-rw-r--r--examples/enum.cfg5
-rw-r--r--examples/example.cfg5
-rw-r--r--examples/file.cfg5
-rw-r--r--examples/func.cfg5
-rw-r--r--examples/group.cfg5
-rw-r--r--examples/include.cfg5
-rw-r--r--examples/javadoc-banner.cfg5
-rw-r--r--examples/jdstyle.cfg5
-rw-r--r--examples/manual.cfg5
-rw-r--r--examples/memgrp.cfg5
-rw-r--r--examples/mux.cfg5
-rw-r--r--examples/overload.cfg5
-rw-r--r--examples/page.cfg5
-rw-r--r--examples/par.cfg5
-rw-r--r--examples/pyexample.cfg5
-rw-r--r--examples/qtstyle.cfg5
-rw-r--r--examples/relates.cfg5
-rw-r--r--examples/restypedef.cfg5
-rw-r--r--examples/structcmd.cfg5
-rw-r--r--examples/tag.cfg5
-rw-r--r--examples/tclexample.cfg14
-rw-r--r--examples/tclexample.tcl82
-rw-r--r--examples/templ.cfg5
-rw-r--r--libmscgen/CMakeLists.txt8
-rw-r--r--libmscgen/gd.c4
-rw-r--r--libmscgen/mscgen_api.c18
-rw-r--r--libmscgen/mscgen_gd_out.c2
-rw-r--r--libmscgen/mscgen_language.y3
-rw-r--r--libmscgen/mscgen_lexer.h1
-rw-r--r--libmscgen/mscgen_lexer.l7
-rw-r--r--libversion/CMakeLists.txt9
-rw-r--r--libversion/doxyversion.cpp.in2
-rw-r--r--libversion/fullversion.cpp22
-rw-r--r--libversion/gitversion.cpp.in17
-rw-r--r--libversion/version.h13
-rw-r--r--qtools/CMakeLists.txt10
-rw-r--r--qtools/Doxyfile1
-rw-r--r--qtools/qasciidict.h2
-rw-r--r--qtools/qcache.h105
-rw-r--r--qtools/qcollection.cpp2
-rw-r--r--qtools/qcollection.h3
-rw-r--r--qtools/qcstring.cpp354
-rw-r--r--qtools/qcstring.h810
-rw-r--r--qtools/qcstringlist.h4
-rw-r--r--qtools/qdatastream.cpp17
-rw-r--r--qtools/qfile.cpp4
-rw-r--r--qtools/qgcache.cpp878
-rw-r--r--qtools/qgcache.h130
-rw-r--r--qtools/qglist.cpp28
-rw-r--r--qtools/qglist.h5
-rw-r--r--qtools/qglobal.h1
-rw-r--r--qtools/qgstring.h2
-rw-r--r--qtools/qgvector.cpp638
-rw-r--r--qtools/qgvector.h120
-rw-r--r--qtools/qintdict.h2
-rw-r--r--qtools/qinternallist.h3
-rw-r--r--qtools/qlist.doc11
-rw-r--r--qtools/qmap.h3
-rw-r--r--qtools/qmutex.cpp95
-rw-r--r--qtools/qmutex.h83
-rw-r--r--qtools/qmutex_p.h90
-rw-r--r--qtools/qmutex_unix.cpp117
-rw-r--r--qtools/qmutex_win32.cpp108
-rw-r--r--qtools/qptrdict.h2
-rw-r--r--qtools/qregexp.cpp9
-rw-r--r--qtools/qshared.h8
-rw-r--r--qtools/qstring.h21
-rw-r--r--qtools/qtextcodec.cpp2
-rw-r--r--qtools/qthread.cpp86
-rw-r--r--qtools/qthread.h77
-rw-r--r--qtools/qthread_p.h85
-rw-r--r--qtools/qthread_unix.cpp239
-rw-r--r--qtools/qthread_win32.cpp158
-rw-r--r--qtools/qtools.pro.in101
-rw-r--r--qtools/qvaluelist.h20
-rw-r--r--qtools/qvector.doc344
-rw-r--r--qtools/qvector.h85
-rw-r--r--qtools/qwaitcondition.h68
-rw-r--r--qtools/qwaitcondition_unix.cpp134
-rw-r--r--qtools/qwaitcondition_win32.cpp186
-rw-r--r--src/CMakeLists.txt171
-rw-r--r--src/arguments.h83
-rw-r--r--src/bufstr.h8
-rw-r--r--src/cache.h162
-rw-r--r--src/cite.cpp449
-rw-r--r--src/cite.h86
-rw-r--r--src/clangparser.cpp673
-rw-r--r--src/clangparser.h81
-rw-r--r--src/classdef.cpp2051
-rw-r--r--src/classdef.h256
-rw-r--r--src/classlist.cpp205
-rw-r--r--src/classlist.h65
-rw-r--r--src/cmdmapper.cpp4
-rw-r--r--src/cmdmapper.h6
-rw-r--r--src/code.l4538
-rw-r--r--src/commentcnv.l154
-rw-r--r--src/commentscan.h15
-rw-r--r--src/commentscan.l2897
-rw-r--r--src/condparser.cpp19
-rw-r--r--src/config.h31
-rw-r--r--src/config.xml203
-rwxr-xr-xsrc/configgen.py124
-rw-r--r--src/configimpl.h92
-rw-r--r--src/configimpl.l1417
-rw-r--r--src/constexp.l19
-rw-r--r--src/constexp.y2
-rw-r--r--src/containers.h36
-rw-r--r--src/context.cpp1468
-rw-r--r--src/context.h242
-rw-r--r--src/debug.cpp137
-rw-r--r--src/debug.h24
-rw-r--r--src/declinfo.l32
-rw-r--r--src/defargs.h12
-rw-r--r--src/defargs.l62
-rw-r--r--src/defgen.cpp220
-rw-r--r--src/define.cpp54
-rw-r--r--src/define.h90
-rw-r--r--src/definition.cpp1032
-rw-r--r--src/definition.h202
-rw-r--r--src/definitionimpl.h534
-rw-r--r--src/diagram.cpp697
-rw-r--r--src/diagram.h13
-rw-r--r--src/dirdef.cpp302
-rw-r--r--src/dirdef.h139
-rw-r--r--src/docbookgen.cpp231
-rw-r--r--src/docbookgen.h189
-rw-r--r--src/docbookvisitor.cpp367
-rw-r--r--src/docbookvisitor.h13
-rw-r--r--src/docgroup.cpp50
-rw-r--r--src/docgroup.h2
-rw-r--r--src/docparser.cpp1264
-rw-r--r--src/docparser.h172
-rw-r--r--src/docsets.cpp59
-rw-r--r--src/doctokenizer.h12
-rw-r--r--src/doctokenizer.l976
-rw-r--r--src/docvisitor.cpp58
-rw-r--r--src/docvisitor.h28
-rw-r--r--src/dot.cpp118
-rw-r--r--src/dot.h14
-rw-r--r--src/dotcallgraph.cpp78
-rw-r--r--src/dotclassgraph.cpp125
-rw-r--r--src/dotdirdeps.cpp144
-rw-r--r--src/dotfilepatcher.cpp54
-rw-r--r--src/dotgfxhierarchytable.cpp196
-rw-r--r--src/dotgfxhierarchytable.h21
-rw-r--r--src/dotgraph.cpp28
-rw-r--r--src/dotgraph.h5
-rw-r--r--src/dotgroupcollaboration.cpp128
-rw-r--r--src/dotlegendgraph.cpp2
-rw-r--r--src/dotnode.cpp194
-rw-r--r--src/dotnode.h32
-rw-r--r--src/dotrunner.cpp106
-rw-r--r--src/dotrunner.h98
-rw-r--r--src/doxygen.cpp6831
-rw-r--r--src/doxygen.h145
-rw-r--r--src/doxygen.md37
-rw-r--r--src/entry.cpp58
-rw-r--r--src/entry.h23
-rw-r--r--src/example.h32
-rw-r--r--src/filedef.cpp1006
-rw-r--r--src/filedef.h92
-rw-r--r--src/filename.cpp154
-rw-r--r--src/filename.h87
-rw-r--r--src/formula.cpp618
-rw-r--r--src/formula.h58
-rw-r--r--src/fortrancode.h16
-rw-r--r--src/fortrancode.l2089
-rw-r--r--src/fortranscanner.h12
-rw-r--r--src/fortranscanner.l167
-rw-r--r--src/ftextstream.h3
-rw-r--r--src/ftvhelp.cpp62
-rw-r--r--src/ftvhelp.h21
-rw-r--r--src/groupdef.cpp926
-rw-r--r--src/groupdef.h75
-rw-r--r--src/growbuf.h53
-rw-r--r--src/htags.cpp32
-rw-r--r--src/htmldocvisitor.cpp381
-rw-r--r--src/htmlentity.cpp4
-rw-r--r--src/htmlgen.cpp383
-rw-r--r--src/htmlgen.h85
-rw-r--r--src/htmlhelp.cpp617
-rw-r--r--src/htmlhelp.h39
-rw-r--r--src/image.cpp105
-rw-r--r--src/image.h40
-rw-r--r--src/index.cpp1974
-rw-r--r--src/index.h32
-rw-r--r--src/language.cpp2
-rw-r--r--src/latexdocvisitor.cpp367
-rw-r--r--src/latexdocvisitor.h26
-rw-r--r--src/latexgen.cpp661
-rw-r--r--src/latexgen.h81
-rw-r--r--src/layout.cpp1819
-rw-r--r--src/layout.h61
-rw-r--r--src/linkedmap.h267
-rw-r--r--src/mandocvisitor.cpp173
-rw-r--r--src/mangen.cpp212
-rw-r--r--src/mangen.h65
-rw-r--r--src/markdown.cpp1135
-rw-r--r--src/markdown.h88
-rw-r--r--src/memberdef.cpp835
-rw-r--r--src/memberdef.h118
-rw-r--r--src/membergroup.cpp136
-rw-r--r--src/membergroup.h68
-rw-r--r--src/memberlist.cpp410
-rw-r--r--src/memberlist.h53
-rw-r--r--src/membername.cpp77
-rw-r--r--src/membername.h144
-rw-r--r--src/message.cpp99
-rw-r--r--src/message.h40
-rw-r--r--src/namespacedef.cpp797
-rw-r--r--src/namespacedef.h171
-rw-r--r--src/objcache.cpp329
-rw-r--r--src/objcache.h127
-rw-r--r--src/outputgen.cpp114
-rw-r--r--src/outputgen.h171
-rw-r--r--src/outputlist.cpp98
-rw-r--r--src/outputlist.h218
-rw-r--r--src/pagedef.cpp170
-rw-r--r--src/pagedef.h47
-rw-r--r--src/parserintf.h128
-rw-r--r--src/perlmodgen.cpp358
-rw-r--r--src/plantuml.cpp102
-rw-r--r--src/plantuml.h18
-rw-r--r--src/portable.cpp102
-rw-r--r--src/portable.h22
-rw-r--r--src/pre.l1469
-rw-r--r--src/printdocvisitor.h4
-rw-r--r--src/pycode.h13
-rw-r--r--src/pycode.l2402
-rw-r--r--src/pyscanner.h15
-rw-r--r--src/pyscanner.l103
-rw-r--r--src/reflist.cpp244
-rw-r--r--src/reflist.h142
-rwxr-xr-xsrc/res2cc_cmd.py16
-rw-r--r--src/resourcemgr.cpp65
-rw-r--r--src/resourcemgr.h9
-rw-r--r--src/rtfdocvisitor.cpp250
-rw-r--r--src/rtfgen.cpp494
-rw-r--r--src/rtfgen.h83
-rw-r--r--src/rtfstyle.cpp37
-rw-r--r--src/rtfstyle.h30
-rw-r--r--src/scanner.h13
-rw-r--r--src/scanner.l10521
-rw-r--r--src/scopedtypevariant.h292
-rw-r--r--src/searchindex.cpp975
-rw-r--r--src/searchindex.h116
-rw-r--r--src/section.h167
-rw-r--r--src/sortdict.h368
-rw-r--r--src/sqlcode.h13
-rw-r--r--src/sqlcode.l315
-rw-r--r--src/sqlite3gen.cpp450
-rw-r--r--src/symbolmap.h79
-rw-r--r--src/symbolresolver.cpp1114
-rw-r--r--src/symbolresolver.h104
-rw-r--r--src/tagreader.cpp1857
-rw-r--r--src/tclscanner.h63
-rw-r--r--src/tclscanner.l3145
-rw-r--r--src/template.cpp176
-rw-r--r--src/template.h24
-rw-r--r--src/threadpool.h151
-rwxr-xr-xsrc/to_c_cmd.py8
-rw-r--r--src/tooltip.cpp137
-rw-r--r--src/tooltip.h25
-rw-r--r--src/translator.h13
-rw-r--r--src/translator_adapter.h39
-rw-r--r--src/translator_am.h7
-rw-r--r--src/translator_ar.h4
-rw-r--r--src/translator_br.h21
-rw-r--r--src/translator_ca.h10
-rw-r--r--src/translator_cn.h13
-rw-r--r--src/translator_cz.h15
-rw-r--r--src/translator_de.h35
-rw-r--r--src/translator_dk.h10
-rw-r--r--src/translator_en.h23
-rw-r--r--src/translator_eo.h11
-rw-r--r--src/translator_es.h19
-rw-r--r--src/translator_fa.h5
-rw-r--r--src/translator_fi.h9
-rw-r--r--src/translator_fr.h1943
-rw-r--r--src/translator_gr.h48
-rw-r--r--src/translator_hr.h4
-rw-r--r--src/translator_hu.h20
-rw-r--r--src/translator_id.h9
-rw-r--r--src/translator_it.h19
-rw-r--r--src/translator_je.h5
-rw-r--r--src/translator_jp.h24
-rw-r--r--src/translator_ke.h5
-rw-r--r--src/translator_kr.h14
-rw-r--r--src/translator_lt.h9
-rw-r--r--src/translator_lv.h11
-rw-r--r--src/translator_mk.h9
-rw-r--r--src/translator_nl.h39
-rwxr-xr-x[-rw-r--r--]src/translator_no.h10
-rw-r--r--src/translator_pl.h11
-rw-r--r--src/translator_pt.h21
-rw-r--r--src/translator_ro.h18
-rw-r--r--src/translator_ru.h21
-rw-r--r--src/translator_sc.h10
-rw-r--r--src/translator_si.h7
-rw-r--r--src/translator_sk.h13
-rw-r--r--src/translator_sr.h8
-rw-r--r--src/translator_sv.h333
-rw-r--r--src/translator_tr.h7
-rw-r--r--src/translator_tw.h14
-rw-r--r--src/translator_ua.h10
-rw-r--r--src/translator_vi.h8
-rw-r--r--src/translator_za.h12
-rw-r--r--src/types.h8
-rw-r--r--src/util.cpp3896
-rw-r--r--src/util.h159
-rw-r--r--src/vhdlcode.h25
-rw-r--r--src/vhdlcode.l2315
-rw-r--r--src/vhdldocgen.cpp771
-rw-r--r--src/vhdldocgen.h56
-rw-r--r--src/vhdljjparser.cpp218
-rwxr-xr-x[-rw-r--r--]src/vhdljjparser.h10
-rw-r--r--src/xml.h74
-rw-r--r--src/xml.l484
-rw-r--r--src/xmlcode.h13
-rw-r--r--src/xmlcode.l617
-rw-r--r--src/xmldocvisitor.cpp294
-rw-r--r--src/xmlgen.cpp656
-rw-r--r--src/xmlgen.h10
-rw-r--r--templates/general/layout_default.xml (renamed from src/layout_default.xml)0
-rwxr-xr-xtemplates/html/bib2xhtml.pl11
-rw-r--r--templates/html/close.svg31
-rw-r--r--templates/html/doxygen.css152
-rw-r--r--templates/html/doxygen.luma68
-rw-r--r--templates/html/doxygen.svg26
-rw-r--r--templates/html/dynsections.js33
-rw-r--r--templates/html/extsearch.js33
-rw-r--r--templates/html/footer.html8
-rw-r--r--templates/html/htmlbase.tpl11
-rw-r--r--templates/html/htmlhelpindexhhp.tpl2
-rw-r--r--templates/html/htmllayout.tpl6
-rw-r--r--templates/html/htmlmemdef.tpl1
-rw-r--r--templates/html/htmlsearchresult.tpl14
-rw-r--r--templates/html/htmltabs.tpl6
-rw-r--r--templates/html/mag.svg37
-rw-r--r--templates/html/mag_sel.svg74
-rw-r--r--templates/html/menu.js37
-rw-r--r--templates/html/navtree.js32
-rw-r--r--templates/html/resize.js37
-rw-r--r--templates/html/search.css104
-rw-r--r--templates/html/search.js52
-rw-r--r--templates/html/search_functions.php8
-rw-r--r--templates/html/svgpan.js76
-rw-r--r--templates/latex/doxygen.sty6
-rw-r--r--templates/xml/compound.xsd21
-rw-r--r--templates/xml/index.xsd3
-rw-r--r--templates/xml/xml.xsd23
-rw-r--r--testing/001/indexpage.xml2
-rw-r--r--testing/002/indexpage.xml2
-rw-r--r--testing/003/indexpage.xml2
-rw-r--r--testing/004/indexpage.xml2
-rw-r--r--testing/005/indexpage.xml2
-rw-r--r--testing/006/indexpage.xml2
-rw-r--r--testing/007/indexpage.xml2
-rw-r--r--testing/008/008__brief_8c.xml2
-rw-r--r--testing/009/bug.xml2
-rw-r--r--testing/009/class_bug.xml4
-rw-r--r--testing/009/class_deprecated.xml4
-rw-r--r--testing/009/class_reminder.xml4
-rw-r--r--testing/009/class_test.xml4
-rw-r--r--testing/009/class_todo.xml4
-rw-r--r--testing/009/deprecated.xml2
-rw-r--r--testing/009/reminders.xml2
-rw-r--r--testing/009/test.xml2
-rw-r--r--testing/009/todo.xml2
-rw-r--r--testing/010/indexpage.xml2
-rw-r--r--testing/011/category_integer_07_arithmetic_08.xml4
-rw-r--r--testing/011/interface_integer.xml4
-rw-r--r--testing/012/citelist.xml8
-rw-r--r--testing/012/indexpage.xml2
-rw-r--r--testing/013/class_t1.xml4
-rw-r--r--testing/013/class_t2.xml4
-rw-r--r--testing/013/class_t3.xml4
-rw-r--r--testing/013/class_t4.xml4
-rw-r--r--testing/014/indexpage.xml2
-rw-r--r--testing/015/015__cond_8c.xml2
-rw-r--r--testing/016/016__copydoc_8c.xml2
-rw-r--r--testing/017/indexpage.xml2
-rw-r--r--testing/018/018__def_8c.xml4
-rw-r--r--testing/019/group__g1.xml4
-rw-r--r--testing/019/group__g2.xml4
-rw-r--r--testing/019/group__g3.xml4
-rw-r--r--testing/019_defgroup.c2
-rw-r--r--testing/020/indexpage.xml2
-rw-r--r--testing/021/indexpage.xml4
-rw-r--r--testing/022/indexpage.xml2
-rw-r--r--testing/023/indexpage.xml2
-rw-r--r--testing/024/indexpage.xml18
-rw-r--r--testing/024_if.dox20
-rw-r--r--testing/025/class_test.xml4
-rw-r--r--testing/025/example_test_8cpp-example.xml2
-rw-r--r--testing/026/class_test.xml4
-rw-r--r--testing/027/struct_car.xml4
-rw-r--r--testing/027/struct_object.xml4
-rw-r--r--testing/027/struct_truck.xml4
-rw-r--r--testing/027/struct_vehicle.xml4
-rw-r--r--testing/028/indexpage.xml2
-rw-r--r--testing/029/029__hideinit_8c.xml2
-rw-r--r--testing/030/indexpage.xml2
-rw-r--r--testing/031/indexpage.xml34
-rw-r--r--testing/031_image.dox36
-rw-r--r--testing/032/indexpage.xml2
-rw-r--r--testing/033/indexpage.xml2
-rw-r--r--testing/034/indexpage.xml2
-rw-r--r--testing/035/035__invariant_8c.xml2
-rw-r--r--testing/036/036__link_8c.xml2
-rw-r--r--testing/037/037__msc_8cpp.xml27
-rw-r--r--testing/037/class_receiver.xml6
-rw-r--r--testing/037/class_sender.xml6
-rw-r--r--testing/037_msc.cpp18
-rw-r--r--testing/038/indexpage.xml2
-rw-r--r--testing/039/class_test.xml4
-rw-r--r--testing/040/namespace_n_s.xml4
-rw-r--r--testing/041/class_test.xml4
-rw-r--r--testing/042/namespaceorg_1_1doxygen_1_1_test.xml2
-rw-r--r--testing/043/another.xml2
-rw-r--r--testing/043/mypage.xml2
-rw-r--r--testing/044/struct_s.xml4
-rw-r--r--testing/045/indexpage.xml2
-rw-r--r--testing/046/046__related_8cpp.xml2
-rw-r--r--testing/046/class_test.xml4
-rw-r--r--testing/047/047__return_8cpp.xml2
-rw-r--r--testing/048/048__showinit_8c.xml2
-rw-r--r--testing/049/indexpage.xml2
-rw-r--r--testing/050/indexpage.xml8
-rw-r--r--testing/051/indexpage.xml2
-rw-r--r--testing/052/indexpage.xml2
-rw-r--r--testing/053/indexpage.xml2
-rw-r--r--testing/054/054__parblock_8cpp.xml2
-rw-r--r--testing/055/md_055_markdown.xml8
-rw-r--r--testing/055_markdown.md4
-rw-r--r--testing/056/indexpage.xml2
-rw-r--r--testing/057/057__caller__graphs_8tcl.xml92
-rw-r--r--testing/057/__057__caller__graphs_8tcl.xml28
-rw-r--r--testing/057/namespace1.xml113
-rw-r--r--testing/057/namespace1_1_11.xml28
-rw-r--r--testing/057/namespace1_1_11_1_11.xml26
-rw-r--r--testing/057/namespace2.xml30
-rw-r--r--testing/057/namespace2_1_12.xml29
-rw-r--r--testing/057/namespace2_1_12_1_12.xml29
-rw-r--r--testing/057/namespace2_1_12_1_12_1_12.xml29
-rw-r--r--testing/057/namespace2_1_12_1_12_1_12_1_12.xml28
-rw-r--r--testing/057/namespacebar.xml57
-rw-r--r--testing/057/namespacefoo.xml27
-rw-r--r--testing/057/namespacelibrary.xml32
-rw-r--r--testing/057/namespacelibrary_1_1v1.xml30
-rw-r--r--testing/057/namespacelibrary_1_1v2.xml30
-rw-r--r--testing/057_caller_graphs.tcl155
-rw-r--r--testing/057_inlinenamespace.cpp37
-rw-r--r--testing/058/058__bracket__recursion_8tcl.xml384
-rw-r--r--testing/058_bracket_recursion.tcl157
-rw-r--r--testing/059/059__command__catch_8tcl.xml191
-rw-r--r--testing/059_command_catch.tcl87
-rw-r--r--testing/060/060__command__switch_8tcl.xml326
-rw-r--r--testing/060_command_switch.tcl238
-rw-r--r--testing/061/class_test.xml70
-rw-r--r--testing/061_bug_705503.tcl19
-rw-r--r--testing/062/namespacen1.xml42
-rw-r--r--testing/062/namespacen2.xml42
-rw-r--r--testing/062/namespacen3.xml42
-rw-r--r--testing/062_namespace_resolution.tcl68
-rw-r--r--testing/063/namespaceoo.xml13
-rw-r--r--testing/063/namespaceoo_1_1_helpers.xml27
-rw-r--r--testing/063/namespaceoo_1_1define.xml27
-rw-r--r--testing/063_bug_729092.tcl43
-rw-r--r--testing/064/struct_foo.xml4
-rw-r--r--testing/065/indexpage.xml2
-rw-r--r--testing/066/class_class1.xml4
-rw-r--r--testing/067/067__link__varargs_8cpp.xml2
-rw-r--r--testing/068/068__ref__varargs_8cpp.xml2
-rw-r--r--testing/069/069__link__variadic__template_8cpp.xml2
-rw-r--r--testing/070/070__ref__variadic__template_8cpp.xml2
-rw-r--r--testing/071/namespace_a_namespace_1_1_0d0.xml6
-rw-r--r--testing/072/072__using_8cpp.xml2
-rw-r--r--testing/073/073__typed__enum_8cpp.xml100
-rw-r--r--testing/073_typed_enum.cpp18
-rw-r--r--testing/074/namespacens.xml4
-rw-r--r--testing/074/struct_foo.xml4
-rw-r--r--testing/075/struct_foo.xml4
-rw-r--r--testing/076/indexpage.xml2
-rw-r--r--testing/077/077__no__xml__namespace__members__in__file__scope_8h.xml2
-rw-r--r--testing/078/078__xml__namespace__members__in__file__scope_8h.xml4
-rw-r--r--testing/079/empty.xml2
-rw-r--r--testing/079/levels.xml2
-rw-r--r--testing/080/class_interface.xml4
-rw-r--r--testing/081/081__brief__lists_8h.xml2
-rw-r--r--testing/082/namespace_n.xml4
-rw-r--r--testing/083/namespace_n.xml4
-rw-r--r--testing/084/084__markdown__pre_8f90.xml2
-rw-r--r--testing/085/085__tooltip_8cpp.xml6
-rw-r--r--testing/086/086__style__tags_8h.xml2
-rw-r--r--testing/CMakeLists.txt27
-rw-r--r--testing/README.txt26
-rw-r--r--testing/_057_caller_graphs.tcl4
-rwxr-xr-xtesting/runtests.py119
-rw-r--r--testing/sample.bib6
-rwxr-xr-xtesting/testsqlite3.py12
-rw-r--r--vhdlparser/CMakeLists.txt38
-rw-r--r--vhdlparser/CharStream.cc22
-rw-r--r--vhdlparser/CharStream.h106
-rw-r--r--vhdlparser/ErrorHandler.h24
-rw-r--r--vhdlparser/JavaCC.h4
-rw-r--r--vhdlparser/JavaCC.h.in47
-rw-r--r--vhdlparser/Makefile54
-rw-r--r--vhdlparser/ParseException.cc52
-rw-r--r--vhdlparser/ParseException.h24
-rw-r--r--vhdlparser/Token.cc37
-rw-r--r--vhdlparser/Token.h18
-rw-r--r--vhdlparser/TokenManager.h15
-rw-r--r--vhdlparser/TokenMgrError.cc28
-rw-r--r--vhdlparser/TokenMgrError.h20
-rw-r--r--vhdlparser/VhdlParser.cc6556
-rw-r--r--vhdlparser/VhdlParser.h6152
-rw-r--r--vhdlparser/VhdlParserConstants.h389
-rw-r--r--vhdlparser/VhdlParserErrorHandler.hpp10
-rw-r--r--vhdlparser/VhdlParserTokenManager.cc922
-rw-r--r--vhdlparser/VhdlParserTokenManager.h83
-rw-r--r--vhdlparser/vhdl_adj.py25
-rwxr-xr-x[-rw-r--r--]vhdlparser/vhdlparser.jj282
-rwxr-xr-x[-rw-r--r--]vhdlparser/vhdlstring.h29
652 files changed, 57074 insertions, 71125 deletions
diff --git a/.github/ISSUE_TEMPLATE/report-a-bug-or-issue.md b/.github/ISSUE_TEMPLATE/report-a-bug-or-issue.md
new file mode 100644
index 0000000..d328fe7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/report-a-bug-or-issue.md
@@ -0,0 +1,30 @@
+---
+name: Report a bug or issue
+about: Create a report to help us improve doxygen
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+Describe what you see that (you think) is wrong.
+
+**Expected behavior**
+Describe what you would have expected or think is correct.
+
+**Screenshots**
+If useful, add screenshots to help explain your problem.
+
+**To Reproduce**
+Attach a self contained example that allows us to reproduce the problem.
+Such an example typically exist of some source code (can be dummy code) and a doxygen configuration file used (you can strip it using `doxygen -s -u`). After you verified the example demonstrates the problem, put it in a zip (or tarball) and attach it to the bug report. Try to avoid linking to external sources, since they might disappear in the future.
+
+**Version**
+Mention the version of doxygen used (output of `doxygen --version`) and the platform on which you run doxygen (e.g. Windows 10, 64 bit). If you run doxygen under Linux please also mention the name and version of the distribution used (output of `lsb_release -a`) and mention if you compiled doxygen yourself or that you use a binary that comes with the distribution or from the doxygen website.
+
+**Stack trace**
+If you encounter a crash and can build doxygen from sources yourself with debug info (`-DCMAKE_BUILD_TYPE=Debug`), a stack trace can be very helpful (especially if it is not possible to capture the problem in a small example that can be shared).
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml
new file mode 100644
index 0000000..555319e
--- /dev/null
+++ b/.github/workflows/build_cmake.yml
@@ -0,0 +1,360 @@
+name: CMake Build for Doxygen
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ name: ${{ matrix.config.name }}
+ runs-on: ${{ matrix.config.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ config:
+ - {
+ name: "Ubuntu Latest GCC Release",
+ os: ubuntu-18.04,
+ build_type: "Release", cc: "gcc", cxx: "g++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Dbuild_search=YES -Dbuild_app=YES -Dbuild_parse=YES -Dbuild_xmlparser=YES"
+ }
+ - {
+ name: "Ubuntu Latest GCC Debug",
+ os: ubuntu-18.04,
+ build_type: "Debug", cc: "gcc", cxx: "g++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Dbuild_search=YES -Dbuild_app=YES -Dbuild_parse=YES -Dbuild_xmlparser=YES"
+ }
+ - {
+ name: "Ubuntu Latest Clang Release",
+ os: ubuntu-20.04,
+ build_type: "Release", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Duse_libclang=YES -Dstatic_libclang=YES -Duse_libc++=NO"
+ }
+ - {
+ name: "Ubuntu Latest Clang Debug",
+ os: ubuntu-20.04,
+ build_type: "Debug", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles",
+ cmake_extra_opts: "-Duse_libclang=YES -Dstatic_libclang=YES -Duse_libc++=NO"
+ }
+ - {
+ name: "macOS Latest Release",
+ os: macos-latest,
+ build_type: "Release", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles"
+ }
+ - {
+ name: "macOS Latest Debug",
+ os: macos-latest,
+ build_type: "Debug", cc: "clang", cxx: "clang++",
+ build_gen: "Unix Makefiles"
+ }
+ - {
+ name: "Windows Latest MSVC Debug",
+ os: windows-latest,
+ build_type: "Debug", cc: "cl", cxx: "cl",
+ build_gen: "NMake Makefiles"
+ }
+ - {
+ name: "Windows Latest MSVC Release",
+ os: windows-latest,
+ build_type: "Release", cc: "cl", cxx: "cl",
+ build_gen: "NMake Makefiles"
+ }
+ steps:
+ - uses: actions/checkout@v1
+
+ - name: Download MikTex (Windows)
+ run: |
+ $wc = New-Object System.Net.WebClient;
+ $maxAttempts=5;
+ $attemptCount=0;
+ Do {
+ $attemptCount++;
+ Try {
+ $wc.DownloadFile("https://ctan.math.illinois.edu/systems/win32/miktex/setup/windows-x64/miktexsetup-4.0-x64.zip","miktexsetup-4.0-x64.zip")
+ } Catch [Exception] {
+ Write-Host $_.Exception | format-list -force
+ }
+ } while (((Test-Path "miktexsetup-x64.zip") -eq $false) -and ($attemptCount -le $maxAttempts))
+ shell: pwsh
+ if: matrix.config.os == 'windows-latest'
+
+ - uses: suisei-cn/actions-download-file@v1
+ with:
+ url: "https://github.com/pffang/libiconv-for-Windows/releases/download/v1.16/libiconv-for-Windows_1.16.7z"
+ target: .
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install LaTeX (Linux)
+ run: sudo apt-get install texlive texlive-latex-recommended texlive-extra-utils texlive-latex-extra texlive-font-utils
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install LaTeX (MacOS)
+ run: |
+ brew install --cask mactex;
+ echo "/Library/TeX/texbin/" >> $GITHUB_PATH
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install libclang (Ubuntu 20.04)
+ run: |
+ sudo apt remove llvm-8 clang-8 libclang-common-8-dev clang-format-8 libllvm8
+ #sudo apt remove llvm-10 llvm-10-dev llvm-10-tools llvm-10-runtime clang-10 clang-format-10 libclang-common-10-dev libclang-cpp10 libclang1-10 libllvm10
+ sudo apt-get autoremove
+ sudo apt-get clean
+ #sudo apt install libclang-9-dev libclang-common-9-dev
+ sudo apt install libclang-10-dev libclang-common-10-dev
+ apt list --installed | egrep '(clang|llvm)'
+ ls -d /usr/lib/llvm-*/include/
+ clang++ -v
+ if: matrix.config.os == 'ubuntu-20.04'
+
+ - name: Install libxapian (Ubuntu 18.04)
+ run: |
+ sudo apt install libxapian-dev
+ if: matrix.config.os == 'ubuntu-18.04'
+
+ - name: Extract MikTex zip (Windows)
+ shell: bash
+ run: |
+ unzip miktexsetup-4.0-x64.zip
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Download MikTex packages (Windows)
+ shell: bash
+ run: |
+ ./miktexsetup --verbose \
+ --local-package-repository=C:/miktex-repository \
+ --remote-package-repository="https://ctan.math.illinois.edu/systems/win32/miktex/tm/packages/" \
+ --package-set=essential \
+ download
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install MikTex packages (Windows)
+ shell: bash
+ run: |
+ ./miktexsetup --local-package-repository=C:/miktex-repository \
+ --package-set=essential \
+ --shared \
+ install
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Setting MikTex paths (Windows)
+ shell: bash
+ run: |
+ echo "C:/Program Files/MiKTeX/miktex/bin/x64/" >> $GITHUB_PATH
+ export PATH="/c/Program Files/MiKTeX/miktex/bin/x64/:$PATH"
+
+ echo "Configuring MiKTeX to install missing packages on the fly"
+ initexmf --admin --verbose --set-config-value='[MPM]AutoInstall=1'
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install Ghostscript (Linux)
+ run: sudo apt-get install ghostscript
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install Ghostscript (Windows)
+ run:
+ choco install ghostscript
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Setting Ghostscript paths (Windows)
+ shell: bash
+ run: |
+ echo "C:/Program Files (x86)/gs/gs9.53.3/bin/" >> $GITHUB_PATH
+ echo "C:/Program Files/gs/gs9.53.3/bin/" >> $GITHUB_PATH
+ export PATH="/c/Program Files (x86)/gs/gs9.53.3/bin/:$PATH"
+ export PATH="/c/Program Files/gs/gs9.53.3/bin/:$PATH"
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install xmllint (Linux)
+ run: sudo apt-get install libxml2-utils
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install xmllint (MacOS)
+ run: brew install libxml2
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install bison (MacOS)
+ run: |
+ brew install bison;
+ echo "/usr/local/opt/bison/bin" >> $GITHUB_PATH
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install bison/flex (Windows)
+ run:
+ choco install winflexbison
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install Graphviz (Linux)
+ run: sudo apt-get install graphviz
+ if: startsWith(matrix.config.os,'ubuntu-')
+
+ - name: Install Graphviz (MacOS)
+ run: brew install graphviz
+ if: matrix.config.os == 'macos-latest'
+
+ - name: Install Graphviz (Windows)
+ run:
+ choco install graphviz.portable
+ if: matrix.config.os == 'windows-latest'
+
+# - name: Install Perl (Windows)
+# run:
+# choco install activeperl
+# if: matrix.config.os == 'windows-latest'
+
+ - name: Setup VS Environment (Windows)
+ uses: seanmiddleditch/gha-setup-vsdevenv@master
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Refresh Env (Windows)
+ run:
+ refreshenv
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Install Qt
+ uses: jurplel/install-qt-action@v2
+
+ - name: Check tool versions (Linux / MacOS)
+ shell: bash
+ run: |
+ echo "=== perl ===";
+ perl --version;
+ echo "=== python ===";
+ python --version;
+ echo "=== cmake ===";
+ cmake --version;
+ echo "=== latex ===";
+ latex --version;
+ echo "=== bibtex ===";
+ bibtex --version
+ echo "=== dvips ===";
+ dvips --version
+ echo "=== bison ===";
+ bison --version;
+ echo "=== flex ===";
+ flex --version;
+ echo "=== dot ===";
+ dot -V;
+ echo "=== ghostscript ===";
+ gs --version;
+ if: matrix.config.os != 'windows-latest'
+
+ - name: Check tool versions (Windows)
+ shell: bash
+ run: |
+ echo "=== perl ===";
+ perl --version;
+ echo "=== python ===";
+ python --version;
+ echo "=== cmake ===";
+ cmake --version;
+ echo "=== latex ===";
+ latex --version;
+ echo "=== bibtex ===";
+ bibtex --version
+ echo "=== dvips ===";
+ dvips --version
+ echo "=== bison ===";
+ win_bison --version;
+ echo "=== flex ===";
+ win_flex --version;
+ echo "=== dot ===";
+ dot -V;
+ echo "=== ghostscript ===";
+ gswin64c --version;
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Configure
+ shell: cmake -P {0}
+ run: |
+ set(ENV{CC} ${{ matrix.config.cc }})
+ set(ENV{CXX} ${{ matrix.config.cxx }})
+
+ execute_process(
+ COMMAND cmake
+ -S .
+ -B build
+ -D CMAKE_BUILD_TYPE=${{ matrix.config.build_type }}
+ -G "${{ matrix.config.build_gen }}"
+ -Dbuild_doc=YES
+ -Dbuild_wizard=YES
+ ${{ matrix.config.cmake_extra_opts }}
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Bad exit status")
+ endif()
+
+ - name: Build
+ shell: cmake -P {0}
+ run: |
+ include(ProcessorCount)
+ ProcessorCount(N)
+ execute_process(
+ COMMAND cmake --build build --parallel ${N}
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE output
+ ERROR_VARIABLE output
+ ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE
+ )
+ if (NOT result EQUAL 0)
+ string(REGEX MATCH "FAILED:.*$" error_message "${output}")
+ string(REPLACE "\n" "%0A" error_message "${error_message}")
+ message("::error::${error_message}")
+ message(FATAL_ERROR "Build failed")
+ endif()
+
+ - name: Archive build artifacts
+ uses: actions/upload-artifact@v2
+ with:
+ name: "${{ matrix.config.name }} build artifacts"
+ path: build/bin/
+
+ - name: Run tests (Linux / MacOS)
+ shell: cmake -P {0}
+ run: |
+ include(ProcessorCount)
+ ProcessorCount(N)
+
+ set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON")
+
+ execute_process(
+ COMMAND cmake --build build --target tests TEST_FLAGS="--xml --xmlxsd --xhtml --docbook --rtf"
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Running tests failed!")
+ endif()
+ if: matrix.config.os != 'windows-latest'
+
+ - name: Run tests (Windows)
+ shell: cmake -P {0}
+ run: |
+ include(ProcessorCount)
+ ProcessorCount(N)
+
+ set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON")
+
+ execute_process(
+ COMMAND cmake --build build --target tests TEST_FLAGS="--xml --xmlxsd"
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Running tests failed!")
+ endif()
+ if: matrix.config.os == 'windows-latest'
+
+ - name: Generate documentation
+ shell: cmake -P {0}
+ run: |
+ execute_process(
+ COMMAND cmake --build build --target docs
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Building documentation failed")
+ endif()
+ if: matrix.config.os != 'windows-latest'
diff --git a/.gitignore b/.gitignore
index fa8ffb5..b599b7a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,7 @@
/doxygen_docs
/doxygen.tag
/build*
+
+tags
+
+.idea
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 0f6a704..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,103 +0,0 @@
-language: cpp
-os: linux
-dist: xenial
-compiler:
- - gcc
- - clang
-
-addons:
- apt:
- update: true
- packages:
- - texlive
- - texlive-generic-recommended
- - texlive-extra-utils
- - texlive-latex-extra
- - texlive-font-utils
- - ghostscript
-
-linux-ppc64le: &linux-ppc64le
- os: linux-ppc64le
- env:
- - OS_NAME="linux-ppc64le"
- addons:
- apt:
- update: true
- packages:
- - texlive
- - texlive-generic-recommended
- - texlive-extra-utils
- - texlive-latex-extra
- - texlive-font-utils
- - ghostscript
- - libxml2-utils
- - cmake
- - cmake-data
-
-jobs:
- include:
- - <<: *linux-ppc64le
- compiler: gcc
- - <<: *linux-ppc64le
- compiler: clang
-# - os: osx
-# compiler: clang
-# addons:
-# homebrew:
-# packages:
-# - ghostscript
-# - bison
-# - flex
-# casks:
-# - mactex-no-gui
-
-before_script:
- - |
- if [ "${TRAVIS_OS_NAME}" == "linux" ] && [ ! "${OS_NAME}" == "linux-ppc64le" ]; then
- printf "[requires]
- libxml2/2.9.9@bincrafters/stable
- libiconv/1.15@bincrafters/stable" >> conanfile.txt;
- fi;
- if [ "${TRAVIS_OS_NAME}" == "osx" ]; then
- printf "[requires]
- bzip2/1.0.8@bincrafters/stable
- libxml2/2.9.9@bincrafters/stable
- libiconv/1.15@bincrafters/stable
- qt/5.12.0@bincrafters/stable
- bison/3.3.2@bincrafters/stable
- [options]
- qt:shared=True" >> conanfile.txt;
- fi;
- - if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
- pip install --quiet --user conan;
- fi;
- - if [ "${TRAVIS_OS_NAME}" == "osx" ]; then
- pip install --upgrade pip;
- pip install --quiet conan;
-
- curl -O -L http://mirrors.ctan.org/support/epstopdf.zip;
- unzip epstopdf.zip;
- mkdir -p /Users/travis/Library/TeX/texbin/;
- mv epstopdf/epstopdf.pl /Users/travis/Library/TeX/texbin/epstopdf;
- chmod a+x /Users/travis/Library/TeX/texbin/epstopdf;
- rm -rf epstopdf*;
- export CMAKE_INCLUDE_PATH="/usr/local/opt/flex/include;$CMAKE_INCLUDE_PATH";
- export CMAKE_LIBRARY_PATH="/usr/local/opt/flex/lib;/usr/local/opt/bison/lib;$CMAKE_LIBRARY_PATH";
- export PATH="/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:/Users/travis/Library/TeX/texbin:/Library/TeX/texbin:$PATH";
- fi;
- - if [ ! "${OS_NAME}" == "linux-ppc64le" ]; then
- conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan;
- conan install . -g virtualrunenv --build missing --update;
- source activate_run.sh;
- fi;
-
-script:
- - mkdir build
- - cd build
- - cmake --version;
- - cmake -G "Unix Makefiles" -Dbuild_doc=ON -Dbuild_wizard=ON ..
- - make
- - if [ ! "${TRAVIS_OS_NAME}" == "osx" ]; then
- make tests;
- make docs;
- fi;
diff --git a/BUILD.txt b/BUILD.txt
index 48355ff..7f9efed 100644
--- a/BUILD.txt
+++ b/BUILD.txt
@@ -1,5 +1,5 @@
Doxygen uses cmake (http://www.cmake.org/) to build executables for various platforms.
-It's required at least cmake version 3.1.3
+It's required at least cmake version 3.3.
The first step is to create a build directory where the output should be stored.
Doxygen can be fully build outside of the source tree.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cd0fcaa..06b9696 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,7 +11,7 @@
# Documents produced by Doxygen are derivative works derived from the
# input used in their production; they are not affected by this license.
-cmake_minimum_required(VERSION 3.2)
+cmake_minimum_required(VERSION 3.3)
project(doxygen)
option(build_wizard "Build the GUI frontend for doxygen." OFF)
@@ -22,15 +22,21 @@ option(build_search "Build external search tools (doxysearch and doxyindexer)
option(build_doc "Build user manual (HTML and PDF)" OFF)
option(build_doc_chm "Build user manual (CHM)" OFF)
option(use_sqlite3 "Add support for sqlite3 output [experimental]." OFF)
+if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+ option(use_libc++ "Use libc++ as C++ standard library." ON)
+endif()
option(use_libclang "Add support for libclang parsing." OFF)
+option(static_libclang "Link to a statically compiled version of LLVM/libclang." OFF)
option(win_static "Link with /MT in stead of /MD on windows" OFF)
option(english_only "Only compile in support for the English language" OFF)
option(force_qt4 "Forces doxywizard to build using Qt4 even if Qt5 is installed" OFF)
+option(enable_coverage "Enable coverage reporting for gcc/clang [development]" OFF)
SET(enlarge_lex_buffers "262144" CACHE INTERNAL "Sets the lex input and read buffers to the specified size")
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
-set(TOP "${CMAKE_SOURCE_DIR}")
+list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
+list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Sanitizers")
+set(TOP "${PROJECT_SOURCE_DIR}")
include(version)
set(sqlite3 "0" CACHE INTERNAL "used in settings.h")
@@ -45,7 +51,7 @@ if (use_libclang)
find_package(LLVM CONFIG REQUIRED)
find_package(Clang CONFIG REQUIRED)
if (CMAKE_SYSTEM MATCHES "Darwin")
- set(MACOS_VERSION_MIN 10.11)
+ set(MACOS_VERSION_MIN 10.14)
endif()
endif()
@@ -62,9 +68,11 @@ if (CMAKE_SYSTEM MATCHES "Darwin")
endif()
if (WIN32)
- if (NOT CMAKE_GENERATOR MATCHES "MinGW Makefiles")
+ if ((NOT CMAKE_GENERATOR MATCHES "MinGW Makefiles") AND
+ (NOT CMAKE_GENERATOR MATCHES "MSYS Makefiles") AND
+ (NOT CMAKE_GENERATOR MATCHES "Unix Makefiles"))
if (NOT ICONV_DIR)
- set(ICONV_DIR "${CMAKE_SOURCE_DIR}/winbuild")
+ set(ICONV_DIR "${PROJECT_SOURCE_DIR}/winbuild")
endif()
set(CMAKE_REQUIRED_DEFINITIONS "-DLIBICONV_STATIC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") # needed for language.cpp on 64bit
@@ -100,6 +108,7 @@ if (BISON_VERSION VERSION_LESS 2.7)
message(SEND_ERROR "Doxygen requires at least bison version 2.7 (installed: ${BISON_VERSION})")
endif()
find_package(Threads)
+find_package(Sanitizers)
if (sqlite3)
find_package(SQLite3 REQUIRED)
@@ -112,10 +121,10 @@ find_package(Iconv REQUIRED)
include_directories(${ICONV_INCLUDE_DIR})
-#set(DOXYDOCS ${CMAKE_SOURCE_DIR}/doc CACHE INTERNAL "Path to doxygen docs")
+#set(DOXYDOCS ${PROJECT_SOURCE_DIR}/doc CACHE INTERNAL "Path to doxygen docs")
set(DOXYDOCS ${PROJECT_BINARY_DIR}/doc)
set(ENV{DOXYGEN_DOCDIR} ${DOXYDOCS})
-set(GENERATED_SRC "${CMAKE_BINARY_DIR}/generated_src" CACHE INTERNAL "Stores generated files")
+set(GENERATED_SRC "${PROJECT_BINARY_DIR}/generated_src" CACHE INTERNAL "Stores generated files")
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
@@ -127,7 +136,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${EXECUTABLE_OUTPUT_PATH})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${EXECUTABLE_OUTPUT_PATH})
# gather lang codes for translation
-file(GLOB lang_files RELATIVE "${CMAKE_SOURCE_DIR}/src" "${CMAKE_SOURCE_DIR}/src/translator_??.h")
+file(GLOB lang_files RELATIVE "${PROJECT_SOURCE_DIR}/src" "${PROJECT_SOURCE_DIR}/src/translator_??.h")
if (english_only) # user only wants English
set(lcodes "ENONLY")
else ()
@@ -157,6 +166,8 @@ if (win_static)
endforeach()
endif()
+include(cmake/CompilerWarnings.cmake)
+include(cmake/Coverage.cmake)
add_subdirectory(libmd5)
add_subdirectory(liblodepng)
diff --git a/Doxyfile b/Doxyfile
index aa0de73..44eb5b5 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -30,7 +30,6 @@ INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
ALIASES =
-TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
@@ -102,7 +101,7 @@ WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_AS_ERROR = NO
WARN_FORMAT = "$file:$line: $text "
-WARN_LOGFILE =
+WARN_LOGFILE = warnings.log
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
@@ -131,7 +130,7 @@ USE_MDFILE_AS_MAINPAGE =
#---------------------------------------------------------------------------
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
-STRIP_CODE_COMMENTS = YES
+STRIP_CODE_COMMENTS = NO
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
REFERENCES_LINK_SOURCE = YES
@@ -323,9 +322,11 @@ DIAFILE_DIRS =
PLANTUML_JAR_PATH =
PLANTUML_CFG_FILE =
PLANTUML_INCLUDE_PATH =
-DOT_GRAPH_MAX_NODES = 50
+DOT_GRAPH_MAX_NODES = 100
MAX_DOT_GRAPH_DEPTH = 0
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = NO
+DOT_MAX_FOLD = 17
+DOT_UML_DETAILS = NO
diff --git a/INSTALL b/INSTALL
index 2483ba4..846a1a6 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
DOXYGEN
Please read the installation section of the manual
-(http://www.doxygen.nl/manual/install.html) for instructions.
+(https://www.doxygen.nl/manual/install.html) for instructions.
--------
Dimitri van Heesch
diff --git a/README.md b/README.md
index 52fd7e9..870d8ec 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Doxygen
Doxygen is the de facto standard tool for generating documentation from
annotated C++ sources, but it also supports other popular programming
languages such as C, Objective-C, C#, PHP, Java, Python, IDL
-(Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL, Tcl,
+(Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL,
and to some extent D.
Doxygen can help you in three ways:
@@ -27,18 +27,17 @@ Doxygen can help you in three ways:
Download
---------
The latest binaries and source of Doxygen can be downloaded from:
-* http://www.doxygen.org/
+* https://www.doxygen.nl/
Developers
---------
-* Linux & macOS Build Status: <a href="https://travis-ci.org/doxygen/doxygen"><img src="https://secure.travis-ci.org/doxygen/doxygen.png?branch=master"/></a>
-* Windows Build Status: <a href="https://ci.appveyor.com/project/doxygen/doxygen"><img src="https://ci.appveyor.com/api/projects/status/github/doxygen/doxygen"/></a>
+* Linux & Windows and MacOS Build Status: <a href="https://github.com/doxygen/doxygen/actions"><img alt="Github Actions Build Status" src="https://github.com/doxygen/doxygen/workflows/CMake%20Build%20for%20Doxygen/badge.svg"></a>
* Coverity Scan Build Status: <a href="https://scan.coverity.com/projects/2860"> <img alt="Coverity Scan Build Status" src="https://scan.coverity.com/projects/2860/badge.svg"/> </a>
* Doxygen's Doxygen Documentation: <a href="https://codedocs.xyz/doxygen/doxygen/"><img src="https://codedocs.xyz/doxygen/doxygen.svg"/></a>
-* Install: Please read the installation section of the manual (http://www.doxygen.org/manual/install.html)
+* Install: Please read the installation section of the manual (https://www.doxygen.nl/manual/install.html)
* Project stats: https://www.openhub.net/p/doxygen
diff --git a/VERSION b/VERSION
index 6476b3a..9ab8337 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.8.18
+1.9.1
diff --git a/addon/CMakeLists.txt b/addon/CMakeLists.txt
index fd8c73f..ec4706b 100644
--- a/addon/CMakeLists.txt
+++ b/addon/CMakeLists.txt
@@ -1,4 +1,6 @@
-add_subdirectory(doxmlparser)
+if (build_xmlparser)
+ add_subdirectory(doxmlparser)
+endif ()
if (build_app)
add_subdirectory(doxyapp)
diff --git a/addon/doxmlparser/Doxyfile b/addon/doxmlparser/Doxyfile
index 2cef6cf..18359a0 100644
--- a/addon/doxmlparser/Doxyfile
+++ b/addon/doxmlparser/Doxyfile
@@ -40,7 +40,6 @@ INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
ALIASES =
-TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
diff --git a/addon/doxmlparser/Doxyfile.impl b/addon/doxmlparser/Doxyfile.impl
index 5bddcc4..9bfc85e 100644
--- a/addon/doxmlparser/Doxyfile.impl
+++ b/addon/doxmlparser/Doxyfile.impl
@@ -40,7 +40,6 @@ INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
ALIASES =
-TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
diff --git a/addon/doxmlparser/examples/metrics/CMakeLists.txt b/addon/doxmlparser/examples/metrics/CMakeLists.txt
index 8e03246..7e99a08 100644
--- a/addon/doxmlparser/examples/metrics/CMakeLists.txt
+++ b/addon/doxmlparser/examples/metrics/CMakeLists.txt
@@ -1,6 +1,7 @@
include_directories(
../../include
+ ${PROJECT_SOURCE_DIR}/libversion
)
add_executable(doxmlparser_metrics
@@ -10,5 +11,8 @@ main.cpp
target_link_libraries(doxmlparser_metrics
doxmlparser
+ doxygen_version
qtools
+ ${COVERAGE_LINKER_FLAGS}
)
+
diff --git a/addon/doxmlparser/examples/metrics/main.cpp b/addon/doxmlparser/examples/metrics/main.cpp
index 1328abe..9e301b1 100644
--- a/addon/doxmlparser/examples/metrics/main.cpp
+++ b/addon/doxmlparser/examples/metrics/main.cpp
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <doxmlintf.h>
+#include "version.h"
bool isDocumented(IDocRoot *brief,IDocRoot *detailed)
{
@@ -49,9 +50,25 @@ bool isDocumented(IDocRoot *brief,IDocRoot *detailed)
int main(int argc,char **argv)
{
- if (argc!=2)
+ int locArgc = argc;
+
+ if (locArgc == 2)
+ {
+ if (!strcmp(argv[1],"--help"))
+ {
+ printf("Usage: %s xml_dir\n",argv[0]);
+ exit(0);
+ }
+ else if (!strcmp(argv[1],"--version"))
+ {
+ printf("%s version: %s\n",argv[0],getFullVersion());
+ exit(0);
+ }
+ }
+
+ if (locArgc!=2)
{
- printf("Usage: %s xml_output_dir\n",argv[0]);
+ printf("Usage: %s xml_dir\n",argv[0]);
exit(1);
}
diff --git a/addon/doxmlparser/src/CMakeLists.txt b/addon/doxmlparser/src/CMakeLists.txt
index 35f6c83..cbd5811 100644
--- a/addon/doxmlparser/src/CMakeLists.txt
+++ b/addon/doxmlparser/src/CMakeLists.txt
@@ -1,7 +1,7 @@
include_directories(
.
../include
- ${CMAKE_SOURCE_DIR}/qtools
+ ${PROJECT_SOURCE_DIR}/qtools
)
add_library(doxmlparser STATIC
basehandler.cpp
diff --git a/addon/doxmlparser/src/stringimpl.h b/addon/doxmlparser/src/stringimpl.h
index 013858f..8931b42 100644
--- a/addon/doxmlparser/src/stringimpl.h
+++ b/addon/doxmlparser/src/stringimpl.h
@@ -4,26 +4,34 @@
#include <qstring.h>
#include "doxmlintf.h"
-class StringImpl : public QString, public IString
+class StringImpl : public IString
{
public:
StringImpl() {}
- StringImpl(const QString &str) : QString(str) {}
+ StringImpl(const QString &str) : m_str(str) {}
StringImpl &operator=(const QString &str)
- { QString::operator=(str); return *this; }
+ { m_str=str; return *this; }
virtual ~StringImpl() {}
+ const char *data() const
+ { return m_str.data(); }
// IString
const char *latin1() const
- { return QString::latin1(); }
+ { return m_str.latin1(); }
const char *utf8() const
- { return QString::utf8(); }
+ { m_cstr = m_str.utf8(); return m_cstr.data(); }
unsigned short unicodeCharAt(int index) const
- { return QString::unicode()[index].unicode(); }
+ { return m_str.unicode()[index].unicode(); }
bool isEmpty() const
- { return QString::isEmpty(); }
+ { return m_str.isEmpty(); }
int length() const
- { return QString::length(); }
+ { return m_str.length(); }
+
+ operator QString() const { return m_str; }
+
+ private:
+ QString m_str;
+ mutable QCString m_cstr; // used as a cache for m_str.utf8() to avoid returning a temporary
};
#endif
diff --git a/addon/doxmlparser/test/CMakeLists.txt b/addon/doxmlparser/test/CMakeLists.txt
index c38c8a5..4caef57 100644
--- a/addon/doxmlparser/test/CMakeLists.txt
+++ b/addon/doxmlparser/test/CMakeLists.txt
@@ -1,7 +1,8 @@
include_directories(
../include
- ${CMAKE_SOURCE_DIR}/qtools
+ ${PROJECT_SOURCE_DIR}/libversion
+ ${PROJECT_SOURCE_DIR}/qtools
)
add_executable(doxmlparser_test
@@ -11,5 +12,7 @@ main.cpp
target_link_libraries(doxmlparser_test
doxmlparser
+ doxygen_version
qtools
+ ${COVERAGE_LINKER_FLAGS}
)
diff --git a/addon/doxmlparser/test/main.cpp b/addon/doxmlparser/test/main.cpp
index 0d1f95e..35fd700 100644
--- a/addon/doxmlparser/test/main.cpp
+++ b/addon/doxmlparser/test/main.cpp
@@ -17,6 +17,7 @@
#include <stdlib.h>
#include <doxmlintf.h>
#include <qstring.h>
+#include "version.h"
/*! Dumps the contents of a hyperlinked text fragment as plain text to the
* output.
@@ -577,9 +578,25 @@ void DumpParamList(IParamIterator *pli,int indent)
int main(int argc,char **argv)
{
- if (argc!=2)
+ int locArgc = argc;
+
+ if (locArgc == 2)
+ {
+ if (!strcmp(argv[1],"--help"))
+ {
+ printf("Usage: %s xml_dir\n",argv[0]);
+ exit(0);
+ }
+ else if (!strcmp(argv[1],"--version"))
+ {
+ printf("%s version: %s\n",argv[0],getFullVersion());
+ exit(0);
+ }
+ }
+
+ if (locArgc!=2)
{
- printf("Usage: %s xmldir\n",argv[0]);
+ printf("Usage: %s xml_dir\n",argv[0]);
exit(1);
}
diff --git a/addon/doxyapp/CMakeLists.txt b/addon/doxyapp/CMakeLists.txt
index ae52cab..707fded 100644
--- a/addon/doxyapp/CMakeLists.txt
+++ b/addon/doxyapp/CMakeLists.txt
@@ -1,10 +1,10 @@
find_package(Iconv)
include_directories(
- ${CMAKE_SOURCE_DIR}/src
- ${CMAKE_SOURCE_DIR}/libversion
+ ${PROJECT_SOURCE_DIR}/src
+ ${PROJECT_SOURCE_DIR}/libversion
${GENERATED_SRC}
- ${CMAKE_SOURCE_DIR}/qtools
+ ${PROJECT_SOURCE_DIR}/qtools
${ICONV_INCLUDE_DIR}
${CLANG_INCLUDEDIR}
)
@@ -12,13 +12,30 @@ include_directories(
add_executable(doxyapp
doxyapp.cpp
)
+add_sanitizers(doxyapp)
if (use_libclang)
- set(CLANG_LIBS libclang clangTooling ${llvm_libs})
+ find_package(LLVM REQUIRED CONFIG)
+ find_package(Clang REQUIRED CONFIG)
+ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+ target_compile_features(doxyapp PRIVATE cxx_alignof)
+ if (use_libc++)
+ target_compile_options(doxyapp PRIVATE -stdlib=libc++)
+ endif()
+ endif()
+ include_directories(${LLVM_INCLUDE_DIRS})
+ add_definitions(${LLVM_DEFINITIONS})
+ if (static_libclang)
+ set(CLANG_LIBS libclang clangTooling)
+ else() # dynamically linked version of clang
+ llvm_config(doxymain USE_SHARED support)
+ set(CLANG_LIBS libclang clang-cpp)
+ endif()
+ target_compile_definitions(doxyapp PRIVATE ${LLVM_DEFINITIONS})
endif()
target_link_libraries(doxyapp
-_doxygen
+doxymain
qtools
md5
lodepng
@@ -31,6 +48,7 @@ ${CMAKE_THREAD_LIBS_INIT}
${SQLITE3_LIBRARIES}
${EXTRA_LIBS}
${CLANG_LIBS}
+${COVERAGE_LINKER_FLAGS}
)
install(TARGETS doxyapp DESTINATION bin)
diff --git a/addon/doxyapp/doxyapp.cpp b/addon/doxyapp/doxyapp.cpp
index edd39e3..5fc07be 100644
--- a/addon/doxyapp/doxyapp.cpp
+++ b/addon/doxyapp/doxyapp.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,7 +19,7 @@
* This example shows how to configure and run doxygen programmatically from
* within an application without generating the usual output.
* The example should work on any Unix like OS (including Linux and Mac OS X).
- *
+ *
* This example shows how to use to code parser to get cross-references information
* and it also shows how to look up symbols in a program parsed by doxygen and
* show some information about them.
@@ -38,6 +38,7 @@
#include "classlist.h"
#include "config.h"
#include "filename.h"
+#include "version.h"
class XRefDummyCodeGenerator : public CodeOutputInterface
{
@@ -51,7 +52,7 @@ class XRefDummyCodeGenerator : public CodeOutputInterface
void writeCodeLink(const char *,const char *,const char *,const char *,const char *) {}
void writeLineNumber(const char *,const char *,const char *,int) {}
virtual void writeTooltip(const char *,const DocLinkInfo &,
- const char *,const char *,const SourceLinkInfo &,
+ const char *,const char *,const SourceLinkInfo &,
const SourceLinkInfo &) {}
void startCodeLine(bool) {}
void endCodeLine() {}
@@ -62,9 +63,11 @@ class XRefDummyCodeGenerator : public CodeOutputInterface
void writeCodeAnchor(const char *) {}
void setCurrentDoc(const Definition *,const char *,bool) {}
void addWord(const char *,bool) {}
+ void startCodeFragment(const char *) {}
+ void endCodeFragment(const char *) {}
// here we are presented with the symbols found by the code parser
- void linkableSymbol(int l, const char *sym,Definition *symDef,Definition *context)
+ void linkableSymbol(int l, const char *sym,Definition *symDef,Definition *context)
{
QCString ctx;
if (context) // the context of the symbol is known
@@ -109,19 +112,19 @@ class XRefDummyCodeGenerator : public CodeOutputInterface
static void findXRefSymbols(FileDef *fd)
{
// get the interface to a parser that matches the file extension
- CodeParserInterface &intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
+ auto intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
// get the programming language from the file name
SrcLangExt lang = getLanguageFromFileName(fd->name());
// reset the parsers state
- intf.resetCodeParserState();
+ intf->resetCodeParserState();
- // create a new backend object
+ // create a new backend object
XRefDummyCodeGenerator *xrefGen = new XRefDummyCodeGenerator(fd);
// parse the source code
- intf.parseCode(*xrefGen,
+ intf->parseCode(*xrefGen,
0,
fileToString(fd->absFilePath()),
lang,
@@ -137,7 +140,7 @@ static void listSymbol(Definition *d)
{
if (d!=Doxygen::globalScope && // skip the global namespace symbol
d->name().at(0)!='@' // skip anonymous stuff
- )
+ )
{
printf("%s\n",
d->name().data());
@@ -146,25 +149,9 @@ static void listSymbol(Definition *d)
static void listSymbols()
{
- QDictIterator<DefinitionIntf> sli(*Doxygen::symbolMap);
- DefinitionIntf *di;
- for (sli.toFirst();(di=sli.current());++sli)
+ for (const auto &kv : Doxygen::symbolMap)
{
- if (di->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
- // with same name
- {
- DefinitionListIterator dli(*(DefinitionList*)di);
- Definition *d;
- // for each symbol
- for (dli.toFirst();(d=dli.current());++dli)
- {
- listSymbol(d);
- }
- }
- else // single symbol
- {
- listSymbol((Definition*)di);
- }
+ listSymbol(kv.second);
}
}
@@ -172,7 +159,7 @@ static void lookupSymbol(Definition *d)
{
if (d!=Doxygen::globalScope && // skip the global namespace symbol
d->name().at(0)!='@' // skip anonymous stuff
- )
+ )
{
printf("Symbol info\n");
printf("-----------\n");
@@ -199,9 +186,9 @@ static void lookupSymbol(Definition *d)
case Definition::TypeNamespace:
{
NamespaceDef *nd = dynamic_cast<NamespaceDef*>(d);
- printf("Kind: Namespace: contains %d classes and %d namespaces\n",
- nd->getClassSDict() ? nd->getClassSDict()->count() : 0,
- nd->getNamespaceSDict() ? nd->getNamespaceSDict()->count() : 0);
+ printf("Kind: Namespace: contains %zu classes and %zu namespaces\n",
+ nd->getClasses().size(),
+ nd->getNamespaces().size());
}
break;
case Definition::TypeMember:
@@ -221,25 +208,14 @@ static void lookupSymbols(const QCString &sym)
{
if (!sym.isEmpty())
{
- DefinitionIntf *di = Doxygen::symbolMap->find(sym);
- if (di)
+ auto range = Doxygen::symbolMap.find(sym);
+ bool found=false;
+ for (auto it=range.first; it!=range.second; ++it)
{
- if (di->definitionType()==DefinitionIntf::TypeSymbolList)
- {
- DefinitionListIterator dli(*(DefinitionList*)di);
- Definition *d;
- // for each symbol with the given name
- for (dli.toFirst();(d=dli.current());++dli)
- {
- lookupSymbol(d);
- }
- }
- else
- {
- lookupSymbol((Definition*)di);
- }
+ lookupSymbol(it->second);
+ found=true;
}
- else
+ if (!found)
{
printf("Unknown symbol\n");
}
@@ -250,13 +226,29 @@ int main(int argc,char **argv)
{
char cmd[256];
- if (argc<2)
+ int locArgc = argc;
+
+ if (locArgc == 2)
+ {
+ if (!strcmp(argv[1],"--help"))
+ {
+ printf("Usage: %s [source_file | source_dir]\n",argv[0]);
+ exit(0);
+ }
+ else if (!strcmp(argv[1],"--version"))
+ {
+ printf("%s version: %s\n",argv[0],getFullVersion());
+ exit(0);
+ }
+ }
+
+ if (locArgc!=2)
{
printf("Usage: %s [source_file | source_dir]\n",argv[0]);
exit(1);
}
- // initialize data structures
+ // initialize data structures
initDoxygen();
// setup the non-default configuration options
@@ -264,54 +256,46 @@ int main(int argc,char **argv)
checkConfiguration();
adjustConfiguration();
// we need a place to put intermediate files
- Config_getString(OUTPUT_DIRECTORY)="/tmp/doxygen";
+ Config_updateString(OUTPUT_DIRECTORY,"/tmp/doxygen");
// disable html output
- Config_getBool(GENERATE_HTML)=FALSE;
+ Config_updateBool(GENERATE_HTML,FALSE);
// disable latex output
- Config_getBool(GENERATE_LATEX)=FALSE;
+ Config_updateBool(GENERATE_LATEX,FALSE);
// be quiet
- Config_getBool(QUIET)=TRUE;
+ Config_updateBool(QUIET,TRUE);
// turn off warnings
- Config_getBool(WARNINGS)=FALSE;
- Config_getBool(WARN_IF_UNDOCUMENTED)=FALSE;
- Config_getBool(WARN_IF_DOC_ERROR)=FALSE;
+ Config_updateBool(WARNINGS,FALSE);
+ Config_updateBool(WARN_IF_UNDOCUMENTED,FALSE);
+ Config_updateBool(WARN_IF_DOC_ERROR,FALSE);
// Extract as much as possible
- Config_getBool(EXTRACT_ALL)=TRUE;
- Config_getBool(EXTRACT_STATIC)=TRUE;
- Config_getBool(EXTRACT_PRIVATE)=TRUE;
- Config_getBool(EXTRACT_LOCAL_METHODS)=TRUE;
- // Extract source browse information, needed
+ Config_updateBool(EXTRACT_ALL,TRUE);
+ Config_updateBool(EXTRACT_STATIC,TRUE);
+ Config_updateBool(EXTRACT_PRIVATE,TRUE);
+ Config_updateBool(EXTRACT_LOCAL_METHODS,TRUE);
+ // Extract source browse information, needed
// to make doxygen gather the cross reference info
- Config_getBool(SOURCE_BROWSER)=TRUE;
+ Config_updateBool(SOURCE_BROWSER,TRUE);
// In case of a directory take all files on directory and its subdirectories
- Config_getBool(RECURSIVE)=TRUE;
+ Config_updateBool(RECURSIVE,TRUE);
// set the input
- Config_getList(INPUT).clear();
- Config_getList(INPUT).append(argv[1]);
+ StringVector inputList;
+ inputList.push_back(argv[1]);
+ Config_updateList(INPUT,inputList);
// parse the files
parseInput();
// iterate over the input files
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- // foreach file with a certain name
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- // for each file definition
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
// get the references (linked and unlinked) found in this file
- findXRefSymbols(fd);
+ findXRefSymbols(fd.get());
}
}
- // remove temporary files
- if (!Doxygen::objDBFileName.isEmpty()) QFile::remove(Doxygen::objDBFileName);
- if (!Doxygen::entryDBFileName.isEmpty()) QFile::remove(Doxygen::entryDBFileName);
// clean up after us
QDir().rmdir("/tmp/doxygen");
@@ -321,11 +305,11 @@ int main(int argc,char **argv)
fgets(cmd,256,stdin);
QCString s(cmd);
if (s.at(s.length()-1)=='\n') s=s.left(s.length()-1); // strip trailing \n
- if (s==".list")
+ if (s==".list")
listSymbols();
- else if (s==".quit")
+ else if (s==".quit")
exit(0);
- else
+ else
lookupSymbols(s);
}
}
diff --git a/addon/doxyparse/CMakeLists.txt b/addon/doxyparse/CMakeLists.txt
index 2387f1b..fe2f2c2 100644
--- a/addon/doxyparse/CMakeLists.txt
+++ b/addon/doxyparse/CMakeLists.txt
@@ -1,10 +1,10 @@
find_package(Iconv)
include_directories(
- ${CMAKE_SOURCE_DIR}/src
- ${CMAKE_SOURCE_DIR}/libversion
+ ${PROJECT_SOURCE_DIR}/src
+ ${PROJECT_SOURCE_DIR}/libversion
${GENERATED_SRC}
- ${CMAKE_SOURCE_DIR}/qtools
+ ${PROJECT_SOURCE_DIR}/qtools
${ICONV_INCLUDE_DIR}
${CLANG_INCLUDEDIR}
)
@@ -12,13 +12,18 @@ include_directories(
add_executable(doxyparse
doxyparse.cpp
)
+add_sanitizers(doxyparse)
if (use_libclang)
- set(CLANG_LIBS libclang clangTooling ${llvm_libs})
+ if (static_libclang)
+ set(CLANG_LIBS libclang clangTooling ${llvm_libs})
+ else()
+ set(CLANG_LIBS libclang clang-cpp ${llvm_libs})
+ endif()
endif()
target_link_libraries(doxyparse
-_doxygen
+doxymain
qtools
md5
lodepng
@@ -31,6 +36,7 @@ ${CMAKE_THREAD_LIBS_INIT}
${SQLITE3_LIBRARIES}
${EXTRA_LIBS}
${CLANG_LIBS}
+${COVERAGE_LINKER_FLAGS}
)
install(TARGETS doxyparse DESTINATION bin)
diff --git a/addon/doxyparse/README b/addon/doxyparse/README
deleted file mode 100644
index 95cce8c..0000000
--- a/addon/doxyparse/README
+++ /dev/null
@@ -1,40 +0,0 @@
-doxyparse
-=========
-
-This directory contains an "source parsing engine" based on doxyapp code.
-
-More info and source code repository: https://github.com/analizo/doxygen
-
-## build dependencies
-
- apt-get install flex bison cmake build-essential python
-
-## build
-
- cmake -G "Unix Makefiles" -Dbuild_parse=ON
- make
-
-## install
-
- sudo make install
-
-## release
-
-* ensure analizo testsuite passing on newer doxyparse version
-* update debian/changelog, commit, push
-* create git tag, push to github analizo/doxyparse
-* build on amd64 and i386 archs, upload tar.gz to github
- * tar -zcf doxyparse_<VERSION>_amd64.tar.gz -C bin/ doxyparse
- * tar -zcf doxyparse_<VERSION>_i386.tar.gz -C bin/ doxyparse
-* build debian packages for amd64 and i386, update analizo.org repository
- * (see analizo.github.io/README.md file for updating repository instructions)
- * upload the deb files to github release tag also
-* check if a alien-doxyparse release is necessary and do it on cpan
-
-AUTHORS
-
-Antonio Terceiro <terceiro@softwarelivre.org>
-João M. Miranda <joaomm88@gmail.com>
-Joenio Costa <joenio@joenio.me>
-Paulo Meirelles <paulo@softwarelivre.org>
-Vinicius Daros <vkdaros@mercurio.eclipse.ime.usp.br>
diff --git a/addon/doxyparse/README.md b/addon/doxyparse/README.md
new file mode 100644
index 0000000..2f9c468
--- /dev/null
+++ b/addon/doxyparse/README.md
@@ -0,0 +1,52 @@
+# Doxyparse
+
+This directory contains an "source parsing engine" based on doxyapp code.
+
+Doxyparse modifies the default output of Doxygen and dumps the dependencies
+among code elements in a YAML format, instead of output it in a human-readable
+format, as Doxygen does Doxyparse's output is intended to produce a
+machine-readable output.
+
+Doxyparse has been used in many software engineering research (as a source-code
+static analysis tool) regards on software metrics, quality metrics and so on,
+Doxyparse was first used by the [Analizo](http://analizo.org) toolkit, a suite
+of source code analysis tools, aimed at being language-independent and
+extensible, able to extract and calculate a fair number of source code metrics,
+generate dependency graphs, and other software evolution analysis.
+
+Academic publications citing Doxyparse:
+* https://scholar.google.com.br/scholar?q=doxyparse
+
+## build dependencies
+
+ apt-get install flex bison cmake build-essential python
+
+## build
+
+ cmake -G "Unix Makefiles" -Dbuild_parse=ON
+ make
+
+## install
+
+ sudo make install
+
+## release
+
+* ensure analizo testsuite passing on newer doxyparse version
+* update debian/changelog, commit, push
+* create git tag, push to github analizo/doxyparse
+* build on amd64 and i386 archs, upload tar.gz to github
+ * tar -zcf doxyparse_<VERSION>_amd64.tar.gz -C bin/ doxyparse
+ * tar -zcf doxyparse_<VERSION>_i386.tar.gz -C bin/ doxyparse
+* build debian packages for amd64 and i386, update analizo.org repository
+ * (see analizo.github.io/README.md file for updating repository instructions)
+ * upload the deb files to github release tag also
+* check if a alien-doxyparse release is necessary and do it on cpan
+
+## Authors
+
+* Antonio Terceiro <terceiro@softwarelivre.org>
+* João M. Miranda <joaomm88@gmail.com>
+* Joenio Costa <joenio@joenio.me>
+* Paulo Meirelles <paulo@softwarelivre.org>
+* Vinicius Daros <vkdaros@mercurio.eclipse.ime.usp.br>
diff --git a/addon/doxyparse/doxyparse.cpp b/addon/doxyparse/doxyparse.cpp
index 59b560f..1181231 100644
--- a/addon/doxyparse/doxyparse.cpp
+++ b/addon/doxyparse/doxyparse.cpp
@@ -44,11 +44,12 @@
#include <qcstring.h>
#include <qregexp.h>
#include "namespacedef.h"
+#include "portable.h"
class Doxyparse : public CodeOutputInterface
{
public:
- Doxyparse(FileDef *fd) : m_fd(fd) {}
+ Doxyparse(const FileDef *fd) : m_fd(fd) {}
~Doxyparse() {}
// these are just null functions, they can be used to produce a syntax highlighted
@@ -69,6 +70,8 @@ class Doxyparse : public CodeOutputInterface
void startCodeLine(bool) {}
void setCurrentDoc(const Definition *,const char *,bool) {}
void addWord(const char *,bool) {}
+ void startCodeFragment(const char *) {}
+ void endCodeFragment(const char *) {}
void linkableSymbol(int l, const char *sym, Definition *symDef, Definition *context)
{
@@ -81,7 +84,7 @@ class Doxyparse : public CodeOutputInterface
}
private:
- FileDef *m_fd;
+ const FileDef *m_fd;
};
static bool is_c_code = true;
@@ -89,25 +92,25 @@ static bool is_c_code = true;
static void findXRefSymbols(FileDef *fd)
{
// get the interface to a parser that matches the file extension
- CodeParserInterface &intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
+ auto intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
// get the programming language from the file name
SrcLangExt lang = getLanguageFromFileName(fd->name());
// reset the parsers state
- intf.resetCodeParserState();
+ intf->resetCodeParserState();
// create a new backend object
Doxyparse *parse = new Doxyparse(fd);
// parse the source code
- intf.parseCode(*parse, 0, fileToString(fd->absFilePath()), lang, FALSE, 0, fd);
+ intf->parseCode(*parse, 0, fileToString(fd->absFilePath()), lang, FALSE, 0, fd);
// dismiss the object.
delete parse;
}
-static bool ignoreStaticExternalCall(MemberDef *context, MemberDef *md) {
+static bool ignoreStaticExternalCall(const MemberDef *context, const MemberDef *md) {
if (md->isStatic()) {
if(md->getFileDef() && context->getFileDef()) {
if(md->getFileDef()->getOutputFileBase() == context->getFileDef()->getOutputFileBase())
@@ -141,7 +144,7 @@ static void printInherits() {
printf(" inherits:\n");
}
static void printInheritance(std::string base_class) {
- printf(" - %s\n", base_class.c_str());
+ printf(" - \"%s\"\n", base_class.c_str());
}
static void printDefines() {
printf(" defines:\n");
@@ -154,11 +157,14 @@ static void printDefinition(std::string type, std::string signature, int line) {
static void printProtection(std::string protection) {
printf(" protection: %s\n", protection.c_str());
}
+static void printPrototypeYes() {
+ printf(" prototype: yes\n");
+}
static void printNumberOfLines(int lines) {
printf(" lines_of_code: %d\n", lines);
}
-static void printNumberOfArguments(int arguments) {
- printf(" parameters: %d\n", arguments);
+static void printNumberOfArguments(size_t arguments) {
+ printf(" parameters: %zu\n", arguments);
}
static void printUses() {
printf(" uses:\n");
@@ -168,11 +174,11 @@ static void printReferenceTo(std::string type, std::string signature, std::strin
printf(" type: %s\n", type.c_str());
printf(" defined_in: \"%s\"\n", unescapeCharsInString(defined_in.c_str()).data());
}
-static void printNumberOfConditionalPaths(MemberDef* md) {
+static void printNumberOfConditionalPaths(const MemberDef* md) {
printf(" conditional_paths: %d\n", md->numberOfFlowKeyWords());
}
-static int isPartOfCStruct(MemberDef * md) {
+static int isPartOfCStruct(const MemberDef * md) {
return is_c_code && md->getClassDef() != NULL;
}
@@ -192,7 +198,7 @@ std::string argumentData(const Argument &argument) {
return data;
}
-std::string functionSignature(MemberDef* md) {
+std::string functionSignature(const MemberDef* md) {
std::string signature = sanitizeString(md->name().data());
if(md->isFunction()){
const ArgumentList &argList = md->argumentList();
@@ -209,7 +215,7 @@ std::string functionSignature(MemberDef* md) {
return signature;
}
-static void referenceTo(MemberDef* md) {
+static void referenceTo(const MemberDef* md) {
std::string type = md->memberTypeName().data();
std::string defined_in = "";
std::string signature = "";
@@ -232,27 +238,40 @@ static void referenceTo(MemberDef* md) {
printReferenceTo(type, signature, defined_in);
}
-void cModule(ClassDef* cd) {
- MemberList* ml = cd->getMemberList(MemberListType_variableMembers);
+void protectionInformation(Protection protection) {
+ if (protection == Public) {
+ printProtection("public");
+ }
+ else if (protection == Protected) {
+ printProtection("protected");
+ }
+ else if (protection == Private) {
+ printProtection("private");
+ }
+ else if (protection == Package) {
+ printProtection("package");
+ }
+}
+
+void cModule(const ClassDef* cd) {
+ const MemberList* ml = cd->getMemberList(MemberListType_variableMembers);
if (ml) {
- FileDef *fd = cd->getFileDef();
- MemberList *fd_ml = fd->getMemberList(MemberListType_allMembersList);
+ const FileDef *fd = cd->getFileDef();
+ const MemberList *fd_ml = fd->getMemberList(MemberListType_allMembersList);
if (!fd_ml || fd_ml->count() == 0) {
printModule(fd->getOutputFileBase().data());
printDefines();
}
MemberListIterator mli(*ml);
- MemberDef* md;
+ const MemberDef* md;
for (mli.toFirst(); (md=mli.current()); ++mli) {
printDefinition("variable", cd->name().data() + std::string("::") + md->name().data(), md->getDefLine());
- if (md->protection() == Public) {
- printProtection("public");
- }
+ protectionInformation(md->protection());
}
}
}
-static bool checkOverrideArg(const ArgumentList &argList, MemberDef *md) {
+static bool checkOverrideArg(const ArgumentList &argList, const MemberDef *md) {
if(!md->isFunction() || argList.empty()){
return false;
}
@@ -266,7 +285,7 @@ static bool checkOverrideArg(const ArgumentList &argList, MemberDef *md) {
return false;
}
-void functionInformation(MemberDef* md) {
+void functionInformation(const MemberDef* md) {
std::string temp = "";
int size = md->getEndBodyLine() - md->getStartBodyLine() + 1;
printNumberOfLines(size);
@@ -274,7 +293,7 @@ void functionInformation(MemberDef* md) {
if (!argList.empty())
{
temp = argumentData(argList.front());
-// TODO: This is a workaround; better not include "void" in argList, in the first place.
+// TODO: This is a workaround; better not include "void" in argList, in the first place.
if (temp!="void")
{
printNumberOfArguments(argList.size());
@@ -282,12 +301,10 @@ void functionInformation(MemberDef* md) {
}
printNumberOfConditionalPaths(md);
- MemberSDict *defDict = md->getReferencesMembers();
- if (defDict) {
- MemberSDict::Iterator msdi(*defDict);
- MemberDef *rmd;
+ auto refList = md->getReferencesMembers();
+ if (!refList.empty()) {
printUses();
- for (msdi.toFirst(); (rmd=msdi.current()); ++msdi) {
+ for (const auto &rmd : refList) {
if (rmd->definitionType() == Definition::TypeMember && !ignoreStaticExternalCall(md, rmd) && !checkOverrideArg(argList, rmd)) {
referenceTo(rmd);
}
@@ -295,32 +312,39 @@ void functionInformation(MemberDef* md) {
}
}
-static void lookupSymbol(Definition *d) {
+void prototypeInformation(const MemberDef* md) {
+ printPrototypeYes();
+ const ArgumentList &argList = md->argumentList();
+ printNumberOfArguments(argList.size());
+}
+
+static void lookupSymbol(const Definition *d) {
if (d->definitionType() == Definition::TypeMember) {
- MemberDef *md = dynamic_cast<MemberDef*>(d);
+ const MemberDef *md = dynamic_cast<const MemberDef*>(d);
std::string type = md->memberTypeName().data();
std::string signature = functionSignature(md);
printDefinition(type, signature, md->getDefLine());
- if (md->protection() == Public) {
- printProtection("public");
+ protectionInformation(md->protection());
+ if (md->isFunction() && md->isPrototype()) {
+ prototypeInformation(md);
}
- if (md->isFunction()) {
+ else if (md->isFunction()) {
functionInformation(md);
}
}
}
-void listMembers(MemberList *ml) {
+void listMembers(const MemberList *ml) {
if (ml) {
MemberListIterator mli(*ml);
- MemberDef *md;
+ const MemberDef *md;
for (mli.toFirst(); (md=mli.current()); ++mli) {
lookupSymbol((Definition*) md);
}
}
}
-void listAllMembers(ClassDef* cd) {
+void listAllMembers(const ClassDef* cd) {
// methods
listMembers(cd->getMemberList(MemberListType_functionMembers));
// constructors
@@ -329,18 +353,15 @@ void listAllMembers(ClassDef* cd) {
listMembers(cd->getMemberList(MemberListType_variableMembers));
}
-static void classInformation(ClassDef* cd) {
+static void classInformation(const ClassDef* cd) {
if (is_c_code) {
cModule(cd);
} else {
printModule(cd->name().data());
- BaseClassList* baseClasses = cd->baseClasses();
- if (baseClasses) {
+ if (!cd->baseClasses().empty()) {
printInherits();
- BaseClassListIterator bci(*baseClasses);
- BaseClassDef* bcd;
- for (bci.toFirst(); (bcd = bci.current()); ++bci) {
- printInheritance(bcd->classDef->name().data());
+ for (const auto &bcd : cd->baseClasses()) {
+ printInheritance(sanitizeString(bcd.classDef->name().data()));
}
}
if(cd->isAbstract()) {
@@ -361,9 +382,8 @@ static bool checkLanguage(std::string& filename, std::string extension) {
/* Detects the programming language of the project. Actually, we only care
* about whether it is a C project or not. */
-static void detectProgrammingLanguage(FileNameListIterator& fnli) {
- FileName* fn;
- for (fnli.toFirst(); (fn=fnli.current()); ++fnli) {
+static void detectProgrammingLanguage(FileNameLinkedMap &fnli) {
+ for (const auto &fn : fnli) {
std::string filename = fn->fileName();
if (
checkLanguage(filename, ".cc") ||
@@ -380,17 +400,11 @@ static void detectProgrammingLanguage(FileNameListIterator& fnli) {
}
static void listSymbols() {
- // iterate over the input files
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
-
- detectProgrammingLanguage(fnli);
+ detectProgrammingLanguage(*Doxygen::inputNameLinkedMap);
- // for each file
- for (fnli.toFirst(); (fn=fnli.current()); ++fnli) {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (; (fd=fni.current()); ++fni) {
+ // iterate over the input files
+ for (const auto &fn : *Doxygen::inputNameLinkedMap) {
+ for (const auto &fd : *fn) {
printFile(fd->absFilePath().data());
MemberList *ml = fd->getMemberList(MemberListType_allMembersList);
if (ml && ml->count() > 0) {
@@ -399,15 +413,11 @@ static void listSymbols() {
listMembers(ml);
}
- ClassSDict *classes = fd->getClassSDict();
- if (classes) {
- ClassSDict::Iterator cli(*classes);
- ClassDef *cd;
- for (cli.toFirst(); (cd = cli.current()); ++cli) {
- if (!cd->isVisited()) {
- classInformation(cd);
- cd->setVisited(TRUE);
- }
+ ClassDefSet visitedClasses;
+ for (const auto &cd : fd->getClasses()) {
+ if (visitedClasses.find(cd)==visitedClasses.end()) {
+ classInformation(cd);
+ visitedClasses.insert(cd);
}
}
}
@@ -416,15 +426,27 @@ static void listSymbols() {
}
int main(int argc,char **argv) {
- if (argc < 2) {
+ int locArgc = argc;
+
+ if (locArgc == 2)
+ {
+ if (!strcmp(argv[1],"--help"))
+ {
+ printf("Usage: %s [source_file | source_dir]\n",argv[0]);
+ exit(0);
+ }
+ else if (!strcmp(argv[1],"--version"))
+ {
+ printf("%s version: %s\n",argv[0],getFullVersion());
+ exit(0);
+ }
+ }
+
+ if (locArgc!=2)
+ {
printf("Usage: %s [source_file | source_dir]\n",argv[0]);
exit(1);
}
- if (qstrcmp(&argv[1][2], "version") == 0) {
- QCString versionString = getVersion();
- printf("%s\n", versionString.data());
- exit(0);
- }
// initialize data structures
initDoxygen();
@@ -437,50 +459,43 @@ int main(int argc,char **argv) {
// we need a place to put intermediate files
std::ostringstream tmpdir;
-#if !defined(_WIN32) || defined(__CYGWIN__)
- unsigned int pid = (uint)getpid();
-#else
- unsigned int pid = (uint)GetCurrentProcessId();
-#endif
- tmpdir << "/tmp/doxyparse-" << pid;
- Config_getString(OUTPUT_DIRECTORY)= tmpdir.str().c_str();
+ unsigned int pid = Portable::pid();
+ if (Portable::getenv("TMP"))
+ tmpdir << Portable::getenv("TMP") << "/doxyparse-" << pid;
+ else if (Portable::getenv("TEMP"))
+ tmpdir << Portable::getenv("TEMP") << "/doxyparse-" << pid;
+ else
+ tmpdir << "doxyparse-" << pid;
+
+ Config_updateString(OUTPUT_DIRECTORY,tmpdir.str().c_str());
// enable HTML (fake) output to omit warning about missing output format
- Config_getBool(GENERATE_HTML)=TRUE;
+ Config_updateBool(GENERATE_HTML,TRUE);
// disable latex output
- Config_getBool(GENERATE_LATEX)=FALSE;
+ Config_updateBool(GENERATE_LATEX,FALSE);
// be quiet
- Config_getBool(QUIET)=TRUE;
+ Config_updateBool(QUIET,TRUE);
// turn off warnings
- Config_getBool(WARNINGS)=FALSE;
- Config_getBool(WARN_IF_UNDOCUMENTED)=FALSE;
- Config_getBool(WARN_IF_DOC_ERROR)=FALSE;
+ Config_updateBool(WARNINGS,FALSE);
+ Config_updateBool(WARN_IF_UNDOCUMENTED,FALSE);
+ Config_updateBool(WARN_IF_DOC_ERROR,FALSE);
// Extract as much as possible
- Config_getBool(EXTRACT_ALL)=TRUE;
- Config_getBool(EXTRACT_STATIC)=TRUE;
- Config_getBool(EXTRACT_PRIVATE)=TRUE;
- Config_getBool(EXTRACT_LOCAL_METHODS)=TRUE;
- Config_getBool(EXTRACT_PACKAGE)=TRUE;
+ Config_updateBool(EXTRACT_ALL,TRUE);
+ Config_updateBool(EXTRACT_STATIC,TRUE);
+ Config_updateBool(EXTRACT_PRIVATE,TRUE);
+ Config_updateBool(EXTRACT_LOCAL_METHODS,TRUE);
+ Config_updateBool(EXTRACT_PACKAGE,TRUE);
// Extract source browse information, needed
// to make doxygen gather the cross reference info
- Config_getBool(SOURCE_BROWSER)=TRUE;
+ Config_updateBool(SOURCE_BROWSER,TRUE);
// find functions call between modules
- Config_getBool(CALL_GRAPH)=TRUE;
+ Config_updateBool(CALL_GRAPH,TRUE);
// loop recursive over input files
- Config_getBool(RECURSIVE)=TRUE;
+ Config_updateBool(RECURSIVE,TRUE);
// add file extensions
- Config_getList(FILE_PATTERNS).append("*.cc");
- Config_getList(FILE_PATTERNS).append("*.cxx");
- Config_getList(FILE_PATTERNS).append("*.cpp");
- Config_getList(FILE_PATTERNS).append("*.java");
- Config_getList(FILE_PATTERNS).append("*.py");
- Config_getList(FILE_PATTERNS).append("*.pyw");
- Config_getList(FILE_PATTERNS).append("*.cs");
- Config_getList(FILE_PATTERNS).append("*.c");
- Config_getList(FILE_PATTERNS).append("*.h");
- Config_getList(FILE_PATTERNS).append("*.hh");
- Config_getList(FILE_PATTERNS).append("*.hpp");
+ Config_updateList(FILE_PATTERNS, { "*.cc", "*.cxx", "*.cpp", "*.java",
+ "*.py", "*.pyw", "*.cs", "*.c", "*.h", "*.hh", "*.hpp"});
// set the input
- Config_getList(INPUT).clear();
+ StringVector inputList;
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "-") == 0) {
char filename[1024];
@@ -489,13 +504,14 @@ int main(int argc,char **argv) {
if (feof(stdin)) {
break;
}
- Config_getList(INPUT).append(filename);
+ inputList.push_back(filename);
}
} else {
- Config_getList(INPUT).append(argv[i]);
+ inputList.push_back(argv[i]);
}
}
- if (Config_getList(INPUT).isEmpty()) {
+ Config_updateList(INPUT,inputList);
+ if (inputList.empty()) {
exit(0);
}
@@ -503,23 +519,15 @@ int main(int argc,char **argv) {
parseInput();
// iterate over the input files
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- // for each file with a certain name
- for (fnli.toFirst();(fn=fnli.current());++fnli) {
- FileNameIterator fni(*fn);
- FileDef *fd;
- // for each file definition
- for (;(fd=fni.current());++fni) {
+ for (const auto &fn : *Doxygen::inputNameLinkedMap) {
+ for (const auto &fd : *fn) {
// get the references (linked and unlinked) found in this file
- findXRefSymbols(fd);
+ findXRefSymbols(fd.get());
}
}
QDir thisDir;
// remove temporary files
- if (!Doxygen::objDBFileName.isEmpty()) thisDir.remove(Doxygen::objDBFileName);
- if (!Doxygen::entryDBFileName.isEmpty()) thisDir.remove(Doxygen::entryDBFileName);
if (!Doxygen::filterDBFileName.isEmpty()) thisDir.remove(Doxygen::filterDBFileName);
// clean up after us
diff --git a/addon/doxysearch/CMakeLists.txt b/addon/doxysearch/CMakeLists.txt
index 54794a6..d0c8724 100644
--- a/addon/doxysearch/CMakeLists.txt
+++ b/addon/doxysearch/CMakeLists.txt
@@ -1,13 +1,14 @@
-find_package(Xapian REQUIRED)
+find_package(xapian REQUIRED)
find_package(ZLIB REQUIRED)
if (WIN32)
- set(WIN_EXTRA_LIBS "uuid.lib rpcrt4.lib ws2_32.lib")
+ set(WIN_EXTRA_LIBS uuid.lib rpcrt4.lib ws2_32.lib)
endif()
include_directories(
- ${CMAKE_SOURCE_DIR}/qtools
- ${XAPIAN_INCLUDE_DIR}
+ ${PROJECT_SOURCE_DIR}/libversion
+ ${PROJECT_SOURCE_DIR}/qtools
+ ${XAPIAN_INCLUDE_DIR}
${ZLIB_INCLUDE_DIRS}
)
add_executable(doxyindexer
@@ -16,7 +17,9 @@ add_executable(doxyindexer
target_link_libraries(doxyindexer
${XAPIAN_LIBRARIES}
${ZLIB_LIBRARIES}
- ${WIN_EXTRA_LIBS}
+ ${WIN_EXTRA_LIBS}
+ ${COVERAGE_LINKER_FLAGS}
+ doxygen_version
qtools
)
@@ -24,9 +27,10 @@ add_executable(doxysearch.cgi
doxysearch.cpp
)
target_link_libraries(doxysearch.cgi
+ doxygen_version
${XAPIAN_LIBRARIES}
${ZLIB_LIBRARIES}
- ${WIN_EXTRA_LIBS}
+ ${WIN_EXTRA_LIBS}
)
install(TARGETS doxyindexer doxysearch.cgi DESTINATION bin)
diff --git a/addon/doxysearch/doxyindexer.cpp b/addon/doxysearch/doxyindexer.cpp
index 12d3e9a..ae4e046 100644
--- a/addon/doxysearch/doxyindexer.cpp
+++ b/addon/doxysearch/doxyindexer.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -30,6 +30,8 @@
// Xapian include
#include <xapian.h>
+#include "version.h"
+
#define MAX_TERM_LENGTH 245
#if defined(_WIN32) && !defined(__CYGWIN__)
@@ -52,12 +54,12 @@ static std::string trim(const std::string& str,
return ""; // no content
size_t strEnd = str.find_last_not_of(whitespace);
- int strRange = strEnd - strBegin + 1;
+ size_t strRange = strEnd - strBegin + 1;
return str.substr(strBegin, strRange);
}
-/** trims \a whitespace from start and end and replace occurrences of
+/** trims \a whitespace from start and end and replace occurrences of
* \a whitespace with \a fill.
*/
static std::string reduce(const std::string& str,
@@ -72,7 +74,7 @@ static std::string reduce(const std::string& str,
while (beginSpace != std::string::npos)
{
size_t endSpace = result.find_first_not_of(whitespace, beginSpace);
- int range = endSpace - beginSpace;
+ size_t range = endSpace - beginSpace;
result.replace(beginSpace, range, fill);
@@ -115,10 +117,10 @@ static void addIdentifiers(const std::string &s,Xapian::Document &doc,int wfd)
}
/** Replaces all occurrences of \a old with \a repl in string \a str */
-static void replace_all(std::string& str, const std::string& old, const std::string& repl)
+static void replace_all(std::string& str, const std::string& old, const std::string& repl)
{
size_t pos = 0;
- while ((pos = str.find(old, pos)) != std::string::npos)
+ while ((pos = str.find(old, pos)) != std::string::npos)
{
str.replace(pos, old.length(), repl);
pos += repl.length();
@@ -144,8 +146,8 @@ class XMLContentHandler : public QXmlDefaultHandler
{
public:
/** Handler for parsing XML data */
- XMLContentHandler(const QString &path)
- : m_db((path+"doxysearch.db").utf8().data(),Xapian::DB_CREATE_OR_OVERWRITE),
+ XMLContentHandler(const QString &path)
+ : m_db((path+"doxysearch.db").utf8().data(),Xapian::DB_CREATE_OR_OVERWRITE),
m_stemmer("english")
{
m_curFieldName = UnknownField;
@@ -204,8 +206,8 @@ class XMLContentHandler : public QXmlDefaultHandler
{
partTerm = term.substr(pos+2);
}
- if (m_doc.get_value(TypeField)=="class" ||
- m_doc.get_value(TypeField)=="file" ||
+ if (m_doc.get_value(TypeField)=="class" ||
+ m_doc.get_value(TypeField)=="file" ||
m_doc.get_value(TypeField)=="namespace") // containers get highest prio
{
safeAddTerm(term,m_doc,1000);
@@ -233,22 +235,22 @@ class XMLContentHandler : public QXmlDefaultHandler
// replace XML entities
m_data = unescapeXmlEntities(m_data);
// add data to the document
- m_doc.add_value(m_curFieldName,m_data);
+ m_doc.add_value(m_curFieldName,m_data);
switch (m_curFieldName)
{
- case TypeField:
- case NameField:
- case TagField:
- case UrlField:
+ case TypeField:
+ case NameField:
+ case TagField:
+ case UrlField:
// meta data that is not searchable
break;
- case KeywordField:
+ case KeywordField:
addWords(m_data,m_doc,50);
break;
- case ArgsField:
+ case ArgsField:
addIdentifiers(m_data,m_doc,10);
break;
- case TextField:
+ case TextField:
addWords(m_data,m_doc,2);
break;
default:
@@ -262,9 +264,9 @@ class XMLContentHandler : public QXmlDefaultHandler
}
/** Handler for inline text */
- bool characters(const QString& ch)
+ bool characters(const QString& ch)
{
- m_data += ch.utf8();
+ m_data += std::string(ch.utf8());
return TRUE;
}
@@ -292,7 +294,7 @@ class XMLErrorHandler : public QXmlErrorHandler
}
bool fatalError( const QXmlParseException &exception )
{
- std::cerr << "Fatal error at line " << exception.lineNumber()
+ std::cerr << "Fatal error at line " << exception.lineNumber()
<< " column " << exception.columnNumber() << ": "
<< exception.message().utf8() << std::endl;
return FALSE;
@@ -303,10 +305,10 @@ class XMLErrorHandler : public QXmlErrorHandler
QString errorMsg;
};
-static void usage(const char *name)
+static void usage(const char *name, int exitVal = 1)
{
std::cerr << "Usage: " << name << " [-o output_dir] searchdata.xml [searchdata2.xml ...]" << std::endl;
- exit(1);
+ exit(exitVal);
}
/** main function to index data */
@@ -340,7 +342,12 @@ int main(int argc,const char **argv)
}
else if (std::string(argv[i])=="-h" || std::string(argv[i])=="--help")
{
- usage(argv[0]);
+ usage(argv[0],0);
+ }
+ else if (std::string(argv[i])=="-v" || std::string(argv[i])=="--version")
+ {
+ std::cerr << argv[0] << " version: " << getFullVersion() << std::endl;
+ exit(0);
}
}
@@ -371,7 +378,7 @@ int main(int argc,const char **argv)
}
}
}
- catch(const Xapian::Error &e)
+ catch(const Xapian::Error &e)
{
std::cerr << "Caught exception: " << e.get_description() << std::endl;
}
diff --git a/addon/doxysearch/doxysearch.cpp b/addon/doxysearch/doxysearch.cpp
index 98adab4..26517bd 100644
--- a/addon/doxysearch/doxysearch.cpp
+++ b/addon/doxysearch/doxysearch.cpp
@@ -27,6 +27,8 @@
// Xapian includes
#include <xapian.h>
+#include "version.h"
+
#ifdef _WIN32
#include <windows.h>
#else
@@ -76,7 +78,7 @@ static std::string uriDecode(const std::string & sSrc)
// (0-9, A-F) are reserved for future extension"
const unsigned char * pSrc = (const unsigned char *)sSrc.c_str();
- const int SRC_LEN = sSrc.length();
+ const size_t SRC_LEN = sSrc.length();
const unsigned char * const SRC_END = pSrc + SRC_LEN;
// last decodable '%'
const unsigned char * const SRC_LAST_DEC = SRC_END - 2;
@@ -140,9 +142,9 @@ T fromString(const std::string& s)
/** Class that holds the starting position of a word */
struct WordPosition
{
- WordPosition(int s,int i) : start(s), index(i) {}
- int start;
- int index;
+ WordPosition(size_t s,size_t i) : start(s), index(i) {}
+ size_t start;
+ size_t index;
};
/** Class representing the '<' operator for WordPosition objects based on position. */
@@ -174,20 +176,20 @@ struct Fragment_greater
/** Class representing a range within a string */
struct Range
{
- Range(int s,int e) : start(s), end(e) {}
- int start;
- int end;
+ Range(size_t s,size_t e) : start(s), end(e) {}
+ size_t start;
+ size_t end;
};
/** Returns true if [start..start+len] is inside one of the \a ranges. */
-static bool insideRange(const std::vector<Range> &ranges,int start,int len)
+static bool insideRange(const std::vector<Range> &ranges,size_t start,size_t len)
{
for (std::vector<Range>::const_iterator it = ranges.begin();
it!=ranges.end(); ++it
)
{
Range r = *it;
- if (start>=r.start && start+len<r.end)
+ if (start>=r.start && start+len<r.end)
{
return true;
}
@@ -206,18 +208,18 @@ static void highlighter(const std::string &s,
const std::string spanStart="<span class=\"hl\">";
const std::string spanEnd="</span>";
const std::string dots="...";
- const int fragLen = 60;
- int sl=s.length();
+ const size_t fragLen = 60;
+ size_t sl=s.length();
// find positions of words in s
- size_t j=0;
+ int j=0;
std::vector<WordPosition> positions;
for (std::vector<std::string>::const_iterator it=words.begin();
it!=words.end();
++it,++j
)
{
- int pos=0;
+ size_t pos=0;
size_t i;
std::string word = *it;
while ((i=s.find(word,pos))!=std::string::npos)
@@ -236,8 +238,8 @@ static void highlighter(const std::string &s,
{
WordPosition wp = *it;
std::string w = words[wp.index];
- int i=wp.start;
- int wl=w.length();
+ size_t i=wp.start;
+ size_t wl=w.length();
if (!insideRange(ranges,i,wl))
{
if (wl>fragLen)
@@ -248,8 +250,8 @@ static void highlighter(const std::string &s,
else
{
std::string startFragment,endFragment;
- int bi=i-(fragLen-wl)/2;
- int ei=i+wl+(fragLen-wl)/2;
+ size_t bi=i-(fragLen-wl)/2;
+ size_t ei=i+wl+(fragLen-wl)/2;
int occ=0;
if (bi<0) { ei-=bi; bi=0; } else startFragment=dots;
if (ei>sl) { ei=sl; } else endFragment=dots;
@@ -257,14 +259,14 @@ static void highlighter(const std::string &s,
while (ei<sl && !isspace(s[ei])) ei++; // round to end of the word
// highlight any word in s between indexes bi and ei
std::string fragment=startFragment;
- int pos=bi;
+ size_t pos=bi;
for (std::vector<WordPosition>::const_iterator it2=positions.begin();
it2!=positions.end();
++it2)
{
WordPosition wp2 = *it2;
std::string w2 = words[wp2.index];
- int wl2 = w2.length();
+ size_t wl2 = w2.length();
if (wp2.start>=bi && wp2.start+wl2<=ei) // word is inside the range!
{
fragment+=s.substr(pos,wp2.start-pos)+
@@ -288,10 +290,10 @@ static void highlighter(const std::string &s,
static std::string escapeString(const std::string &s)
{
std::stringstream dst;
- for (unsigned int i=0;i<s.length();i++)
+ for (size_t i=0;i<s.length();i++)
{
char ch = s[i];
- switch (ch)
+ switch (ch)
{
case '\"': dst << "\\\""; break;
default: dst << ch; break;
@@ -306,31 +308,55 @@ static void showError(const std::string &callback,const std::string &error)
exit(0);
}
+static void usage(const char *name, int exitVal = 1)
+{
+ std::cerr << "Usage: " << name << "[query_string]" << std::endl;
+ std::cerr << " " << "alternatively the query string can be given by the environment variable QUERY_STRING" << std::endl;
+ exit(exitVal);
+}
+
/** Main routine */
int main(int argc,char **argv)
{
// process inputs that were passed to us via QUERY_STRING
- std::cout << "Content-Type:application/javascript;charset=utf-8\r\n\n";
std::string callback;
try
{
- // get input parameters
- const char *queryEnv = getenv("QUERY_STRING");
std::string queryString;
- if (queryEnv)
+ if (argc == 1)
{
- queryString = queryEnv;
+ const char *queryEnv = getenv("QUERY_STRING");
+ if (queryEnv)
+ {
+ queryString = queryEnv;
+ }
+ else
+ {
+ usage(argv[0]);
+ }
}
- else if (argc>=2)
+ else if (argc == 2)
{
- queryString = argv[1];
+ if (std::string(argv[1])=="-h" || std::string(argv[1])=="--help")
+ {
+ usage(argv[0],0);
+ }
+ else if (std::string(argv[1])=="-v" || std::string(argv[1])=="--version")
+ {
+ std::cerr << argv[0] << " version: " << getFullVersion() << std::endl;
+ exit(0);
+ }
+ else
+ {
+ queryString = argv[1];
+ }
}
else
{
- std::cout << "No input!\n";
- exit(1);
+ usage(argv[0]);
}
+ std::cout << "Content-Type:application/javascript;charset=utf-8\r\n\n";
// parse query string
std::vector<std::string> parts = split(queryString,'&');
std::string searchFor,callback;
diff --git a/addon/doxywizard/CMakeLists.txt b/addon/doxywizard/CMakeLists.txt
index 6aacd8b..a6f65f8 100644
--- a/addon/doxywizard/CMakeLists.txt
+++ b/addon/doxywizard/CMakeLists.txt
@@ -29,10 +29,10 @@ if (NOT Qt5Core_FOUND)
endif()
include_directories(
- .
- ${CMAKE_SOURCE_DIR}/libversion
- ${CMAKE_SOURCE_DIR}/qtools
- ${GENERATED_SRC}
+ .
+ ${PROJECT_SOURCE_DIR}/libversion
+ ${PROJECT_SOURCE_DIR}/qtools
+ ${GENERATED_SRC}
)
set(GENERATED_SRC_WIZARD ${GENERATED_SRC}/doxywizard)
@@ -58,25 +58,26 @@ set_source_files_properties(${GENERATED_SRC_WIZARD}/settings.h PROPERTIES GENERA
# generate version.cpp
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/version.py ${VERSION} > ${GENERATED_SRC_WIZARD}/version.cpp
- DEPENDS ${CMAKE_SOURCE_DIR}/VERSION ${CMAKE_SOURCE_DIR}/src/version.py
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/version.py ${VERSION} > ${GENERATED_SRC_WIZARD}/version.cpp
+ DEPENDS ${PROJECT_SOURCE_DIR}/VERSION ${PROJECT_SOURCE_DIR}/src/version.py
OUTPUT ${GENERATED_SRC_WIZARD}/version.cpp
)
set_source_files_properties(${GENERATED_SRC_WIZARD}/version.cpp PROPERTIES GENERATED 1)
# generate configdoc.cpp
add_custom_command(
-COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/configgen.py -wiz ${CMAKE_SOURCE_DIR}/src/config.xml > ${GENERATED_SRC_WIZARD}/configdoc.cpp
-OUTPUT ${GENERATED_SRC_WIZARD}/configdoc.cpp
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/configgen.py -wiz ${PROJECT_SOURCE_DIR}/src/config.xml > ${GENERATED_SRC_WIZARD}/configdoc.cpp
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/configgen.py ${PROJECT_SOURCE_DIR}/src/config.xml
+ OUTPUT ${GENERATED_SRC_WIZARD}/configdoc.cpp
)
set_source_files_properties(${GENERATED_SRC_WIZARD}/configdoc.cpp PROPERTIES GENERATED 1)
-set(LEX_FILES config_doxyw)
+set(LEX_FILES config_doxyw)
foreach(lex_file ${LEX_FILES})
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/scan_states.py ${CMAKE_SOURCE_DIR}/addon/doxywizard/${lex_file}.l > ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
- DEPENDS ${CMAKE_SOURCE_DIR}/src/scan_states.py ${CMAKE_SOURCE_DIR}/addon/doxywizard/${lex_file}.l
- OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/scan_states.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l > ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/scan_states.py ${PROJECT_SOURCE_DIR}/addon/doxywizard/${lex_file}.l
+ OUTPUT ${GENERATED_SRC_WIZARD}/${lex_file}.l.h
)
set_source_files_properties(${GENERATED_SRC_WIZARD}/${lex_file}.l.h PROPERTIES GENERATED 1)
@@ -97,6 +98,7 @@ wizard.h
qt_add_resources(doxywizard_RESOURCES_RCC doxywizard.qrc)
add_executable(doxywizard WIN32
+config_msg.cpp
doxywizard.cpp
expert.cpp
wizard.cpp
diff --git a/addon/doxywizard/config_doxyw.l b/addon/doxywizard/config_doxyw.l
index 59fa427..b93a79d 100644
--- a/addon/doxywizard/config_doxyw.l
+++ b/addon/doxywizard/config_doxyw.l
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2019 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -12,6 +12,10 @@
%option never-interactive
%option prefix="config_doxywYY"
+%top{
+#include <stdint.h>
+}
+
%{
/*
@@ -19,6 +23,8 @@
*/
#include "config.h"
#include "input.h"
+#include "inputstring.h"
+#include "config_msg.h"
#include <QString>
#include <QVariant>
@@ -29,6 +35,7 @@
#include <QStringList>
#include <QRegExp>
#include <QTextStream>
+#include <QMessageBox>
#define YY_NO_UNISTD_H 1
@@ -47,22 +54,22 @@ struct ConfigFileState
YY_BUFFER_STATE oldState;
YY_BUFFER_STATE newState;
QString fileName;
-};
+};
static const QHash<QString,Input*> *g_options;
static FILE *g_file;
static QString g_yyFileName;
static QString g_includeName;
static QVariant g_includePathList;
-static QStack<ConfigFileState*> g_includeStack;
+static QStack<ConfigFileState*> g_includeStack;
static int g_includeDepth;
static QVariant *g_arg;
static Input *g_curOption=0;
-static QString g_elemStr;
+static QByteArray g_str;
static QTextCodec *g_codec = QTextCodec::codecForName("UTF-8");
static QString g_codecName = QString::fromLatin1("UTF-8");
-static int g_lastState;
-static QByteArray g_tmpString;
+static QString g_cmd;
+static bool g_isEnum;
static const char *stateToString(int state);
@@ -71,41 +78,19 @@ static const char *stateToString(int state);
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-static int yyread(char *buf,int maxSize)
+static yy_size_t yyread(char *buf,yy_size_t maxSize)
{
// no file included
- if (g_includeStack.isEmpty())
+ if (g_includeStack.isEmpty())
{
return fread(buf,1,maxSize,g_file);
- }
- else
+ }
+ else
{
return fread(buf,1,maxSize,g_includeStack.top()->file);
}
}
-static QString warning_str = QString::fromLatin1("warning: ");
-static QString error_str = QString::fromLatin1("error: ");
-
-void config_err(const char *fmt, ...)
-{
- QString msg = error_str;
- msg.append(QString::fromLatin1(fmt));
- va_list args;
- va_start(args, fmt);
- vfprintf(stderr, qPrintable(msg), args);
- va_end(args);
-}
-void config_warn(const char *fmt, ...)
-{
- QString msg = warning_str;
- msg.append(QString::fromLatin1(fmt));
- va_list args;
- va_start(args, fmt);
- vfprintf(stderr, qPrintable(msg), args);
- va_end(args);
-}
-
static void substEnvVarsInStrList(QStringList &sl);
static void substEnvVarsInString(QString &s);
@@ -123,6 +108,191 @@ static void checkEncoding()
}
}
+static QByteArray stripComment(const QByteArray &s)
+{
+ // check if there is a comment at the end of the string
+ bool insideQuote=false;
+ int l = s.length();
+ for (int i=0;i<l;i++)
+ {
+ char c = s.at(i);
+ if (c=='\\') // skip over escaped characters
+ {
+ i++;
+ }
+ else if (c=='"') // toggle inside/outside quotation
+ {
+ insideQuote=!insideQuote;
+ }
+ else if (!insideQuote && c=='#') // found start of a comment
+ {
+ return s.left(i).trimmed();
+ }
+ }
+ return s;
+}
+
+
+static void processString()
+{
+ // strip leading and trailing whitespace
+ QByteArray s = stripComment(g_str.trimmed());
+ int l = s.length();
+
+ // remove surrounding quotes if present (and not escaped)
+ if (l>=2 && s.at(0)=='"' && s.at(l-1)=='"' && // remove quotes
+ (s.at(l-2)!='\\' || (s.at(l-2)=='\\' && s.at(l-3)=='\\')))
+ {
+ s=s.mid(1,s.length()-2);
+ l=s.length();
+ }
+
+ // check for invalid and/or escaped quotes
+ bool warned=false;
+ QByteArray result;
+ for (int i=0;i<l;i++)
+ {
+ char c = s.at(i);
+ if (c=='\\') // escaped character
+ {
+ if (i<l-1 && s.at(i+1)=='"') // unescape the quote character
+ {
+ result+='"';
+ }
+ else // keep other escaped characters in escaped form
+ {
+ result+=c;
+ if (i<l-1)
+ {
+ result+=s.at(i+1);
+ }
+ }
+ i++; // skip over the escaped character
+ }
+ else if (c=='"') // unescaped quote
+ {
+ if (!warned)
+ {
+ std::string str = g_str.trimmed().data();
+ config_warn("Invalid value for '%s' tag at line %d, file %s: Value '%s' is not properly quoted\n",
+ qPrintable(g_cmd),yylineno-1,qPrintable(g_yyFileName),str.c_str());
+ }
+ warned=true;
+ }
+ else // normal character
+ {
+ result+=c;
+ }
+ }
+
+ // recode the string
+ if (g_isEnum)
+ {
+ InputString *cur = dynamic_cast<InputString *>(g_curOption);
+ *g_arg = cur->checkEnumVal(g_codec->toUnicode(result));
+ }
+ else
+ {
+ *g_arg = QVariant(g_codec->toUnicode(result));
+ }
+
+ // update encoding
+ checkEncoding();
+
+ //printf("Processed string '%s'\n",g_string->data());
+}
+
+static void processList()
+{
+ bool allowCommaAsSeparator = g_cmd!=QString::fromLatin1("PREDEFINED");
+
+ const QByteArray s = stripComment(g_str.trimmed());
+ int l = s.length();
+
+ QByteArray elemStr;
+
+ // helper to push elemStr to the list and clear it
+ auto addElem = [&elemStr]()
+ {
+ if (!elemStr.isEmpty())
+ {
+ //printf("Processed list element '%s'\n",e.data());
+ *g_arg = QVariant(g_arg->toStringList() << g_codec->toUnicode(elemStr));
+ elemStr="";
+ }
+ };
+
+ bool needsSeparator=false;
+ int insideQuote=false;
+ bool warned=false;
+ for (int i=0;i<l;i++)
+ {
+ char c = s.at(i);
+ if (!needsSeparator && c=='\\') // escaped character
+ {
+ if (i<l-1 && s.at(i+1)=='"') // unescape the quote character
+ {
+ elemStr+='"';
+ }
+ else // keep other escaped characters in escaped form
+ {
+ elemStr+=c;
+ if (i<l-1)
+ {
+ elemStr+=s.at(i+1);
+ }
+ }
+ i++; // skip over the escaped character
+ }
+ else if (!needsSeparator && c=='"') // quote character
+ {
+ if (!insideQuote)
+ {
+ insideQuote=true;
+ }
+ else // this quote ends an element
+ {
+ insideQuote=false;
+ needsSeparator=true;
+ }
+ }
+ else if (!insideQuote && ((c==',' && allowCommaAsSeparator) || isspace(c))) // separator
+ {
+ needsSeparator=false;
+ addElem();
+ }
+ else // normal content character
+ {
+ if (needsSeparator)
+ {
+ if (!warned)
+ {
+ std::string str = g_str.trimmed().data();
+ config_warn("Invalid value for '%s' tag at line %d, file %s: Values in list '%s' are not properly space %sseparated\n",
+ qPrintable(g_cmd),yylineno-1,qPrintable(g_yyFileName),str.c_str(),allowCommaAsSeparator?"or comma ":"");
+ warned=true;
+ }
+ needsSeparator=false;
+ i--; // try the character again as part of a new element
+ addElem();
+ }
+ else
+ {
+ elemStr+=c;
+ }
+ }
+ }
+ // add last part
+ addElem();
+ if (insideQuote)
+ {
+ std::string str = g_str.trimmed().data();
+ config_warn("Invalid value for '%s' tag at line %d, file %s: Values in list '%s' are not properly quoted\n",
+ qPrintable(g_cmd),yylineno-1,qPrintable(g_yyFileName),str.c_str());
+ }
+}
+
+
static FILE *tryPath(const QString &path,const QString &fileName)
{
QString absName=!path.isEmpty() ? path+QString::fromLatin1("/")+fileName : fileName;
@@ -132,7 +302,7 @@ static FILE *tryPath(const QString &path,const QString &fileName)
FILE *f = fopen(absName.toLocal8Bit(),"r");
if (f==NULL)
config_err("could not open file %s for reading\n",qPrintable(absName));
- else
+ else
return f;
}
return NULL;
@@ -148,7 +318,7 @@ static FILE *findFile(const QString &fileName)
// relative path, try with include paths in the list
QStringList sl = g_includePathList.toStringList();
substEnvVarsInStrList(sl);
- foreach (QString s, sl)
+ foreach (QString s, sl)
{
FILE *f = tryPath(s,fileName);
if (f) return f;
@@ -159,18 +329,17 @@ static FILE *findFile(const QString &fileName)
static void readIncludeFile(const QString &incName)
{
- if (g_includeDepth==MAX_INCLUDE_DEPTH)
+ if (g_includeDepth==MAX_INCLUDE_DEPTH)
{
- config_err("maximum include depth (%d) reached, %s is not included. Aborting...\n",
+ config_err("maximum include depth (%d) reached, %s is not included.",
MAX_INCLUDE_DEPTH,qPrintable(incName));
- exit(1);
- }
+ }
QString inc = incName;
substEnvVarsInString(inc);
inc = inc.trimmed();
uint incLen = inc.length();
- if (inc.at(0)==QChar::fromLatin1('"') &&
+ if (inc.at(0)==QChar::fromLatin1('"') &&
inc.at(incLen-1)==QChar::fromLatin1('"')) // strip quotes
{
inc=inc.mid(1,incLen-2);
@@ -185,7 +354,7 @@ static void readIncludeFile(const QString &incName)
msg("@INCLUDE = %s: parsing...\n",qPrintable(inc));
#endif
- // store the state of the old file
+ // store the state of the old file
ConfigFileState *fs=new ConfigFileState;
fs->oldState=YY_CURRENT_BUFFER;
fs->fileName=g_yyFileName;
@@ -197,11 +366,10 @@ static void readIncludeFile(const QString &incName)
fs->newState=YY_CURRENT_BUFFER;
g_yyFileName=inc;
g_includeDepth++;
- }
+ }
else
{
config_err("@INCLUDE = %s: not found!\n",qPrintable(inc));
- exit(1);
}
}
@@ -213,40 +381,46 @@ static void readIncludeFile(const QString &incName)
%option yylineno
%x Start
-%x SkipComment
%x SkipInvalid
%x GetString
+%x GetEnum
%x GetStrList
%x GetQuotedString
-%x GetEnvVar
%x Include
%%
<*>\0x0d
-<Start,GetString,GetStrList,SkipInvalid>"#" { BEGIN(SkipComment); }
-<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { QString cmd = g_codec->toUnicode(yytext);
- cmd=cmd.left(cmd.length()-1).trimmed();
- g_curOption = g_options->value(cmd);
+
+ /*-------------- Comments ---------------*/
+
+<Start>"#".*\n { /* Skip comment */ }
+
+ /*-------------- TAG start ---------------*/
+
+<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { g_cmd = g_codec->toUnicode(yytext);
+ g_cmd=g_cmd.left(g_cmd.length()-1).trimmed();
+ g_curOption = g_options->value(g_cmd);
if (g_curOption==0) // oops not known
{
config_warn("ignoring unsupported tag '%s' at line %d, file %s\n",
- qPrintable(cmd),yylineno,qPrintable(g_yyFileName));
+ qPrintable(g_cmd),yylineno,qPrintable(g_yyFileName));
BEGIN(SkipInvalid);
}
else // known tag
{
- //option->setEncoding(encoding);
g_arg = &g_curOption->value();
+ g_str = QByteArray();
+ g_isEnum = false;
switch(g_curOption->kind())
{
case Input::StrList:
- g_elemStr = QString();
*g_arg = QStringList();
BEGIN(GetStrList);
break;
case Input::String:
- BEGIN(GetString);
+ g_isEnum = dynamic_cast<InputString *>(g_curOption)->stringMode() == InputString::StringFixed;
+ BEGIN(GetString);
break;
case Input::Int:
BEGIN(GetString);
@@ -257,20 +431,20 @@ static void readIncludeFile(const QString &incName)
case Input::Obsolete:
config_warn("Tag '%s' at line %d of file %s has become obsolete.\n"
"To avoid this warning please update your configuration "
- "file using \"doxygen -u\"\n", qPrintable(cmd),
- yylineno,qPrintable(g_yyFileName));
+ "file using \"doxygen -u\"\n", qPrintable(g_cmd),
+ yylineno,qPrintable(g_yyFileName));
BEGIN(SkipInvalid);
break;
}
}
}
-<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" { QString cmd=g_codec->toUnicode(yytext);
- cmd=cmd.left(cmd.length()-2).trimmed();
- g_curOption = g_options->value(cmd);
+<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" { g_cmd=g_codec->toUnicode(yytext);
+ g_cmd=g_cmd.left(g_cmd.length()-2).trimmed();
+ g_curOption = g_options->value(g_cmd);
if (g_curOption==0) // oops not known
{
config_warn("ignoring unsupported tag '%s' at line %d, file %s\n",
- yytext,yylineno,qPrintable(g_yyFileName));
+ yytext,yylineno,qPrintable(g_yyFileName));
BEGIN(SkipInvalid);
}
else // known tag
@@ -279,31 +453,34 @@ static void readIncludeFile(const QString &incName)
{
case Input::StrList:
g_arg = &g_curOption->value();
- g_elemStr=QString();
+ g_str=QByteArray();
BEGIN(GetStrList);
break;
case Input::String:
case Input::Int:
case Input::Bool:
- config_warn("operator += not supported for '%s'. Ignoring line at line %d, file %s\n",
- yytext,yylineno,qPrintable(g_yyFileName));
+ config_warn("operator += not supported for '%s'. Ignoring line %d, file %s\n",
+ qPrintable(g_cmd),yylineno,qPrintable(g_yyFileName));
BEGIN(SkipInvalid);
break;
case Input::Obsolete:
config_warn("Tag '%s' at line %d of file %s has become obsolete.\n"
"To avoid this warning please update your configuration "
- "file using \"doxygen -u\"\n",
- qPrintable(cmd),yylineno,qPrintable(g_yyFileName));
+ "file using \"doxygen -u\"\n",
+ qPrintable(g_cmd),yylineno,qPrintable(g_yyFileName));
BEGIN(SkipInvalid);
break;
}
}
}
-<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); g_arg=&g_includePathList; *g_arg = QStringList(); g_elemStr=QString(); }
+
+ /*-------------- INCLUDE* ---------------*/
+
+<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); g_arg=&g_includePathList; *g_arg = QStringList(); g_str=QByteArray(); }
/* include a config file */
<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);}
-<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
- readIncludeFile(g_codec->toUnicode(yytext));
+<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
+ readIncludeFile(g_codec->toUnicode(yytext));
BEGIN(Start);
}
<<EOF>> {
@@ -322,69 +499,66 @@ static void readIncludeFile(const QString &incName)
yy_switch_to_buffer( fs->oldState );
yy_delete_buffer( oldBuf );
g_yyFileName=fs->fileName;
- delete fs;
+ delete fs;
g_includeDepth--;
}
}
<Start>[a-z_A-Z0-9]+ { config_warn("ignoring unknown tag '%s' at line %d, file %s\n",yytext,yylineno,qPrintable(g_yyFileName)); }
-<GetString,SkipInvalid>\n { BEGIN(Start); }
-<GetStrList>\n {
- if (!g_elemStr.isEmpty())
- {
- //printf("elemStr1='%s'\n",qPrintable(elemStr));
- *g_arg = QVariant(g_arg->toStringList() << g_elemStr);
- }
- BEGIN(Start);
- }
-<GetStrList>[ \t]+ {
- if (!g_elemStr.isEmpty())
- {
- //printf("elemStr2='%s'\n",qPrintable(elemStr));
- *g_arg = QVariant(g_arg->toStringList() << g_elemStr);
- }
- g_elemStr = QString();
- }
-<GetString>[^ \"\t\r\n]+ {
- *g_arg = QVariant(g_codec->toUnicode(yytext));
- checkEncoding();
+
+ /*-------------- GetString ---------------*/
+
+<GetString>\n { // end of string
+ processString();
+ BEGIN(Start);
}
-<GetString,GetStrList,SkipInvalid>"\"" { g_lastState=YY_START;
- BEGIN(GetQuotedString);
- g_tmpString="";
- }
-<GetQuotedString>"\""|"\n" {
- // we add a bogus space to signal that the string was quoted. This space will be stripped later on.
- g_tmpString+=" ";
- //printf("Quoted String = '%s'\n",qPrintable(tmpString));
- if (g_lastState==GetString)
- {
- *g_arg = g_codec->toUnicode(g_tmpString);
- checkEncoding();
- }
- else
- {
- g_elemStr+=g_codec->toUnicode(g_tmpString);
- }
- if (*yytext=='\n')
- {
- config_warn("Missing end quote (\") on line %d, file %s\n",yylineno,
- qPrintable(g_yyFileName));
- }
- BEGIN(g_lastState);
- }
-<GetQuotedString>"\\\"" {
- g_tmpString+='"';
- }
-<GetQuotedString>. { g_tmpString+=*yytext; }
-<GetStrList>[^ \#\"\t\r\n]+ {
- g_elemStr+=g_codec->toUnicode(yytext);
- }
-<SkipComment>\n { BEGIN(Start); }
-<SkipComment>\\[ \r\t]*\n { BEGIN(Start); }
+<GetString>\\[ \r\t]*\n { // line continuation
+ g_str+=' ';
+ }
+<GetString>"\\" { // escape character
+ g_str+=yytext;
+ }
+<GetString>[^\n\\]+ { // string part without escape characters
+ g_str+=yytext;
+ }
+
+ /*-------------- GetStrList ---------------*/
+
+<GetStrList>\n { // end of list
+ processList();
+ BEGIN(Start);
+ }
+<GetStrList>\\[ \r\t]*\n { // line continuation
+ g_str+=' ';
+ }
+<GetStrList>"\\" { // escape character
+ g_str+=yytext;
+ }
+<GetStrList>[^\n\\]+ { // string part without escape characters
+ g_str+=yytext;
+ }
+
+ /*-------------- SkipInvalid ---------------*/
+
+<SkipInvalid>\n { // end of skipped part
+ BEGIN(Start);
+ }
+<SkipInvalid>\\[ \r\t]*\n { // line continuation
+ g_str+=' ';
+ }
+<SkipInvalid>"\\" { // escape character
+ g_str+=yytext;
+ }
+<SkipInvalid>[^\n\\]+ { // string part without escape characters
+ g_str+=yytext;
+ }
+
+ /*-------------- fall through -------------*/
+
<*>\\[ \r\t]*\n { }
+<*>[ \r\t] { }
<*>\n
-<*>.
+<*>. { config_warn("ignoring unknown character '%c' at line %d, file %s\n",yytext[0],yylineno,qPrintable(g_yyFileName)); }
%%
@@ -419,7 +593,7 @@ static void substEnvVarsInStrList(QStringList &sl)
foreach (QString result, sl)
{
// an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
- bool wasQuoted = (result.indexOf(QChar::fromLatin1(' '))!=-1) ||
+ bool wasQuoted = (result.indexOf(QChar::fromLatin1(' '))!=-1) ||
(result.indexOf(QChar::fromLatin1('\t'))!=-1);
// here we strip the quote again
substEnvVarsInString(result);
@@ -429,7 +603,7 @@ static void substEnvVarsInStrList(QStringList &sl)
if (!wasQuoted) /* as a result of the expansion, a single string
may have expanded into a list, which we'll
add to sl. If the original string already
- contained multiple elements no further
+ contained multiple elements no further
splitting is done to allow quoted items with spaces! */
{
int l=result.length();
@@ -440,11 +614,11 @@ static void substEnvVarsInStrList(QStringList &sl)
{
QChar c=0;
// skip until start of new word
- while (i<l && ((c=result.at(i))==QChar::fromLatin1(' ') || c==QChar::fromLatin1('\t'))) i++;
+ while (i<l && ((c=result.at(i))==QChar::fromLatin1(' ') || c==QChar::fromLatin1('\t'))) i++;
p=i; // p marks the start index of the word
// skip until end of a word
- while (i<l && ((c=result.at(i))!=QChar::fromLatin1(' ') &&
- c!=QChar::fromLatin1('\t') &&
+ while (i<l && ((c=result.at(i))!=QChar::fromLatin1(' ') &&
+ c!=QChar::fromLatin1('\t') &&
c!=QChar::fromLatin1('"'))) i++;
if (i<l) // not at the end of the string
{
@@ -458,7 +632,7 @@ static void substEnvVarsInStrList(QStringList &sl)
{
out += result.mid(p,i-p);
p=i+1;
- break;
+ break;
}
else if (c==QChar::fromLatin1('\\')) // skip escaped stuff
{
@@ -493,13 +667,15 @@ bool parseConfig(
const QHash<QString,Input *> &options
)
{
+ yylineno = 1;
+ config_open();
QHashIterator<QString, Input*> i(options);
g_file = fopen(fileName.toLocal8Bit(),"r");
if (g_file==NULL) return false;
// reset all values
i.toFront();
- while (i.hasNext())
+ while (i.hasNext())
{
i.next();
if (i.value())
@@ -519,7 +695,7 @@ bool parseConfig(
// update the values in the UI
i.toFront();
- while (i.hasNext())
+ while (i.hasNext())
{
i.next();
if (i.value())
@@ -531,8 +707,9 @@ bool parseConfig(
{
printf("Invalid option: %s\n",qPrintable(i.key()));
}
- }
+ }
fclose(g_file);
+ config_finish();
return true;
}
@@ -549,29 +726,30 @@ void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s)
{
if (*p != QChar::fromLatin1('"'))
{
- while (!(c=*p++).isNull() && !needsEscaping)
+ while (!(c=*p++).isNull() && !needsEscaping)
{
- needsEscaping = (c==QChar::fromLatin1(' ') ||
- c==QChar::fromLatin1('\n') ||
- c==QChar::fromLatin1('\t') ||
+ needsEscaping = (c==QChar::fromLatin1(' ') ||
+ c==QChar::fromLatin1(',') ||
+ c==QChar::fromLatin1('\n') ||
+ c==QChar::fromLatin1('\t') ||
c==QChar::fromLatin1('"'));
}
p=s.data();
- while (!(c=*p++).isNull() && !needsHashEscaping)
+ while (!(c=*p++).isNull() && !needsHashEscaping)
{
needsHashEscaping = (c==QChar::fromLatin1('#'));
}
}
if (needsHashEscaping || needsEscaping)
- {
+ {
t << "\"";
}
if (needsEscaping)
- {
+ {
p=s.data();
while (!p->isNull())
{
- if (*p ==QChar::fromLatin1(' ') &&
+ if (*p ==QChar::fromLatin1(' ') &&
*(p+1)==QChar::fromLatin1('\0')) break; // skip inserted space at the end
if (*p ==QChar::fromLatin1('"')) t << "\\"; // escape quotes
t << *p++;
@@ -582,7 +760,7 @@ void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s)
t << s;
}
if (needsHashEscaping || needsEscaping)
- {
+ {
t << "\"";
}
}
diff --git a/addon/doxywizard/config_msg.cpp b/addon/doxywizard/config_msg.cpp
new file mode 100644
index 0000000..fc84206
--- /dev/null
+++ b/addon/doxywizard/config_msg.cpp
@@ -0,0 +1,56 @@
+#include <QString>
+#include "config_msg.h"
+#include "doxywizard.h"
+
+static QString warning_str = QString::fromLatin1("warning: ");
+static QString error_str = QString::fromLatin1("error: ");
+
+void config_err(const char *fmt, ...)
+{
+ QString msg = error_str;
+
+ msg.append(QString::fromLatin1(fmt));
+ va_list args;
+ va_start(args, fmt);
+ char debugOut[1000]; // this size should be sufficient
+ vsnprintf(debugOut, 1000,qPrintable(msg), args);
+ MainWindow::instance().outputLogText(QString::fromLatin1(debugOut));
+ va_end(args);
+}
+
+void config_term(const char *fmt, ...)
+{
+ QString msg = error_str;
+
+ msg.append(QString::fromLatin1(fmt));
+ va_list args;
+ va_start(args, fmt);
+ char debugOut[1000]; // this size should be sufficient
+ vsnprintf(debugOut, 1000,qPrintable(msg), args);
+ MainWindow::instance().outputLogText(QString::fromLatin1(debugOut));
+ va_end(args);
+ exit(1);
+}
+
+void config_warn(const char *fmt, ...)
+{
+ QString msg = warning_str;
+
+ msg.append(QString::fromLatin1(fmt));
+ va_list args;
+ va_start(args, fmt);
+ char debugOut[1000];
+ vsnprintf(debugOut, 1000,qPrintable(msg), args);
+ MainWindow::instance().outputLogText(QString::fromLatin1(debugOut));
+ va_end(args);
+}
+
+void config_open()
+{
+ MainWindow::instance().outputLogStart();
+}
+
+void config_finish()
+{
+ MainWindow::instance().outputLogFinish();
+}
diff --git a/addon/doxywizard/config_msg.h b/addon/doxywizard/config_msg.h
new file mode 100644
index 0000000..c8f1070
--- /dev/null
+++ b/addon/doxywizard/config_msg.h
@@ -0,0 +1,10 @@
+#ifndef DOXYW_MSG_H
+#define DOXYW_MSG_H
+
+void config_err(const char *fmt, ...);
+void config_term(const char *fmt, ...);
+void config_warn(const char *fmt, ...);
+void config_open();
+void config_finish();
+
+#endif
diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp
index dc0a6dc..c75279b 100755
--- a/addon/doxywizard/doxywizard.cpp
+++ b/addon/doxywizard/doxywizard.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2019 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -22,6 +22,7 @@
#include <QVBoxLayout>
#include <QLineEdit>
#include <QLabel>
+#include <QCheckBox>
#include <QTextBrowser>
#include <QStatusBar>
#include <QProcess>
@@ -41,6 +42,9 @@
#define MAX_RECENT_FILES 10
+// globally accessible variables
+bool DoxygenWizard::debugFlag = false;
+
const int messageTimeout = 5000; //!< status bar message timeout in milliseconds.
#define APPQT(x) QString::fromLatin1("<qt><pre>") + x + QString::fromLatin1("</pre></qt>")
@@ -57,36 +61,39 @@ MainWindow::MainWindow()
: m_settings(QString::fromLatin1("Doxygen.org"), QString::fromLatin1("Doxywizard"))
{
QMenu *file = menuBar()->addMenu(tr("File"));
- file->addAction(tr("Open..."),
+ file->addAction(tr("Open..."),
this, SLOT(openConfig()), Qt::CTRL+Qt::Key_O);
m_recentMenu = file->addMenu(tr("Open recent"));
- file->addAction(tr("Save"),
+ file->addAction(tr("Save"),
this, SLOT(saveConfig()), Qt::CTRL+Qt::Key_S);
- file->addAction(tr("Save as..."),
+ file->addAction(tr("Save as..."),
this, SLOT(saveConfigAs()), Qt::SHIFT+Qt::CTRL+Qt::Key_S);
- file->addAction(tr("Quit"),
+ file->addAction(tr("Quit"),
this, SLOT(quit()), Qt::CTRL+Qt::Key_Q);
QMenu *settings = menuBar()->addMenu(tr("Settings"));
- settings->addAction(tr("Reset to factory defaults"),
+ m_resetDefault = settings->addAction(tr("Reset to factory defaults"),
this,SLOT(resetToDefaults()));
settings->addAction(tr("Use current settings at startup"),
this,SLOT(makeDefaults()));
- settings->addAction(tr("Clear recent list"),
+ m_clearRecent = settings->addAction(tr("Clear recent list"),
this,SLOT(clearRecent()));
QMenu *help = menuBar()->addMenu(tr("Help"));
- help->addAction(tr("Online manual"),
+ help->addAction(tr("Online manual"),
this, SLOT(manual()), Qt::Key_F1);
- help->addAction(tr("About"),
+ help->addAction(tr("About"),
this, SLOT(about()) );
m_expert = new Expert;
m_wizard = new Wizard(m_expert->modelData());
// ----------- top part ------------------
+ QWidget *mainPart = new QWidget;
+ QVBoxLayout *mainLayout = new QVBoxLayout(mainPart);
QWidget *topPart = new QWidget;
QVBoxLayout *rowLayout = new QVBoxLayout(topPart);
+ mainLayout->addWidget(topPart);
// select working directory
QHBoxLayout *dirLayout = new QHBoxLayout;
@@ -107,11 +114,43 @@ MainWindow::MainWindow()
m_saveLog = new QPushButton(tr("Save log..."));
m_saveLog->setEnabled(false);
QPushButton *showSettings = new QPushButton(tr("Show configuration"));
- runLayout->addWidget(m_run);
- runLayout->addWidget(m_runStatus);
+
+ m_showCondensedSettings = new QCheckBox(this);
+ m_showCondensedSettings->setText(tr("Condensed"));
+ m_showCondensedSettings->setChecked(false);
+ m_showCondensedSettings->setToolTip(tr("Show only configuration settings different from default settings"));
+
+ // select extra run options
+ m_runOptions = new QLineEdit;
+
+ runTabLayout->addWidget(new QLabel(tr("Specify additional command line options for running doxygen")));
+ runTabLayout->addWidget(m_runOptions);
+
+ QVBoxLayout *runVLayout = new QVBoxLayout;
+ runLayout->addLayout(runVLayout);
+ QHBoxLayout *runVHLayout = new QHBoxLayout;
+ runVLayout->addLayout(runVHLayout);
+ runVHLayout->addWidget(m_run);
+ runVHLayout->addWidget(m_runStatus);
+
+ QHBoxLayout *runVH2Layout = new QHBoxLayout;
+ runVLayout->addLayout(runVH2Layout);
+ m_launchHtml = new QPushButton(tr("Show HTML output"));
+ runVH2Layout->addWidget(m_launchHtml);
+ runVH2Layout->addStretch(1); // to have launch button not being stretched
+
runLayout->addStretch(1);
- runLayout->addWidget(showSettings);
- runLayout->addWidget(m_saveLog);
+
+ QVBoxLayout *settingsLayout = new QVBoxLayout;
+ runLayout->addLayout(settingsLayout);
+ settingsLayout->addWidget(m_showCondensedSettings);
+ settingsLayout->addWidget(showSettings);
+
+ QVBoxLayout *saveLayout = new QVBoxLayout;
+ runLayout->addLayout(saveLayout);
+ saveLayout->addWidget(m_saveLog);
+ saveLayout->setAlignment(Qt::AlignTop);
+ // saveLayout->addWidget(new QWidget); // to have the save button at the top
// output produced by Doxygen
runTabLayout->addLayout(runLayout);
@@ -126,12 +165,6 @@ MainWindow::MainWindow()
grid->addWidget(m_outputLog,0,0);
grid->setColumnStretch(0,1);
grid->setRowStretch(0,1);
- QHBoxLayout *launchLayout = new QHBoxLayout;
- m_launchHtml = new QPushButton(tr("Show HTML output"));
- launchLayout->addWidget(m_launchHtml);
-
- launchLayout->addStretch(1);
- grid->addLayout(launchLayout,1,0);
runTabLayout->addLayout(grid);
m_tabs = new QTabWidget;
@@ -139,12 +172,12 @@ MainWindow::MainWindow()
m_tabs->addTab(m_expert,tr("Expert"));
m_tabs->addTab(runTab,tr("Run"));
- rowLayout->addWidget(new QLabel(tr("Step 1: Specify the working directory from which doxygen will run")));
+ rowLayout->addWidget(new QLabel(tr("Specify the working directory from which doxygen will run")));
rowLayout->addLayout(dirLayout);
- rowLayout->addWidget(new QLabel(tr("Step 2: Configure doxygen using the Wizard and/or Expert tab, then switch to the Run tab to generate the documentation")));
- rowLayout->addWidget(m_tabs);
+ rowLayout->addWidget(new QLabel(tr("Configure doxygen using the Wizard and/or Expert tab, then switch to the Run tab to generate the documentation")));
+ mainLayout->addWidget(m_tabs);
- setCentralWidget(topPart);
+ setCentralWidget(mainPart);
statusBar()->showMessage(tr("Welcome to Doxygen"),messageTimeout);
m_runProcess = new QProcess;
@@ -193,6 +226,10 @@ void MainWindow::quit()
{
saveSettings();
}
+ else
+ {
+ return;
+ }
QApplication::exit(0);
}
@@ -220,7 +257,7 @@ void MainWindow::updateWorkingDir()
void MainWindow::manual()
{
- QDesktopServices::openUrl(QUrl(QString::fromLatin1("http://www.doxygen.org/manual/index.html")));
+ QDesktopServices::openUrl(QUrl(QString::fromLatin1("https://www.doxygen.org/manual/index.html")));
}
void MainWindow::about()
@@ -228,8 +265,16 @@ void MainWindow::about()
QString msg;
QTextStream t(&msg,QIODevice::WriteOnly);
t << QString::fromLatin1("<qt><center>A tool to configure and run doxygen version ")+
- QString::fromLatin1(getVersion())+
- QString::fromLatin1(" on your source files.</center><p><br>"
+ QString::fromLatin1(getDoxygenVersion())+
+ QString::fromLatin1(" on your source files.</center>")+
+ QString::fromLatin1("<center>(Created with Qt version ")+
+ QString::fromLatin1(QT_VERSION_STR);
+ if (qstrcmp(qVersion(),QT_VERSION_STR))
+ {
+ t << QString::fromLatin1(", running with ")+
+ QString::fromLatin1(qVersion());
+ }
+ t << QString::fromLatin1(")</center><p><br>"
"<center>Written by<br> Dimitri van Heesch<br>&copy; 2000-2019</center><p>"
"</qt>");
QMessageBox::about(this,tr("Doxygen GUI"),msg);
@@ -288,7 +333,7 @@ void MainWindow::saveConfig(const QString &fileName)
return;
}
QTextStream t(&f);
- m_expert->writeConfig(t,false);
+ m_expert->writeConfig(t,false,false);
updateConfigFileName(fileName);
m_modified = false;
updateTitle();
@@ -309,7 +354,7 @@ bool MainWindow::saveConfig()
bool MainWindow::saveConfigAs()
{
- QString fileName = QFileDialog::getSaveFileName(this, QString(),
+ QString fileName = QFileDialog::getSaveFileName(this, QString(),
m_workingDir->text()+QString::fromLatin1("/Doxyfile"));
if (fileName.isEmpty()) return false;
saveConfig(fileName);
@@ -343,11 +388,13 @@ void MainWindow::clearRecent()
m_recentFiles.clear();
for (int i=0;i<MAX_RECENT_FILES;i++)
{
- m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromLatin1(""));
+ m_settings.setValue(QString::fromLatin1("recent/config%1").arg(i),QString::fromLatin1(""));
}
+ m_clearRecent->setEnabled(false);
+ m_recentMenu->setEnabled(false);
m_settings.sync();
}
-
+
}
void MainWindow::resetToDefaults()
@@ -362,6 +409,8 @@ void MainWindow::resetToDefaults()
m_expert->resetToDefaults();
m_settings.setValue(QString::fromLatin1("wizard/loadsettings"), false);
m_settings.sync();
+ m_modified = false;
+ updateTitle();
m_wizard->refresh();
}
}
@@ -389,7 +438,7 @@ void MainWindow::loadSettings()
/* due to prepend use list in reversed order */
for (int i=MAX_RECENT_FILES;i>=0;i--)
{
- QString entry = m_settings.value(QString().sprintf("recent/config%d",i)).toString();
+ QString entry = m_settings.value(QString::fromLatin1("recent/config%1").arg(i)).toString();
if (!entry.isEmpty() && QFileInfo(entry).exists())
{
addRecentFileList(entry);
@@ -429,7 +478,7 @@ void MainWindow::addRecentFileList(const QString &fileName)
{
int i=m_recentFiles.indexOf(fileName);
if (i!=-1) m_recentFiles.removeAt(i);
-
+
// not found
if (m_recentFiles.count() < MAX_RECENT_FILES) // append
{
@@ -440,20 +489,26 @@ void MainWindow::addRecentFileList(const QString &fileName)
m_recentFiles.removeLast();
m_recentFiles.prepend(fileName);
}
+ m_clearRecent->setEnabled(m_recentFiles.count()>0);
+ m_recentMenu->setEnabled(m_recentFiles.count()>0);
+ m_settings.sync();
}
void MainWindow::updateRecentFile(void)
{
m_recentMenu->clear();
int i=0;
- foreach( QString str, m_recentFiles )
+ foreach( QString str, m_recentFiles )
{
m_recentMenu->addAction(str);
- m_settings.setValue(QString().sprintf("recent/config%d",i++),str);
+ m_settings.setValue(QString::fromLatin1("recent/config%1").arg(i++),str);
}
for (;i<MAX_RECENT_FILES;i++)
{
- m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromLatin1(""));
+ m_settings.setValue(QString::fromLatin1("recent/config%1").arg(i),QString::fromLatin1(""));
}
+ m_clearRecent->setEnabled(m_recentFiles.count()>0);
+ m_recentMenu->setEnabled(m_recentFiles.count()>0);
+ m_settings.sync();
}
void MainWindow::openRecent(QAction *action)
@@ -468,18 +523,18 @@ void MainWindow::runDoxygen()
{
if (!m_running)
{
- QString doxygenPath;
+ QString doxygenPath;
#if defined(Q_OS_MACX)
doxygenPath = qApp->applicationDirPath()+QString::fromLatin1("/../Resources/");
qDebug() << tr("Doxygen path: ") << doxygenPath;
- if ( !QFile(doxygenPath + QString::fromLatin1("doxygen")).exists() )
+ if ( !QFile(doxygenPath + QString::fromLatin1("doxygen")).exists() )
{
// No Doxygen binary in the resources, if there is a system Doxygen binary, use that instead
if ( QFile(QString::fromLatin1("/usr/local/bin/doxygen")).exists() )
{
doxygenPath = QString::fromLatin1("/usr/local/bin/");
}
- else
+ else
{
qDebug() << tr("Can't find the doxygen command, make sure it's in your $$PATH");
doxygenPath = QString::fromLatin1("");
@@ -493,11 +548,14 @@ void MainWindow::runDoxygen()
m_runProcess->setWorkingDirectory(m_workingDir->text());
QStringList env=QProcess::systemEnvironment();
// set PWD environment variable to m_workingDir
- env.replaceInStrings(QRegExp(QString::fromLatin1("^PWD=(.*)"),Qt::CaseInsensitive),
+ env.replaceInStrings(QRegExp(QString::fromLatin1("^PWD=(.*)"),Qt::CaseInsensitive),
QString::fromLatin1("PWD=")+m_workingDir->text());
m_runProcess->setEnvironment(env);
QStringList args;
+ QStringList runOptions = m_runOptions->text().split(QLatin1Char(' '),QString::SkipEmptyParts);
+
+ args << runOptions;
args << QString::fromLatin1("-b"); // make stdout unbuffered
args << QString::fromLatin1("-"); // read config from stdin
@@ -511,7 +569,7 @@ void MainWindow::runDoxygen()
return;
}
QTextStream t(m_runProcess);
- m_expert->writeConfig(t,false);
+ m_expert->writeConfig(t,false,false);
m_runProcess->closeWriteChannel();
if (m_runProcess->state() == QProcess::NotRunning)
@@ -548,7 +606,11 @@ void MainWindow::readStdout()
{
text1 += text;
m_outputLog->clear();
- m_outputLog->append(APPQT(text1.trimmed()));
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ m_outputLog->append(APPQT(text1.toHtmlEscaped().trimmed()));
+#else
+ m_outputLog->append(APPQT(Qt::escape(text1).trimmed()));
+#endif
}
}
}
@@ -597,7 +659,7 @@ void MainWindow::showHtmlOutput()
void MainWindow::saveLog()
{
- QString fn = QFileDialog::getSaveFileName(this, tr("Save log file"),
+ QString fn = QFileDialog::getSaveFileName(this, tr("Save log file"),
m_workingDir->text()+
QString::fromLatin1("/doxygen_log.txt"));
if (!fn.isEmpty())
@@ -621,7 +683,14 @@ void MainWindow::showSettings()
{
QString text;
QTextStream t(&text);
- m_expert->writeConfig(t,true);
+ if (m_showCondensedSettings->isChecked())
+ {
+ m_expert->writeConfig(t,true,true);
+ }
+ else
+ {
+ m_expert->writeConfig(t,true,false);
+ }
m_outputLog->clear();
m_outputLog->append(APPQT(text));
m_outputLog->ensureCursorVisible();
@@ -637,6 +706,7 @@ void MainWindow::configChanged()
void MainWindow::updateTitle()
{
QString title = tr("Doxygen GUI frontend");
+ m_resetDefault->setEnabled(m_modified);
if (m_modified)
{
title+=QString::fromLatin1(" +");
@@ -681,33 +751,75 @@ bool MainWindow::discardUnsavedChanges(bool saveOption)
return true;
}
+void MainWindow::outputLogStart()
+{
+ m_outputLogTextCount = 0;
+ m_outputLog->clear();
+}
+void MainWindow::outputLogText(QString text)
+{
+ m_outputLogTextCount++;
+ m_outputLog->append(APPQT(text));
+}
+void MainWindow::outputLogFinish()
+{
+ if (m_outputLogTextCount > 0)
+ {
+ selectRunTab();
+ }
+
+ m_outputLog->ensureCursorVisible();
+ m_saveLog->setEnabled(true);
+}
//-----------------------------------------------------------------------
int main(int argc,char **argv)
{
QApplication a(argc,argv);
- if (argc == 2)
+ int locArgc = argc;
+
+ if (locArgc == 2)
{
if (!qstrcmp(argv[1],"--help"))
{
QMessageBox msgBox;
- msgBox.setText(QString().sprintf("Usage: %s [config file]",argv[0]));
+ msgBox.setText(QString::fromLatin1("Usage: %1 [config file]").arg(QString::fromLatin1(argv[0])));
+ msgBox.exec();
+ exit(0);
+ }
+ else if (!qstrcmp(argv[1],"--version"))
+ {
+ QMessageBox msgBox;
+ if (!qstrcmp(qVersion(),QT_VERSION_STR))
+ {
+ msgBox.setText(QString::fromLatin1("Doxywizard version: %1, Qt version: %2").arg(QString::fromLatin1(getFullVersion()),QString::fromLatin1(QT_VERSION_STR)));
+ }
+ else
+ {
+ msgBox.setText(QString::fromLatin1("Doxywizard version: %1, Qt version: created with %2, running with %3").arg(QString::fromLatin1(getFullVersion()),QString::fromLatin1(QT_VERSION_STR),QString::fromLatin1(qVersion())));
+ }
msgBox.exec();
exit(0);
}
}
- if (argc > 2)
+ if (!qstrcmp(argv[1],"--debug") && ((locArgc == 2) || (locArgc == 3)))
+ {
+ DoxygenWizard::debugFlag = true;
+ locArgc--;
+ }
+
+ if (locArgc > 2)
{
QMessageBox msgBox;
- msgBox.setText(QString().sprintf("Too many arguments specified\n\nUsage: %s [config file]",argv[0]));
+ msgBox.setText(QString::fromLatin1("Too many arguments specified\n\nUsage: %1 [config file]").arg(QString::fromLatin1(argv[0])));
msgBox.exec();
exit(1);
}
else
{
MainWindow &main = MainWindow::instance();
- if (argc==2 && argv[1][0]!='-') // name of config file as an argument
+ if (locArgc==2 && argv[argc-1][0]!='-') // name of config file as an argument
{
- main.loadConfigFromFile(QString::fromLocal8Bit(argv[1]));
+ main.loadConfigFromFile(QString::fromLocal8Bit(argv[argc-1]));
}
main.show();
return a.exec();
diff --git a/addon/doxywizard/doxywizard.h b/addon/doxywizard/doxywizard.h
index c64941e..ccbd9b0 100755
--- a/addon/doxywizard/doxywizard.h
+++ b/addon/doxywizard/doxywizard.h
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2019 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -20,6 +20,7 @@
class Expert;
class Wizard;
class QLabel;
+class QCheckBox;
class QLineEdit;
class QPushButton;
class QTextBrowser;
@@ -40,6 +41,10 @@ class MainWindow : public QMainWindow
void closeEvent(QCloseEvent *event);
QString configFileName() const { return m_fileName; }
void updateTitle();
+ // access routines for outputLog pane
+ void outputLogStart();
+ void outputLogText(QString text);
+ void outputLogFinish();
public slots:
void manual();
@@ -65,7 +70,7 @@ class MainWindow : public QMainWindow
void configChanged();
void clearRecent();
void selectRunTab();
-
+
private:
MainWindow();
void saveConfig(const QString &fileName);
@@ -78,9 +83,11 @@ class MainWindow : public QMainWindow
bool discardUnsavedChanges(bool saveOption=true);
QLineEdit *m_workingDir;
+ QLineEdit *m_runOptions;
QPushButton *m_selWorkingDir;
QPushButton *m_run;
QPushButton *m_saveLog;
+ QCheckBox *m_showCondensedSettings;
QPushButton *m_launchHtml;
QPushButton *m_launchPdf;
QTextBrowser *m_outputLog;
@@ -91,11 +98,23 @@ class MainWindow : public QMainWindow
QSettings m_settings;
QMenu *m_recentMenu;
QStringList m_recentFiles;
+ QAction *m_resetDefault;
+ QAction *m_clearRecent;
QProcess *m_runProcess;
QTimer *m_timer;
QTabWidget *m_tabs;
+ int m_outputLogTextCount = 0;
bool m_running;
bool m_modified;
};
+/*! \brief This class serves as a namespace for global variables used by the doxygen wizard.
+ *
+ * All fields in this class are public and static, so they can be used directly.
+ */
+class DoxygenWizard
+{
+ public:
+ static bool debugFlag;
+};
#endif
diff --git a/addon/doxywizard/expert.cpp b/addon/doxywizard/expert.cpp
index 1303a22..7fd7df3 100644
--- a/addon/doxywizard/expert.cpp
+++ b/addon/doxywizard/expert.cpp
@@ -139,10 +139,14 @@ void Expert::createTopics(const QDomElement &rootElem)
{
// Remove _ from a group name like: Source_Browser
QString name = childElem.attribute(SA("name")).replace(SA("_"),SA(" "));
- items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(name)));
- QWidget *widget = createTopicWidget(childElem);
- m_topics[name] = widget;
- m_topicStack->addWidget(widget);
+ QString setting = childElem.attribute(SA("setting"));
+ if (setting.isEmpty() || IS_SUPPORTED(setting.toLatin1()))
+ {
+ items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(name)));
+ QWidget *widget = createTopicWidget(childElem);
+ m_topics[name] = widget;
+ m_topicStack->addWidget(widget);
+ }
}
childElem = childElem.nextSiblingElement();
}
@@ -423,7 +427,7 @@ static QString getDocsForNode(const QDomElement &child)
regexp.setPattern(SA("`([^`]+)`"));
docs.replace(regexp,SA("<code>\\1</code>"));
// \ref key "desc" -> <code>desc</code>
- regexp.setPattern(SA("\\\\ref[ ]+[^ ]+[ ]+\"([^ ]+)\""));
+ regexp.setPattern(SA("\\\\ref[ ]+[^ ]+[ ]+\"([^\"]+)\""));
docs.replace(regexp,SA("<code>\\1</code> "));
//\ref specials
// \ref <key> -> description
@@ -752,15 +756,18 @@ void Expert::loadConfig(const QString &fileName)
}
void Expert::saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,
- bool brief)
+ bool brief,bool condensed)
{
if (!brief)
{
t << endl;
}
- t << "#---------------------------------------------------------------------------" << endl;
- t << "# " << elem.attribute(SA("docs")) << endl;
- t << "#---------------------------------------------------------------------------" << endl;
+ if (!condensed)
+ {
+ t << "#---------------------------------------------------------------------------" << endl;
+ t << "# " << elem.attribute(SA("docs")) << endl;
+ t << "#---------------------------------------------------------------------------" << endl;
+ }
// write options...
QDomElement childElem = elem.firstChildElement();
while (!childElem.isNull())
@@ -780,24 +787,29 @@ void Expert::saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,
t << convertToComment(option->templateDocs());
t << endl;
}
- t << name.leftJustified(MAX_OPTION_LENGTH) << "=";
- if (option && !option->isEmpty())
+ bool toPrint = true;
+ if (option && condensed) toPrint = !option->isDefault();
+ if (toPrint)
{
- t << " ";
- option->writeValue(t,codec);
+ t << name.leftJustified(MAX_OPTION_LENGTH) << "=";
+ if (option && !option->isEmpty())
+ {
+ t << " ";
+ option->writeValue(t,codec);
+ }
+ t << endl;
}
- t << endl;
}
}
childElem = childElem.nextSiblingElement();
}
}
-bool Expert::writeConfig(QTextStream &t,bool brief)
+bool Expert::writeConfig(QTextStream &t,bool brief, bool condensed)
{
// write global header
- t << "# Doxyfile " << getVersion() << endl << endl;
- if (!brief)
+ t << "# Doxyfile " << getDoxygenVersion() << endl << endl;
+ if (!brief && !condensed)
{
t << convertToComment(m_header);
}
@@ -817,7 +829,7 @@ bool Expert::writeConfig(QTextStream &t,bool brief)
{
if (childElem.tagName()==SA("group"))
{
- saveTopic(t,childElem,codec,brief);
+ saveTopic(t,childElem,codec,brief,condensed);
}
childElem = childElem.nextSiblingElement();
}
diff --git a/addon/doxywizard/expert.h b/addon/doxywizard/expert.h
index f58ef62..7011eb4 100644
--- a/addon/doxywizard/expert.h
+++ b/addon/doxywizard/expert.h
@@ -38,7 +38,7 @@ class Expert : public QSplitter, public DocIntf
void loadSettings(QSettings *);
void saveSettings(QSettings *);
void loadConfig(const QString &fileName);
- bool writeConfig(QTextStream &t,bool brief);
+ bool writeConfig(QTextStream &t,bool brief,bool condensed);
QByteArray saveInnerState () const;
bool restoreInnerState ( const QByteArray & state );
const QHash<QString,Input*> &modelData() const { return m_options; }
@@ -67,7 +67,7 @@ class Expert : public QSplitter, public DocIntf
private:
void createTopics(const QDomElement &);
- void saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,bool brief);
+ void saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,bool brief,bool dondensed);
QSplitter *m_splitter;
QTextBrowser *m_helper;
diff --git a/addon/doxywizard/input.h b/addon/doxywizard/input.h
index ff8339a..c1815d0 100644
--- a/addon/doxywizard/input.h
+++ b/addon/doxywizard/input.h
@@ -40,6 +40,7 @@ class Input
virtual void setEnabled(bool) = 0;
virtual void updateDependencies() = 0;
virtual void reset() = 0;
+ virtual bool isDefault() = 0;
virtual void writeValue(QTextStream &t,QTextCodec *codec) = 0;
virtual void setTemplateDocs(const QString &docs) = 0;
virtual bool isEmpty() { return false; };
diff --git a/addon/doxywizard/inputbool.cpp b/addon/doxywizard/inputbool.cpp
index 63d9998..132658d 100644
--- a/addon/doxywizard/inputbool.cpp
+++ b/addon/doxywizard/inputbool.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2019 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -12,13 +12,14 @@
#include "inputbool.h"
#include "helplabel.h"
+#include "config_msg.h"
#include <QCheckBox>
#include <QTextStream>
#include <QTextCodec>
#include <QGridLayout>
-InputBool::InputBool( QGridLayout *layout, int &row,
+InputBool::InputBool( QGridLayout *layout, int &row,
const QString &id, bool checked,
const QString &docs )
: m_default(checked), m_docs(docs), m_id(id)
@@ -42,10 +43,10 @@ void InputBool::help()
}
void InputBool::setEnabled(bool b)
-{
+{
m_enabled = b;
- m_cb->setEnabled(b);
- m_lab->setEnabled(b);
+ m_cb->setEnabled(b);
+ m_lab->setEnabled(b);
updateDefault();
updateDependencies();
}
@@ -60,7 +61,7 @@ void InputBool::updateDependencies()
void InputBool::setValue( bool s )
{
- if (m_state!=s)
+ if (m_state!=s)
{
m_state=s;
updateDefault();
@@ -75,7 +76,7 @@ void InputBool::updateDefault()
{
if (m_state==m_default || !m_lab->isEnabled())
{
- m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt"));
+ m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt>"));
}
else
{
@@ -91,9 +92,22 @@ QVariant &InputBool::value()
void InputBool::update()
{
QString v = m_value.toString().toLower();
- m_state = (v==QString::fromLatin1("yes") ||
- v==QString::fromLatin1("true") ||
- v==QString::fromLatin1("1"));
+ if (v==QString::fromLatin1("yes") || v==QString::fromLatin1("true") ||
+ v==QString::fromLatin1("1") || v==QString::fromLatin1("all"))
+ {
+ m_state = true;
+ }
+ else if (v==QString::fromLatin1("no") || v==QString::fromLatin1("false") ||
+ v==QString::fromLatin1("0") || v==QString::fromLatin1("none"))
+ {
+ m_state = false;
+ }
+ else
+ {
+ config_warn("argument '%s' for option %s is not a valid boolean value."
+ " Using the default: %s!",qPrintable(m_value.toString()),qPrintable(m_id),m_default?"YES":"NO");
+ m_state = m_default;
+ }
m_cb->setChecked( m_state );
updateDefault();
updateDependencies();
@@ -106,9 +120,14 @@ void InputBool::reset()
void InputBool::writeValue(QTextStream &t,QTextCodec *codec)
{
- if (m_state)
- t << codec->fromUnicode(QString::fromLatin1("YES"));
- else
+ if (m_state)
+ t << codec->fromUnicode(QString::fromLatin1("YES"));
+ else
t << codec->fromUnicode(QString::fromLatin1("NO"));
}
+bool InputBool::isDefault()
+{
+ return m_state == m_default;
+}
+
diff --git a/addon/doxywizard/inputbool.h b/addon/doxywizard/inputbool.h
index 98f7f85..a527e20 100644
--- a/addon/doxywizard/inputbool.h
+++ b/addon/doxywizard/inputbool.h
@@ -38,6 +38,7 @@ class InputBool : public QObject, public Input
void addDependency(Input *option) { m_dependencies+=option; }
void setEnabled(bool);
void updateDependencies();
+ bool isDefault();
void writeValue(QTextStream &t,QTextCodec *codec);
void setTemplateDocs(const QString &docs) { m_tdocs = docs; }
diff --git a/addon/doxywizard/inputint.cpp b/addon/doxywizard/inputint.cpp
index 2aa019b..ce3fa02 100644
--- a/addon/doxywizard/inputint.cpp
+++ b/addon/doxywizard/inputint.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2019 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -12,6 +12,7 @@
#include "inputint.h"
#include "helplabel.h"
+#include "config_msg.h"
#include <QSpinBox>
#include <QGridLayout>
@@ -28,7 +29,7 @@ class NoWheelSpinBox : public QSpinBox
};
InputInt::InputInt( QGridLayout *layout,int &row,
- const QString & id,
+ const QString & id,
int defVal, int minVal,int maxVal,
const QString & docs )
: m_default(defVal), m_minVal(minVal), m_maxVal(maxVal), m_docs(docs), m_id(id)
@@ -44,7 +45,7 @@ InputInt::InputInt( QGridLayout *layout,int &row,
layout->addWidget( m_lab, row, 0 );
layout->addWidget( m_sp, row, 1 );
- connect(m_sp, SIGNAL(valueChanged(int)),
+ connect(m_sp, SIGNAL(valueChanged(int)),
this, SLOT(setValue(int)) );
connect( m_lab, SIGNAL(enter()), SLOT(help()) );
connect( m_lab, SIGNAL(reset()), SLOT(reset()) );
@@ -59,12 +60,19 @@ void InputInt::help()
void InputInt::setValue(int val)
{
- val = qMax(m_minVal,val);
- val = qMin(m_maxVal,val);
- if (val!=m_val)
+ int newVal = val;
+ newVal = qMax(m_minVal,newVal);
+ newVal = qMin(m_maxVal,newVal);
+ if (val != newVal)
{
- m_val = val;
- m_sp->setValue(val);
+ config_warn("argument '%d' for option %s is not a valid number in the range [%d..%d]!"
+ " Using the default: %d!\n",val,qPrintable(m_id),m_minVal,m_maxVal,m_default);
+ newVal = m_default;
+ }
+ if (newVal!=m_val)
+ {
+ m_val = newVal;
+ m_sp->setValue(newVal);
m_value = m_val;
updateDefault();
}
@@ -75,13 +83,13 @@ void InputInt::updateDefault()
{
if (m_val==m_default || !m_lab->isEnabled())
{
- m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt"));
+ m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt>"));
}
else
{
m_lab->setText(QString::fromLatin1("<qt><font color='red'>")+m_id+QString::fromLatin1("</font></qt>"));
}
- emit changed();
+ emit changed();
}
}
@@ -92,14 +100,22 @@ void InputInt::setEnabled(bool state)
updateDefault();
}
-QVariant &InputInt::value()
+QVariant &InputInt::value()
{
return m_value;
}
void InputInt::update()
{
- setValue(m_value.toInt());
+ bool ok;
+ int newVal = m_value.toInt(&ok);
+ if (!ok)
+ {
+ config_warn("argument '%s' for option %s is not a valid number in the range [%d..%d]!"
+ " Using the default: %d!\n",qPrintable(m_value.toString()),qPrintable(m_id),m_minVal,m_maxVal,m_default);
+ newVal = m_default;
+ }
+ setValue(newVal);
}
void InputInt::reset()
@@ -112,3 +128,8 @@ void InputInt::writeValue(QTextStream &t,QTextCodec *)
t << m_val;
}
+
+bool InputInt::isDefault()
+{
+ return m_val == m_default;
+}
diff --git a/addon/doxywizard/inputint.h b/addon/doxywizard/inputint.h
index 10d735e..60d4415 100644
--- a/addon/doxywizard/inputint.h
+++ b/addon/doxywizard/inputint.h
@@ -41,6 +41,7 @@ class InputInt : public QObject, public Input
void addDependency(Input *) { Q_ASSERT(false); }
void setEnabled(bool);
void updateDependencies() {}
+ bool isDefault();
void writeValue(QTextStream &t,QTextCodec *codec);
void setTemplateDocs(const QString &docs) { m_tdocs = docs; }
diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp
index 5c0f2c9..ac76342 100644
--- a/addon/doxywizard/inputstring.cpp
+++ b/addon/doxywizard/inputstring.cpp
@@ -13,6 +13,7 @@
#include "inputstring.h"
#include "helplabel.h"
#include "doxywizard.h"
+#include "config_msg.h"
#include "config.h"
#include <QComboBox>
@@ -130,7 +131,7 @@ void InputString::updateDefault()
{
if (m_str==m_default || !m_lab->isEnabled())
{
- m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt"));
+ m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt>"));
}
else
{
@@ -253,3 +254,22 @@ void InputString::writeValue(QTextStream &t,QTextCodec *codec)
writeStringValue(t,codec,m_str);
}
+bool InputString::isDefault()
+{
+ return m_str == m_default;
+}
+
+QString InputString::checkEnumVal(const QString &value)
+{
+ QString val = value.trimmed().toLower();
+ QStringList::Iterator it;
+ for ( it= m_values.begin(); it != m_values.end(); ++it )
+ {
+ QString enumVal = *it;
+ if (enumVal.toLower() == val) return enumVal;
+ }
+
+ config_warn("argument '%s' for option %s is not a valid enum value."
+ " Using the default: %s!",qPrintable(value),qPrintable(m_id),qPrintable(m_default));
+ return m_default;
+}
diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h
index 4f4a7f7..c22d7a3 100644
--- a/addon/doxywizard/inputstring.h
+++ b/addon/doxywizard/inputstring.h
@@ -50,15 +50,18 @@ class InputString : public QObject, public Input
QVariant &value();
void update();
Kind kind() const { return String; }
+ StringMode stringMode() const { return m_sm; }
QString docs() const { return m_docs; }
QString id() const { return m_id; }
QString templateDocs() const { return m_tdocs; }
void addDependency(Input *) { Q_ASSERT(false); }
void setEnabled(bool);
void updateDependencies() {}
+ bool isDefault();
void writeValue(QTextStream &t,QTextCodec *codec);
void setTemplateDocs(const QString &docs) { m_tdocs = docs; }
bool isEmpty() { return m_str.isEmpty(); }
+ QString checkEnumVal(const QString &value);
public slots:
void reset();
diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp
index dd1ecb2..cdc7d14 100644
--- a/addon/doxywizard/inputstrlist.cpp
+++ b/addon/doxywizard/inputstrlist.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2019 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -25,7 +25,7 @@
#include <QTextCodec>
InputStrList::InputStrList( QGridLayout *layout,int &row,
- const QString & id,
+ const QString & id,
const QStringList &sl, ListMode lm,
const QString & docs)
: m_default(sl), m_strList(sl), m_docs(docs), m_id(id)
@@ -50,7 +50,7 @@ InputStrList::InputStrList( QGridLayout *layout,int &row,
m_lb = new QListWidget;
//m_lb->setMinimumSize(400,100);
foreach (QString s, m_strList) m_lb->addItem(s);
-
+
m_brFile=0;
m_brDir=0;
if (lm!=ListString)
@@ -60,7 +60,7 @@ InputStrList::InputStrList( QGridLayout *layout,int &row,
m_brFile = toolBar->addAction(QIcon(QString::fromLatin1(":/images/file.png")),QString(),
this,SLOT(browseFiles()));
m_brFile->setToolTip(tr("Browse to a file"));
- }
+ }
if (lm&ListDir)
{
m_brDir = toolBar->addAction(QIcon(QString::fromLatin1(":/images/folder.png")),QString(),
@@ -78,9 +78,9 @@ InputStrList::InputStrList( QGridLayout *layout,int &row,
m_value = m_strList;
- connect(m_le, SIGNAL(returnPressed()),
+ connect(m_le, SIGNAL(returnPressed()),
this, SLOT(addString()) );
- connect(m_lb, SIGNAL(currentTextChanged(const QString &)),
+ connect(m_lb, SIGNAL(currentTextChanged(const QString &)),
this, SLOT(selectText(const QString &)));
connect( m_lab, SIGNAL(enter()), SLOT(help()) );
connect( m_lab, SIGNAL(reset()), SLOT(reset()) );
@@ -154,7 +154,7 @@ void InputStrList::browseFiles()
QString path = QFileInfo(MainWindow::instance().configFileName()).path();
QStringList fileNames = QFileDialog::getOpenFileNames();
- if (!fileNames.isEmpty())
+ if (!fileNames.isEmpty())
{
QStringList::Iterator it;
for ( it= fileNames.begin(); it != fileNames.end(); ++it )
@@ -184,7 +184,7 @@ void InputStrList::browseDir()
QString path = QFileInfo(MainWindow::instance().configFileName()).path();
QString dirName = QFileDialog::getExistingDirectory();
- if (!dirName.isNull())
+ if (!dirName.isNull())
{
QDir dir(path);
if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
@@ -228,9 +228,9 @@ void InputStrList::update()
void InputStrList::updateDefault()
{
- if (m_strList==m_default || !m_lab->isEnabled())
+ if (isDefault() || !m_lab->isEnabled())
{
- m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt"));
+ m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt>"));
}
else
{
@@ -246,9 +246,9 @@ void InputStrList::reset()
void InputStrList::writeValue(QTextStream &t,QTextCodec *codec)
{
bool first=true;
- foreach (QString s, m_strList)
+ foreach (QString s, m_strList)
{
- if (!first)
+ if (!first)
{
t << " \\" << endl;
t << " ";
@@ -258,6 +258,59 @@ void InputStrList::writeValue(QTextStream &t,QTextCodec *codec)
}
}
+bool InputStrList::isDefault()
+{
+ if (m_strList==m_default) return true;
+
+ auto it1 = m_strList.begin();
+ auto it2 = m_default.begin();
+ while (it1!=m_strList.end() && (*it1).isEmpty())
+ {
+ ++it1;
+ }
+ while (it2!=m_default.end() && (*it2).isEmpty())
+ {
+ ++it2;
+ }
+ // both lists are empty
+ if (it1==m_strList.end() && it2==m_default.end()) return true;
+
+ // one list is empty but the other is not
+ if (it1==m_default.end()) return false;
+ if (it2==m_strList.end()) return false;
+
+ it1 = m_strList.begin();
+ it2 = m_default.begin();
+ while (it1!=m_strList.end() && it2!=m_default.end())
+ {
+ // skip over empty values
+ while (it1!=m_strList.end() && (*it1).isEmpty())
+ {
+ ++it1;
+ }
+ while (it2!=m_default.end() && (*it2).isEmpty())
+ {
+ ++it2;
+ }
+ if ((it1!=m_strList.end()) && (it2!=m_default.end()))
+ {
+ if ((*it1).trimmed()!= (*it2).trimmed()) // difference so not the default
+ {
+ return false;
+ }
+ ++it1;
+ ++it2;
+ }
+ else if ((it1!=m_strList.end()) || (it2!=m_default.end()))
+ {
+ // one list empty so cannot be the default
+ return false;
+ }
+ }
+
+ return true;
+}
+
bool InputStrList::isEmpty()
{
foreach (QString s, m_strList)
diff --git a/addon/doxywizard/inputstrlist.h b/addon/doxywizard/inputstrlist.h
index adb0fb0..d2e713d 100644
--- a/addon/doxywizard/inputstrlist.h
+++ b/addon/doxywizard/inputstrlist.h
@@ -51,6 +51,7 @@ class InputStrList : public QObject, public Input
void addDependency(Input *) { Q_ASSERT(false); }
void setEnabled(bool);
void updateDependencies() {}
+ bool isDefault();
void writeValue(QTextStream &t,QTextCodec *codec);
void setTemplateDocs(const QString &docs) { m_tdocs = docs; }
bool isEmpty();
diff --git a/addon/doxywizard/wizard.cpp b/addon/doxywizard/wizard.cpp
index 2233379..6be752f 100644..100755
--- a/addon/doxywizard/wizard.cpp
+++ b/addon/doxywizard/wizard.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2019 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -47,6 +47,7 @@
#define STR_OPTIMIZE_OUTPUT_JAVA QString::fromLatin1("OPTIMIZE_OUTPUT_JAVA")
#define STR_OPTIMIZE_FOR_FORTRAN QString::fromLatin1("OPTIMIZE_FOR_FORTRAN")
#define STR_OPTIMIZE_OUTPUT_VHDL QString::fromLatin1("OPTIMIZE_OUTPUT_VHDL")
+#define STR_OPTIMIZE_OUTPUT_SLICE QString::fromLatin1("OPTIMIZE_OUTPUT_SLICE")
#define STR_CPP_CLI_SUPPORT QString::fromLatin1("CPP_CLI_SUPPORT")
#define STR_HIDE_SCOPE_NAMES QString::fromLatin1("HIDE_SCOPE_NAMES")
#define STR_EXTRACT_ALL QString::fromLatin1("EXTRACT_ALL")
@@ -56,6 +57,7 @@
#define STR_GENERATE_MAN QString::fromLatin1("GENERATE_MAN")
#define STR_GENERATE_RTF QString::fromLatin1("GENERATE_RTF")
#define STR_GENERATE_XML QString::fromLatin1("GENERATE_XML")
+#define STR_GENERATE_DOCBOOK QString::fromLatin1("GENERATE_DOCBOOK")
#define STR_GENERATE_HTMLHELP QString::fromLatin1("GENERATE_HTMLHELP")
#define STR_GENERATE_TREEVIEW QString::fromLatin1("GENERATE_TREEVIEW")
#define STR_USE_PDFLATEX QString::fromLatin1("USE_PDFLATEX")
@@ -74,7 +76,7 @@
#define STR_HTML_COLORSTYLE_SAT QString::fromLatin1("HTML_COLORSTYLE_SAT")
#define STR_HTML_COLORSTYLE_GAMMA QString::fromLatin1("HTML_COLORSTYLE_GAMMA")
-static bool g_optimizeMapping[6][6] =
+static bool g_optimizeMapping[7][7] =
{
// A: OPTIMIZE_OUTPUT_FOR_C
// B: OPTIMIZE_OUTPUT_JAVA
@@ -82,23 +84,26 @@ static bool g_optimizeMapping[6][6] =
// D: OPTIMIZE_OUTPUT_VHDL
// E: CPP_CLI_SUPPORT
// F: HIDE_SCOPE_NAMES
- // A B C D E F
- { false,false,false,false,false,false }, // 0: C++
- { false,false,false,false,true, false }, // 1: C++/CLI
- { false,true, false,false,false,false }, // 2: C#/Java
- { true, false,false,false,false,true }, // 3: C/PHP
- { false,false,true, false,false,false }, // 4: Fortran
- { false,false,false,true, false,false }, // 5: VHDL
+ // G: OPTIMIZE_OUTPUT_SLICE
+ // A B C D E F G
+ { false,false,false,false,false,false,false }, // 0: C++
+ { false,false,false,false,true, false,false }, // 1: C++/CLI
+ { false,true, false,false,false,false,false }, // 2: C#/Java
+ { true, false,false,false,false,true, false }, // 3: C/PHP
+ { false,false,true, false,false,false,false }, // 4: Fortran
+ { false,false,false,true, false,false,false }, // 5: VHDL
+ { false,false,false,false,false,false,true }, // 6: SLICE
};
-static QString g_optimizeOptionNames[6] =
+static QString g_optimizeOptionNames[7] =
{
STR_OPTIMIZE_OUTPUT_FOR_C,
STR_OPTIMIZE_OUTPUT_JAVA,
STR_OPTIMIZE_FOR_FORTRAN,
STR_OPTIMIZE_OUTPUT_VHDL,
STR_CPP_CLI_SUPPORT,
- STR_HIDE_SCOPE_NAMES
+ STR_HIDE_SCOPE_NAMES,
+ STR_OPTIMIZE_OUTPUT_SLICE
};
//==========================================================================
@@ -107,7 +112,7 @@ static bool stringVariantToBool(const QVariant &v)
{
QString s = v.toString().toLower();
return s==QString::fromLatin1("yes") || s==QString::fromLatin1("true") || s==QString::fromLatin1("1");
-}
+}
static bool getBoolOption(
const QHash<QString,Input*>&model,const QString &name)
@@ -115,7 +120,7 @@ static bool getBoolOption(
Input *option = model[name];
Q_ASSERT(option!=0);
return stringVariantToBool(option->value());
-}
+}
static int getIntOption(
const QHash<QString,Input*>&model,const QString &name)
@@ -123,7 +128,7 @@ static int getIntOption(
Input *option = model[name];
Q_ASSERT(option!=0);
return option->value().toInt();
-}
+}
static QString getStringOption(
const QHash<QString,Input*>&model,const QString &name)
@@ -343,19 +348,19 @@ void ColorPicker::paintEvent(QPaintEvent*)
QRect r(0, foff, w, height() - 2*foff);
int wi = r.width() - 2;
int hi = r.height() - 2;
- if (!m_pix || m_pix->height() != hi || m_pix->width() != wi)
+ if (!m_pix || m_pix->height() != hi || m_pix->width() != wi)
{
delete m_pix;
QImage img(wi, hi, QImage::Format_RGB32);
int y;
uint *pixel = (uint *) img.scanLine(0);
- for (y = 0; y < hi; y++)
+ for (y = 0; y < hi; y++)
{
const uint *end = pixel + wi;
int yh = y2hue(y+coff);
int ys = y2sat(y+coff);
int yg = y2gam(y+coff);
- while (pixel < end)
+ while (pixel < end)
{
QColor c;
c.setHsv(yh, ys, (int)(255*pow(0.7,yg/100.0)));
@@ -369,10 +374,10 @@ void ColorPicker::paintEvent(QPaintEvent*)
p.drawPixmap(1, coff, *m_pix);
const QPalette &g = palette();
qDrawShadePanel(&p, r, g, true);
- p.setPen(g.foreground().color());
- p.setBrush(g.foreground());
+ p.setPen(g.windowText().color());
+ p.setBrush(g.windowText());
QPolygon a;
- int y = m_mode==Hue ? hue2y(m_hue) :
+ int y = m_mode==Hue ? hue2y(m_hue) :
m_mode==Saturation ? sat2y(m_sat) :
gam2y(m_gam);
a.setPoints(3, w, y, w+5, y+5, w+5, y-5);
@@ -382,14 +387,14 @@ void ColorPicker::paintEvent(QPaintEvent*)
void ColorPicker::mouseMoveEvent(QMouseEvent *m)
{
- if (m_mode==Hue) setHue(y2hue(m->y()));
+ if (m_mode==Hue) setHue(y2hue(m->y()));
else if (m_mode==Saturation) setSat(y2sat(m->y()));
else setGam(y2gam(m->y()));
}
void ColorPicker::mousePressEvent(QMouseEvent *m)
{
- if (m_mode==Hue) setHue(y2hue(m->y()));
+ if (m_mode==Hue) setHue(y2hue(m->y()));
else if (m_mode==Saturation) setSat(y2sat(m->y()));
else setGam(y2gam(m->y()));
}
@@ -530,7 +535,7 @@ Step1::Step1(Wizard *wizard,const QHash<QString,Input*> &modelData) : m_wizard(w
QFrame *f = new QFrame( this );
f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
layout->addWidget(f);
-
+
l = new QLabel(this);
l->setText(tr("Specify the directory to scan for source code"));
layout->addWidget(l);
@@ -602,7 +607,7 @@ void Step1::selectProjectIcon()
else
{
QFile Fout(iconName);
- if(!Fout.exists())
+ if(!Fout.exists())
{
m_projIconLab->setText(tr("Sorry, cannot find file(")+iconName+QString::fromLatin1(");"));
}
@@ -711,7 +716,7 @@ void Step1::init()
if (!iconName.isEmpty())
{
QFile Fout(iconName);
- if(!Fout.exists())
+ if(!Fout.exists())
{
m_projIconLab->setText(tr("Sorry, cannot find file(")+iconName+QString::fromLatin1(");"));
}
@@ -745,7 +750,7 @@ void Step1::init()
//==========================================================================
-Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
+Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
: m_wizard(wizard), m_modelData(modelData)
{
QRadioButton *r;
@@ -770,7 +775,7 @@ Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
// m_crossRef -> SOURCE_BROWSER = YES/NO
gbox->addWidget(m_crossRef,3,0);
layout->addWidget(m_extractMode);
-
+
//---------------------------------------------------
QFrame *f = new QFrame( this );
f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
@@ -779,8 +784,8 @@ Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
m_optimizeLangGroup = new QButtonGroup(this);
m_optimizeLang = new QGroupBox(this);
m_optimizeLang->setTitle(tr("Select programming language to optimize the results for"));
- gbox = new QGridLayout( m_optimizeLang );
-
+ gbox = new QGridLayout( m_optimizeLang );
+
r = new QRadioButton(m_optimizeLang);
r->setText(tr("Optimize for C++ output"));
r->setChecked(true);
@@ -791,6 +796,7 @@ Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
// OPTIMIZE_OUTPUT_VHDL = NO
// CPP_CLI_SUPPORT = NO
// HIDE_SCOPE_NAMES = NO
+ // OPTIMIZE_OUTPUT_SLICE = NO
gbox->addWidget(r,0,0);
r = new QRadioButton(tr("Optimize for C++/CLI output"));
gbox->addWidget(r,1,0);
@@ -801,6 +807,7 @@ Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
// OPTIMIZE_OUTPUT_VHDL = NO
// CPP_CLI_SUPPORT = YES
// HIDE_SCOPE_NAMES = NO
+ // OPTIMIZE_OUTPUT_SLICE = NO
r = new QRadioButton(tr("Optimize for Java or C# output"));
m_optimizeLangGroup->addButton(r, 2);
// 2 -> OPTIMIZE_OUTPUT_FOR_C = NO
@@ -809,6 +816,7 @@ Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
// OPTIMIZE_OUTPUT_VHDL = NO
// CPP_CLI_SUPPORT = NO
// HIDE_SCOPE_NAMES = NO
+ // OPTIMIZE_OUTPUT_SLICE = NO
gbox->addWidget(r,2,0);
r = new QRadioButton(tr("Optimize for C or PHP output"));
m_optimizeLangGroup->addButton(r, 3);
@@ -818,6 +826,7 @@ Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
// OPTIMIZE_OUTPUT_VHDL = NO
// CPP_CLI_SUPPORT = NO
// HIDE_SCOPE_NAMES = YES
+ // OPTIMIZE_OUTPUT_SLICE = NO
gbox->addWidget(r,3,0);
r = new QRadioButton(tr("Optimize for Fortran output"));
m_optimizeLangGroup->addButton(r, 4);
@@ -827,6 +836,7 @@ Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
// OPTIMIZE_OUTPUT_VHDL = NO
// CPP_CLI_SUPPORT = NO
// HIDE_SCOPE_NAMES = NO
+ // OPTIMIZE_OUTPUT_SLICE = NO
gbox->addWidget(r,4,0);
r = new QRadioButton(tr("Optimize for VHDL output"));
m_optimizeLangGroup->addButton(r, 5);
@@ -836,7 +846,18 @@ Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
// OPTIMIZE_OUTPUT_VHDL = YES
// CPP_CLI_SUPPORT = NO
// HIDE_SCOPE_NAMES = NO
+ // OPTIMIZE_OUTPUT_SLICE = NO
gbox->addWidget(r,5,0);
+ r = new QRadioButton(tr("Optimize for SLICE output"));
+ m_optimizeLangGroup->addButton(r, 6);
+ // 5 -> OPTIMIZE_OUTPUT_FOR_C = NO
+ // OPTIMIZE_OUTPUT_JAVA = NO
+ // OPTIMIZE_FOR_FORTRAN = NO
+ // OPTIMIZE_OUTPUT_VHDL = NO
+ // CPP_CLI_SUPPORT = NO
+ // HIDE_SCOPE_NAMES = NO
+ // OPTIMIZE_OUTPUT_SLICE = YES
+ gbox->addWidget(r,6,0);
layout->addWidget(m_optimizeLang);
layout->addStretch(1);
@@ -852,7 +873,7 @@ Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
void Step2::optimizeFor(int choice)
{
- for (int i=0;i<6;i++)
+ for (int i=0;i<7;i++)
{
updateBoolOption(m_modelData,
g_optimizeOptionNames[i],
@@ -882,12 +903,13 @@ void Step2::init()
else if (getBoolOption(m_modelData,STR_OPTIMIZE_OUTPUT_FOR_C)) x=3;
else if (getBoolOption(m_modelData,STR_OPTIMIZE_FOR_FORTRAN)) x=4;
else if (getBoolOption(m_modelData,STR_OPTIMIZE_OUTPUT_VHDL)) x=5;
+ else if (getBoolOption(m_modelData,STR_OPTIMIZE_OUTPUT_SLICE)) x=6;
m_optimizeLangGroup->button(x)->setChecked(true);
}
//==========================================================================
-Step3::Step3(Wizard *wizard,const QHash<QString,Input*> &modelData)
+Step3::Step3(Wizard *wizard,const QHash<QString,Input*> &modelData)
: m_wizard(wizard), m_modelData(modelData)
{
QVBoxLayout *vbox = 0;
@@ -957,16 +979,20 @@ Step3::Step3(Wizard *wizard,const QHash<QString,Input*> &modelData)
// GENERATE_RTF
m_xmlEnabled=new QCheckBox(tr("XML"));
// GENERATE_XML
+ m_docbookEnabled=new QCheckBox(tr("Docbook"));
+ // GENERATE_DOCBOOK
gbox->addWidget(m_manEnabled,3,0);
gbox->addWidget(m_rtfEnabled,4,0);
gbox->addWidget(m_xmlEnabled,5,0);
+ gbox->addWidget(m_docbookEnabled,6,0);
- gbox->setRowStretch(6,1);
+ gbox->setRowStretch(7,1);
connect(m_htmlOptions,SIGNAL(toggled(bool)),SLOT(setHtmlEnabled(bool)));
connect(m_texOptions,SIGNAL(toggled(bool)),SLOT(setLatexEnabled(bool)));
connect(m_manEnabled,SIGNAL(stateChanged(int)),SLOT(setManEnabled(int)));
connect(m_rtfEnabled,SIGNAL(stateChanged(int)),SLOT(setRtfEnabled(int)));
connect(m_xmlEnabled,SIGNAL(stateChanged(int)),SLOT(setXmlEnabled(int)));
+ connect(m_docbookEnabled,SIGNAL(stateChanged(int)),SLOT(setDocbookEnabled(int)));
connect(m_searchEnabled,SIGNAL(stateChanged(int)),SLOT(setSearchEnabled(int)));
connect(m_htmlOptionsGroup,SIGNAL(buttonClicked(int)),
SLOT(setHtmlOptions(int)));
@@ -1014,6 +1040,11 @@ void Step3::setXmlEnabled(int state)
updateBoolOption(m_modelData,STR_GENERATE_XML,state==Qt::Checked);
}
+void Step3::setDocbookEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_GENERATE_DOCBOOK,state==Qt::Checked);
+}
+
void Step3::setSearchEnabled(int state)
{
updateBoolOption(m_modelData,STR_SEARCHENGINE,state==Qt::Checked);
@@ -1064,6 +1095,7 @@ void Step3::init()
m_manEnabled->setChecked(getBoolOption(m_modelData,STR_GENERATE_MAN));
m_rtfEnabled->setChecked(getBoolOption(m_modelData,STR_GENERATE_RTF));
m_xmlEnabled->setChecked(getBoolOption(m_modelData,STR_GENERATE_XML));
+ m_docbookEnabled->setChecked(getBoolOption(m_modelData,STR_GENERATE_DOCBOOK));
m_searchEnabled->setChecked(getBoolOption(m_modelData,STR_SEARCHENGINE));
if (getBoolOption(m_modelData,STR_GENERATE_HTMLHELP))
{
@@ -1093,7 +1125,7 @@ void Step3::init()
//==========================================================================
-Step4::Step4(Wizard *wizard,const QHash<QString,Input*> &modelData)
+Step4::Step4(Wizard *wizard,const QHash<QString,Input*> &modelData)
: m_wizard(wizard), m_modelData(modelData)
{
m_diagramModeGroup = new QButtonGroup(this);
@@ -1116,7 +1148,7 @@ Step4::Step4(Wizard *wizard,const QHash<QString,Input*> &modelData)
m_dotGroup = new QGroupBox(tr("Dot graphs to generate"));
QVBoxLayout *vbox = new QVBoxLayout;
- m_dotClass=new QCheckBox(tr("Class diagrams"));
+ m_dotClass=new QCheckBox(tr("Class graphs"));
// CLASS_GRAPH
m_dotCollaboration=new QCheckBox(tr("Collaboration diagrams"));
// COLLABORATION_GRAPH
@@ -1250,7 +1282,7 @@ void Step4::init()
//==========================================================================
-Wizard::Wizard(const QHash<QString,Input*> &modelData, QWidget *parent) :
+Wizard::Wizard(const QHash<QString,Input*> &modelData, QWidget *parent) :
QSplitter(parent), m_modelData(modelData)
{
m_treeWidget = new QTreeWidget;
@@ -1303,7 +1335,7 @@ void Wizard::activateTopic(QTreeWidgetItem *item,QTreeWidgetItem *)
{
if (item)
{
-
+
QString label = item->text(0);
if (label==tr("Project"))
{
diff --git a/addon/doxywizard/wizard.h b/addon/doxywizard/wizard.h
index 810ab95..d4fbba3 100644
--- a/addon/doxywizard/wizard.h
+++ b/addon/doxywizard/wizard.h
@@ -31,11 +31,6 @@ class Wizard;
class QImage;
class QLabel;
-enum OptLang { Lang_Cpp, Lang_C, Lang_Java, Lang_CS };
-enum HtmlStyle { HS_Plain, HS_TreeView, HS_CHM };
-enum TexStyle { TS_PDFHyper, TS_PDF, TS_PS };
-enum DiagramMode { DM_None, DM_Builtin, DM_Dot };
-
class TuneColorDialog : public QDialog
{
Q_OBJECT
@@ -167,6 +162,7 @@ class Step3 : public QWidget
void setManEnabled(int);
void setRtfEnabled(int);
void setXmlEnabled(int);
+ void setDocbookEnabled(int);
void setSearchEnabled(int);
void setHtmlOptions(int);
void setLatexOptions(int);
@@ -182,6 +178,7 @@ class Step3 : public QWidget
QCheckBox *m_manEnabled = 0;
QCheckBox *m_rtfEnabled = 0;
QCheckBox *m_xmlEnabled = 0;
+ QCheckBox *m_docbookEnabled = 0;
QCheckBox *m_searchEnabled = 0;
QPushButton *m_tuneColor = 0;
Wizard *m_wizard = 0;
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index 7969be0..0000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-image: Visual Studio 2017
-
-configuration:
- - Release
- - Debug
-
-platform:
- - x64
- - Win32
-
-environment:
- # VS VERSION IN CMAKE STYLE
- matrix:
- - VSVERSION: "15 2017"
- - VSVERSION: "14 2015"
-
-cache:
- - C:\Users\Appveyor\.conan -> appveyor.yml
- - c:\.conan -> appveyor.yml
- - '%LOCALAPPDATA%\pip\Cache -> appveyor.yml'
- - C:\miktex-repository -> appveyor.yml
-
-
-init:
- - cmake --version
- - perl --version
- - msbuild /version
-
-install:
- # Static url: https://github.com/MiKTeX/miktex/issues/321#issuecomment-496286866
- # The setup is small enough, and does not need to be cached
- - appveyor-retry appveyor DownloadFile https://miktex.org/download/win/miktexsetup-x64.zip
- - 7z e miktexsetup-x64.zip
- - appveyor-retry miktexsetup.exe --local-package-repository=C:\miktex-repository --package-set=essential download
- - miktexsetup.exe --local-package-repository=C:\miktex-repository --package-set=essential --shared install
- - refreshenv
- - pip install conan
- - ps: |
- "[requires]
- libxml2/2.9.8@bincrafters/stable
- winflexbison/2.5.16@bincrafters/stable" | Out-File -Encoding ASCII -FilePath conanfile.txt
- - conan install . -g virtualrunenv --build missing
- - activate_run.bat
-
-before_build:
- - if "%platform%"=="Win32" ( set "CMAKE_GENERATOR_NAME=Visual Studio %VSVERSION%" )
- - if "%platform%"=="x64" ( set "CMAKE_GENERATOR_NAME=Visual Studio %VSVERSION% Win64")
- - mkdir build
- - cd build
- - cmake -G "%CMAKE_GENERATOR_NAME%" ..
-
-build:
- project: "build\\PACKAGE.vcxproj"
- parallel: false
-
-test_script:
- - msbuild "testing\tests.vcxproj" /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
-# Disabled building document due to unreliable MikTeX installation
-# - cmake -G "%CMAKE_GENERATOR_NAME%" -D build_doc=ON ..
-# - msbuild "doc\docs.vcxproj" /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
diff --git a/cmake/CompilerWarnings.cmake b/cmake/CompilerWarnings.cmake
new file mode 100644
index 0000000..8137f6f
--- /dev/null
+++ b/cmake/CompilerWarnings.cmake
@@ -0,0 +1,119 @@
+# adapted from
+# https://github.com/lefticus/cppbestpractices/blob/master/02-Use_the_Tools_Available.md
+
+function(set_project_warnings project_name)
+
+ set(MSVC_WARNINGS
+ #/W4 # Baseline reasonable warnings
+ /w14242 # 'identfier': conversion from 'type1' to 'type1', possible loss
+ # of data
+ /w14254 # 'operator': conversion from 'type1:field_bits' to
+ # 'type2:field_bits', possible loss of data
+ /w14263 # 'function': member function does not override any base class
+ # virtual member function
+ /w14265 # 'classname': class has virtual functions, but destructor is not
+ # virtual instances of this class may not be destructed correctly
+ /w14287 # 'operator': unsigned/negative constant mismatch
+ /we4289 # nonstandard extension used: 'variable': loop control variable
+ # declared in the for-loop is used outside the for-loop scope
+ /w14296 # 'operator': expression is always 'boolean_value'
+ /w14311 # 'variable': pointer truncation from 'type1' to 'type2'
+ /w14545 # expression before comma evaluates to a function which is missing
+ # an argument list
+ /w14546 # function call before comma missing argument list
+ /w14547 # 'operator': operator before comma has no effect; expected
+ # operator with side-effect
+ /w14549 # 'operator': operator before comma has no effect; did you intend
+ # 'operator'?
+ /w14555 # expression has no effect; expected expression with side- effect
+ /w14619 # pragma warning: there is no warning number 'number'
+ /w14640 # Enable warning on thread un-safe static member initialization
+ /w14826 # Conversion from 'type1' to 'type_2' is sign-extended. This may
+ # cause unexpected runtime behavior.
+ /w14905 # wide string literal cast to 'LPSTR'
+ /w14906 # string literal cast to 'LPWSTR'
+ /w14928 # illegal copy-initialization; more than one user-defined
+ # conversion has been implicitly applied
+ )
+
+ set(CLANG_WARNINGS
+ -Wall
+ -Wextra # reasonable and standard
+ -Wshadow # warn the user if a variable declaration shadows one from a
+ # parent context
+ $<$<COMPILE_LANGUAGE:CXX>:-Wnon-virtual-dtor>
+ # warn the user if a class with virtual functions has a
+ # non-virtual destructor. This helps catch hard to
+ # track down memory errors
+# -Wold-style-cast # warn for c-style casts
+ -Wcast-align # warn for potential performance problem casts
+ -Wunused # warn on anything being unused
+ $<$<COMPILE_LANGUAGE:CXX>:-Woverloaded-virtual>
+ # warn if you overload (not override) a virtual function
+ -Wpedantic # warn if non-standard C++ is used
+ -Wconversion # warn on type conversions that may lose data
+ -Wnull-dereference # warn if a null dereference is detected
+ -Wdouble-promotion # warn if float is implicit promoted to double
+ -Wformat=2 # warn on security issues around functions that format output
+ # (ie printf)
+
+ # turn off warning caused by generated code (flex)
+ -Wno-unused-parameter
+ -Wno-implicit-int-conversion
+ -Wno-sign-conversion
+ -Wno-format-nonliteral
+ -Wno-shorten-64-to-32
+
+ # enable to turn warnings into errors
+ #-Werror
+ )
+
+ set(GCC_WARNINGS
+ -Wall
+ -Wextra # reasonable and standard
+ -Wshadow # warn the user if a variable declaration shadows one from a
+ # parent context
+ $<$<COMPILE_LANGUAGE:CXX>:-Wnon-virtual-dtor>
+ # warn the user if a class with virtual functions has a
+ # non-virtual destructor. This helps catch hard to
+ # track down memory errors
+# -Wold-style-cast # warn for c-style casts
+ -Wcast-align # warn for potential performance problem casts
+ -Wunused # warn on anything being unused
+ $<$<COMPILE_LANGUAGE:CXX>:-Woverloaded-virtual>
+ # warn if you overload (not override) a virtual function
+ -Wpedantic # warn if non-standard C++ is used
+ #-Wconversion # warn on type conversions that may lose data
+ #-Wnull-dereference # warn if a null dereference is detected
+ -Wdouble-promotion # warn if float is implicit promoted to double
+ -Wformat=2 # warn on security issues around functions that format output
+ # (ie printf)
+
+ # turn off warning caused by generated code (flex)
+ -Wno-unused-parameter
+ -Wno-sign-conversion
+ -Wno-format-nonliteral
+
+ # enable to turn warnings into errors
+ #-Werror
+ )
+
+ if(MSVC)
+ set(PROJECT_WARNINGS ${MSVC_WARNINGS})
+ elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") # e.g. Clang or AppleClang
+ set(PROJECT_WARNINGS ${CLANG_WARNINGS})
+ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "7.0.0")
+ set(GCC_EXTRA_WARNINGS
+ -Wno-implicit-fallthrough
+ )
+ else()
+ set(GCC_EXTRA_WARNINGS
+ )
+ endif()
+ set(PROJECT_WARNINGS ${GCC_WARNINGS} ${GCC_EXTRA_WARNINGS})
+ endif()
+
+ target_compile_options(${project_name} PRIVATE ${PROJECT_WARNINGS})
+
+endfunction()
diff --git a/cmake/Coverage.cmake b/cmake/Coverage.cmake
new file mode 100644
index 0000000..ce7d431
--- /dev/null
+++ b/cmake/Coverage.cmake
@@ -0,0 +1,39 @@
+if(enable_coverage)
+ FIND_PROGRAM( LCOV_PATH lcov )
+ FIND_PROGRAM( GENHTML_PATH genhtml )
+ set(COVERAGE_COMPILER_FLAGS -g --coverage -O0
+ CACHE INTERNAL "")
+ set(COVERAGE_LINKER_FLAGS --coverage
+ CACHE INTERNAL "")
+ add_custom_target(coverage-clean
+ COMMAND ${LCOV_PATH} --rc lcov_branch_coverage=1 --directory . --zerocounters
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ )
+ add_custom_target(coverage
+ COMMAND ${LCOV_PATH} --rc lcov_branch_coverage=1 --directory . --capture --output-file cov.info
+ COMMAND ${LCOV_PATH} --rc lcov_branch_coverage=1 --remove cov.info '*/c++/*' '*/_ctype.h' '*/generated_src/*' --output-file cov.info.cleaned
+ COMMAND ${CMAKE_COMMAND} -Dsearch=${PROJECT_BINARY_DIR}
+ -Dreplace=${PROJECT_SOURCE_DIR}
+ -Dsrc=cov.info.cleaned
+ -Ddst=cov.info.final
+ -P ${PROJECT_SOURCE_DIR}/cmake/SearchReplace.cmake
+ COMMAND ${GENHTML_PATH} --rc genhtml_branch_coverage=1
+ --function-coverage --branch-coverage
+ --title "Doxygen Coverage Report" --num-spaces 2
+ --legend --prefix ${PROJECT_SOURCE_DIR} --demangle-cpp
+ --output-directory cov_output cov.info.final
+ COMMAND ${CMAKE_COMMAND} -E remove cov.info cov.info.cleaned cov.info.final
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ )
+ add_custom_command(TARGET coverage POST_BUILD
+ COMMAND ;
+ COMMENT "Open ./cov_output/index.html in your browser to view the coverage report"
+ )
+endif()
+
+function(set_project_coverage project_name)
+ if(enable_coverage)
+ target_compile_options(${project_name} PRIVATE ${COVERAGE_COMPILER_FLAGS})
+ endif()
+endfunction()
+
diff --git a/cmake/FindIconv.cmake b/cmake/FindIconv.cmake
index a30f1fd..a77e3a1 100644
--- a/cmake/FindIconv.cmake
+++ b/cmake/FindIconv.cmake
@@ -84,7 +84,7 @@ check_cxx_source_compiles(
ICONV_COMPILES)
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(ICONV DEFAULT_MSG ICONV_TEST ICONV_INCLUDE_DIR ICONV_COMPILES)
+find_package_handle_standard_args(Iconv DEFAULT_MSG ICONV_TEST ICONV_INCLUDE_DIR ICONV_COMPILES)
if(ICONV_FOUND)
set(ICONV_LIBRARIES ${ICONV_LIBRARY})
diff --git a/cmake/FindJavacc.cmake b/cmake/FindJavacc.cmake
index c7de776..a134020 100755
--- a/cmake/FindJavacc.cmake
+++ b/cmake/FindJavacc.cmake
@@ -1,9 +1,24 @@
-
find_program(JAVACC_EXECUTABLE NAMES javacc javaCC Javacc JavaCC javacc.bat DOC "path to the javacc executable")
mark_as_advanced(JAVACC_EXECUTABLE)
if(JAVACC_EXECUTABLE)
set(JAVACC_FOUND 1)
message(STATUS "The javacc executable: ${JAVACC_EXECUTABLE}")
+ execute_process(
+ COMMAND "${JAVACC_EXECUTABLE}" -version
+ OUTPUT_VARIABLE JAVACC_TEMP_VERSION
+ )
+ string(REGEX MATCH ".* ([0-9]+(\\.[0-9]+)+) .*" JAVACC_TEMP_VERSION2_UNUSED "${JAVACC_TEMP_VERSION}")
+ if(CMAKE_MATCH_1)
+ set(JAVACC_VERSION ${CMAKE_MATCH_1})
+ else()
+ string(REGEX MATCH "([0-9]+(\\.[0-9]+)+)" JAVACC_TEMP_VERSION3_UNUSED "${JAVACC_TEMP_VERSION}")
+ if(CMAKE_MATCH_1)
+ set(JAVACC_VERSION ${CMAKE_MATCH_1})
+ else()
+ message(STATUS "Unable to determine JavaCC version, using existing files")
+ set(JAVACC_FOUND 0)
+ endif()
+ endif()
else()
set(JAVACC_FOUND 0)
message(STATUS "The javacc executable not found, using existing files")
diff --git a/cmake/FindXapian.cmake b/cmake/Findxapian.cmake
index 6109d7f..33726cf 100644
--- a/cmake/FindXapian.cmake
+++ b/cmake/Findxapian.cmake
@@ -1,4 +1,4 @@
-# Find Xapian search engine library
+# Find xapian search engine library
#
# XAPIAN_FOUND - system has Xapian
# XAPIAN_INCLUDE_DIR - the Xapian include directory
@@ -11,7 +11,7 @@
if(XAPIAN_INCLUDE_DIR AND XAPIAN_LIBRARIES)
# Already in cache, be silent
- set(Xapian_FIND_QUIETLY TRUE)
+ set(xapian_FIND_QUIETLY TRUE)
endif(XAPIAN_INCLUDE_DIR AND XAPIAN_LIBRARIES)
FIND_PATH(XAPIAN_INCLUDE_DIR xapian/version.h)
@@ -25,16 +25,16 @@ ELSE(XAPIAN_INCLUDE_DIR AND XAPIAN_LIBRARIES)
ENDIF(XAPIAN_INCLUDE_DIR AND XAPIAN_LIBRARIES)
IF(XAPIAN_FOUND)
- IF(NOT Xapian_FIND_QUIETLY)
- MESSAGE(STATUS "Found Xapian: ${XAPIAN_LIBRARIES}")
- ENDIF(NOT Xapian_FIND_QUIETLY)
+ IF(NOT xapian_FIND_QUIETLY)
+ MESSAGE(STATUS "Found xapian: ${XAPIAN_LIBRARIES}")
+ ENDIF(NOT xapian_FIND_QUIETLY)
ELSE(XAPIAN_FOUND)
- IF(Xapian_FIND_REQUIRED)
- MESSAGE(FATAL_ERROR "Could not find Xapian")
- ENDIF(Xapian_FIND_REQUIRED)
- IF(NOT Xapian_FIND_QUIETLY)
- MESSAGE(STATUS "Could not find Xapian")
- ENDIF(NOT Xapian_FIND_QUIETLY)
+ IF(xapian_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find xapian")
+ ENDIF(xapian_FIND_REQUIRED)
+ IF(NOT xapian_FIND_QUIETLY)
+ MESSAGE(STATUS "Could not find xapian")
+ ENDIF(NOT xapian_FIND_QUIETLY)
ENDIF(XAPIAN_FOUND)
# show the XAPIAN_INCLUDE_DIR and XAPIAN_LIBRARIES variables only in the advanced view
diff --git a/cmake/Sanitizers/FindASan.cmake b/cmake/Sanitizers/FindASan.cmake
new file mode 100644
index 0000000..98ea7cb
--- /dev/null
+++ b/cmake/Sanitizers/FindASan.cmake
@@ -0,0 +1,59 @@
+# The MIT License (MIT)
+#
+# Copyright (c)
+# 2013 Matthew Arsenault
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+option(SANITIZE_ADDRESS "Enable AddressSanitizer for sanitized targets." Off)
+
+set(FLAG_CANDIDATES
+ # Clang 3.2+ use this version. The no-omit-frame-pointer option is optional.
+ "-g -fsanitize=address -fno-omit-frame-pointer"
+ "-g -fsanitize=address"
+
+ # Older deprecated flag for ASan
+ "-g -faddress-sanitizer"
+)
+
+
+if (SANITIZE_ADDRESS AND (SANITIZE_THREAD OR SANITIZE_MEMORY))
+ message(FATAL_ERROR "AddressSanitizer is not compatible with "
+ "ThreadSanitizer or MemorySanitizer.")
+endif ()
+
+
+include(sanitize-helpers)
+
+if (SANITIZE_ADDRESS)
+ sanitizer_check_compiler_flags("${FLAG_CANDIDATES}" "AddressSanitizer"
+ "ASan")
+
+ find_program(ASan_WRAPPER "asan-wrapper" PATHS ${CMAKE_MODULE_PATH})
+ mark_as_advanced(ASan_WRAPPER)
+endif ()
+
+function (add_sanitize_address TARGET)
+ if (NOT SANITIZE_ADDRESS)
+ return()
+ endif ()
+
+ sanitizer_add_flags(${TARGET} "AddressSanitizer" "ASan")
+endfunction ()
diff --git a/cmake/Sanitizers/FindMSan.cmake b/cmake/Sanitizers/FindMSan.cmake
new file mode 100644
index 0000000..22d0050
--- /dev/null
+++ b/cmake/Sanitizers/FindMSan.cmake
@@ -0,0 +1,57 @@
+# The MIT License (MIT)
+#
+# Copyright (c)
+# 2013 Matthew Arsenault
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+option(SANITIZE_MEMORY "Enable MemorySanitizer for sanitized targets." Off)
+
+set(FLAG_CANDIDATES
+ "-g -fsanitize=memory"
+)
+
+
+include(sanitize-helpers)
+
+if (SANITIZE_MEMORY)
+ if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+ message(WARNING "MemorySanitizer disabled for target ${TARGET} because "
+ "MemorySanitizer is supported for Linux systems only.")
+ set(SANITIZE_MEMORY Off CACHE BOOL
+ "Enable MemorySanitizer for sanitized targets." FORCE)
+ elseif (NOT ${CMAKE_SIZEOF_VOID_P} EQUAL 8)
+ message(WARNING "MemorySanitizer disabled for target ${TARGET} because "
+ "MemorySanitizer is supported for 64bit systems only.")
+ set(SANITIZE_MEMORY Off CACHE BOOL
+ "Enable MemorySanitizer for sanitized targets." FORCE)
+ else ()
+ sanitizer_check_compiler_flags("${FLAG_CANDIDATES}" "MemorySanitizer"
+ "MSan")
+ endif ()
+endif ()
+
+function (add_sanitize_memory TARGET)
+ if (NOT SANITIZE_MEMORY)
+ return()
+ endif ()
+
+ sanitizer_add_flags(${TARGET} "MemorySanitizer" "MSan")
+endfunction ()
diff --git a/cmake/Sanitizers/FindSanitizers.cmake b/cmake/Sanitizers/FindSanitizers.cmake
new file mode 100644
index 0000000..101bab8
--- /dev/null
+++ b/cmake/Sanitizers/FindSanitizers.cmake
@@ -0,0 +1,94 @@
+# The MIT License (MIT)
+#
+# Copyright (c)
+# 2013 Matthew Arsenault
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+# If any of the used compiler is a GNU compiler, add a second option to static
+# link against the sanitizers.
+option(SANITIZE_LINK_STATIC "Try to link static against sanitizers." Off)
+
+
+
+
+set(FIND_QUIETLY_FLAG "")
+if (DEFINED Sanitizers_FIND_QUIETLY)
+ set(FIND_QUIETLY_FLAG "QUIET")
+endif ()
+
+find_package(ASan ${FIND_QUIETLY_FLAG})
+find_package(TSan ${FIND_QUIETLY_FLAG})
+find_package(MSan ${FIND_QUIETLY_FLAG})
+find_package(UBSan ${FIND_QUIETLY_FLAG})
+
+
+
+
+function(sanitizer_add_blacklist_file FILE)
+ if(NOT IS_ABSOLUTE ${FILE})
+ set(FILE "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}")
+ endif()
+ get_filename_component(FILE "${FILE}" REALPATH)
+
+ sanitizer_check_compiler_flags("-fsanitize-blacklist=${FILE}"
+ "SanitizerBlacklist" "SanBlist")
+endfunction()
+
+function(add_sanitizers ...)
+ # If no sanitizer is enabled, return immediately.
+ if (NOT (SANITIZE_ADDRESS OR SANITIZE_MEMORY OR SANITIZE_THREAD OR
+ SANITIZE_UNDEFINED))
+ return()
+ endif ()
+
+ foreach (TARGET ${ARGV})
+ # Check if this target will be compiled by exactly one compiler. Other-
+ # wise sanitizers can't be used and a warning should be printed once.
+ get_target_property(TARGET_TYPE ${TARGET} TYPE)
+ if (TARGET_TYPE STREQUAL "INTERFACE_LIBRARY")
+ message(WARNING "Can't use any sanitizers for target ${TARGET}, "
+ "because it is an interface library and cannot be "
+ "compiled directly.")
+ return()
+ endif ()
+ sanitizer_target_compilers(${TARGET} TARGET_COMPILER)
+ list(LENGTH TARGET_COMPILER NUM_COMPILERS)
+ if (NUM_COMPILERS GREATER 1)
+ message(WARNING "Can't use any sanitizers for target ${TARGET}, "
+ "because it will be compiled by incompatible compilers. "
+ "Target will be compiled without sanitizers.")
+ return()
+
+ # If the target is compiled by no or no known compiler, give a warning.
+ elseif (NUM_COMPILERS EQUAL 0)
+ message(WARNING "Sanitizers for target ${TARGET} may not be"
+ " usable, because it uses no or an unknown compiler. "
+ "This is a false warning for targets using only "
+ "object lib(s) as input.")
+ endif ()
+
+ # Add sanitizers for target.
+ add_sanitize_address(${TARGET})
+ add_sanitize_thread(${TARGET})
+ add_sanitize_memory(${TARGET})
+ add_sanitize_undefined(${TARGET})
+ endforeach ()
+endfunction(add_sanitizers)
diff --git a/cmake/Sanitizers/FindTSan.cmake b/cmake/Sanitizers/FindTSan.cmake
new file mode 100644
index 0000000..3cba3c0
--- /dev/null
+++ b/cmake/Sanitizers/FindTSan.cmake
@@ -0,0 +1,65 @@
+# The MIT License (MIT)
+#
+# Copyright (c)
+# 2013 Matthew Arsenault
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+option(SANITIZE_THREAD "Enable ThreadSanitizer for sanitized targets." Off)
+
+set(FLAG_CANDIDATES
+ "-g -fsanitize=thread"
+)
+
+
+# ThreadSanitizer is not compatible with MemorySanitizer.
+if (SANITIZE_THREAD AND SANITIZE_MEMORY)
+ message(FATAL_ERROR "ThreadSanitizer is not compatible with "
+ "MemorySanitizer.")
+endif ()
+
+
+include(sanitize-helpers)
+
+if (SANITIZE_THREAD)
+ if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND
+ NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
+ message(WARNING "ThreadSanitizer disabled for target ${TARGET} because "
+ "ThreadSanitizer is supported for Linux systems and macOS only.")
+ set(SANITIZE_THREAD Off CACHE BOOL
+ "Enable ThreadSanitizer for sanitized targets." FORCE)
+ elseif (NOT ${CMAKE_SIZEOF_VOID_P} EQUAL 8)
+ message(WARNING "ThreadSanitizer disabled for target ${TARGET} because "
+ "ThreadSanitizer is supported for 64bit systems only.")
+ set(SANITIZE_THREAD Off CACHE BOOL
+ "Enable ThreadSanitizer for sanitized targets." FORCE)
+ else ()
+ sanitizer_check_compiler_flags("${FLAG_CANDIDATES}" "ThreadSanitizer"
+ "TSan")
+ endif ()
+endif ()
+
+function (add_sanitize_thread TARGET)
+ if (NOT SANITIZE_THREAD)
+ return()
+ endif ()
+
+ sanitizer_add_flags(${TARGET} "ThreadSanitizer" "TSan")
+endfunction ()
diff --git a/cmake/Sanitizers/FindUBSan.cmake b/cmake/Sanitizers/FindUBSan.cmake
new file mode 100644
index 0000000..ae103f7
--- /dev/null
+++ b/cmake/Sanitizers/FindUBSan.cmake
@@ -0,0 +1,46 @@
+# The MIT License (MIT)
+#
+# Copyright (c)
+# 2013 Matthew Arsenault
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+option(SANITIZE_UNDEFINED
+ "Enable UndefinedBehaviorSanitizer for sanitized targets." Off)
+
+set(FLAG_CANDIDATES
+ "-g -fsanitize=undefined"
+)
+
+
+include(sanitize-helpers)
+
+if (SANITIZE_UNDEFINED)
+ sanitizer_check_compiler_flags("${FLAG_CANDIDATES}"
+ "UndefinedBehaviorSanitizer" "UBSan")
+endif ()
+
+function (add_sanitize_undefined TARGET)
+ if (NOT SANITIZE_UNDEFINED)
+ return()
+ endif ()
+
+ sanitizer_add_flags(${TARGET} "UndefinedBehaviorSanitizer" "UBSan")
+endfunction ()
diff --git a/cmake/Sanitizers/asan-wrapper b/cmake/Sanitizers/asan-wrapper
new file mode 100644
index 0000000..5d54103
--- /dev/null
+++ b/cmake/Sanitizers/asan-wrapper
@@ -0,0 +1,55 @@
+#!/bin/sh
+
+# The MIT License (MIT)
+#
+# Copyright (c)
+# 2013 Matthew Arsenault
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+# This script is a wrapper for AddressSanitizer. In some special cases you need
+# to preload AddressSanitizer to avoid error messages - e.g. if you're
+# preloading another library to your application. At the moment this script will
+# only do something, if we're running on a Linux platform. OSX might not be
+# affected.
+
+
+# Exit immediately, if platform is not Linux.
+if [ "$(uname)" != "Linux" ]
+then
+ exec $@
+fi
+
+
+# Get the used libasan of the application ($1). If a libasan was found, it will
+# be prepended to LD_PRELOAD.
+libasan=$(ldd $1 | grep libasan | sed "s/^[[:space:]]//" | cut -d' ' -f1)
+if [ -n "$libasan" ]
+then
+ if [ -n "$LD_PRELOAD" ]
+ then
+ export LD_PRELOAD="$libasan:$LD_PRELOAD"
+ else
+ export LD_PRELOAD="$libasan"
+ fi
+fi
+
+# Execute the application.
+exec $@
diff --git a/cmake/Sanitizers/sanitize-helpers.cmake b/cmake/Sanitizers/sanitize-helpers.cmake
new file mode 100644
index 0000000..dd4b898
--- /dev/null
+++ b/cmake/Sanitizers/sanitize-helpers.cmake
@@ -0,0 +1,177 @@
+# The MIT License (MIT)
+#
+# Copyright (c)
+# 2013 Matthew Arsenault
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+# Helper function to get the language of a source file.
+function (sanitizer_lang_of_source FILE RETURN_VAR)
+ get_filename_component(LONGEST_EXT "${FILE}" EXT)
+ # If extension is empty return. This can happen for extensionless headers
+ if("${LONGEST_EXT}" STREQUAL "")
+ set(${RETURN_VAR} "" PARENT_SCOPE)
+ return()
+ endif()
+ # Get shortest extension as some files can have dot in their names
+ string(REGEX REPLACE "^.*(\\.[^.]+)$" "\\1" FILE_EXT ${LONGEST_EXT})
+ string(TOLOWER "${FILE_EXT}" FILE_EXT)
+ string(SUBSTRING "${FILE_EXT}" 1 -1 FILE_EXT)
+
+ get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
+ foreach (LANG ${ENABLED_LANGUAGES})
+ list(FIND CMAKE_${LANG}_SOURCE_FILE_EXTENSIONS "${FILE_EXT}" TEMP)
+ if (NOT ${TEMP} EQUAL -1)
+ set(${RETURN_VAR} "${LANG}" PARENT_SCOPE)
+ return()
+ endif ()
+ endforeach()
+
+ set(${RETURN_VAR} "" PARENT_SCOPE)
+endfunction ()
+
+
+# Helper function to get compilers used by a target.
+function (sanitizer_target_compilers TARGET RETURN_VAR)
+ # Check if all sources for target use the same compiler. If a target uses
+ # e.g. C and Fortran mixed and uses different compilers (e.g. clang and
+ # gfortran) this can trigger huge problems, because different compilers may
+ # use different implementations for sanitizers.
+ set(BUFFER "")
+ get_target_property(TSOURCES ${TARGET} SOURCES)
+ foreach (FILE ${TSOURCES})
+ # If expression was found, FILE is a generator-expression for an object
+ # library. Object libraries will be ignored.
+ string(REGEX MATCH "TARGET_OBJECTS:([^ >]+)" _file ${FILE})
+ if ("${_file}" STREQUAL "")
+ sanitizer_lang_of_source(${FILE} LANG)
+ if (LANG)
+ list(APPEND BUFFER ${CMAKE_${LANG}_COMPILER_ID})
+ endif ()
+ endif ()
+ endforeach ()
+
+ list(REMOVE_DUPLICATES BUFFER)
+ set(${RETURN_VAR} "${BUFFER}" PARENT_SCOPE)
+endfunction ()
+
+
+# Helper function to check compiler flags for language compiler.
+function (sanitizer_check_compiler_flag FLAG LANG VARIABLE)
+ if (${LANG} STREQUAL "C")
+ include(CheckCCompilerFlag)
+ check_c_compiler_flag("${FLAG}" ${VARIABLE})
+
+ elseif (${LANG} STREQUAL "CXX")
+ include(CheckCXXCompilerFlag)
+ check_cxx_compiler_flag("${FLAG}" ${VARIABLE})
+
+ elseif (${LANG} STREQUAL "Fortran")
+ # CheckFortranCompilerFlag was introduced in CMake 3.x. To be compatible
+ # with older Cmake versions, we will check if this module is present
+ # before we use it. Otherwise we will define Fortran coverage support as
+ # not available.
+ include(CheckFortranCompilerFlag OPTIONAL RESULT_VARIABLE INCLUDED)
+ if (INCLUDED)
+ check_fortran_compiler_flag("${FLAG}" ${VARIABLE})
+ elseif (NOT CMAKE_REQUIRED_QUIET)
+ message(STATUS "Performing Test ${VARIABLE}")
+ message(STATUS "Performing Test ${VARIABLE}"
+ " - Failed (Check not supported)")
+ endif ()
+ endif()
+endfunction ()
+
+
+# Helper function to test compiler flags.
+function (sanitizer_check_compiler_flags FLAG_CANDIDATES NAME PREFIX)
+ set(CMAKE_REQUIRED_QUIET ${${PREFIX}_FIND_QUIETLY})
+
+ get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
+ foreach (LANG ${ENABLED_LANGUAGES})
+ # Sanitizer flags are not dependent on language, but the used compiler.
+ # So instead of searching flags foreach language, search flags foreach
+ # compiler used.
+ set(COMPILER ${CMAKE_${LANG}_COMPILER_ID})
+ if (NOT DEFINED ${PREFIX}_${COMPILER}_FLAGS)
+ foreach (FLAG ${FLAG_CANDIDATES})
+ if(NOT CMAKE_REQUIRED_QUIET)
+ message(STATUS "Try ${COMPILER} ${NAME} flag = [${FLAG}]")
+ endif()
+
+ set(CMAKE_REQUIRED_FLAGS "${FLAG}")
+ unset(${PREFIX}_FLAG_DETECTED CACHE)
+ sanitizer_check_compiler_flag("${FLAG}" ${LANG}
+ ${PREFIX}_FLAG_DETECTED)
+
+ if (${PREFIX}_FLAG_DETECTED)
+ # If compiler is a GNU compiler, search for static flag, if
+ # SANITIZE_LINK_STATIC is enabled.
+ if (SANITIZE_LINK_STATIC AND (${COMPILER} STREQUAL "GNU"))
+ string(TOLOWER ${PREFIX} PREFIX_lower)
+ sanitizer_check_compiler_flag(
+ "-static-lib${PREFIX_lower}" ${LANG}
+ ${PREFIX}_STATIC_FLAG_DETECTED)
+
+ if (${PREFIX}_STATIC_FLAG_DETECTED)
+ set(FLAG "-static-lib${PREFIX_lower} ${FLAG}")
+ endif ()
+ endif ()
+
+ set(${PREFIX}_${COMPILER}_FLAGS "${FLAG}" CACHE STRING
+ "${NAME} flags for ${COMPILER} compiler.")
+ mark_as_advanced(${PREFIX}_${COMPILER}_FLAGS)
+ break()
+ endif ()
+ endforeach ()
+
+ if (NOT ${PREFIX}_FLAG_DETECTED)
+ set(${PREFIX}_${COMPILER}_FLAGS "" CACHE STRING
+ "${NAME} flags for ${COMPILER} compiler.")
+ mark_as_advanced(${PREFIX}_${COMPILER}_FLAGS)
+
+ message(WARNING "${NAME} is not available for ${COMPILER} "
+ "compiler. Targets using this compiler will be "
+ "compiled without ${NAME}.")
+ endif ()
+ endif ()
+ endforeach ()
+endfunction ()
+
+
+# Helper to assign sanitizer flags for TARGET.
+function (sanitizer_add_flags TARGET NAME PREFIX)
+ # Get list of compilers used by target and check, if sanitizer is available
+ # for this target. Other compiler checks like check for conflicting
+ # compilers will be done in add_sanitizers function.
+ sanitizer_target_compilers(${TARGET} TARGET_COMPILER)
+ list(LENGTH TARGET_COMPILER NUM_COMPILERS)
+ if ("${${PREFIX}_${TARGET_COMPILER}_FLAGS}" STREQUAL "")
+ return()
+ endif()
+
+ # Set compile- and link-flags for target.
+ set_property(TARGET ${TARGET} APPEND_STRING
+ PROPERTY COMPILE_FLAGS " ${${PREFIX}_${TARGET_COMPILER}_FLAGS}")
+ set_property(TARGET ${TARGET} APPEND_STRING
+ PROPERTY COMPILE_FLAGS " ${SanBlist_${TARGET_COMPILER}_FLAGS}")
+ set_property(TARGET ${TARGET} APPEND_STRING
+ PROPERTY LINK_FLAGS " ${${PREFIX}_${TARGET_COMPILER}_FLAGS}")
+endfunction ()
diff --git a/cmake/SearchReplace.cmake b/cmake/SearchReplace.cmake
new file mode 100644
index 0000000..116cd71
--- /dev/null
+++ b/cmake/SearchReplace.cmake
@@ -0,0 +1,4 @@
+message("Replacing ${search} by ${replace} in file ${src} and writing to ${dst}...")
+file(READ ${src} file_contents)
+string(REPLACE "${search}" "${replace}" file_contents ${file_contents})
+file(WRITE ${dst} ${file_contents})
diff --git a/cmake/doxygen_version.cmake b/cmake/doxygen_version.cmake
index 2433889..0797cac 100644
--- a/cmake/doxygen_version.cmake
+++ b/cmake/doxygen_version.cmake
@@ -40,7 +40,7 @@ endmacro()
CHECK_REQUIRED_VARIABLE(PRE_CONFIGURE_DOXYGEN_VERSION_FILE)
CHECK_REQUIRED_VARIABLE(POST_CONFIGURE_DOXYGEN_VERSION_FILE)
-CHECK_OPTIONAL_VARIABLE(DOXY_STATE_FILE "${CMAKE_SOURCE_DIR}/VERSION")
+CHECK_OPTIONAL_VARIABLE(DOXY_STATE_FILE "${PROJECT_SOURCE_DIR}/VERSION")
# Function: DoxygenStateChangedAction
# Description: this function is executed when the
diff --git a/cmake/git_watcher.cmake b/cmake/git_watcher.cmake
index 72b7852..da1a68f 100644
--- a/cmake/git_watcher.cmake
+++ b/cmake/git_watcher.cmake
@@ -64,7 +64,7 @@ CHECK_REQUIRED_VARIABLE(PRE_CONFIGURE_GIT_VERSION_FILE)
CHECK_REQUIRED_VARIABLE(POST_CONFIGURE_GIT_VERSION_FILE)
CHECK_OPTIONAL_VARIABLE(GIT_STATE_FILE "${GENERATED_SRC}/git_state")
#CHECK_REQUIRED_VARIABLE(GIT_STATE_FILE)
-CHECK_OPTIONAL_VARIABLE(GIT_WORKING_DIR "${CMAKE_SOURCE_DIR}")
+CHECK_OPTIONAL_VARIABLE(GIT_WORKING_DIR "${PROJECT_SOURCE_DIR}")
# Check the optional git variable.
# If it's not set, we'll try to find it using the CMake packaging system.
@@ -150,6 +150,19 @@ function(CheckGit _working_dir _state_changed _state)
# (Passing by reference in CMake is awkward...)
set(${_state} ${state} PARENT_SCOPE)
+ if(EXISTS "${POST_CONFIGURE_GIT_VERSION_FILE}")
+ if("${PRE_CONFIGURE_GIT_VERSION_FILE}" IS_NEWER_THAN "${POST_CONFIGURE_GIT_VERSION_FILE}")
+ file(REMOVE "${POST_CONFIGURE_GIT_VERSION_FILE}")
+ file(REMOVE "${GIT_STATE_FILE}")
+ set(${_state_changed} "true" PARENT_SCOPE)
+ return()
+ endif()
+ else()
+ file(REMOVE "${GIT_STATE_FILE}")
+ set(${_state_changed} "true" PARENT_SCOPE)
+ return()
+ endif()
+
# Check if the state has changed compared to the backup on disk.
if(EXISTS "${GIT_STATE_FILE}")
file(READ "${GIT_STATE_FILE}" OLD_HEAD_CONTENTS)
diff --git a/cmake/packaging.cmake b/cmake/packaging.cmake
index 0798b83..8915039 100644
--- a/cmake/packaging.cmake
+++ b/cmake/packaging.cmake
@@ -18,7 +18,7 @@ set(CPACK_PACKAGE_VENDOR "Dimitri van Heesch")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Generate documentation from C, C++, Java, Python and other languages")
set(CPACK_PACKAGE_DESCRIPTION "Doxygen is the de facto standard tool for generating documentation from annotated C++ sources.
But many other popular programming languages are supported:
- C, Objective-C, C#, PHP, Java, Python, Fortran, VHDL, Tcl, D (some extent) and IDL (Corba, Microsoft, and UNO/OpenOffice flavors).
+ C, Objective-C, C#, PHP, Java, Python, Fortran, VHDL, D (some extent) and IDL (Corba, Microsoft, and UNO/OpenOffice flavors).
.
Three usages:
.
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index 032c16a..f2d177e 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -32,7 +32,7 @@ set(DOC_INSTALL_DIR "share/doc/packages/doxygen" CACHE STRING "Relative path whe
set(DOC_FILES
arch.doc
archoverview.eps
- archoverview.gif
+ archoverview.svg
autolink.doc
changelog.doc
commands.doc
@@ -44,14 +44,27 @@ set(DOC_FILES
doxygen_manual.css
doxygen_usage.doc
doxywizard_expert.png
- doxywizard.gif
doxywizard_main.png
- doxywizard_menu.png
+ doxywizard_menu_file.png
+ doxywizard_menu_settings.png
+ doxywizard_menu_help.png
doxywizard_page1.png
doxywizard_page2.png
doxywizard_page3.png
doxywizard_page4.png
+ doxywizard_run.png
doxywizard_usage.doc
+ expert_bool.png
+ expert_enum.png
+ expert_int.png
+ expert_list_dir.png
+ expert_list_file.png
+ expert_list_filedir.png
+ expert_list_string.png
+ expert_string_dir.png
+ expert_string_file.png
+ expert_string_image.png
+ expert_string_string.png
external.doc
extsearch.doc
extsearch_flow.dot
@@ -85,8 +98,15 @@ set(DOC_FILES
maintainers.txt
translator.py
smile.png
- doxygen_logo.gif
- doxygen_logo_low.gif
+ doxygen_logo.svg
+)
+
+set(DOC_FILES_IMAGES
+ add.png
+ del.png
+ file.png
+ folder.png
+ refresh.png
)
if (build_doc_chm)
@@ -94,46 +114,57 @@ if (build_doc_chm)
Doxyfile_chm
)
endif ()
-file(GLOB LANG_FILES "${TOP}/src/translator_??.h")
+
+if (${CMAKE_VERSION} VERSION_EQUAL "3.11.0" OR ${CMAKE_VERSION} VERSION_GREATER "3.11.0")
+ file(GLOB LANG_FILES CONFIGURE_DEPENDS "${TOP}/src//translator_??.h")
+else()
+ file(GLOB LANG_FILES "${TOP}/src//translator_??.h")
+endif()
+
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/man
${PROJECT_BINARY_DIR}/src
- ${PROJECT_BINARY_DIR}/doc)
-
-file(COPY ${TOP}/VERSION DESTINATION ${PROJECT_BINARY_DIR}/)
-file(COPY ${TOP}/src/translator.h DESTINATION ${PROJECT_BINARY_DIR}/src/)
-file(COPY ${TOP}/src/translator_adapter.h DESTINATION ${PROJECT_BINARY_DIR}/src/)
-file(COPY ${LANG_FILES} DESTINATION ${PROJECT_BINARY_DIR}/src/)
+ ${PROJECT_BINARY_DIR}/doc
+ ${PROJECT_BINARY_DIR}/doc/images)
foreach (f ${DOC_FILES})
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/doc/${f}
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/doc/${f} ${PROJECT_BINARY_DIR}/doc/
- DEPENDS ${CMAKE_SOURCE_DIR}/doc/${f}
+ COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/doc/${f} ${PROJECT_BINARY_DIR}/doc/
+ DEPENDS ${PROJECT_SOURCE_DIR}/doc/${f}
)
set_source_files_properties(${PROJECT_BINARY_DIR}/doc/${f} PROPERTIES GENERATED 1)
list(APPEND OUT_DOC_FILES "${PROJECT_BINARY_DIR}/doc/${f}")
endforeach()
+foreach (f ${DOC_FILES_IMAGES})
+add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/doc/images/${f}
+ COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/addon/doxywizard/images/${f} ${PROJECT_BINARY_DIR}/doc/images/
+ DEPENDS ${PROJECT_SOURCE_DIR}/addon/doxywizard/images/${f}
+ )
+set_source_files_properties(${PROJECT_BINARY_DIR}/doc/images/${f} PROPERTIES GENERATED 1)
+list(APPEND OUT_DOC_FILES "${PROJECT_BINARY_DIR}/doc/images/${f}")
+endforeach()
+
foreach (f ${DOC_FILES_CHM})
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/doc/${f}
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/doc/${f} ${PROJECT_BINARY_DIR}/doc/
- DEPENDS ${CMAKE_SOURCE_DIR}/doc/${f}
+ COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/doc/${f} ${PROJECT_BINARY_DIR}/doc/
+ DEPENDS ${PROJECT_SOURCE_DIR}/doc/${f}
)
set_source_files_properties(${PROJECT_BINARY_DIR}/doc/${f} PROPERTIES GENERATED 1)
list(APPEND OUT_DOC_CHM_FILES "${PROJECT_BINARY_DIR}/doc/${f}")
endforeach()
-configure_file(${CMAKE_SOURCE_DIR}/doc/manual.sty ${PROJECT_BINARY_DIR}/doc/manual.sty)
-configure_file(${CMAKE_SOURCE_DIR}/doc/doxygen_manual.tex ${PROJECT_BINARY_DIR}/doc/doxygen_manual.tex)
-configure_file(${CMAKE_SOURCE_DIR}/doc/doxygen.1 ${PROJECT_BINARY_DIR}/man/doxygen.1)
-configure_file(${CMAKE_SOURCE_DIR}/doc/doxywizard.1 ${PROJECT_BINARY_DIR}/man/doxywizard.1)
-configure_file(${CMAKE_SOURCE_DIR}/doc/doxysearch.1 ${PROJECT_BINARY_DIR}/man/doxysearch.1)
-configure_file(${CMAKE_SOURCE_DIR}/doc/doxyindexer.1 ${PROJECT_BINARY_DIR}/man/doxyindexer.1)
+configure_file(${PROJECT_SOURCE_DIR}/doc/manual.sty ${PROJECT_BINARY_DIR}/doc/manual.sty)
+configure_file(${PROJECT_SOURCE_DIR}/doc/doxygen_manual.tex ${PROJECT_BINARY_DIR}/doc/doxygen_manual.tex)
+configure_file(${PROJECT_SOURCE_DIR}/doc/doxygen.1 ${PROJECT_BINARY_DIR}/man/doxygen.1)
+configure_file(${PROJECT_SOURCE_DIR}/doc/doxywizard.1 ${PROJECT_BINARY_DIR}/man/doxywizard.1)
+configure_file(${PROJECT_SOURCE_DIR}/doc/doxysearch.1 ${PROJECT_BINARY_DIR}/man/doxysearch.1)
+configure_file(${PROJECT_SOURCE_DIR}/doc/doxyindexer.1 ${PROJECT_BINARY_DIR}/man/doxyindexer.1)
# doc/language.doc (see tag Doxyfile:INPUT)
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} translator.py ${CMAKE_SOURCE_DIR}
- DEPENDS ${PROJECT_BINARY_DIR}/doc/maintainers.txt ${PROJECT_BINARY_DIR}/doc/language.tpl ${PROJECT_BINARY_DIR}/doc/translator.py
+ COMMAND ${PYTHON_EXECUTABLE} translator.py ${PROJECT_SOURCE_DIR}
+ DEPENDS ${PROJECT_SOURCE_DIR}/doc/maintainers.txt ${PROJECT_SOURCE_DIR}/doc/language.tpl ${PROJECT_BINARY_DIR}/doc/translator.py ${LANG_FILES}
OUTPUT language.doc
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/doc
)
@@ -163,7 +194,7 @@ add_custom_target(doxygen_pdf
COMMAND ${CMAKE_COMMAND} -E remove refman.tex
COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc/doxygen_manual.tex .
COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc/manual.sty .
- COMMAND ${EPSTOPDF} ${CMAKE_SOURCE_DIR}/doc/doxygen_logo.eps --outfile=doxygen_logo.pdf
+ COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/doc/doxygen_logo.pdf .
COMMAND ${PDFLATEX} -shell-escape doxygen_manual.tex
COMMAND ${MAKEINDEX} doxygen_manual.idx
COMMAND ${PDFLATEX} -shell-escape doxygen_manual.tex
@@ -212,12 +243,22 @@ install(FILES
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
)
+install(CODE "if(NOT EXISTS \"${PROJECT_BINARY_DIR}/latex/doxygen_manual.pdf\")
+ message(FATAL_ERROR \"\nTerminating:\n documentation has not been generated, \n create documentation by using the 'docs' target followed by an 'install'\n\")
+endif()"
+)
+
install(FILES
"${PROJECT_BINARY_DIR}/latex/doxygen_manual.pdf"
DESTINATION "${CMAKE_INSTALL_PREFIX}/${DOC_INSTALL_DIR}"
)
if (build_doc_chm)
+install(CODE "if(NOT EXISTS \"${PROJECT_BINARY_DIR}/chm/doxygen_manual.chm\")
+ message(FATAL_ERROR \"\nTerminating:\n CHM documentation has not been generated, \n create CHM documentation by using the 'docs_chm' target followed by an 'install'\n\")
+endif()"
+)
+
install(FILES
"${PROJECT_BINARY_DIR}/chm/doxygen_manual.chm"
DESTINATION "${CMAKE_INSTALL_PREFIX}/${DOC_INSTALL_DIR}"
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 2ff093f..caf6229 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -32,7 +32,7 @@ HTML_COLORSTYLE_SAT = 0
ENABLED_SECTIONS = logo_on
ENABLE_PREPROCESSING = NO
CASE_SENSE_NAMES = NO
-IMAGE_PATH = .
+IMAGE_PATH = . images
INPUT = index.doc install.doc starting.doc docblocks.doc markdown.doc \
lists.doc grouping.doc formulas.doc tables.doc diagrams.doc preprocessing.doc \
autolink.doc output.doc searching.doc extsearch.doc customize.doc custcmd.doc \
@@ -50,10 +50,11 @@ PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
STRIP_CODE_COMMENTS = NO
HTML_STYLESHEET = doxygen_manual.css
-HTML_EXTRA_FILES = doxygen_logo.gif
-HTML_EXTRA_FILES += doxygen_logo_low.gif
+HTML_EXTRA_FILES = doxygen_logo.svg
ALIASES = LaTeX="\f$\mbox{\LaTeX}\f$"
ALIASES += TeX="\f$\mbox{\TeX}\f$"
+ALIASES += forceNewPage="\latexonly \newpage \endlatexonly"
LATEX_BATCHMODE = YES
LATEX_EXTRA_STYLESHEET = manual.sty
LATEX_EMOJI_DIRECTORY = ../doc
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/doc/arch.doc b/doc/arch.doc
index bd51a1b..eb39d70 100644
--- a/doc/arch.doc
+++ b/doc/arch.doc
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -22,7 +22,7 @@
The following picture shows how source files are processed by doxygen.
-\image html archoverview.gif "Data flow overview"
+\image html archoverview.svg "Data flow overview"
\image latex archoverview.eps "Data flow overview" width=14cm
The following sections explain the steps above in more detail.
@@ -30,20 +30,20 @@ The following sections explain the steps above in more detail.
<h3>Config parser</h3>
The configuration file that controls the settings of a project is parsed
-and the settings are stored in the singleton class \c Config
-in <code>src/config.h</code>. The parser itself is written using \c flex
-and can be found in <code>src/config.l</code>. This parser is also used
+and the settings are stored in the singleton class \c Config
+in <code>src/config.h</code>. The parser itself is written using \c flex
+and can be found in <code>src/config.l</code>. This parser is also used
directly by \c doxywizard, so it is put in a separate library.
-Each configuration option has one of 5 possible types: \c String,
+Each configuration option has one of 5 possible types: \c String,
\c List, \c Enum, \c Int, or \c Bool. The values of these options are
available through the global functions \c Config_getXXX(), where \c XXX is the
type of the option. The argument of these function is a string naming
-the option as it appears in the configuration file. For instance:
+the option as it appears in the configuration file. For instance:
\c Config_getBool("GENERATE_TESTLIST") returns a reference to a boolean
-value that is \c TRUE if the test list was enabled in the configuration file.
+value that is \c TRUE if the test list was enabled in the configuration file.
-The function \c readConfiguration() in \c src/doxygen.cpp
+The function \c readConfiguration() in \c src/doxygen.cpp
reads the command line options and then calls the configuration parser.
<h3>C Preprocessor</h3>
@@ -54,29 +54,29 @@ C Preprocessor (after being piped through a user defined filter if available).
The way the preprocessor works differs somewhat from a standard C Preprocessor.
By default it does not do macro expansion, although it can be configured to
expand all macros. Typical usage is to only expand a user specified set
-of macros. This is to allow macro names to appear in the type of
+of macros. This is to allow macro names to appear in the type of
function parameters for instance.
-Another difference is that the preprocessor parses, but not actually includes
+Another difference is that the preprocessor parses, but not actually includes
code when it encounters a \c \#include (with the exception of \c \#include
-found inside { ... } blocks). The reasons behind this deviation from
-the standard is to prevent feeding multiple definitions of the
-same functions/classes to doxygen's parser. If all source files would
-include a common header file for instance, the class and type
-definitions (and their documentation) would be present in each
-translation unit.
+found inside { ... } blocks). The reasons behind this deviation from
+the standard is to prevent feeding multiple definitions of the
+same functions/classes to doxygen's parser. If all source files would
+include a common header file for instance, the class and type
+definitions (and their documentation) would be present in each
+translation unit.
The preprocessor is written using \c flex and can be found in
-\c src/pre.l. For condition blocks (\c \#if) evaluation of constant expressions
-is needed. For this a \c yacc based parser is used, which can be found
+\c src/pre.l. For condition blocks (\c \#if) evaluation of constant expressions
+is needed. For this a \c yacc based parser is used, which can be found
in \c src/constexp.y and \c src/constexp.l.
-The preprocessor is invoked for each file using the \c preprocessFile()
-function declared in \c src/pre.h, and will append the preprocessed result
+The preprocessor is invoked for each file using the \c preprocessFile()
+function declared in \c src/pre.h, and will append the preprocessed result
to a character buffer. The format of the character buffer is
\verbatim
-0x06 file name 1
+0x06 file name 1
0x06 preprocessed contents of file 1
...
0x06 file name n
@@ -85,17 +85,17 @@ to a character buffer. The format of the character buffer is
<h3>Language parser</h3>
-The preprocessed input buffer is fed to the language parser, which is
-implemented as a big state machine using \c flex. It can be found
-in the file \c src/scanner.l. There is one parser for all
-languages (C/C++/Java/IDL). The state variables \c insideIDL
-and \c insideJava are uses at some places for language specific choices.
+The preprocessed input buffer is fed to the language parser, which is
+implemented as a big state machine using \c flex. It can be found
+in the file \c src/scanner.l. There is one parser for all
+languages (C/C++/Java/IDL). The state variables \c insideIDL
+and \c insideJava are uses at some places for language specific choices.
-The task of the parser is to convert the input buffer into a tree of entries
-(basically an abstract syntax tree). An entry is defined in \c src/entry.h
-and is a blob of loosely structured information. The most important field
+The task of the parser is to convert the input buffer into a tree of entries
+(basically an abstract syntax tree). An entry is defined in \c src/entry.h
+and is a blob of loosely structured information. The most important field
is \c section which specifies the kind of information contained in the entry.
-
+
Possible improvements for future versions:
- Use one scanner/parser per language instead of one big scanner.
- Move the first pass parsing of documentation blocks to a separate module.
@@ -104,8 +104,8 @@ Possible improvements for future versions:
<h3>Data organizer</h3>
-This step consists of many smaller steps, that build
-dictionaries of the extracted classes, files, namespaces,
+This step consists of many smaller steps, that build
+dictionaries of the extracted classes, files, namespaces,
variables, functions, packages, pages, and groups. Besides building
dictionaries, during this step relations (such as inheritance relations),
between the extracted entities are computed.
@@ -117,15 +117,15 @@ on the tree of entries, built during language parsing. Look at the
The result of this step is a number of dictionaries, which can be
found in the doxygen "namespace" defined in \c src/doxygen.h. Most
elements of these dictionaries are derived from the class \c Definition;
-The class \c MemberDef, for instance, holds all information for a member.
-An instance of such a class can be part of a file ( class \c FileDef ),
-a class ( class \c ClassDef ), a namespace ( class \c NamespaceDef ),
+The class \c MemberDef, for instance, holds all information for a member.
+An instance of such a class can be part of a file ( class \c FileDef ),
+a class ( class \c ClassDef ), a namespace ( class \c NamespaceDef ),
a group ( class \c GroupDef ), or a Java package ( class \c PackageDef ).
<h3>Tag file parser</h3>
If tag files are specified in the configuration file, these are parsed
-by a SAX based XML parser, which can be found in \c src/tagreader.cpp.
+by a SAX based XML parser, which can be found in \c src/tagreader.cpp.
The result of parsing a tag file is the insertion of \c Entry objects in the
entry tree. The field \c Entry::tagInfo is used to mark the entry as
external, and holds information about the tag file.
@@ -136,7 +136,7 @@ Special comment blocks are stored as strings in the entities that they
document. There is a string for the brief description and a string
for the detailed description. The documentation parser reads these
strings and executes the commands it finds in it (this is the second pass
-in parsing the documentation). It writes the result directly to the output
+in parsing the documentation). It writes the result directly to the output
generators.
The parser is written in C++ and can be found in \c src/docparser.cpp. The
@@ -144,7 +144,7 @@ tokens that are eaten by the parser come from \c src/doctokenizer.l.
Code fragments found in the comment blocks are passed on to the source parser.
The main entry point for the documentation parser is \c validatingParseDoc()
-declared in \c src/docparser.h. For simple texts with special
+declared in \c src/docparser.h. For simple texts with special
commands \c validatingParseText() is used.
<h3>Source parser</h3>
@@ -156,13 +156,13 @@ The code parser tries to cross-reference to source code it parses with
documented entities. It also does syntax highlighting of the sources. The
output is directly written to the output generators.
-The main entry point for the code parser is \c parseCode()
+The main entry point for the code parser is \c parseCode()
declared in \c src/code.h.
<h3>Output generators</h3>
-After data is gathered and cross-referenced, doxygen generates
-output in various formats. For this it uses the methods provided by
+After data is gathered and cross-referenced, doxygen generates
+output in various formats. For this it uses the methods provided by
the abstract class \c OutputGenerator. In order to generate output
for multiple formats at once, the methods of \c OutputList are called
instead. This class maintains a list of concrete output generators,
@@ -171,15 +171,15 @@ where each method called is delegated to all generators in the list.
To allow small deviations in what is written to the output for each
concrete output generator, it is possible to temporarily disable certain
generators. The OutputList class contains various \c disable() and \c enable()
-methods for this. The methods \c OutputList::pushGeneratorState() and
+methods for this. The methods \c OutputList::pushGeneratorState() and
\c OutputList::popGeneratorState() are used to temporarily save the
-set of enabled/disabled output generators on a stack.
+set of enabled/disabled output generators on a stack.
The XML is generated directly from the gathered data structures. In the
future XML will be used as an intermediate language (IL). The output
generators will then use this IL as a starting point to generate the
specific output formats. The advantage of having an IL is that various
-independently developed tools written in various languages,
+independently developed tools written in various languages,
could extract information from the XML output. Possible tools could be:
- an interactive source browser
- a class diagram generator
@@ -188,18 +188,18 @@ could extract information from the XML output. Possible tools could be:
<h3>Debugging</h3>
Since doxygen uses a lot of \c flex code it is important to understand
-how \c flex works (for this one should read the \c man page)
-and to understand what it is doing when \c flex is parsing some input.
+how \c flex works (for this one should read the \c man page)
+and to understand what it is doing when \c flex is parsing some input.
Fortunately, when \c flex is used with the `-d` option it outputs what rules
-matched. This makes it quite easy to follow what is going on for a
-particular input fragment.
+matched. This makes it quite easy to follow what is going on for a
+particular input fragment.
To make it easier to toggle debug information for a given \c flex file I
wrote the following \c perl script, which automatically adds or removes `-d`
from the correct line in the \c Makefile:
\verbatim
-#!/usr/bin/perl
+#!/usr/bin/perl
$file = shift @ARGV;
print "Toggle debugging mode for $file\n";
@@ -209,12 +209,12 @@ if (!-e "../src/${file}.l")
exit 1;
}
system("touch ../src/${file}.l");
-unless (rename "src/CMakeFiles/_doxygen.dir/build.make","src/CMakeFiles/_doxygen.dir/build.make.old") {
- print STDERR "Error: cannot rename src/CMakeFiles/_doxygen.dir/build.make!\n";
+unless (rename "src/CMakeFiles/doxymain.dir/build.make","src/CMakeFiles/doxymain.dir/build.make.old") {
+ print STDERR "Error: cannot rename src/CMakeFiles/doxymain.dir/build.make!\n";
exit 1;
}
-if (open(F,"<src/CMakeFiles/_doxygen.dir/build.make.old")) {
- unless (open(G,">src/CMakeFiles/_doxygen.dir/build.make")) {
+if (open(F,"<src/CMakeFiles/doxymain.dir/build.make.old")) {
+ unless (open(G,">src/CMakeFiles/doxymain.dir/build.make")) {
print STDERR "Error: opening file build.make for writing\n";
exit 1;
}
@@ -229,10 +229,10 @@ if (open(F,"<src/CMakeFiles/_doxygen.dir/build.make.old")) {
print G "$_";
}
close F;
- unlink "src/CMakeFiles/_doxygen.dir/build.make.old";
+ unlink "src/CMakeFiles/doxymain.dir/build.make.old";
}
else {
- print STDERR "Warning file src/CMakeFiles/_doxygen.dir/build.make does not exist!\n";
+ print STDERR "Warning file src/CMakeFiles/doxymain.dir/build.make does not exist!\n";
}
# touch the file
@@ -242,7 +242,7 @@ utime $now, $now, $file;
Another way to get rules matching / debugging information
from the \c flex code is setting \c LEX_FLAGS with \c make (`make LEX_FLAGS=-d`).
-Note that by running doxygen with `-d lex` you get information about which
+Note that by running doxygen with `-d lex` you get information about which
`flex codefile` is used.
<h3>Testing</h3>
@@ -258,7 +258,7 @@ Studio projects), e.g. `setenv TEST_FLAGS "--id 5 --id 7"` and `make tests`.
<h3>Doxyfile differences</h3>
-In case one has to communicate through e.g. a forum the configuration settings that
+In case one has to communicate through e.g. a forum the configuration settings that
are different from the standard doxygen configuration file settings one can run the
doxygen command: with the `-x` option and the name of the configuration file (default
is `Doxyfile`). The output will be a list of the not default settings (in `Doxyfile`
diff --git a/doc/archoverview.gif b/doc/archoverview.gif
deleted file mode 100644
index f404076..0000000
--- a/doc/archoverview.gif
+++ /dev/null
Binary files differ
diff --git a/doc/archoverview.svg b/doc/archoverview.svg
new file mode 100644
index 0000000..11a4340
--- /dev/null
+++ b/doc/archoverview.svg
@@ -0,0 +1,625 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="757" height="535" viewBox="0 0 842 595" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.40625 0 L 0.40625 -8.90625 L 7.46875 -8.90625 L 7.46875 0 Z M 6.34375 -1.109375 L 6.34375 -7.78125 L 1.515625 -7.78125 L 1.515625 -1.109375 Z M 6.34375 -1.109375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 4.6875 -9.140625 C 5.820312 -9.140625 6.695312 -8.84375 7.3125 -8.25 C 7.9375 -7.65625 8.285156 -6.984375 8.359375 -6.234375 L 7.171875 -6.234375 C 7.046875 -6.804688 6.78125 -7.257812 6.375 -7.59375 C 5.976562 -7.925781 5.421875 -8.09375 4.703125 -8.09375 C 3.828125 -8.09375 3.117188 -7.785156 2.578125 -7.171875 C 2.046875 -6.554688 1.78125 -5.613281 1.78125 -4.34375 C 1.78125 -3.300781 2.019531 -2.453125 2.5 -1.796875 C 2.988281 -1.148438 3.71875 -0.828125 4.6875 -0.828125 C 5.570312 -0.828125 6.25 -1.171875 6.71875 -1.859375 C 6.957031 -2.210938 7.140625 -2.679688 7.265625 -3.265625 L 8.4375 -3.265625 C 8.332031 -2.328125 7.984375 -1.546875 7.390625 -0.921875 C 6.691406 -0.148438 5.738281 0.234375 4.53125 0.234375 C 3.5 0.234375 2.632812 -0.078125 1.9375 -0.703125 C 1.007812 -1.535156 0.546875 -2.816406 0.546875 -4.546875 C 0.546875 -5.859375 0.894531 -6.929688 1.59375 -7.765625 C 2.34375 -8.679688 3.375 -9.140625 4.6875 -9.140625 Z M 4.453125 -9.140625 Z M 4.453125 -9.140625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 3.375 -0.703125 C 4.09375 -0.703125 4.585938 -0.972656 4.859375 -1.515625 C 5.128906 -2.066406 5.265625 -2.675781 5.265625 -3.34375 C 5.265625 -3.957031 5.164062 -4.453125 4.96875 -4.828125 C 4.664062 -5.421875 4.140625 -5.71875 3.390625 -5.71875 C 2.722656 -5.71875 2.238281 -5.460938 1.9375 -4.953125 C 1.632812 -4.453125 1.484375 -3.84375 1.484375 -3.125 C 1.484375 -2.425781 1.632812 -1.847656 1.9375 -1.390625 C 2.238281 -0.929688 2.71875 -0.703125 3.375 -0.703125 Z M 3.421875 -6.671875 C 4.253906 -6.671875 4.957031 -6.390625 5.53125 -5.828125 C 6.113281 -5.273438 6.40625 -4.457031 6.40625 -3.375 C 6.40625 -2.332031 6.148438 -1.46875 5.640625 -0.78125 C 5.128906 -0.101562 4.335938 0.234375 3.265625 0.234375 C 2.378906 0.234375 1.671875 -0.0664062 1.140625 -0.671875 C 0.617188 -1.273438 0.359375 -2.085938 0.359375 -3.109375 C 0.359375 -4.191406 0.632812 -5.054688 1.1875 -5.703125 C 1.738281 -6.347656 2.484375 -6.671875 3.421875 -6.671875 Z M 3.375 -6.640625 Z M 3.375 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 0.796875 -6.484375 L 1.828125 -6.484375 L 1.828125 -5.5625 C 2.140625 -5.945312 2.46875 -6.222656 2.8125 -6.390625 C 3.15625 -6.554688 3.535156 -6.640625 3.953125 -6.640625 C 4.878906 -6.640625 5.503906 -6.316406 5.828125 -5.671875 C 6.003906 -5.316406 6.09375 -4.8125 6.09375 -4.15625 L 6.09375 0 L 4.984375 0 L 4.984375 -4.09375 C 4.984375 -4.488281 4.921875 -4.804688 4.796875 -5.046875 C 4.609375 -5.453125 4.257812 -5.65625 3.75 -5.65625 C 3.488281 -5.65625 3.273438 -5.628906 3.109375 -5.578125 C 2.816406 -5.484375 2.554688 -5.304688 2.328125 -5.046875 C 2.140625 -4.828125 2.019531 -4.601562 1.96875 -4.375 C 1.914062 -4.144531 1.890625 -3.816406 1.890625 -3.390625 L 1.890625 0 L 0.796875 0 Z M 3.359375 -6.640625 Z M 3.359375 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 1.078125 -7.46875 C 1.085938 -7.925781 1.164062 -8.257812 1.3125 -8.46875 C 1.5625 -8.84375 2.050781 -9.03125 2.78125 -9.03125 C 2.851562 -9.03125 2.925781 -9.023438 3 -9.015625 C 3.070312 -9.015625 3.148438 -9.007812 3.234375 -9 L 3.234375 -8.015625 C 3.128906 -8.015625 3.050781 -8.015625 3 -8.015625 C 2.945312 -8.023438 2.898438 -8.03125 2.859375 -8.03125 C 2.523438 -8.03125 2.320312 -7.941406 2.25 -7.765625 C 2.1875 -7.597656 2.15625 -7.160156 2.15625 -6.453125 L 3.234375 -6.453125 L 3.234375 -5.59375 L 2.15625 -5.59375 L 2.15625 0 L 1.078125 0 L 1.078125 -5.59375 L 0.171875 -5.59375 L 0.171875 -6.453125 L 1.078125 -6.453125 Z M 1.078125 -7.46875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 0.796875 -6.453125 L 1.90625 -6.453125 L 1.90625 0 L 0.796875 0 Z M 0.796875 -8.90625 L 1.90625 -8.90625 L 1.90625 -7.65625 L 0.796875 -7.65625 Z M 0.796875 -8.90625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 3.09375 -6.609375 C 3.601562 -6.609375 4.046875 -6.484375 4.421875 -6.234375 C 4.628906 -6.085938 4.835938 -5.878906 5.046875 -5.609375 L 5.046875 -6.421875 L 6.0625 -6.421875 L 6.0625 -0.53125 C 6.0625 0.289062 5.9375 0.941406 5.6875 1.421875 C 5.238281 2.304688 4.382812 2.75 3.125 2.75 C 2.425781 2.75 1.835938 2.59375 1.359375 2.28125 C 0.890625 1.96875 0.625 1.476562 0.5625 0.8125 L 1.671875 0.8125 C 1.722656 1.09375 1.832031 1.316406 2 1.484375 C 2.238281 1.722656 2.625 1.84375 3.15625 1.84375 C 3.988281 1.84375 4.535156 1.546875 4.796875 0.953125 C 4.953125 0.609375 5.023438 -0.0078125 5.015625 -0.90625 C 4.796875 -0.570312 4.53125 -0.320312 4.21875 -0.15625 C 3.914062 0 3.507812 0.078125 3 0.078125 C 2.300781 0.078125 1.6875 -0.171875 1.15625 -0.671875 C 0.632812 -1.171875 0.375 -1.992188 0.375 -3.140625 C 0.375 -4.234375 0.640625 -5.082031 1.171875 -5.6875 C 1.703125 -6.300781 2.34375 -6.609375 3.09375 -6.609375 Z M 5.046875 -3.265625 C 5.046875 -4.078125 4.878906 -4.675781 4.546875 -5.0625 C 4.222656 -5.445312 3.804688 -5.640625 3.296875 -5.640625 C 2.523438 -5.640625 2 -5.28125 1.71875 -4.5625 C 1.5625 -4.175781 1.484375 -3.671875 1.484375 -3.046875 C 1.484375 -2.316406 1.628906 -1.757812 1.921875 -1.375 C 2.222656 -1 2.625 -0.8125 3.125 -0.8125 C 3.914062 -0.8125 4.46875 -1.164062 4.78125 -1.875 C 4.957031 -2.269531 5.046875 -2.734375 5.046875 -3.265625 Z M 3.21875 -6.640625 Z M 3.21875 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-7">
+<path style="stroke:none;" d=""/>
+</symbol>
+<symbol overflow="visible" id="glyph0-8">
+<path style="stroke:none;" d="M 3.53125 -0.734375 C 4.039062 -0.734375 4.460938 -0.945312 4.796875 -1.375 C 5.140625 -1.800781 5.3125 -2.4375 5.3125 -3.28125 C 5.3125 -3.800781 5.238281 -4.242188 5.09375 -4.609375 C 4.8125 -5.328125 4.289062 -5.6875 3.53125 -5.6875 C 2.78125 -5.6875 2.265625 -5.3125 1.984375 -4.5625 C 1.835938 -4.15625 1.765625 -3.640625 1.765625 -3.015625 C 1.765625 -2.515625 1.835938 -2.085938 1.984375 -1.734375 C 2.265625 -1.066406 2.78125 -0.734375 3.53125 -0.734375 Z M 0.71875 -6.453125 L 1.78125 -6.453125 L 1.78125 -5.59375 C 2 -5.894531 2.234375 -6.125 2.484375 -6.28125 C 2.859375 -6.519531 3.289062 -6.640625 3.78125 -6.640625 C 4.519531 -6.640625 5.144531 -6.359375 5.65625 -5.796875 C 6.164062 -5.234375 6.421875 -4.429688 6.421875 -3.390625 C 6.421875 -1.972656 6.050781 -0.960938 5.3125 -0.359375 C 4.84375 0.0234375 4.300781 0.21875 3.6875 0.21875 C 3.195312 0.21875 2.785156 0.109375 2.453125 -0.109375 C 2.253906 -0.222656 2.039062 -0.429688 1.8125 -0.734375 L 1.8125 2.59375 L 0.71875 2.59375 Z M 0.71875 -6.453125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-9">
+<path style="stroke:none;" d="M 1.640625 -1.71875 C 1.640625 -1.40625 1.753906 -1.15625 1.984375 -0.96875 C 2.210938 -0.789062 2.484375 -0.703125 2.796875 -0.703125 C 3.179688 -0.703125 3.550781 -0.789062 3.90625 -0.96875 C 4.519531 -1.269531 4.828125 -1.753906 4.828125 -2.421875 L 4.828125 -3.296875 C 4.691406 -3.210938 4.515625 -3.140625 4.296875 -3.078125 C 4.085938 -3.023438 3.882812 -2.988281 3.6875 -2.96875 L 3.03125 -2.890625 C 2.632812 -2.835938 2.335938 -2.753906 2.140625 -2.640625 C 1.804688 -2.441406 1.640625 -2.132812 1.640625 -1.71875 Z M 4.28125 -3.9375 C 4.53125 -3.96875 4.695312 -4.070312 4.78125 -4.25 C 4.832031 -4.34375 4.859375 -4.484375 4.859375 -4.671875 C 4.859375 -5.035156 4.722656 -5.300781 4.453125 -5.46875 C 4.191406 -5.632812 3.8125 -5.71875 3.3125 -5.71875 C 2.75 -5.71875 2.347656 -5.566406 2.109375 -5.265625 C 1.972656 -5.097656 1.882812 -4.84375 1.84375 -4.5 L 0.828125 -4.5 C 0.847656 -5.300781 1.109375 -5.859375 1.609375 -6.171875 C 2.109375 -6.484375 2.6875 -6.640625 3.34375 -6.640625 C 4.101562 -6.640625 4.722656 -6.492188 5.203125 -6.203125 C 5.671875 -5.910156 5.90625 -5.460938 5.90625 -4.859375 L 5.90625 -1.109375 C 5.90625 -0.992188 5.925781 -0.898438 5.96875 -0.828125 C 6.019531 -0.765625 6.125 -0.734375 6.28125 -0.734375 C 6.320312 -0.734375 6.375 -0.734375 6.4375 -0.734375 C 6.5 -0.742188 6.566406 -0.757812 6.640625 -0.78125 L 6.640625 0.03125 C 6.460938 0.0820312 6.328125 0.113281 6.234375 0.125 C 6.148438 0.132812 6.03125 0.140625 5.875 0.140625 C 5.5 0.140625 5.226562 0.00390625 5.0625 -0.265625 C 4.976562 -0.398438 4.914062 -0.597656 4.875 -0.859375 C 4.65625 -0.566406 4.335938 -0.3125 3.921875 -0.09375 C 3.503906 0.113281 3.046875 0.21875 2.546875 0.21875 C 1.941406 0.21875 1.445312 0.0351562 1.0625 -0.328125 C 0.6875 -0.691406 0.5 -1.148438 0.5 -1.703125 C 0.5 -2.304688 0.6875 -2.769531 1.0625 -3.09375 C 1.4375 -3.425781 1.925781 -3.632812 2.53125 -3.71875 Z M 3.375 -6.640625 Z M 3.375 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-10">
+<path style="stroke:none;" d="M 0.828125 -6.484375 L 1.859375 -6.484375 L 1.859375 -5.359375 C 1.953125 -5.578125 2.160156 -5.84375 2.484375 -6.15625 C 2.816406 -6.476562 3.203125 -6.640625 3.640625 -6.640625 C 3.660156 -6.640625 3.691406 -6.632812 3.734375 -6.625 C 3.785156 -6.625 3.867188 -6.617188 3.984375 -6.609375 L 3.984375 -5.453125 C 3.921875 -5.460938 3.859375 -5.46875 3.796875 -5.46875 C 3.742188 -5.476562 3.6875 -5.484375 3.625 -5.484375 C 3.082031 -5.484375 2.660156 -5.304688 2.359375 -4.953125 C 2.066406 -4.597656 1.921875 -4.191406 1.921875 -3.734375 L 1.921875 0 L 0.828125 0 Z M 0.828125 -6.484375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-11">
+<path style="stroke:none;" d="M 1.453125 -2.03125 C 1.484375 -1.664062 1.570312 -1.390625 1.71875 -1.203125 C 1.988281 -0.847656 2.46875 -0.671875 3.15625 -0.671875 C 3.550781 -0.671875 3.898438 -0.757812 4.203125 -0.9375 C 4.515625 -1.113281 4.671875 -1.382812 4.671875 -1.75 C 4.671875 -2.03125 4.550781 -2.242188 4.3125 -2.390625 C 4.15625 -2.472656 3.84375 -2.578125 3.375 -2.703125 L 2.515625 -2.90625 C 1.953125 -3.050781 1.539062 -3.207031 1.28125 -3.375 C 0.8125 -3.664062 0.578125 -4.070312 0.578125 -4.59375 C 0.578125 -5.207031 0.796875 -5.703125 1.234375 -6.078125 C 1.679688 -6.460938 2.28125 -6.65625 3.03125 -6.65625 C 4.007812 -6.65625 4.710938 -6.367188 5.140625 -5.796875 C 5.410156 -5.429688 5.539062 -5.039062 5.53125 -4.625 L 4.5 -4.625 C 4.488281 -4.863281 4.40625 -5.085938 4.25 -5.296875 C 4 -5.578125 3.5625 -5.71875 2.9375 -5.71875 C 2.53125 -5.71875 2.21875 -5.640625 2 -5.484375 C 1.789062 -5.328125 1.6875 -5.117188 1.6875 -4.859375 C 1.6875 -4.578125 1.828125 -4.351562 2.109375 -4.1875 C 2.265625 -4.082031 2.503906 -3.992188 2.828125 -3.921875 L 3.546875 -3.75 C 4.328125 -3.550781 4.851562 -3.363281 5.125 -3.1875 C 5.539062 -2.914062 5.75 -2.476562 5.75 -1.875 C 5.75 -1.300781 5.53125 -0.800781 5.09375 -0.375 C 4.65625 0.0390625 3.988281 0.25 3.09375 0.25 C 2.125 0.25 1.4375 0.03125 1.03125 -0.40625 C 0.632812 -0.84375 0.425781 -1.382812 0.40625 -2.03125 Z M 3.0625 -6.640625 Z M 3.0625 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-12">
+<path style="stroke:none;" d="M 3.5 -6.640625 C 3.957031 -6.640625 4.398438 -6.53125 4.828125 -6.3125 C 5.265625 -6.09375 5.597656 -5.8125 5.828125 -5.46875 C 6.046875 -5.144531 6.191406 -4.765625 6.265625 -4.328125 C 6.328125 -4.023438 6.359375 -3.546875 6.359375 -2.890625 L 1.609375 -2.890625 C 1.628906 -2.234375 1.785156 -1.707031 2.078125 -1.3125 C 2.367188 -0.914062 2.816406 -0.71875 3.421875 -0.71875 C 3.992188 -0.71875 4.445312 -0.90625 4.78125 -1.28125 C 4.976562 -1.5 5.117188 -1.75 5.203125 -2.03125 L 6.265625 -2.03125 C 6.242188 -1.789062 6.148438 -1.523438 5.984375 -1.234375 C 5.828125 -0.941406 5.648438 -0.703125 5.453125 -0.515625 C 5.117188 -0.191406 4.707031 0.0234375 4.21875 0.140625 C 3.957031 0.203125 3.660156 0.234375 3.328125 0.234375 C 2.523438 0.234375 1.84375 -0.0546875 1.28125 -0.640625 C 0.71875 -1.234375 0.4375 -2.0625 0.4375 -3.125 C 0.4375 -4.164062 0.71875 -5.007812 1.28125 -5.65625 C 1.84375 -6.3125 2.582031 -6.640625 3.5 -6.640625 Z M 5.234375 -3.765625 C 5.191406 -4.234375 5.09375 -4.609375 4.9375 -4.890625 C 4.632812 -5.421875 4.132812 -5.6875 3.4375 -5.6875 C 2.9375 -5.6875 2.515625 -5.503906 2.171875 -5.140625 C 1.835938 -4.773438 1.660156 -4.316406 1.640625 -3.765625 Z M 3.390625 -6.640625 Z M 3.390625 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-13">
+<path style="stroke:none;" d="M 0.9375 -8.90625 L 2.15625 -8.90625 L 2.15625 -1.0625 L 6.65625 -1.0625 L 6.65625 0 L 0.9375 0 Z M 0.9375 -8.90625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-14">
+<path style="stroke:none;" d="M 1.890625 -6.484375 L 1.890625 -2.1875 C 1.890625 -1.851562 1.941406 -1.582031 2.046875 -1.375 C 2.242188 -0.976562 2.601562 -0.78125 3.125 -0.78125 C 3.882812 -0.78125 4.40625 -1.125 4.6875 -1.8125 C 4.832031 -2.164062 4.90625 -2.660156 4.90625 -3.296875 L 4.90625 -6.484375 L 6 -6.484375 L 6 0 L 4.96875 0 L 4.984375 -0.953125 C 4.835938 -0.710938 4.660156 -0.503906 4.453125 -0.328125 C 4.035156 0.00390625 3.53125 0.171875 2.9375 0.171875 C 2.007812 0.171875 1.378906 -0.132812 1.046875 -0.75 C 0.867188 -1.082031 0.78125 -1.523438 0.78125 -2.078125 L 0.78125 -6.484375 Z M 3.390625 -6.640625 Z M 3.390625 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-15">
+<path style="stroke:none;" d="M 1.0625 -8.90625 L 5.0625 -8.90625 C 5.851562 -8.90625 6.488281 -8.679688 6.96875 -8.234375 C 7.457031 -7.785156 7.703125 -7.15625 7.703125 -6.34375 C 7.703125 -5.65625 7.484375 -5.050781 7.046875 -4.53125 C 6.617188 -4.019531 5.957031 -3.765625 5.0625 -3.765625 L 2.265625 -3.765625 L 2.265625 0 L 1.0625 0 Z M 6.484375 -6.34375 C 6.484375 -7 6.242188 -7.441406 5.765625 -7.671875 C 5.492188 -7.796875 5.128906 -7.859375 4.671875 -7.859375 L 2.265625 -7.859375 L 2.265625 -4.78125 L 4.671875 -4.78125 C 5.203125 -4.78125 5.632812 -4.894531 5.96875 -5.125 C 6.3125 -5.351562 6.484375 -5.757812 6.484375 -6.34375 Z M 6.484375 -6.34375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-16">
+<path style="stroke:none;" d="M 3.296875 -6.671875 C 4.023438 -6.671875 4.617188 -6.492188 5.078125 -6.140625 C 5.535156 -5.785156 5.8125 -5.175781 5.90625 -4.3125 L 4.859375 -4.3125 C 4.785156 -4.707031 4.632812 -5.035156 4.40625 -5.296875 C 4.175781 -5.566406 3.804688 -5.703125 3.296875 -5.703125 C 2.609375 -5.703125 2.113281 -5.363281 1.8125 -4.6875 C 1.613281 -4.238281 1.515625 -3.691406 1.515625 -3.046875 C 1.515625 -2.398438 1.648438 -1.851562 1.921875 -1.40625 C 2.203125 -0.96875 2.640625 -0.75 3.234375 -0.75 C 3.679688 -0.75 4.035156 -0.882812 4.296875 -1.15625 C 4.566406 -1.4375 4.753906 -1.816406 4.859375 -2.296875 L 5.90625 -2.296875 C 5.789062 -1.429688 5.488281 -0.800781 5 -0.40625 C 4.519531 -0.0078125 3.898438 0.1875 3.140625 0.1875 C 2.296875 0.1875 1.617188 -0.117188 1.109375 -0.734375 C 0.609375 -1.359375 0.359375 -2.132812 0.359375 -3.0625 C 0.359375 -4.207031 0.632812 -5.09375 1.1875 -5.71875 C 1.738281 -6.351562 2.441406 -6.671875 3.296875 -6.671875 Z M 3.125 -6.640625 Z M 3.125 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-17">
+<path style="stroke:none;" d="M 0.96875 -8.90625 L 2.1875 -8.90625 L 2.1875 -5.21875 L 6.828125 -5.21875 L 6.828125 -8.90625 L 8.03125 -8.90625 L 8.03125 0 L 6.828125 0 L 6.828125 -4.15625 L 2.1875 -4.15625 L 2.1875 0 L 0.96875 0 Z M 0.96875 -8.90625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-18">
+<path style="stroke:none;" d="M 7.421875 -8.90625 L 7.421875 -7.84375 L 4.421875 -7.84375 L 4.421875 0 L 3.203125 0 L 3.203125 -7.84375 L 0.203125 -7.84375 L 0.203125 -8.90625 Z M 7.421875 -8.90625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-19">
+<path style="stroke:none;" d="M 0.921875 -8.90625 L 2.640625 -8.90625 L 5.203125 -1.375 L 7.734375 -8.90625 L 9.4375 -8.90625 L 9.4375 0 L 8.296875 0 L 8.296875 -5.25 C 8.296875 -5.4375 8.300781 -5.738281 8.3125 -6.15625 C 8.320312 -6.570312 8.328125 -7.019531 8.328125 -7.5 L 5.78125 0 L 4.59375 0 L 2.03125 -7.5 L 2.03125 -7.234375 C 2.03125 -7.015625 2.035156 -6.679688 2.046875 -6.234375 C 2.054688 -5.785156 2.0625 -5.457031 2.0625 -5.25 L 2.0625 0 L 0.921875 0 Z M 0.921875 -8.90625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-20">
+<path style="stroke:none;" d="M 1.703125 0 L 0.25 0 L 3.4375 -4.5625 L 0.453125 -8.90625 L 1.96875 -8.90625 L 4.234375 -5.5 L 6.484375 -8.90625 L 7.921875 -8.90625 L 4.9375 -4.5625 L 8.0625 0 L 6.578125 0 L 4.171875 -3.65625 Z M 1.703125 0 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-21">
+<path style="stroke:none;" d="M 5.078125 -4.828125 C 5.648438 -4.828125 6.097656 -4.9375 6.421875 -5.15625 C 6.753906 -5.382812 6.921875 -5.796875 6.921875 -6.390625 C 6.921875 -7.015625 6.691406 -7.445312 6.234375 -7.6875 C 5.984375 -7.800781 5.648438 -7.859375 5.234375 -7.859375 L 2.296875 -7.859375 L 2.296875 -4.828125 Z M 1.09375 -8.90625 L 5.203125 -8.90625 C 5.890625 -8.90625 6.453125 -8.804688 6.890625 -8.609375 C 7.722656 -8.222656 8.140625 -7.519531 8.140625 -6.5 C 8.140625 -5.96875 8.03125 -5.53125 7.8125 -5.1875 C 7.59375 -4.851562 7.285156 -4.582031 6.890625 -4.375 C 7.234375 -4.226562 7.492188 -4.039062 7.671875 -3.8125 C 7.847656 -3.582031 7.945312 -3.210938 7.96875 -2.703125 L 8.015625 -1.5 C 8.023438 -1.164062 8.050781 -0.914062 8.09375 -0.75 C 8.164062 -0.46875 8.296875 -0.285156 8.484375 -0.203125 L 8.484375 0 L 7 0 C 6.957031 -0.0703125 6.925781 -0.171875 6.90625 -0.296875 C 6.882812 -0.421875 6.863281 -0.65625 6.84375 -1 L 6.765625 -2.484375 C 6.742188 -3.066406 6.53125 -3.457031 6.125 -3.65625 C 5.894531 -3.757812 5.535156 -3.8125 5.046875 -3.8125 L 2.296875 -3.8125 L 2.296875 0 L 1.09375 0 Z M 1.09375 -8.90625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-22">
+<path style="stroke:none;" d="M 1.0625 -8.90625 L 7.234375 -8.90625 L 7.234375 -7.8125 L 2.265625 -7.8125 L 2.265625 -5.109375 L 6.640625 -5.109375 L 6.640625 -4.046875 L 2.265625 -4.046875 L 2.265625 0 L 1.0625 0 Z M 1.0625 -8.90625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-23">
+<path style="stroke:none;" d="M 1.015625 -8.296875 L 2.125 -8.296875 L 2.125 -6.484375 L 3.15625 -6.484375 L 3.15625 -5.59375 L 2.125 -5.59375 L 2.125 -1.359375 C 2.125 -1.140625 2.195312 -0.988281 2.34375 -0.90625 C 2.4375 -0.863281 2.582031 -0.84375 2.78125 -0.84375 C 2.832031 -0.84375 2.882812 -0.84375 2.9375 -0.84375 C 3 -0.84375 3.070312 -0.847656 3.15625 -0.859375 L 3.15625 0 C 3.03125 0.03125 2.898438 0.0546875 2.765625 0.078125 C 2.628906 0.0976562 2.484375 0.109375 2.328125 0.109375 C 1.816406 0.109375 1.46875 -0.0195312 1.28125 -0.28125 C 1.101562 -0.539062 1.015625 -0.878906 1.015625 -1.296875 L 1.015625 -5.59375 L 0.140625 -5.59375 L 0.140625 -6.484375 L 1.015625 -6.484375 Z M 1.015625 -8.296875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-24">
+<path style="stroke:none;" d="M 4.859375 -6.484375 L 6.0625 -6.484375 C 5.90625 -6.066406 5.5625 -5.117188 5.03125 -3.640625 C 4.632812 -2.523438 4.304688 -1.617188 4.046875 -0.921875 C 3.410156 0.734375 2.960938 1.742188 2.703125 2.109375 C 2.441406 2.472656 2 2.65625 1.375 2.65625 C 1.21875 2.65625 1.097656 2.648438 1.015625 2.640625 C 0.929688 2.628906 0.832031 2.609375 0.71875 2.578125 L 0.71875 1.578125 C 0.90625 1.628906 1.039062 1.660156 1.125 1.671875 C 1.207031 1.691406 1.28125 1.703125 1.34375 1.703125 C 1.550781 1.703125 1.703125 1.664062 1.796875 1.59375 C 1.890625 1.53125 1.96875 1.445312 2.03125 1.34375 C 2.050781 1.3125 2.125 1.144531 2.25 0.84375 C 2.375 0.550781 2.46875 0.332031 2.53125 0.1875 L 0.125 -6.484375 L 1.359375 -6.484375 L 3.109375 -1.203125 Z M 3.09375 -6.640625 Z M 3.09375 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-25">
+<path style="stroke:none;" d="M 0.828125 -8.90625 L 1.921875 -8.90625 L 1.921875 0 L 0.828125 0 Z M 0.828125 -8.90625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-26">
+<path style="stroke:none;" d="M 1.484375 -3.171875 C 1.484375 -2.472656 1.628906 -1.890625 1.921875 -1.421875 C 2.222656 -0.953125 2.695312 -0.71875 3.34375 -0.71875 C 3.851562 -0.71875 4.269531 -0.929688 4.59375 -1.359375 C 4.914062 -1.796875 5.078125 -2.421875 5.078125 -3.234375 C 5.078125 -4.054688 4.910156 -4.664062 4.578125 -5.0625 C 4.242188 -5.457031 3.832031 -5.65625 3.34375 -5.65625 C 2.789062 -5.65625 2.34375 -5.441406 2 -5.015625 C 1.65625 -4.597656 1.484375 -3.984375 1.484375 -3.171875 Z M 3.125 -6.609375 C 3.625 -6.609375 4.039062 -6.5 4.375 -6.28125 C 4.570312 -6.164062 4.796875 -5.957031 5.046875 -5.65625 L 5.046875 -8.921875 L 6.09375 -8.921875 L 6.09375 0 L 5.109375 0 L 5.109375 -0.90625 C 4.847656 -0.5 4.546875 -0.207031 4.203125 -0.03125 C 3.859375 0.144531 3.460938 0.234375 3.015625 0.234375 C 2.285156 0.234375 1.65625 -0.0664062 1.125 -0.671875 C 0.601562 -1.285156 0.34375 -2.097656 0.34375 -3.109375 C 0.34375 -4.054688 0.582031 -4.875 1.0625 -5.5625 C 1.539062 -6.257812 2.226562 -6.609375 3.125 -6.609375 Z M 3.125 -6.609375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-27">
+<path style="stroke:none;" d="M 1.328125 -6.484375 L 3.0625 -1.203125 L 4.875 -6.484375 L 6.0625 -6.484375 L 3.625 0 L 2.453125 0 L 0.0625 -6.484375 Z M 1.328125 -6.484375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-28">
+<path style="stroke:none;" d="M 4.359375 -1.03125 C 4.765625 -1.03125 5.097656 -1.070312 5.359375 -1.15625 C 5.828125 -1.3125 6.210938 -1.613281 6.515625 -2.0625 C 6.753906 -2.425781 6.925781 -2.890625 7.03125 -3.453125 C 7.09375 -3.785156 7.125 -4.09375 7.125 -4.375 C 7.125 -5.476562 6.90625 -6.332031 6.46875 -6.9375 C 6.03125 -7.550781 5.320312 -7.859375 4.34375 -7.859375 L 2.21875 -7.859375 L 2.21875 -1.03125 Z M 1 -8.90625 L 4.609375 -8.90625 C 5.828125 -8.90625 6.773438 -8.46875 7.453125 -7.59375 C 8.054688 -6.8125 8.359375 -5.804688 8.359375 -4.578125 C 8.359375 -3.640625 8.179688 -2.785156 7.828125 -2.015625 C 7.191406 -0.671875 6.113281 0 4.59375 0 L 1 0 Z M 1 -8.90625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-29">
+<path style="stroke:none;" d="M 1.734375 -2.875 C 1.765625 -2.363281 1.882812 -1.953125 2.09375 -1.640625 C 2.488281 -1.046875 3.191406 -0.75 4.203125 -0.75 C 4.648438 -0.75 5.0625 -0.816406 5.4375 -0.953125 C 6.15625 -1.203125 6.515625 -1.648438 6.515625 -2.296875 C 6.515625 -2.773438 6.363281 -3.117188 6.0625 -3.328125 C 5.757812 -3.535156 5.28125 -3.710938 4.625 -3.859375 L 3.421875 -4.125 C 2.628906 -4.300781 2.070312 -4.5 1.75 -4.71875 C 1.175781 -5.09375 0.890625 -5.648438 0.890625 -6.390625 C 0.890625 -7.179688 1.164062 -7.832031 1.71875 -8.34375 C 2.28125 -8.863281 3.066406 -9.125 4.078125 -9.125 C 5.003906 -9.125 5.796875 -8.894531 6.453125 -8.4375 C 7.109375 -7.988281 7.4375 -7.269531 7.4375 -6.28125 L 6.296875 -6.28125 C 6.234375 -6.757812 6.101562 -7.128906 5.90625 -7.390625 C 5.539062 -7.847656 4.921875 -8.078125 4.046875 -8.078125 C 3.328125 -8.078125 2.8125 -7.925781 2.5 -7.625 C 2.195312 -7.332031 2.046875 -6.988281 2.046875 -6.59375 C 2.046875 -6.15625 2.226562 -5.835938 2.59375 -5.640625 C 2.820312 -5.503906 3.359375 -5.34375 4.203125 -5.15625 L 5.453125 -4.859375 C 6.054688 -4.722656 6.519531 -4.535156 6.84375 -4.296875 C 7.40625 -3.878906 7.6875 -3.273438 7.6875 -2.484375 C 7.6875 -1.503906 7.328125 -0.800781 6.609375 -0.375 C 5.898438 0.0507812 5.070312 0.265625 4.125 0.265625 C 3.007812 0.265625 2.140625 -0.0195312 1.515625 -0.59375 C 0.890625 -1.144531 0.582031 -1.90625 0.59375 -2.875 Z M 4.171875 -9.140625 Z M 4.171875 -9.140625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-30">
+<path style="stroke:none;" d="M 4.78125 -9.140625 C 6.351562 -9.140625 7.519531 -8.632812 8.28125 -7.625 C 8.863281 -6.84375 9.15625 -5.835938 9.15625 -4.609375 C 9.15625 -3.273438 8.816406 -2.171875 8.140625 -1.296875 C 7.347656 -0.253906 6.222656 0.265625 4.765625 0.265625 C 3.390625 0.265625 2.3125 -0.1875 1.53125 -1.09375 C 0.832031 -1.96875 0.484375 -3.070312 0.484375 -4.40625 C 0.484375 -5.601562 0.78125 -6.632812 1.375 -7.5 C 2.144531 -8.59375 3.28125 -9.140625 4.78125 -9.140625 Z M 4.90625 -0.8125 C 5.96875 -0.8125 6.734375 -1.191406 7.203125 -1.953125 C 7.679688 -2.722656 7.921875 -3.597656 7.921875 -4.578125 C 7.921875 -5.628906 7.644531 -6.472656 7.09375 -7.109375 C 6.550781 -7.742188 5.804688 -8.0625 4.859375 -8.0625 C 3.941406 -8.0625 3.191406 -7.742188 2.609375 -7.109375 C 2.023438 -6.484375 1.734375 -5.554688 1.734375 -4.328125 C 1.734375 -3.335938 1.984375 -2.503906 2.484375 -1.828125 C 2.984375 -1.148438 3.789062 -0.8125 4.90625 -0.8125 Z M 4.828125 -9.140625 Z M 4.828125 -9.140625 "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 60 23 L 758 23 L 758 590.925781 L 60 590.925781 Z M 60 23 "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 5 263 L 69 263 L 69 264 L 5 264 Z M 5 263 "/>
+</clipPath>
+<clipPath id="clip3">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 59.503906 261.546875 L 67.773438 263.613281 L 59.503906 265.679688 L 68.808594 265.679688 L 68.808594 261.546875 "/>
+</clipPath>
+<clipPath id="clip4">
+ <path d="M 191 263 L 255 263 L 255 264 L 191 264 Z M 191 263 "/>
+</clipPath>
+<clipPath id="clip5">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 245.59375 261.546875 L 253.863281 263.613281 L 245.59375 265.679688 L 254.898438 265.679688 L 254.898438 261.546875 "/>
+</clipPath>
+<clipPath id="clip6">
+ <path d="M 563 263 L 627 263 L 627 264 L 563 264 Z M 563 263 "/>
+</clipPath>
+<clipPath id="clip7">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 617.773438 261.546875 L 626.042969 263.613281 L 617.773438 265.679688 L 627.078125 265.679688 L 627.078125 261.546875 "/>
+</clipPath>
+<clipPath id="clip8">
+ <path d="M 737 204 L 799 204 L 799 246 L 737 246 Z M 737 204 "/>
+</clipPath>
+<clipPath id="clip9">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 783.253906 214.128906 L 791.457031 211.921875 L 785.253906 217.78125 L 793.386719 213.230469 L 791.386719 209.578125 "/>
+</clipPath>
+<clipPath id="clip10">
+ <path d="M 742 245 L 799 245 L 799 271 L 742 271 Z M 742 245 "/>
+</clipPath>
+<clipPath id="clip11">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 782.910156 253.273438 L 791.457031 253.273438 L 783.945312 257.273438 L 792.972656 254.996094 L 791.941406 251 "/>
+</clipPath>
+<clipPath id="clip12">
+ <path d="M 732 297 L 799 297 L 799 333 L 732 333 Z M 732 297 "/>
+</clipPath>
+<clipPath id="clip13">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 784.566406 320.679688 L 791.457031 325.644531 L 782.980469 324.472656 L 791.664062 327.917969 L 793.179688 324.128906 "/>
+</clipPath>
+<clipPath id="clip14">
+ <path d="M 742 271 L 799 271 L 799 297 L 742 297 Z M 742 271 "/>
+</clipPath>
+<clipPath id="clip15">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 783.945312 285.460938 L 791.457031 289.460938 L 782.910156 289.460938 L 791.941406 291.734375 L 792.972656 287.734375 "/>
+</clipPath>
+<clipPath id="clip16">
+ <path d="M 501 170 L 792 170 L 792 202 L 501 202 Z M 501 170 "/>
+</clipPath>
+<clipPath id="clip17">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 783.1875 168.5 L 791.457031 170.566406 L 783.1875 172.636719 L 792.492188 172.636719 L 792.492188 168.5 "/>
+</clipPath>
+<clipPath id="clip18">
+ <path d="M 563 330 L 689 330 L 689 533 L 563 533 Z M 563 330 "/>
+</clipPath>
+<clipPath id="clip19">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 686.007812 339.082031 L 688.074219 330.8125 L 690.140625 339.082031 L 690.140625 329.777344 L 686.007812 329.777344 "/>
+</clipPath>
+<clipPath id="clip20">
+ <path d="M 269 4.007812 L 270 4.007812 L 270 32 L 269 32 Z M 269 4.007812 "/>
+</clipPath>
+<clipPath id="clip21">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 271.4375 22.730469 L 269.371094 31 L 267.304688 22.730469 L 267.304688 32.035156 L 271.4375 32.035156 "/>
+</clipPath>
+<clipPath id="clip22">
+ <path d="M 129 92 L 208 92 L 208 202 L 129 202 Z M 129 92 "/>
+</clipPath>
+<clipPath id="clip23">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 199.070312 90.964844 L 207.339844 93.03125 L 199.070312 95.097656 L 208.375 95.097656 L 208.375 90.964844 "/>
+</clipPath>
+<clipPath id="clip24">
+ <path d="M 331 87 L 487 87 L 487 202 L 331 202 Z M 331 87 "/>
+</clipPath>
+<clipPath id="clip25">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 339.671875 89.929688 L 331.402344 87.863281 L 339.671875 85.792969 L 330.367188 85.792969 L 330.367188 89.929688 "/>
+</clipPath>
+<clipPath id="clip26">
+ <path d="M 300 149 L 301 149 L 301 202 L 300 202 Z M 300 149 "/>
+</clipPath>
+<clipPath id="clip27">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 298.320312 158.164062 L 300.386719 149.890625 L 302.453125 158.164062 L 302.453125 148.859375 L 298.320312 148.859375 "/>
+</clipPath>
+<clipPath id="clip28">
+ <path d="M 129 325 L 451 325 L 451 533 L 129 533 Z M 129 325 "/>
+</clipPath>
+<clipPath id="clip29">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 442.019531 530.34375 L 450.292969 532.410156 L 442.019531 534.476562 L 451.324219 534.476562 L 451.324219 530.34375 "/>
+</clipPath>
+<clipPath id="clip30">
+ <path d="M 377 263 L 441 263 L 441 264 L 377 264 Z M 377 263 "/>
+</clipPath>
+<clipPath id="clip31">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 431.683594 261.546875 L 439.953125 263.613281 L 431.683594 265.679688 L 440.988281 265.679688 L 440.988281 261.546875 "/>
+</clipPath>
+<clipPath id="clip32">
+ <path d="M 360 302 L 468 302 L 468 401 L 360 401 Z M 360 302 "/>
+</clipPath>
+<clipPath id="clip33">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 453.046875 314.0625 L 460.628906 310.136719 L 455.804688 317.164062 L 462.765625 310.960938 L 460.011719 307.929688 "/>
+</clipPath>
+<clipPath id="clip34">
+ <path d="M 501 325 L 503 325 L 503 476 L 501 476 Z M 501 325 "/>
+</clipPath>
+<clipPath id="clip35">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 504.050781 467.277344 L 501.984375 475.550781 L 499.914062 467.277344 L 499.914062 476.582031 L 504.050781 476.582031 "/>
+</clipPath>
+<clipPath id="clip36">
+ <path d="M 536 302 L 587 302 L 587 375 L 536 375 Z M 536 302 "/>
+</clipPath>
+<clipPath id="clip37">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 576.832031 358.933594 L 579.519531 366.996094 L 573.316406 361.136719 L 578.347656 368.996094 L 581.796875 366.789062 "/>
+</clipPath>
+<clipPath id="clip38">
+ <path d="M 541 452 L 582 452 L 582 499 L 541 499 Z M 541 452 "/>
+</clipPath>
+<clipPath id="clip39">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 555.398438 486.023438 L 548.507812 491.054688 L 552.226562 483.40625 L 546.230469 490.503906 L 549.402344 493.191406 "/>
+</clipPath>
+<clipPath id="clip40">
+ <path d="M 634 323 L 675 323 L 675 375 L 634 375 Z M 634 323 "/>
+</clipPath>
+<clipPath id="clip41">
+ <path d="M 0 3.984375 L 841.953125 3.984375 L 841.953125 590.925781 L 0 590.925781 Z M 660.917969 336.328125 L 667.398438 330.8125 L 664.296875 338.738281 L 669.671875 331.15625 L 666.292969 328.746094 "/>
+</clipPath>
+</defs>
+<g id="surface1">
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 288.538486 433.499501 C 288.538486 403.693493 264.34682 379.498427 234.540812 379.498427 C 204.731403 379.498427 180.539738 403.693493 180.539738 433.499501 C 180.539738 463.30891 204.731403 487.500575 234.540812 487.500575 C 264.34682 487.500575 288.538486 463.30891 288.538486 433.499501 Z M 328.981482 284.999948 C 328.981482 255.190538 304.786416 230.998873 274.980407 230.998873 C 245.170998 230.998873 220.979333 255.190538 220.979333 284.999948 C 220.979333 314.809357 245.170998 339.001022 274.980407 339.001022 C 304.786416 339.001022 328.981482 314.809357 328.981482 284.999948 Z M 652.981126 280.558801 C 652.981126 250.752793 628.789461 226.561128 598.980052 226.561128 C 569.170643 226.561128 544.978977 250.752793 544.978977 280.558801 C 544.978977 310.36821 569.170643 334.559876 598.980052 334.559876 C 628.789461 334.559876 652.981126 310.36821 652.981126 280.558801 Z M 167.100679 285.118968 C 167.100679 255.312959 142.909014 231.121294 113.099605 231.121294 C 83.293597 231.121294 59.098531 255.312959 59.098531 285.118968 C 59.098531 314.928377 83.293597 339.120042 113.099605 339.120042 C 142.909014 339.120042 167.100679 314.928377 167.100679 285.118968 Z M 490.981304 50.819596 C 490.981304 23.098138 468.479723 0.599957 440.761665 0.599957 C 413.040207 0.599957 390.538625 23.098138 390.538625 50.819596 C 390.538625 78.541055 413.040207 101.039235 440.761665 101.039235 C 468.479723 101.039235 490.981304 78.541055 490.981304 50.819596 Z M 328.981482 139.741138 C 328.981482 110.363602 305.136675 86.518795 275.759138 86.518795 C 246.381602 86.518795 222.540195 110.363602 222.540195 139.741138 C 222.540195 169.118675 246.381602 192.960081 275.759138 192.960081 C 305.136675 192.960081 328.981482 169.118675 328.981482 139.741138 Z M 581.698348 150.058472 C 581.698348 122.340415 559.200167 99.838833 531.478709 99.838833 C 503.760651 99.838833 481.25907 122.340415 481.25907 150.058472 C 481.25907 177.77993 503.760651 200.281512 531.478709 200.281512 C 559.200167 200.281512 581.698348 177.77993 581.698348 150.058472 Z M 490.981304 284.999948 C 490.981304 255.190538 466.789639 230.998873 436.980229 230.998873 C 407.17082 230.998873 382.979155 255.190538 382.979155 284.999948 C 382.979155 314.809357 407.17082 339.001022 436.980229 339.001022 C 466.789639 339.001022 490.981304 314.809357 490.981304 284.999948 Z M 490.981304 284.999948 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 4.99884 284.999948 L 58.999914 284.999948 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 51.800905 286.79885 L 58.999914 284.999948 L 51.800905 283.201045 Z M 51.800905 286.79885 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 166.998662 284.999948 L 220.999736 284.999948 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 213.800727 286.79885 L 220.999736 284.999948 L 213.800727 283.201045 Z M 213.800727 286.79885 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip6)" clip-rule="nonzero">
+<g clip-path="url(#clip7)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 490.998307 284.999948 L 544.999381 284.999948 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 537.800371 286.79885 L 544.999381 284.999948 L 537.800371 283.201045 Z M 537.800371 286.79885 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip8)" clip-rule="nonzero">
+<g clip-path="url(#clip9)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 648.499173 307.501529 L 688.999978 329.999709 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 681.858778 328.078386 L 688.999978 329.999709 L 683.599871 324.898852 L 682.69872 326.520925 Z M 681.858778 328.078386 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip10)" clip-rule="nonzero">
+<g clip-path="url(#clip11)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 653.001529 284.999948 L 688.999978 294.00126 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 681.559528 294.00126 L 688.999978 294.00126 L 682.46068 290.519075 L 682.039009 292.260168 Z M 681.559528 294.00126 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip12)" clip-rule="nonzero">
+<g clip-path="url(#clip13)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 644.000217 249.001498 L 688.999978 230.998873 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 683.00137 235.321 L 688.999978 230.998873 L 681.620738 232.019045 L 682.34166 233.698927 Z M 683.00137 235.321 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip14)" clip-rule="nonzero">
+<g clip-path="url(#clip15)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 653.001529 271.499679 L 688.999978 262.498366 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 682.46068 265.980552 L 688.999978 262.498366 L 681.559528 262.498366 L 682.039009 264.239459 Z M 682.46068 265.980552 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip16)" clip-rule="nonzero">
+<g clip-path="url(#clip17)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 437.000633 339.001022 L 437.000633 366.001559 L 688.999978 366.001559 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 681.800969 367.800461 L 688.999978 366.001559 L 681.800969 364.199256 Z M 681.800969 367.800461 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip18)" clip-rule="nonzero">
+<g clip-path="url(#clip19)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 490.998307 50.999827 L 599.000455 50.999827 L 599.000455 226.499917 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 597.201553 219.300908 L 599.000455 226.499917 L 600.799357 219.300908 Z M 597.201553 219.300908 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip20)" clip-rule="nonzero">
+<g clip-path="url(#clip21)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 234.500005 509.998756 L 234.500005 487.500575 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 236.298907 494.699585 L 234.500005 487.500575 L 232.701103 494.699585 Z M 236.298907 494.699585 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip22)" clip-rule="nonzero">
+<g clip-path="url(#clip23)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:3.6;stroke-miterlimit:10;" d="M 180.498931 433.499501 L 113.000989 433.499501 L 113.000989 339.001022 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 173.299921 435.298403 L 180.498931 433.499501 L 173.299921 431.700599 Z M 173.299921 435.298403 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip24)" clip-rule="nonzero">
+<g clip-path="url(#clip25)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:3.6;stroke-miterlimit:10;" d="M 288.501079 437.998457 L 423.500364 437.998457 L 423.500364 339.001022 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 295.700089 436.199555 L 288.501079 437.998457 L 295.700089 439.80076 Z M 295.700089 436.199555 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip26)" clip-rule="nonzero">
+<g clip-path="url(#clip27)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:3.6;stroke-miterlimit:10;" d="M 261.500542 384.000783 L 261.500542 339.001022 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 259.70164 376.798373 L 261.500542 384.000783 L 263.299444 376.798373 Z M 259.70164 376.798373 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:3.6;stroke-miterlimit:10;" d="M 423.500364 437.998457 L 599.000455 437.998457 L 599.000455 334.498665 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip28)" clip-rule="nonzero">
+<g clip-path="url(#clip29)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 113.000989 230.998873 L 113.000989 50.999827 L 392.000871 50.999827 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 384.798461 52.798729 L 392.000871 50.999827 L 384.798461 49.200924 Z M 384.798461 52.798729 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip30)" clip-rule="nonzero">
+<g clip-path="url(#clip31)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 328.998484 284.999948 L 382.999559 284.999948 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 375.800549 286.79885 L 382.999559 284.999948 L 375.800549 283.201045 Z M 375.800549 286.79885 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip32)" clip-rule="nonzero">
+<g clip-path="url(#clip33)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 320.000572 172.498843 L 400.998783 244.499142 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 394.401675 241.081568 L 400.998783 244.499142 L 396.799077 238.381514 L 395.598676 239.700936 Z M 394.401675 241.081568 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip34)" clip-rule="nonzero">
+<g clip-path="url(#clip35)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 437.000633 100.498544 L 437.000633 230.998873 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 438.799535 107.700955 L 437.000633 100.498544 L 435.19833 107.700955 Z M 438.799535 107.700955 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip36)" clip-rule="nonzero">
+<g clip-path="url(#clip37)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 472.999082 244.499142 L 504.498575 195.000424 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 502.158982 202.019204 L 504.498575 195.000424 L 499.098468 200.101281 L 500.65933 201.060242 Z M 502.158982 202.019204 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip38)" clip-rule="nonzero">
+<g clip-path="url(#clip39)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 499.999619 113.998813 L 477.501439 87.001676 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 483.500047 91.381612 L 477.501439 87.001676 L 480.738783 93.659995 Z M 483.500047 91.381612 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g clip-path="url(#clip40)" clip-rule="nonzero">
+<g clip-path="url(#clip41)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 558.499649 195.000424 L 581.001231 226.499917 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+</g>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.45;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 575.359683 221.69831 L 581.001231 226.499917 L 578.301177 219.600158 L 576.801525 220.620329 Z M 575.359683 221.69831 " transform="matrix(1.148704,0,0,-1.148704,0,590.993861)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="233.186912" y="93.030677"/>
+ <use xlink:href="#glyph0-2" x="242.144046" y="93.030677"/>
+ <use xlink:href="#glyph0-3" x="249.041784" y="93.030677"/>
+ <use xlink:href="#glyph0-4" x="255.939522" y="93.030677"/>
+ <use xlink:href="#glyph0-5" x="259.388391" y="93.030677"/>
+ <use xlink:href="#glyph0-6" x="262.142523" y="93.030677"/>
+ <use xlink:href="#glyph0-7" x="269.040261" y="93.030677"/>
+ <use xlink:href="#glyph0-8" x="272.48913" y="93.030677"/>
+ <use xlink:href="#glyph0-9" x="279.386868" y="93.030677"/>
+ <use xlink:href="#glyph0-10" x="286.284606" y="93.030677"/>
+ <use xlink:href="#glyph0-11" x="290.415805" y="93.030677"/>
+ <use xlink:href="#glyph0-12" x="296.618806" y="93.030677"/>
+ <use xlink:href="#glyph0-10" x="303.516544" y="93.030677"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-13" x="269.371547" y="268.782848"/>
+ <use xlink:href="#glyph0-9" x="276.269285" y="268.782848"/>
+ <use xlink:href="#glyph0-3" x="283.167023" y="268.782848"/>
+ <use xlink:href="#glyph0-6" x="290.064761" y="268.782848"/>
+ <use xlink:href="#glyph0-14" x="296.962499" y="268.782848"/>
+ <use xlink:href="#glyph0-9" x="303.860236" y="268.782848"/>
+ <use xlink:href="#glyph0-6" x="310.757974" y="268.782848"/>
+ <use xlink:href="#glyph0-12" x="317.655712" y="268.782848"/>
+ <use xlink:href="#glyph0-7" x="324.55345" y="268.782848"/>
+ <use xlink:href="#glyph0-8" x="328.002319" y="268.782848"/>
+ <use xlink:href="#glyph0-9" x="334.900056" y="268.782848"/>
+ <use xlink:href="#glyph0-10" x="341.797794" y="268.782848"/>
+ <use xlink:href="#glyph0-11" x="345.928993" y="268.782848"/>
+ <use xlink:href="#glyph0-12" x="352.131995" y="268.782848"/>
+ <use xlink:href="#glyph0-10" x="359.029733" y="268.782848"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="83.281454" y="268.782848"/>
+ <use xlink:href="#glyph0-7" x="92.238588" y="268.782848"/>
+ <use xlink:href="#glyph0-15" x="95.687457" y="268.782848"/>
+ <use xlink:href="#glyph0-10" x="103.962261" y="268.782848"/>
+ <use xlink:href="#glyph0-12" x="108.09346" y="268.782848"/>
+ <use xlink:href="#glyph0-8" x="114.991198" y="268.782848"/>
+ <use xlink:href="#glyph0-10" x="121.888935" y="268.782848"/>
+ <use xlink:href="#glyph0-2" x="126.020135" y="268.782848"/>
+ <use xlink:href="#glyph0-16" x="132.917872" y="268.782848"/>
+ <use xlink:href="#glyph0-12" x="139.120874" y="268.782848"/>
+ <use xlink:href="#glyph0-11" x="146.018612" y="268.782848"/>
+ <use xlink:href="#glyph0-11" x="152.221613" y="268.782848"/>
+ <use xlink:href="#glyph0-2" x="158.424615" y="268.782848"/>
+ <use xlink:href="#glyph0-10" x="165.322353" y="268.782848"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-17" x="801.796196" y="217.090709"/>
+ <use xlink:href="#glyph0-18" x="810.75333" y="217.090709"/>
+ <use xlink:href="#glyph0-19" x="818.333398" y="217.090709"/>
+ <use xlink:href="#glyph0-13" x="828.667599" y="217.090709"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-13" x="801.796196" y="258.443594"/>
+ <use xlink:href="#glyph0-9" x="808.693934" y="258.443594"/>
+ <use xlink:href="#glyph0-18" x="815.591672" y="258.443594"/>
+ <use xlink:href="#glyph0-12" x="823.17174" y="258.443594"/>
+ <use xlink:href="#glyph0-20" x="830.069477" y="258.443594"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-21" x="801.796196" y="294.628229"/>
+ <use xlink:href="#glyph0-18" x="810.75333" y="294.628229"/>
+ <use xlink:href="#glyph0-22" x="818.333398" y="294.628229"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-20" x="801.796196" y="175.737824"/>
+ <use xlink:href="#glyph0-19" x="810.071" y="175.737824"/>
+ <use xlink:href="#glyph0-13" x="820.405201" y="175.737824"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-5" x="202.173168" y="284.290352"/>
+ <use xlink:href="#glyph0-3" x="204.9273" y="284.290352"/>
+ <use xlink:href="#glyph0-8" x="211.825038" y="284.290352"/>
+ <use xlink:href="#glyph0-14" x="218.722776" y="284.290352"/>
+ <use xlink:href="#glyph0-23" x="225.620514" y="284.290352"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-11" x="202.173168" y="299.797856"/>
+ <use xlink:href="#glyph0-23" x="208.376169" y="299.797856"/>
+ <use xlink:href="#glyph0-10" x="211.825038" y="299.797856"/>
+ <use xlink:href="#glyph0-5" x="215.956237" y="299.797856"/>
+ <use xlink:href="#glyph0-3" x="218.71037" y="299.797856"/>
+ <use xlink:href="#glyph0-6" x="225.608108" y="299.797856"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-12" x="388.263216" y="284.290352"/>
+ <use xlink:href="#glyph0-3" x="395.160953" y="284.290352"/>
+ <use xlink:href="#glyph0-23" x="402.058691" y="284.290352"/>
+ <use xlink:href="#glyph0-10" x="405.50756" y="284.290352"/>
+ <use xlink:href="#glyph0-24" x="409.638759" y="284.290352"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-23" x="388.263216" y="299.797856"/>
+ <use xlink:href="#glyph0-10" x="391.712084" y="299.797856"/>
+ <use xlink:href="#glyph0-12" x="395.843284" y="299.797856"/>
+ <use xlink:href="#glyph0-12" x="402.741021" y="299.797856"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-5" x="0.575593" y="248.105717"/>
+ <use xlink:href="#glyph0-3" x="3.329725" y="248.105717"/>
+ <use xlink:href="#glyph0-8" x="10.227463" y="248.105717"/>
+ <use xlink:href="#glyph0-14" x="17.125201" y="248.105717"/>
+ <use xlink:href="#glyph0-23" x="24.022939" y="248.105717"/>
+ <use xlink:href="#glyph0-7" x="27.471808" y="248.105717"/>
+ <use xlink:href="#glyph0-4" x="30.920676" y="248.105717"/>
+ <use xlink:href="#glyph0-5" x="34.369545" y="248.105717"/>
+ <use xlink:href="#glyph0-25" x="37.123678" y="248.105717"/>
+ <use xlink:href="#glyph0-12" x="39.877811" y="248.105717"/>
+ <use xlink:href="#glyph0-11" x="46.775549" y="248.105717"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-19" x="801.796196" y="330.812864"/>
+ <use xlink:href="#glyph0-9" x="812.130397" y="330.812864"/>
+ <use xlink:href="#glyph0-3" x="819.028135" y="330.812864"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-16" x="284.879051" y="25.832297"/>
+ <use xlink:href="#glyph0-2" x="291.082053" y="25.832297"/>
+ <use xlink:href="#glyph0-3" x="297.979791" y="25.832297"/>
+ <use xlink:href="#glyph0-4" x="304.877529" y="25.832297"/>
+ <use xlink:href="#glyph0-5" x="308.326398" y="25.832297"/>
+ <use xlink:href="#glyph0-6" x="311.08053" y="25.832297"/>
+ <use xlink:href="#glyph0-7" x="317.978268" y="25.832297"/>
+ <use xlink:href="#glyph0-4" x="321.427137" y="25.832297"/>
+ <use xlink:href="#glyph0-5" x="324.876006" y="25.832297"/>
+ <use xlink:href="#glyph0-25" x="327.630139" y="25.832297"/>
+ <use xlink:href="#glyph0-12" x="330.384271" y="25.832297"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-26" x="512.321984" y="351.489881"/>
+ <use xlink:href="#glyph0-10" x="519.219722" y="351.489881"/>
+ <use xlink:href="#glyph0-5" x="523.350921" y="351.489881"/>
+ <use xlink:href="#glyph0-27" x="526.105054" y="351.489881"/>
+ <use xlink:href="#glyph0-12" x="532.308055" y="351.489881"/>
+ <use xlink:href="#glyph0-11" x="539.205793" y="351.489881"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-26" x="574.352" y="253.275344"/>
+ <use xlink:href="#glyph0-10" x="581.249738" y="253.275344"/>
+ <use xlink:href="#glyph0-5" x="585.380937" y="253.275344"/>
+ <use xlink:href="#glyph0-27" x="588.13507" y="253.275344"/>
+ <use xlink:href="#glyph0-12" x="594.338071" y="253.275344"/>
+ <use xlink:href="#glyph0-11" x="601.235809" y="253.275344"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-6" x="134.972261" y="191.245328"/>
+ <use xlink:href="#glyph0-12" x="141.869998" y="191.245328"/>
+ <use xlink:href="#glyph0-23" x="148.767736" y="191.245328"/>
+ <use xlink:href="#glyph0-7" x="152.216605" y="191.245328"/>
+ <use xlink:href="#glyph0-11" x="155.665474" y="191.245328"/>
+ <use xlink:href="#glyph0-12" x="161.868475" y="191.245328"/>
+ <use xlink:href="#glyph0-23" x="168.766213" y="191.245328"/>
+ <use xlink:href="#glyph0-23" x="172.215082" y="191.245328"/>
+ <use xlink:href="#glyph0-5" x="175.663951" y="191.245328"/>
+ <use xlink:href="#glyph0-3" x="178.418084" y="191.245328"/>
+ <use xlink:href="#glyph0-6" x="185.315822" y="191.245328"/>
+ <use xlink:href="#glyph0-11" x="192.213559" y="191.245328"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-12" x="424.445324" y="356.658245"/>
+ <use xlink:href="#glyph0-3" x="431.343062" y="356.658245"/>
+ <use xlink:href="#glyph0-23" x="438.240799" y="356.658245"/>
+ <use xlink:href="#glyph0-10" x="441.689668" y="356.658245"/>
+ <use xlink:href="#glyph0-24" x="445.820867" y="356.658245"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-23" x="424.445324" y="372.165749"/>
+ <use xlink:href="#glyph0-10" x="427.894193" y="372.165749"/>
+ <use xlink:href="#glyph0-12" x="432.025392" y="372.165749"/>
+ <use xlink:href="#glyph0-12" x="438.92313" y="372.165749"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-26" x="620.873248" y="341.150741"/>
+ <use xlink:href="#glyph0-10" x="627.770986" y="341.150741"/>
+ <use xlink:href="#glyph0-5" x="631.902185" y="341.150741"/>
+ <use xlink:href="#glyph0-27" x="634.656318" y="341.150741"/>
+ <use xlink:href="#glyph0-12" x="640.85932" y="341.150741"/>
+ <use xlink:href="#glyph0-11" x="647.757057" y="341.150741"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-26" x="564.01286" y="491.056199"/>
+ <use xlink:href="#glyph0-10" x="570.910598" y="491.056199"/>
+ <use xlink:href="#glyph0-5" x="575.041797" y="491.056199"/>
+ <use xlink:href="#glyph0-27" x="577.795929" y="491.056199"/>
+ <use xlink:href="#glyph0-12" x="583.998931" y="491.056199"/>
+ <use xlink:href="#glyph0-11" x="590.896669" y="491.056199"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-23" x="279.70816" y="434.195765"/>
+ <use xlink:href="#glyph0-9" x="283.157029" y="434.195765"/>
+ <use xlink:href="#glyph0-6" x="290.054767" y="434.195765"/>
+ <use xlink:href="#glyph0-7" x="296.952505" y="434.195765"/>
+ <use xlink:href="#glyph0-4" x="300.401374" y="434.195765"/>
+ <use xlink:href="#glyph0-5" x="303.850243" y="434.195765"/>
+ <use xlink:href="#glyph0-25" x="306.604375" y="434.195765"/>
+ <use xlink:href="#glyph0-12" x="309.358508" y="434.195765"/>
+ <use xlink:href="#glyph0-7" x="316.256246" y="434.195765"/>
+ <use xlink:href="#glyph0-8" x="319.705115" y="434.195765"/>
+ <use xlink:href="#glyph0-9" x="326.602853" y="434.195765"/>
+ <use xlink:href="#glyph0-10" x="333.50059" y="434.195765"/>
+ <use xlink:href="#glyph0-11" x="337.631789" y="434.195765"/>
+ <use xlink:href="#glyph0-12" x="343.834791" y="434.195765"/>
+ <use xlink:href="#glyph0-10" x="350.732529" y="434.195765"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-28" x="579.520364" y="423.857888"/>
+ <use xlink:href="#glyph0-2" x="588.477498" y="423.857888"/>
+ <use xlink:href="#glyph0-16" x="595.375236" y="423.857888"/>
+ <use xlink:href="#glyph0-7" x="601.578238" y="423.857888"/>
+ <use xlink:href="#glyph0-15" x="605.027106" y="423.857888"/>
+ <use xlink:href="#glyph0-9" x="613.301911" y="423.857888"/>
+ <use xlink:href="#glyph0-10" x="620.199648" y="423.857888"/>
+ <use xlink:href="#glyph0-11" x="624.330847" y="423.857888"/>
+ <use xlink:href="#glyph0-12" x="630.533849" y="423.857888"/>
+ <use xlink:href="#glyph0-10" x="637.431587" y="423.857888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-29" x="465.798208" y="537.579952"/>
+ <use xlink:href="#glyph0-2" x="474.073013" y="537.579952"/>
+ <use xlink:href="#glyph0-14" x="480.97075" y="537.579952"/>
+ <use xlink:href="#glyph0-10" x="487.868488" y="537.579952"/>
+ <use xlink:href="#glyph0-16" x="491.999687" y="537.579952"/>
+ <use xlink:href="#glyph0-12" x="498.202689" y="537.579952"/>
+ <use xlink:href="#glyph0-7" x="505.100427" y="537.579952"/>
+ <use xlink:href="#glyph0-15" x="508.549295" y="537.579952"/>
+ <use xlink:href="#glyph0-9" x="516.8241" y="537.579952"/>
+ <use xlink:href="#glyph0-10" x="523.721837" y="537.579952"/>
+ <use xlink:href="#glyph0-11" x="527.853036" y="537.579952"/>
+ <use xlink:href="#glyph0-12" x="534.056038" y="537.579952"/>
+ <use xlink:href="#glyph0-10" x="540.953776" y="537.579952"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-28" x="460.628696" y="268.782848"/>
+ <use xlink:href="#glyph0-9" x="469.58583" y="268.782848"/>
+ <use xlink:href="#glyph0-23" x="476.483568" y="268.782848"/>
+ <use xlink:href="#glyph0-9" x="479.932437" y="268.782848"/>
+ <use xlink:href="#glyph0-7" x="486.830175" y="268.782848"/>
+ <use xlink:href="#glyph0-2" x="490.279043" y="268.782848"/>
+ <use xlink:href="#glyph0-10" x="497.176781" y="268.782848"/>
+ <use xlink:href="#glyph0-6" x="501.30798" y="268.782848"/>
+ <use xlink:href="#glyph0-9" x="508.205718" y="268.782848"/>
+ <use xlink:href="#glyph0-3" x="515.103456" y="268.782848"/>
+ <use xlink:href="#glyph0-5" x="522.001194" y="268.782848"/>
+ <use xlink:href="#glyph0-11" x="524.755326" y="268.782848"/>
+ <use xlink:href="#glyph0-12" x="530.958328" y="268.782848"/>
+ <use xlink:href="#glyph0-10" x="537.856066" y="268.782848"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-30" x="636.367175" y="268.782848"/>
+ <use xlink:href="#glyph0-14" x="646.019045" y="268.782848"/>
+ <use xlink:href="#glyph0-23" x="652.916783" y="268.782848"/>
+ <use xlink:href="#glyph0-8" x="656.365652" y="268.782848"/>
+ <use xlink:href="#glyph0-14" x="663.26339" y="268.782848"/>
+ <use xlink:href="#glyph0-23" x="670.161127" y="268.782848"/>
+ <use xlink:href="#glyph0-7" x="673.609996" y="268.782848"/>
+ <use xlink:href="#glyph0-6" x="677.058865" y="268.782848"/>
+ <use xlink:href="#glyph0-12" x="683.956603" y="268.782848"/>
+ <use xlink:href="#glyph0-3" x="690.854341" y="268.782848"/>
+ <use xlink:href="#glyph0-12" x="697.752079" y="268.782848"/>
+ <use xlink:href="#glyph0-10" x="704.649816" y="268.782848"/>
+ <use xlink:href="#glyph0-9" x="708.781015" y="268.782848"/>
+ <use xlink:href="#glyph0-23" x="715.678753" y="268.782848"/>
+ <use xlink:href="#glyph0-2" x="719.127622" y="268.782848"/>
+ <use xlink:href="#glyph0-10" x="726.02536" y="268.782848"/>
+ <use xlink:href="#glyph0-11" x="730.156559" y="268.782848"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-26" x="569.181224" y="547.917875"/>
+ <use xlink:href="#glyph0-10" x="576.078962" y="547.917875"/>
+ <use xlink:href="#glyph0-5" x="580.210161" y="547.917875"/>
+ <use xlink:href="#glyph0-27" x="582.964293" y="547.917875"/>
+ <use xlink:href="#glyph0-12" x="589.167295" y="547.917875"/>
+ <use xlink:href="#glyph0-11" x="596.065033" y="547.917875"/>
+</g>
+</g>
+</svg>
diff --git a/doc/autolink.doc b/doc/autolink.doc
index bf9fe57..6e02cb3 100644
--- a/doc/autolink.doc
+++ b/doc/autolink.doc
@@ -112,7 +112,7 @@
\par Example:
\include autolink.cpp
\htmlonly
- Click <a href="examples/autolink/html/index.html">here</a>
+ Click <a href="examples/autolink/html/class_autolink___test.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
\latexonly
diff --git a/doc/changelog.doc b/doc/changelog.doc
index 6f98f47..0af6fd7 100755..100644
--- a/doc/changelog.doc
+++ b/doc/changelog.doc
@@ -1,7 +1,658 @@
/** \page changelog Changelog
\tableofcontents{html,latex}
+\section log_1_9 1.9 Series
+
+\subsection log_1_9_0 Release 1.9.0
+\htmlonly
+<b>(release date 27-12-2020)</b>
+</p>
+<h3>Bug fixes</h3>
+<ul>
+<li>issue #697: Test 32 reference to bell signal (XHTML, LaTeX) [<a href="https://github.com/doxygen/doxygen/commit/06eb8c6edcb0df79717f9cf3afb4061b57157382">view</a>]</li>
+<li>issue #7976: bug_786382 Unmatched single quote in C++ source breaks aliases [<a href="https://github.com/doxygen/doxygen/commit/942fcfaf391d1213bee26e43249fea8da723d714">view</a>]</li>
+<li>issue #6442: C++: Trailing return type syntax + void [<a href="https://github.com/doxygen/doxygen/commit/74d43fa25c5db5c1b0fc6ed45a725aaee972b1b7">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/d6567641ef09bc125e3b722db7a202c12bf27913">view</a>]</li>
+<li>issue #6471: Out-of-line documentation of scoped enums [<a href="https://github.com/doxygen/doxygen/commit/9bf7658013e49dabaafb818a639b5ca62f845538">view</a>]</li>
+<li>issue #7471: [1.8.16 regression] multiple use of page label [<a href="https://github.com/doxygen/doxygen/commit/ae4e0e0e55bbadc6621ba25a095eb90458ae818e">view</a>]</li>
+<li>issue #7547: Fix permodgen issue [<a href="https://github.com/doxygen/doxygen/commit/d75a287f2c5fc37cde07006bec7d027453d9827b">view</a>]</li>
+<li>issue #7556: ANSI-C anonymous (unnamed) struct/unions duplicated names [<a href="https://github.com/doxygen/doxygen/commit/7bd775a7d8c4d74ce075ba3bb399c5dbff08b325">view</a>]</li>
+<li>issue #7706: Md5 hash does not match for two different runs [<a href="https://github.com/doxygen/doxygen/commit/c3d98a0794c8bd8246e06a21b41cd594bcdb3725">view</a>]</li>
+<li>issue #7872: A define containing a doxygen start of comment breaks the parser [<a href="https://github.com/doxygen/doxygen/commit/f2de7e59db40daf9efde55bba111e9f4a98ef59f">view</a>]</li>
+<li>issue #7927: PREDEFINED fails to replace argument [<a href="https://github.com/doxygen/doxygen/commit/075771fd46ee7e6e4c7572b84cff194e887eddf4">view</a>]</li>
+<li>issue #7977: Broken ref for enum entry (doxygen 1.8.18 -&gt; 1.8.19) [<a href="https://github.com/doxygen/doxygen/commit/63dc5b9b1b3e8fb875304a954e4df934b249034b">view</a>]</li>
+<li>issue #7979: C++ enums being defined in multiple files after b265433 (multi-thread input processing) [<a href="https://github.com/doxygen/doxygen/commit/9d9d08582ccea7ef90000acebfd09f8c8acc577a">view</a>]</li>
+<li>issue #7981: bug_647654 Special command \fn fails when first argument of PHP function is call-by-reference [<a href="https://github.com/doxygen/doxygen/commit/1d8610c90ba279bb207f0d45f96cef3054ff34eb">view</a>]</li>
+<li>issue #7991: bug 789318 c# expression-bodied property is not rendered correctly [<a href="https://github.com/doxygen/doxygen/commit/e8c1817bdd8341da752f31259953d21e9d36418f">view</a>]</li>
+<li>issue #7995: Doxygen doesn&#39;t handle very simple example in the .md file [<a href="https://github.com/doxygen/doxygen/commit/7c429806b072dd8bf777d93035ffda817976adc0">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/d3d9dd8540ec159de080859c8f34a2581c4147f0">view</a>]</li>
+<li>issue #7996: \ref commands broken in markdown tables [<a href="https://github.com/doxygen/doxygen/commit/fa32d44f237ca9ebeaf0d4da6545c977c50ca34c">view</a>]</li>
+<li>issue #8015: Special command \skip and \until no longer functional in ALIASES [<a href="https://github.com/doxygen/doxygen/commit/17d14c68608808e2688df8073294aec2094bf1fd">view</a>]</li>
+<li>issue #8017: C++: mishandling of brackets used in trailing return types [<a href="https://github.com/doxygen/doxygen/commit/8cabc84a0f7b741e84aabe45c97f7aeca0eb53e0">view</a>]</li>
+<li>issue #8022: Different results on 64 and 32 bit [<a href="https://github.com/doxygen/doxygen/commit/1fda77f54a2eacba32658001329bd9084f4df1e7">view</a>]</li>
+<li>issue #8023: Add option to exit with non-zero exit code on warnings even if WARN_AS_ERROR is OFF [<a href="https://github.com/doxygen/doxygen/commit/b88e8097acdb30175c024ed47258739cec30f903">view</a>]</li>
+<li>issue #8034: doxygen crashes [<a href="https://github.com/doxygen/doxygen/commit/d067baf495d0415283ce724ad32cb9a08dc17c83">view</a>]</li>
+<li>issue #8037: Links using @ref stopped working in doxygen 1.8.19 [<a href="https://github.com/doxygen/doxygen/commit/dfc82af001c56254c6fde0affd009f80e19b1548">view</a>]</li>
+<li>issue #8050: Artificial classDef confuses getCanonicalTypeForIdentifier() [<a href="https://github.com/doxygen/doxygen/commit/c5ffcd673f5fca4f9af96f92a0184ce287599a0f">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/d936554037ac9c46184cb55d118d0007144b6bd9">view</a>]</li>
+<li>issue #8051: Consider documenting debug options of doxygen [<a href="https://github.com/doxygen/doxygen/commit/6d59324e04641955edfc2ba2001bd597afc5163a">view</a>]</li>
+<li>issue #8053: error: Attribute target redefined in SVG [<a href="https://github.com/doxygen/doxygen/commit/ff021223c89995bf2abc4f33befddb1c97cab1d8">view</a>]</li>
+<li>issue #8063: Failed to build current &quot;master&quot; branch [<a href="https://github.com/doxygen/doxygen/commit/b3720aec2c0251d246544c2b30d15b092c9c7c25">view</a>]</li>
+<li>issue #8066: Doxygen crashes in ClangTUParser [<a href="https://github.com/doxygen/doxygen/commit/02b8dea10813606db4a013799a3e354368d0280f">view</a>]</li>
+<li>issue #8070: C++: \var don&#39;t document enum class values [<a href="https://github.com/doxygen/doxygen/commit/4e75d77f60bd173019247177686376ce36ace90b">view</a>]</li>
+<li>issue #8078: Warning and extra text when using Markdown as mainpage [<a href="https://github.com/doxygen/doxygen/commit/a05a7ae2e65b9e438327d4a50c81df18f2b49a4d">view</a>]</li>
+<li>issue #8091: [C++] Newer doxygen versions add a lot of bogus warnings about undocumented entities [<a href="https://github.com/doxygen/doxygen/commit/01ded6f6963d4798ce1338246d6d946dbc3922d9">view</a>]</li>
+<li>issue #8093: Some URLs in fresh/updated Doxyfile are split over two lines [<a href="https://github.com/doxygen/doxygen/commit/b1b9d28cdc4e43668df70d67f36d12c3d4e16d88">view</a>]</li>
+<li>issue #8098: Python Decorator written below @brief tag and above the function leads to documentation error [<a href="https://github.com/doxygen/doxygen/commit/e31d4c8092bcac54b4b820b9d995fce8cd5a78c5">view</a>]</li>
+<li>issue #8102: [C++] Reference relations are not generated for constructors using list initialization [<a href="https://github.com/doxygen/doxygen/commit/96378244a8b1874df95dd5983702e87f69b31a48">view</a>]</li>
+<li>issue #8103: C++ Table of content, namespace list does not contains namespace without class [<a href="https://github.com/doxygen/doxygen/commit/e847d5dc322740b0097f56fc19311c8c74a44a55">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/33b0f4d25dff25b0e50d62eff68155106e88d58d">view</a>]</li>
+<li>issue #8105: How do add (multiple files without extension) directory in INPUT field of doxygen configuration file [<a href="https://github.com/doxygen/doxygen/commit/6e14ace91c407293662c78ad88df1b91aebe9769">view</a>]</li>
+<li>issue #8127: Java: xml output of preformatted (`&lt;pre&gt;`) block adds para-block for blank lines (hindering certain manual parsing) [<a href="https://github.com/doxygen/doxygen/commit/70abd648fd67d3588bc9d6e64f5eeaab575f515f">view</a>]</li>
+<li>issue #8129: Image path is now case sensitive [<a href="https://github.com/doxygen/doxygen/commit/7bd4455f4fb17075eb23f5f24a5735913cde3e16">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/2b5a4541fb6f806c02a1f6e65a1ff2610f29751f">view</a>]</li>
+<li>issue #8130: Markdown relative links - not working for other folders [<a href="https://github.com/doxygen/doxygen/commit/f674f5bbe7fdec97d8567b7256312d24a49ed924">view</a>]</li>
+<li>issue #8132: Markdown inclusion of images broken after 39db9f48 [<a href="https://github.com/doxygen/doxygen/commit/add763fc5caf6d2be2316ee8c8270fa56940136a">view</a>]</li>
+<li>issue #8137: Whitespace/Separator required to recognize custom command argument [<a href="https://github.com/doxygen/doxygen/commit/8b7993630f08ae499ebca0eb894451c89180199f">view</a>]</li>
+<li>issue #8139: Segfault after a8bf5d3 [<a href="https://github.com/doxygen/doxygen/commit/e63311276e13bbd8ac304ba914bf14022fc1af40">view</a>]</li>
+<li>issue #8142: UTF-8 in URL in source generates truncated URL in HTML [<a href="https://github.com/doxygen/doxygen/commit/c9ae8635949850562efe5ffc1524c84cb2b705cf">view</a>]</li>
+<li>issue #8148: copydoc broken in private sections [<a href="https://github.com/doxygen/doxygen/commit/648b7f6f097e70d097405f6c9fc9e1111ce0d929">view</a>]</li>
+<li>issue #8156: Markdown anchors do not work with special symbols [<a href="https://github.com/doxygen/doxygen/commit/eaf691cc82cb2c819bf61a48265d334464f2d831">view</a>]</li>
+<li>issue #8160: Example in documentation of ALIASES shows using `\n` instead of `^^` [<a href="https://github.com/doxygen/doxygen/commit/9fb944fc99c2963fd010963a7e9f17a994195c6f">view</a>]</li>
+<li>issue #8177: Incorrect inheritance with forward declared templated classes [<a href="https://github.com/doxygen/doxygen/commit/fa65bb38f81457d00f9c900bb57eb68bea59b1b4">view</a>]</li>
+<li>issue #8184: Bad parsing of CMakeLists.txt [<a href="https://github.com/doxygen/doxygen/commit/5cc7fed36c8d3b45eec19b7333b494c1c649902f">view</a>]</li>
+<li>issue #8186: Path resolving breaks on included @ sign [<a href="https://github.com/doxygen/doxygen/commit/ff27d22910eeec1861bea3c7cf9201a25e509f94">view</a>]</li>
+<li>issue #8192: Excluded inline namespace broken after a5792da8 [<a href="https://github.com/doxygen/doxygen/commit/61f8521f768165e02a5f28df3fb442e3b91d170b">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/b2d009555ebce4a6802ac0255c056e880bdb45bd">view</a>]</li>
+<li>Issue #8206: Incorrect XHTML results [<a href="https://github.com/doxygen/doxygen/commit/a292601d5d06cf5993247f2f7a6bc7306997da23">view</a>]</li>
+<li>issue #8246: The prefix &amp;#&Ntilde;&#133;202&ETH;&#144;; for files is displayed incorrectly in the file names. [<a href="https://github.com/doxygen/doxygen/commit/b4d2fccacc226f22f9e2ae0ed016895aceb92053">view</a>]</li>
+<li>issue #8247: declaration different in cpp and h file of qstrncmp [<a href="https://github.com/doxygen/doxygen/commit/c5733d2e19f5de783e776dce05bd48f1a9e99c90">view</a>]</li>
+<li>issue #8251: Macro stopped working in 1.8,.19 [<a href="https://github.com/doxygen/doxygen/commit/7b2e841b3a3d7d787458f236e2447c890cfbf590">view</a>]</li>
+<li>issue #8269: Make failed when building layout.cpp [<a href="https://github.com/doxygen/doxygen/commit/e00dfd2d0ac20c4e25f6452242f65cd82faf9538">view</a>]</li>
+<li>issue #8274: List entries for file &amp; namespace enums (part 2) [<a href="https://github.com/doxygen/doxygen/commit/4a627283263247deccc125d072f23d93057b8a65">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/eb8b6f40d863a8d7d2798a95cbde4200e27d4945">view</a>]</li>
+<li>issue #8143: copydoc in excluded namespace broken after d03e8d9 [<a href="https://github.com/doxygen/doxygen/commit/42d60bd97de0d1fbf85fdc9117e8dd46a026db1b">view</a>]</li>
+<li>issue #8169: &quot;\emoji heavy_check_mark&quot; produces &acirc;&#156;&#147; instead of &acirc;&#156;&#148;&iuml;&cedil;&#143; [<a href="https://github.com/doxygen/doxygen/commit/89e7f7c484af0a5a8cb4083a71958c3a16b0a951">view</a>]</li>
+<li>Added missing protocols [<a href="https://github.com/doxygen/doxygen/commit/acc4b7e99cd05a78d1adbfdab1abc58db342c396">view</a>]</li>
+<li>Avoid duplicate entry in the LaTeX output for inlined namespace [<a href="https://github.com/doxygen/doxygen/commit/f673a99a492397b3647ce07eb9537b8d1522a541">view</a>]</li>
+<li>Concatenation of \param text and \details text [<a href="https://github.com/doxygen/doxygen/commit/ec5c07362270f6c088b831c2560f69b122c1ab5e">view</a>]</li>
+<li>Confusing message for extension mapping for extension with starting dot. [<a href="https://github.com/doxygen/doxygen/commit/e2aae77981716d5234af8aa2d9aac68db8a161ed">view</a>]</li>
+<li>Consistency for use class graphs / class diagrams [<a href="https://github.com/doxygen/doxygen/commit/eeedb6c479665095f69033eab23ab0d8b4d981b5">view</a>]</li>
+<li>Create possibility to show in doxywizard &quot;condensed&quot; settings [<a href="https://github.com/doxygen/doxygen/commit/9f68f7f9932b349d65b6af6059807af55d2e535a">view</a>]</li>
+<li>Creating link to not defined label in case of groups [<a href="https://github.com/doxygen/doxygen/commit/98fa1e02eb69d6738376bb2c5febd0078ca795b5">view</a>]</li>
+<li>Default doxygen search mechanism doesn&#39;t work when using with XHTML output [<a href="https://github.com/doxygen/doxygen/commit/3655a0164951b5bce015196381267d2b878ab901">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/506a794bf146c0d9f46aac831170700822cb7675">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/bc3349e52752dafef47565c54c4145e43885f0d2">view</a>]</li>
+<li>Docbook missing in doxywizard Wizard-Output page [<a href="https://github.com/doxygen/doxygen/commit/c1946161454322b92a3e2837c12a02f1a1de3a4a">view</a>]</li>
+<li>Documentation correction for CASE_SENSE_NAMES [<a href="https://github.com/doxygen/doxygen/commit/1a7d56df56b4f93b539117c4f76c566da0f6e019">view</a>]</li>
+<li>Don&#39;t start dvips when latex fails for formulas [<a href="https://github.com/doxygen/doxygen/commit/5b9a140ded861438b6b630b08f846dd73a60c585">view</a>]</li>
+<li>Double &quot;-&gt;&quot; in warning in case of trailing return type [<a href="https://github.com/doxygen/doxygen/commit/8d976817a0a71411452f213e7c73ee9db1ba8d71">view</a>]</li>
+<li>Doxygen crashes on Fortran [<a href="https://github.com/doxygen/doxygen/commit/7171bbba9259bc7d22e09454ca9d7381d13c94e2">view</a>]</li>
+<li>Doxygen manual top rule is in uppercase. [<a href="https://github.com/doxygen/doxygen/commit/7a3d77897eafcd213197c9229c68429bb4396bbb">view</a>]</li>
+<li>Doxygen&#39;s own documentation doesn&#39;t build with recent LaTeX version [<a href="https://github.com/doxygen/doxygen/commit/8d45cd1895ca7a9a53f9a02cdf7d66c239bdc504">view</a>]</li>
+<li>Doxywizard expert page without settings [<a href="https://github.com/doxygen/doxygen/commit/169f7f0f02541f97ed080634df232e8cc8f3ded8">view</a>]</li>
+<li>Enabling both ALLEXTERNALS and BUILTIN_STL_SUPPORT caused artificial STL classes to appear in the class hierarchy. [<a href="https://github.com/doxygen/doxygen/commit/169d71426d1a42ec294c451af5f901620e6d89e5">view</a>]</li>
+<li>Exclude markdown mapped documentation files from Files list [<a href="https://github.com/doxygen/doxygen/commit/8a20dd6c10c08424dd0ead6e58c2f34d2f90c509">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/92e67d8955dc6360759abfc6debf6aae78ac539f">view</a>]</li>
+<li>Expand non-recursive preprocessor macros [<a href="https://github.com/doxygen/doxygen/commit/6392703db8037e8a501e42d87c1c450c5c2ae95c">view</a>]</li>
+<li>Fix for broken LaTeX output. [<a href="https://github.com/doxygen/doxygen/commit/502e03dad20b333748d73fdea4cf6d7cb0ab31a8">view</a>]</li>
+<li>Fix too aggressive hyphenation of abbr. words. (#8026) [<a href="https://github.com/doxygen/doxygen/commit/58895b1763fbc2d09a180204c831cf204adb5e1c">view</a>]</li>
+<li>Fixed marker replacement for a placeholder at the end of the command [<a href="https://github.com/doxygen/doxygen/commit/cbfc7f9e6a2532f58e736c2049b32bd231efade8">view</a>]</li>
+<li>Fixed more issues handling Java nested generic classes [<a href="https://github.com/doxygen/doxygen/commit/c65daff57d905a2b89bde059e7ccf5ed26584116">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/d590014ca419847f932fc7074794e0a1f1e18110">view</a>]</li>
+<li>Fixed scope resolution problem for nested Java generics [<a href="https://github.com/doxygen/doxygen/commit/04fe3c5dffa6d5fb530311d5763a1310dd1260cc">view</a>]</li>
+<li>Fixed small issue computing indentation for inline line breaks [<a href="https://github.com/doxygen/doxygen/commit/03e0f54b86285e0e6eba07cbdbf407a0522b517d">view</a>]</li>
+<li>Flush warnings file (#8069) [<a href="https://github.com/doxygen/doxygen/commit/21bc8b5077ff95c823f9633f81c0738c271219bd">view</a>]</li>
+<li>Fortran comments with C comments inside (#8000) [<a href="https://github.com/doxygen/doxygen/commit/1206a9b9b49cdd904c1b5f003c874acd94472806">view</a>]</li>
+<li>Handling Enable / Disable menu items (doxywizard) [<a href="https://github.com/doxygen/doxygen/commit/6deb25ba0cb0286f879071d0aaa069c1776fe06f">view</a>]</li>
+<li>Handling commands for backslash and at-sign in ALIASES [<a href="https://github.com/doxygen/doxygen/commit/a4b4398ff7b14f0b5fdccac6bb6334da38ef581d">view</a>]</li>
+<li>Handling of &quot;Cancel&quot; during &quot;Quit&quot; in doxywizard [<a href="https://github.com/doxygen/doxygen/commit/f01df99914ebd405bb76f117b64a12fca620dcb9">view</a>]</li>
+<li>Improve handling of inline namespace members in LateX/RTF output [<a href="https://github.com/doxygen/doxygen/commit/4372054e0b7af9c0cd1c1390859d8fef3581d8bb">view</a>]</li>
+<li>Improved sorting of class list/hierarchy [<a href="https://github.com/doxygen/doxygen/commit/459a66a0f6a8073fce07e3f54858d1d078c3a8d3">view</a>]</li>
+<li>Improvements of reading the configuration file [<a href="https://github.com/doxygen/doxygen/commit/f573b414b482a01e87869a277cdb913d173fc925">view</a>]</li>
+<li>Incorrect checking between default and used values for strList in doxywizard [<a href="https://github.com/doxygen/doxygen/commit/d610c552dbc23f0c036f20ddb1ab8dc64c08e9dc">view</a>]</li>
+<li>Incorrect duplicate code for Fortran fixed/free recognition [<a href="https://github.com/doxygen/doxygen/commit/a88b298bee89f001072c80e32e04dfd855d05c58">view</a>]</li>
+<li>Incorrect end tag in doxywizard [<a href="https://github.com/doxygen/doxygen/commit/99583eeb36711c2ed4261488c2157da0d425fa67">view</a>]</li>
+<li>Incorrect handling of UTF-8 characters in latex reference statement [<a href="https://github.com/doxygen/doxygen/commit/2421a8bb57aad7bbd43dd992d385a59006004f42">view</a>]</li>
+<li>Incorrect handling of string with spaces and no quotes [<a href="https://github.com/doxygen/doxygen/commit/9cfb5e58a6a55b2f87027e7b378001f3f3768423">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/ef91bacb7a69bbf7bccb4a864698cc003aabac66">view</a>]</li>
+<li>Incorrect label / name in case regeneration of HTML without regeneration of dot files [<a href="https://github.com/doxygen/doxygen/commit/939eca311ced62d9cb41d8e3c1acc207c99e09ed">view</a>]</li>
+<li>Incorrect line count in case of an error in msc input [<a href="https://github.com/doxygen/doxygen/commit/a51a6d4845f8a8220700883db7c786a0007f1094">view</a>]</li>
+<li>Incorrect recognition as RCS tag [<a href="https://github.com/doxygen/doxygen/commit/64f6dd32f9c0d0d98bb70dac76af684c608d7dda">view</a>]</li>
+<li>Incorrect sorting of reflist items [<a href="https://github.com/doxygen/doxygen/commit/9b59748f682e5d5cec5faea91a57b8b7291c7105">view</a>]</li>
+<li>Incorrect specification of irc as URL protocol [<a href="https://github.com/doxygen/doxygen/commit/ea5650c7354d57a18ef245b48fdf4bc351524db6">view</a>]</li>
+<li>Join sequences of the same type of xref items together in a single paragraph (restores 1.8.16 behavior) [<a href="https://github.com/doxygen/doxygen/commit/38e56645b7527ce70a90f4fcf1bd046fafc50248">view</a>]</li>
+<li>Lowercase Findxapian module (same casing as upstream xapian-core) [<a href="https://github.com/doxygen/doxygen/commit/af3bb09cfeb60aeda554754f13a939d14e4bbd4e">view</a>]</li>
+<li>Marked the section with definitions regarding numbers more clearly [<a href="https://github.com/doxygen/doxygen/commit/cbefa43c62ed5b19bf82a66dbaf1a4136faac9bd">view</a>]</li>
+<li>Minor tweaks [<a href="https://github.com/doxygen/doxygen/commit/0b54d06d4449d91a0890e589ba48daaf41794284">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/143a69238cfec5a031a4f7fd3ac43ce0ae66f40a">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/7e9ac9f80784eef31fd84c3892115cffb1630f95">view</a>]</li>
+<li>Fixed line number counting issue with test case cc.h [<a href="https://github.com/doxygen/doxygen/commit/f011af81523bd44dc4c446df6e2976d9c1786609">view</a>]</li>
+<li>Fixed various line counting issues resulting in warnings refering to the wrong line number:
+[<a href="https://github.com/doxygen/doxygen/commit/927af4b61fc3bac384aeca0d04ef321c854b3ef0">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/33c29dccd16d96b3a5c29fa476e8e9ce376134cd">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/a5ff8649247c2d79c04f068e91987aecbf01c05b">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/75c5c2837a9652cfa94e349c334d5a8f67b91d60">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/c69542e495a01aca1cb20013d91fda78730d2153">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/53d1bbc3bd7686fccdf61e8212137ebad65c1ece">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/8be6d4ec55738b074a5b0ee225cbde05067222a5">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/b1c78ad5a0f15ae67a70d9d7a36e907ac89734cd">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/39db9f48e6376b62f28c9b85320dd62f76547765">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/b5e77b66a4cea0fbfc011f90993a098bd6651e09">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/9c572e72b1070c5d8b58f7d4b6f72fdaede6e8ed">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/17390b669f7a1017fa937410880da38a540dfa35">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/559fa499528fdbca05c05e0a39ccabd46c9edfc2">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/e9d1556252ceea914f7ca98b85a365cd4af594fe">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/e12fd6904e8cc0785f1e3a7dc48fd87ed522f715">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/f3baca79549205c19cde6712a93982f971b58da5">view</a>],
+[<a href="https://github.com/doxygen/doxygen/commit/254d1106e52f89fc69620dded9a670358818e8e6">view</a>], and
+[<a href="https://github.com/doxygen/doxygen/commit/85fba651ec2a6062e5ab21f06783770ab6fede3b">view</a>]
+</li>
+<li>Missing \noop in list with commands starting with &quot;\n&quot; for escaping in aliases [<a href="https://github.com/doxygen/doxygen/commit/c56443a8f133c8a04aecf3ecae823af75fb348e1">view</a>]</li>
+<li>Missing footer on first page of each chapter in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/24db478285843d3e6afa32af734e29a316f42d62">view</a>]</li>
+<li>Multiple anchors with member-group [<a href="https://github.com/doxygen/doxygen/commit/fada71a46966a83a06df17d220d8ee08a5a927b1">view</a>]</li>
+<li>No warning for unbalanced brackets in markdown [<a href="https://github.com/doxygen/doxygen/commit/6b13bce96c7845c139b7e481c49d5d540f6633d7">view</a>]</li>
+<li>Not always linking in map as maps use name instead if id [<a href="https://github.com/doxygen/doxygen/commit/175b94528ee0f2b51b631a262a053ec15f497738">view</a>]</li>
+<li>Optimization for Slice missing in doxywizard Wizard-Mode page [<a href="https://github.com/doxygen/doxygen/commit/7ca670edb21bc9755045bacb775c95c4a755c706">view</a>]</li>
+<li>Optimized the escape function and made it more generic [<a href="https://github.com/doxygen/doxygen/commit/c48c5eb3c68a9b5f3f82d1d186a6695ed1d30db5">view</a>]</li>
+<li>Prettify the HTML output when enabling SEPARATE_MEMBER_PAGES [<a href="https://github.com/doxygen/doxygen/commit/07767300c3d5bfe256d14ec5bc5a03f5f6d88e4f">view</a>]</li>
+<li>Problem with `\\` at end of an ALIASES in the configuration file [<a href="https://github.com/doxygen/doxygen/commit/47c34e3d3ec7143ce69f53ef3a2c1ddcf6ab8065">view</a>]</li>
+<li>Proposed fix for Internal search engine produce ".html" pages instead of using HTML_FILE_EXTENSION [<a href="https://github.com/doxygen/doxygen/commit/49ed5387d6a80bbbff3544293cd30c0184abd1ec">view</a>]</li>
+<li>Protect mutable access to members in code generators with mutexes [<a href="https://github.com/doxygen/doxygen/commit/f651a0ac32060907b43eb6ccc7f1472986034270">view</a>]</li>
+<li>Readability of warning message [<a href="https://github.com/doxygen/doxygen/commit/e1f55871fa67b5d88330a45b4b7d06ac492f0266">view</a>]</li>
+<li>Recent file list of doxywizard not cleared properly [<a href="https://github.com/doxygen/doxygen/commit/97d0ba731e46d2e79d40dc34a2a43c96d6951969">view</a>]</li>
+<li>Redundant storage of `VhdlParser_adj.cc`, it can be regenerated [<a href="https://github.com/doxygen/doxygen/commit/b4ac6562a715711128720adbeec89ac7125317e9">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/e0468ef6f19af8f320db49004e875f482e606c28">view</a>]</li>
+<li>Renamed EXTRACT_ANON_ARGUMENTS to RESOLVE_UNNAMED_PARAMS and enabled it by default [<a href="https://github.com/doxygen/doxygen/commit/09b04bcb61a0e127cf502bc0533cd9bce9293406">view</a>]</li>
+<li>Silently ignoring unexpected characters in configuration [<a href="https://github.com/doxygen/doxygen/commit/d2c98cdbc5a66a95fd4a1d68ff21c371d31288a4">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/e1dfd05428008ba61acbb083d7903413b52a8c12">view</a>]</li>
+<li>Simplified escaping for latex URLs [<a href="https://github.com/doxygen/doxygen/commit/736557cabb38a37f12cb630adca9ef693646a980">view</a>]</li>
+<li>Some further simplications and modernisations [<a href="https://github.com/doxygen/doxygen/commit/539b3bbef61dc7dec8cd5987dc2dbb7a2a956a83">view</a>]</li>
+<li>Some tweaks &amp; fixes [<a href="https://github.com/doxygen/doxygen/commit/0006f830184ea30abdd9eb13e79ca2587004a63d">view</a>]</li>
+<li>Space around images in LaTeX output is sometimes a bit large [<a href="https://github.com/doxygen/doxygen/commit/89c4556edfc7ca5cac9c2e0171e3be9441990a91">view</a>]</li>
+<li>Split into separate rules [<a href="https://github.com/doxygen/doxygen/commit/7b57fa9934130b78e0a70b2406b3627a6d4dce1b">view</a>]</li>
+<li>Split lexer rules [<a href="https://github.com/doxygen/doxygen/commit/7eeef98f103a9e62ef1ec44153fbdb630925a2a1">view</a>]</li>
+<li>Support commented out argument names in declarations controlled by new cofig EXTRACT_ANON_ARGUMENTS. [<a href="https://github.com/doxygen/doxygen/commit/970b3469a3beaf7041a2efce8d81515077003232">view</a>]</li>
+<li>Translation function trCompoundListDescription no entry for SLICE [<a href="https://github.com/doxygen/doxygen/commit/e813676ad74eeab4f469bfbb3ff3977a3a2239cf">view</a>]</li>
+<li>Typo in namespacedef.h [<a href="https://github.com/doxygen/doxygen/commit/64c096935496bc513c6b85dca1d526b50f9fed5f">view</a>]</li>
+<li>Unclear description of QHG_LOCATION [<a href="https://github.com/doxygen/doxygen/commit/bd6e1b03fc85086abcd920a9d4cee0291d8bf56f">view</a>]</li>
+<li>Unified the routine to get the next UTF8 character from a UTF8 stream [<a href="https://github.com/doxygen/doxygen/commit/0404d8ba32b97193822b5d72db2788aff8c3ac9f">view</a>]</li>
+<li>Update CMakeLists.txt [<a href="https://github.com/doxygen/doxygen/commit/7eff1f27f6edd509f2c5c472cd76d13691cd437a">view</a>]</li>
+<li>Update config.xml [<a href="https://github.com/doxygen/doxygen/commit/9bbd3f5b9b63133e925c30e8acb7615fdbe8c297">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/a29a2efd84101509aaebc61ecfa9139a45fb5e15">view</a>]</li>
+<li>Update markdown.cpp [<a href="https://github.com/doxygen/doxygen/commit/b035a11197f69770db5c7ebfb50cb42afc22468d">view</a>]</li>
+<li>Usage of version and help in addons [<a href="https://github.com/doxygen/doxygen/commit/b320b14cdfee48a90a732304d6398eb388b1c975">view</a>]</li>
+<li>Use correct #include [<a href="https://github.com/doxygen/doxygen/commit/5f34e8ae667c24900e61c72e7dfc213d53a7cb05">view</a>]</li>
+<li>Using f() instead f(void) in C++ , consistency [<a href="https://github.com/doxygen/doxygen/commit/7fdd68ca7cbf107a76c233d0e3a9c4c38bd90f90">view</a>]</li>
+<li>Warning about duplicate figure numbers in LaTeX [<a href="https://github.com/doxygen/doxygen/commit/1084519cd410bacb997b1ddd705800412450241b">view</a>]</li>
+<li>Warning about end of list in brief description after alias `^^` replacement [<a href="https://github.com/doxygen/doxygen/commit/5be9f2b42ec02735712aa68198da1d5056d08ef6">view</a>]</li>
+<li>Warning about possible loss of data [<a href="https://github.com/doxygen/doxygen/commit/aad2c7ae4db355c68d1b87ad29e9bf47f8b7652e">view</a>]</li>
+<li>Warning in internal documentation [<a href="https://github.com/doxygen/doxygen/commit/a4a7f0a5494c5232c61859dc4e17d0043a31693c">view</a>]</li>
+<li>Warnings during compilation of doctokinizer [<a href="https://github.com/doxygen/doxygen/commit/9075fef193e6909b25e67ec9e6aa8dde1503c255">view</a>]</li>
+<li>Warnings in generated VhdlParser.cc [<a href="https://github.com/doxygen/doxygen/commit/32c7576977f44c054591f0cb7b75f9b7f81689d2">view</a>]</li>
+<li>When instantiating templates also instantiate nested classes [<a href="https://github.com/doxygen/doxygen/commit/a945d52a62b73b23674f6dc0948e22011e278cf9">view</a>]</li>
+<li>XHML: div tag not possible as part of a p tag. [<a href="https://github.com/doxygen/doxygen/commit/1525b66e12ed8dba34e12786500422a74387cd29">view</a>]</li>
+<li>extend the max lenght befor a sting is folded [<a href="https://github.com/doxygen/doxygen/commit/e97b0c6f1ced61c18621fb4f0d5fe90e11d982ce">view</a>]</li>
+<li>quotes added surrounding inheritance tokens on doxyparse output [<a href="https://github.com/doxygen/doxygen/commit/77b4c3bc7cba2d06fa2c03fbf55f5da4f71eb72c">view</a>]</li>
+</ul>
+<h3>Features</h3>
+<ul>
+<li>Show QT version in doxywizard [<a href="https://github.com/doxygen/doxygen/commit/b26ec711d6b13578c283ab41ef6d46523ec77777">view</a>]</li>
+<li>Adding possibility to add command line options when running doxygen from doxygen wizard [<a href="https://github.com/doxygen/doxygen/commit/70e5213d3646460ce3a31a9afbcb498cdaa2b5b9">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/e78c2e47afa40408dc95de50451e997d0ab357c0">view</a>]</li>
+<li>Add param validation to typedef function pointers [<a href="https://github.com/doxygen/doxygen/commit/d34236ba40379847ad4ee3140366bee37b652615">view</a>]</li>
+<li>Allow building doxygen as a subproject [<a href="https://github.com/doxygen/doxygen/commit/e7311a036e16cf56692862103be37df95853a1dc">view</a>]</li>
+<li>Layout changes doxywizard [<a href="https://github.com/doxygen/doxygen/commit/1113c6fb614de24fae90afbffc05259b89d1d300">view</a>]</li>
+<li>Show configuration warnings unconditionally in the doxywizard [<a href="https://github.com/doxygen/doxygen/commit/92f9149ecf34dd1a7f19204ae7aff39c08dacc93">view</a>]</li>
+<li>Enable UML diagrams without member fields [<a href="https://github.com/doxygen/doxygen/commit/cea53616cee27e1fe597421a7cb7b2bf8bcb2b7f">view</a>]</li>
+<li>add variable for the fold length of UML diagrams (DOT_WRAP_THRESHOLD) [<a href="https://github.com/doxygen/doxygen/commit/78f57f623c45c92f4fb2740300b44b9b68c42bcc">view</a>]</li>
+<li>use boolean to add or remove uml details (DOT_UML_DETAILS) [<a href="https://github.com/doxygen/doxygen/commit/a49a5d4c687742a6eaf516d79d2dff399aad12dc">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/3175b34cc09c59300d5ad2868ab6aba6f4ad0646">view</a>]</li>
+<li>add suggestion #7686 to show type and parameters [<a href="https://github.com/doxygen/doxygen/commit/1263d3085da9e2c8fb8f42ea98c107347efb529f">view</a>]</li>
+</ul>
+<h3>Refactoring and cleanup</h3>
+<ul>
+<li>Position of layout_default.xml [<a href="https://github.com/doxygen/doxygen/commit/cb351b9cfc13ea5f4049182a2b922ea667f06045">view</a>]</li>
+<li>Fix some issues in reporting warnings for Doxywizard&#39;s config parser [<a href="https://github.com/doxygen/doxygen/commit/479c58af242b7754775dca646e6ed74a92d58f76">view</a>]</li>
+<li>Introduce ScopedTypeVariant [<a href="https://github.com/doxygen/doxygen/commit/0bf6993635a859867db545c89a0712ba94e6c217">view</a>]</li>
+<li>Introduce immutable and mutable interfaces [<a href="https://github.com/doxygen/doxygen/commit/075229e586b391c3ec7ad79597aaeae392ca64e5">view</a>]</li>
+<li>Modernise DotGfxHierarchyTable [<a href="https://github.com/doxygen/doxygen/commit/fce7c2f8af2ccd04137c7db163333d0110241835">view</a>]</li>
+<li>Modernise diagram.h/diagram.cpp [<a href="https://github.com/doxygen/doxygen/commit/2442e7c5c2c8ac2879486a8d01ce8cdf8a6965bb">view</a>]</li>
+<li>Modernise BaseClassList [<a href="https://github.com/doxygen/doxygen/commit/86904d5b9752d35ff83bab14969314913f945d5b">view</a>]</li>
+<li>OutputList &amp; OutputGen [<a href="https://github.com/doxygen/doxygen/commit/0815bb7d5c99fccdbdba24fb933f9e7fce29bbc6">view</a>]</li>
+<li>Re-added sorting for namespaces [<a href="https://github.com/doxygen/doxygen/commit/e89966fc9be09a6cfa6cd39204445059d52f6ca3">view</a>]</li>
+<li>Remove unused DefinitionIntf and DefinitionList classes [<a href="https://github.com/doxygen/doxygen/commit/e22e89c0ed1c4fbf22021f4446a2900c65214cf2">view</a>]</li>
+<li>Remove use of globals/statics in isAccessibleFrom* [<a href="https://github.com/doxygen/doxygen/commit/8a93f4e00b6922526935909312dabbd9a566d5cc">view</a>]</li>
+<li>Better processing of (un)quoted values for tags in the configuration file [<a href="https://github.com/doxygen/doxygen/commit/eb3d1eb5ad85c94d6f2c32934fce2b8630331d6c">view</a>]</li>
+<li>Better processing of (un)quoted values for tags in the configuration file (part 2) [<a href="https://github.com/doxygen/doxygen/commit/e0c4e9f3a5416d53aa4da381ce6804022106fa83">view</a>]</li>
+<li>Introduce SymbolResolver to group symbol lookup routines [<a href="https://github.com/doxygen/doxygen/commit/0c0889e331305ea5b4f5c7a58c4a0e82da6111cd">view</a>]</li>
+<li>Make setAnchors() a member of MemberList [<a href="https://github.com/doxygen/doxygen/commit/a95ab819972148fef8287353e13089fd8cacebb8">view</a>]</li>
+<li>Making fortrancode.l reentrant [<a href="https://github.com/doxygen/doxygen/commit/99ca73d04ac162741fb63403c5bfb8cb9809ff1c">view</a>]</li>
+<li>Making pycode.l reentrant [<a href="https://github.com/doxygen/doxygen/commit/05547d571d1f5c32e7577ef26c830a240505d0aa">view</a>]</li>
+<li>Making sqlcode.l reentrant [<a href="https://github.com/doxygen/doxygen/commit/5162dab5a4254ef65e2de972f07a00ff52e7734c">view</a>]</li>
+<li>Making vhdlcode.l reentrant [<a href="https://github.com/doxygen/doxygen/commit/e801f129218e6f9ab11dc165b0e1607fc64cd645">view</a>]</li>
+<li>Making xmlcode.l reentrant [<a href="https://github.com/doxygen/doxygen/commit/0fc06d657d596adcc289a5f228973ea268efd66d">view</a>]</li>
+<li>Modernised the remaining containers in code.l [<a href="https://github.com/doxygen/doxygen/commit/0aaa71ab96fe055fe08567bea9cc59a6e33b7bb4">view</a>]</li>
+<li>Modernize Doxygen::symbolMap [<a href="https://github.com/doxygen/doxygen/commit/1c889cca680b79ca55a69b6dfef2f387f120e2d3">view</a>]</li>
+<li>Modernize TooltipManager class and source reference lists [<a href="https://github.com/doxygen/doxygen/commit/d03e8d9411ab3e983fc3413c147fba1a5e5c9dad">view</a>]</li>
+<li>Modernize class index [<a href="https://github.com/doxygen/doxygen/commit/59372719ef31d7a76e2cfb64ab4628a315ccaf3a">view</a>]</li>
+<li>Modernize getUsedClasses() method [<a href="https://github.com/doxygen/doxygen/commit/daeba94e228802e374eea260b8ba8f6157f91dbd">view</a>]</li>
+<li>Modernized the getUsedNamespaces() method [<a href="https://github.com/doxygen/doxygen/commit/4c0557e8261a6753a19de293e8cc7cdd3beb90ca">view</a>]</li>
+<li>Move ClassDefSet to the classdef header [<a href="https://github.com/doxygen/doxygen/commit/62e55b73b0762251bdcf51e2f4c7b8f4cdcb4ddb">view</a>]</li>
+<li>Move addDocCrossReference to memberdef.cpp/.h [<a href="https://github.com/doxygen/doxygen/commit/65e57b55cfa22e3ccc2b281f1af974d410263e2a">view</a>]</li>
+<li>Prepare output generators for multi-threaded use [<a href="https://github.com/doxygen/doxygen/commit/cfdabb54c5bcea38629eb0ec8f207d1306ff0939">view</a>]</li>
+<li>Remove isVisited/setVisited from context [<a href="https://github.com/doxygen/doxygen/commit/6728e04f215353429aec7b468448fa3eaeaa499d">view</a>]</li>
+<li>Remove isVisited/setVisited from index [<a href="https://github.com/doxygen/doxygen/commit/b82f069a2a11f6bc82c81ee2cda8d30725e95313">view</a>]</li>
+<li>Remove unused Doxygen::genericsSDict [<a href="https://github.com/doxygen/doxygen/commit/48096bb6c5d7a2879327c82cc0144eef8e6d8ac8">view</a>]</li>
+<li>Removed macros used for getting the value of settings [<a href="https://github.com/doxygen/doxygen/commit/d3ffd31e89c05d0afa3245ccc68604baeae837a4">view</a>]</li>
+<li>Removed some dead code [<a href="https://github.com/doxygen/doxygen/commit/c73dccc6af02de46485b66caef63253aeb9fd5fe">view</a>]</li>
+<li>Removing setVisited/isVisited members [<a href="https://github.com/doxygen/doxygen/commit/a5792da8b4bf88a9d93cfd0582cec469747de3b2">view</a>]</li>
+<li>Replace ClassSDict by ClassLinkedMap/ClassLinkedRefMap [<a href="https://github.com/doxygen/doxygen/commit/963caeef1c24d66a51376f77d8692f1a3c5d4a62">view</a>]</li>
+<li>Replace NamespaceSDict by NamespaceLinkedMap [<a href="https://github.com/doxygen/doxygen/commit/11f0c2e3735e4736a5ade8468a356ebc2fc2840d">view</a>]</li>
+<li>Replace QDict by std::set for classifying keywords in vhdldocgen [<a href="https://github.com/doxygen/doxygen/commit/f0621abcd0db27a362e9c6eec5ea1a8d85e83beb">view</a>]</li>
+<li>Replace QMap with std::map in fortranscanner.l [<a href="https://github.com/doxygen/doxygen/commit/525b87e93dfedc9d98fc00def60c987b4e8d80d9">view</a>]</li>
+<li>Replace QXml by own XML processor [<a href="https://github.com/doxygen/doxygen/commit/644997f85f327d3f8456f1c5cf0cde78a3bd1d28">view</a>]</li>
+<li>Replaced QCache by STL based LRU cache implementation. [<a href="https://github.com/doxygen/doxygen/commit/bb783fb795f9c0d077fa201ed673be93825486ce">view</a>]</li>
+<li>Replaced QStack by std::stack for scopeStack [<a href="https://github.com/doxygen/doxygen/commit/62dabb22779acb023b74329b6ab515f187cd4ff3">view</a>]</li>
+<li>Replaced codeClassSDict by codeClassMap in code.l [<a href="https://github.com/doxygen/doxygen/commit/250f6fe440773eb8202bf234b3a4b81c44044f5a">view</a>]</li>
+<li>Replaced getNamespaceSDict() by getNamespaces() [<a href="https://github.com/doxygen/doxygen/commit/bf5c2ac20e42f440ae0199d4d809b9d5e7e22191">view</a>]</li>
+<li>Replacing dynamic_cast by static_cast to improve performance [<a href="https://github.com/doxygen/doxygen/commit/784313b82442747843145429d39e5d257256b7b0">view</a>]</li>
+<li>Simplify vhdldocgen code a bit [<a href="https://github.com/doxygen/doxygen/commit/a159f53f032b04064df0c9ad9d7d02f0622f0529">view</a>]</li>
+<li>Modernize search index [<a href="https://github.com/doxygen/doxygen/commit/33a334ce77e6dd0c81e97edc4bfba1fe50d947fa">view</a>]</li>
+<li>Update used links in test examples [<a href="https://github.com/doxygen/doxygen/commit/3c9eeae58ca98a000c75d75ed21bbe4a625cd2c8">view</a>]</li>
+<li>Updated minimum MacOS requirements to version 10.14 [<a href="https://github.com/doxygen/doxygen/commit/4b997ee2519c1032da6f1a9caf2638d17202fea7">view</a>]</li>
+<li>Updated test for enums based on recently fixed issues [<a href="https://github.com/doxygen/doxygen/commit/62b368644dec14d1d916c778461f6d4d32e2182e">view</a>]</li>
+<li>Make layout parser use the new XML parser [<a href="https://github.com/doxygen/doxygen/commit/22f6dcc3cedf1bf4360c452db40949e3c156f41b">view</a>]</li>
+<li>Make tagreader use the new XML parser [<a href="https://github.com/doxygen/doxygen/commit/714f89d30cf04ad972df84a6a398258b751d3553">view</a>]</li>
+<li>Make testsqlite3.py python script running with python 3 [<a href="https://github.com/doxygen/doxygen/commit/6383a72200df27b0515b6e3d09bfad8934eb5c76">view</a>]</li>
+<li>Remove duplicate pages for classes inside inline namespaces (LaTeX/RTF/DocBook) [<a href="https://github.com/doxygen/doxygen/commit/63d7b19df11eb55a30e4af8fa492ee464ff353f5">view</a>]</li>
+<li>Remove double usepackage / RequirePackage from LaTeX [<a href="https://github.com/doxygen/doxygen/commit/f3f23cbe43e9fd43fb42b65b0b01002962f6af0e">view</a>]</li>
+</ul>
+<h3>Documentation updates</h3>
+<ul>
+<li>Correction of spelling errors [<a href="https://github.com/doxygen/doxygen/commit/5ebf938be4d3b185fa1e1319ebeefafd090605f8">view</a>]</li>
+<li>Incomplete documentation in respect to hyphens for horizontal rulers [<a href="https://github.com/doxygen/doxygen/commit/4aa74abe0835b2430e51dc628c10f2e04b9b894b">view</a>]</li>
+<li>Mismatch documentation and build system [<a href="https://github.com/doxygen/doxygen/commit/b42ee5fc78f3c5b08d5f96347c9c912fd1a07c3e">view</a>]</li>
+<li>Update of doxywizard documetation [<a href="https://github.com/doxygen/doxygen/commit/a4d254f92f7c892a7dc1ce3a83b0894dbe3870f1">view</a>]</li>
+<li>Update of testing README.txt [<a href="https://github.com/doxygen/doxygen/commit/d6afc494c14f683ed80f929a9f9fd311ef7fd500">view</a>]</li>
+<li>Incorrect link in doxygen documentation [<a href="https://github.com/doxygen/doxygen/commit/1928b428c3948dfffcabf328d77692e6ba14ec5e">view</a>]</li>
+<li>Making the use of DOT_CLEANUP more transparent [<a href="https://github.com/doxygen/doxygen/commit/773d0aafb4f603b6924d86a60a2828bd44a16756">view</a>]</li>
+<li>Syntax for faq about use in Windows Powershell [<a href="https://github.com/doxygen/doxygen/commit/819529338768bf791a58416fc67d291cf4271087">view</a>]</li>
+<li>Consistency in documentation of used Python versions [<a href="https://github.com/doxygen/doxygen/commit/48fcee6e1bcce7bfe295f3143c4ee2d93c4b3904">view</a>]</li>
+<li>better description of Doxyparse on README doc [<a href="https://github.com/doxygen/doxygen/commit/abab1ca40750c038b69f112f94f591cc3ea07648">view</a>]</li>
+<li>Missing commands in list of commands documentation [<a href="https://github.com/doxygen/doxygen/commit/938e868b438dd49d1b366a739eb2aba57f0f5b55">view</a>]</li>
+<li>Small layout improvement in documentation of CLANG_DATABASE_PATH [<a href="https://github.com/doxygen/doxygen/commit/b2cf46c4b8a74163526e1d3334ce60026b0198bc">view</a>]</li>
+</ul>
+<p>
+\endhtmlonly
+
+
+
+
+
\section log_1_8 1.8 Series
+\subsection log_1_8_20 Release 1.8.20
+\htmlonly
+<b>(release date 24-08-2020)</b>
+</p>
+<h3>Bug fixes</h3>
+<ul>
+<li>issue #7760: void return type reported as not documented [<a href="https://github.com/doxygen/doxygen/commit/24a6115110e386d5693adc28e3c2fde18b51199c">view</a>]</li>
+<li>issue #7951: Doxywizard 1.8.19 (Windows): Source code directory seems to be ignored [<a href="https://github.com/doxygen/doxygen/commit/40d87c40019d55adf47e1e8ccf766a9d47eb1f79">view</a>]</li>
+<li>issue #7954: The Doxygen uses too much memory (or has probably a memory leak) [<a href="https://github.com/doxygen/doxygen/commit/d4963dfa7d1045479b5add8086b57ea92a179866">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/1efb1b23ce1547f5a38b7078d5e6ec69cc40f263">view</a>]</li>
+<li>issue #7970: Doxygen doesn&#39;t stop on errors [<a href="https://github.com/doxygen/doxygen/commit/a3410621bdb09e07728faaaf4ebe09f27953c5be">view</a>]</li>
+<li>issue #7973: C++ grouped functions in namespace have disappeard [<a href="https://github.com/doxygen/doxygen/commit/8578e6bead66cae44b61214b3a43f776ed008362">view</a>]</li>
+<li>Improvement of line count for e.g. warnings [<a href="https://github.com/doxygen/doxygen/commit/eb3cb7b93be84b0fdb43ade81616f5523b33cd04">view</a>]</li>
+<li>Improved layout on the bibliography page [<a href="https://github.com/doxygen/doxygen/commit/5aa83d4e5568157d581122e4f4670e604c46c13a">view</a>]</li>
+<li>Updated the swedish language translation to 1.8.19 [<a href="https://github.com/doxygen/doxygen/commit/03d3bbce2a0e481ac08e6e01aca42d2fcd920f3e">view</a>]</li>
+</ul>
+<h3>Features</h3>
+<ul>
+<li>add configuration setting to have docstrings not as preformatted text but as normal documentation [<a href="https://github.com/doxygen/doxygen/commit/66cf0cf586dd6adc8aea1a1139233c865315f40b">view</a>]</li>
+</ul>
+<h3>Refactoring and cleanup</h3>
+<ul>
+<li>Format for size_t (in e.g. warnings) [<a href="https://github.com/doxygen/doxygen/commit/2f426ac495f4234b97649a591314fe695691cf99">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/61738cd5b380a03b51aabdb3a6d6369229d53ee4">view</a>]</li>
+<li>Spelling corrections [<a href="https://github.com/doxygen/doxygen/commit/a2104f7015f90315621c9c1896bdf1cb56f7ab4d">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/1dc1acd5e1a639f61a431e0ff6ebbd8edd96de64">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/fc5c31bed5b2bd7db70d93028adf36970ec89492">view</a>]</li>
+<li>Minor tweaks to clangparser.cpp [<a href="https://github.com/doxygen/doxygen/commit/c4ed324b4a834e7442956521be51936014e0fc9d">view</a>]</li>
+<li>Building documentation after changing language files [<a href="https://github.com/doxygen/doxygen/commit/f7bd440af03ef881d1b4b8ec891cebf9e9728eed">view</a>]</li>
+</ul>
+<p>
+\endhtmlonly
+
+\subsection log_1_8_19 Release 1.8.19
+\htmlonly
+<b>(release date 08-08-2020)</b>
+</p>
+<h3>Bug fixes</h3>
+<ul>
+<li>issue #6846: Doxygen parsing global variable as function in certain cases (#7903) [<a href="https://github.com/doxygen/doxygen/commit/8c02f1e963682edfebfd0da619c65112cf30448b">view</a>]</li>
+<li>issue #7495: generate &quot;bitfield&quot; [<a href="https://github.com/doxygen/doxygen/commit/08540e3909884e4ba560403bf0c8c1398c8d5b12">view</a>]</li>
+<li>issue #7595: Links from one Markdown file to another do not work [<a href="https://github.com/doxygen/doxygen/commit/01068088e4fa0f1ea5d202fcd78109aaf45fcdb2">view</a>]</li>
+<li>issue #7698: forward declaration of template classes [<a href="https://github.com/doxygen/doxygen/commit/0992cf5cd563d905ad0c5abf2e06ac8c3e985360">view</a>]</li>
+<li>issue #7702: test list is always created [<a href="https://github.com/doxygen/doxygen/commit/3901935a5366fa292aa1d3880593b6fb13008b14">view</a>]</li>
+<li>Revert pull request #7703: make declArgumentList be from declaration, and argumentList from definition [<a href="https://github.com/doxygen/doxygen/commit/95f9c89d6aa0008321c2ee8a0f3b1a4602789395">view</a>]</li>
+<li>issue #7706: Md5 hash does not match for two different runs [<a href="https://github.com/doxygen/doxygen/commit/f3ebc866c88b31ab393637e30189d41ddb7f84f0">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/cd581388f3d013c501e3cefbaf3e81cf93d46fcb">view</a>]</li>
+<li>Undefined control sequence for formula using MathJax (#7712) [<a href="https://github.com/doxygen/doxygen/commit/94556355036eee38b0403f059a8674408e7e4ea8">view</a>]</li>
+<li>Wrong message in case of svg formulas for HTML (#7716) [<a href="https://github.com/doxygen/doxygen/commit/53cc170dbbe173b3870d9b0512070479da907532">view</a>]</li>
+<li>VHDL fixed if-generate-bug 7721 [<a href="https://github.com/doxygen/doxygen/commit/cacbb0a8ec5ef7316f4d445bc2dae2d48ad0f883">view</a>]</li>
+<li>Inconsistent behavior between `///` and `//!` for formulas (#7726) [<a href="https://github.com/doxygen/doxygen/commit/d52e170500d1f532b8c45fcf5947d4d1e805febb">view</a>]</li>
+<li>Incorrect text for HTML_FORMULA_FORMAT in documentation / Doxyfile (#7722) [<a href="https://github.com/doxygen/doxygen/commit/444d78cbd1f2ef3124cf9d132a0a133c892833a9">view</a>]</li>
+<li>issue #7727: warning: documented symbol `static bool (long-winded C++ type)&#39; was not declared or defined. [<a href="https://github.com/doxygen/doxygen/commit/aa89f8773a50887ad20fbf683ff3c9af38c8fc5e">view</a>]</li>
+<li>issue #7734: Incorrect parsing of Q_PROPERTY [<a href="https://github.com/doxygen/doxygen/commit/70a4eee11581026aab0342272294ac0be8fdee5b">view</a>]</li>
+<li>issue #7738: \todo ignores EXCLUDE_SYMBOLS [<a href="https://github.com/doxygen/doxygen/commit/eb96e89aa0038feacdf822f13e1c55e5c35f968b">view</a>]</li>
+<li>Users cannot set &quot;enhancement label&quot; on github. (#7744) [<a href="https://github.com/doxygen/doxygen/commit/82cb93c033c83b5a184cd450d86b0f712e0870b3">view</a>]</li>
+<li>Input buffer overflow in php input code (#7745) [<a href="https://github.com/doxygen/doxygen/commit/81cda478974e4198b10054a5ef49bc250c1a3cf7">view</a>]</li>
+<li>issue #7747: Three-way comparison operator [<a href="https://github.com/doxygen/doxygen/commit/0488cb553e8a1e42b774a7fab4915f494a848225">view</a>]</li>
+<li>issue #7753: SVG formula all with zero width [<a href="https://github.com/doxygen/doxygen/commit/4b49842820ac3880162d835ddcde90b4859e8280">view</a>]</li>
+<li>issue #7762: C# mode completely broken [<a href="https://github.com/doxygen/doxygen/commit/10e0ee4d13ee14468f27bc64438338631d8fd61b">view</a>]</li>
+<li>issue #7778: Build fails with javacc 5.0 (#7779) [<a href="https://github.com/doxygen/doxygen/commit/cb5a9c3f31b0233a5dc72d13f9f4cfa7db5fe00c">view</a>]</li>
+<li>issue #7781: allow &#39;&gt;&#39; before Markdown emphasis [<a href="https://github.com/doxygen/doxygen/commit/75788787883ae8031f2de1fbafed052462c5356d">view</a>]</li>
+<li>issue #7787: Doxygen 1.8.18: Markdown tables not working in ALIASES anymore? [<a href="https://github.com/doxygen/doxygen/commit/47addccf4632f510f19b73ba5cbdbe011513d30f">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/fdefd3091128296d8f572f7daba6d838de24bf4b">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/517ec716de0f3a08fcd3bed2626b776a36c663f5">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/10c1495dc8984ec3b800c290f1c7448e75478da1">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/2340c1e7230b2d83ec34cb6a6a21c47b180d8a51">view</a>]</li>
+<li>bug_121547 extern variable is being referenced in documentation incorrectly (#7792) [<a href="https://github.com/doxygen/doxygen/commit/2aef0e0e4f91038b0b1d952efad0a3aba7d6a6cd">view</a>]</li>
+<li>issue #7796: Backticks (`) in Doxygen-markup-in-C in Markdown collapses (#7797) [<a href="https://github.com/doxygen/doxygen/commit/65bf92c94f2118b0f6e6c19e62993c6e27ebbef9">view</a>]</li>
+<li>Issue #7804: String double quotes in C get misinterpreted by pdflatex [<a href="https://github.com/doxygen/doxygen/commit/4310f3cecb062413728533dba042853872f35790">view</a>]</li>
+<li>issue #7810: LaTeX manual not built, but make install tries to install it (#7821) [<a href="https://github.com/doxygen/doxygen/commit/e4a9056a5d0fb6764fadd4dac72e4a68184b9387">view</a>]</li>
+<li>Vhdl improvements (ALIAS, translation) (#7813) [<a href="https://github.com/doxygen/doxygen/commit/5e293b201f46bd98695bcc92ce2ecaa1f2b15c54">view</a>]</li>
+<li>Running doxygen tests with variable with spaces (#7819) [<a href="https://github.com/doxygen/doxygen/commit/22d8ffd11ad8b864941ba73f2161622d693f4f49">view</a>]</li>
+<li>issue #7820: Add `const` qualifier to UsedDir::m_dir. [<a href="https://github.com/doxygen/doxygen/commit/fce24d0725943a9b1a1ac069449fda1d0bdf9ab7">view</a>]</li>
+<li>Create link for GENERATE_XML (#7824) [<a href="https://github.com/doxygen/doxygen/commit/9438348bfc2fdf30ec96483679a3504cb8e17dfc">view</a>]</li>
+<li>isuse #7828: Add namespace inline flag in xml output [<a href="https://github.com/doxygen/doxygen/commit/963b8da31e03d149eefb9d61033db9f7263728da">view</a>]</li>
+<li>Issue #7831: Error building docs after 0df1623c9363d52a2b04457233dcf2c64319b03c [<a href="https://github.com/doxygen/doxygen/commit/f49f1c8cdd9babbbe0350c9ad3d3a3e92244085e">view</a>]</li>
+<li>issue #7833: Empty string in PREDEFINED throws [<a href="https://github.com/doxygen/doxygen/commit/c0dcee7cdcc5d7841d050682a35ccf59dc668fcb">view</a>]</li>
+<li>Incorrect label in map of dot files in xhtml (#7840) [<a href="https://github.com/doxygen/doxygen/commit/e53fa89addc9659ad406298d27a6376d1eb53e0d">view</a>]</li>
+<li>issue #7852, #7867, #7901: Changed the set of commands that effect ending a brief description [<a href="https://github.com/doxygen/doxygen/commit/327423e217337bf4e64515aba6cf78b9877bc165">view</a>]</li>
+<li>Problem with generating test output for Chinese (#7862) [<a href="https://github.com/doxygen/doxygen/commit/d5916c06fba9667911a19cf658e7c5ab54daf72c">view</a>]</li>
+<li>issue #7865: Update documentation of USE_PDFLATEX option [<a href="https://github.com/doxygen/doxygen/commit/c8f5aea6be63282d1dc6359a3e9bda9462565ca2">view</a>]</li>
+<li>issue #7867: Fixed regression where blank line after \class was not seen as paragraph separator [<a href="https://github.com/doxygen/doxygen/commit/7fa193cbc9476ad0c76196e99e26f25873502c5f">view</a>]</li>
+<li>issue #7881: More flexible and correct detection of direction of an argument [<a href="https://github.com/doxygen/doxygen/commit/4f28f621b67d96c3f9eb78f01009867377695558">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/0a09ab02f8ddbb4e3837b8b2611a2cf110b7e6f6">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/e20debc69515eba71fbe7def1925e6df16224c96">view</a>]</li>
+<li>issue #7883: doxygen does not build again LLVM/CLAN without static libs [<a href="https://github.com/doxygen/doxygen/commit/3803bec48abc143d3ac4e43caf9922018788ba96">view</a>]</li>
+<li>issue #7884: Python to xml: Whitespace in method doc not preserved (MARKDOWN_SUPPORT=NO) [<a href="https://github.com/doxygen/doxygen/commit/2052757831db677b78b6f9b56bf075ab8413b92c">view</a>]</li>
+<li>issue #7890: Macro Expansion broken [<a href="https://github.com/doxygen/doxygen/commit/c30fbe4eba7f27c6296dea587eefe3d8b489661a">view</a>]</li>
+<li>Issue #7892: Incorrect search box on server-side search results page [<a href="https://github.com/doxygen/doxygen/commit/236080bf9b07dd036efc88f91e3718a1139cfa38">view</a>]</li>
+<li>issue #7900: Incorrect warning regarding no matching class member found [<a href="https://github.com/doxygen/doxygen/commit/ab550764edebfcc6f92dd7782d755dd8fa1621fc">view</a>]</li>
+<li>issue #7911: markdown table add extra test to &quot;\copybrief&quot; [<a href="https://github.com/doxygen/doxygen/commit/537131d27d40e2fa1f3fc55f45449f6604c9a055">view</a>]</li>
+<li>issue #7921: Help for CLANG_DATABASE_PATH is misleading [<a href="https://github.com/doxygen/doxygen/commit/483b47ddd8039ba77aacc11d35825489f74b3b47">view</a>]</li>
+<li>issue #7923: source line numbers in warnings output by parser are off by 1 [<a href="https://github.com/doxygen/doxygen/commit/603b2ada84164c9e740552cec052c01803bee383">view</a>]</li>
+<li>issue #7934: include dependency graph: The boxes of files shows the name of the included file not its own filename [<a href="https://github.com/doxygen/doxygen/commit/f94a2f3a895f2601226845d16093546757a540e6">view</a>]</li>
+<li>issue #7943: transferArgumentDocumentation is erroneous [<a href="https://github.com/doxygen/doxygen/commit/73380fc18508d4f98d61c9929ad786220f320da5">view</a>]</li>
+<li>Empty python comment gives problems [<a href="https://github.com/doxygen/doxygen/commit/8f7394212564e1c466636d737fcb7abec5fdbfe6">view</a>]</li>
+<li>Don&#39;t crash if output subdirectories already exist [<a href="https://github.com/doxygen/doxygen/commit/c13144eddc3fca3e112e546dbfa01501da3e711a">view</a>]</li>
+<li>Fix cmake warning about ICONV package naming (should be Iconv) [<a href="https://github.com/doxygen/doxygen/commit/0937faf2d168b64f5ccf55c1976bc045d5d12569">view</a>]</li>
+<li>Plantuml has problems with output directories ending with directory separator [<a href="https://github.com/doxygen/doxygen/commit/1e8a4daf669fa83a2b04c32a5be65ceffea59d9a">view</a>]</li>
+<li>Fixed issue that could cause wrong line numbers [<a href="https://github.com/doxygen/doxygen/commit/74f8a88bcf8b2c86b7205bee1ae5ee9455b2b323">view</a>]</li>
+<li>Number of translatable terms (like Chapter) are in English instead of Greek (#7841) [<a href="https://github.com/doxygen/doxygen/commit/e7637f9dd977e9821394e7bed4dec02aec41ab9e">view</a>]</li>
+<li>Running Inkscape 1.0 [<a href="https://github.com/doxygen/doxygen/commit/569829a261ebab5a8fb64688caa2f27856f68281">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/d9ced2a578649f0adb569cf113885852c2e463a2">view</a>]</li>
+<li>Empty enum setting in configuration file [<a href="https://github.com/doxygen/doxygen/commit/1bdc70103de256aa23a8afc54c9ea022ce790141">view</a>]</li>
+<li>Missing last item in htmlhelp level2 index [<a href="https://github.com/doxygen/doxygen/commit/955f746f9b26ca49e085fb8d84cc16085c8e6d21">view</a>]</li>
+<li>crossref citations are shown unconditionally [<a href="https://github.com/doxygen/doxygen/commit/7894dd7d82d9fcfe524cb7ff2e5dea1824816bb8">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/89f9d113d0d788552a32b699a89f273f6ce58c0f">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/e9853388b4c682ecf0e19d1222d75ad452039340">view</a>]</li>
+</ul>
+<h3>Features</h3>
+<ul>
+<li>Added experimental multi-thread input processing support. [<a href="https://github.com/doxygen/doxygen/commit/b265433382b93625b75cbc1f10b0509489b0b6b7">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/584a8b188a24aed8b0130cbc2d3b0ade774d1d07">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/45431b45fa0591a6de6b47c3fe9ff8dd0032aa4e">view</a>]</li>
+<li>Addon option --pool to the test run script for parallel execution of tests (#7827) [<a href="https://github.com/doxygen/doxygen/commit/42e36bdfa05f0a553f11bfd50f4a4eb2e9c74f82">view</a>]</li>
+<li>Adding the xml:lang tag to XML and Docbook output [<a href="https://github.com/doxygen/doxygen/commit/88e70b5242b2446f33ab700e6d10e7f25ae2c349">view</a>]</li>
+<li>Scalable search bar for high resolution displays (#7888) [<a href="https://github.com/doxygen/doxygen/commit/8c12604a84faabf6beeef7f159692ccddcb94dc6">view</a>], [<a href="https://github.com/doxygen/doxygen/commit/1b2eb947740d9933cbfa448014375dee45d82b98">view</a>], and [<a href="https://github.com/doxygen/doxygen/commit/cd1516dc7afe268a9ba798b33111d41881df520d">view</a>]</li>
+<li>Add doxygen version information to tag file [<a href="https://github.com/doxygen/doxygen/commit/991f64abb257d1a70077ed809cba6c6adca38042">view</a>]</li>
+<li>Add options to enable various sanitizers [<a href="https://github.com/doxygen/doxygen/commit/07dd4ae9033c9872d70d68ff1d83ec46f1db7cb4">view</a>]</li>
+<li>Show doxywizard version by means of --version [<a href="https://github.com/doxygen/doxygen/commit/df070ebb578db360f4b888a6d674d9e20b58a523">view</a>]</li>
+<li>Added configuration options to better control the sqlite3 output. [<a href="https://github.com/doxygen/doxygen/commit/4ae47ae6f238d465eefa1b5a85c0cf3f7857bc57">view</a>]</li>
+<li>Enable running tests in parallel using cmake&#39;s ctest. [<a href="https://github.com/doxygen/doxygen/commit/4ad6c2ab4dc19aeffef3d40ae3f813ba9ee41a4a">view</a>]</li>
+<li>improve using plantuml for vhdl flowcharts [<a href="https://github.com/doxygen/doxygen/commit/854308535d0f2335482b48d866a6f0086fbcfafd">view</a>]</li>
+</ul>
+<h3>Refactoring and cleanup</h3>
+<ul>
+<li>Added atomic reference counting to QString [<a href="https://github.com/doxygen/doxygen/commit/3040df2f0aa29a4207de5b37da1d20e3d27340bb">view</a>]</li>
+<li>Added missing stub code when use_libclang is disabled [<a href="https://github.com/doxygen/doxygen/commit/38e6d479a2fb624000521b93a384932997ffe16f">view</a>]</li>
+<li>Better warning for non documented struct [<a href="https://github.com/doxygen/doxygen/commit/3bc881556ef5aac73294a9306580b27f3f198cd3">view</a>]</li>
+<li>Catch all wrong mkdir calls (coverity) [<a href="https://github.com/doxygen/doxygen/commit/e6a6e65d46196125a5baad4aeb1942aa043236fa">view</a>]</li>
+<li>Change of git version input file was not taken into account [<a href="https://github.com/doxygen/doxygen/commit/a93deafa9c460aceb9ca87add52405e1f41cf14a">view</a>]</li>
+<li>Changed container class for class use and constrained relations from QDict&lt;void&gt; to StringSet [<a href="https://github.com/doxygen/doxygen/commit/ea6e16bf7f3af2ed8779df553b8fadbf396737fa">view</a>]</li>
+<li>Cleanup some disabled code sections [<a href="https://github.com/doxygen/doxygen/commit/9eaa0b08fc4a09cff8abbd4993b5c644ef6f6e9a">view</a>]</li>
+<li>Copied implementation of `QGList::inSort()` to sortInDirList. [<a href="https://github.com/doxygen/doxygen/commit/a0755075b7ce190c3eb2a48c9238f34240ea8c8d">view</a>]</li>
+<li>Coverity uninitialized variable [<a href="https://github.com/doxygen/doxygen/commit/668b4d91bd1fcf516864debc3c15d71cdb4a6de2">view</a>]</li>
+<li>Coverity uninitialized variable in mscgen_api.cpp [<a href="https://github.com/doxygen/doxygen/commit/906f429414678e0bcecf3c67d1f49f436bac2876">view</a>]</li>
+<li>Create compareDirDefs for sorting. [<a href="https://github.com/doxygen/doxygen/commit/750e68e797b6b2500da3b9d770eafbb31b9d23fa">view</a>]</li>
+<li>Creating chm files for doxygen tests [<a href="https://github.com/doxygen/doxygen/commit/7c62ce232d629e81d611de8d2428f05f080472d0">view</a>]</li>
+<li>Debug facility for the \cite command [<a href="https://github.com/doxygen/doxygen/commit/44c1f04b2bc28fbeb14b6d4e17fda0cd029b6890">view</a>]</li>
+<li>Fixed 2 small memory leaks [<a href="https://github.com/doxygen/doxygen/commit/30f8609975062896b0cd43b739310ab8d667ea82">view</a>]</li>
+<li>Fixed anothing compilation issue when use_libclang was not enabled [<a href="https://github.com/doxygen/doxygen/commit/3e9d9386950cc67d155a920cf8483c4d5bdcec3c">view</a>]</li>
+<li>Fixed compilation issue on Windows for setNum with size_t argument [<a href="https://github.com/doxygen/doxygen/commit/b42789d09fd8a81a40c0f13ba2c024b7eec71d92">view</a>]</li>
+<li>Fixes missing include and missing html extension logic [<a href="https://github.com/doxygen/doxygen/commit/125b9390c45f43563d0ddf097f780d2fdc23cf65">view</a>]</li>
+<li>Fixes signed/unsigned mismatch warning in plantuml.cpp [<a href="https://github.com/doxygen/doxygen/commit/37037eab8c26578df0ff866727f2357948762ca2">view</a>]</li>
+<li>GNU compilation warnings [<a href="https://github.com/doxygen/doxygen/commit/751c3c104eeb89613f07b74002585d70c012af97">view</a>]</li>
+<li>Improve flex/bison debuggability with gdb [<a href="https://github.com/doxygen/doxygen/commit/1a683c1864eaac3255f464dd63eff3619bd9ced6">view</a>]</li>
+<li>Include dirdef.h instead of forward declaration. [<a href="https://github.com/doxygen/doxygen/commit/53373a57b8d548c9c99a46cb723219c62a69b813">view</a>]</li>
+<li>Incorrect htmlhelp language code for Indonesian [<a href="https://github.com/doxygen/doxygen/commit/73d699a94cf96915a6b5897b7747d0964df647ca">view</a>]</li>
+<li>Incorrect representation of citation [<a href="https://github.com/doxygen/doxygen/commit/e530248a0c4b1fc310d9f269c402f0703096b2f0">view</a>]</li>
+<li>LaTeX test were hanging for a.o. Hungarian on Windows [<a href="https://github.com/doxygen/doxygen/commit/2f19e7322f6c082b09252c285753056f359a1eb6">view</a>]</li>
+<li>Link fixed in documentation [<a href="https://github.com/doxygen/doxygen/commit/5aaf3b659b82216ced7e447e8b6c6d9046ba7dd6">view</a>]</li>
+<li>Make a switch to choose between dynamic library to clang-cpp or static linking against clangTooling [<a href="https://github.com/doxygen/doxygen/commit/3b6ac9e24fae88e09558524d3d9bd023a753defc">view</a>]</li>
+<li>Minor documentation updates [<a href="https://github.com/doxygen/doxygen/commit/73c460247af61dd37fb092a9dd4e647edcd8cbfa">view</a>]</li>
+<li>Minors tweaks to the regular expressions [<a href="https://github.com/doxygen/doxygen/commit/b38738a4efd5d87c5344b066b92fda182bdb66b3">view</a>]</li>
+<li>Misleading compiler warning [<a href="https://github.com/doxygen/doxygen/commit/bfe44c22752c443d1e74923137c065f901134478">view</a>]</li>
+<li>Misleading warning about missing argument [<a href="https://github.com/doxygen/doxygen/commit/e0d293b8990381729593e123c351f905450686d3">view</a>]</li>
+<li>Missing links in Fortran in case use statement with upper case characters in name [<a href="https://github.com/doxygen/doxygen/commit/442da6dfa5ab1d48b632ab24e15acb0719ab0bbd">view</a>]</li>
+<li>Modernize HtmlHelp class [<a href="https://github.com/doxygen/doxygen/commit/4a99145595383d665d33bf57df1bacab39912a01">view</a>]</li>
+<li>Modernize code for the resource manager [<a href="https://github.com/doxygen/doxygen/commit/4f18ae106a216a465713a0c7be78105419146881">view</a>]</li>
+<li>Modernized tagreader.cpp code [<a href="https://github.com/doxygen/doxygen/commit/041215111a345199fcb52a26941e76c613a0b552">view</a>]</li>
+<li>More minor tweaks [<a href="https://github.com/doxygen/doxygen/commit/b3fca8f555183bb8a6863558d912e06f9dd2c929">view</a>]</li>
+<li>Moved citation cross reference searching to a separate function [<a href="https://github.com/doxygen/doxygen/commit/f8c1c09b5f25489223530bb73b9d7b173562b3ff">view</a>]</li>
+<li>Moved stripIndentation() to util, make it safe for empty input [<a href="https://github.com/doxygen/doxygen/commit/23c71a3253f41a84a5624863b29fec69f87396d5">view</a>]</li>
+<li>Multi-threaded parsing: added locks around global data [<a href="https://github.com/doxygen/doxygen/commit/d0f24b762e23b1b0c069209978aa403acc027cdf">view</a>]</li>
+<li>New option allowing processing using multiple threads [<a href="https://github.com/doxygen/doxygen/commit/5a2e70a9cde99f6a065d78ad550ed386cdcc83f1">view</a>]</li>
+<li>No default rule present in commentcnv.l [<a href="https://github.com/doxygen/doxygen/commit/5c689c77781554e2e1a916ae473e87e8140ca7fe">view</a>]</li>
+<li>Performance improvements after profiling [<a href="https://github.com/doxygen/doxygen/commit/9e2b6a2dac870b5daabde118c5327281e3f79ba2">view</a>]</li>
+<li>Prefer more inclusive language [<a href="https://github.com/doxygen/doxygen/commit/52a520090ee1354526a073753244bf8210d6194b">view</a>]</li>
+<li>Prevent potential empty string [<a href="https://github.com/doxygen/doxygen/commit/2a0e9798c552e7ce526ed9e6678ea938033faa65">view</a>]</li>
+<li>Reduce use of WIN32 defines outside of portable [<a href="https://github.com/doxygen/doxygen/commit/a2133a44d353997af904299c73f267a94eb6f9b9">view</a>]</li>
+<li>Refactoring: Modernize clang parser and make it run with multiple threads [<a href="https://github.com/doxygen/doxygen/commit/50fdb591d4abfdf88bfdda96ffd832cc4c024963">view</a>]</li>
+<li>Refactoring: better encapsulation for MemberName [<a href="https://github.com/doxygen/doxygen/commit/9165a15b7ee8e9e8f1e50412b8dacebf77432ea1">view</a>]</li>
+<li>Refactoring: improve encapsulation for ArgumentList [<a href="https://github.com/doxygen/doxygen/commit/f1a7068e113e4f028f772a9978eabfa539f32e1d">view</a>]</li>
+<li>Refactoring: make QCString a wrapper around std::string [<a href="https://github.com/doxygen/doxygen/commit/1fa64cc88d0400eccb85fe4a687a269870fc3017">view</a>]</li>
+<li>Refactoring: make preprocessor run in parallel [<a href="https://github.com/doxygen/doxygen/commit/ff5ebce0649b5e1fbef2660234f5cc8184e80148">view</a>]</li>
+<li>Refactoring: modernize configuration values [<a href="https://github.com/doxygen/doxygen/commit/0df1623c9363d52a2b04457233dcf2c64319b03c">view</a>]</li>
+<li>Refactoring: modernize markdown and make it thread-safe [<a href="https://github.com/doxygen/doxygen/commit/e922facbb92cda058eae33f58f7640be8d1fb5b8">view</a>]</li>
+<li>Refactoring: remove symbolStorage references (dead code) [<a href="https://github.com/doxygen/doxygen/commit/44a19079003d62fb600e8d952a2ea7b6b2b23d22">view</a>]</li>
+<li>Refactoring [<a href="https://github.com/doxygen/doxygen/commit/10787eed95266bb1a13c892fe4cf5a695dac1559">view</a>]</li>
+<li>Refactoring: Improve encapsulation of MemberInfo class [<a href="https://github.com/doxygen/doxygen/commit/6f7443e86a2b6633fafeba5e8baa0941c22c757d">view</a>]</li>
+<li>Refactoring: Introduce type names for commonly used container types [<a href="https://github.com/doxygen/doxygen/commit/1708261ebe54b03c45a4bfe3c1e78581779b2a80">view</a>]</li>
+<li>Refactoring: Removed creation of MemberDef&#39;s for macro definitions from pre.l [<a href="https://github.com/doxygen/doxygen/commit/57730818727420a23e63917e3d035df3926b958f">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/ff5ba4a40fa13c0987272d463ba0edc57bc10fa6">view</a>]</li>
+<li>Refactoring: changed Doxygen::expandAsDefinedDict to Doxygen::expandAsDefinedSet [<a href="https://github.com/doxygen/doxygen/commit/28fc7d1fce3cc8e7fa26e3760e8d8d79b9dd23a5">view</a>]</li>
+<li>Refactoring: changed QValueList to std::vector for template engine [<a href="https://github.com/doxygen/doxygen/commit/84084bebe0544650513dbcd75e71a50b2119360d">view</a>]</li>
+<li>Refactoring: migrate MemberNameInfoSDict to MemberNameInfoLinkedMap [<a href="https://github.com/doxygen/doxygen/commit/2b67e2815cf43f9425a7af5e9224e39a77692bdf">view</a>]</li>
+<li>Refactoring: migrate type of Doxygen::inputPaths to std::set [<a href="https://github.com/doxygen/doxygen/commit/e0e5f733ca5b41365ca76bbba1b7529cd1f24b66">view</a>]</li>
+<li>Refactoring: modernize g_inputFiles and the parameters of readFileOrDirectory [<a href="https://github.com/doxygen/doxygen/commit/f07af121a870e909c1820cade76c502a44f99d23">view</a>]</li>
+<li>Refactoring: replace Doxygen::namespaceAliasDict by Doxygen::namespaceAliasMap [<a href="https://github.com/doxygen/doxygen/commit/6ca67aa0e617816789f2a662c86ad82426377b71">view</a>]</li>
+<li>Refactoring: replace QDict&lt;void&gt; by StringUnorderedSet for g_processedFiles and g_filesToProcess [<a href="https://github.com/doxygen/doxygen/commit/b11f1c4ec6309627004fce83f366c498bdaab429">view</a>]</li>
+<li>Refactoring: replaced killDict by killSet [<a href="https://github.com/doxygen/doxygen/commit/d41c5e67244ec9684858201f6d31568f628aa5e1">view</a>]</li>
+<li>Refactoring: size_t type conversions and QList in DotManager [<a href="https://github.com/doxygen/doxygen/commit/03115ed64d916b94c52275fe0b329bd817d4ce94">view</a>]</li>
+<li>Refactoring: For loops on QListIterator by range loops. [<a href="https://github.com/doxygen/doxygen/commit/534cf6a4f2098e96b15bb49f41d93d6e991bd3f9">view</a>]</li>
+<li>Refactoring: Replaced ${CMAKE_SOURCE_DIR}/path/to/current/cmake-lists-txt/dir with ${CMAKE_CURRENT_LIST_DIR} [<a href="https://github.com/doxygen/doxygen/commit/57fe2e8128f33e6b6d09ab340874abbb52cf89d7">view</a>]</li>
+<li>Refactoring: Replaced QList with std::deque in DirList. [<a href="https://github.com/doxygen/doxygen/commit/8ef8e3cdd322994a262a937b4b52a3fb6e6774dd">view</a>]</li>
+<li>Refactoring: Replaced DirList::count() by DirList::size(). [<a href="https://github.com/doxygen/doxygen/commit/0c28706a1e82a4ad6021ce016bc5937698cbbd3c">view</a>]</li>
+<li>Refactoring: Replaced QDict&lt;Void&gt; by StringUnorderedSet in dotnode.cpp [<a href="https://github.com/doxygen/doxygen/commit/aa3385f19d06c6b526e6d09c6172d89a1b91d8da">view</a>]</li>
+<li>Refactoring: Replaced QDict&lt;void&gt; by StringUnorderedSet for fortrancode.l [<a href="https://github.com/doxygen/doxygen/commit/a0ff9effd8591a54d8c49a27e26ed7cc086d2be9">view</a>]</li>
+<li>Refactoring: Replaced QDict&lt;void&gt; by StringUnorderedSet used to keep track of visited paths [<a href="https://github.com/doxygen/doxygen/commit/713a6167733e660dcdfd48a36134576aaa8b80d3">view</a>]</li>
+<li>Refactoring: Replaced addDir(const DirDef *dd) by addDir(DirDef *const dd) in GroupDef and GropuDefImpl. [<a href="https://github.com/doxygen/doxygen/commit/8b2d00106d564068ad58d2f51bef155a4d0e982e">view</a>]</li>
+<li>Refactoring: Replaced bitmap of doxygen logo by SVG version [<a href="https://github.com/doxygen/doxygen/commit/1fb2408b0ef717f0e475894f646bcd4c1b90b65e">view</a>]</li>
+<li>Refactoring: Replaced calls to DirDef::append() to DirDef::push_back(). [<a href="https://github.com/doxygen/doxygen/commit/b5a2d0b03fe7de2570a9b6d326be7062b774c506">view</a>]</li>
+<li>Refactoring: Restructured the split_and_keep function [<a href="https://github.com/doxygen/doxygen/commit/08686b4117ae8b0f8dc3711e169e3da3fa1fe8fc">view</a>]</li>
+<li>Remove not used translator function [<a href="https://github.com/doxygen/doxygen/commit/c1ccec3b1bcb00f3ece99fb2dfd4a4820a31320b">view</a>]</li>
+<li>Renamed stripSpaces to stripIndentation and make it work directly on the string passed. [<a href="https://github.com/doxygen/doxygen/commit/d2b3bc01f81e842ecc5baaf74e4402bc24e841e5">view</a>]</li>
+<li>Setting correct babel packages for some languages [<a href="https://github.com/doxygen/doxygen/commit/51316ea8204de0cfc80616c028e13376faae1d3a">view</a>]</li>
+<li>Spelling correction in cite code [<a href="https://github.com/doxygen/doxygen/commit/39f66cea6fdef47e30e060204c3f4c34d3c87dd7">view</a>]</li>
+<li>Split off code to detect inkscape version to a separate function [<a href="https://github.com/doxygen/doxygen/commit/87a4df1aa622994678025b4074374b0eb673dcba">view</a>]</li>
+<li>Superfluous space in &quot;TEST_FLAGS&quot; [<a href="https://github.com/doxygen/doxygen/commit/e51bde4cca9e79ae11c54c45cbcc29233fad0ac1">view</a>]</li>
+<li>Travis does not terminate on error on non last command inside if construct [<a href="https://github.com/doxygen/doxygen/commit/03fe997d902f9a1336a9d74f377fc8b95e8a88a6">view</a>]</li>
+<li>Updated installation documentation for Linux binary distribution [<a href="https://github.com/doxygen/doxygen/commit/fd1111503cd3e403db3784d03530e6ec3ac37032">view</a>]</li>
+<li>Updated issue templates [<a href="https://github.com/doxygen/doxygen/commit/a267771b28e3165e95c061964598a607ac127b91">view</a>]</li>
+<li>Updated formatting rules for paragraphs within table header cells. [<a href="https://github.com/doxygen/doxygen/commit/5ee4689955e27dad85e9d722d48692f60593a812">view</a>]</li>
+<li>Updated the makefile for building the tests [<a href="https://github.com/doxygen/doxygen/commit/135dcdffe700a3958f06de30e576bf1ee4c15584">view</a>]</li>
+<li>Warning in case of multiple python documentation sections. [<a href="https://github.com/doxygen/doxygen/commit/5870db1f2848ff551007a0feff0b25e1029f7eb6">view</a>]</li>
+<li>XML tags moved to Appendix D of Ecma-334 [<a href="https://github.com/doxygen/doxygen/commit/4cd60ba9ca33158b258ff5b038b778c9c32b410c">view</a>]</li>
+<li>fail with term() instead of msg() [<a href="https://github.com/doxygen/doxygen/commit/c81d624d8bdd650b2ff2bdb0d3b840180bd08964">view</a>]</li>
+<li>missing instance-rework [<a href="https://github.com/doxygen/doxygen/commit/406e1499c35570e6d4333962ccd420a1ab217f7c">view</a>]</li>
+<li>moved separate doxygen tag to tagfile attribute [<a href="https://github.com/doxygen/doxygen/commit/25d95829b47380148f22fd2abc72a810e06b5730">view</a>]</li>
+<li>sqlite: flip _static default in bindTextParameter [<a href="https://github.com/doxygen/doxygen/commit/ee9a4679ae630f8f808619c5450f6b2f5a860994">view</a>]</li>
+<li>sqlite: use err instead of term :) [<a href="https://github.com/doxygen/doxygen/commit/27307c2a16139b657697ee7cb79e7d8989fbc95c">view</a>]</li>
+<li>try to make it so that argumentList is always from the definition [<a href="https://github.com/doxygen/doxygen/commit/dface804388013579f408d0baf01aa2739993317">view</a>]</li>
+<li>update URLS on README to prevent redirects [<a href="https://github.com/doxygen/doxygen/commit/28469fb1386797795a4c56ca7b75309df7ae48d6">view</a>]</li>
+</ul>
+<p>
+\endhtmlonly
+
+\subsection log_1_8_18 Release 1.8.18
+\htmlonly
+<b>(release date 12-04-2020)</b>
+<a name="1.8.18"></a>
+</p>
+<h3>Removed functionality</h3>
+<ul>
+<li>Removed support for TCL (code is too buggy and unmaintained, language not very popular) [<a href="https://github.com/doxygen/doxygen/commit/48a7afc0caf69857a42b0fe1963db3440cb4000f">view</a>]</li>
+</ul>
+<h3>Bug fixes</h3>
+<ul>
+<li>Bug 769411 - Confuses functions with the same name, but different namespace [<a href="https://github.com/doxygen/doxygen/commit/997e2b91f64e7f33898560bd935fddfc852f769e">view</a>]</li>
+<li>Bug 779650 - Typo in https://www.stack.nl/~dimitri/doxygen/manual/docblocks.html [<a href="https://github.com/doxygen/doxygen/commit/175f86cde5552d4daf7b5e29d9a9a4271acaf8ef">view</a>]</li>
+<li>Bug 780630 - Nested @ingroup generates bad breadclumb list [<a href="https://github.com/doxygen/doxygen/commit/134b336c018f8a1cd66acc9922f12387e9a1dbcf">view</a>]</li>
+<li>Bug 791390 - Table formatting information ignored in Doxygen XML output [<a href="https://github.com/doxygen/doxygen/commit/09939f6fd8b1e7aaa29016e09ef47047e7bea75b">view</a>]</li>
+<li>issue #6319: C++ function returning std::function with reference argument is not recognized as a function (Origin: bugzilla #792830) [<a href="https://github.com/doxygen/doxygen/commit/f39ee0710bff1d788a690d982a2e1312861c0f73">view</a>]</li>
+<li>issue #6901: Please consider relicensing of Javascript files [<a href="https://github.com/doxygen/doxygen/commit/3470dd71ff483bc21d92aae936ece9d40de2f861">view</a>]</li>
+<li>issue #7411: &quot;warning: return type of member is not documented&quot; for static void and virtual void functions [<a href="https://github.com/doxygen/doxygen/commit/6c10868a2b31076e8f5e42af0036b43e7f39d2b2">view</a>]</li>
+<li>issue #7432: vhdl-fixed-bug-7432 [<a href="https://github.com/doxygen/doxygen/commit/abd887af5cb3e70f801848adb87c70642e6fb1dc">view</a></li>
+<li>issue #7464: test suite is failing [<a href="https://github.com/doxygen/doxygen/commit/cd9dee013dc749a10bbe019c350e0e62b6635795">view</a>]</li>
+<li>issue #7472: Serious regression: /**&lt; comments cause functions to be silently ignored [<a href="https://github.com/doxygen/doxygen/commit/eace8c9e3ceb14fb80c6f548713624fd743f7276">view</a>]</li>
+<li>issue #7474: [1.8.16 regression] HTML output varies from ASLR [<a href="https://github.com/doxygen/doxygen/commit/dc67dbe5bd5a48756c591ad02b9f68fbd2a57687">view</a>]</li>
+<li>issue #7477: Broken urls in the xml output [<a href="https://github.com/doxygen/doxygen/commit/2f79c6938c6d969f3d4ebc9ed0f2648668434502">view</a>]</li>
+<li>issue #7484: Error: /undefined in getenv [<a href="https://github.com/doxygen/doxygen/commit/4c20acdb98eed7928015ed8d6ed739db0ccdaed6">view</a>]</li>
+<li>issue #7508: TYPEDEF_HIDES_STRUCT stopped working properly [<a href="https://github.com/doxygen/doxygen/commit/e468a6944f24152080c2a9b322c6623bfff208b4">view</a>]</li>
+<li>issue #7527: Doxygen 1.8.17: regression of C macro expansion [<a href="https://github.com/doxygen/doxygen/commit/938b6dfd1cb5173aa6ab19aa848ae266dba0afff">view</a>]</li>
+<li>issue #7544: [Regression 1.8.17] Recursion when computing class usage relations [<a href="https://github.com/doxygen/doxygen/commit/2faf90d076b3e1ec2d13597341cb8220fe15be9f">view</a>]</li>
+<li>issue #7558: PlantUML: Different behavior whether LATEX_OUTPUT has a final slash or not. [<a href="https://github.com/doxygen/doxygen/commit/6d3d15af681da52873f643f3952b6efcba40f1a8">view</a>]</li>
+<li>issue #7570: Comments replaced by block comments inside Markdown code block [<a href="https://github.com/doxygen/doxygen/commit/137328681e7dcbd07a5ec0e4b068aea96ec41b4a">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/3cbb8b8b56cb56f9cca84740baa065cb07997f90">view</a>]</li>
+<li>issue #7583: External Links in Inheritance Diagrams open in the Image Frame. [<a href="https://github.com/doxygen/doxygen/commit/8a7647bd12f383730c886b34c431ae976ec5ff83">view</a>]</li>
+<li>issue #7585: Doxygen 1.8.17 false warnings and no generate output for documented const functions [<a href="https://github.com/doxygen/doxygen/commit/8075ba0bbe45e1692c678bedd03a14ff167a0b8c">view</a>]</li>
+<li>issue #7590: Map .f18 filetype to Fortran [<a href="https://github.com/doxygen/doxygen/commit/c641d203a2fd602654ca62b0a651b097a53a7b93">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/c918f35f7335b24a4963de37cdda5407764abc2e">view</a>]</li>
+<li>issue #7606: Unable to build &quot;master&quot; branch [<a href="https://github.com/doxygen/doxygen/commit/57de6d693923b11c41d90574acb3a3b4feb0b160">view</a>]</li>
+<li>issue #7624: non-const getClassDef() called on aliased member. Please report as a bug. [<a href="https://github.com/doxygen/doxygen/commit/7f8fbc326ba6a9f6bb643983ca12a31b40fa7c00">view</a>]</li>
+<li>issue #7635: Incorrect location for enum in XML file [<a href="https://github.com/doxygen/doxygen/commit/7296e6bf11ff98e100ff3768381c8411fe57f8e1">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/43420bd77408559cb66c83e9ce601426b371bc74">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/0f9075aefb620bbef4609111289ff6255ac15cd3">view</a>]</li>
+<li>issue #7652: folder in file list has file icon (#7654) [<a href="https://github.com/doxygen/doxygen/commit/022dfa0527cc79a597a7b06db87dcb2f8b19eca7">view</a>]</li>
+<li>issue #7660: In the ceph package error: non-const getNamespaceDef() called on aliased member. [<a href="https://github.com/doxygen/doxygen/commit/e4070d58bb8d8ee8fe63c33480732b963f33c23f">view</a>]</li>
+<li>issue #7664: bigobj not found with MSYS Makefiles [<a href="https://github.com/doxygen/doxygen/commit/eab35a39804e4ccac521057112f138d3e32efac9">view</a>]</li>
+<li>issue #7672: Request: use &lt;img&gt; tags instead of &lt;object&gt; tags for SVG images [<a href="https://github.com/doxygen/doxygen/commit/2d91d8c497855600e1ab107d6edc358dcade18e0">view</a>]</li>
+<li>issue #7674: Mention EXTRACT_ALL in the context of /file [<a href="https://github.com/doxygen/doxygen/commit/1d403d6449ef632d94ac0973c9128ddb584ffc6a">view</a>]</li>
+<li>issue #7692: \copydoc does not work with file paths including dots [<a href="https://github.com/doxygen/doxygen/commit/f929c5991b92678c167b82a9171777fef11672f1">view</a>]</li>
+<li>issue #7514: Missing parenthesis for typedef function pointer [<a href="https://github.com/doxygen/doxygen/commit/cbeaf5763aef97b1f116c9996cb69c74133162bc">view</a>]</li>
+<li>A mainpage doesn&#39;t have an anchor to jump to [<a href="https://github.com/doxygen/doxygen/commit/77feb077388e2539c17b9709750553d7454626f2">view</a>]</li>
+<li>Avoid unsupported html attributes from appearing in the XML/docbook output and other small fixes [<a href="https://github.com/doxygen/doxygen/commit/90fb3132ce02eb44abe3797954267fefcb8d10a8">view</a>]</li>
+<li>Crash of doxygen on not understood code [<a href="https://github.com/doxygen/doxygen/commit/a73a6388956714f4a0dbd07259d0aa1ed4ddaf03">view</a>]</li>
+<li>Fix CROS javascript issue when giving focus to search result frame. [<a href="https://github.com/doxygen/doxygen/commit/2f66c80e7d59f2dd22036b17e77a48e547705d96">view</a>]</li>
+<li>Disappearing words in RTF output after a list [<a href="https://github.com/doxygen/doxygen/commit/8c565720187f27a325b6fa4e1f2fa8e92ae6615a">view</a>]</li>
+<li>Consistency `\*only` and `\end*only` commands [<a href="https://github.com/doxygen/doxygen/commit/93a6f04ac6f9df7c66b704b24383e3d239fc7c17">view</a>]</li>
+<li>Showing information from all `*only commands in XML output [<a href="https://github.com/doxygen/doxygen/commit/afe51035be938b90b1790aa40937a93207ccdd34">view</a>]</li>
+<li>Fix #7490 and #7494 [<a href="https://github.com/doxygen/doxygen/commit/05c7c93281332adfc92e49c9f3ffd2715065e1ac">view</a>]</li>
+<li>Fix 6342: Applying provided patch [<a href="https://github.com/doxygen/doxygen/commit/323f983a7b3b76cd309acbc743391a9e6829c244">view</a>]</li>
+<li>Fix build error after &#39;make clean&#39; due to creation of unpatched JavaCC.h [<a href="https://github.com/doxygen/doxygen/commit/b107d3412b12c37a6b87c7315bc4039446cd3338">view</a>]</li>
+<li>Fix compiler warnings on Windows (Visual Studio) [<a href="https://github.com/doxygen/doxygen/commit/f6cd1a9f2da30c33b80955c061f5a106ae4fdf42">view</a>]</li>
+<li>Fix double ended list in changelog.doc [<a href="https://github.com/doxygen/doxygen/commit/a9268b0b29ebe10c6752466e9f290afa81f68913">view</a>]</li>
+<li>Fix for Portable::isAbsolutePath [<a href="https://github.com/doxygen/doxygen/commit/b8f3c3ddf91f5ae71d5a012f188461259b2f7e69">view</a>]</li>
+<li>Fix for compilation issue on Linux [<a href="https://github.com/doxygen/doxygen/commit/84951f8ee67a7000fe617b73f7e50b9495763ad9">view</a>]</li>
+<li>Fix for compile issue on Travis-CI [<a href="https://github.com/doxygen/doxygen/commit/77ba85cf74d85ebf68c69d7d42e33839902e2f97">view</a>]</li>
+<li>Fix for potential crash when processing VHDL [<a href="https://github.com/doxygen/doxygen/commit/abb7f5372f3646d8dc70fb5c47344dc9250d8b2c">view</a>]</li>
+<li>Fix for removed spaces in certain \if \else \endif constructs [<a href="https://github.com/doxygen/doxygen/commit/ac3ad1e58da96a28cb09cb9fab5b34837bc1c292">view</a>]</li>
+<li>Fix for unused variable JAVASCRIPT_LICENSE_TEXT. [<a href="https://github.com/doxygen/doxygen/commit/1b071a1ac3bf0f5be8026a6f4ff61c05995b48b3">view</a>]</li>
+<li>Fix html file ext in external docs (#7679) [<a href="https://github.com/doxygen/doxygen/commit/e40d6588c22f465d9cdd17a58f089031ebab581b">view</a>]</li>
+<li>Fix not correctly formatted messages [<a href="https://github.com/doxygen/doxygen/commit/dcd90f9779e3d2608e4c1e9225d1c0e5c12249f9">view</a>]</li>
+<li>Fix regression when creating directory graphs [<a href="https://github.com/doxygen/doxygen/commit/30887ace1d06cc76bdd1b5aa3895e21dc39fddab">view</a>]</li>
+<li>Fix the problem character string between &#39;&lt;&#39; and &#39;&gt;&#39; is not output in doxywizard log. (#7631) [<a href="https://github.com/doxygen/doxygen/commit/7c3b332d233965544467f5e84e249e5985587cb2">view</a>]</li>
+<li>Fix wrongly detecting ``` as code block inside running text. [<a href="https://github.com/doxygen/doxygen/commit/dc7729800038933a099f2b1c6409ee5210e248bb">view</a>]</li>
+<li>Fixed error in Windows build [<a href="https://github.com/doxygen/doxygen/commit/4a7d454f0e9a637a0d68ba38ea36b0d780e69648">view</a>]</li>
+<li>Fixed indenting in French translation so as to minimize differences with the English version [<a href="https://github.com/doxygen/doxygen/commit/b06437c30311e1b3611bd34d5a3aa2cdd5f854a2">view</a>]</li>
+<li>Fixed minor typo (#7637) [<a href="https://github.com/doxygen/doxygen/commit/ef07bc9fb2fc86d30f4a6781c4b0c48564d27b03">view</a>]</li>
+<li>Fixed section type setting for index page from tags file. (#7684) [<a href="https://github.com/doxygen/doxygen/commit/4b5a3c19573ae5e9a6e6ade8aca9fbe9f307bbd2">view</a>]</li>
+<li>Fixed shadowing issue in getFortranDefs and other shadowing cases [<a href="https://github.com/doxygen/doxygen/commit/bc83eb68e2fd31faa4b1ca7bb6610b30c0a24659">view</a>]</li>
+<li>Fixed sig11 regression while parsing cast to function pointer [<a href="https://github.com/doxygen/doxygen/commit/a825e8dc7bf8a3fc8fac24d601a4107f552fa5db">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/d0622bb6c0c607d8c974e46ee4c77f01ac0d40cc">view</a>]</li>
+<li>Fixed typo [<a href="https://github.com/doxygen/doxygen/commit/d0705323ef3fdc1db315ee8cd8326a7d0da5ced7">view</a>]</li>
+<li>Fixup condition-variable and mutex [<a href="https://github.com/doxygen/doxygen/commit/d47343e2a932c2b7834850ed903943c635f7bd3c">view</a>]</li>
+<li>Incorrect determination of fixed form Fortran [<a href="https://github.com/doxygen/doxygen/commit/f4a10139c6652a122912754ccc0b453e703c92bf">view</a>]</li>
+<li>Incorrect link generated for cite and xref (#7648) [<a href="https://github.com/doxygen/doxygen/commit/d165a89863eab073702afb0e19b44cf2e85f7db5">view</a>]</li>
+<li>Function definitions at begin of a line [<a href="https://github.com/doxygen/doxygen/commit/98302da8f020c339960617761a8e5a4dd602f5ca">view</a>]</li>
+<li>Incorrect handling of typedef in combination with const [<a href="https://github.com/doxygen/doxygen/commit/e5451841b6e54171c0124e32a2773153ff3de922">view</a>]</li>
+<li>Link in case of comma at end of URL [<a href="https://github.com/doxygen/doxygen/commit/c7ab46f20fa5a7ac219dc6368daeccf381cd47f6">view</a>]</li>
+<li>Minor fixes for table cell attributes in XML and docbook output [<a href="https://github.com/doxygen/doxygen/commit/93245ad926ce01720eb35b9cf000992a44ac85c0">view</a>]</li>
+<li>Missing anchors in RTF code output (#7647) [<a href="https://github.com/doxygen/doxygen/commit/f788f684f055c5470d624f3c27c6e236f18c2c31">view</a>]</li>
+<li>Opening and ending tag mismatch: tbody in docbook output [<a href="https://github.com/doxygen/doxygen/commit/e427e3b1e2a03af6d87b7d46996aabafde454bcc">view</a>]</li>
+<li>Problem in case using PREDEFINED with comma [<a href="https://github.com/doxygen/doxygen/commit/00b45f73c67f5c57407e6e2a783af7f0820afa4d">view</a>]</li>
+<li>Problem in case using PREDEFINED with comma and using += [<a href="https://github.com/doxygen/doxygen/commit/5a0cfa3bd29d8643c7744d03d8fba4ae990aa260">view</a>]</li>
+<li>Problem with links from search index files [<a href="https://github.com/doxygen/doxygen/commit/7bb28cb61ee12edf77aa0c368eaf747fb162bad9">view</a>]</li>
+<li>Problem with temporary / intermediate directory in doxyparse [<a href="https://github.com/doxygen/doxygen/commit/57662b4051d9c861e089072ed3dc6409f81ff3f7">view</a>]</li>
+</ul>
+<h3>Features</h3>
+<ul>
+<li>Added the few missing French translations [<a href="https://github.com/doxygen/doxygen/commit/8d71db8f1c30f2f6e746e705501a269144cd1260">view</a>]</li>
+<li>Updated Swedish translation to match the latest version [<a href="https://github.com/doxygen/doxygen/commit/ffe779e1a06157ec9005bc6fa7759fe8c74f4a60">view</a>]</li>
+<li>Adding check on configuration setting EXTENSION_MAPPING [<a href="https://github.com/doxygen/doxygen/commit/ece9bb503529d92e366554c6852d868d48ada8cb">view</a>]</li>
+<li>Adding commands `\rtfinclude`, `\docbookinclude`, `\maninclude` and `\xmlinclude` [<a href="https://github.com/doxygen/doxygen/commit/b59182f64dcb75bd9b7ddcb31e28fae459c4cf03">view</a>]</li>
+<li>output on doxyparse if a function is a prototype [<a href="https://github.com/doxygen/doxygen/commit/f5a91767dc32230f7fc39d78d42d3f16a8961895">view</a>]</li>
+<li>print protection information on doxyparse [<a href="https://github.com/doxygen/doxygen/commit/c6b9eb426893e294d6a2f9261d689d25fe5fa546">view</a>]</li>
+<li>Creation of svg images for formulas with inkscape [<a href="https://github.com/doxygen/doxygen/commit/d32c7f52414d6a2bcb8b2a62bb780333348000be">view</a>]</li>
+<li>Improve formula handling and rendering. [<a href="https://github.com/doxygen/doxygen/commit/10b2b8fc694b60a17ccd2642f3a40c851e33b9da">view</a>]</li>
+<li>Doxygen version in the messages output (#7640) [<a href="https://github.com/doxygen/doxygen/commit/ffd222f0bb26e6b9fb696bfda60a5f675cae1514">view</a>]</li>
+<li>Doxygen version information (#7645) [<a href="https://github.com/doxygen/doxygen/commit/39ba759f4dba837818f07451314b3612d438a1bd">view</a>]</li>
+<li>Enabling Travis builds for s390x [<a href="https://github.com/doxygen/doxygen/commit/83af252278a91518e1ee362136df9f746a7a2650">view</a>]</li>
+<li>Relative markdown file reference (#7032) [<a href="https://github.com/doxygen/doxygen/commit/307a912cc0e4e080c49e4b47f2c8f5a7ffb605ba">view</a>]</li>
+</ul>
+<h3>Refactoring and cleanup</h3>
+<ul>
+<li>Add documentation to section.h [<a href="https://github.com/doxygen/doxygen/commit/d391530e102a919d8b0a51ecb74b1815b896bc27">view</a>]</li>
+<li>Add printf-Checks to message.h [<a href="https://github.com/doxygen/doxygen/commit/8aead913d6a8285c2949f93147efaec5f7b357d8">view</a>]</li>
+<li>Added missing #includes [<a href="https://github.com/doxygen/doxygen/commit/6511573f661d3f8eacc6d316222fd77b98720d6a">view</a>]</li>
+<li>CMake and examples [<a href="https://github.com/doxygen/doxygen/commit/f06f4276189066cad0a5dbd291c1e7021ab87b44">view</a>]</li>
+<li>Cleanup code [<a href="https://github.com/doxygen/doxygen/commit/023b07ca13263a9d6d50ffa806d5aad35e31c869">view</a>]</li>
+<li>Cleanup unused/unwanted parser dependencies on code generator [<a href="https://github.com/doxygen/doxygen/commit/9ebe579b8ccce09c174bfaca475bf628233d3944">view</a>]</li>
+<li>Combined both rules in one to reduce code duplication [<a href="https://github.com/doxygen/doxygen/commit/de785c9b27fab590ae1d05de21be9391bdfb751e">view</a>]</li>
+<li>Compilation warnings [<a href="https://github.com/doxygen/doxygen/commit/d65fa97b0400551720e0b3839f79a5ab8555fe84">view</a>]</li>
+<li>Correct handling of error / removed debug statement [<a href="https://github.com/doxygen/doxygen/commit/bebd80f5a3715a4d3e7f1f2ed7a78ff7711c01b0">view</a>]</li>
+<li>Correction behavior of make clean in respect to version files [<a href="https://github.com/doxygen/doxygen/commit/de30df322c5b8c01133a008822c691959ebf93a4">view</a>]</li>
+<li>Correction due to removal of Tcl [<a href="https://github.com/doxygen/doxygen/commit/657605d0b26c0d66036073c5deeddff21ad9f6d9">view</a>]</li>
+<li>Documentation correction due to removal of Tcl [<a href="https://github.com/doxygen/doxygen/commit/9b6c44d71d58a95c455ad133511bab332fe82c6c">view</a>]</li>
+<li>Doxywizard unknown configuration enum values [<a href="https://github.com/doxygen/doxygen/commit/9b2564369d1769c6bce4695057c2b0184a1457e2">view</a>]</li>
+<li>Enabled stricter compiler warnings and fixed all new warnings [<a href="https://github.com/doxygen/doxygen/commit/4658413ff3b9551fac67907f296a586e9f2c15ed">view</a>]</li>
+<li>Fix C compiler warnings about C++ flags (#7636) [<a href="https://github.com/doxygen/doxygen/commit/01edb490daa2942227992d8a60bd3673551995bf">view</a>]</li>
+<li>Fix a few compiler warnings in the Linux build [<a href="https://github.com/doxygen/doxygen/commit/107d84ae68208f51b524c2f0b933784a26d23ad3">view</a>]</li>
+<li>Fix a number of compiler warnings in the 64bit build for Windows [<a href="https://github.com/doxygen/doxygen/commit/fbebfae209139fccb15fde8fb7d1bdbb4b941875">view</a>]</li>
+<li>Make VHDL parser reentrant [<a href="https://github.com/doxygen/doxygen/commit/5b9bf6e3549ac9011f607cc50e764da6af347689">view</a>]</li>
+<li>Make commentscan.l reentrant [<a href="https://github.com/doxygen/doxygen/commit/e55c2248b46d5580e5b184d2ff9c773f333308b2">view</a>]</li>
+<li>Make defargs.l reentrant [<a href="https://github.com/doxygen/doxygen/commit/a036d6401cc457f6c80899775a471bb5ac4d5323">view</a>]</li>
+<li>Make fortranscanner.l reentrant [<a href="https://github.com/doxygen/doxygen/commit/79cca781278544a7efc3a5538e2252ab399e08df">view</a>]</li>
+<li>Make pyscanner.l reentrant [<a href="https://github.com/doxygen/doxygen/commit/c22852aae860d42ed3a0895926199b364dbf84db">view</a>]</li>
+<li>Mention EXTRACT_ALL in the context of /file [<a href="https://github.com/doxygen/doxygen/commit/13bf5827b01d81e1b75151049113875b2a6e7d60">view</a>]</li>
+<li>Migrated some code in pre.l to use STL containers [<a href="https://github.com/doxygen/doxygen/commit/b0554573d373519dbf8bc7109e0e143952ec6302">view</a>] and [<a href="https://github.com/doxygen/doxygen/commit/29f29c2eb1a75ff02624fdb2badd47dd55427841">view</a>]</li>
+<li>Minor fix for formulas.doc [<a href="https://github.com/doxygen/doxygen/commit/b78abaaf9acba05b12fc3f155608198061e54e10">view</a>]</li>
+<li>Minor tweaks [<a href="https://github.com/doxygen/doxygen/commit/630774460c480494d7ce66a0f91d49da60403ef4">view</a>]</li>
+<li>Modernize OutputList internals [<a href="https://github.com/doxygen/doxygen/commit/7464fdd7d4a3efd97dbc24c171556d7683648c8d">view</a>]</li>
+<li>More accurate warning message. [<a href="https://github.com/doxygen/doxygen/commit/f9672b168b7d3b06d845d7d0aaa039ec96f6f0c4">view</a>]</li>
+<li>More indicative warning for wrong nesting of sections [<a href="https://github.com/doxygen/doxygen/commit/4281a6cb105c3b57bb8f866ec55e8ef13060c401">view</a>]</li>
+<li>Move DocGroup inside CommentScanner instead of using a global [<a href="https://github.com/doxygen/doxygen/commit/8d49c7c40e59970565872f666e2110755cac7828">view</a>]</li>
+<li>Possibility to use gswin64c on Windows [<a href="https://github.com/doxygen/doxygen/commit/95723b6842f52dc044c34bd0218b0661d1e59c9e">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/b96dc0fd971a3569e2a986e833c2eb7f24db69f2">view</a>]</li>
+<li>QString -&gt; std::string &amp; QDict -&gt; std::map [<a href="https://github.com/doxygen/doxygen/commit/e0fa50b71c74a191a64a2361564a016e6f9c0204">view</a>]</li>
+<li>Remove DotConstString and replace by std::string [<a href="https://github.com/doxygen/doxygen/commit/593d0591487c65d5d51246e8e6ea93c83518f6c4">view</a>]</li>
+<li>Remove dead code and fix more warnings [<a href="https://github.com/doxygen/doxygen/commit/a8673fb74375089a432aa23230396335a46df5d3">view</a>]</li>
+<li>Remove duplicate xsd fields for `docMarkupType`. [<a href="https://github.com/doxygen/doxygen/commit/2084f3ae9d1da27ddd420c8ffe65345598688381">view</a>]</li>
+<li>Remove last QThread-Reference [<a href="https://github.com/doxygen/doxygen/commit/475b4d7388cfc408fed097d80521db289c4522b9">view</a>]</li>
+<li>Remove some unused enums in doxywizard [<a href="https://github.com/doxygen/doxygen/commit/bbbf9035f9ee54c7b7b556532a6639e68c87d5c5">view</a>]</li>
+<li>Remove thread-related Qt-Code [<a href="https://github.com/doxygen/doxygen/commit/739e9c039b6678b0565922f8a38e062cc83fd702">view</a>]</li>
+<li>Remove unused rules [<a href="https://github.com/doxygen/doxygen/commit/ab40bb00ea1161afdc997699ace362b67916e34e">view</a>]</li>
+<li>Remove warnings from doxywizard [<a href="https://github.com/doxygen/doxygen/commit/79745c1110f973ac14b4087f7c199f7c8fd02469">view</a>]</li>
+<li>Removed Doxygen::gatherDefines as it was not used anymore [<a href="https://github.com/doxygen/doxygen/commit/e2157cd6d65297339419e73b53e01a7d2cd25d2c">view</a>]</li>
+<li>Removing warnings from doxygen internal documentation [<a href="https://github.com/doxygen/doxygen/commit/f15360bf1445b5edfdc82fd027fdab0f29e1d8e5">view</a>]</li>
+<li>Replace DocCmdMapper by std::map [<a href="https://github.com/doxygen/doxygen/commit/701388717d38b2a5063e35c87e07264099cb60cd">view</a>]</li>
+<li>Replace QMutex and condition QWaitCondition with std:: [<a href="https://github.com/doxygen/doxygen/commit/e8f0640e7e80351de68b40b5114f71fe94dc5fee">view</a>]</li>
+<li>Replace QThread with std::thread [<a href="https://github.com/doxygen/doxygen/commit/5a6f35b0de84350b867e06b3eb85622c4cface37">view</a>]</li>
+<li>Replace SDict with std::map [<a href="https://github.com/doxygen/doxygen/commit/9ab5f68756f1555a805dda5d0215d275d3db8725">view</a>]</li>
+<li>Replace qlist with std::vector [<a href="https://github.com/doxygen/doxygen/commit/00e79b8621b00f72ea56f81b1c4df9eae4ed9252">view</a>]</li>
+<li>Replace qqueue with std::queue [<a href="https://github.com/doxygen/doxygen/commit/110cb591c076f84b6dee49b3fa2a1ebc107f7945">view</a>]</li>
+<li>Replace raw bool pointer array and counter by std::stack&lt;bool&gt; [<a href="https://github.com/doxygen/doxygen/commit/734702dc761ba40533cebf3cf405071cc9b8eb20">view</a>]</li>
+<li>Replaced FileNameDict/FileNameList by FileNameLinkedMap [<a href="https://github.com/doxygen/doxygen/commit/4bc2355373979726c7ed4e8351639123daf808cb">view</a>]</li>
+<li>Replaced MemberNameSDict by MemberNameLinkedMap based on LinkedMap [<a href="https://github.com/doxygen/doxygen/commit/369e821fc6870e9e6b30aa13d59592c12c760800">view</a>]</li>
+<li>Restructure citation handling [<a href="https://github.com/doxygen/doxygen/commit/fa520f975a0893c0d123c1cafec63206bf737794">view</a>]</li>
+<li>Restructure section handling [<a href="https://github.com/doxygen/doxygen/commit/1a56a39b4a97452a5c7c2d8e9d39ab28ca33dff0">view</a>]</li>
+<li>Restructure the way RefLists are handled [<a href="https://github.com/doxygen/doxygen/commit/aca13723a9373a1080ca7f108e7be0905b9ae793">view</a>]</li>
+<li>Simplified the code a bit [<a href="https://github.com/doxygen/doxygen/commit/a6383d9ed3381975337e1d100427f7c022f0a247">view</a>]</li>
+<li>Small spelling correction in change log [<a href="https://github.com/doxygen/doxygen/commit/288631a327a03cc383a3128623425f627d9859da">view</a>]</li>
+<li>Small spelling correction in portable.cpp [<a href="https://github.com/doxygen/doxygen/commit/ba4e098a09da73738bd0f849492719bc37d36f1b">view</a>]</li>
+<li>Specifying filename in preprocessor debug output [<a href="https://github.com/doxygen/doxygen/commit/8616d8e1ee61d3fc1a929a04f1594b0f417da7c2">view</a>]</li>
+<li>Unknown configuration enum values [<a href="https://github.com/doxygen/doxygen/commit/9c9e30b295ca8b0a2130aa00c26bb5aa40a0e608">view</a>]</li>
+<li>Updated test 024 to better test spacing behaviour. [<a href="https://github.com/doxygen/doxygen/commit/b47de248b2c4d54bd83a4c679fa6a58dbaf3fe11">view</a>]</li>
+<li>Warnings in case of a VHDL error [<a href="https://github.com/doxygen/doxygen/commit/5bda6a19dcb48720ee57fc099f7ad14e4ad15b0a">view</a>]</li>
+<li>commentscan.l: replace QStack by std::stack [<a href="https://github.com/doxygen/doxygen/commit/5e815d8f3dd1cad071a6152b458c08f197bb00d2">view</a>]</li>
+<li>fixed some parser bugs,make parser ready for javacc 7.0.5 [<a href="https://github.com/doxygen/doxygen/commit/543a30dfcf050c772a5ef5420c821acbfe3cac9f">view</a>]</li>
+</ul>
+<p>
+\endhtmlonly
+
\subsection log_1_8_17 Release 1.8.17
\htmlonly
<b>(release date 27-12-2019)</b>
@@ -2421,13 +3072,13 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<h3>New features</h3>
<ul>
<li> Added support for "clang assisted parsing", which allows
- the code to also be parsed via libclang (C/C++ frontend of LLVM)
- and can improve the quality of the syntax highlighting, cross-references,
- and call graphs, especially for template heavy C++ code. To enable
- this feature you have to configure doxygen with the --with-libclang
- option. Then you get two new configuration options: CLANG_ASSISTED_PARSING
- to enable or disable parsing via clang and CLANG_OPTIONS to pass additional
- compiler options needed to compile the files. Note that enabling this feature
+ the code to also be parsed via libclang (C/C++ frontend of LLVM)
+ and can improve the quality of the syntax highlighting, cross-references,
+ and call graphs, especially for template heavy C++ code. To enable
+ this feature you have to configure doxygen with the --with-libclang
+ option. Then you get two new configuration options: CLANG_ASSISTED_PARSING
+ to enable or disable parsing via clang and CLANG_OPTIONS to pass additional
+ compiler options needed to compile the files. Note that enabling this feature
has a significant performance penalty.</li>
<li> Included patch donated by Intel which adds Docbook support.
This can be enabled via GENERATE_DOCBOOK and the output location can
@@ -2435,26 +3086,26 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
added using \docbookonly ... \enddocbookonly</li>
<li> Added support for UNO IDL (interface language used in Open/Libre Office), thanks to
Michael Stahl for the patch.</li>
-<li> Included patch by Adrian Negreanu which stores data gathered by
+<li> Included patch by Adrian Negreanu which stores data gathered by
doxygen in a sqlite3 database. Currently still work in progress and
can only be enabled using --with-sqlite3 during ./configure.</li>
<li> For interactive SVG graphs, edges are now highlighted when hovered by
the mouse.</li>
<li> Include patch by Adrian Negreanu to show duration statistics after a run.
You can enable this by running doxygen with the "-d Time" option.</li>
-<li> Included patch by Markus Geimer which adds a new option
+<li> Included patch by Markus Geimer which adds a new option
LATEX_EXTRA_FILES which works similarly to HTML_EXTRA_FILES in that
it copied specified files to the LaTeX output directory.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5149">5149</a>: Added support for C++11 keyword alignas</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5056">5056</a>: Added support for processing DocSets with Dash (thanks to
Bogdan Popescu for the patch </li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4900">4900</a>: Added option EXTERNAL_PAGES which can be used to determine
- whether or not pages imported via tags will appear under related
+ whether or not pages imported via tags will appear under related
pages (similar to EXTERNAL_GROUPS).</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5042">5042</a>: Added new MathJax command MATHJAX_CODEFILE which supports
including a file with MathJax related scripting to be inserted before
the MathJax script is loaded. Thanks to Albert for the patch.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5070">5070</a>: Comments in the config file starting with ## will now be
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5070">5070</a>: Comments in the config file starting with ## will now be
kept when upgrading the file with doxygen -u (and doxygen -s -u).
Thanks to Albert for the patch.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5061">5061</a>: Adds support for Latvian (thanks to a patch by Lauris).</li>
@@ -2470,7 +3121,7 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> id <a href="https://github.com/doxygen/doxygen/issues/2445">2445</a>: Putting a @todo in front of an anonymous namespace caused
bogus entry in the todo list.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3198">3198</a>: Fixed alignment issue with tabs and multibyte characters.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3230">3230</a>: Character entities in titles were not rendered correctly
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3230">3230</a>: Character entities in titles were not rendered correctly
in the HTML navigation tree.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3272">3272</a>: No space between * and tag (e.g. \endcode) made parser
misbehave</li>
@@ -2483,11 +3134,11 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
Code when starts in Line 1</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4096">4096</a>: Fortran: array constructors with brackets were not correctly
recognized.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4223">4223</a>: The generated man pages had a .PP just before the subject
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4223">4223</a>: The generated man pages had a .PP just before the subject
description</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4224">4224</a>: On generated manpages the return section is incorrectly
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4224">4224</a>: On generated manpages the return section is incorrectly
indented</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4261">4261</a>: use \page now generates a man page were the . is not
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4261">4261</a>: use \page now generates a man page were the . is not
replaced by _8.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4385">4385</a>: Fixed issue with PROJECT_LOGO when using backslashes in
the path.</li>
@@ -2499,21 +3150,21 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> id <a href="https://github.com/doxygen/doxygen/issues/4788">4788</a>: Included patch by Albert to correctly link pages in the manual</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4850">4850</a>: Added support for single column Markdown tables.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4855">4855</a>: Incomplete documentation on doxygen -w latex</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4877">4877</a>: Doxygen crashed when structural commands (like \var) appeared
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4877">4877</a>: Doxygen crashed when structural commands (like \var) appeared
in .md files.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4926">4926</a>: Fixed character encoding problem when multibytes characters
were used in anchors.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5013">5013</a>: Documentation before an anonymous member did not appear.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5040">5040</a>: Fixed Markdown related indentation problem.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5044">5044</a>: Regression: Text after @copydoc was not visible anymore.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5046">5046</a>: Linked to external pages was done using the page label
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5046">5046</a>: Linked to external pages was done using the page label
rather than the file name.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5059">5059</a>: build using ./configure ; make did not work if the path
contained a space.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5060">5060</a>: Tag files are now identified by the full path instead of
only the name of the tag file.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5086">5086</a>: In some cases members were missing from the tag file.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5079">5079</a>: Fortran: derive intent from documentation in case no
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5079">5079</a>: Fortran: derive intent from documentation in case no
intent is specified</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5089">5089</a>: Warning was not reported at the correct line in two cases.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5092">5092</a>, <a href="https://github.com/doxygen/doxygen/issues/5093">5093</a>: @cond..@endcond did not work properly for removing
@@ -2522,7 +3173,7 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
same name to the same group.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5100">5100</a>: VHDL: fixed issue generating LaTeX output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5116">5116</a>: Fortran: improved handling of protected statement</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5124">5124</a>: Fortran: Fixed issue resulting in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5124">5124</a>: Fortran: Fixed issue resulting in
"Stack buffers nested too deeply" error.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5128">5128</a>: @cond was not handled properly by the preprocessor.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5133">5133</a>: @copyright command did not end a brief description.</li>
@@ -2531,7 +3182,7 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> id <a href="https://github.com/doxygen/doxygen/issues/5152">5152</a>: Fixed problem handling @cond for #define's</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5144">5144</a>: Fixed potential crash when searching files.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5131">5131</a>: #include's inside namespace could result in duplicate entries.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5132">5132</a>: Doxywizard: Labels of items are now also grayed out
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5132">5132</a>: Doxywizard: Labels of items are now also grayed out
when an item is disabled (thanks to Albert for the patch).</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5154">5154</a>: Changed Markdown page label to support multiple .md files
with the same name.</li>
@@ -2546,7 +3197,7 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> id <a href="https://github.com/doxygen/doxygen/issues/5164">5164</a>: Template parameters and Exceptions were rendered differently
than Parameters and Return Values in the LaTeX output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Tcl: Fixed crash when parsing certain Tcl code.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5171">5171</a>: Comment blocking ending with ///// made slashes appear in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5171">5171</a>: Comment blocking ending with ///// made slashes appear in
the output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5180">5180</a>: Added support for separating auto list items with an
empty paragraph.</li>
@@ -2568,11 +3219,11 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
</p>
<h3>Changes</h3>
<ul>
-<li> Changed to way the search results for multiple projects can be linked
+<li> Changed to way the search results for multiple projects can be linked
together. A project is now no longer identified by the tag files name but
via new option EXTERNAL_SEARCH_ID giving a bit more flexibility.</li>
<li> Disabled the disk cache for member data. Allows removing quite some complexity
- in doxygen and is not really needed now that 64bit systems with &gt;4GB RAM
+ in doxygen and is not really needed now that 64bit systems with &gt;4GB RAM
are becoming more common. Let me know if you think you benefit from this caching.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5031">5031</a>: Using $relpath$ in a custom footer could lead to ambiguities
when followed by a name that could also be a marker, like 'search'.
@@ -2583,47 +3234,47 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<ul>
<li> You can now use EXTENSION_MAPPING on files without any extension using
no_extension as placeholder (thanks to Jason Majors for the patch).</li>
-<li> To make navindex section inside a layout file that links to
+<li> To make navindex section inside a layout file that links to
a specific URL you can use usergroup with the url attribute.</li>
-<li> To make navindex section without any link inside a layout file you
+<li> To make navindex section without any link inside a layout file you
can use usergroup with special title [none].</li>
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4191">4191</a>: Fortran: Included patch to improve parsing line continuation
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4191">4191</a>: Fortran: Included patch to improve parsing line continuation
characters.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4204">4204</a>: Fortran: added support for protected attribute</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4859">4859</a>, <a href="https://github.com/doxygen/doxygen/issues/5023">5023</a>: When using @copydoc, paragraphs breaks did not appear
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4859">4859</a>, <a href="https://github.com/doxygen/doxygen/issues/5023">5023</a>: When using @copydoc, paragraphs breaks did not appear
in the copied documentation.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4930">4930</a>: Fortran: handle single quotes in normal Fortran comment.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4931">4931</a>, <a href="https://github.com/doxygen/doxygen/issues/5025">5025</a>: Scope of forwardly declared template class was lost
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4931">4931</a>, <a href="https://github.com/doxygen/doxygen/issues/5025">5025</a>: Scope of forwardly declared template class was lost
in the output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4978">4978</a>: Tcl: Inline source code was not rendered correctly.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5005">5005</a>: Fixed case were a cyclic inheritance relation could crash
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5005">5005</a>: Fixed case were a cyclic inheritance relation could crash
doxygen.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5008">5008</a>: Using @subpage in a -# style list was not handled properly.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5012">5012</a>: For a mainpage without title the project name is now shown as
the title in the XML output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5017">5017</a>: The generated list of citations is now no longer included in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5017">5017</a>: The generated list of citations is now no longer included in
the tag file.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5014">5014</a>: Documenting strongly typed enum values outside of the enum
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5014">5014</a>: Documenting strongly typed enum values outside of the enum
did not work.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5022">5022</a>: Python: = was missing in the output for variable assignment.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5024">5024</a>: Doxygen could crash when creating inline msc graphs.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5026">5026</a>: Members didn't have a More.. link to jump to detailed docs.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/5030">5030</a>: Doxygen did not probably distinguish between two template</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5034">5034</a>: regression: C++ style comments that started with a line of
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5034">5034</a>: regression: C++ style comments that started with a line of
slashes did not get processed correctly anymore. </li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/5038">5038</a>: Fixed parse error when left shift operator occurred as a
+<li> id <a href="https://github.com/doxygen/doxygen/issues/5038">5038</a>: Fixed parse error when left shift operator occurred as a
default parameter.
members or functions that only differ in the return type.</li>
<li> Setting SEARCH_INCLUDES to NO resulted in no include graphs and no
include files being listed in the output.</li>
<li> Improved support for MinGW (thanks to a patch by Brecht Sanders).</li>
-<li> Removed the Graphviz/dot dependency when building the doxygen
+<li> Removed the Graphviz/dot dependency when building the doxygen
documentation.</li>
<li> Anchors to sub pages were wrong in the XML output.</li>
-<li> Included VHDL patch by Martin Kreis that improves the flow chart
+<li> Included VHDL patch by Martin Kreis that improves the flow chart
generation.</li>
<li> corrected several code pages and fontsets for proper RTF output for
a number of languages such as Greek.</li>
@@ -2637,18 +3288,18 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
</p>
<h3>Changes</h3>
<ul>
-<li> Expanding the tree in an index page of the HTML output, will now
+<li> Expanding the tree in an index page of the HTML output, will now
expand only one level instead of the whole sub-tree (thanks to
Pez Cuckow for the patch).</li>
<li> A blockquote in Markdown does no longer require a whitespace
after the last '&gt;' if the '&gt;' is followed by a newline.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4863">4863</a>: Included patch to add version info to all generated
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4863">4863</a>: Included patch to add version info to all generated
template files (headers, footers, stylesheets, layout files, etc).</li>
</ul>
<h3>New features</h3>
<ul>
-<li> Added support for using external tools to index and search through
- the HTML documentation. An example index tool is provided (doxyindexer)
+<li> Added support for using external tools to index and search through
+ the HTML documentation. An example index tool is provided (doxyindexer)
and an example search engine (doxysearch.cgi).
To configure the external search engine the following new options
are added to the configuration file: EXTERNAL_SEARCH (to enable the
@@ -2658,16 +3309,16 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
See the <a href="extsearch.html">manual</a> for details.</li>
<li> Added USE_MDFILE_AS_MAINPAGE config option to select a markdown page to
be used as the main page.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3945">3945</a>: This patch (contributed by Albert) adds support for
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3945">3945</a>: This patch (contributed by Albert) adds support for
simple logic expressions for \cond, \if, and friends, i.e. you can do
\if (SOME_SECTION_NAME &amp;&amp; (!THIS_ALTERNATIVE || THAT_ALTERNATIVE))</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4888">4888</a>: Patch (contributed by Albert) adds a new configuration
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4888">4888</a>: Patch (contributed by Albert) adds a new configuration
option MATHJAX_FORMAT to select the MathJax output format. Options are
HTML-CSS, NativeMML, or SVG.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4584">4584</a>: Fixed compile issues with 0 to QCString cast for
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4584">4584</a>: Fixed compile issues with 0 to QCString cast for
old compilers.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4752">4752</a>: A class A deriving from another class B inside a namespace
not known to doxygen, caused class B to appear in the global scope.</li>
@@ -2683,7 +3334,7 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> id <a href="https://github.com/doxygen/doxygen/issues/4853">4853</a>: Improved SIGINT handling when running multiple dot instances.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4860">4860</a>: Fixed problem processing .bib files when using a non default
output directory.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4862">4862</a>: Comment for IDL_PROPERTY_SUPPORT in the config file template
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4862">4862</a>: Comment for IDL_PROPERTY_SUPPORT in the config file template
did not have line wrapping.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4864">4864</a>: Setting SHOW_FILES to NO prevented call graphs from being
generated.</li>
@@ -2691,16 +3342,16 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> id <a href="https://github.com/doxygen/doxygen/issues/4872">4872</a>: Fortran: ALIASes where not replaced in !! and !&lt; comments.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4886">4886</a>: Added meta tag "generator" to HTML output (thanks to
Albert for the patch).</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4899">4899</a>: Sections of the main page did not appear in the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4899">4899</a>: Sections of the main page did not appear in the
navigation tree until the main page had sub pages.
Also fixed bug in treeview that caused mainpage with title and
sections to appear at the same level as the sections.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4908">4908</a>: Doxygen could select the wrong overloaded method when
- the only difference in parameter types was the template type of
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4908">4908</a>: Doxygen could select the wrong overloaded method when
+ the only difference in parameter types was the template type of
a typedef.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4909">4909</a>: Inheriting member documentation did not work in combination
with Java interfaces.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4915">4915</a>: Enum values did not appear in the detailed documentation
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4915">4915</a>: Enum values did not appear in the detailed documentation
when using C++11 style enums.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4920">4920</a>: Even though HIDE_UNDOC_MEMBERS was enabled, the navigation
still showed undocumented members.</li>
@@ -2709,7 +3360,7 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Added XML declaration to index.qhp TOC.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4932">4932</a>: When a class and its base class has the same nested class,
the collaboration diagram could point to the wrong class.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4934">4934</a>: Comments inside a function macro parameter appeared before
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4934">4934</a>: Comments inside a function macro parameter appeared before
the expanded macro, instead of being treated as part of the parameter.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4936">4936</a>: Allow minus in the name of a HTML attribute.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4939">4939</a>: Code fragments were wrapped too early in the latex output.</li>
@@ -2727,16 +3378,16 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> id <a href="https://github.com/doxygen/doxygen/issues/4969">4969</a>: Correct link in documentation of SIP_SUPPORT option.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4979">4979</a>: Fixed bug that could prevent refman.tex from being generated.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4980">4980</a>: Fixed missing space in Chinese translation.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4989">4989</a>: Files added via HTML_EXTRA_STYLESHEET did not correct refer
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4989">4989</a>: Files added via HTML_EXTRA_STYLESHEET did not correct refer
to files that where placed in a subdirectory.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4991">4991</a>: Searching for multibyte characters did not work with the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4991">4991</a>: Searching for multibyte characters did not work with the
server based search engine.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4993">4993</a>: Fixed case where line numbers got out of sync with the code.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4994">4994</a>: First member of an anonymous C++11 style enum was not shown
properly.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4995">4995</a>: Fixed case where _'s where falsely converted to Markdown
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4995">4995</a>: Fixed case where _'s where falsely converted to Markdown
emphasis.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4996">4996</a>: Title not used when \ref'ing to a \section imported via
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4996">4996</a>: Title not used when \ref'ing to a \section imported via
a tag file.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4997">4997</a>: Behavior of @cond was accidentally reversed by new expression
parser.</li>
@@ -2753,7 +3404,7 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
load when using Chrome.</li>
<li> HTML Navigation tree showed static members even when EXTRACT_STATIC was
set to NO.</li>
-<li> Same word could appear multiple times in the match list for an entry
+<li> Same word could appear multiple times in the match list for an entry
in the search results when using server based search.</li>
</ul>
<p>
@@ -2765,8 +3416,8 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
</p>
<h3>Changes</h3>
<ul>
-<li> Using a fenced block (~~~~) in Markdown without explicit extension will
- now be interpreted as a @code..@endcode block instead
+<li> Using a fenced block (~~~~) in Markdown without explicit extension will
+ now be interpreted as a @code..@endcode block instead
of @verbatim..@endverbatim.</li>
<li> Classes inheriting from an class that is outside the scope of doxygen
are still shown in diagrams. This does not hold for usage relations.</li>
@@ -2777,46 +3428,46 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<ul>
<li> strongly typed enums, e.g.:
<pre>enum class E</pre></li>
- <li> enums with explicit type, e.g.:
+ <li> enums with explicit type, e.g.:
<pre>enum E : unsigned int { ... }</pre></li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4749">4749</a>: added support for final keyword on classes and methods.</li>
<li> support for override keyword for methods.</li>
<li> <code>nullptr</code> is new a type keyword in code fragments.</li>
- <li> support for variables with initializer lists,
+ <li> support for variables with initializer lists,
e.g.: <pre>const int var {10};</pre></li>
- <li> support for trailing return types,
+ <li> support for trailing return types,
e.g.: <pre>auto foo() -&gt; Bar;</pre></li>
- <li> id <a href="https://github.com/doxygen/doxygen/issues/4624">4624</a>: added support for template aliases,
+ <li> id <a href="https://github.com/doxygen/doxygen/issues/4624">4624</a>: added support for template aliases,
e.g.: <pre>template&lt;typename T&gt; using A = B&lt;T&gt;;</pre></li>
- <li> support for C++11 variadic templates,
+ <li> support for C++11 variadic templates,
e.g.: <pre>template&lt;typename... Values&gt; class C;</pre></li>
<li> support for documenting template class declarations.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4807">4807</a>: <code>static_assert(...);</code> inside a class is now ignored.</li>
- <li> id <a href="https://github.com/doxygen/doxygen/issues/4793">4793</a>: Add support parameters with default lambda functions,
+ <li> id <a href="https://github.com/doxygen/doxygen/issues/4793">4793</a>: Add support parameters with default lambda functions,
e.g.: <pre>int foo(int i, std::function&lt;int(int)&gt; f = [](int x) -&gt; int { return x / 2; })</pre></li>
- <li> default initializers for non-static data members,
+ <li> default initializers for non-static data members,
e.g.: <pre>class C { public: int x = 4; int y {6}; int z = y*func(); };</pre></li>
- <li> support for decltype as a way selecting a type for a variable,
+ <li> support for decltype as a way selecting a type for a variable,
e.g.: <pre>int x; decltype(x) y;</pre></li>
- <li> support for new string literals,
+ <li> support for new string literals,
e.g. <pre>u8"utf8", u"utf-16", U"utf-32", L"wchar"</pre></li>
- <li> support for raw string literals (with and without user defined
- delimiter),
+ <li> support for raw string literals (with and without user defined
+ delimiter),
e.g. <pre>R"(some"thing)", u8R"raw(some)"thing)raw"</pre></li>
- <li> support for explicitly deleted and defaulted special members
+ <li> support for explicitly deleted and defaulted special members
(<code>=default</code> and <code>=delete</code>).</li>
</ul></li>
-<li> Made several improvements to the way Objective-C categories and protocols
+<li> Made several improvements to the way Objective-C categories and protocols
are handled:
<ul>
- <li> Class extensions are now treated as part of the class, whereas
+ <li> Class extensions are now treated as part of the class, whereas
categories are listed separately.</li>
<li> Fixed parse problem where category had a { } section.</li>
<li> Fixed parse problem for categories that implemented protocols.</li>
<li> Fixed render bug for protocols in class diagrams.</li>
<li> Attributes with the same name as a method are now no longer matched.</li>
<li> Internal properties are now also marked with [implementation]</li>
- <li> Members of categories are shown in the class they extend as well, and
+ <li> Members of categories are shown in the class they extend as well, and
cross reference links are made between these members.</li>
<li> Class extension implementing protocols are now shown as protocols
inherited by the class itself, including the "Implemented by" relation.</li>
@@ -2825,25 +3476,25 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
stylesheet without completely replacing doxygen.css.</li>
<li> Added option AUTOLINK_SUPPORT which can be used to enable/disable
autolinking globally.</li>
-<li> Included language updates for Czech, Spanish, Greek, Slovak, and
+<li> Included language updates for Czech, Spanish, Greek, Slovak, and
Esperanto.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li> Fixed render glitch where template member of a base class was not
properly hidden in the derived class.</li>
-<li> Privately nested classes no longer appear in the declaration section
+<li> Privately nested classes no longer appear in the declaration section
of their parent if EXTRACT_PRIVATE is disabled.</li>
<li> In the declaration section the separator line was in between the
member and its brief description.</li>
<li> Fixed a couple of compiler warning with the new XCode 4.4 compiler.</li>
<li> Added compilation support for Mountain Lion (Mac OS X 10.8).</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4789">4789</a>: Nested namespaces did not appear in the namespace list if the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4789">4789</a>: Nested namespaces did not appear in the namespace list if the
parent namespace was undocumented.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4809">4809</a>: Fixed some spelling errors in the code comments.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4814">4814</a>: Fortran: comma at begin of argument list description in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4814">4814</a>: Fortran: comma at begin of argument list description in
case of implicit type</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4815">4815</a>: Fortran: Entities on line with USE, ONLY were not hyperlinked
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4815">4815</a>: Fortran: Entities on line with USE, ONLY were not hyperlinked
in code.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4816">4816</a>: Fortran: handle carriage return in non terminated strings.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4821">4821</a>: Using Markdown formatting in @todo/@bug/.. like descriptions
@@ -2854,14 +3505,14 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
the same heading (just like \todo and friends). </li>
<li> Fixed case where full directory path was shown even though
FULL_PATH_NAMES was set to NO.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4825">4825</a>: HTML output of template-derived classes contained unescaped
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4825">4825</a>: HTML output of template-derived classes contained unescaped
characters.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4800">4800</a>: "Class Index" appeared twice in the PDF TOC, Index at the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4800">4800</a>: "Class Index" appeared twice in the PDF TOC, Index at the
end did not appear at all.</li>
-<li> In a declaration no link was created when referring to a class inside
+<li> In a declaration no link was created when referring to a class inside
an undocumented namespace imported via a tag file.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4840">4840</a>: Make default for TAB_SIZE 4 and added remark in Markdown
- section of the manual about the effect of TAB_SIZE on code block
+ section of the manual about the effect of TAB_SIZE on code block
processing when using tabs in the comment block.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4835">4835</a>: Project logo was not included in the Qt help output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4834">4834</a>: Fixed a couple of typos in the comments.</li>
@@ -2879,16 +3530,16 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
</p>
<h3>Changes</h3>
<ul>
-<li> doxygen now strips the leading indentation shared by the lines in a
+<li> doxygen now strips the leading indentation shared by the lines in a
@code..@endcode block.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4755">4755</a>: Changed title of the SVG graphs from 'G' to the root node
of the graph.</li>
</ul>
<h3>New features</h3>
<ul>
-<li> Added button in the navigation tree to allow enabling/disabling
+<li> Added button in the navigation tree to allow enabling/disabling
syncing the navigation tree with the content.</li>
-<li> Extended the number of HTML entities with Greek letters and other
+<li> Extended the number of HTML entities with Greek letters and other
symbols (thanks to Charles Karney for the patch).</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4464">4464</a>: Added support for C++11 strongly typed enums
(enum class E { ... }).</li>
@@ -2902,25 +3553,25 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> id <a href="https://github.com/doxygen/doxygen/issues/4702">4702</a>: Fixed another case where local include path did not appear
correctly in the class documentation.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4716">4716</a>: Fortran: Some keyword were not colored in the source view.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4720">4720</a>: Fortran: Argument type was wrong type of in case of out of
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4720">4720</a>: Fortran: Argument type was wrong type of in case of out of
place !&gt; comment</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4739">4739</a>: Included patch to fix problem compiling for x86 release on
Windows.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4741">4741</a>: Section without title could result in an invalid Qt Help
index.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4743">4743</a>: Anonymous enum could result in an invalid Qt Help index.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4751">4751</a>: Superfluous trailing comma in javascript
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4751">4751</a>: Superfluous trailing comma in javascript
prevented navigation tree to load in IE7.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4753">4753</a>: a + at the start of a line inside a &lt;pre&gt; block,
- triggered the start of a list. Also -- and --- where not kept untouched
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4753">4753</a>: a + at the start of a line inside a &lt;pre&gt; block,
+ triggered the start of a list. Also -- and --- where not kept untouched
inside a &lt;pre&gt; block.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4754">4754</a>: ndash (--) appearing in a brief description could lead
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4754">4754</a>: ndash (--) appearing in a brief description could lead
to invalid SVG images.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4759">4759</a>: -- and --- inside a Markdown code block were not handled
properly.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4783">4783</a>, <a href="https://github.com/doxygen/doxygen/issues/4699">4699</a>: In body documentation with a different indentation then the
main documentation was not rendered correctly (MARKDOWN=YES).</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4784">4784</a>: Using an escaped pipe symbol in a Markdown table did not get
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4784">4784</a>: Using an escaped pipe symbol in a Markdown table did not get
unescaped in the output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4785">4785</a>: Code fragments did not appear properly in the doxygen manual.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4786">4786</a>: Added missing delete call in a piece of debugging code.</li>
@@ -2942,7 +3593,7 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<h3>Changes</h3>
<ul>
<li> Integrated the root navigation tree in navtree.js for faster loading.</li>
-<li> When the navigation tree is enabled, clicking jump to a line in
+<li> When the navigation tree is enabled, clicking jump to a line in
the source code view will now highlight the line.</li>
</ul>
<h3>New features</h3>
@@ -2954,12 +3605,12 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3772">3772</a>: Fortran: Appearance of comments in the HTML output
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3772">3772</a>: Fortran: Appearance of comments in the HTML output
are now customizable via CSS again.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4655">4655</a>: &lt;code&gt; inside a &lt;summary&gt; or &lt;remarks&gt; section is now treated
as @code (was already the code for C#).</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4661">4661</a>: When a comment started at indent &gt;= 4 after a /** and
- continued at the same indent without leading * after a blank line,
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4661">4661</a>: When a comment started at indent &gt;= 4 after a /** and
+ continued at the same indent without leading * after a blank line,
the continued part appeared at as a code block when Markdown was enabled.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4689">4689</a>: If a file was not indexed, the navigation tree became empty.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4702">4702</a>: Include path using quotes did not work as documented.</li>
@@ -2967,27 +3618,27 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
a numbered list.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4713">4713</a>: An anonymous namespace could introduce an invalid entry in
the navigation list.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4715">4715</a>: Breadcrumb navigation path had wrong links when
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4715">4715</a>: Breadcrumb navigation path had wrong links when
CREATE_SUBDIRS was enabled.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4729">4729</a>: Fixed case where function was incorrectly detected as a
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4729">4729</a>: Fixed case where function was incorrectly detected as a
variable.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4733">4733</a>: Fixed typo in the documentation of the LAYOUT_FILE option.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4737">4737</a>: Fixed visual misalignment for first argument.</li>
-<li> The "arrow out" button in interactive SVG did not work when
+<li> The "arrow out" button in interactive SVG did not work when
served from a web server, due to the use of an absolute path.</li>
-<li> If a declaration was too wide for a page, the content in HTML spilled
+<li> If a declaration was too wide for a page, the content in HTML spilled
over the boundary of its box, which looked ugly.</li>
<li> Empty lines in a code fragment were collapsed.</li>
<li> Navigation tree entries of the hierarchy appeared under class index as
well.</li>
<li> Grouped globals and enum values were not added to the navigation index.</li>
<li> Inlined class were not properly shows in the navigation index.</li>
-<li> Documented class in undocumented namespace did not show up in
+<li> Documented class in undocumented namespace did not show up in
class list and navigation tree.</li>
<li> ALLEXTERNALS=YES did not show all external classes in the class list.</li>
<li> External reference via URL did not work for new
"Additional Inherited Members" section + inherited from class link.</li>
-<li> Objective-C protocols and C# generics were not index and listed
+<li> Objective-C protocols and C# generics were not index and listed
properly in the navigation tree and indices.</li>
<li> Undocumented files could produce a broken link in the navigation tree.</li>
<li> Additional Inherited Members could turn up empty of all members of
@@ -3005,17 +3656,17 @@ href="https://github.com/doxygen/doxygen/commit/a697caadf1912d0d74faa208f4cff887
<li> Changed the way indexes (Class,File,Namespace,Groups) are rendered:
<p>
There are now shown in a uniform way in the HTML output as a tree.
- Trees can be expanded and collapsed interactively
- (this makes USE_INLINE_TREES obsolete).
+ Trees can be expanded and collapsed interactively
+ (this makes USE_INLINE_TREES obsolete).
</p><p>
- The class list now also shows namespaces and nested classes.
- The file list now also shows directories (this makes SHOW_DIRECTORIES
- obsolete).
+ The class list now also shows namespaces and nested classes.
+ The file list now also shows directories (this makes SHOW_DIRECTORIES
+ obsolete).
</p><p>
Member sections are now each rendered in a separate table.
This makes the HTML_ALIGN_MEMBERS option obsolete.
</p><p>
-<b>Note:</b> If you use a custom header for the HTML output (HTML_HEADER)
+<b>Note:</b> If you use a custom header for the HTML output (HTML_HEADER)
make sure you add the following:
</p>
<pre>
@@ -3027,14 +3678,14 @@ make sure you add the following:
<li> Changed the way member attributes (like protected, virtual, and static)
are rendered in the HTML output.</li>
<li> Changed the look of the source code output.</li>
-<li> Included language updates for Chinese, Czech, German, Esperanto,
+<li> Included language updates for Chinese, Czech, German, Esperanto,
Italian, Slovak, Spanish, Hungarian, and Polish.</li>
<li> Syntax highlighting in source code fragments is no longer dependent
on LATEX_SOURCE_CODE being set to YES.</li>
-<li> Added natural scrolling for tablet devices (like the iPad)
+<li> Added natural scrolling for tablet devices (like the iPad)
when using the treeview.</li>
-<li> For interactive SVGs the print button has been replaced by a
- "arrow out" button that opens the original non-interactive SVG in a
+<li> For interactive SVGs the print button has been replaced by a
+ "arrow out" button that opens the original non-interactive SVG in a
new window for easy printing or saving. </li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4426">4426</a>: Long names are now wrapped in the dot nodes to avoid
very wide graphs.</li>
@@ -3061,17 +3712,17 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/4502">4502</a>: Include VHDL patch (thanks to Martin Kreis).</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4569">4569</a>: Fixed include guard detection problem when using
#pragma once</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4582">4582</a>: A numbered list (1. 2. 3.) where each list item ended with
- an empty line is no longer treated as a set of separate lists (all
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4582">4582</a>: A numbered list (1. 2. 3.) where each list item ended with
+ an empty line is no longer treated as a set of separate lists (all
starting with 1.).</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4586">4586</a>: Java: last enum value did not appear in the output unless it was
followed by a comma.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4591">4591</a>, <a href="https://github.com/doxygen/doxygen/issues/4606">4606</a>: Regression: Autolist items starting on a new paragraph
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4591">4591</a>, <a href="https://github.com/doxygen/doxygen/issues/4606">4606</a>: Regression: Autolist items starting on a new paragraph
at indent level larger than 0 were not processed correctly. </li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4594">4594</a>: Sections could be missing from the navigation tree in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4594">4594</a>: Sections could be missing from the navigation tree in
some situations.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4597">4597</a>: @tableofcontents did not work for the main page (@mainpage)</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4598">4598</a>: Sections in a separate markdown page did not appear in the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4598">4598</a>: Sections in a separate markdown page did not appear in the
table of contents.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4600">4600</a>: Fortran: Fixed problem causing call/caller graphs not to be
generated.</li>
@@ -3089,7 +3740,7 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/4610">4610</a>: docset creating could fail due to invalid Nodes.xml</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4614">4614</a>: Using \internal in a group or member did not hide it
from the navigation tree if there was no documentation.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4615">4615</a>: Backticks in C# comments did not appear as inline
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4615">4615</a>: Backticks in C# comments did not appear as inline
fragments, like was the case for other languages.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4620">4620</a>: PHP: defines are now shown as constants rather than enums.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4636">4636</a>: File with .md or .markdown extension were not included
@@ -3104,9 +3755,9 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: PHP: use keyword was not handled correctly when importing
classes from another namespace.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4634">4634</a>: Switched to using "Macro" in the output instead of "Define".</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4635">4635</a>: Using ![caption](filename.png) did not work correctly for
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4635">4635</a>: Using ![caption](filename.png) did not work correctly for
local images pointed to with IMAGE_PATH.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4642">4642</a>: A block of ///'s inside a verbatim block inside a .md
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4642">4642</a>: A block of ///'s inside a verbatim block inside a .md
file was replaced by /** .. */</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4645">4645</a>: Doxygen now skips scanning files in directories starting with
a dot (e.g. .svn).</li>
@@ -3115,7 +3766,7 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/4659">4659</a>: Added C++11 classes when BUILTIN_STL_SUPPORT is enabled.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4662">4662</a>: Using a backslash in a section causes 026E30F to appear in the
LaTeX TOC.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4675">4675</a>: Fortran: case sensitiveness for routines and functions
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4675">4675</a>: Fortran: case sensitiveness for routines and functions
did not work</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4676">4676</a>: Fortran: continuation by ampersand not placed in code output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4698">4698</a>: Fixed indenting issue after the end of a markdown code block
@@ -3154,10 +3805,10 @@ make sure you add the following:
<li> Updated the manual and improved the look.</li>
<li> Made the contents in the navigation tree more consistent for
groups, pages with subpages, and grouped subpages.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4558">4558</a>: Latex: made the margins of latex page layout smaller using
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4558">4558</a>: Latex: made the margins of latex page layout smaller using
the geometry package.</li>
<li> The tool doxytag has been declared obsolete and is removed
- (it wasn't working properly anyway). Same goes for the installdox
+ (it wasn't working properly anyway). Same goes for the installdox
script.</li>
<li> Updated the copyright in source code and doxywizard "about" to 2012.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4533">4533</a>: HTML version of the manual now has the treeview enabled
@@ -3165,11 +3816,11 @@ make sure you add the following:
</ul>
<h3>New features</h3>
<ul>
-<li> Added support for
+<li> Added support for
<a href="https://daringfireball.net/projects/markdown/">Markdown</a>
formatting.
- This is enabled by default, but can be disabled by
- setting MARKDOWN_SUPPORT to NO. When enabled the following is
+ This is enabled by default, but can be disabled by
+ setting MARKDOWN_SUPPORT to NO. When enabled the following is
processed differently:
<ul>
<li> tabs are converted to spaces according to TAB_SIZE.</li>
@@ -3199,11 +3850,11 @@ make sure you add the following:
the navigation menu using the layout file (see the section of the manual
about customizing the output for details).</li>
<li> Added new command \tableofcontents (or [TOC] if you prefer Markdown)
- which can be used in a related page with sections to produce a
+ which can be used in a related page with sections to produce a
table of contents at the top of the HTML page (for other formats the
command has no effect).</li>
<li> When using SVG images and INTERACTIVE_SVG is enabled, a print icon
- will be visible along with the navigation controls to facilitate
+ will be visible along with the navigation controls to facilitate
printing of the part of the graph that is visible on screen.</li>
<li> Added obfuscation of email addresses for the HTML output to make
email harvesting more difficult.</li>
@@ -3227,10 +3878,10 @@ make sure you add the following:
<h3>Bug fixes</h3>
<ul>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2729">2729</a>: Fixed encoding issue in CHM index file for group titles.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/2791">2791</a>: FORTRAN: Keywords like .GT. recognized as symbols for
+<li> id <a href="https://github.com/doxygen/doxygen/issues/2791">2791</a>: FORTRAN: Keywords like .GT. recognized as symbols for
cross ref.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2799">2799</a>, <a href="https://github.com/doxygen/doxygen/issues/3376">3376</a>, <a href="https://github.com/doxygen/doxygen/issues/3825">3825</a>: \copydoc did copy the brief description
- into the detailed section, causing a difference between the original
+ into the detailed section, causing a difference between the original
and the copy.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3116">3116</a>: Using @ref for an example file, caused it to appear as
file::ext.</li>
@@ -3247,11 +3898,11 @@ make sure you add the following:
form A&lt;func(T*)&gt; such as used in boost::signal2 types.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4500">4500</a>: A &lt;/p&gt; followed by an htmlonly..endhtmlonly section
caused invalid XHTML output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4501">4501</a>: Fixed include handling in case the include guard was
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4501">4501</a>: Fixed include handling in case the include guard was
documented.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4505">4505</a>: Fixed problem loading the navigation tree in IE8 when
serving pages via a web server.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4506">4506</a>: Included patch to avoid hyphenation hints in front of the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4506">4506</a>: Included patch to avoid hyphenation hints in front of the
first capital in a word.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4509">4509</a>: When SHOW_FILES was NO, a grouped function did not appear
in the javascript based search index.</li>
@@ -3261,10 +3912,10 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/4516">4516</a>: Fixed bug in the generated makefile causing index not
to be generated when using pdflatex.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4517">4517</a>: HTML output for example pages was not well-formed.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4520">4520</a>: Include statements in latex output where placed all on
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4520">4520</a>: Include statements in latex output where placed all on
one line in the LaTeX output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4526">4526</a>: PHP: Fixed problem handling heredoc blocks</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4527">4527</a>: For aliases with a single argument it is no longer required
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4527">4527</a>: For aliases with a single argument it is no longer required
to escape commas that appear inside the argument text.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4536">4536</a>: Latex: tables can now span multiple pages by using the xtab
package.</li>
@@ -3276,7 +3927,7 @@ make sure you add the following:
with a namespaced type was used.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4557">4557</a>: Included patch which changes MATHJAX_RELPATH to use the
content delivery network by default.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4560">4560</a>: Fortran: Fixed problem handling multiple definition
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4560">4560</a>: Fortran: Fixed problem handling multiple definition
statements on one line.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4561">4561</a>: Using -d Preprocessor now also works when QUIET is YES.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4563">4563</a>: Latex: citations where only generated properly if the
@@ -3287,7 +3938,7 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/4580">4580</a>: subpages generate empty pages in latex/rtf output and
broken links when SHORT_NAME was set to YES.</li>
<li> Included VHDL fixes provided by Martin Kreis.</li>
-<li> The word "dummy" wrongly appeared before the first parameter type in
+<li> The word "dummy" wrongly appeared before the first parameter type in
the LaTeX output for an Objective-C method.</li>
<li> Fixed several small glitches in the tree view javascript code.</li>
<li> Included a patch by Vladimir Simonov to make it possible to compile
@@ -3304,9 +3955,9 @@ make sure you add the following:
<b>(release date 10-12-2011)</b>
<h3>Changes</h3>
<ul>
-<li> Doxygen now reports its cache usage (for the symbol and the
- lookup cache) at the end of a run (if QUIET=NO), and recommends
- settings for SYMBOL_CACHE_SIZE and LOOKUP_CACHE_SIZE for your
+<li> Doxygen now reports its cache usage (for the symbol and the
+ lookup cache) at the end of a run (if QUIET=NO), and recommends
+ settings for SYMBOL_CACHE_SIZE and LOOKUP_CACHE_SIZE for your
project if either cache is too small.</li>
</ul>
<h3>New features</h3>
@@ -3323,9 +3974,9 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/4490">4490</a>: Fixed XHTML validity problem when using mscgen graphs.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4493">4493</a>: Fixed XHTML validity problem when GENERATE_TREEVIEW was
disabled.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4494">4494</a>: Included patch to fix hang issue when non-empty
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4494">4494</a>: Included patch to fix hang issue when non-empty
INCLUDE_PATH was used.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4495">4495</a>: Fixed parse issue when a comma appeared as part of an
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4495">4495</a>: Fixed parse issue when a comma appeared as part of an
enum's value.</li>
</ul>
<a name="1.7.6"></a>
@@ -3344,7 +3995,7 @@ make sure you add the following:
the navigation tree.</li>
<li> Improved HTML output support for IE9.</li>
<li> Included redesigned VHDL parser (thanks to Martin Kreis for the patch)</li>
-<li> When a class/structs has many (&gt;15) members of the same type, only
+<li> When a class/structs has many (&gt;15) members of the same type, only
the first 10 are shown in the UML diagram. </li>
<li> Made the output of the javascript based search engine more compact.</li>
</ul>
@@ -3353,34 +4004,34 @@ make sure you add the following:
<li> Update of the French translation.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3637">3637</a>: Added support for PHP heredoc and nowdoc constructs.</li>
<li> Added support for cross-referencing in case of operator-&gt; overloading.
- This includes support for std::auto_ptr,std::smart_ptr,std::unique_ptr
+ This includes support for std::auto_ptr,std::smart_ptr,std::unique_ptr
and std::weak_ptr when BUILTIN_STL_SUPPORT is enabled.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Regression: some information was no longer available for a class,
+<li> Regression: some information was no longer available for a class,
due to accidental deletion of a code block.</li>
<li> Regression: fixed matching problem in the code parser.</li>
-<li> Included fixes for TCL to support commands with \ and command
+<li> Included fixes for TCL to support commands with \ and command
definitions preceded by whitespace (thanks to Rene Zaumseil)</li>
-<li> When using "static int a,b" variable "b" incorrectly appeared in the
+<li> When using "static int a,b" variable "b" incorrectly appeared in the
output even though EXTRACT_STATIC was set to NO.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2867">2867</a>: .spec file was only updated after running ./configure</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4363">4363</a>: Fixed potential crash when using doxygen for large projects.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4370">4370</a>: Fixed problem running bibtex with \cite command on Windows.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4375">4375</a>: Fixed constant expression evaluation error in the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4375">4375</a>: Fixed constant expression evaluation error in the
preprocessor.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4294">4294</a>: Removed bogus ' from the man page output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4411">4411</a>: Quotes in the brief description could appear unescaped in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4411">4411</a>: Quotes in the brief description could appear unescaped in
the tooltip.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4137">4137</a>: #includes with ../ were not always processed correctly.</li>
-<li> Fixed potential crash when INLINE_GROUPED_CLASSES and INLINE_SIMPLE_STRUCTS
+<li> Fixed potential crash when INLINE_GROUPED_CLASSES and INLINE_SIMPLE_STRUCTS
are set to YES.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4406">4406</a>: Fixed preprocessor problem handling #defines whose value was
a constant string containing ///.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4419">4419</a>: Using a \ at the end of a comment line could cause
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4419">4419</a>: Using a \ at the end of a comment line could cause
parsing problems for C# as the \ was treated as a line continuation.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4391">4391</a>: Fixed parser problem when using multiple member groups
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4391">4391</a>: Fixed parser problem when using multiple member groups
inside a macro definition.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2755">2755</a>: Fixed several issues related to \cite handling.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4400">4400</a>: Improved the way macro definitions are collected.</li>
@@ -3397,21 +4048,21 @@ make sure you add the following:
ClassName's wasn't autolinked.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4437">4437</a>: Fixed potential printing of null pointer when using
a version filter that returned blanks.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3871">3871</a>: Fortran: first problem where subroutine using results
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3871">3871</a>: Fortran: first problem where subroutine using results
variable appeared as a function.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4331">4331</a>: If an URL appeared at the end of a sentence, the period
was included in the URL.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4362">4362</a>: Fortran: Added support for the Double Complex type.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4462">4462</a>: Included workaround for Solaris CC issue in index.cpp</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4441">4441</a>: Included patch to fix some TCL issues and add the TCL_SUBST
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4441">4441</a>: Included patch to fix some TCL issues and add the TCL_SUBST
configuration option.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4428">4428</a>: Fortran: Added support for ALIAS expansion in comment blocks.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4451">4451</a>: Fixed case where a macro was not corrected found in the header
file when it could only be found via INCLUDE_PATH.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4474">4474</a>: using multiple &lt;para&gt;'s inside a &lt;summary&gt; block caused
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4474">4474</a>: using multiple &lt;para&gt;'s inside a &lt;summary&gt; block caused
text to be joined without spacing.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4361">4361</a>: Java enums are now parsed as classes. </li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4477">4477</a>: Fixed problem in the preprocessor regarding the handling
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4477">4477</a>: Fixed problem in the preprocessor regarding the handling
of include guards.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4478">4478</a>: Fixed typo in the docs for EXCLUDE_SYMLINKS.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4487">4487</a>: Using a relative URL with &lt;a href&gt; did not work when
@@ -3431,7 +4082,7 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/2867">2867</a>: .spec file was only updated after running ./configure</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4363">4363</a>: Fixed potential crash when using doxygen for large projects.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4370">4370</a>: Fixed problem running bibtex with \cite command on Windows.</li>
-<li>Regression: some information was no longer available for a class,
+<li>Regression: some information was no longer available for a class,
due to accidental deletion of a code block.</li>
<li>Regression: fixed matching problem in the code parser.</li>
</ul>
@@ -3440,7 +4091,7 @@ make sure you add the following:
<b>(release date 14-08-2011)</b>
<h3>Changes</h3>
<ul>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4145">4145</a>: Function in the call graphs are now shown based on first
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4145">4145</a>: Function in the call graphs are now shown based on first
appearance rather then alphabetical order.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3743">3743</a>: When customizing the HTML header $title now only generates
the title excluding the project name (which can still be added using
@@ -3451,40 +4102,40 @@ make sure you add the following:
<ul>
<li> New option INTERACTIVE_SVG which when set to YES in combination
with DOT_IMAGE_FORMAT=svg will make doxygen
- generate interactive SVG diagrams that support zooming and
+ generate interactive SVG diagrams that support zooming and
panning via the mouse (only for large graphs). </li>
-<li> Added support for the Tcl programming language
+<li> Added support for the Tcl programming language
(thanks to Rene Zaumseil and Samuel Bentley for the patch).</li>
<li> Added @copyright command.</li>
<li> added option MATHJAX_EXTENSIONS to provide additional extensions for
MathJax (thanks to David Munger for the patch).</li>
<li> added option INLINE_SIMPLE_STRUCTS which when enabled shows the fields
of simple classes and structs (with only public data fields) as a table
- and inline in context (file/group/namespace/class) provided this context
+ and inline in context (file/group/namespace/class) provided this context
is documented.</li>
<li> When using the server based search engine (SEARCHENGINE=YES and
SERVER_BASED_SEARCH=YES) doxygen now advertises a opensearch provider
for your project, that allows integrating the search directly in
the search field of the browser (thanks to Phil Lello for the patch).</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/2755">2755</a>: Added new option CITE_BIB_FILES and LATEX_BIB_STYLE and a new
- command \cite, allowing you to make references to literature (as defined
- in one or more .bib files). This also works for output formats other
+<li> id <a href="https://github.com/doxygen/doxygen/issues/2755">2755</a>: Added new option CITE_BIB_FILES and LATEX_BIB_STYLE and a new
+ command \cite, allowing you to make references to literature (as defined
+ in one or more .bib files). This also works for output formats other
than LaTeX. The tool bibtex is required for this to work though. Thanks
to David Munger for the initial patch upon which this feature is based.</li>
<li> PHP namespaces are now shown as A\B in the output.</li>
-<li> Added new \snippet command that can be used to include marked
- sections from a source file. See
+<li> Added new \snippet command that can be used to include marked
+ sections from a source file. See
<a href="commands.html#cmdsnippet">\snippet</a> for more info.</li>
<li> Added translation support for Armenian, thank to Armen Tangamyan.
and included translation updates for a number of languages.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Fixed a couple of potential race conditions found by Helgrind while
+<li> Fixed a couple of potential race conditions found by Helgrind while
running dot from multiple threads.</li>
-<li> Graphs did not appear when enabling both INTERACTIVE_SVG and
+<li> Graphs did not appear when enabling both INTERACTIVE_SVG and
HTML_DYNAMIC_SECTIONS.</li>
-<li> PDFs generated by newer versions of dot (i.e. 2.28) did not appear
+<li> PDFs generated by newer versions of dot (i.e. 2.28) did not appear
in the output, because doxygen failed to extract the bounding box.</li>
<li> Improved call graph and cross-reference support for Python.</li>
<li> INTERACTIVE_SVG now also works with IE9 if the html file extension is
@@ -3497,7 +4148,7 @@ make sure you add the following:
depending on the code page (thanks to Hirao for the patch).</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2867">2867</a>: The .spec file in the source distribution did not get
updated to the latest version.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/2872">2872</a>: Fortran: Continuation character was not recognized in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/2872">2872</a>: Fortran: Continuation character was not recognized in
fixed format code.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2887">2887</a>: Fortran: @param checking was not case insensitive.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3168">3168</a>: Fixed problem combining @cond with preprocessor directives.</li>
@@ -3510,13 +4161,13 @@ make sure you add the following:
class to appear with a -g postfix in C# </li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3883">3883</a>: Fortran: Fixed issue handling private subroutines.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3990">3990</a>: LaTeX now starts a new page when starting a new module.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4014">4014</a>: Fortran: Prefix of function was overwritten and the word
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4014">4014</a>: Fortran: Prefix of function was overwritten and the word
'function' not specified.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4050">4050</a>: Fortran: Included fix for using collaboration diagrams.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4158">4158</a>: Added PHP support for namespace with curly braces.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4174">4174</a>: Fortran: Improved handling of semicolons.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4178">4178</a>: Fortran: Added support for "type is".</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4188">4188</a>: A macro added to a group appeared twice in the group
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4188">4188</a>: A macro added to a group appeared twice in the group
documentation if was also made related to a class using \relates.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4221">4221</a>: Fixed problem were the search box was missing when using
a custom HTML header.</li>
@@ -3527,9 +4178,9 @@ make sure you add the following:
the code.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4230">4230</a>, <a href="https://github.com/doxygen/doxygen/issues/4231">4231</a>: Putting an autolist inside a @todo, @bug or similar
section did not work anymore.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4232">4232</a>: Referring to a logo with a relative path, caused
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4232">4232</a>: Referring to a logo with a relative path, caused
a broken image target when using a custom HTML header.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4235">4235</a>: Fixed HTML rendering problem on older browsers when
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4235">4235</a>: Fixed HTML rendering problem on older browsers when
GENERATE_TREEVIEW was enabled.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4242">4242</a>: Linking to a section on the main page could result in a
broken link when GENERATE_TREEVIEW was enabled.</li>
@@ -3549,29 +4200,29 @@ make sure you add the following:
GENERATE_TREEVIEW option is set to YES.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4281">4281</a>: Fixed broken link to an undocumented namespace.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4291">4291</a>: Fixed potential crash while parsing Fortran code.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4292">4292</a>: Fixed problem parsing comment which included
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4292">4292</a>: Fixed problem parsing comment which included
an unterminated alias within quotes (i.e. "\word{")</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4294">4294</a>: Lines starting with . did not appear in the man page output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4296">4296</a>: Fortran: Fixed text is detailed function section.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4297">4297</a>: When enabling INTERACTIVE_SVG wide graphs are now also
fit to the screen width.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4304">4304</a>: Added missing space between parameter type and name in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4304">4304</a>: Added missing space between parameter type and name in
the RTF output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4305">4305</a>: Use background-color instead of background in doxygen.css.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4313">4313</a>: Fixed potential segfault while creating man pages.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4321">4321</a>: Fortran: add a space to "type" in argument list.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4324">4324</a>: Fixed problem handling include guard when multiple
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4324">4324</a>: Fixed problem handling include guard when multiple
blocks guarded by the same guard were used in a header file. </li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4327">4327</a>: Fortran: Unified handling of @params at various places.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: make clean failed on a system without qmake.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4332">4332</a>: Fixed compile issue for HP Itanium.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4339">4339</a>: Fortran: Interface was seen as a class with constructor /
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4339">4339</a>: Fortran: Interface was seen as a class with constructor /
destructor.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4341">4341</a>: Using the word "property" as a type in C caused wrong
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4341">4341</a>: Using the word "property" as a type in C caused wrong
results.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4340">4340</a>: Fortran: fixed issue parsing function type that looked like
C function pointers.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4345">4345</a>: Fortran: Fixed parse issue when using variable name
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4345">4345</a>: Fortran: Fixed parse issue when using variable name
starting with the word interface.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4348">4348</a>: Improved error handling for empty html style list.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4352">4352</a>: Fixed case where %s could end up in a warning message.</li>
@@ -3595,13 +4246,13 @@ make sure you add the following:
<li> Included updates for the Italian and Russian translation.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4121">4121</a>: Added option HTML_EXTRA_FILES which makes it easier to copy
additional files to the HTML output and also add them to the index files.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4162">4162</a>: Included patch that adds new LATEX_FOOTER option to
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4162">4162</a>: Included patch that adds new LATEX_FOOTER option to
customize the end of refman.tex in the LaTeX output.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li> id <a href="https://github.com/doxygen/doxygen/issues/1067">1067</a>: Jumping to a @section did not work in the RTF output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/2868">2868</a>: Fortran: included patch for supporting multiple argument
+<li> id <a href="https://github.com/doxygen/doxygen/issues/2868">2868</a>: Fortran: included patch for supporting multiple argument
declarations on one line.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2872">2872</a>: Fixed problem with line continuation in Fortran.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3217">3217</a>: %A::B now prevents a link for A::B, instead of only for A
@@ -3631,18 +4282,18 @@ make sure you add the following:
given to the QHP_CUST_FILTER_ATTRS option.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4112">4112</a>: Long error messages could cause memory corruption.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4116">4116</a>: XML: switched indent option to no in the combine.xslt script.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4117">4117</a>: Comment with XML style list of type table was not rendered
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4117">4117</a>: Comment with XML style list of type table was not rendered
properly.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4118">4118</a>: Added support for overloading of C# indexer operators.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4119">4119</a>: Internal section marked with @internal was not shown as
such anymore in the XML output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4120">4120</a>: PHP: Fixed parse problem referring to class in global
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4120">4120</a>: PHP: Fixed parse problem referring to class in global
namespace.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4124">4124</a>: Included patch by Haffmans to make the custom header and
footer independent of the chosen config options.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4127">4127</a>: Included fix to prevent a warning in the server side PHP
search script.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4128">4128</a>: Included patch to fix broken hyperlink to page entry
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4128">4128</a>: Included patch to fix broken hyperlink to page entry
in xreflists.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4136">4136</a>: Header of \page was wrong in Man page output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4137">4137</a>: #include to other directories were not always linked.</li>
@@ -3653,16 +4304,16 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/4169">4169</a>: Fixed problem with macro expansion.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4176">4176</a>: Fixed potential crash when generating a warning for
void f(int %x) style parameter, which is valid in C++/CLI.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4177">4177</a>: Included patch to enabled LargeAddressAware for Windows
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4177">4177</a>: Included patch to enabled LargeAddressAware for Windows
builds.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4175">4175</a>: Fixed cases where FILE_VERSION_FILTER was called for
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4175">4175</a>: Fixed cases where FILE_VERSION_FILTER was called for
dummy files with name "generated".</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4180">4180</a>: Fixed argument matching issue when one of match candidates
was a typedef of a method pointer.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4210">4210</a>: mscfile tag was closed with dotfile in the XML output.</li>
<li> doxygen -w html now ignores the values for HTML_HEADER and HTML_FOOTER
found in the config file.</li>
-<li> Importing a group via a tag file could overrule a local group with
+<li> Importing a group via a tag file could overrule a local group with
the same name even when EXTERNAL_GROUPS was disabled.</li>
</ul>
<a name="1.7.3"></a>
@@ -3670,7 +4321,7 @@ make sure you add the following:
<b>(release date 03-01-2011)</b>
<h3>Changes</h3>
<ul>
-<li> Added a header for each HTML page above the navigation menu,
+<li> Added a header for each HTML page above the navigation menu,
showing the project name and logo and a short description (all optional).
Disabling the index (with DISABLE_INDEX) still shows the new header
(you can still customize this using HTML_HEADER). This now works
@@ -3686,11 +4337,11 @@ make sure you add the following:
</ul>
<h3>New features</h3>
<ul>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/2734">2734</a>: Added SVG support to doxygen's dot output
+<li> id <a href="https://github.com/doxygen/doxygen/issues/2734">2734</a>: Added SVG support to doxygen's dot output
(setting DOT_IMAGE_FORMAT to svg now works as expected)</li>
<li> Added control to the wizard to configure the color of the output
visually.</li>
-<li> Added options to specify project synopsis and select a
+<li> Added options to specify project synopsis and select a
project logo to the wizard.</li>
<li> Added option PROJECT_LOGO which can be used to specify an image
which will be shown in the header of each HTML page along with
@@ -3698,12 +4349,12 @@ make sure you add the following:
<li> Added option PROJECT_BRIEF which can be used to specify a brief
description which will be shown in the header of each HTML page
just below the project name.</li>
-<li> Added new option FILTER_SOURCE_PATTERNS which can be used
- in combination with FILTER_SOURCE_FILES to filter files used for
- the source browser based on file extension, which can overwrite
+<li> Added new option FILTER_SOURCE_PATTERNS which can be used
+ in combination with FILTER_SOURCE_FILES to filter files used for
+ the source browser based on file extension, which can overwrite
the filter set by FILTER_PATTERNS and/or INPUT_FILTER.</li>
<li> Added new option STRICT_PROTO_MATCHING which is disabled by default,
- and makes the parameter matching to be less strict, resulting in
+ and makes the parameter matching to be less strict, resulting in
fewer "No matching class member found" warnings.</li>
</ul>
<h3>Bug fixes</h3>
@@ -3714,7 +4365,7 @@ make sure you add the following:
(thanks to Albert).</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3731">3731</a>: Fixed problem handling @cond..@endcond in Fortran code.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3779">3779</a>: Scope was missing in Tokens.xml when using docsets.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3870">3870</a>, <a href="https://github.com/doxygen/doxygen/issues/2891">2891</a>: Applied patch to avoid stripping prefixes for Fortran
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3870">3870</a>, <a href="https://github.com/doxygen/doxygen/issues/2891">2891</a>: Applied patch to avoid stripping prefixes for Fortran
subroutines.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3895">3895</a>: allow label before end statement in Fortran</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3956">3956</a>: &lt;/see&gt; was not handled properly in comment block.</li>
@@ -3736,17 +4387,17 @@ make sure you add the following:
hyperlinked.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4019">4019</a>: Removed double definition of docParamName in compound.xsd.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4023">4023</a>: C++/CLI Finalizer methods were not parsed properly.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4036">4036</a>: Objective-C method names can now be used as the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4036">4036</a>: Objective-C method names can now be used as the
the first argument of \ref.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4037">4037</a>: Fixed a couple of problems in the compound.xsd schema used
for XML output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4038">4038</a>: DISTRIBUTE_GROUP_DOC now works again for enum values.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/4047">4047</a>: Improved matching of typedef'ed array parameter and non
+<li> id <a href="https://github.com/doxygen/doxygen/issues/4047">4047</a>: Improved matching of typedef'ed array parameter and non
typedef'ed array parameter.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4056">4056</a>: Added a number of fixed for Fortran interfaces.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4057">4057</a>: Handle files with the .for extension as Fortran.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/4060">4060</a>: Fixed error in the grouping documentation.</li>
-<li> Fixed line number sync problem when using Objective-C #import
+<li> Fixed line number sync problem when using Objective-C #import
statements.</li>
<li> Fixed problem handling /** @cond */ in the preprocessor.</li>
<li> Member groups could get reordered in the output.</li>
@@ -3768,14 +4419,14 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3855">3855</a>: Added \endinternal command that can be used to force
the end of a section started with \internal.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3084">3084</a>: Added parsing support for PHP 5.3+ style namespaces.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3389">3389</a>: added \mscfile command which can be used to insert a
- message sequence chart given a .msc file.
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3389">3389</a>: added \mscfile command which can be used to insert a
+ message sequence chart given a .msc file.
Also added a new config option MSCFILE_DIRS to provide directories
were msc files are searched (Thanks to Adrien for the patch).</li>
<li> Added support for type specifiers for documenting PHP parameters,
format: "@param type $paramname docs"</li>
-<li> Added support for rendering formulas in the HTML output
- using MathJax instead of using prerendered bitmaps.
+<li> Added support for rendering formulas in the HTML output
+ using MathJax instead of using prerendered bitmaps.
For this purpose the options USE_MATHJAX and MATHJAX_RELPATH were
added.</li>
</ul>
@@ -3795,7 +4446,7 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3824">3824</a>: Undefined function macros could cause constant expression
errors.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3826">3826</a>: updated copyright statement in PDF docs.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3827">3827</a>: C# generics appeared with -g extension in the output in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3827">3827</a>: C# generics appeared with -g extension in the output in
some situations.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3829">3829</a>: Fixed parsing problem for "int &amp;foo1(),&amp;foo2();"</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3830">3830</a>: Link to destructor was wrong in the member index.</li>
@@ -3811,10 +4462,10 @@ make sure you add the following:
was in an undocumented namespace.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3843">3843</a>: Fixed a couple of typos in lodepng.h</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3848">3848</a>: Graph legend image was missing form the index files.</li>
-<li> Fixed a number of typos in the config file documentation
+<li> Fixed a number of typos in the config file documentation
(thanks to Jens Schweikhardt)</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3854">3854</a>: Some enums were not cross-referenced.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3857">3857</a>: Missing \endcond could cause preprocessor issues in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3857">3857</a>: Missing \endcond could cause preprocessor issues in
next file(s) to be parsed.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3862">3862</a>: a function definition in a namespace, documented in the
header did not always get cross-referenced.</li>
@@ -3830,8 +4481,8 @@ make sure you add the following:
doxygen incorrectly ended the brief description with a dot.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3886">3886</a>: setting MULTILINE_CPP_IS_BRIEF to YES, cause /// to appear
in the output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3890">3890</a>, <a href="https://github.com/doxygen/doxygen/issues/3235">3235</a>: EXTENSION_MAPPING did not work if a mapped
- language was handled by the same parser as used for the original
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3890">3890</a>, <a href="https://github.com/doxygen/doxygen/issues/3235">3235</a>: EXTENSION_MAPPING did not work if a mapped
+ language was handled by the same parser as used for the original
extension.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3894">3894</a>: Fixed bracket bug in LaTeX fancy headers.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3896">3896</a>: Allow hyphen in key argument of \xrefitem.</li>
@@ -3850,11 +4501,11 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3937">3937</a>: Latex makefile clean target used rm command also for Windows.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3939">3939</a>: the EXCLUDE_SYMBOLS option was missing form the online docs.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3962">3962</a>: \htmlinclude and \verbinclude ended the brief description.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3963">3963</a>: Inconsistent behavior when a brief description was given
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3963">3963</a>: Inconsistent behavior when a brief description was given
following by a detailed comment block with JAVADOC_AUTOBRIEF enabled.</li>
-<li> Fixed a number of typos in the documentation
+<li> Fixed a number of typos in the documentation
(thanks to Albert)</li>
-<li> Fixed potential hangup when scanning directories defined as
+<li> Fixed potential hangup when scanning directories defined as
symlinks to absolute paths.</li>
<li> HTML attributes other than src were not copied for the &lt;img&gt; tag.</li>
</ul>
@@ -3863,8 +4514,8 @@ make sure you add the following:
<b>(release date 25-06-2010)</b>
<h3>Changes</h3>
<ul>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3803">3803</a>: Made warning and error messages appear with lower case
- "warning:" and "error:" prefix to make it easier to use the messages
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3803">3803</a>: Made warning and error messages appear with lower case
+ "warning:" and "error:" prefix to make it easier to use the messages
from Visual Studio.</li>
</ul>
<h3>New features</h3>
@@ -3886,14 +4537,14 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3764">3764</a>: In dot graphs now also @ref worked (previously only \ref was
supported).</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3802">3802</a>: Fixed error when compiling doxygen for Solaris 8.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3804">3804</a>: Removed bogus warning about undocumented return type for
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3804">3804</a>: Removed bogus warning about undocumented return type for
define when WARN_NO_PARAMDOC was enabled.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3805">3805</a>: Fixed parsing support for a function that returns a
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3805">3805</a>: Fixed parsing support for a function that returns a
struct definition.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3806">3806</a>: Doxygen could hang when using \copydoc in a function with
\param.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3807">3807</a>: Using //!&lt; after a #define no longer worked.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3808">3808</a>, <a href="https://github.com/doxygen/doxygen/issues/3816">3816</a>, <a href="https://github.com/doxygen/doxygen/issues/3820">3820</a>: html help compiler (and also the Qt
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3808">3808</a>, <a href="https://github.com/doxygen/doxygen/issues/3816">3816</a>, <a href="https://github.com/doxygen/doxygen/issues/3820">3820</a>: html help compiler (and also the Qt
help compiler) was called before all dot images were generated.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3810">3810</a>: Using a auto-list in combination with \subpage cause the
items to be inlined.</li>
@@ -3916,18 +4567,18 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> Changed the look of the HTML output.</li>
-<li> Made several internal changes that should have a positive effect on the
+<li> Made several internal changes that should have a positive effect on the
overall performance.</li>
</ul>
<h3>New features</h3>
<ul>
-<li> The color of the HTML output can now easily be adjusted using three new
- options: HTML_COLORSTYLE_HUE, HTML_COLORSTYLE_SAT,
- and HTML_COLORSTYLE_GAMMA, which control respectively the hue,
+<li> The color of the HTML output can now easily be adjusted using three new
+ options: HTML_COLORSTYLE_HUE, HTML_COLORSTYLE_SAT,
+ and HTML_COLORSTYLE_GAMMA, which control respectively the hue,
saturation, and gamma of all elements in the HTML output.</li>
<li> Moved dot invocations to the end of a doxygen run. Doxygen will now
run multiple instances of dot in parallel (for better CPU utilization
- on multi-core systems). The new config option DOT_NUM_THREADS
+ on multi-core systems). The new config option DOT_NUM_THREADS
determines the number of threads used (were 0 is auto-detect).</li>
<li> Added option EXT_LINKS_IN_WINDOW which controls whether or not
links to symbols imported via tag files will be opened in a new window.</li>
@@ -3951,25 +4602,25 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3500">3500</a>: Links in the search results were broken if they pointed to
symbols imported via tag files using an absolute path or URL.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3504">3504</a>, <a href="https://github.com/doxygen/doxygen/issues/3735">3735</a>: Fixed man page output problem when using @par.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3506">3506</a>: A C comment before a #endif caused the preprocessor
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3506">3506</a>: A C comment before a #endif caused the preprocessor
statement to be ignored.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3547">3547</a>: When HIDE_SCOPE_NAMES was enabled also the scope for
- nested classes was stripped. Now only the namespace scope will be
+ nested classes was stripped. Now only the namespace scope will be
stripped as before.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3575">3575</a>: Autolinks to namespace members did not work if
an explicit # or :: was used.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3591">3591</a>: Slashes inside strings in java annotations were not handled
properly.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3628">3628</a>: Fixed the "show html output" button in doxywizard
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3628">3628</a>: Fixed the "show html output" button in doxywizard
for Windows when IE was set as the default browser.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3652">3652</a>: Formatting was lost for section copied with \copydoc.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3653">3653</a>: Fixed C++ parse issue for "class : public base {} var;"
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3653">3653</a>: Fixed C++ parse issue for "class : public base {} var;"
construct.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3685">3685</a>: Generated HTML footer file did not have UTF-8 encoding and
the relative path marker needed when using CREATE_SUBDIRS = YES.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3689">3689</a>: Fixed parsing problem with try-functions having multiple
catch handlers.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Specialized private template member function appeared as
+<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Specialized private template member function appeared as
public.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3695">3695</a>: Include dependency graphs were sometimes wrong.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3696">3696</a>: Some lines in the generated Doxyfile where too long.</li>
@@ -3990,11 +4641,11 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3722">3722</a>: The labels of CVS tags were missing a colon.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3719">3719</a>: Fixed problem parsing Q_PROPERTY with template type and
spaces.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3729">3729</a>: Made the date string in the HTML footer translatable,
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3729">3729</a>: Made the date string in the HTML footer translatable,
along with some other sentences on the directory pages.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3708">3708</a>: Inline attribute was shown also for non-inline template
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3708">3708</a>: Inline attribute was shown also for non-inline template
members.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3733">3733</a>: Fixed problem handling @copy for operators with
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3733">3733</a>: Fixed problem handling @copy for operators with
const qualifier.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3738">3738</a>: Fixed problem handling '"' inside comments.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3740">3740</a>: Made the LaTeX output a bit less spacious using \input.</li>
@@ -4004,24 +4655,24 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3734">3734</a>: C# namespaces are now extracted also without comment block
(the language spec does not allow XML documentation).</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3742">3742</a>: included patch that fixes some typos in the code.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3744">3744</a>, <a href="https://github.com/doxygen/doxygen/issues/3679">3679</a>: Pages with an underscore in the label generated a
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3744">3744</a>, <a href="https://github.com/doxygen/doxygen/issues/3679">3679</a>: Pages with an underscore in the label generated a
file name containing two underscores.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3747">3747</a>: text of the form something.symbol got autolinked when
symbol had a global scope.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3748">3748</a>: Call graph could be wrong when local variable has the same
name as a global function.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3750">3750</a>: Added documentation patch on how to create URL links with
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3750">3750</a>: Added documentation patch on how to create URL links with
custom text.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3751">3751</a>: Doxywizard now removes non-existent files from the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3751">3751</a>: Doxywizard now removes non-existent files from the
recent list and has an option to clear the list completely.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3752">3752</a>: A macro defined via PREDEFINED did not always overrule a
macro definition in the code.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3759">3759</a>: Enabling call graphs produced invalid XHTML output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3766">3766</a>: Non ascii characters in file or directory names
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3766">3766</a>: Non ascii characters in file or directory names
caused problems on Windows.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3768">3768</a>: An ALIAS with parameters spanning multiple lines
caused problems with /// style comments. </li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3775">3775</a>: Included patch to prevent image overflowing the page in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3775">3775</a>: Included patch to prevent image overflowing the page in
the LaTeX output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3783">3783</a>: Fixed problem using EXTENSION_MAPPING for C# (thanks to
Vsevolod Kukol for the patch).</li>
@@ -4033,7 +4684,7 @@ make sure you add the following:
<li> Using @include in combination with LATEX_SOURCE_CODE caused wrong
output.</li>
<li> Included a patch by Guido Tack which adds two new options
- for docsets (DOCSET_PUBLISHER_ID and DOCSET_PUBLISHER_NAME) and
+ for docsets (DOCSET_PUBLISHER_ID and DOCSET_PUBLISHER_NAME) and
fixes an issue with linking to docset members.</li>
<li> Included patch by Stefan Oberhumer to support escaped {}'s in alias
definition and parameters.</li>
@@ -4049,8 +4700,8 @@ make sure you add the following:
<b>(release date 21-02-2010)</b>
<h3>New features</h3>
<ul>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3654">3654</a>: Using \dir without argument will create directory
- documentation for the directory in which the \dir command
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3654">3654</a>: Using \dir without argument will create directory
+ documentation for the directory in which the \dir command
was found.</li>
</ul>
<h3>Bug fixes</h3>
@@ -4059,12 +4710,12 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3571">3571</a>: Included patch for VHDL.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3617">3617</a>: Replaced size attribute of hr tag by class attribute in the
HTML output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3618">3618</a>, <a href="https://github.com/doxygen/doxygen/issues/3623">3623</a>, <a href="https://github.com/doxygen/doxygen/issues/3639">3639</a>:
- Using \dot produced "Error opening map file" or
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3618">3618</a>, <a href="https://github.com/doxygen/doxygen/issues/3623">3623</a>, <a href="https://github.com/doxygen/doxygen/issues/3639">3639</a>:
+ Using \dot produced "Error opening map file" or
could even crash doxygen.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3619">3619</a>: Loading a new config file in doxywizard did not reset all
values of a previously loaded config file.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3621">3621</a>: Grouped members with todo-like items were shown with
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3621">3621</a>: Grouped members with todo-like items were shown with
"GlobalScope" prefix.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3622">3622</a>: Fixed RTF rendering problem with group index.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3624">3624</a>, <a href="https://github.com/doxygen/doxygen/issues/3675">3675</a>: Added missing line break in LaTeX output.</li>
@@ -4074,20 +4725,20 @@ make sure you add the following:
recognised as such.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3632">3632</a>: Setting SEARCHENGINE to YES and GENERATE_HTML to NO caused
error that search results directory could not be created.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3635">3635</a>, <a href="https://github.com/doxygen/doxygen/issues/3655">3655</a>: typedef'ed enums or struct with the same as the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3635">3635</a>, <a href="https://github.com/doxygen/doxygen/issues/3655">3655</a>: typedef'ed enums or struct with the same as the
typedef did no longer show up.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3636">3636</a>, <a href="https://github.com/doxygen/doxygen/issues/3643">3643</a>: Related pages (manual and automatic like the todo page)
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3636">3636</a>, <a href="https://github.com/doxygen/doxygen/issues/3643">3643</a>: Related pages (manual and automatic like the todo page)
caused broken links when SHORT_NAMES was enabled.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3638">3638</a>, <a href="https://github.com/doxygen/doxygen/issues/3644">3644</a>: Automatically generated related pages (like the
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3638">3638</a>, <a href="https://github.com/doxygen/doxygen/issues/3644">3644</a>: Automatically generated related pages (like the
todo page) caused broken links when CREATE_SUBDIR was enabled.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3641">3641</a>: comments after #if could cause next function call not to be
cross-referenced.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3642">3642</a>: \internal inside a conditional section caused warning.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3646">3646</a>: Using \internal inside a \section did not end at the
next \section as documented.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3647">3647</a>: \internal command produced message with .: in
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3647">3647</a>: \internal command produced message with .: in
the LaTeX output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3649">3649</a>: HTML Tables with custom attributes were not rendered
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3649">3649</a>: HTML Tables with custom attributes were not rendered
properly.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3651">3651</a>: Man pages with underscore got double underscore in the name.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3658">3658</a>: Buffer overflow when using non-ascii characters as class
@@ -4101,7 +4752,7 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3678">3678</a>: Removed bogus warning when using &lt;br/&gt; tag.</li>
<li> Fixed parsing problem for function pointer type starting with
"typedef enum".</li>
-<li> Preprocessor did not take EXCLUDE_PATTERNS into account, which
+<li> Preprocessor did not take EXCLUDE_PATTERNS into account, which
could cause parse issues when importing a .tlb file.</li>
</ul>
@@ -4125,12 +4776,12 @@ make sure you add the following:
This method better scales to larger projects and allows full text
search.</li>
<li> Added new options GENERATE_ECLIPSEHELP and ECLIPSE_DOC_ID
- to generate an index file that can be used to embed doxygen's HTML
- output into Eclipse as a help plugin
+ to generate an index file that can be used to embed doxygen's HTML
+ output into Eclipse as a help plugin
(thanks to a patch by Ondrej Starek).</li>
-<li> Wrote new <a href="searching.html">documentation</a>
+<li> Wrote new <a href="searching.html">documentation</a>
regarding the methods of searching in the HTML output.</li>
-<li> Included patch by Ed Rosten to render formulas with
+<li> Included patch by Ed Rosten to render formulas with
proper anti-aliasing on non-white backgrounds using transparency.</li>
<li> Add new option FORCE_LOCAL_INCLUDES to make the default #include
appearance in class documentation with "" i.s.o sharp brackets.</li>
@@ -4165,37 +4816,37 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3528">3528</a>: Doxygen's preprocessor got confused when /**/ appeared as
part of a macro definition.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/"></a>: Removed obsolete option USE_WINDOWS_ENCODING from the docs.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3531">3531</a>: RTF output was missing a new paragraph for brief
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3531">3531</a>: RTF output was missing a new paragraph for brief
member descriptions.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3536">3536</a>, <a href="https://github.com/doxygen/doxygen/issues/3542">3542</a>: Code reformatting done for the LaTeX output could
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3536">3536</a>, <a href="https://github.com/doxygen/doxygen/issues/3542">3542</a>: Code reformatting done for the LaTeX output could
break multibyte UTF-8 characters causing invalid output.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3537">3537</a>: Using multibyte characters in a page label caused invalid
output.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3540">3540</a>: Documented the interaction between LATEX_CMD_NAME and
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3540">3540</a>: Documented the interaction between LATEX_CMD_NAME and
USE_PDFLATEX.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3548">3548</a>: Todo items for two inner classes with the same name where
- collapsed together in the todo list when HIDE_SCOPE_NAMES
+ collapsed together in the todo list when HIDE_SCOPE_NAMES
was enabled.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3549">3549</a>: Scope was not hidden for members in the todo list even
though HIDE_SCOPE_NAMES was set to YES.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3562">3562</a>: Struct variable with explicit struct keyword got labelled
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3562">3562</a>: Struct variable with explicit struct keyword got labelled
with [read] attribute.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3545">3545</a>: PHP was not parsed properly when it appeared in a
&lt;script language="php"&gt; section.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3550">3550</a>: Fixed problem matching base class member against the
member in the derived class.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3551">3551</a>: Makefile for Docsets now honors DESTDIR.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3560">3560</a>: Made browsing for HHC_LOCATION via the wizard
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3560">3560</a>: Made browsing for HHC_LOCATION via the wizard
yield an absolute path.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3564">3564</a>: Changed default for CHM_INDEX_ENCODING to CP1250 to avoid
issues in a Solaris environment.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3527">3527</a>: Removed unnecessary paragraphs from HTML table cells.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3552">3552</a>: referring to page labels of the form a-1 did not work.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3565">3565</a>: Code generators could produce extra &lt;/span&gt; tags.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3568">3568</a>: Included the PHP search engine again (with new config
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3568">3568</a>: Included the PHP search engine again (with new config
option SERVER_BASED_SEARCH to enable it)</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3572">3572</a>: Doxygen produced invalid Latex output for RCS tags.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3573">3573</a>: Fixed issue with include dependency tracking that could
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3573">3573</a>: Fixed issue with include dependency tracking that could
cause macro expansion not to work properly.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3576">3576</a>: Fixed issue with VHDL call graph (thank to Martin Kreis
for the fix).</li>
@@ -4203,7 +4854,7 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3578">3578</a>: #include inside a class could cause line numbers to be off.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3579">3579</a>: Fixed parsing problem skipping over /**/ comment.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3584">3584</a>: Fixed problem handling Javadoc style {@code ... } blocks.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3585">3585</a>: Special commands did not work in the title of
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3585">3585</a>: Special commands did not work in the title of
the @mainpage.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3593">3593</a>: Fixed problem parsing files that start with UTF-8 BOM.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3596">3596</a>: Fixed problem parsing friend function with explicit scope.</li>
@@ -4235,17 +4886,17 @@ make sure you add the following:
<b>(release date 20-08-2009)</b>
<h3>Changes</h3>
<ul>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3372">3372</a>, <a href="https://github.com/doxygen/doxygen/issues/3012">3012</a>: Replaced the PHP based search engine by a
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3372">3372</a>, <a href="https://github.com/doxygen/doxygen/issues/3012">3012</a>: Replaced the PHP based search engine by a
JavaScript/DHTML based one.
As a result the search feature no longer requires a HTTP server
with PHP enabled to be usable. Searching is limited to symbols
though, but it is now possible to filter on symbol type.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2852">2852</a>: Make the HTML output XHTML 1.0 compliant.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3365">3365</a>: Objective-C categories are now merged with their base
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3365">3365</a>: Objective-C categories are now merged with their base
class, unless there is no base class.</li>
<li> Member groups with the same header within the same scope are now
merged. This also works for Objective-C categories.</li>
-<li> Changed the LaTeX style sheet such that more of the markup is
+<li> Changed the LaTeX style sheet such that more of the markup is
configurable. Please update your style sheet if you use a custom one.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3415">3415</a>: Treat \details inside a brief description as a new paragraph
command.</li>
@@ -4260,7 +4911,7 @@ make sure you add the following:
constructors and destructors first in an otherwise sorted list.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3377">3377</a>: Applied patch by Tobias Hunger that adds support for
documenting DBus XML interface descriptions. </li>
-<li> Included QtHelp patch by Karsten Heimrich which adds missing
+<li> Included QtHelp patch by Karsten Heimrich which adds missing
reference and keyword for methods.</li>
<li> Included updates for the Korean and Polish translation.</li>
</ul>
@@ -4272,10 +4923,10 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/1837">1837</a>: Two template functions that only differed in the number
of template arguments were seen as the same function.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2505">2505</a>: HIDE_UNDOC_CLASSES did not work properly.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/2786">2786</a>: Fixed problem with syncing the information of
- declaration and definition in the presence of an extra forward
+<li> id <a href="https://github.com/doxygen/doxygen/issues/2786">2786</a>: Fixed problem with syncing the information of
+ declaration and definition in the presence of an extra forward
declaration in the source code.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/2875">2875</a>: For C# enum values were merged together if the same enum
+<li> id <a href="https://github.com/doxygen/doxygen/issues/2875">2875</a>: For C# enum values were merged together if the same enum
name was used in different scopes.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/2894">2894</a>: Included patch to handle PROGRAM statement in Fortran as
subroutines/functions.</li>
@@ -4288,7 +4939,7 @@ make sure you add the following:
<li> id <a href="https://github.com/doxygen/doxygen/issues/3379">3379</a>: Segfault/realloc error when a very long path was used.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3388">3388</a>: documented #define with guard caused wrong documentation.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3385">3385</a>: Doxywizard could crash on exit in some cases.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3392">3392</a>: Regression: a struct ivar in ObjC class screws up method
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3392">3392</a>: Regression: a struct ivar in ObjC class screws up method
identification.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3396">3396</a>: Included patch that avoids trailing spaces in the
generated Doxyfile template.</li>
@@ -4297,14 +4948,14 @@ make sure you add the following:
not work correctly.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3418">3418</a>: The "more..." link for files was broken, since the anchor
was not generated.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3433">3433</a>: Fixed parsing problem when an unpaired apostrophe
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3433">3433</a>: Fixed parsing problem when an unpaired apostrophe
appeared in a Python comment.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3446">3446</a>: Included fix for doxywizard makefile. </li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3447">3447</a>: Added missing virtual destructor to CompAccept base class.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3450">3450</a>: Fixed segmentation fault for specific case in PHP code.</li>
<li> Fixed some issues building for Windows.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3457">3457</a>: Fixed problem handling strings like a"\b" within a comment.</li>
-<li> id <a href="https://github.com/doxygen/doxygen/issues/3459">3459</a>: Fixed problem matching explicitly scoped parameter in a
+<li> id <a href="https://github.com/doxygen/doxygen/issues/3459">3459</a>: Fixed problem matching explicitly scoped parameter in a
template class.</li>
<li> id <a href="https://github.com/doxygen/doxygen/issues/3473">3473</a>: A namespace with name "internal" (C++/CLI keyword)
could confuse doxygen's C++ parser.</li>
@@ -4333,14 +4984,14 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> id 395169: Some links via tagfiles were not correct in
+<li> id 395169: Some links via tagfiles were not correct in
combination with CREATE_SUBDIRS=YES</li>
<li> id 539080: Having the same comment for the declaration and definition
- of a function could result in duplicate documentation in case the
+ of a function could result in duplicate documentation in case the
indentation level was different.</li>
<li> id 566713: Dot font was not removed even though DOT_CLEANUP was YES.</li>
<li> id 566925: Fixed problem resolving symbolic links.</li>
-<li> id 567044: Fully qualified name was not shown correctly for nested
+<li> id 567044: Fully qualified name was not shown correctly for nested
classes.</li>
<li> id 567375: Fixed parse problem for typedefs with redundant braces.</li>
<li> id 567535: Fixed problem when parsing operator%= for CLI/C++ code.</li>
@@ -4352,7 +5003,7 @@ make sure you add the following:
<li> id 569478: Fixed line continuation issue with the Fortran parser.</li>
<li> id 570960: C++ class defined in a .mm file was sometimes parsed as
Objective-C code.</li>
-<li> id 571013: In the wizard, editing a text field in the middle of the
+<li> id 571013: In the wizard, editing a text field in the middle of the
text in the expert tab caused the cursor to jump to the end of the line.</li>
<li> id 571096: Fixed Objective-C parsing problem when multiple protocol
forward declarations are put on one line.</li>
@@ -4371,46 +5022,46 @@ make sure you add the following:
<a name="1.5.8"></a>
<h3>Changes</h3>
<ul>
-<li> Completely rewrote the doxywizard. Main changes:
+<li> Completely rewrote the doxywizard. Main changes:
<ul>
<li> It is now based on Qt version 4. (4.3 or higher is required) </li>
- <li> Different layout that allows easy switching between wizard
+ <li> Different layout that allows easy switching between wizard
and expert mode, without losing settings.</li>
- <li> Running doxygen can be done without first having to save
+ <li> Running doxygen can be done without first having to save
the configuration file.</li>
- <li> For HTML output, there is a button to show the results in
+ <li> For HTML output, there is a button to show the results in
the default browser.</li>
- <li> Option to change the default configuration that is used
+ <li> Option to change the default configuration that is used
when you first start the wizard.</li>
<li> Non-default options are shown with red label, and there is
context menu to reset them back to the default.</li>
</ul></li>
-<li> Included Qt help update by Sebastian Pipping introducing
+<li> Included Qt help update by Sebastian Pipping introducing
three new options to define custom filter sections and attributes:
- <code>QHP_CUST_FILTER_NAME</code>,
- <code>QHP_CUST_FILTER_ATTRS</code>,
+ <code>QHP_CUST_FILTER_NAME</code>,
+ <code>QHP_CUST_FILTER_ATTRS</code>,
<code>QHP_SECT_FILTER_ATTRS</code>.
- Doxygen now directly generates the indices needed
+ Doxygen now directly generates the indices needed
by the qthelpgenerator.
Qt customers can have a look at issue 28 of the Qt Quarterly for
more information.</li>
</ul>
<h3>New features</h3>
<ul>
-<li> id 131496, 522488, 541649, 554800:
- Add new option EXTENSION_MAPPING, which can be used to
- change the
+<li> id 131496, 522488, 541649, 554800:
+ Add new option EXTENSION_MAPPING, which can be used to
+ change the
mapping of file extension to language parser, e.g. defining
<code>
- EXTENSION_MAPPING = f=C
+ EXTENSION_MAPPING = f=C
</code>
will make doxygen parse files with the <code>.f</code>
extension as if it were C files.</li>
<li> Added support for Vietnamese (thanks to Dang Minh Tuan)</li>
<li> Thanks to Emin Ilker Cetinbas doxygen can now also produce Turkish
documentation.</li>
-<li> id 143218: It is now possible to add the direction attributes
- normally used with the @param command to document parameters
+<li> id 143218: It is now possible to add the direction attributes
+ normally used with the @param command to document parameters
inline, e.g.
<code>
void foo(int v /**&lt; [in] input parameter docs */);
@@ -4431,10 +5082,10 @@ make sure you add the following:
<li> id 532695: included documentation update about the use of \public
and friends for object-oriented programming in C.</li>
<li> id 532808: References to class variables in PHP code did not already work.</li>
-<li> id 536394: Warning "no matching file member found" was given for a static
+<li> id 536394: Warning "no matching file member found" was given for a static
variables in multiple anonymous namespaces.</li>
<li> id 537686: Fixed invalid empty section for enum in a member group.</li>
-<li> id 539590: C# generics with the same name but different template
+<li> id 539590: C# generics with the same name but different template
parameters where merged.</li>
<li> id 540321: A using declaration in a header file was not taken into
account in the source file that included it.</li>
@@ -4460,11 +5111,11 @@ make sure you add the following:
inside an if at global scope level of a PHP code fragment.</li>
<li> id 556240: Tree view in HTML output was not encoded correctly.</li>
<li> id 557001: VHDL Parser got confused when -- is in a string literal.</li>
-<li> id 557014: Undocumented VHDL record member's internal record prefix
+<li> id 557014: Undocumented VHDL record member's internal record prefix
was not removed.</li>
-<li> id 557026: Obj-C Protocols and interfaces had wrong
+<li> id 557026: Obj-C Protocols and interfaces had wrong
type/name in DocSets.</li>
-<li> id 557031: Obj-C methods no longer require a space after the
+<li> id 557031: Obj-C methods no longer require a space after the
initial - or +.</li>
<li> id 557034: Fixed problem parsing property in Objective-C code.</li>
<li> id 557038: Items in tabs.css could not be overridden by custom
@@ -4476,7 +5127,7 @@ make sure you add the following:
<li> id 558460: When using \subpage, any section in the sub page was
missing from the LaTeX output.</li>
<li> id 558525: Template classes produced invalid HTML in the tree view.</li>
-<li> id 559338: PHP Parser could get confused when there was a comment inside
+<li> id 559338: PHP Parser could get confused when there was a comment inside
an array initializer.</li>
<li> id 559650: Obj-C @interface without body was handle correctly.</li>
<li> id 560623: Mixin template classes where not shown properly in the inheritance
@@ -4484,7 +5135,7 @@ make sure you add the following:
<li> id 563136: The brief sentence is not shown for groups with no children.</li>
<li> id 563384: call graphs were not generated for Qt signals and slots</li>
<li> Included VHDL fix by Martin Kreis.</li>
-<li> grouping of multiple @todo's (and friends) didn't work anymore,
+<li> grouping of multiple @todo's (and friends) didn't work anymore,
causing duplicate sections and labels.</li>
<li> Some issues related to the Qt help output were fixed.</li>
</ul>
@@ -4495,7 +5146,7 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> The dot tool is no longer part of the doxygen package for MacOSX.
- Please install GraphViz separately and set the dot path
+ Please install GraphViz separately and set the dot path
to /usr/local/bin</li>
</ul>
<h3>New features</h3>
@@ -4508,7 +5159,7 @@ make sure you add the following:
<li> id 554432: Re-added ALPHABETICAL_INDEX option.</li>
<li> id 554379: Fixed internal error for GENERATE_INDEXLOG when
GENERATE_HTML was set to NO.</li>
-<li> id 554546: Included fix for handling relative includes in the
+<li> id 554546: Included fix for handling relative includes in the
preprocessor.</li>
<li> Included several VHDL fixes related to syntax highlighting, finding
class members, and mixing upper and lower case.</li>
@@ -4521,32 +5172,32 @@ make sure you add the following:
<a name="1.5.7"></a>
<h3>Changes</h3>
<ul>
-<li> The default CSS style sheet has been cleaned up and simplified, thanks
+<li> The default CSS style sheet has been cleaned up and simplified, thanks
to the work done by Quinn Taylor.</li>
</ul>
<h3>New features</h3>
<ul>
<li> Added new config options <code>GENERATE_QHP</code>
- which enables generating .qch (Qt compiled help) file via
+ which enables generating .qch (Qt compiled help) file via
the Qt's qthelpgenerator tool (part of Qt 4.4+).
- This type of files can be read with Qt's Assistant to browse the
- documentation in a similar way as is possible with Microsoft's
+ This type of files can be read with Qt's Assistant to browse the
+ documentation in a similar way as is possible with Microsoft's
compiled HTML help (.chm). To further customize the output and run the
help generator from within doxygen, the following options
- are available: <code>QCH_FILE</code>, <code>QHP_NAMESPACE</code>,
- <code>QHP_VIRTUAL_FOLDER</code>, <code>QHG_LOCATION</code>.
+ are available: <code>QCH_FILE</code>, <code>QHP_NAMESPACE</code>,
+ <code>QHP_VIRTUAL_FOLDER</code>, <code>QHG_LOCATION</code>.
Thanks to Sebastian Pipping for the patch.</li>
-<li> Add new option <code>SYMBOL_CACHE_SIZE</code> to allow a different
- trade off between doxygen's memory usage and the amount of disk
+<li> Add new option <code>SYMBOL_CACHE_SIZE</code> to allow a different
+ trade off between doxygen's memory usage and the amount of disk
accesses.</li>
<li> id 532695: Added 3 new commands: \extends, \implements, and \memberof
that allow object oriented constructs to be documented as such
for languages that do not support it natively (e.g. C)</li>
<li> Added better support for one line comments after VHDL types.</li>
-<li> Added new option <code>LAYOUT_FILE</code> which can be used to
+<li> Added new option <code>LAYOUT_FILE</code> which can be used to
specify a layout
template file that tells doxygen in which order to generate the
- output and which titles to use for headings and how
+ output and which titles to use for headings and how
the navigation index will look;
Read <a href="customize.html">this</a> for more info.
As a result the following options are now obsolete since they can
@@ -4555,24 +5206,24 @@ make sure you add the following:
The following options can also be set via the layout file, but
for convenience and backward compatibility reasons they are still
also part of the configuration file:
- <code>SHOW_INCLUDE_FILES</code>, <code>SHOW_USED_FILES</code>,
- <code>CLASS_GRAPH</code>, <code>COLLABORATION_GRAPH</code>,
- <code>GROUP_GRAPHS</code>, <code>INCLUDE_GRAPH</code>,
+ <code>SHOW_INCLUDE_FILES</code>, <code>SHOW_USED_FILES</code>,
+ <code>CLASS_GRAPH</code>, <code>COLLABORATION_GRAPH</code>,
+ <code>GROUP_GRAPHS</code>, <code>INCLUDE_GRAPH</code>,
<code>INCLUDED_BY_GRAPH</code>.
Run doxygen with the -l option to generate the default layout file.</li>
-<li> Included update for the Macedonian, Catalan, Brazilian, and Serbian
+<li> Included update for the Macedonian, Catalan, Brazilian, and Serbian
translation and also support for Serbian with Cyrillic characters.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li> id 140264, 332187, 541924: Sections inside a \subpage where not shown as
subsection in the LaTeX/RTF output. </li>
-<li> id 155098,156188: Added support for UTF-8 special characters in identifiers (which is
+<li> id 155098,156188: Added support for UTF-8 special characters in identifiers (which is
allowed by e.g. C#).</li>
<li> id 304598: operator-- caused invalid HTML output.</li>
<li> id 324047: parameter type [in or out] were not generated in RTF document</li>
<li> id 363499: @todo and friends did not work in a comment marked with @dir.</li>
-<li> id 445485: HTML commands in a comment block with attribute values without
+<li> id 445485: HTML commands in a comment block with attribute values without
quotes were not handled properly.</li>
<li> id 533855: Processes were always documented as anonymous in VHDL code.</li>
<li> id 535379: Added support for %{...%} blocks in XPCOM's IDL.</li>
@@ -4587,9 +5238,9 @@ make sure you add the following:
<li> id 538239: Some unlabeled VHDL processes were not corrected detected.</li>
<li> id 538515: Deriving a Objective-C interface from a protocol caused
parsing problems if the interface also has a body.</li>
-<li> id 539057: Part of an Objective-C expression could be missing in the
+<li> id 539057: Part of an Objective-C expression could be missing in the
source browser under certain conditions.</li>
-<li> id 539590: Generic C# classes with the same name but different
+<li> id 539590: Generic C# classes with the same name but different
template arguments were no longer treated as different classes.</li>
<li> id 539712: Fixed code parser issue for parameter indices of procedures
and functions.</li>
@@ -4597,50 +5248,50 @@ make sure you add the following:
<li> id 540372: Fixed problem parsing large table by increasing
YY_READ_BUF_SIZE in the generated parser files.</li>
<li> id 540247: Fixed potential memory corruption issue parsing VHDL.</li>
-<li> id 541113: Fixed locale for ctype, to avoid stripping of 0xA0
+<li> id 541113: Fixed locale for ctype, to avoid stripping of 0xA0
from multi-byte UTF-8 characters.</li>
<li> id 544479: <code>SORT_MEMBER_DOCS</code> did not work for class members.</li>
-<li> id 546621: Fixed makefile so that .svn stuff is removed from the
+<li> id 546621: Fixed makefile so that .svn stuff is removed from the
tar-ball when doing "make archive".</li>
-<li> id 546812: Using a table with row span greater than 1 did not
+<li> id 546812: Using a table with row span greater than 1 did not
produce correct LaTeX output.</li>
<li> id 545098: Fixed problem parsing where clauses in combination with C#
generics.</li>
<li> id 545503: Nameless parameters of type "struct A" could end up wrongly
in the XML output.</li>
<li> id 545970: Referring to the main page did not work as advertised.</li>
-<li> id 546158: The variable defined inside a foreach statement in C# code
+<li> id 546158: The variable defined inside a foreach statement in C# code
was not considered for source linking, cause potentially incomplete call
graphs.</li>
<li> id 547361: Linking to specialized template functions did not work.</li>
-<li> id 548175: Fixed problem parsing class members within a class X,
+<li> id 548175: Fixed problem parsing class members within a class X,
inside a namespace that is also named X.</li>
<li> id 548443: Documenting a nested namespace/classes with @namespace X.Y
did not work for C# (only X::Y worked).</li>
-<li> id 548489: C++/CLI classes of type sealed abstract were not
+<li> id 548489: C++/CLI classes of type sealed abstract were not
processed correctly.</li>
<li> id 549318: Some headings in the user manual where wrongly formatted. </li>
<li> id 549581: Fixed potential buffer overflow in preprocessor.</li>
<li> id 550058: Obj-C: properties for private fields did not appear in the
output unless <code>EXTRACT_PRIVATE</code> was enabled. </li>
-<li> id 550156: Corrected typo in the documentation for
+<li> id 550156: Corrected typo in the documentation for
<code>GENERATE_TREEVIEW</code>.</li>
-<li> id 550247: Fixed problem parsing octal character literals in
+<li> id 550247: Fixed problem parsing octal character literals in
the preprocessing phase.</li>
<li> id 551739: Related function with explicit namespace scope was not
properly placed if the function also existed in the global namespace.</li>
<li> id 552115: Anonymous structs and unions could produce invalid links in
the html help index.</li>
<li> id 552361: Fixed problem with operators in the LaTeX output.</li>
-<li> id 552600: \copybrief ended a brief description instead of appending
+<li> id 552600: \copybrief ended a brief description instead of appending
to it.</li>
<li> id 553469: Removed bogus warning about internal inconsistency when
importing items via a tagfiles that are inside an undocumented scope.</li>
-<li> id 553616: One can now remove the automatic line breaks in the type
+<li> id 553616: One can now remove the automatic line breaks in the type
part of a declaration by using a custom stylesheet with
BR.typebreak { display: none; }</li>
<li> id 553663: Aliases did not work in Fortran comments.</li>
-<li> id 549022: Reimplemented in links could be wrong in case of
+<li> id 549022: Reimplemented in links could be wrong in case of
overloaded members.</li>
<li> id 553225: Parser was confused by arrays inside an Obj-C message.</li>
<li> Finnish translation was disabled. </li>
@@ -4658,9 +5309,9 @@ make sure you add the following:
<li> The GENERATE_TREEVIEW option is not longer a boolean, but can now
have 4 values, NONE (was NO), FRAME (was YES), HIERARCHIES, and ALL.
Thanks to Jake Colman for the patch.</li>
-<li> a page marked as a sub page (\subpage) is now shown in the LaTeX and
- RTF output as a section of its parent page. So the top level pages are
- shown a chapters, subpages as sections, subpages of a subpage as
+<li> a page marked as a sub page (\subpage) is now shown in the LaTeX and
+ RTF output as a section of its parent page. So the top level pages are
+ shown a chapters, subpages as sections, subpages of a subpage as
subsections, etc. </li>
<li> Included spec file updates by Kenneth Porter.</li>
</ul>
@@ -4670,15 +5321,15 @@ make sure you add the following:
instructing dot to use a different font than FreeSans.ttf which doxygen
put in the output directory.</li>
<li> id 517242: Added option CHM_INDEX_ENCODING to specify the encoding
- to be used for the CHM index files. Needed because CHM index files
+ to be used for the CHM index files. Needed because CHM index files
cannot handle UTF-8 encoding.</li>
<li> id 519573: Included patch to make the font-size button visible in the
CHM output.</li>
-<li> id 521288: Added new options SHOW_NAMESPACES and SHOW_FILES to
+<li> id 521288: Added new options SHOW_NAMESPACES and SHOW_FILES to
Suppress Namespace and Files Pages.</li>
<li> id 521495: Included a patch that makes it easy to modify the root of
the html treeview with an image using style sheets.</li>
-<li> id 522300: Added option IDL_PROPERTY_SUPPORT to enable/disable special
+<li> id 522300: Added option IDL_PROPERTY_SUPPORT to enable/disable special
propget/propput handling in IDL files.</li>
<li> Translation support for Finnish has been updated.</li>
<li> Added option FORMULA_FONTSIZE which can be used to change the font size
@@ -4689,10 +5340,10 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Regression: fixed problem handling STL classes
+<li> Regression: fixed problem handling STL classes
when BUILTIN_STL_SUPPORT was enabled</li>
-<li> id 142866,377976: Added new \copybrief and \copydetails commands,
- which work as \copydoc but then only copy either the brief or the
+<li> id 142866,377976: Added new \copybrief and \copydetails commands,
+ which work as \copydoc but then only copy either the brief or the
detailed part of a comment block.</li>
<li> id 312655: DISTRIBUTE_GROUP_DOC didn't always work in combination
with SORT_BRIEF_DOCS enabled.</li>
@@ -4701,19 +5352,19 @@ make sure you add the following:
<li> id 402447: Added support for C# method declarations with where clauses.</li>
<li> id 425029: WARN_FORMAT does no longer require all of
$file, $line, $text to be valid.</li>
-<li> id 495687: Replaced MAX_DOT_GRAPH_MAX_NODES with DOT_GRAPH_MAX_NODES
+<li> id 495687: Replaced MAX_DOT_GRAPH_MAX_NODES with DOT_GRAPH_MAX_NODES
in the docs &amp; config file.</li>
-<li> id 508694 Fixed problem with mixed simple and double quotes in
+<li> id 508694 Fixed problem with mixed simple and double quotes in
Fortran format declaration</li>
<li> id 508752: Fixed problem where the Fortran scanner didn't recognize END</li>
-<li> id 510971: Fortran: parser was confused by double REAL() in processed
+<li> id 510971: Fortran: parser was confused by double REAL() in processed
statements.</li>
<li> id 514488: Fixed problem matching argument lists with const qualifiers.</li>
<li> id 514891: PDF generation failed with a LaTeX error when tocdepth
was set to a value higher than 2.</li>
<li> id 515518: Links in member group documentation was broken when
CREATE_SUBDIRS was enabled.</li>
-<li> id 516086: Fixed division by zero when producing RTF output for the
+<li> id 516086: Fixed division by zero when producing RTF output for the
comment /** &lt;table&gt;&lt;tr&gt;&lt;/tr&gt;&lt;/table&gt; */</li>
<li> id 516536: Fixed build issues on OSX 10.4 and earlier.</li>
<li> id 516070: Added support for simple events without accessors in C#.</li>
@@ -4724,11 +5375,11 @@ make sure you add the following:
<li> id 518334: Fixed problem parsing Objective-C protocol definitions.</li>
<li> id 518537: Hiding an enum with an undocumented typedef with the same
name caused explicit referencing of the enum to fail.</li>
-<li> id 519661: In some cases a function prototype could incorrectly be
+<li> id 519661: In some cases a function prototype could incorrectly be
flagged as a variable with constructor.</li>
-<li> id 520325: Fixed parse problem when comment was after an extern "C"
+<li> id 520325: Fixed parse problem when comment was after an extern "C"
block and before the opening bracket.</li>
-<li> id 521234: Fortran: fixed problem causing
+<li> id 521234: Fortran: fixed problem causing
"stack empty! when parsing code"</li>
<li> id 522225: PDF Latex output did not produce proper hyperlinks for \page
and \subpage comment blocks.</li>
@@ -4737,11 +5388,11 @@ make sure you add the following:
<li> id 522600: Added additional warnings to signal invalid configurations.</li>
<li> id 523138: Removed redundant paragraph in navigation section of the
HTML output. </li>
-<li> id 523326: Namespace name was prepended twice to template
+<li> id 523326: Namespace name was prepended twice to template
specializations classes.</li>
-<li> id 524357: Default mentioned for REFERENCED_BY_RELATION relation
+<li> id 524357: Default mentioned for REFERENCED_BY_RELATION relation
was not correct.</li>
-<li> id 524359: Default mentioned for REFERENCES_RELATION relation was
+<li> id 524359: Default mentioned for REFERENCES_RELATION relation was
not correct.</li>
<li> id 524473: Removed incorrect warnings about parameters in VHDL.</li>
<li> id 525140: Improved handling of Objective-C 2.0 properties.</li>
@@ -4776,7 +5427,7 @@ make sure you add the following:
<li> Pages created with @page are now chapters in the LaTeX and RTF output
and treeviews, and directly follow the mainpage. Also the project name
is not longer repeated for each chapter.
- This should make it more convenient to create normal, printable
+ This should make it more convenient to create normal, printable
documentation with doxygen.</li>
<li> For dot graphs with an edge with more than ten labels, only the first
ten are shown followed by an ellipsis; done to prevent very long
@@ -4787,7 +5438,7 @@ make sure you add the following:
<code>
#define C(S,m) /** container S */ struct S { /** value m */ int m; }
</code></li>
-<li> id 493923: The options SOURCE_BROWSER, CALL_GRAPH, CALLER_GRAPH,
+<li> id 493923: The options SOURCE_BROWSER, CALL_GRAPH, CALLER_GRAPH,
REFERENCES_RELATION, and REFERENCED_BY_RELATION can now be independently
enabled and disabled. By default the relations are now disabled.</li>
</ul>
@@ -4796,10 +5447,10 @@ make sure you add the following:
<li> Added support for VHDL (.vhd or .vhdl extension) based on a patch by
Martin Kreis. Use OPTIMIZE_OUTPUT_VHDL when parsing VHDL code. </li>
<li> id 374699: Added support for Objective-C 2.0 properties.</li>
-<li> Added compilation support for MacOSX 10.5 (Leopard) in combination with
+<li> Added compilation support for MacOSX 10.5 (Leopard) in combination with
Xcode 3</li>
-<li> Added support for docsets, which allow integration of doxygen generated
- API documentation in Xcode 3. new options:
+<li> Added support for docsets, which allow integration of doxygen generated
+ API documentation in Xcode 3. new options:
<ul>
<li> GENERATE_DOCSET: enables/disables the feature</li>
<li> DOCSET_FEEDNAME: sets the provider/suite name under which the set is
@@ -4807,7 +5458,7 @@ make sure you add the following:
<li> DOCSET_BUNDLE_ID: A unique name for the docset.</li>
</ul>
See the configuration file or manual for more details.</li>
-<li> id 493467: Added compilation support 64bit Solaris machines in
+<li> id 493467: Added compilation support 64bit Solaris machines in
combination with Sun's own compiler (thanks to Heiko Jansen).</li>
<li> id 153376: Added support for the \tparam command, which works similar to \param
but is meant for documenting template parameters.</li>
@@ -4815,7 +5466,7 @@ make sure you add the following:
the second and third argument of a \class command, when
the documentation is already in front of a class definition.</li>
<li> Added translator support for Macedonian.</li>
-<li> Added language updates for German, Persian, Spanish, Taiwanese,
+<li> Added language updates for German, Persian, Spanish, Taiwanese,
and Chinese, Korean, Croatian.</li>
</ul>
<h3>Bug fixes</h3>
@@ -4826,12 +5477,12 @@ make sure you add the following:
<li> Some character's could be missing from IDL properties.</li>
<li> Automatic abbreviations did not work for nested classes or classes
in a namespace.</li>
-<li> Fixed a preprocessor bug where the line numbers of a definition could
+<li> Fixed a preprocessor bug where the line numbers of a definition could
get out of sync with the source code.</li>
<li> id 142023: Putting Qt signals or slots in a group did not
make them appear in the group documentation.</li>
<li> id 318668: Comments in Python function argument lists got messed up.</li>
-<li> id 325359: Added support for C# XML-doc commands typeparam and
+<li> id 325359: Added support for C# XML-doc commands typeparam and
typeparamref.</li>
<li> id 331674: Aliases did not work in Python code.</li>
<li> id 356399: Fixed strange warning when specifying a tag file with an
@@ -4848,7 +5499,7 @@ make sure you add the following:
<li> id 488125: <code>operator-&gt;*</code> was not displayed properly in the output.</li>
<li> id 490766: Fixed compile error in fortranscanner.l which occurred for
some compilers.</li>
-<li> id 492027: Ampersand (&amp;) in front of parameter stops documenting
+<li> id 492027: Ampersand (&amp;) in front of parameter stops documenting
of PHP source</li>
<li> id 493249: using a namespace (or Fortran module) caused the namespace
to appear in the documentation as if it was defined.</li>
@@ -4856,7 +5507,7 @@ make sure you add the following:
handled correctly. </li>
<li> id 494187: Doxygen could crash due to an infinite recursion when
using tag files.</li>
-<li> id 494599: When updating a config file an extra space was added just
+<li> id 494599: When updating a config file an extra space was added just
before the end of a quoted string.</li>
<li> id 494760: Putting a # in a path name using Doxywizard, caused the
# to interpreted as the start of a comment in the Doxyfile.</li>
@@ -4865,16 +5516,16 @@ make sure you add the following:
<li> id 496392: Putting character entities like &eacute; in section/group
titles resulted in &amp;acute; in the output.</li>
<li> id 498049: Improvements to .spec files for RPM creation.</li>
-<li> id 498680: Callgraphs for functions in anonymous namespaces generated
+<li> id 498680: Callgraphs for functions in anonymous namespaces generated
invalid labels for 'dot' when EXTRACT_ANON_NSPACES was set to YES.</li>
<li> id 498711: Reference parameters in PHP were not properly parsed.</li>
<li> id 499577: Collaboration diagrams not working with typedef</li>
-<li> id 500227: Wrong output generated for Objective-C methods with
+<li> id 500227: Wrong output generated for Objective-C methods with
multiple arguments for LaTeX or RTF output.</li>
-<li> id 500635: Project name is no longer placed before each top level
+<li> id 500635: Project name is no longer placed before each top level
item in the treeview and other indices.</li>
<li> id 500465: Fixed some issues compiling for AIX.</li>
-<li> id 500928: Fixed parser issue handling a tipple quoted
+<li> id 500928: Fixed parser issue handling a tipple quoted
string when used to initialize a Python variable.</li>
<li> id 500944: Python variables with package scope were only extracted if
EXTRACT_STATIC was enabled.</li>
@@ -4886,7 +5537,7 @@ make sure you add the following:
by the source code parser.</li>
<li> id 503939: Variable was checked before initialized.</li>
<li> id 504120: TYPEDEF_HIDES_STRUCT now also works for enums.</li>
-<li> id 504439: Assert when marshaling a member which had an associated
+<li> id 504439: Assert when marshaling a member which had an associated
example.</li>
<li> id 504650: Generated LaTeX code injected hyperlinks into section titles.</li>
<li> id 507052: Fortran function named x_function was not properly handled.</li>
@@ -4894,13 +5545,13 @@ make sure you add the following:
INPUT_FILTER is empty.</li>
<li> id 508740: Using upper case port mode specifiers did not work correctly.</li>
<li> id 508753: Fortran: Added .f as allowed Fortran extension.</li>
-<li> id 508759: Fortran: fixed potential memory corruption while scanning
+<li> id 508759: Fortran: fixed potential memory corruption while scanning
parameter lists.</li>
<li> id 507528: XML output was not correct for pointer arrays.</li>
<li> id 508752: Fortran scanner didn't recognize lonely END</li>
-<li> id 509278: Spaced before the \internal command where treated as
+<li> id 509278: Spaced before the \internal command where treated as
documentation.</li>
-<li> id 509582: Fortran: Spaces in function return type were not parsed
+<li> id 509582: Fortran: Spaces in function return type were not parsed
properly.</li>
<li> id 510387: Fortran scanner didn't parse initialization of complex type
correctly. </li>
@@ -4908,7 +5559,7 @@ make sure you add the following:
JAVADOC_AUTOBRIEF was enabled.</li>
<li> id 512620: \copydoc of a comment with @param commands could result in
warnings that parameters were not documented.</li>
-<li> id 513570: Fixed cross site scripting vulnerability in the
+<li> id 513570: Fixed cross site scripting vulnerability in the
search.php script.</li>
<li> id 514814: Included missing fromUtf8 calls to translator decoder to
prevent potential language encoding issues.</li>
@@ -4929,7 +5580,7 @@ make sure you add the following:
</ul>
<h3>New features</h3>
<ul>
-<li> Included support for parsing Fortran 90, thanks to a patch by
+<li> Included support for parsing Fortran 90, thanks to a patch by
Anke Visser and Oleg Batrashev (source: http://dougdevel.org/index.php?page=doxygen)</li>
<li> id 477548: Added config option SIP_SUPPORT to support handling SIP sources
(used for Python to C++ bindings).</li>
@@ -4946,14 +5597,14 @@ make sure you add the following:
<li> id 321784: Changed scope resolution algorithm to avoid lookup failures on using
directives (thanks to Christoph Schulz for the patch).</li>
<li> id 415866: Fixed bug in preprocessor causing "More #endif's than #if's found" warning.</li>
-<li> id 426971,465020: A brief description would in some cases be treated as a
+<li> id 426971,465020: A brief description would in some cases be treated as a
detailed one.</li>
-<li> id 430148: Doxygen reported "Internal Inconsistency" for class member inside
+<li> id 430148: Doxygen reported "Internal Inconsistency" for class member inside
anonymous namespaces.</li>
-<li> id 433449,363010: Removed Internal inconsistency when referencing enum values found
+<li> id 433449,363010: Removed Internal inconsistency when referencing enum values found
in a tag file.</li>
<li> id 438282: Line numbers were displayed when using \include inside \example.</li>
-<li> id 443942,461433: mscgen was not called correctly on Windows when
+<li> id 443942,461433: mscgen was not called correctly on Windows when
generating .map files.</li>
<li> id 457346: increased the threshold for adding line breaks to the type part of a
declaration.</li>
@@ -4961,15 +5612,15 @@ make sure you add the following:
<li> id 461889: Fixed bogus "no matching class member found" case. </li>
<li> id 462051: In certain cases doxygen failed to find the proper inheritance relation.</li>
<li> id 462077: Error in LaTeX index generation due to unescaped characters.</li>
-<li> id 462159, 143250: Added support for parsing functions/methods returning a
- pointer or reference to an array, e.g. a function of the
+<li> id 462159, 143250: Added support for parsing functions/methods returning a
+ pointer or reference to an array, e.g. a function of the
form: "int (*f(int))[];"</li>
<li> id 462436: Inheritance from an unknown template class was not handled consistently.</li>
<li> id 462439: Adjusted \author documentation.</li>
<li> id 462757: Fixed Latex output bug for members of anonymous struct or unions. </li>
<li> id 462861: Members references via tagfiles were sometimes broken.</li>
<li> id 463139: Doxygen failed to detect duplicate variable declarations in the same file.</li>
-<li> id 465138: HTML entities in page title (such as &uuml;) where not displayed
+<li> id 465138: HTML entities in page title (such as &uuml;) where not displayed
correctly in the HTML output.</li>
<li> id 465170: Wrong line numbers reported for errors when using multiline formulas.</li>
<li> id 465172: Fixed issues parsing &lt;code&gt;operator&lt;/code&gt;.</li>
@@ -4984,7 +5635,7 @@ make sure you add the following:
<li> id 470029: Fixed crash while parsing a particular piece of PHP code.</li>
<li> id 471185: The word "property" was stripped from functions that started with it.</li>
<li> id 471495: Objective C category documentation was ignored in some cases.</li>
-<li> id 472193: Fixed issue expanding multiple occurrences of the same alias command
+<li> id 472193: Fixed issue expanding multiple occurrences of the same alias command
argument.</li>
<li> id 472201: Removed spurious warning introduced by the fix for bug 465170.</li>
<li> id 473105: Auto link to nested class inside a base class was missing. </li>
@@ -4992,7 +5643,7 @@ make sure you add the following:
<li> id 473402: context dependent \ref's inside a dot or msc graph did not work anymore.</li>
<li> id 473679: Doxygen skipped function if return type contained round parenthesis.</li>
<li> id 474529: index entries in LaTeX could be wrong on some platforms.</li>
-<li> id 476035: Externally referenced links obtained via a tag file had an extra g in
+<li> id 476035: Externally referenced links obtained via a tag file had an extra g in
the anchor</li>
<li> id 476562: argument of copydoc appears in XML output without proper escaping.</li>
<li> id 476766: Type of a virtual destructor was "virtual" in the XML output.</li>
@@ -5003,7 +5654,7 @@ make sure you add the following:
<li> id 481107: Using HTML_FILE_EXTENSION to set a non-default extension did not work
for the "no frames" link to main.html when GENERATE_TREEVIEW was enabled.</li>
<li> id 481827: Macro expansion removed the @ character when it appear in a C comment.</li>
-<li> id 482964: The "template" word was a little too close to the rounded border in
+<li> id 482964: The "template" word was a little too close to the rounded border in
the html output when rendered by Firefox.</li>
<li> id 484277: Adjusted the instructions to report a bug in the hope this will result
in less duplicate bugs.</li>
@@ -5012,7 +5663,7 @@ make sure you add the following:
<li> id 488760: Added support for Trigraphs to doxygen's C-preprocessor.</li>
<li> id 488800: Fixed problem in perlmod generation.</li>
<li> id 488837: abstract class in PHP was not properly parsed.</li>
-<li> id 489049: Setting MUTLILINE_CPP_IS_BRIEF to YES could cause wrong line number
+<li> id 489049: Setting MUTLILINE_CPP_IS_BRIEF to YES could cause wrong line number
references.</li>
<li> Call graphs were not properly synced between function declaration and definition.</li>
<li> Fixed bug in doxygen's internal caching mechanism which could make doxygen
@@ -5026,7 +5677,7 @@ make sure you add the following:
<ul>
<li> When <code>OPTIMIZE_OUTPUT_FOR_C</code> is enabled then a struct definition of the
form <code>typedef struct _S { ... } S_t</code> will be shown in the output as a
- struct of type <code>S_t</code> and the typedef itself is omitted
+ struct of type <code>S_t</code> and the typedef itself is omitted
(previously <code>_S</code> was shown
as well as a typedef of the form <code>typedef _S S_t</code>). </li>
<li> Improved the line-breaking rules for members whose return types have many characters
@@ -5039,11 +5690,11 @@ make sure you add the following:
</ul>
<h3>New features</h3>
<ul>
-<li> Added support for aliases with arguments,
+<li> Added support for aliases with arguments,
see <a href="custcmd.html">the manual</a>
for more information.</li>
-<li> Added <code>HTML_DYNAMIC_SECTIONS</code> option which, when enabled,
- will produce sections
+<li> Added <code>HTML_DYNAMIC_SECTIONS</code> option which, when enabled,
+ will produce sections
in the HTML output that can be expanded/collapsed. Currently used for
diagrams and graphs.</li>
<li> Added support for type constraints as available in the C# language ("where" clause)</li>
@@ -5062,11 +5713,11 @@ make sure you add the following:
<li> id 153362: A typedef of a function pointer was not shown correctly in the output.</li>
<li> id 156003: Wrong template arguments when using @related for a (template) function
with a template class.</li>
-<li> id 170004: The check for PDF or DVI in the generated latex output
+<li> id 170004: The check for PDF or DVI in the generated latex output
was not always reliable.</li>
<li> id 300022: PHP code with unknown extension was parsed as C/C++ code. Added a
detection rule for &lt;?php to switch to PHP parsing.</li>
-<li> id 317967: Setting <code>USE_PDFLATEX</code> to <code>YES</code> now generates a
+<li> id 317967: Setting <code>USE_PDFLATEX</code> to <code>YES</code> now generates a
Makefile with a "pdf" target,
to be consistent with the documentation.</li>
<li> id 397099: Fixed several cases where "referenced by" relation was unresolved.</li>
@@ -5079,20 +5730,20 @@ make sure you add the following:
<li> id 431202, 333607: Quotes inside strings caused the Pythons parser to get off track.</li>
<li> id 431763: doxygen crashes when using unsupported tags in the config file.</li>
<li> id 432420: Last enum value of a Java 1.5 style enum with constructor did not appear.</li>
-<li> id 432743: The "std" namespace appeared in the output when
+<li> id 432743: The "std" namespace appeared in the output when
<code>BUILTIN_STL_SUPPORT</code> was enabled.</li>
-<li> id 432757: Setting <code>INLINE_INHERITED_MEMBERS</code> to <code>YES</code>,
+<li> id 432757: Setting <code>INLINE_INHERITED_MEMBERS</code> to <code>YES</code>,
did not inherit the group of grouped members of a base class.</li>
<li> id 433630: Using double-quotes (") inside a brief description could lead to
errors in dot files when the brief description was used as a tooltip.</li>
-<li> id 434079: The number of graph nodes could still be too large despite a
+<li> id 434079: The number of graph nodes could still be too large despite a
conservative <code>DOT_GRAPH_MAX_NODES</code> setting.</li>
<li> id 436648: List of class members was no longer complete under certain conditions.</li>
-<li> id 437218: Special characters in \brief string cause problems HTML/XML in source
+<li> id 437218: Special characters in \brief string cause problems HTML/XML in source
listings.</li>
-<li> id 438300: Fixed two cases where doxygen could access memory outside array
+<li> id 438300: Fixed two cases where doxygen could access memory outside array
boundaries under certain conditions.</li>
-<li> id 441114: Add support for &lt;term&gt; inside &lt;list&gt; to conform to
+<li> id 441114: Add support for &lt;term&gt; inside &lt;list&gt; to conform to
C# XML comments.</li>
<li> id 442313: Casing of special commands was not handled consistently.</li>
<li> id 443942: Fixed problems running mscgen.</li>
@@ -5102,15 +5753,15 @@ make sure you add the following:
arguments of the type "T%".</li>
<li> id 447133: Replaced occurrences of &apos; by &#39; in the HTML output.</li>
<li> id 448210: Make rule to install manpages was broken.</li>
-<li> id 451297: Fixed more issues where using double-quotes (") inside a brief
- description could lead to errors in dot files when the brief
+<li> id 451297: Fixed more issues where using double-quotes (") inside a brief
+ description could lead to errors in dot files when the brief
description was used as a tooltip.</li>
<li> id 452824: In the source browser linking of a local variable did not work
after a sizeof() of the variable.</li>
-<li> id 452828: Missing reference to struct member in the source browser due to
+<li> id 452828: Missing reference to struct member in the source browser due to
incorrect bracket count.</li>
<li> id 453366: Removed bogus warning for unresolved references in brief descriptions. </li>
-<li> id 453918: The __init__.py files were incorrectly treated as modules causing
+<li> id 453918: The __init__.py files were incorrectly treated as modules causing
scoping issues for symbols defined inside such file.</li>
<li> id 456471: Changing the installation location (--prefix) did not affect the
location were the documentation was installed. --docdir can still
@@ -5131,40 +5782,40 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> The options <code>MAX_DOT_GRAPH_WIDTH</code>, <code>MAX_DOT_GRAPH_HEIGHT</code>, and <code>MAX_DOT_GRAPH_DEPTH</code> have
- been replaced by a single option <code>DOT_GRAPH_MAX_NODES</code>, which can be used to
- limit the size of a graph indirectly, by specifying the maximum amount of nodes in
- the graph. The main advantage is that this can be computed much faster; dot has
- to be run only once per graph and never on graphs with more than the specified
- amount of nodes. Note that doxygen will always render the root node and its
+ been replaced by a single option <code>DOT_GRAPH_MAX_NODES</code>, which can be used to
+ limit the size of a graph indirectly, by specifying the maximum amount of nodes in
+ the graph. The main advantage is that this can be computed much faster; dot has
+ to be run only once per graph and never on graphs with more than the specified
+ amount of nodes. Note that doxygen will always render the root node and its
direct children even when <code>DOT_GRAPH_MAX_NODES = 0</code>.</li>
<li> Parameters names are now copied to reimplemented functions, avoiding warnings about
missing or wrong parameter names when <code>INHERIT_DOCS = YES</code>.</li>
</ul>
<h3>New features</h3>
<ul>
-<li> id 150916,159291,166209,330109,396316
- Doxygen now uses UTF-8 internally for all strings and uses
+<li> id 150916,159291,166209,330109,396316
+ Doxygen now uses UTF-8 internally for all strings and uses
iconv to recode the input to UTF-8. For HTML, LaTeX and man pages
- the output is now always UTF-8. For RTF the encoding is local and
+ the output is now always UTF-8. For RTF the encoding is local and
depends on the code page specified in the translator.
The config option <code>USE_WINDOWS_ENCODING</code> has been removed.
A new config option <code>INPUT_ENCODING</code> has been added which can be used to
specify the encoding of the input. Another config option <code>DOXYFILE_ENCODING</code>
can be used to specify the encoding of the config file itself.</li>
<li> Added support for message sequence charts (using mscgen).
- For this two new commands have been added: \msc and \endmsc (similar
+ For this two new commands have been added: \msc and \endmsc (similar
to \dot..\enddot), and a new config option <code>MSCGEN_PATH</code> (similar to DOT_PATH)
See the manual and <a href="http://www.mcternan.me.uk/mscgen/index.html">website</a> for more info.</li>
-<li> Added support for C++/CLI. To enable it set <code>CPP_CLI_SUPPORT</code> to <code>YES</code> in the
+<li> Added support for C++/CLI. To enable it set <code>CPP_CLI_SUPPORT</code> to <code>YES</code> in the
config file (thanks to Ben Voigt for doing a lot of the work).</li>
<li> <code>IGNORE_PREFIX</code> now also works for function/members names when shown in the various
indices.</li>
-<li> Doxygen will show a tooltip in the HTML output for links to classes, namespaces,
+<li> Doxygen will show a tooltip in the HTML output for links to classes, namespaces,
and members with the brief description (including dot graphs and source code).</li>
-<li> id 321575: Added a new config option <code>EXCLUDE_SYMBOLS</code> which can be used to
+<li> id 321575: Added a new config option <code>EXCLUDE_SYMBOLS</code> which can be used to
exclude certain namespaces/classes/functions from the output by specifying
their name (which may include wildcards).</li>
-<li> id 364536: Included patch by Ben Voigt which adds syntax highlight
+<li> id 364536: Included patch by Ben Voigt which adds syntax highlight
support for several (managed) C++ keywords.</li>
<li> id 419349: Added two LaTeX layout enhancements provided by Stefan Pawig. </li>
</ul>
@@ -5179,7 +5830,7 @@ make sure you add the following:
<li> id 322806: Doxygen now does not treat &gt;&gt; in a template list as a shift operator
for Java and C#.</li>
<li> id 332815: Legend generated with <code>GENERATE_LEGEND</code> did have typo.</li>
-<li> id 345820: Included patch to make doxygen handle config files with
+<li> id 345820: Included patch to make doxygen handle config files with
<code>@INCLUDE</code> with absolute paths correctly.</li>
<li> id 364780: Included patch to improve scope handling of nested classes/namespaces by
the code parser (thanks to Ben Voigt).</li>
@@ -5189,13 +5840,13 @@ make sure you add the following:
<li> id 369499: In some cases variable names were duplicated in python source code output.</li>
<li> id 369200: Fixed parse problem when a single quote appeared in a Python comment line.</li>
<li> id 373229: Doxygen now gives a warning when it cannot inline a #include inside a body </li>
-<li> id 374486: Inheriting from a template argument via an intermediate typedef could
+<li> id 374486: Inheriting from a template argument via an intermediate typedef could
result in invalid output.</li>
<li> id 375073: \ref could cause wrong XML output.</li>
<li> id 375753: Added missing new line to error message.</li>
<li> id 377911: Fixed problem with end of formula.</li>
<li> id 380516: Fixed line number issue in the Python parser.</li>
-<li> id 381450: Tabs in the HTML output redefined the value of an "id" attribute,
+<li> id 381450: Tabs in the HTML output redefined the value of an "id" attribute,
which is not legal HTML.</li>
<li> id 374592: Member grouping didn't work properly for constructors.</li>
<li> id 381608: Initializer values of class variables and constants did no longer
@@ -5223,7 +5874,7 @@ make sure you add the following:
and as a result cause "Undocumented function" warnings.</li>
<li> id 418920: Doxygen stripped leading comment chars from C# code blocks.</li>
<li> id 421131: Character encoding was not consistent for all HTML files.</li>
-<li> The "list of all members" was not shown for a class with no members that derived
+<li> The "list of all members" was not shown for a class with no members that derived
from a class with members.</li>
</ul>
@@ -5234,7 +5885,7 @@ make sure you add the following:
<ul>
<li> id 148567: @todo at the end of a comment block caused problem when copied by @copydoc</li>
<li> id 352420: Fixed bug in LaTeX output (missing space after \bf).</li>
-<li> id 363227: missing output for instance variables defined in a Python function
+<li> id 363227: missing output for instance variables defined in a Python function
that has a doc string</li>
<li> id 363397: Member groups did not appear in a class when SUBGROUPING was set to YES.</li>
<li> id 364341: Parsing could become really slow if often included header files contained
@@ -5254,20 +5905,20 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> cleaned up the internal structures to make them smaller, and made doxygen use
- a temporary file to store the parse results (instead of keeping them in memory),
- which will further reduce the memory usage, especially for large projects, and is a
+ a temporary file to store the parse results (instead of keeping them in memory),
+ which will further reduce the memory usage, especially for large projects, and is a
first step towards incremental parsing.</li>
</ul>
<h3>New features</h3>
<ul>
-<li> Added example application that shows how to configure and run doxygen from
+<li> Added example application that shows how to configure and run doxygen from
within an application and use the information collected by doxygen without
also generating the output (see addon/doxyapp).</li>
<li> id 322467: Sections produces by \note, \warning, \remarks etc, now have a
- class label in the generated HTML (&lt;dl&gt; tag) so you can give them a
+ class label in the generated HTML (&lt;dl&gt; tag) so you can give them a
distinct style using a non-default stylesheet (i.e. using HTML_STYLESHEET). </li>
<li> Added project files for building doxygen from Visual Studio 2005 (see winbuild dir). </li>
-<li> added translator updates for Czech, Danish, German, Catalan, Croatian, French,
+<li> added translator updates for Czech, Danish, German, Catalan, Croatian, French,
Japanese, and Italian.</li>
<li> added translator support for Arabic (thanks to Moaz Reyad)</li>
<li> added translator support for Persian (thanks to Ali Nadalizadeh)</li>
@@ -5282,9 +5933,9 @@ make sure you add the following:
<li> id 325337: Added "optimize output for C#" option to Doxywizard.</li>
<li> id 325426: Partial C# class inside a namespace where not handled properly.</li>
<li> id 327358: Fixed wrong link to the search engine when CREATE_SUBDIRS was set to YES.</li>
-<li> id 326885: Leading ///'s ended up in code fragments when using indented
+<li> id 326885: Leading ///'s ended up in code fragments when using indented
/// comments.</li>
-<li> id 330513: For file documentation, the scope not stripped for namespace members
+<li> id 330513: For file documentation, the scope not stripped for namespace members
even if HIDE_SCOPE_NAMES was set to YES.</li>
<li> id 335131: Fixed "internal inconsistency" warning related to use of nested
classes defined outside a used namespace.</li>
@@ -5307,7 +5958,7 @@ make sure you add the following:
<li> id 348259: Doxygen now keeps the _formulas.log file when there is a problem
generating bitmaps for formulas. This can help to identify the problem quicker.</li>
<li> id 348481: friend class in unnamed namespace produced bogus error.</li>
-<li> id 348537: Fixed internal inconsistency warning that could occur when reopening
+<li> id 348537: Fixed internal inconsistency warning that could occur when reopening
an anonymous namespace </li>
<li> id 349867: Fixed issue handling brief and detailed description when
both are positioned after an item. </li>
@@ -5318,7 +5969,7 @@ make sure you add the following:
and namespaces as it does for classes.</li>
<li> id 354765: A command like \ingroup now ends a brief description as was the case
in the pre 1.4.x series.</li>
-<li> id 355922: When a function was found in a namespace but also in the global
+<li> id 355922: When a function was found in a namespace but also in the global
namespace, doxygen could make the wrong cross-reference.</li>
<li> id 356204: Setting HIDE_UNDOC_RELATIONS to NO could result in
argument mismatches in certain cases.</li>
@@ -5359,9 +6010,9 @@ make sure you add the following:
a caller (or called-by) graph to a function or all functions.
(thanks to Daniel Sherwood for the patch)</li>
<li> Added REFERENCES_LINK_SOURCE config option which allows to selected
- if reference relations should point to the source or to the
+ if reference relations should point to the source or to the
documentation (thanks to Daniel Sherwood for the patch).</li>
-<li> Included patch by Christoph Pesch to mention the member type in the
+<li> Included patch by Christoph Pesch to mention the member type in the
warning "Member ... of ... is not documented".</li>
<li> included update for Spanish, Italian, Norwegian, and Czech translations.</li>
<li> Added support for get/set properties in IDL (thanks to a patch by
@@ -5369,26 +6020,26 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> id 151959: incremental "using" of nested namespaces could prevent
+<li> id 151959: incremental "using" of nested namespaces could prevent
that doxygen matched function declaration against definition.</li>
<li> id 310521: HIDE_IN_BODY_DOCS was longer working.</li>
<li> id 315039: Improved handling of members in an anonymous scope. </li>
<li> id 322415: Under certain conditions a scrollbar appeared in a HTML page
while this was not needed.</li>
-<li> id 325845: Documentation parser was confused when starting a HTML list
+<li> id 325845: Documentation parser was confused when starting a HTML list
directly after a \b command.</li>
<li> id 325866: SORT_BY_SCOPE_NAME=YES did not always work if SORT_BRIEF_DOCS
was also enabled.</li>
<li> id 326023: CHM files had @ signs in CHM index for anonymous class enums</li>
<li> id 326250: Fixed incorrect regular expression in constexp.l</li>
-<li> id 326688: Added better support for PHP5 style constructors
+<li> id 326688: Added better support for PHP5 style constructors
and destructors.</li>
<li> id 326885: Using multi-line //!-blocks did not work nicely together with
@code...@endcode blocks anymore.</li>
<li> id 327242: Python: Methods starting with _ are now marked private,
except for special method names (i.e. starting and ending with __).</li>
<li> id 327666: Fixed parse issue that resulted in a missing call graph.</li>
-<li> id 328435: When enabling USE_PDFLATEX a blank line appeared in the
+<li> id 328435: When enabling USE_PDFLATEX a blank line appeared in the
makefile</li>
<li> id 328849: Added clarification to the manual about the use of //!&lt;
comments.</li>
@@ -5398,37 +6049,37 @@ make sure you add the following:
a missing argument.</li>
<li> id 329530: An apostrophe in ##-comments inside a Python class confused
the parser.</li>
-<li> id 329534: Fixed problem resolving inheritance relations for nested
+<li> id 329534: Fixed problem resolving inheritance relations for nested
Python classes.</li>
<li> id 329537: Corrected the Python example to show how modules should be
documented.</li>
-<li> id 329719: # comment in PHP containing a ' caused doxygen to ignore
+<li> id 329719: # comment in PHP containing a ' caused doxygen to ignore
rest of input.</li>
<li> id 329861: Fixed problem parsing embedded structs in an Objective-C
interface.</li>
-<li> id 329905: PDF manual produced a LaTeX error because style sheet
+<li> id 329905: PDF manual produced a LaTeX error because style sheet
was not up to date.</li>
-<li> id 330209: A typedef in an Obj-C implementation file could obscure
+<li> id 330209: A typedef in an Obj-C implementation file could obscure
class implementation later in the file</li>
-<li> id 331511: no matching class member found error for class template
+<li> id 331511: no matching class member found error for class template
instance in combination with "using" of said class.</li>
<li> id 331751: Fixed problem parsing a function typedef.</li>
-<li> id 332110: method matching failed for equivalent template instance
+<li> id 332110: method matching failed for equivalent template instance
types.</li>
<li> id 332178: Fixed malformed XML output for readable properties.</li>
<li> id 333270: Fixed BoundingBox problem with PostScript graphs generated
- with dot using graphviz-2.9.20060302.0540 and later (thanks to
+ with dot using graphviz-2.9.20060302.0540 and later (thanks to
John Ellison for the patch)</li>
<li> id 332875: Enabling SEPARATE_MEMBER_PAGES could lead to bogus warning
- messages about undocumented parameters if only the HTML output was
+ messages about undocumented parameters if only the HTML output was
enabled.</li>
<li> id 333330: Patch the reorganizes the treeview.</li>
-<li> id 333831: "typedef const struct { } NAME" construction was not
+<li> id 333831: "typedef const struct { } NAME" construction was not
properly parsed.</li>
<li> id 334716: Doxygen could hang when calling latex with invalid formulas.</li>
-<li> id 336467: Latex formula could prevent /// comment blocks to be properly
+<li> id 336467: Latex formula could prevent /// comment blocks to be properly
converted to /** */ blocks.</li>
-<li> id 336782: Prevented crash when providing code with illegal/redundant
+<li> id 336782: Prevented crash when providing code with illegal/redundant
class scope.</li>
<li> id 337344: Configure now accept system's /usr/bin/install on FreeBSD.</li>
<li> id 341365: @endcode comment was skipped in a specific case.</li>
@@ -5442,13 +6093,13 @@ make sure you add the following:
(thanks to Shachar Itzhaky for the patch)</li>
<li> Included patch by Ernst Giessmann, which prevents most of the underfull
hbox warnings that are produced when compiling doxygen's LaTeX output.</li>
-<li> Fixed potential crash during preprocessing if C-macros are defined
+<li> Fixed potential crash during preprocessing if C-macros are defined
with /* (thanks to Günther Haslauer for the patch).</li>
-<li> Anonymous struct members could end up in the wrong scope
+<li> Anonymous struct members could end up in the wrong scope
(thanks to Bruno Andrillon for the patch).</li>
<li> saving to an existing file in doxywizard now requires a confirmation.</li>
<li> Fixed potential crash in case a template class with a redundant
- namespace qualifier was used:
+ namespace qualifier was used:
e.g. "namespace N { template&lt;&gt; class N::C&lt;G::H&gt; {}; }"</li>
</ul>
@@ -5462,7 +6113,7 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> id 145294: Boolean expression with '&lt;' as template argument confused
+<li> id 145294: Boolean expression with '&lt;' as template argument confused
doxygen.</li>
<li> id 303297: The class hierarchy was sometimes incorrectly shown.</li>
<li> id 317819: Updated the documentation concerning the creation of PDF
@@ -5475,11 +6126,11 @@ make sure you add the following:
pages not be styled as tabs. Also, links to include dependency graphs
had wrong links or were incomplete.</li>
<li> id 318564: Python: parser skipped comment blocks in some cases.</li>
-<li> id 318565: Python: single quote doc strings did not get parsed properly
+<li> id 318565: Python: single quote doc strings did not get parsed properly
if there was no space before the closing '''.</li>
<li> id 318567: Python: parse problem when () appear in default value of a
function parameter.</li>
-<li> id 318618: If INLINE_INHERITED_MEMB = YES constructors of a
+<li> id 318618: If INLINE_INHERITED_MEMB = YES constructors of a
template class were shown in the derived class.</li>
<li> id 318678: Python: A referenced variable that
was not found using docstring could lead to memory corruption.</li>
@@ -5488,26 +6139,26 @@ make sure you add the following:
<li> id 319341: Doxygen crashed while generating call graph under certain
circumstances.</li>
<li> id 319539: Fixed parse problem with Python/Objective-C code.</li>
-<li> id 319586: tabs.css not correctly included with CREATE_SUBDIRS option
+<li> id 319586: tabs.css not correctly included with CREATE_SUBDIRS option
set.</li>
-<li> id 318460: Multiply-defined labels if two function specializations
+<li> id 318460: Multiply-defined labels if two function specializations
differ only on the name of a template parameter.</li>
<li> id 319219: Spurious space was inserted after inlined math formulas.</li>
-<li> id 319826: The file name for template classes could become too
+<li> id 319826: The file name for template classes could become too
long causing files that cannot be created by some file systems.</li>
-<li> id 320026: undocumented "typedef struct foo baz" causes subsequent
+<li> id 320026: undocumented "typedef struct foo baz" causes subsequent
variables appear as typedefs.</li>
<li> id 320543: If enabled the alphabetical class list is now the default
item under the classes tab.</li>
-<li> id 320587: Links in brief file descriptions shown in directory pages
+<li> id 320587: Links in brief file descriptions shown in directory pages
were broken if CREATE_SUBDIRS was enabled.</li>
-<li> id 320693: First sentence in mainpage was missing with
+<li> id 320693: First sentence in mainpage was missing with
JAVADOC_AUTOBRIEF enabled.</li>
<li> id 320740: Added support for documenting individual elements of an
associative array in PHP.</li>
<li> id 320813: The if() statement with space after the if confused the
code parser and resulted in partial call graphs.</li>
-<li> id 320960: redundant line continuation characters were not removed
+<li> id 320960: redundant line continuation characters were not removed
by doxygen's C-preprocessor.</li>
<li> id 321165: Doxygen choked on Qt properties with namespaced types</li>
<li> id 321197: using a namespace that contains a nested class, where the
@@ -5520,20 +6171,20 @@ make sure you add the following:
properly if there was a space between the name and the size, i.e.
struct {} Var [10];</li>
<li> id 321682: Fixed typo in the HTML output of the search page.</li>
-<li> id 321743: Cross-references were missing to members of
+<li> id 321743: Cross-references were missing to members of
anonymous structs.</li>
-<li> id 311833: A template specialization of a private class member was
+<li> id 311833: A template specialization of a private class member was
marked as public.</li>
-<li> id 312329: @link label @endlink, i.e without link text now shows
+<li> id 312329: @link label @endlink, i.e without link text now shows
the label as text, and space after label is omitted.</li>
-<li> id 312624: \verbatim block could cause wrong line numbers while
+<li> id 312624: \verbatim block could cause wrong line numbers while
parsing the source code.</li>
-<li> id 322752: Fixed specific case where aliases were incorrectly expanded
+<li> id 322752: Fixed specific case where aliases were incorrectly expanded
inside environment formulas</li>
-<li> id 322997: Putting function-style macros in a parameter of a
+<li> id 322997: Putting function-style macros in a parameter of a
template return type of a function confused doxygen's parser.</li>
-<li> id 323320: An enum name that also appears as a typedef
- (i.e. typedef T {} T; }) is now linked as an enum and the typedef is
+<li> id 323320: An enum name that also appears as a typedef
+ (i.e. typedef T {} T; }) is now linked as an enum and the typedef is
omitted from the output.</li>
<li> id 323557: Bit field information was missing from the XML output.</li>
<li> id 323627: Fixed compiler warning when using gcc 4.x.</li>
@@ -5543,18 +6194,18 @@ make sure you add the following:
<li> id 324076: Fixed some typos in the documentation.</li>
<li> id 324153: The configure script didn't work for SunOS 5.8.</li>
<li> id 324163: \todo paragraph did not end at \author (or similar commands).</li>
-<li> id 324313: Added support for having a Linux system where libraries are
+<li> id 324313: Added support for having a Linux system where libraries are
located in lib64 by adding a new platform to tmake: linux-64</li>
<li> id 324521: Autolinking to classes in a group which itself was in a
namespace didn't work without explicit scoping.</li>
<li> id 324558: Null pointer dereference in namespacedef.cpp</li>
-<li> id 324565: References and callgraphs missing for some functions
+<li> id 324565: References and callgraphs missing for some functions
(thanks to a patch by Dave Dodge).</li>
-<li> id 324566: Fixed problem matching
+<li> id 324566: Fixed problem matching
f(unsigned long const a) against f(unsigned long)</li>
-<li> id 324568: Fixed problem were some function prototypes were detected
+<li> id 324568: Fixed problem were some function prototypes were detected
as variable constructor calls (thanks to Dave Dodge for the patch).</li>
-<li> id 324601: Cross referencing and call graphs were broken by
+<li> id 324601: Cross referencing and call graphs were broken by
certain bracket positions for functions.</li>
<li> id 324823: Doxygen's code parser lost track in some cases, causing
function definitions not being found in some cases.</li>
@@ -5565,9 +6216,9 @@ make sure you add the following:
<a name="1.4.5"></a>
<h3>Changes</h3>
<ul>
-<li> Changed to way the index looks (I hope you like it!).
+<li> Changed to way the index looks (I hope you like it!).
It now is a list of items styled (with CSS) as a row of tabs.
- Also class/namespace/file related items are now grouped together and
+ Also class/namespace/file related items are now grouped together and
presented as a second row of tabs to prevent clutter (the latter is
based on the suggestions/patch in bug report 162968).
Note that if you use a custom HTML header you need to add
@@ -5583,8 +6234,8 @@ make sure you add the following:
This helps with matching of argument lists for function declarations and
definitions and also helps to improve the collaboration and inheritance
diagrams that involve STL classes.</li>
-<li> id 317010: Added support for the following new HTML entities:
- &amp;lsquo; &amp;rsquo; &amp;ldquo; &amp;rdquo; &amp;ndash;
+<li> id 317010: Added support for the following new HTML entities:
+ &amp;lsquo; &amp;rsquo; &amp;ldquo; &amp;rdquo; &amp;ndash;
&amp;mdash; (thanks to a patch by madalexonline)</li>
<li> Included update for Chinese translation.</li>
<li> included update for the VC++ project files (in wintools dir), thanks
@@ -5594,27 +6245,27 @@ make sure you add the following:
<ul>
<li> id 304339: Using \dot in latex formulas conflicted with the doxygen's
\dot command.</li>
-<li> id 306076: Using a namespace inside an example listed with
+<li> id 306076: Using a namespace inside an example listed with
@example did not work.</li>
<li> id 306069: Search engine required lower case names in order to find
something, which made pasting of names difficult.</li>
<li> id 308395: Doxygen could crash when producing a warning that included
a %s sequence.</li>
-<li> id 311191: Default values for parameters weren't shown in the detailed
+<li> id 311191: Default values for parameters weren't shown in the detailed
documentation.</li>
<li> id 311198: If JAVADOC_AUTOBRIEF was set to YES, a \todo or \bug like
command always ended at the first dot.</li>
-<li> id 311207: The /* and */ inside a \code ... \endcode code fragment
+<li> id 311207: The /* and */ inside a \code ... \endcode code fragment
were stripped.</li>
<li> id 311577: Putting a documented class name in the title of the main
page caused a LaTeX error if pdf hyperlinks were enabled.</li>
<li> id 311665: Fixed compile issue for Solaris.</li>
-<li> id 312688: Typedefs of arrays were auto-linked to the base type
+<li> id 312688: Typedefs of arrays were auto-linked to the base type
i.s.o the typedef.</li>
-<li> id 312678: Fixed excessive memory usage for @fn commands
- due to a memory leak of the scanner buffer 256K of memory was leaked
+<li> id 312678: Fixed excessive memory usage for @fn commands
+ due to a memory leak of the scanner buffer 256K of memory was leaked
for each command!</li>
-<li> id 312791: Undocumented members did not result in warnings if
+<li> id 312791: Undocumented members did not result in warnings if
SOURCE_BROWSER was enable and the member's definition was part of
the INPUT.</li>
<li> A C-comment inside a \code block could lead to parse problems in the
@@ -5628,17 +6279,17 @@ make sure you add the following:
is enabled).</li>
<li> id 313011: Item after the closing of a nested group was ignored in
some cases.</li>
-<li> id 313103: Member groups within other nested groups did not work
+<li> id 313103: Member groups within other nested groups did not work
anymore.</li>
<li> id 313298: Code parser didn't handle function-try-blocks correctly.</li>
<li> id 313572: Fixed lockup issue when generation code for Python files.</li>
-<li> id 313695: Fixed parsing issues for the constructs
+<li> id 313695: Fixed parsing issues for the constructs
"\f$n\f$" and "operator &lt;CODE&gt;". </li>
-<li> id 313805: '@' characters in a string literal were lost during
+<li> id 313805: '@' characters in a string literal were lost during
macro expansion.</li>
<li> id 313906: added support for "import" and "from ... import" to the
Python parser so cross module inheritance works.</li>
-<li> id 313908: Fixed python parser problem: If there are two classes
+<li> id 313908: Fixed python parser problem: If there are two classes
defined in one module there needed to be a comment between them.</li>
<li> id 314165: Python functions starting with _ are not marked as public,
whereas variables starting with _ are marked private.</li>
@@ -5647,31 +6298,31 @@ make sure you add the following:
<li> id 314237: You can now also use \ref on directories documented with
\dir.</li>
<li> id 314288: Using \ref with an ambiguous filename didn't work.</li>
-<li> id 315006: C++ comments at the start of a line and
+<li> id 315006: C++ comments at the start of a line and
inside a &lt;pre&gt;..&lt;/pre&gt; block were stripped.</li>
<li> id 316264: Fixed typo in the inline config file documentation.</li>
-<li> id 316266: Included update for the Japanese translation (thanks to
+<li> id 316266: Included update for the Japanese translation (thanks to
Katsuhiro Hermit Endo)</li>
<li> id 316759: Fixed problem in the Makefile of doxywizard so that the
right version appears in the about box.</li>
-<li> id 316944: An inline formula (or other special command) did not get
- executed if it was within an inline documentation block and
+<li> id 316944: An inline formula (or other special command) did not get
+ executed if it was within an inline documentation block and
put after a parameter.</li>
<li> id 317052: The alphabetical class index was not sorted properly if
multiple prefixes were specified using IGNORE_PREFIX. </li>
<li> id 317105: Latex output expanded &amp;szlig; as "s instead of {\ss} which
only worked if german.sty was included. Thanks to Stefan Pawig for the
patch)</li>
-<li> id 317397: Copying of images from subdirectory within the IMAGE_PATH
+<li> id 317397: Copying of images from subdirectory within the IMAGE_PATH
didn't work properly since doxygen didn't remove the subdirectory
from the destination path.</li>
<li> id 317446: Documenting an enum with \enum while there is also a function
with the same name in the same scope could make the enum documentation
appear at the wrong spot or the enum in the wrong member group.</li>
<li> id 317490: A variable of a nested class, forward declared in a template
- class, which in turn was in a namespace, caused the variable to end
+ class, which in turn was in a namespace, caused the variable to end
up in the global scope. </li>
-
+
</ul>
<h1>Doxygen Release 1.4.4</h1>
@@ -5680,7 +6331,7 @@ make sure you add the following:
<h3>New features</h3>
<ul>
<li> Added support for parsing Python code.
- Special comment blocks in Python are of the
+ Special comment blocks in Python are of the
<pre>
##
# Some comment
@@ -5697,8 +6348,8 @@ make sure you add the following:
<h3>Bug fixes</h3>
<ul>
<li> id 166254: SORT_BY_SCOPE_NAME didn't work anymore.</li>
-<li> id 304380: New argument matching algorithm didn't handle the case
- where "const int" needed to be matched against
+<li> id 304380: New argument matching algorithm didn't handle the case
+ where "const int" needed to be matched against
"const int a" correctly.</li>
<li> id 304435: Superfluous backslash in the makefile caused problems for
Japanese locale.</li>
@@ -5708,7 +6359,7 @@ make sure you add the following:
embedded doxytag that include the end of a HTML comment.</li>
<li> id 304623: Spreading a @fn command over multiple lines didn't work
anymore without using line-continuation characters.</li>
-<li> id 304666: Attributes of the same class appeared separated with \n in
+<li> id 304666: Attributes of the same class appeared separated with \n in
collaboration diagrams</li>
<li> id 304751: A define "foo()" was indistinguishable from a define "foo" in
the XML output.</li>
@@ -5732,15 +6383,15 @@ make sure you add the following:
next paragraph.</li>
<li> id 305770: For overloaded global functions only the first appeared
in the file documentation.</li>
-<li> id 306028: The text after /*@{ and //@{ was treated as source code
+<li> id 306028: The text after /*@{ and //@{ was treated as source code
instead of a comment block.</li>
<li> id 306136: Structural commands were executed even though they appeared
within quoted text.</li>
<li> id 306200: Putting a command like \author before \brief caused the
long description to be glued to the \author command.</li>
-<li> id 306235: Punctuation is not automatically added to brief
+<li> id 306235: Punctuation is not automatically added to brief
descriptions for Japanese, Chinese, and Korean anymore. </li>
-<li> id 306637: @endcond did not properly end a conditional section
+<li> id 306637: @endcond did not properly end a conditional section
when @cond was used without label.</li>
<li> id 306711: Brief descriptions ended at a new paragraph even if no
content was found and @name didn't work without explicit
@@ -5757,7 +6408,7 @@ make sure you add the following:
documented with \var and also had a brief description.</li>
<li> id 307954: Parse problem when a /* was nested inside a C-style comment.</li>
<li> id 308053: It is now possible to put multiple structural commands into
- a single comment block. Doxygen will treat them as
+ a single comment block. Doxygen will treat them as
separate comment blocks internally. Example:
<pre>
/** @file
@@ -5766,11 +6417,11 @@ make sure you add the following:
* Group documentation.
*/
</pre></li>
-<li> id 308059: &amp;nbsp; was written as "\ " to the LaTeX output instead
+<li> id 308059: &amp;nbsp; was written as "\ " to the LaTeX output instead
of ~.</li>
<li> id 308400: The parameter names are now used based on whether the
documentation is in front of the declaration or definition.</li>
-<li> id 309022: Conversion operators inherited from a template class
+<li> id 309022: Conversion operators inherited from a template class
did not appear with the proper type substitution.</li>
<li> id 309148: The search index page was not correct if DISABLE_INDEX was
set to YES.</li>
@@ -5780,7 +6431,7 @@ make sure you add the following:
<li> id 309711: Aliases were expanded inside formulas.</li>
<li> id 310012: Made the allowed suffixes for constants in the constant
expression evaluator of the C-preprocessor more strict.</li>
-<li> id 310025: Added explicit type conversion to avoid problems with
+<li> id 310025: Added explicit type conversion to avoid problems with
compiler bugs in Sun's Forte 6.1 and Studio 10 compiler.</li>
<li> Fixed argument matching issue exposed by the template example in the
examples directory.</li>
@@ -5791,9 +6442,9 @@ make sure you add the following:
<a name="1.4.3"></a>
<h3>Changes</h3>
<ul>
-<li> For Developers: Added an abstract interface for language parsers
- (see src/parserintf.h), which can be used implement new programming
- language parsers. There is also a manager class, where a parser
+<li> For Developers: Added an abstract interface for language parsers
+ (see src/parserintf.h), which can be used implement new programming
+ language parsers. There is also a manager class, where a parser
instance can be bound to a certain file extension.</li>
<li> Changed the algorithm for matching function/method declarations against
their definitions. The new algorithm should be faster, more powerful,
@@ -5802,8 +6453,8 @@ make sure you add the following:
<h3>New features</h3>
<ul>
-<li> Included new config option HTAGS. When enabled in combination with
- SOURCE_BROWSER=YES, the source browser of GNU's Global source
+<li> Included new config option HTAGS. When enabled in combination with
+ SOURCE_BROWSER=YES, the source browser of GNU's Global source
system (via htags) is used instead of doxygen's own (thanks to
Shigio Yamaguchi for the patch).</li>
<li> Added language updates for Indonesian, Catalan, Russian, Korean,
@@ -5813,20 +6464,20 @@ make sure you add the following:
<h3>Bug fixes</h3>
<ul>
-<li> id 163705: Using \image for latex without caption but with size
+<li> id 163705: Using \image for latex without caption but with size
parameter "width=\textwidth" did not work.</li>
-<li> id 163783: Items of an autolist could be wrongly indented if put
+<li> id 163783: Items of an autolist could be wrongly indented if put
directly after @name.</li>
<li> id 163928: Class section was missing in the file documentation.</li>
<li> id 164072: When using tag files unneeded external
classes could appear in the class hierarchy in some cases.</li>
-<li> id 169755: page title was omitted in the XML output if
+<li> id 169755: page title was omitted in the XML output if
CASE_SENSE_NAME was set to NO.</li>
<li> id 170592: Using \ref for Objective-C methods did not work if the
name contained a colon.</li>
<li> id 171795: Referring to Objective-C methods now follows Apple's
conventions. </li>
-<li> id 171878: When JAVADOC_AUTOBRIEF = YES and there was no blank line
+<li> id 171878: When JAVADOC_AUTOBRIEF = YES and there was no blank line
after a page command, the first sentence did not appear in
the documentation.</li>
<li> id 171923: Doxygen failed to match arguments for a function documented
@@ -5834,14 +6485,14 @@ make sure you add the following:
<li> id 172118: Doxywizard now shows the version of doxygen it is for.</li>
<li> id 172133: Doxygen did not longer ignore preceding C++ comments inside a
comment block.</li>
-<li> id 172217: 'using namespace' declarations with spaces resulted
+<li> id 172217: 'using namespace' declarations with spaces resulted
in duplicate namespaces.</li>
<li> id 172329: The index of the CHM did not always link to groups correctly.</li>
-<li> id 172456: Fixed case where doxygen had problems differentiating const
+<li> id 172456: Fixed case where doxygen had problems differentiating const
and non-const member functions.</li>
-<li> id 172494: @code blocks were not properly ignored by the preprocessor
+<li> id 172494: @code blocks were not properly ignored by the preprocessor
in some cases.</li>
-<li> id 172622: Fixed parse problem for Objective-C method implementations
+<li> id 172622: Fixed parse problem for Objective-C method implementations
whole declaration part ended with a semicolon.</li>
<li> id 172723: Namespace members appeared in the file documentation without
proper links to the namespace.</li>
@@ -5856,47 +6507,47 @@ make sure you add the following:
<li> id 300204: Doxygen disobeyed Cygwin's 'text/binary mount mode'
(thanks to Max Bowsher for the patch).</li>
<li> id 300466: Improved the documentation for FILTER_SOURCE_FILES.</li>
-<li> is 300473: Added a browse button for several of Doxywizard's
+<li> is 300473: Added a browse button for several of Doxywizard's
fields of the expert dialog where a file was expected.</li>
<li> id 300532: consecutive @todo items were joined together even if they
are in different sections.</li>
<li> id 300745: A disabled @cond section did not omit #define documentation.</li>
<li> is 301409: autolinks to undocumented files did not work correctly when
SOURCE_BROWSER was enabled.</li>
-<li> id 301437: Fixed a typo in an example that is part of the preprocessor
+<li> id 301437: Fixed a typo in an example that is part of the preprocessor
documentation.</li>
<li> id 301478: Fixed some cases where cross-references were not properly
detected anymore.</li>
<li> id 301616: Added "+" or "-" to the Objective-C method lists in the
summary section of a class.</li>
-<li> id 302100: An enum could not be grouped by grouping out of line
+<li> id 302100: An enum could not be grouped by grouping out of line
documentation.</li>
<li> id 302158: When enabling SEPARATE_MEMBER_PAGES and CREATE_SUBDIRS
the member index contained invalid links.</li>
<li> id 302160: list directly after @brief not parsed properly if there
were spaces before the @brief command.</li>
-<li> id 302713: Updated doxytag so it works better with recent versions
+<li> id 302713: Updated doxytag so it works better with recent versions
of Qt3 and the Qt4 beta versions.</li>
-<li> id 303305: When using \subpage the page hierarchy wasn't reflected
+<li> id 303305: When using \subpage the page hierarchy wasn't reflected
in the tree view or .chm index.</li>
-<li> id 303511: Documenting a class in a namespace with a comment block
+<li> id 303511: Documenting a class in a namespace with a comment block
inside the namespace containing a @class command did
not work properly.</li>
-<li> id 303911: Links from todo list items to Objective-C categories were
+<li> id 303911: Links from todo list items to Objective-C categories were
broken.</li>
<li> id 304026: A class/struct/interface can now be turned into something
- else of the same kind using the proper command (i.e.
+ else of the same kind using the proper command (i.e.
@interface could by used to turn a class into an interface).</li>
-<li> Doxygen did not honor the "All members of an interface in Java are
+<li> Doxygen did not honor the "All members of an interface in Java are
implicitly public" rule.</li>
-<li> An enum of a class could not be documented with @enum from inside a
+<li> An enum of a class could not be documented with @enum from inside a
namespace.</li>
<li> Fixed problem handling unname member groups (useful in combination
with DISTRIBUTE_GROUP_DOC = YES, which didn't work anymore).</li>
<li> Updated Doxygen.dsp (thanks to Gerik Rhoden).</li>
-<li> For a word marked with a #, the # is now also removed when no link
+<li> For a word marked with a #, the # is now also removed when no link
could be generated.</li>
-<li> Using '&lt;' (or '\&lt;') in a &lt;pre&gt; section cause '$&lt;$'
+<li> Using '&lt;' (or '\&lt;') in a &lt;pre&gt; section cause '$&lt;$'
to appear in the Latex output.</li>
</ul>
@@ -5908,9 +6559,9 @@ make sure you add the following:
<li>If the class/namespace/file member indexes get too long they are now
automatically split over multiple pages (one page per index letter).</li>
<li>Internal: I've split the input scanner (scanner.l) in a part that scans
- the supported programming languages and passes the comment blocks to a
+ the supported programming languages and passes the comment blocks to a
second scanner. This should clean up the code a lot and make
- the handling of structural commands (like \class and \section)
+ the handling of structural commands (like \class and \section)
more consistent. It is also a first step towards supporting dedicated
scanners for other programming languages. </li>
<li>Made doxygen parse .as files (Action Script) as Java code.</li>
@@ -5923,10 +6574,10 @@ make sure you add the following:
all members on the class/file/namespace page. An index for other members
of the same compound is rendered on the left hand side of the page.</li>
<li>Added new command \subpage that can be used to build a hierarchy of
- pages. For pages this is more convenient than using \defgroup
+ pages. For pages this is more convenient than using \defgroup
and \ingroup. See the documentation more details and an example.</li>
<li>Included man pages for doxygen and doxywizard.</li>
-<li>Language updates for Czech, Swedish, Russian, Italian, Catalan,
+<li>Language updates for Czech, Swedish, Russian, Italian, Catalan,
German, Brazilian, Korean, Ukrainian, Romanian, Croatian and Chinese,</li>
</ul>
@@ -5937,45 +6588,45 @@ make sure you add the following:
<li>id 142339: Doxygen did not using the LATEX_CMD_NAME setting when
generating formulas.</li>
<li>id 163180: Extension specific filters did not work.</li>
-<li>id 163940: Labels in dot graphs containing quotes where
+<li>id 163940: Labels in dot graphs containing quotes where
not escaped properly.</li>
<li>id 164198: \overload text was always English, it is now translatable.</li>
-<li>id 164498: Fixed problem where doxygen ignored the documentation for
- members of Objective C class categories when put in the
+<li>id 164498: Fixed problem where doxygen ignored the documentation for
+ members of Objective C class categories when put in the
implementation section.</li>
<li>id 164563: \anchor didn't work inside a &lt;pre&gt;...&lt;/pre&gt; section.</li>
<li>id 164812: fix compile problem for certain language selections.</li>
<li>id 165097: Fixed problem with wrong syntax color in \code section.</li>
-<li>id 165188: in index.xsd the refid attribute type (xsd:Name) was
+<li>id 165188: in index.xsd the refid attribute type (xsd:Name) was
not broad enough and has been replaced by xsd:string.</li>
-<li>id 165339: Fixed some issues in the code parser causing missed
+<li>id 165339: Fixed some issues in the code parser causing missed
cross-referencing relations and/or call graphs.</li>
-<li>id 165428: ALIASES containing @section commands where not
+<li>id 165428: ALIASES containing @section commands where not
handled properly.</li>
<li>id 165503: grouped classes did not appear as such in the XML output.</li>
<li>id 165793: input filter was applied to \verbinclude.</li>
<li>id 165816: Grouped functions referenced via tag files had broken links</li>
<li>id 165821: Tag file parser produced bogus errors for nested classes and
namespaces and no line number was reported.</li>
-<li>id 166043: static initializer block in Java made doxygen ignore the
+<li>id 166043: static initializer block in Java made doxygen ignore the
rest of the file.</li>
<li>id 166161: More documentation to make the \code command more clear.</li>
-<li>id 166756: Fixed a number of issues with the new comment scanner.
+<li>id 166756: Fixed a number of issues with the new comment scanner.
It should be much more usable now.</li>
-<li>id 166782: XML output: Simple types in a namespace are also
+<li>id 166782: XML output: Simple types in a namespace are also
listed at file scope in index.xml</li>
<li>id 166863: @class required fully qualified name even if the comment
block was in the right scope already.</li>
-<li>id 166898: Forward declaring a template class added the template
+<li>id 166898: Forward declaring a template class added the template
argument to next class defined</li>
-<li>id 167037: The method names were non-informative in the todo like
+<li>id 167037: The method names were non-informative in the todo like
lists when HIDE_SCOPE_NAMES was set to YES (thanks to Luigi Ballabio
for the fix).</li>
<li>id 167040: Related functions were listed as members in the todo list.</li>
-<li>id 167462: Doxygen doesn't recognize references to methods of classes
+<li>id 167462: Doxygen doesn't recognize references to methods of classes
that come as parameter</li>
<li>id 168159: Sometimes enums don't have hyperlinks in the source code.</li>
-<li>id 168243: Doxygen produced an unclear warning when putting multiple
+<li>id 168243: Doxygen produced an unclear warning when putting multiple
@page commands in one comment block.</li>
<li>id 168693: A C-style comment ending with a brief description (including dot)
and a **/ as end marker, caused strange warning.</li>
@@ -5984,14 +6635,14 @@ make sure you add the following:
<li>id 168871: \~ did not work in C++ style documentation and aliases.</li>
<li>id 168961: Fixed problem parsing arrays of unnamed structs.</li>
<li>id 169003: cross-references were make to global variables even if the
- global variables were hidden by local ones or
+ global variables were hidden by local ones or
undocumented/private member variables.</li>
-<li>id 169069: static C++ variables with initializers were detected as
+<li>id 169069: static C++ variables with initializers were detected as
functions.</li>
-<li>id 169188: static functions were not extracted from PHP classes even
+<li>id 169188: static functions were not extracted from PHP classes even
though EXTRACT_STATIC was set to YES.</li>
<li>id 169495: const Qt properties were not parsed properly.</li>
-<li>id 169535: spaces after \ref command were not preserved
+<li>id 169535: spaces after \ref command were not preserved
in &lt;pre&gt; context when the command had only one argument.</li>
<li>id 169547: Removed bogus warning for friend classes inside classes in
an anonymous namespace.</li>
@@ -6007,21 +6658,21 @@ make sure you add the following:
<li>id 170612: documenting members of nested anonymous compounds did no
longer work.</li>
<li>id 170833: &lt;code&gt; ended a brief description.</li>
-<li>id 170835: doxygen didn't match members of classes in unnamed
+<li>id 170835: doxygen didn't match members of classes in unnamed
namespaces with their definitions</li>
-<li>id 170846: template instance friend classes could not be documented
+<li>id 170846: template instance friend classes could not be documented
externally. </li>
-<li>id 171260: In some cases doxygen produced an incorrect warning about
+<li>id 171260: In some cases doxygen produced an incorrect warning about
duplicate detailed descriptions.</li>
<li>id 171295: It now possible again to link to a (enum)value of a @retval using
#name.</li>
-<li>id 171376: \else command was not properly parsed if the corresponding
+<li>id 171376: \else command was not properly parsed if the corresponding
\if was disabled. </li>
<li>id 171749: Using @relatesalso for functions in a namespace didn't work
correctly.</li>
-<li>It is now possible again to use Thing%s to auto-link to a class
+<li>It is now possible again to use Thing%s to auto-link to a class
Thing and put a non-linked "s" after it.</li>
-<li>Nested anonymous namespaces appeared as @&lt;num&gt; in the
+<li>Nested anonymous namespaces appeared as @&lt;num&gt; in the
documentation of the parent namespace.</li>
<li>aliases containing @brief were not handled correctly.</li>
<li>The class name in the HtmlHelp index was linked to the
@@ -6046,14 +6697,14 @@ make sure you add the following:
<a name="1.4.0"></a>
<h3>Changes</h3>
<ul>
-<li> In the HTML help output (.chm files) the index items with only one
- subitem are now collapsed into one item (thanks to Antony Pranata for
+<li> In the HTML help output (.chm files) the index items with only one
+ subitem are now collapsed into one item (thanks to Antony Pranata for
the patch).</li>
<li> Some minor tweaks to the style sheet.</li>
<li> @relates can now not only be used for functions, but also for
other members (i.e. enums, types and variables).</li>
-<li> Static members do have have explicit "static" in the declaration
- part of the documentation. This is useful for grouping where it
+<li> Static members do have have explicit "static" in the declaration
+ part of the documentation. This is useful for grouping where it
is otherwise not obvious that a member is static.</li>
<li> typedefs and enumeration are no longer shown in the "referenced by"
list as these are types (based on patch by Antoine Tandin). </li>
@@ -6065,13 +6716,13 @@ make sure you add the following:
<li> Included language update for Serbian, German, and Korean.</li>
<li> For directories dependency graphs are now generated (controlled
by the DIRECTORY_GRAPH switch). For a given directory, the graph will
- show its parent directory and the sub directories as nested boxes.
- For the directory and its sub directories it will show the relations
- with other directories. Relations are based on #include relations of
- the files contained in the directories. Each dependency arrow has an
- associated number. This number indicates the number of
- different #include relations. Clicking on the number will show a page
- with the exact #include relations (the latter is for the HTML output
+ show its parent directory and the sub directories as nested boxes.
+ For the directory and its sub directories it will show the relations
+ with other directories. Relations are based on #include relations of
+ the files contained in the directories. Each dependency arrow has an
+ associated number. This number indicates the number of
+ different #include relations. Clicking on the number will show a page
+ with the exact #include relations (the latter is for the HTML output
only). </li>
<li> Added \cond and \endcond commands, which can be used to
(conditionally) exclude a part of a file. See the manual for an
@@ -6082,19 +6733,19 @@ make sure you add the following:
parameter or return type documentation.</li>
<li> Nested classes are now listed in their containing class.</li>
<li> Extended the \f command to support different environments, i.e.
- \f{eqnarray*} for equation arrays. The end command is \f}. The
+ \f{eqnarray*} for equation arrays. The end command is \f}. The
documentation has an example.</li>
-<li> Added support for group dependency graphs
+<li> Added support for group dependency graphs
(thanks to a patch by Antoine Tandin): New option: GROUP_GRAPHS</li>
<li> New option DOT_TRANSPARENT to enable dot graph with a transparent
background. Thanks to Maik Hinrichs for the patch.</li>
<li> New option FILE_VERSION_FILTER which allows an external tool to
provide version information per file, which is then used in the
file documentation. Thanks to Maik Hinrichs for the patch.</li>
-<li> id 162295: New option DOT_MULTI_TARGETS which when set to YES,
- will run dot with multiple output files if possible. This was added
- to support older version of dot (&lt;=1.8.10) which do not support multiple
- output targets. If you use a recent version of dot, you probably want
+<li> id 162295: New option DOT_MULTI_TARGETS which when set to YES,
+ will run dot with multiple output files if possible. This was added
+ to support older version of dot (&lt;=1.8.10) which do not support multiple
+ output targets. If you use a recent version of dot, you probably want
to enable this (default is NO).</li>
</ul>
<h3>Bug fixes</h3>
@@ -6105,29 +6756,29 @@ make sure you add the following:
operation like \cond.</li>
<li> id 135311: Recursive ALIAS definitions now work again.</li>
<li> id 151012: &lt;td&gt; tag in HTML function documentation missed 'class="md"'</li>
-<li> id 154689: Wrong link to members of namespaces imported from tag
+<li> id 154689: Wrong link to members of namespaces imported from tag
files when CASE_SENSE_NAMES is set to NO.</li>
<li> id 154700: anchors in pages imported via tag files could not be
linked to.</li>
<li> id 154755: Files were missing from Doxygen.dsp project file.
(thanks to Gerik Rhoden).</li>
-<li> id 154758: Fixed typedef resolution bug that could crash doxygen
+<li> id 154758: Fixed typedef resolution bug that could crash doxygen
(thanks to Gerik Rhoden for the analysis and fix).</li>
-<li> id 154862: Fixed problem matching array parameters that include
+<li> id 154862: Fixed problem matching array parameters that include
template parameters as the array size.</li>
<li> id 154863: Fixed parsing problem in the preprocessor when an
expression contained the division operator.</li>
<li> id 154469: Referring to Objective-C messages was broken if the full
scope was used.</li>
-<li> id 155086: Typedef for member-function pointers of template classes
+<li> id 155086: Typedef for member-function pointers of template classes
not recognized</li>
<li> id 155272: Image filenames in RTF output were not quoted causing problem
with custom images whose name contained spaces.</li>
<li> id 155322: Fixed parse problem for php code containing '#'. </li>
<li> id 155224: Java interfaces didn't resolve across packages w/o FQN.</li>
-<li> id 156411: Return type of a function was not hyperlinked in some cases
+<li> id 156411: Return type of a function was not hyperlinked in some cases
(typical with nested namespaces or Java packages).</li>
-<li> id 156445: function seen first in header and doc'ed in
+<li> id 156445: function seen first in header and doc'ed in
source broke autolinking depending on the order of the input.</li>
<li> id 157085: Autolinks for const/volatile operators didn't work.</li>
<li> id 157229: Upper case letters in \page "&lt;name&gt;" breaks title on page.</li>
@@ -6137,14 +6788,14 @@ make sure you add the following:
<li> id 158961: Set EXTRACT_ALL to NO resulted in no directory information
unless the directory and files were documented. This is now controlled
by SHOW_DIRECTORIES.</li>
-<li> id 158481: I did some memory usage analysis with valgrind's massif tool,
- which indicated that a lot of memory was used by QCString objects.
- This made me decide to reimplement the class and optimize it for
- memory usage. The resulting class saves a "new" operation of 12 bytes
- per string object, which seems to reduce the overall amount of
- memory used by doxygen by a factor 2 to 3! The implementation seemed
+<li> id 158481: I did some memory usage analysis with valgrind's massif tool,
+ which indicated that a lot of memory was used by QCString objects.
+ This made me decide to reimplement the class and optimize it for
+ memory usage. The resulting class saves a "new" operation of 12 bytes
+ per string object, which seems to reduce the overall amount of
+ memory used by doxygen by a factor 2 to 3! The implementation seemed
more expense to use (as it always copies the content instead of sharing
- it), but the performance has improved nevertheless (probably because
+ it), but the performance has improved nevertheless (probably because
"new" is much more expensive operation than copying small strings).</li>
<li> id 158637: Links to classes in brief description in index pages were
wrong when CREATE_SUBDIRS was set to YES.</li>
@@ -6154,14 +6805,14 @@ make sure you add the following:
<li> id 160642: Fixed problem parsing multi-dimensional C arrays.</li>
<li> id 160673: Borland's __property keyword was not handled correctly.</li>
<li> id 160824: UML Collab diagram did't show fields in user defined groups.</li>
-<li> id 160931: Made configure script use /bin/bash as it apparently didn't
+<li> id 160931: Made configure script use /bin/bash as it apparently didn't
work with /bin/sh anyway.</li>
-<li> id 161048: Latex output for directories could contain unescaped
+<li> id 161048: Latex output for directories could contain unescaped
underscores when SHOW_DIRECTORIES was set to YES.</li>
<li> id 161167: /// \file was not parsed properly.</li>
<li> id 161247: If CALL_GRAPH was enabled references were shown even if
REFERENCES_RELATION was set to NO.</li>
-<li> id 161320: An incorrect line number was given for inherited comments
+<li> id 161320: An incorrect line number was given for inherited comments
which have an error.</li>
<li> id 161321: Fixed problem parsing '"' in PHP code.</li>
<li> id 161394: Fixed problem with inheritance tree showing the same
@@ -6172,7 +6823,7 @@ make sure you add the following:
<li> id 162434: void function gave rise to warnings when WARN_NO_PARAMDOC
was set to YES.</li>
<li> id 162446: Fixed parse problem in code.l, causing it to get off track.</li>
-<li> id 162517: A @ref command was not parsed properly if the argument
+<li> id 162517: A @ref command was not parsed properly if the argument
between quotes was found on the next line.</li>
<li> Dot would not run if doxygen was installed in a path which contained
spaces (Mac OS X).</li>
@@ -6191,12 +6842,12 @@ make sure you add the following:
<li> Fixed a couple of memory leaks.</li>
<li> Fixed crash problem on Windows related to the new string implementation.</li>
<li> Fixed problem with Visual Studio project files (in wintools).</li>
-<li> Included patch by Antoine Tandin to fix problem with GROUP_GRAPHS
+<li> Included patch by Antoine Tandin to fix problem with GROUP_GRAPHS
in combination with CREATE_SUBDIRS = YES.</li>
<li> Included patch by Mikhail Glushenkov to make HTML look prettier.</li>
<li> Parsing operator[]s was broken.</li>
<li> Referencing constants via #CONST did not work anymore.</li>
-<li> Fixed problem handing multiline ALIASES containing @defgroup and
+<li> Fixed problem handing multiline ALIASES containing @defgroup and
@ingroup.</li>
<li> Fixed problem handling \n in ALIASES.</li>
<li> @section's in non-page documentation blocks did not work.</li>
@@ -6211,21 +6862,21 @@ make sure you add the following:
<h1>Doxygen Release 1.3.9.1</h1>
<h3>Bug fixes</h3>(ids refer to the old bugzilla issue, just use it in the search box of the <a href="https://github.com/doxygen/doxygen/issues">issue tracker</a>)<br/>
<ul>
-<li> Due to an error in the packaging script, an old version of doxywizard
+<li> Due to an error in the packaging script, an old version of doxywizard
was bundled with the Mac OS X version of doxygen.</li>
<li> Dot would not run if doxygen was installed in a path which contained
spaces (Mac OS X).</li>
-<li> id 151012: &lt;td&gt; tag in HTML function documentation
+<li> id 151012: &lt;td&gt; tag in HTML function documentation
missed 'class="md"'</li>
-<li> id 154689: Wrong link to members of namespaces imported from tag
+<li> id 154689: Wrong link to members of namespaces imported from tag
files when CASE_SENSE_NAMES is set to NO.</li>
<li> id 154700: anchors in pages imported via tag files could not be
linked to.</li>
<li> id 154755: Files were missing from Doxygen.dsp project file.
(thanks to Gerik Rhoden for sending an update).</li>
-<li> id 154758: Fixed typedef resolution bug that could crash doxygen
+<li> id 154758: Fixed typedef resolution bug that could crash doxygen
(thanks to Gerik Rhoden for the analysis and fix).</li>
-<li> id 154862: Fixed problem matching array parameters that include
+<li> id 154862: Fixed problem matching array parameters that include
template parameters as the array size.</li>
<li> id 154863: Fixed parsing problem in the preprocessor when an
expression contained the division operator.</li>
@@ -6241,8 +6892,8 @@ make sure you add the following:
<li> id 149899: A macro defined in the config file (see PREDEFINED) can now
prevented from being undefined (via a #undef in the code) when its
value is assigned via the := operator (e.g. PREDEFINED = A(x):=x ).</li>
-<li> id 150631: if HIDE_SCOPE_NAMES is enabled the scope of a method in a
- call graph is only shown when the method is of a different
+<li> id 150631: if HIDE_SCOPE_NAMES is enabled the scope of a method in a
+ call graph is only shown when the method is of a different
class.</li>
<li> id 151911: Stylesheet is generated earlier in the process.</li>
<li> id 152164, 152166: Improved the way search results are sorted.</li>
@@ -6251,17 +6902,17 @@ make sure you add the following:
</ul>
<h3>New features</h3>
<ul>
-<li> Directory information is now extracted by doxygen. Files are
- automatically grouped by directory. You can use
+<li> Directory information is now extracted by doxygen. Files are
+ automatically grouped by directory. You can use
the SHOW_DIRECTORIES option to enable/disable this feature.
Added a new command \dir which can be used to document directories.</li>
-<li> Language updates for Czech, Swedish, Hungarian, Danish, Russian, Italian,
+<li> Language updates for Czech, Swedish, Hungarian, Danish, Russian, Italian,
German, Chinese, Croatian, and Polish.</li>
<li> Applied a patch by Arend van Beelen which adds support for the
new features introduced in PHP5.</li>
-<li> Applied a patch by Ferdinand Wess for better handling of #import
+<li> Applied a patch by Ferdinand Wess for better handling of #import
statements in Obj-C code.</li>
-<li> Applied a patch by Adam Treat to add read and write accessors
+<li> Applied a patch by Adam Treat to add read and write accessors
of a Q_PROPERY to the XML output.</li>
<li> Arnaud Bercegeay has added platform support for the Atari MiNT OS. </li>
<li> Included patch by James Ahlborn which improves the way nested numbered
@@ -6279,24 +6930,24 @@ make sure you add the following:
<li> id 126344: Added initial support for member template specializations.</li>
<li> id 126448: Argument passed to input filter was not always quoted.</li>
<li> id 126745: Anchors of grouped members were wrong in some cases.</li>
-<li> id 128585: Lists were not always rendered properly in the man page
+<li> id 128585: Lists were not always rendered properly in the man page
output format.</li>
<li> id 128809: Hidden files (starting with a dot) could not be included
with for instance \verbinclude.</li>
-<li> id 130431: Prevented recursive loop in the call graph when a function
+<li> id 130431: Prevented recursive loop in the call graph when a function
declares a local variable with the name of the function.</li>
<li> id 131299: \copydoc with argument A#func() didn't work.</li>
-<li> id 131354: Fixed bug matching function declaration/implementation with
+<li> id 131354: Fixed bug matching function declaration/implementation with
using declarations.</li>
-<li> id 135448: Improved autodetection of Qt by the configure script
+<li> id 135448: Improved autodetection of Qt by the configure script
some more (thanks to Michael Henry).</li>
<li> id 135808: Removed reference to doxysearch.cpp from Doxyfile included
with the source distribution.</li>
-<li> id 138629: Included patch to make the HTML output more conformant to
+<li> id 138629: Included patch to make the HTML output more conformant to
the XHTML standard (thanks to Jan Nijtmans).</li>
<li> id 144865: Variables in anonymous unions/structs did not appear as
data fields.</li>
-<li> id 148547: Added a workaround for a compile problem in pngrutils.c
+<li> id 148547: Added a workaround for a compile problem in pngrutils.c
on AIX 5.2.</li>
<li> id 148671: Using "publicsomething" as a name for a base class resulted
in the "public" part being stripped.</li>
@@ -6304,44 +6955,44 @@ make sure you add the following:
<li> id 149023: Fixed template inheritance through typedefs problem.</li>
<li> id 149045: Fixed several small problems related to template handling.</li>
<li> id 149106: Fixed problem parsing enum declarations.</li>
-<li> id 149164: Fixed problem in the configure script when used with perl
+<li> id 149164: Fixed problem in the configure script when used with perl
version 5.6 (thanks to a patch by Joerg Schlichenmaier)</li>
<li> id 149258: Example sources could be wrongly indented.</li>
<li> id 149263: Fixed copy/paste error in HTML_FOOTER documentation.</li>
<li> id 149698: Multiple lines of //!&lt; comments were not handle correctly.</li>
<li> id 149711: Title of a namespace page/section was not generated.</li>
<li> id 149797: Forgot to turn off debug mode for the RTF output.</li>
-<li> id 149880: Brief description of one variable could appear in the
+<li> id 149880: Brief description of one variable could appear in the
the description of the next under certain circumstances.</li>
<li> id 150264: linking to Obj-C protocols did not work.</li>
-<li> id 150427: "virtual" and "const" were not nicely formatted when
+<li> id 150427: "virtual" and "const" were not nicely formatted when
followed by unary scope resolution operator (e.g "const ::A")</li>
<li> id 150629: Enabling OPTIMIZE_OUTPUT_JAVA did not help for call graphs.</li>
<li> id 151457: Fixed compile problem on Solaris 4.2.</li>
-<li> id 151452: Bug in LaTeX output for anonymous structs/unions whose
+<li> id 151452: Bug in LaTeX output for anonymous structs/unions whose
members have brief descriptions.</li>
<li> id 151246: Parse error when using in-body comment blocks.</li>
<li> id 152005: Objective-C string constants appear in output with @"@"</li>
<li> id 152182: Spaces mess up type in Objective C functions.</li>
-<li> id 152184: label-less parameters in Objective C functions were not
+<li> id 152184: label-less parameters in Objective C functions were not
parsed properly.</li>
<li> id 152383: Objective-C categories showed methods twice.</li>
<li> id 152572: \brief inside an argument description caused a bogus warning.</li>
-<li> id 152681: Call-graphs were generated inside a table environment in
+<li> id 152681: Call-graphs were generated inside a table environment in
the HTML output.</li>
<li> #include after a @file comment made the #include appear on the same line
when DETAILED_AT_TOP was enabled.</li>
-<li> User specified images &amp; stylesheets did not work with
+<li> User specified images &amp; stylesheets did not work with
CREATE_SUBDIR.</li>
<li> Nested using directives did not work for C#.</li>
<li> Grouped classes did not always appear in the modules section of the
navigation tree.</li>
<li> "internal" classes appeared in the XML output.</li>
-<li> friend classes did no longer appear in the output even when
+<li> friend classes did no longer appear in the output even when
HIDE_FRIEND_COMPOUNDS was set to NO.</li>
<li> Fixing bug in code parser when encountering arrays and some other
related problems.</li>
-<li> Array initializers did not show up regardless of the
+<li> Array initializers did not show up regardless of the
MAX_INITIALIZER_LINES setting.</li>
<li> Improved support for classes with the same name but in different
namespaces in combination with "using" of namespaces.</li>
@@ -6362,17 +7013,17 @@ make sure you add the following:
</ul>
<h3>New features</h3>
<ul>
-<li> New option FILTER_PATTERNS which can be used to specify multiple
+<li> New option FILTER_PATTERNS which can be used to specify multiple
input filters, and let doxygen select the right one based on
matching the source file name with a specified pattern (thanks to
a patch by James Ahlborn).</li>
<li> id 142939: New commands \protocol and \category which can be used
- to document Objective-C protocols and categories in the same way
+ to document Objective-C protocols and categories in the same way
the \class command does for classes.</li>
-<li> Included patch that removes some cosmetic annoyances in the man page
+<li> Included patch that removes some cosmetic annoyances in the man page
output (thanks to Chris Croughton).</li>
<li> Added internationalization support for Afrikaans and
- Lithuanian. Included language updates for Dutch,
+ Lithuanian. Included language updates for Dutch,
Czech, Italian, Brazilian, Croatian, Japanese, Norwegian and
Russian.</li>
</ul>
@@ -6386,9 +7037,9 @@ make sure you add the following:
<li> id 138075: A comment block containing a \code block with C style
comments was not properly parsed.</li>
<li> id 138307: Fixed parse problems with single quoted strings in PHP.</li>
-<li> id 138394: C style comments placed on the same line after a macro
+<li> id 138394: C style comments placed on the same line after a macro
definition appeared as part of the macro's value.</li>
-<li> id 138429: Fixed language setting for HTML output when using
+<li> id 138429: Fixed language setting for HTML output when using
traditional Chinese.</li>
<li> id 140259: Using @dotfile in a comment block could cause broken @refs
to sections defined after the @dotfile command.</li>
@@ -6397,13 +7048,13 @@ make sure you add the following:
<li> id 142118: Fixed compile issue with the mingw compiler.</li>
<li> id 142288: Doxywizard crashed when started (fix was applied to version
1.3.7 as well).</li>
-<li> id 142741: Links in todo/bug/... lists were broken if CREATE_SUBDIRS
+<li> id 142741: Links in todo/bug/... lists were broken if CREATE_SUBDIRS
was enabled. Same was true for the built-in diagrams.</li>
-<li> id 142925: Autolinking to a member of a class from a page inside a
+<li> id 142925: Autolinking to a member of a class from a page inside a
namespace did not work.</li>
-<li> id 142940: Due to a misplaced break statement a examples included
+<li> id 142940: Due to a misplaced break statement a examples included
with \example was shown twice in the output.</li>
-<li> id 143107: Made some cosmetic changes to the HTML and HTML output,
+<li> id 143107: Made some cosmetic changes to the HTML and HTML output,
(thanks to David Baird for the patch).</li>
<li> id 143340: Fixed autolink problem for names ending with a colon or
a &lt;br&gt; tag.</li>
@@ -6418,21 +7069,21 @@ make sure you add the following:
code parser.</li>
<li> id 147425: The class diagram did not show the relation to the template
specialization when inheritance was done via one or more typedefs.</li>
-<li> Fixed case where template classes "used" via typedefs were not
+<li> Fixed case where template classes "used" via typedefs were not
properly shown in the collaboration diagram.</li>
<li> Variables explicitly declared external were reported being defined
at the place they were actually declared external.</li>
<li> Fixed bug in the XML schema for enum values with initializers.</li>
<li> Documentation of a member group did not appear in the XML output
(thanks to Chris Croughton for the patch).</li>
-<li> Command line build process failed under windows if the name of the
- directory in which sources are located contained spaces (thanks to
+<li> Command line build process failed under windows if the name of the
+ directory in which sources are located contained spaces (thanks to
Mikhail Glushenkov for the patch).</li>
<li> Improved cross-referencing to methods of a template instance variables
(thanks to a patch by Jeff Apple).</li>
<li> Included a patch by Enrico Schnepel that puts the same output files
- in the same subdirectories (with SUBDIRS = YES) for subsequent runs
- (on slightly modified input files) and also renumbers the dot nodes
+ in the same subdirectories (with SUBDIRS = YES) for subsequent runs
+ (on slightly modified input files) and also renumbers the dot nodes
so they are only regenerated when actually changed.</li>
<li> Unsupported HTML end tags and unsupported begin tags with attributes
are now copied to the output as is.</li>
@@ -6441,28 +7092,28 @@ make sure you add the following:
<h1>Doxygen Release 1.3.7</h1>
<h3>Changes</h3>
<ul>
-<li> The \param command now has an optional input and/or output attribute.
- The syntax for an input &amp; output parameter is for example:
+<li> The \param command now has an optional input and/or output attribute.
+ The syntax for an input &amp; output parameter is for example:
\param[in,out] name Description.</li>
</ul>
<h3>New features</h3>
<ul>
<li> Added new option CREATE_SUBDIRS which when enabled makes doxygen
distribute the generated output evenly over 100 subdirectories.</li>
-<li> Added support for Qt's properties (i.e. Q_PROPERTY) which can be
- documented by putting a documentation block in front of the macro or
+<li> Added support for Qt's properties (i.e. Q_PROPERTY) which can be
+ documented by putting a documentation block in front of the macro or
by using a comment block with the new \property command. </li>
<li> Added new commands \manonly and \endmanonly to enter man page specific
text and commands in the generated man pages (thanks to Carsten Stiborg).</li>
-<li> Included new python based translation report script, which now
+<li> Included new python based translation report script, which now
replaces the old perl based version (thanks to Petr Prikryl).</li>
-<li> Improved parser to also support parsing of Objective-C implementation
+<li> Improved parser to also support parsing of Objective-C implementation
files.</li>
<li> Added new config option EXTRACT_LOCAL_METHODS which can be used for
Objective-C code to extract methods definition in the implementation
section that are not present in the interface.</li>
-<li> Added new config option STRIP_FROM_INC_PATH which allows to
- specify a list of paths that, if matched, will be striped from the
+<li> Added new config option STRIP_FROM_INC_PATH which allows to
+ specify a list of paths that, if matched, will be striped from the
#include statement in the generated documentation of a class.</li>
<li> Added new command \includelineno with works as \include except it will
add line numbers to the code (thanks to Giancarlo Niccolai for the patch).</li>
@@ -6471,15 +7122,15 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> id 133388: Fixed problem parsing '"' inside multi-line C++ style
+<li> id 133388: Fixed problem parsing '"' inside multi-line C++ style
comment blocks</li>
-<li> id 134265: Doxygen now outputs unrecognized HTML tags instead of
+<li> id 134265: Doxygen now outputs unrecognized HTML tags instead of
removing them (thanks to Éric Malenfant for the patch).</li>
<li> id 134869: When HIDE_SCOPE_NAMES was set to NO, the methods of an
Objective-C class did not have the right name.</li>
-<li> id 134876: Fixed problem with forward declaration of a protocol in
+<li> id 134876: Fixed problem with forward declaration of a protocol in
Objective-C.</li>
-<li> id 134647: using a parameter name ending with "const" was not
+<li> id 134647: using a parameter name ending with "const" was not
accepted by doxygen.</li>
<li> id 134639: Fixed parse problem in the preprocessor.</li>
<li> id 137398: add \% command to the documentation.</li>
@@ -6487,28 +7138,28 @@ make sure you add the following:
(thanks to a patch by Joe Schirmer).</li>
<li> id 138652: Line numbers for defines with /* */ comments were wrong
(thanks to J. Noack for the patch).</li>
-<li> id 139591: Fixed problem parsing nested template arguments with
+<li> id 139591: Fixed problem parsing nested template arguments with
comments.</li>
<li> id 140012: a variable could appear in a group twice if it was
declared externally somewhere.</li>
<li> id 140540: Fixed problem parsing "@" in the source code parser.</li>
-<li> id 141133: Spaces were stripped in default arguments such as
+<li> id 141133: Spaces were stripped in default arguments such as
f(const char *t=" \t")</li>
-<li> id 141364: Members of an anonymous nested structure had no brief
+<li> id 141364: Members of an anonymous nested structure had no brief
comment and no link to the detailed description if available.</li>
-<li> Fixed recursive lockup problem that was caused by two or more
+<li> Fixed recursive lockup problem that was caused by two or more
namespaces using each other (i.e. a cycle in the usage relation).</li>
<li> Included patch by Erik Zeek to allow the explicit setting of QTDIR to
override the "search for Qt" algorithm in the configure script.</li>
<li> Parsing of tag files produced for Objective-C code now works.</li>
-<li> Objective-C: Improved hyperlinking of source code, handling of
- prototypes and the list of all members of a class now also contains the
+<li> Objective-C: Improved hyperlinking of source code, handling of
+ prototypes and the list of all members of a class now also contains the
members of class categories.</li>
<li> Third argument of @class was ignored (thanks to Mahadevan for the patch).</li>
<li> Fixed problem with collaboration diagrams for template instances
whose template parameter list contained qualified scope names
(e.g A&lt;B::C&gt;).</li>
-<li> Removed bogus warning about undefined documented function for
+<li> Removed bogus warning about undefined documented function for
classes that were made friends of other classes.</li>
<li> Spaces where not preserved for @code block inside a @example block.</li>
<li> Undocumented dependency relations where not shown in some cases
@@ -6522,7 +7173,7 @@ make sure you add the following:
doxywizard using a recent Qt version.</li>
<li> Call-graphs were missing if a file name ended with ".C" and K&amp;R
function definitions were used.</li>
-<li> Improved source code generation performance when there are many
+<li> Improved source code generation performance when there are many
typedefs with the same name in different scopes.</li>
<li> Linking to a section resulted in the wrong label in the XML output.</li>
</ul>
@@ -6541,7 +7192,7 @@ make sure you add the following:
<li> Make a start with adding support for Objective-C. Doxygen can now
parse Objective-C header files (including protocols and categories).
Thanks to Apple for donating hardware.</li>
-<li> Include a patch by Hauke Duden which adds preliminary support for
+<li> Include a patch by Hauke Duden which adds preliminary support for
the D programming language (see http://www.digitalmars.com/d).</li>
<li> C Comments inside #defines are now preserved. This could be useful
to document boilerplate code.</li>
@@ -6552,10 +7203,10 @@ make sure you add the following:
<li> Examples (documented via \example) are now included in the XML output.</li>
<li> New option SORT_BRIEF_DOCS which when enabled will list the
declaration section of the documentation (with the brief descriptions)
- in alphabetical order, instead of declaration order (thanks to
+ in alphabetical order, instead of declaration order (thanks to
Akos Kiss for the patch).</li>
<li> Included patch for Hungarian translation (thanks to Akos Kiss)
- and for the Serbian language. Added support for mixed Korean/english
+ and for the Serbian language. Added support for mixed Korean/english
(thanks to Jihoon Chung).
The translator report script was also updated (thanks to Petr Prikryl)</li>
</ul>
@@ -6567,9 +7218,9 @@ make sure you add the following:
lock-up.</li>
<li> id 131404: Fixed problem cross-referencing PHP member functions.</li>
<li> id 131434: Clarified confusing warning message.</li>
-<li> id 131446: Extra attributes of a &lt;a href&gt; tag (like target) are now
+<li> id 131446: Extra attributes of a &lt;a href&gt; tag (like target) are now
copied to the HTML output.</li>
-<li> id 132535: Fixed problem with generating man page output for groups
+<li> id 132535: Fixed problem with generating man page output for groups
with brief descriptions.</li>
<li> id 132772: Fixed compile problems on HP-UX using acc compiler
(thanks to Clyde Gerber).</li>
@@ -6579,9 +7230,9 @@ make sure you add the following:
was shadowed by a parameter name.</li>
<li> id 133986: Attributes of the &lt;img&gt; tag where not written to the
HTML output.</li>
-<li> id 134123: Fixed problem with multiple arrows between nodes
+<li> id 134123: Fixed problem with multiple arrows between nodes
in the graphical class hierarchy.</li>
-<li> \ref in dot graphs was not working correctly (thanks to
+<li> \ref in dot graphs was not working correctly (thanks to
Eoin MacDonell for the fix).</li>
<li> Grouped pages in the XML output did have the same id as their group.</li>
<li> Fixed problem handling environment variables inside a
@@ -6597,23 +7248,23 @@ make sure you add the following:
<h1>Doxygen Release 1.3.5</h1>
<h3>Changes</h3>
<ul>
-<li> Doxygen now only regenerates a dot image if it has actually changed!
- This could significantly reduce the time of any run after the first.
- Checking if a graph has changed is done by computing an md5 hash for
- the graph description which is then stored along with the
+<li> Doxygen now only regenerates a dot image if it has actually changed!
+ This could significantly reduce the time of any run after the first.
+ Checking if a graph has changed is done by computing an md5 hash for
+ the graph description which is then stored along with the
image generated by dot and compared in subsequent runs.</li>
<li> Improved the way lists look in the man pages (thanks to Silke Reimer).</li>
</ul>
<h3>New features</h3>
<ul>
-<li> Added support for parsing K&amp;R style function prototypes.
- Please try it on your favorite legacy C project and report any
+<li> Added support for parsing K&amp;R style function prototypes.
+ Please try it on your favorite legacy C project and report any
problems.</li>
-<li> Included languages updates for Traditional Chinese,
+<li> Included languages updates for Traditional Chinese,
Danish, German, Korean translation.</li>
-<li> id 120464: doxygen's XML output does now assign a prot="..."
+<li> id 120464: doxygen's XML output does now assign a prot="..."
attribute for nested classes (thanks to Paul Ross for the patch).</li>
-<li> Added new configuration switch XML_PROGRAMLISTING to enable/disable
+<li> Added new configuration switch XML_PROGRAMLISTING to enable/disable
generating source code listings as part of the XML output (thanks to
Paul Ross for the patch). </li>
<li> Added new config option ABBREVIATE_BRIEF which makes the
@@ -6621,9 +7272,9 @@ make sure you add the following:
independent (thanks to Jake Colman for the patch).</li>
<li> The alphabetical class list now comes with a quick index
(thanks to Marcin Zukowski for the patch).</li>
-<li> An XSLT script "combine.xslt" is now generated in the XML output
+<li> An XSLT script "combine.xslt" is now generated in the XML output
directory. It can be used to combine XML files into one big file.</li>
-<li> The source code is now indexed and thus searchable when the source
+<li> The source code is now indexed and thus searchable when the source
browser and search engine options are enabled.</li>
<li> Added "dist" target to the makefile (thanks to Erik Zeek)</li>
</ul>
@@ -6639,13 +7290,13 @@ make sure you add the following:
was produced.</li>
<li> id 123206: Fixed problem in qtools when opening files in text mode.</li>
<li> id 123322: The search page did not honor DISABLE_INDEX.</li>
-<li> id 123420: Functions with a brief description caused bogus &lt;/em&gt; tags
+<li> id 123420: Functions with a brief description caused bogus &lt;/em&gt; tags
in the HTML output.</li>
<li> id 124114: typo in the generated PHP search script could cause errors
in the search result page.</li>
-<li> id 124187: Setting EXTRACT_LOCAL_CLASSES to NO, could result in a
+<li> id 124187: Setting EXTRACT_LOCAL_CLASSES to NO, could result in a
broken "More..." link in documented local classes inside a namespace.</li>
-<li> id 124214: Fixed problem in search indexer, which could crash doxygen
+<li> id 124214: Fixed problem in search indexer, which could crash doxygen
(thanks to Daniel Koebbing for the patch).</li>
<li> id 124545: fixed a number of problems in the generated search script.</li>
<li> id 124815: Fixed compile problem in filedef.h for aCC on HP-UX.</li>
@@ -6664,14 +7315,14 @@ make sure you add the following:
<li> Links to classes, files, namespaces and groups in the search results
were broken (missing file extension).</li>
<li> Doxygen logo is now transparent even when viewed with IE.</li>
-<li> Using a character with ascii code 0x06 in a comment block could crash
+<li> Using a character with ascii code 0x06 in a comment block could crash
doxygen if the preprocessor was enabled.</li>
<li> Fixed problem handling conditional commands and grouping (thanks to
Silke Reimer for the patch).</li>
-<li> Fixed problem using \dotfile in combination with RTF output
+<li> Fixed problem using \dotfile in combination with RTF output
(thanks to Vegard Larsen).</li>
<li> Fixed several problems related to the new md5 hash feature.</li>
-<li> Undocumented functions referenced in a comment block were linked to
+<li> Undocumented functions referenced in a comment block were linked to
anyway.</li>
<li> Fixed a number of typos in the config file documentation (thanks to
Boaz Kelmer)</li>
@@ -6680,7 +7331,7 @@ make sure you add the following:
<li> Fixed bug in code fragment parser that could cause memory corruption
in certain cases.</li>
<li> Fixed problem matching definition and declaration of functions, which
- could cause bogus warnings for functions with the same name but in
+ could cause bogus warnings for functions with the same name but in
different namespaces.</li>
<li> Using "/// @file" to document a file quickly was not possible, while
"/** @file */" did work. Now both work.</li>
@@ -6688,25 +7339,25 @@ make sure you add the following:
<h1>Doxygen Release 1.3.4</h1>
<h3>Changes</h3>
<ul>
-<li> Rewrote the search engine. The doxysearch CGI binary has been
- replaced by a PHP script which is generated by doxygen. Also the
- index file is now generated by doxygen and requires way less memory.
- This should make it much easier to use the search facility.
+<li> Rewrote the search engine. The doxysearch CGI binary has been
+ replaced by a PHP script which is generated by doxygen. Also the
+ index file is now generated by doxygen and requires way less memory.
+ This should make it much easier to use the search facility.
All that is required is a web server with PHP 4.1 or higher.
Please report any problems you find.</li>
<li> Changed the way class names are resolved. This can result in
a significant speedup for projects that use namespaces and typedefs
- (including Java projects). Thanks to Edmund Green for the performance
+ (including Java projects). Thanks to Edmund Green for the performance
analysis and ideas.</li>
</ul>
<h3>New features</h3>
<ul>
<li> Added support for the &amp;oslash;, and &amp;Oslash; character entities.</li>
-<li> Added language updates for Korean, Swedish, German, Russian,
+<li> Added language updates for Korean, Swedish, German, Russian,
Croatian, Brazilian, Spanish, Japanese, French and Italian.</li>
<li> Added new \relatesalso command, which can be used to put a file member
also in the documentation of a class (thanks to Ian Scott for the patch).</li>
-<li> Added support for pseudo IDL files with the .pidl extension
+<li> Added support for pseudo IDL files with the .pidl extension
(as used in TAO). Thanks to Éric Malenfant for the patch.</li>
<li> Added new commands \dot ... \enddot to include a dot graph in a
comment block (thanks to a patch by Eoin MacDonell). Inside the
@@ -6728,21 +7379,21 @@ make sure you add the following:
heading of the detailed description.</li>
<li> Fixed problem handling extern"C" (without the space). </li>
<li> \ref file.c ended up as file::c in the output.</li>
-<li> Special characters in generated texts were not always translated into
+<li> Special characters in generated texts were not always translated into
proper LaTeX commands in the LaTeX output.</li>
<li> Fixed problem parsing "const ::Class *func()" and "static ::Class *func()".
The keywords were seen as namespaces.
due to the use of more than one const keyword.</li>
<li> Fixed two bugs in compound.xsd schema, thanks to Ademar Aguiar.</li>
<li> Fixed some more problems linking typedefs in combination with namespaces.</li>
-<li> id 120637: Fixed parse problem handing character literals such
+<li> id 120637: Fixed parse problem handing character literals such
as '"' inside the initializer list of a constructor.</li>
<li> Fixed file handle leak when INLINE_SOURCES was set to YES.</li>
<li> Fixed problem handling Java packages (Internal inconsistency warnings).</li>
<li> Fixed problem preprocessing @verbatim blocks containing C comments.</li>
<li> Fixed problem handling preprocessor statement just before a function
body when ENABLE_PREPROCESSING was set to NO.</li>
-<li> id 122457: INLINE_SOURCES feature was broken (only showed the
+<li> id 122457: INLINE_SOURCES feature was broken (only showed the
first line)</li>
</ul>
<h1>Doxygen Release 1.3.3</h1>
@@ -6753,21 +7404,21 @@ make sure you add the following:
<li> Added new debug flag "-d Time" which will report the elapsed time
for each message printed, and will also show the total running time
along with the time spend on external tools such as dot.
- Note: If you have a project that takes doxygen a long time to process,
+ Note: If you have a project that takes doxygen a long time to process,
please send me the output so I get a global idea where to optimize.</li>
<li> New option SUBGROUPING which can be set to NO to have \nosubgrouping
for all classes (thanks to Torben Koch for the patch).</li>
-<li> Added XML schemas for validating the XML output, and to help
+<li> Added XML schemas for validating the XML output, and to help
writing XSLT files.
The generated index.xml now has a complete schema, the compounds
- not yet. Thanks go to Alexej Humbach for doing a lot of the work.
- Note that a couple of "id" attributes in the XML output have been
+ not yet. Thanks go to Alexej Humbach for doing a lot of the work.
+ Note that a couple of "id" attributes in the XML output have been
changed to "refid", and section tags are now nested.</li>
<li> Included language updates for Traditional Chinese and Japanese.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Doxygen crashed when parsing a comment block with only a \mainpage
+<li> Doxygen crashed when parsing a comment block with only a \mainpage
command.</li>
<li> Fixed problem matching namespace members.</li>
<li> Fixed scanner push back error for ALIASES with long definitions.</li>
@@ -6779,9 +7430,9 @@ make sure you add the following:
warnings.</li>
<li> Call graphs were only generated if REFERENCES_RELATION was set to YES.</li>
<li> Link could be wrong if a member's name was found in multiple namespaces. </li>
-<li> A function returning "struct s *" caused a bogus recursion relation
+<li> A function returning "struct s *" caused a bogus recursion relation
in the call graph.</li>
-<li> Improved handling backslashes for the perlmodgen (thanks to Miguel
+<li> Improved handling backslashes for the perlmodgen (thanks to Miguel
Lobo).</li>
<li> Page anchors did not appear in the tag files.</li>
<li> \ref's to grouped pages were not generated correctly.</li>
@@ -6790,19 +7441,19 @@ make sure you add the following:
commands.</li>
<li> Doxygen now issues a warning if invalid commands are used inside
a single-line C++ comment (such a @see and @image).</li>
-<li> Fixed parse problem for the semicolon in the following:
+<li> Fixed parse problem for the semicolon in the following:
Class A : a(";") {};</li>
-<li> Doxygen now resolves links to classes imported in a namespace
+<li> Doxygen now resolves links to classes imported in a namespace
via using declarations or directives.</li>
<li> Doxygen now issues a warning when @code, @verbatim, @htmlonly, or
@latexonly are not properly terminated.</li>
<li> Fixed "Internal inconsistency" messages when parsing Java packages.</li>
<li> A member did not appear in its group if it was first declared without
documentation and then defined with documentation (with \ingroup).</li>
-<li> The &lt;caption&gt; tag was put at the end of a &lt;table&gt;
- in the HTML output, while it should be the first tag
+<li> The &lt;caption&gt; tag was put at the end of a &lt;table&gt;
+ in the HTML output, while it should be the first tag
after &lt;table&gt;. This is now corrected.</li>
-<li> In the LaTeX output, the page references were missing for the links
+<li> In the LaTeX output, the page references were missing for the links
in the documentation when PDF_HYPERLINK was set to NO.</li>
</ul>
<h1>Doxygen Release 1.3.2</h1>
@@ -6818,8 +7469,8 @@ make sure you add the following:
of a function to get a callgraph. In the config file a
new option CALL_GRAPH is added which can be set to YES to enable
callgraphs for all functions (note that this will slow doxygen down!).</li>
-<li> Added new boolean config option UML_LOOK which can be enabled to give
- class and collaboration diagrams a more UML conformant look
+<li> Added new boolean config option UML_LOOK which can be enabled to give
+ class and collaboration diagrams a more UML conformant look
(thanks to Dominick Paniscotti).</li>
<li> Added new commands \xmlonly and \endxmlonly which can be paired
to form blocks of text that only appear in the XML output.</li>
@@ -6829,11 +7480,11 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Doxygen could crash if a namespace and a class with the same
+<li> Doxygen could crash if a namespace and a class with the same
name were found in the global scope.</li>
-<li> Fixed problem handling multiple \xrefitem's in one comment block
+<li> Fixed problem handling multiple \xrefitem's in one comment block
(could crash doxygen).</li>
-<li> Added check for recursive group relations to prevent lock-up/crash while
+<li> Added check for recursive group relations to prevent lock-up/crash while
generating the group index.</li>
<li> Doxygen could crash if a group contained only undocumented members.</li>
<li> Putting a #include inside a function body would cause the
@@ -6854,13 +7505,13 @@ make sure you add the following:
<li> Formula's inside comments directly in front or behind function arguments
did not work.</li>
<li> Fixed code parser problem when //&lt;! was nested in a normal C comment.</li>
-<li> Included a number of fixes for typos found and corrected by Justin
+<li> Included a number of fixes for typos found and corrected by Justin
Zaglio.</li>
-<li> For #define values that were constant strings, doxygen tried to link
+<li> For #define values that were constant strings, doxygen tried to link
the text inside the string when shown in the documentation.</li>
-<li> The source-browse parser did not link to class variables used in
+<li> The source-browse parser did not link to class variables used in
inline function if the variables were defined before the functions. </li>
-<li> The first paragraph after a &lt;h1&gt; or similar heading was not put in
+<li> The first paragraph after a &lt;h1&gt; or similar heading was not put in
a paragraph context in the generated output.</li>
</ul>
@@ -6893,7 +7544,7 @@ make sure you add the following:
<ul>
<li> Added new command \xrefitem which enables user-defined commands
that act like \todo and \bug, i.e. produces a related page containing
- all items, which is cross-referenced with the documentation blocks
+ all items, which is cross-referenced with the documentation blocks
where the items are placed.</li>
<li> Added support for package scope in Java.</li>
<li> Added alt attributes to user included images in the HTML output
@@ -6905,17 +7556,17 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Occurrences of &lt;span&gt; and &lt;div&gt; tags in the documentation
+<li> Occurrences of &lt;span&gt; and &lt;div&gt; tags in the documentation
were not properly handled.</li>
-<li> Fixed problem parsing the following pattern
+<li> Fixed problem parsing the following pattern
"namespace { .... } typedef ....", which could crash doxygen if
IGNORE_PREFIX was used.</li>
<li> The project name is now put in front of each title of a HTML page
for easier bookmarking.</li>
-<li> In C# enums, classes and structs without (optional) ; were not
+<li> In C# enums, classes and structs without (optional) ; were not
properly parsed.</li>
-<li> Though still not perfect, I Improved the way namespace aliasing is
- handled. It should now work inside other namespaces and for
+<li> Though still not perfect, I Improved the way namespace aliasing is
+ handled. It should now work inside other namespaces and for
computing class and usage relations.</li>
<li> Fixed problem documenting typedefs of function pointers using
\typedef.</li>
@@ -6923,10 +7574,10 @@ make sure you add the following:
<li> Fixed problem resolving class relations for nested classes within
namespaces.</li>
<li> Static members can now be documented in a separate file using \fn
- as long as they have unique names. If the names are not unique the
+ as long as they have unique names. If the names are not unique the
documentation must be located in the same file (as was required before).</li>
-<li> In arguments and return types of the form NA::A were not linked if NA
- was a namespace alias to a documentation namespace and A a documented
+<li> In arguments and return types of the form NA::A were not linked if NA
+ was a namespace alias to a documentation namespace and A a documented
class name.</li>
<li> Matching a declaration f(NA::C c) with f(C c) did not work if NA was
a namespace alias.</li>
@@ -6935,7 +7586,7 @@ make sure you add the following:
tag file.</li>
<li> Fixed preprocessor bug: "a##b" was not correctly expanded if
argument "a" or "b" was empty.</li>
-<li> Putting \todo and friends inside the documentation of enum values
+<li> Putting \todo and friends inside the documentation of enum values
did not result in an entry on the todo list page.</li>
<li> Fixed some problems compiling with versions of flex &gt;2.5.4, but
also added a #error if these are used, since they produce incompatible
@@ -6944,7 +7595,7 @@ make sure you add the following:
(thanks to a patch by Michiel Ouwehand).</li>
<li> The table row backgroup color of the "all member" list was hard-coded
in the HTML output. This is now controlled by the stylesheet.</li>
-<li> Fixed problem handling omission of the optional arguments of
+<li> Fixed problem handling omission of the optional arguments of
the \image command.</li>
<li> Enabling HIDE_IN_BODY_DOCS did not work properly if C++-style special
comments were used inside the body of a function.</li>
@@ -6953,17 +7604,17 @@ make sure you add the following:
<li> Setting ENUM_VALUES_PER_LINE to 0 caused a division by 0 error.</li>
<li> Autolinking did not work for members that were grouped and imported
via tag files.</li>
-<li> The divide symbol "/" did not appear in the output for array/define
+<li> The divide symbol "/" did not appear in the output for array/define
initializers</li>
-<li> Fixed paring problem parsing "operator &lt;b&gt;new&lt;/b&gt;"
+<li> Fixed paring problem parsing "operator &lt;b&gt;new&lt;/b&gt;"
in the documentation.</li>
-<li> Fixed problem with resolving template relations (as reported by
+<li> Fixed problem with resolving template relations (as reported by
Kris Thielemans).</li>
-<li> Members in the todo list were not shown correctly (with dot separators)
+<li> Members in the todo list were not shown correctly (with dot separators)
if OPTIMIZE_OUTPUT_JAVA was set to YES.</li>
<li> Fixed problem handing "class A { public: A::f(); };" which is accepted
as valid C++ by a number of compilers.</li>
-<li> Putting a /* inside a C-comment without matching */ caused the
+<li> Putting a /* inside a C-comment without matching */ caused the
preprocessor to ignore the rest of the file.</li>
<li> Improved the way typedefs are resolved.</li>
<li> Fixed parse problem for the following PHP code: $color='#FFFFFF'</li>
@@ -6976,11 +7627,11 @@ make sure you add the following:
<h1>Doxygen Release 1.3</h1>
<h3>Changes</h3>
<ul>
-<li> Increased internal buffer size from 16K to 256K for a number of
- scanners, so the "input buffer overflow, can't enlarge buffer because
+<li> Increased internal buffer size from 16K to 256K for a number of
+ scanners, so the "input buffer overflow, can't enlarge buffer because
scanner uses REJECT" error should occur less easily.</li>
<li> Style commands like \e, \a or \c will now be terminated when
- one of the characters in the following string is
+ one of the characters in the following string is
found: ".,()[]:;?", example: "a point (consisting of @a x and @a y)"</li>
<li> Setting OPTIMIZE_OUTPUT_JAVA to YES, will automatically set INLINE_INFO
to NO.</li>
@@ -6993,25 +7644,25 @@ make sure you add the following:
used to select windows specific character encodings for some languages.
(thanks to Piotr Kaminski).</li>
<li> Added new configuration option LATEX_HIDE_INDICES which can be
- used to suppress the various indices that are normally generated in
+ used to suppress the various indices that are normally generated in
the LaTeX output (thanks to Ken Yarnall for the patch).</li>
<li> Added new option MAX_DOT_GRAPH_DEPTH to set the maximum distance
- from a root node after which the class or include graph will be
+ from a root node after which the class or include graph will be
truncated. Setting this to a low value should considerably reduce the
time doxygen needs on large projects.</li>
-<li> Included updates for French, Korean, Polish, Croatian, and
+<li> Included updates for French, Korean, Polish, Croatian, and
Danish translations.</li>
<li> Access to title of user defined user defined sections is now
possible from the doxmlparser.</li>
-<li> &lt;div&gt; and &lt;span&gt; commands can now by used in the
- documentation. Their effect is limited to the HTML output though
+<li> &lt;div&gt; and &lt;span&gt; commands can now by used in the
+ documentation. Their effect is limited to the HTML output though
(thanks to Frank Schimmel for the patch)</li>
<li> Added inline, virtual, explicit and mutable attributes to XML output
(thanks to patch by Michiel Ouwehand).</li>
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Fixed out-of-memory bug for files containing using directives and
+<li> Fixed out-of-memory bug for files containing using directives and
including themselves (indirectly).</li>
<li> Doxygen could crash if two \todo-like commands appeared on the
same line.</li>
@@ -7024,28 +7675,28 @@ make sure you add the following:
<li> Line counting was incorrect when parsing multi-line formulas.</li>
<li> \section's in a \mainpage are now correctly numbered in the LaTeX
output (nesting level was one too deep).</li>
-<li> \ref to lower case names did not work
+<li> \ref to lower case names did not work
(thanks to Herman ten Brug for the patch)</li>
<li> escaped quotes (") were not preserved in the config file when it was
updated (thanks to Herman ten Brug for the patch).</li>
-<li> PHP related fixes contributed by Vaclav Dvorak:
+<li> PHP related fixes contributed by Vaclav Dvorak:
<ul>
<li> #-style comment handling, </li>
<li> adds (problematic) support for define() constants, </li>
- <li> adds ".phtml" as a supported file extension for PHP code
+ <li> adds ".phtml" as a supported file extension for PHP code
(not very common, but still...), </li>
- <li> fixes handling of code like "include 'file.inc';" (was parsed
+ <li> fixes handling of code like "include 'file.inc';" (was parsed
as a variable definition), </li>
<li> removes the variable insidePHPCode (was not needed), </li>
<li> fixes spaces in function argument lists (the '$' was the problem).</li>
</ul></li>
<li> Functions documented with \fn did not get transferred to declaration or
definition (depending on where the comment block was put).</li>
-<li> If a function definition was documented and grouped the declaration
+<li> If a function definition was documented and grouped the declaration
was not even if the same documentation block was used for it. </li>
-<li> Fixed bug in code parser that could crash doxygen under
+<li> Fixed bug in code parser that could crash doxygen under
certain conditions.</li>
-<li> Fixed some spacing problems in the LaTeX output
+<li> Fixed some spacing problems in the LaTeX output
(thanks to patches by Roberto Bagnara).</li>
<li> Mail address containing the '+' character were not properly parsed
(thanks to Jon Parise for the patch).</li>
@@ -7054,7 +7705,7 @@ make sure you add the following:
\c (or similar command).</li>
<li> Preprocessor got confused when parsing a special comment as
part of a #define and containing a ' or ".</li>
-<li> subgroups defined with @defgroup could be reordered if
+<li> subgroups defined with @defgroup could be reordered if
@addtogroup was used.</li>
<li> Projects name was not shown as the root of the treeview anymore.</li>
<li> Links to pages imported via tag files were broken in the treeview
@@ -7082,7 +7733,7 @@ make sure you add the following:
<li> Verbatim fragments were not properly rendered in the RTF output.</li>
<li> Fixed some cases where collaboration relations were not visible due
to typedefs.</li>
-<li> Fixed some compiler warnings that occurred with more recent versions
+<li> Fixed some compiler warnings that occurred with more recent versions
of gcc.</li>
<li> Auto-links to files were shown with as file::c instead of file.c. </li>
<li> @ref namespace::class was not parsed correctly.</li>
@@ -7092,21 +7743,21 @@ make sure you add the following:
<li> Hyperlinks in the LaTeX were broken in some cases.</li>
<li> Fixed case where a global variable was not linked from within a function
body.</li>
-<li> Include dependencies graph was shown at the place where the
+<li> Include dependencies graph was shown at the place where the
"included by" graph should have appeared.</li>
<li> A // comment following by a //! comment was not handled properly by
the source browser.</li>
<li> If the definition of nested class was found before the definition of the
outer class, its name was displayed without scope.</li>
<li> If a parameter of a prototype was documented (with a separate
- documentation block) and the name of the parameter in the definition
+ documentation block) and the name of the parameter in the definition
was different, the wrong name could be shown in the documentation.</li>
<li> Fixed bug handling \line, \skipline, and \until</li>
</ul>
<h1>Doxygen Release 1.3-rc3</h1>
<h3>Changes</h3>
<ul>
-<li> Rewrote the implementation of the tree view feature
+<li> Rewrote the implementation of the tree view feature
(see GENERATE_TREEVIEW). The new implementation should be much faster,
but does require a browser that supports JavaScript, DHTML, and CSS.
Please report any problems you find.</li>
@@ -7116,16 +7767,16 @@ make sure you add the following:
by Tom Emerson).</li>
<li> STRIP_FROM_PATH now ignores the exact casing of characters, which
makes things simpler on Windows.</li>
-<li> Style modifiers such as &lt;b&gt;, &lt;em&gt; and &lt;pre&gt; are now
+<li> Style modifiers such as &lt;b&gt;, &lt;em&gt; and &lt;pre&gt; are now
capable of spanning multiple paragraphs.</li>
<li> Made some improvements to the documentation, including a diagram
- showing the information flow between the doxygen and various other
+ showing the information flow between the doxygen and various other
tools (see the getting started section).</li>
</ul>
<h3>New features</h3>
<ul>
-<li> Added support for comment blocks generated by
- Rational Rose's ANSI C++ code generator (thanks to a patch by
+<li> Added support for comment blocks generated by
+ Rational Rose's ANSI C++ code generator (thanks to a patch by
Martin Beaudoin).</li>
<li> Included language update for the Serbian and Japanese.</li>
<li> Included patch by Ryunosuke Satoh to reduce size of the executable when
@@ -7138,7 +7789,7 @@ make sure you add the following:
<ul>
<li> @addindex now works on the whole line instead of a single word (as
was already suggested in the docs).</li>
-<li> source code line in the XML output didn't escape special characters
+<li> source code line in the XML output didn't escape special characters
like &amp; anymore.</li>
<li> Fixed small bug in German translation (thanks to Jens Seidel).</li>
<li> e-mail addresses with multiple dots got truncated when linked.</li>
@@ -7150,7 +7801,7 @@ make sure you add the following:
a semicolon (thanks to Jaime Uriel Torres for the patch).</li>
<li> Using &lt;dt&gt; with also adding a &lt;dd&gt; caused a parse error while it is
legal HTML.</li>
-<li> The identifier "package" in C/C++ code was wrongly interpreted as
+<li> The identifier "package" in C/C++ code was wrongly interpreted as
a Java keyword.</li>
<li> \todo item at the end of a comment block caused "unexpected character"
error while generating the XML output.</li>
@@ -7171,12 +7822,12 @@ make sure you add the following:
<li> Links to files or file members could be wrong if SHORT_NAMES was set
to YES and the file was imported via a tag file.</li>
<li> Attribute lists inside an enum in an IDL file were not properly parsed.</li>
-<li> Fixed problem in code browser that prevented linking to global
+<li> Fixed problem in code browser that prevented linking to global
variables defined in other files.</li>
<li> When putting a "using namespace X" in a header file doxygen did not
recognize this in files that included the header file.</li>
<li> Fixed bug in parsing sections without title.</li>
-<li> doxytag did not include anchor in the search index. Thanks to
+<li> doxytag did not include anchor in the search index. Thanks to
Joerg Schlichenmaier for the fix.</li>
<li> Using an auto-list as an argument of @todo and friends did not work.</li>
<li> A class with all members in a section grouped could result in broken
@@ -7186,13 +7837,13 @@ make sure you add the following:
<h3>New features</h3>
<ul>
<li> Added support for importing members via using declarations.</li>
-<li> Anchors and sections (and references to them) are now supported in
+<li> Anchors and sections (and references to them) are now supported in
all comment blocks, not just \page blocks.</li>
<li> Dot files imported via @dotfile now produce images maps in the
HTML output. Use the URL node attribute in the dot file to make a link
(thanks to Marco Dalla Gasperina for the patch).</li>
<li> New config option WARN_IF_DOC_ERROR which allows documentation problems
- to be shown, while other warnings (such as warnings about
+ to be shown, while other warnings (such as warnings about
undocumented members) can be hidden (thanks to Miguel for the patch).</li>
<li> Included language update for German and Italian.</li>
<li> Added support for &amp;tm; (trademark) and &amp;reg; (registered). </li>
@@ -7200,7 +7851,7 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> A &lt;pre&gt; .. &lt;/pre&gt; section with included blank lines
+<li> A &lt;pre&gt; .. &lt;/pre&gt; section with included blank lines
causes warning about missing &lt;/pre&gt; marker.</li>
<li> "typedef enum { a };" confused doxygen's parser, while most compilers
seem to accept it without warnings.</li>
@@ -7232,13 +7883,13 @@ make sure you add the following:
<h1>Doxygen Release 1.3-rc1</h1>
<h3>Changes</h3>
<ul>
-<li> New validating parser for documentation blocks that replaces the
+<li> New validating parser for documentation blocks that replaces the
old parser (which was actually only a lexical scanner).</li>
<li> The new documentation parser will now pass attributes of html tags
to the html output. Example:
<pre>
/*! \mainpage A Dutch Table
- * &lt;table bgcolor="black" border="0" cellspacing="2"
+ * &lt;table bgcolor="black" border="0" cellspacing="2"
* cellpadding="2" align="center"&gt;
* &lt;tr&gt;&lt;td bgcolor="red"&gt;red
* &lt;tr&gt;&lt;td bgcolor="white"&gt;white
@@ -7247,7 +7898,7 @@ make sure you add the following:
*/
</pre></li>
<li> Doxywizard will now run doxygen from the directory where the
- config file is found, so paths can be made relative
+ config file is found, so paths can be made relative
in the config file. This will now also work if the config file's
path or name contains spaces.</li>
<li> Doxygen style comment blocks found in the body of functions are
@@ -7258,10 +7909,10 @@ make sure you add the following:
<li> Added rudimentary support for C#. Parsing should work,
but not all attributes are handled correctly.</li>
<li> Included perl module generator by Miguel Lobo. Setting
- GENERATE_PERLMOD to YES in the config file will produce
+ GENERATE_PERLMOD to YES in the config file will produce
a perl module in the output dir.</li>
<li> Included language updates for French, Czech, and Russian.</li>
-<li> Included a number of enhancements to the xml parser (thanks to
+<li> Included a number of enhancements to the xml parser (thanks to
a patch by Tree).</li>
<li> Locally documented parameters now appear in the XML output
(thanks to Cormac Twomey for the patch). </li>
@@ -7273,7 +7924,7 @@ make sure you add the following:
properly.</li>
<li> Warnings for undocumented members were not generated anymore
in certain cases.</li>
-<li> A member of a group linked with \ref showed the group's title
+<li> A member of a group linked with \ref showed the group's title
as link text instead of the member's name.</li>
<li> Using aliased commands whose definition contained \n's caused the
code browser to put definition links at the wrong line numbers.</li>
@@ -7281,18 +7932,18 @@ make sure you add the following:
about duplicated labels.</li>
<li> Included a patch by Ryunosuke Satoh that fixes some issues when
compiling in a cygwin environment.</li>
-<li> The presence of using declarations could result bogus entries in the
+<li> The presence of using declarations could result bogus entries in the
class hierarchy.</li>
-<li> Links in the hyperlinked sources could point to the wrong global
+<li> Links in the hyperlinked sources could point to the wrong global
function depending on the order in which files were parsed.</li>
-<li> Using \retval in combination with parameters that are documented
+<li> Using \retval in combination with parameters that are documented
on the spot, caused bogus warnings about undocumented parameters.</li>
-<li> id attributes of references/referencedby relations are wrong in
+<li> id attributes of references/referencedby relations are wrong in
the XML output.</li>
-<li> Links could wrongly point to a class in an outer scope instead of a
+<li> Links could wrongly point to a class in an outer scope instead of a
typedef with the same name in the inner scope.</li>
-<li> A reference in the code to a member of a derived class that is defined
- in a base class is now resolved properly even if both classes are
+<li> A reference in the code to a member of a derived class that is defined
+ in a base class is now resolved properly even if both classes are
imported via tag files.</li>
<li> Language codes were wrong in the html help output for some languages
(thanks to Erwin Hoffmann for the patch).</li>
@@ -7302,9 +7953,9 @@ make sure you add the following:
<li> Included RTF output fixes by Gorden Machel.</li>
<li> Global variables of complex types were not properly cross-referenced.</li>
<li> Fixed argument matching bug for nested template classes;
- matching <code>"f(A::B&lt;T&gt;::C c)"</code> with
+ matching <code>"f(A::B&lt;T&gt;::C c)"</code> with
<code>"f(C c)"</code> within context <code>A::B&lt;T&gt;</code></li>
-<li> Fixed preprocessor bug handling nested comment blocks
+<li> Fixed preprocessor bug handling nested comment blocks
(the */ of the inner block was eaten).</li>
</ul>
<p>
@@ -7316,10 +7967,10 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> Running doxygen with the "-d Validate" option will activate a
- new documentation parser. The parser will produce output for
- Html, Latex, XML and RTF output (man page output still needs to be done).
+ new documentation parser. The parser will produce output for
+ Html, Latex, XML and RTF output (man page output still needs to be done).
For XML output this new parser will <em>always</em> be used.
- Please try it and let me know if you see unexpected errors or
+ Please try it and let me know if you see unexpected errors or
invalid output. This parser will replace the old one in the
next release.
<p>
@@ -7327,13 +7978,13 @@ make sure you add the following:
syntax of the documentation blocks and will produce valid output
by design. </p>
<p>
- For debugging purposes, adding "-d PrintTree" along
- with "-d Validate" will let doxygen dump the abstract syntax tree of
- each documentation block to the output in a pretty printed way
+ For debugging purposes, adding "-d PrintTree" along
+ with "-d Validate" will let doxygen dump the abstract syntax tree of
+ each documentation block to the output in a pretty printed way
(this reflects the structure built-up by the parser).</p> </li>
<li> A number of new XML tags are introduced along with the new parser,
these include: umlaut, acute, grave, circ, tilde, szlig, cedil, ring
- nonbreakablespace, toclist, tocitem, xrefsect, xrefdescription,
+ nonbreakablespace, toclist, tocitem, xrefsect, xrefdescription,
and xreftitle.</li>
<li> Changed the way code fragments are represented in XML to simplify
validation.</li>
@@ -7343,7 +7994,7 @@ make sure you add the following:
<li>
\page now results in a section in latex (of the related pages chapter)</li>
<li>
- \section is now a subsection within that page section (used to be a
+ \section is now a subsection within that page section (used to be a
section, so at the same level as \page)</li>
<li>
\subsection is now a subsubsection within a subsection (used to be a
@@ -7353,7 +8004,7 @@ make sure you add the following:
<ul>
<li> Undocumented private friend classes no longer cause warnings</li>
<li> Undocumented private classes no longer cause warnings</li>
- <li> Undocumented members are now hidden if they are
+ <li> Undocumented members are now hidden if they are
default constructors, destructors or reimplemented.</li>
</ul></li>
<li> Pages introduced via \page are now context aware. This means that
@@ -7371,33 +8022,33 @@ make sure you add the following:
<li> Enum value documentation was added to the XML output.</li>
<li> Files ending with ".inc" are now recognized as PHP files
(thanks to Marcus Ahlfors).</li>
-<li> Included updated documentation for language translators
+<li> Included updated documentation for language translators
(thanks to Petr Prikryl).</li>
<li> Included language updates for Czech, Slovak, Brazilian, Croatian,
- Portuguese, Russian, Polish, Japanese and Serbian.
+ Portuguese, Russian, Polish, Japanese and Serbian.
Include language support for Catalan (thanks to Albert Mora)</li>
-<li> Included .dsp update by Simon Goodwin (already needs to be updated
+<li> Included .dsp update by Simon Goodwin (already needs to be updated
again :-( )</li>
<li> Added new configuration options XML_DTD and XML_SCHEMA to set the
DTD or Schema used in the XML output.</li>
<li> Include new commands \subsubsection and \paragraph which add two
- section level below \section and \subsection (thanks to
+ section level below \section and \subsection (thanks to
Dirk Reiners for the patch) </li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li> Fixed lock-up bug in RTF output when using tables.</li>
-<li> The internal comment conversion routine was confused by lines of the
+<li> The internal comment conversion routine was confused by lines of the
form //*************</li>
<li> Fixed recursive lockup for template arguments of the form
"typename A = ::A"</li>
<li> Description part of @name did not (always) appear in the resulting
documentation.</li>
<li> Alphabetic index showed package scope using "::" even when
- OPTIMIZE_OUTPUT_JAVA was set to YES. The same happened for class and
+ OPTIMIZE_OUTPUT_JAVA was set to YES. The same happened for class and
namespace HTML page titles.</li>
<li> New versions of dot (graphviz &gt;=1.8.8) broke clickable images
- for versions of doxygen &lt;=1.2.17. Now fixed for newer doxygen
+ for versions of doxygen &lt;=1.2.17. Now fixed for newer doxygen
releases in a backwards compatible way thanks to a patch by John Ellson.</li>
<li> Fixed compile problem for 64 bit machines (pointer to int cast).</li>
<li> Included patch to build Doxygen 1.2.17 on AIX 4.3 by Russ Allbery</li>
@@ -7411,7 +8062,7 @@ make sure you add the following:
documentation not to appear in the output at all.</li>
<li> Fixed todo list linking problems for hyperlinked pdf output and
grouped pages.</li>
-<li> Putting a function declaration and its definition in the same group
+<li> Putting a function declaration and its definition in the same group
could lead to wrong links using @ref.</li>
<li> Undocumented but grouped members did not appear in the output.</li>
<li> The declaration and definition of overloaded global functions
@@ -7426,17 +8077,17 @@ make sure you add the following:
<h1>Doxygen Release 1.2.17</h1>
<h3>Changes</h3>
<ul>
-<li> XML: The index of the XML output now has @refid instead of @id's,
+<li> XML: The index of the XML output now has @refid instead of @id's,
and includes a "kind" attribute for the compounds and members for easier
filtering.</li>
-<li> Improved dot image generation speed for large projects by changing
+<li> Improved dot image generation speed for large projects by changing
the way the best-fitting graph is computed (thanks to Philip Bergen
for the suggestion).</li>
<li> @name now automatically starts a member group section (previously
- a @{ command was needed). The member group continues until a new @name
- command is found or until the end of a compound is reached. @{ ... @}
- commands can still be used for backward compatibility or to end a member
- group before the end of a compound. @defgroup and friends still require
+ a @{ command was needed). The member group continues until a new @name
+ command is found or until the end of a compound is reached. @{ ... @}
+ commands can still be used for backward compatibility or to end a member
+ group before the end of a compound. @defgroup and friends still require
explicit @{ ... @} blocks.</li>
<li> Changed the way \todo, \bug, and \test are handled internally.
This should have no visible effect on the outside, but makes it much
@@ -7444,8 +8095,8 @@ make sure you add the following:
</ul>
<h3>New features</h3>
<ul>
-<li> Added initial support for parsing PHP code (thanks to a patch by
- Jan Borsodi). For a PHP file the following additional commands are
+<li> Added initial support for parsing PHP code (thanks to a patch by
+ Jan Borsodi). For a PHP file the following additional commands are
available:
<dl>
<dt>\private </dt><dd> makes the current item private</dd>
@@ -7460,14 +8111,14 @@ make sure you add the following:
<li> New command @copydoc that can be used to copy a documentation block
of some item and paste it in another documentation block.</li>
<li> i18n: Added support for the Serbian language (thanks to Dejan Milosavljevic).
- Included a new language option Japanese-en for combined Japanese
+ Included a new language option Japanese-en for combined Japanese
and English.</li>
-<li> Included patch for dealing with variable argument macros in @param
+<li> Included patch for dealing with variable argument macros in @param
(thanks to Alfred Heggestad).</li>
<li> Added new option MULTILINE_CPP_IS_BRIEF to make doxygen treat
a multi-line brief comment block as a brief description. Set this to
YES to obtain the behavior of version 1.2.15 and earlier. Default as
- of version 1.2.16 is to treat multi-line C++ comment block as a
+ of version 1.2.16 is to treat multi-line C++ comment block as a
detailed description.</li>
<li> New option CHM_FILE to set the .chm file (and path) to use for
Html Help output.</li>
@@ -7486,23 +8137,23 @@ make sure you add the following:
was set to YES.</li>
<li> Documentation blocks for function arguments in a documented header
file did not show up if the function definition was parsed first.</li>
-<li> Inheritance relations in Java where not always correctly resolved if
+<li> Inheritance relations in Java where not always correctly resolved if
the base class was explicitly scoped.</li>
<li> Fixed some non-standard conformance issues in the HTML output (thanks to
John Levon for the patch).</li>
<li> Usage relations for variables whose type was a qualified typedef were
not properly resolved.</li>
-<li> Fixed potential crash bug (null-pointer dereference) in source browser
+<li> Fixed potential crash bug (null-pointer dereference) in source browser
parser.</li>
-<li> Comment blocks ending with an empty /// comment line were not
+<li> Comment blocks ending with an empty /// comment line were not
properly handled by the comment conversion code.</li>
-<li> @relates is no longer needed for a friend function documented in
+<li> @relates is no longer needed for a friend function documented in
the source file (thanks to Johan Eriksson for the fix).</li>
<li> Doxygen could link include files to non-existing source files, if they
pointed to external files but were also found in the include path.</li>
<li> "make install_docs" was broken.</li>
<li> Fixed parse bug for conversion operators of the form "operator ::X*()"</li>
-<li> XML output fixes:
+<li> XML output fixes:
<ul>
<li> derivedcompoundref was not terminated properly. </li>
<li> innerpage and innergroup were closed twice.</li>
@@ -7510,20 +8161,20 @@ make sure you add the following:
in the XML output.</li>
<li> para tags in simple section in the XML output were not properly matched</li>
</ul></li>
-<li> PDF output fixes:
+<li> PDF output fixes:
<ul>
<li> Fixed pdflatex reruns in the Makefile when USE_PDFLATEX was YES. It
should now run the proper amount of times (thanks to Simon Goodwin
for the fix).</li>
<li> Links to items in the bug list were broken for the PDF output.</li>
- <li> Fixed bug in PDF output that resulted in links to non-existing
+ <li> Fixed bug in PDF output that resulted in links to non-existing
source pages.</li>
- <li> Fixed bug in URL parsing that caused invalid PDF output for the
+ <li> Fixed bug in URL parsing that caused invalid PDF output for the
doxygen manual.</li>
<li> Doxygen logo did not appear in the PDF manual.</li>
</ul></li>
-<li> RTF output fixes/improvements by Janet Swisher,
- Gordon Machel &amp; Martin Vuille:
+<li> RTF output fixes/improvements by Janet Swisher,
+ Gordon Machel &amp; Martin Vuille:
<ul>
<li> Included fix for loading RTF style-sheets</li>
<li> reference list and title were merged</li>
@@ -7543,14 +8194,14 @@ make sure you add the following:
<li> Fixed bug parsing URLs with curly braces in documentation blocks.</li>
<li> Html help output now uses the correct language code if non English
language is selected.</li>
-<li> Fixed bug in generate makefile for latex output (thanks to Petr
+<li> Fixed bug in generate makefile for latex output (thanks to Petr
Prikryl)</li>
-<li> Fixed source browser bug: a comment just before a function body
+<li> Fixed source browser bug: a comment just before a function body
confused the parser.</li>
<li> Fixed problem handling function typedefs.</li>
<li> \endif appeared in output when used via ALIASES in a brief description.</li>
-<li> Included heuristic to distinguish between a variable definition
- with initialization via a constructor and a function prototype
+<li> Included heuristic to distinguish between a variable definition
+ with initialization via a constructor and a function prototype
(e.g. "Test var(initVal);", v.s. "Test func(SomeType);").</li>
<li> Fixed lock-up problem when to @brief were put after each other in a
comment block.</li>
@@ -7558,18 +8209,18 @@ make sure you add the following:
<li> Members in source fragments and examples were not linked to their
member group documentation if available.</li>
<li> For initializers of the form ' ', the space was removed in the output. </li>
-<li> \dotfile generated files did not get generated correctly because dot
+<li> \dotfile generated files did not get generated correctly because dot
could not find the specified font.</li>
<li> Third argument of \class did not always work.</li>
<li> The pattern argument for the @skip, @skipline, @until and @line commands
- now extents until the end of the line (as suggested by the documentation)
+ now extents until the end of the line (as suggested by the documentation)
instead of just the first word. </li>
</ul>
<h1>Doxygen Release 1.2.16</h1>
<h3>Changes</h3>
<ul>
-<li> Verbatim and preformatted sections
+<li> Verbatim and preformatted sections
are now represented with a new "preformatted" tag in the XML output.</li>
<li> The HIDE_UNDOC_RELATIONS option is no longer depending on
HAVE_DOT being set to YES.</li>
@@ -7579,11 +8230,11 @@ make sure you add the following:
//! Detailed
//! Description
as a detailed description
- (such blocks used to be treated as brief descriptions!).
+ (such blocks used to be treated as brief descriptions!).
A single line C++ comments still represents a brief description,
for multiline brief description an explicit @brief can be used.
See the updated documentation for more examples.</li>
-<li> XML: Added class name to inheritance relations that are written to the
+<li> XML: Added class name to inheritance relations that are written to the
XML output.</li>
<li> Images included with \dotfile are now centered in the latex output
(thanks to Nils Strom for the patch).</li>
@@ -7595,9 +8246,9 @@ make sure you add the following:
<li> Made include dependency graphs available from the XML parser API.</li>
<li> Added patch to support multi-byte RTF output (thanks to Sato Ryunosuke)</li>
<li> Gary Lee added language support for Chinese-Traditional. </li>
-<li> Thanks to a patch by Loïc the RTF output now supports (non-nested)
+<li> Thanks to a patch by Loïc the RTF output now supports (non-nested)
tables.</li>
-<li> Added compilation support for cygwin (win32-g++ target).
+<li> Added compilation support for cygwin (win32-g++ target).
Thanks to Ryunosuke Sato for the patch.</li>
<li> Added new option DETAILS_AT_TOP to put the detailed documentation
at the top of a documentation page where normally only the brief
@@ -7606,20 +8257,20 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Improved portability of the png code: updated zlib to version 1.1.4,
- replaced K&amp;R style code by ansi code, fixed compile problem with
+<li> Improved portability of the png code: updated zlib to version 1.1.4,
+ replaced K&amp;R style code by ansi code, fixed compile problem with
pngenc.cpp on some platforms.</li>
<li> Fixed recursive lock-up problem that could occur for certain cases
in which recursive template inheritance was used.</li>
<li> The cross-package inheritance relations were broken for Java code.
I fixed this by treating Java import statement as C++ using statements.
Please report any problems that remain.</li>
-<li> Alias commands put in separate parameter documentation blocks
+<li> Alias commands put in separate parameter documentation blocks
were not resolved.</li>
-<li> The documentation for arguments, documented with a separate
- documentation block, was not consistently shown in source and header
+<li> The documentation for arguments, documented with a separate
+ documentation block, was not consistently shown in source and header
files, depending on the order of the input files. </li>
-<li> The characters '(', ')', '$', ''', and ';' were not recognized
+<li> The characters '(', ')', '$', ''', and ';' were not recognized
as part of an URL.</li>
<li> Grouped enum values could not share the same documentation block
even when DISTRIBUTE_GROUP_DOC is YES. </li>
@@ -7628,9 +8279,9 @@ make sure you add the following:
<li> Removed warning when documenting include guard-like defines. </li>
<li> The \package command was broken. Fixed cases where :: appeared in
the output when OPTIMIZE_OUTPUT_JAVA was set to YES.</li>
-<li> Fixed scoping problem using \class for documenting nested classes inside
+<li> Fixed scoping problem using \class for documenting nested classes inside
template classes.</li>
-<li> Fixed invalid output bug when putting "-" items inside @arg or @li
+<li> Fixed invalid output bug when putting "-" items inside @arg or @li
lists.</li>
<li> Fixed problem referencing functions using {@link ... } with explicit
argument lists.</li>
@@ -7641,16 +8292,16 @@ make sure you add the following:
<li> Fixed bug in conditional section handling for cases like:
@if guard text @else more text @endif</li>
<li> The html help files did not honor the HTML_FILE_EXTENSION settings.</li>
-<li> Removed bogus warning when using @param for function-type
+<li> Removed bogus warning when using @param for function-type
parameters.</li>
-<li> Include statements in the source browser output now link to the
+<li> Include statements in the source browser output now link to the
right include file in case of ambiguities. </li>
<li> The include lines in the file documentation didn't link to files that
were imported from tag files. </li>
<li> The include dependency graph did not show include files if they
were directly or indirectly imported from tag files. Existing tag
files need to be regenerated to make use of this.</li>
-<li> XML: The refid of members in listofallmembers section in the XML output
+<li> XML: The refid of members in listofallmembers section in the XML output
was wrong. The ulink tag did not end properly in the XML output.
The Value of ambiguityscope in the XML output was not properly escaped.
LaTeX page reference texts appeared in the XML output.</li>
@@ -7659,10 +8310,10 @@ make sure you add the following:
reordered const) as equivalent types.</li>
<li> The preprocessor now avoids recursive includes, which helps
to parse files that do not have proper #ifndef-#define .. #endif guards.</li>
-<li> Matching arguments with types "unsigned long int" and
- "unsigned long int blah" removed argument name.
+<li> Matching arguments with types "unsigned long int" and
+ "unsigned long int blah" removed argument name.
Same for "int" and "const int blah".</li>
-<li> Fixed LaTeX output bug that occurs when using \dotfile in combination
+<li> Fixed LaTeX output bug that occurs when using \dotfile in combination
with USE_PDFLATEX = YES (thanks to Nils Strom for the patch).</li>
<li> Links to static functions in the documentation, now point to the
local file in case of ambiguities.</li>
@@ -7670,28 +8321,28 @@ make sure you add the following:
<li> Fixed bug parsing "class C : public ::C {};" inside a namespace.</li>
<li> Fixed bug in tag file reader when parsing includes.</li>
<li> The include dependencies were wrong if an include file name was part of
- the input but the #include specifically asked for another file
+ the input but the #include specifically asked for another file
not part of the input but with the same name.</li>
</ul>
<h1>Doxygen Release 1.2.15</h1>
<h3>Changes</h3>
<ul>
-<li> On request of Richard Stallman and others I replaced all
- generated GIF images with PNG images.
- See <a href="http://www.burnallgifs.org">http://www.burnallgifs.org</a>
+<li> On request of Richard Stallman and others I replaced all
+ generated GIF images with PNG images.
+ See <a href="http://www.burnallgifs.org">http://www.burnallgifs.org</a>
for the motivation.</li>
-<li> The Documentation of function definitions and declarations are now
- always merged. References/Referenced by relations are now equal
+<li> The Documentation of function definitions and declarations are now
+ always merged. References/Referenced by relations are now equal
for function declarations and definitions.</li>
<li> When @retval commands are used to document parameters, doxygen will
no longer produce a warning message for that parameter. @retval can
still be used to document non parameters such as the return values
of a function.</li>
-<li> <pre>#define A(x) x /**&lt; a define */</pre>
+<li> <pre>#define A(x) x /**&lt; a define */</pre>
will document a define, while
<pre>#define A(x) /** an argument */ x</pre>
will document the argument of the define</li>
-<li> Links in the documentation to const/volatile members are now
+<li> Links in the documentation to const/volatile members are now
possible by explicitly specifying "f() const" or "f() volatile"
in case a non-const/volatile "f()" also exists.</li>
<li> Doxygen now warns about undocumented compounds (thanks to Itai Frenkel
@@ -7700,17 +8351,17 @@ make sure you add the following:
<h3>New features</h3>
<ul>
<li> Included language update for Russian and Romanian translations.</li>
-<li> EPS images included with "\image latex" are automatically converted
+<li> EPS images included with "\image latex" are automatically converted
to pdf's when USE_PDFLATEX is set to YES.</li>
-<li> Added two new commands: LATEX_CMD_NAME and MAKEINDEX_CMD_NAME to
+<li> Added two new commands: LATEX_CMD_NAME and MAKEINDEX_CMD_NAME to
set the name of the latex and makeindex tools to be used for latex
output (thanks to Konno Akihisa for the patch).</li>
<li> Improved support for Java. Packages are now treated like
- C++ namespaces and there is a new option OPTIMIZE_OUTPUT_JAVA
+ C++ namespaces and there is a new option OPTIMIZE_OUTPUT_JAVA
that, when enabled, provides more Java-oriented output. Please
report any Java-related problems that remain.</li>
<li> Extended XML parser API (see addon/doxmlparser/include/doxmlintf.h)
- with full access to documentation blocks.
+ with full access to documentation blocks.
Made inheritance/collaboration diagrams accessible via the
XML parser API (see addon/doxmlparser/include/doxmlintf.h).
Reorganized the internals of the XML parser so the API does
@@ -7719,26 +8370,26 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Using "@param x,y,z" resulted bogus warnings about undocumented
+<li> Using "@param x,y,z" resulted bogus warnings about undocumented
parameters.</li>
<li> "doxygen -w latex header.tex doxygen.sty Doxyfile" caused a segmentation
fault (thanks to Aric Cyr for the patch).</li>
-<li> Fixed argument matching problem that occurred in some rare cases
+<li> Fixed argument matching problem that occurred in some rare cases
that involved "using" of namespaces.</li>
<li> Using /**&lt; Brief.\ more brief. Details. */ with ENABLE_JAVADOC = YES,
now removes the slash just like it did with /**...*/ style comments. </li>
<li> Using an ordered, html-style list inside a @param command
resulted in invalid output if list item contained blank lines.</li>
-<li> STRIP_FROM_PATH now also works with Windows style paths
+<li> STRIP_FROM_PATH now also works with Windows style paths
(e.g. C:\MyPath\)</li>
<li> A module can now appear more than once in the module tree
(thanks to Itai Frenkel for the patch).</li>
<li> In some cases the tree view showed leaf elements as non-leafs. </li>
-<li> Fixed a number of cases where illegal characters could end up in
+<li> Fixed a number of cases where illegal characters could end up in
the XML output.</li>
<li> If a function in a base class was (re)implemented by several classes
only one of them appeared in the "(re)implemented in" list. </li>
-<li> graph_legend.gif was hardcoded in translator_*.h files.
+<li> graph_legend.gif was hardcoded in translator_*.h files.
Note to translators: this has affected all translator files, so please
update your local translator file!</li>
<li> In some cases a grouped member within a namespace did not appear
@@ -7748,8 +8399,8 @@ make sure you add the following:
<li> Using directives inside anonymous namespaces had no effect.</li>
<li> Fixed bug in the preprocessor when parsing '"' as the argument to
a function macro.</li>
-<li> The argument of commands like \c did not produce a link to
- external documentation if possible, while links to local
+<li> The argument of commands like \c did not produce a link to
+ external documentation if possible, while links to local
documentation were generated.</li>
</ul>
@@ -7759,10 +8410,10 @@ make sure you add the following:
<li> Split up the XML output into an index (index.xml) and one page per
compound. This allows for faster processing and less memory consumption,
when using DOM style parsers.</li>
-<li> Include files are now shown in the class documentation if
+<li> Include files are now shown in the class documentation if
and only if SHOW_INCLUDE_FILES is YES. </li>
-<li> Doxygen-style C comments inside macro definitions are now preserved
- in the output. Example:
+<li> Doxygen-style C comments inside macro definitions are now preserved
+ in the output. Example:
<pre>
#define INIT(x) /*! Initializes x. */ void Init() { x = 0; }
</pre></li>
@@ -7773,33 +8424,33 @@ make sure you add the following:
</ul>
<h3>New features</h3>
<ul>
-<li> Added a very simple metrics utility
- (see addon/doxmlparser/examples/metrics) which can compute some
+<li> Added a very simple metrics utility
+ (see addon/doxmlparser/examples/metrics) which can compute some
figures based on the XML output generated by doxygen.</li>
<li> Added autodetection for Darwin (MacOSX) to the configure script.</li>
<li> Added option EXCLUDE_SYMLINKS.
- The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
- directories that are symbolic links (a Unix filesystem feature) are
+ The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+ directories that are symbolic links (a Unix filesystem feature) are
excluded. </li>
-<li> Added option EXTERNAL_GROUPS.
- If the EXTERNAL_GROUPS tag is set to YES all external groups
- will be listed in the modules index. If set to NO, only the
+<li> Added option EXTERNAL_GROUPS.
+ If the EXTERNAL_GROUPS tag is set to YES all external groups
+ will be listed in the modules index. If set to NO, only the
current project's groups will be listed. (thanks to Darren Oldag
for the patch).</li>
<li> Included update for translator.pl (thanks to Petr Prikryl)</li>
<li> updated .spec file (thanks to Emilio Riva).</li>
-<li> Included patch by Jochen Hanff to make the index headings configurable
+<li> Included patch by Jochen Hanff to make the index headings configurable
via style-sheets.</li>
-<li> If a comment block contains at least one @param command, doxygen now
+<li> If a comment block contains at least one @param command, doxygen now
produces warnings if not all parameters of a function are documented or
- if the names of the parameters do not match the argumentlist.
+ if the names of the parameters do not match the argumentlist.
(Please report any false alarms).</li>
-<li> Added new command \~language_id to create sections that
+<li> Added new command \~language_id to create sections that
are outputted for the language &gt;language_id&gt; only:
- Example:
+ Example:
<pre>
- /** \~czech Cesky komentar \~english English comment text \~dutch
- Nederlands commentaar \~ Common comment for all languages,
+ /** \~czech Cesky komentar \~english English comment text \~dutch
+ Nederlands commentaar \~ Common comment for all languages,
this tag switches off the language filter...
*/
</pre>
@@ -7807,25 +8458,25 @@ make sure you add the following:
on the setting of OUTPUT_LANGUAGE (Thanks to Milan Rusek for the patch).</li>
<li> Added build support for Cygwin (thanks to Ryunosuke Sato). </li>
<li> Added new option HTML_FILE_EXTENSION to allow different file extension
- for the html file outputted by doxygen (like .php). Thanks to
+ for the html file outputted by doxygen (like .php). Thanks to
Rob Olsthoorn for the patch.</li>
<li> Added option DOT_IMAGE_FORMAT that can be used to set the image
format of images generated by dot (possible formats: gif, png, jpg).</li>
-<li> In the documentation of class, namespace, file and group items a
+<li> In the documentation of class, namespace, file and group items a
list of groups to which the item belongs is put between brackets ([..])
under the title (HTML only).</li>
-<li> Added "list of all members" and template parameter lists for
+<li> Added "list of all members" and template parameter lists for
classes to the XML output.</li>
-<li> Included language updates for Chinese, Czech, French, Italian,
+<li> Included language updates for Chinese, Czech, French, Italian,
Brazilian, Japanese, Russian and German.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> The start of a comment (/*) embedded in a page or example block
+<li> The start of a comment (/*) embedded in a page or example block
caused parse problems.</li>
<li> operator%= member caused latex error when in pdf hyperlink mode.</li>
<li> fixed parse problem for global function typedefs like "typedef int f()"</li>
-<li> Qt slots weren't included in the reference/referenced by relations
+<li> Qt slots weren't included in the reference/referenced by relations
(thanks to Gordon Machel for the patch).</li>
<li> Fixed parse problem that occurred when the &lt;SUP&gt; tag was used in
a brief description. </li>
@@ -7833,21 +8484,21 @@ make sure you add the following:
EXTRACT_PRIVATE was NO.</li>
<li> Doxygen now exits with code 0 if there is no error (previously it
returned 1 in some cases were no error occurred).</li>
-<li> Calling "doxygen -g -" now writes the config file to stdout
+<li> Calling "doxygen -g -" now writes the config file to stdout
(this already worked when using "doxygen -g-").</li>
<li> Undocumented classes exposed when setting EXTRACT_ALL to YES, could
result in broken links in the class hierarchy.</li>
<li> Exception specifications in Java were not parsed properly.</li>
<li> If INLINE_INHERITED_MEMB was YES, pure virtual members of base classes
- reachable via multiple paths appeared more than once in the
+ reachable via multiple paths appeared more than once in the
documentation.</li>
<li> Removed potential recursive loop when computing reimplements relations
for template instances.</li>
-<li> Fixed argument matching problem when matching "a&lt;int *&gt;" with
+<li> Fixed argument matching problem when matching "a&lt;int *&gt;" with
a&lt;int * &gt;"</li>
-<li> Links in the documentation of grouped namespace members were not
+<li> Links in the documentation of grouped namespace members were not
pointing to the group but to the namespace.</li>
-<li> For template specializations the title of an html page contained
+<li> For template specializations the title of an html page contained
plain &lt; and &gt; characters.</li>
<li> When computing source references undocumented members could introduce
non-existing relations for documented members in front of it.</li>
@@ -7858,13 +8509,13 @@ make sure you add the following:
treated as virtual.</li>
<li> Protected members of a base class did not appear as such in the list of
all members of derived classes.</li>
-<li> Fixed problem with ending itemized lists before paragraph commands
+<li> Fixed problem with ending itemized lists before paragraph commands
(like @see), which resulted in invalid output.</li>
-<li> The version number in config files generated by doxywizard was
+<li> The version number in config files generated by doxywizard was
always 0.1.</li>
<li> Having a macro function and typedef with the same name confused doxygen.</li>
<li> An \endverbatim command at the end of a \name section was not parsed.</li>
-<li> Stars (*) at the start of a line in /**&lt; ... */ style comments
+<li> Stars (*) at the start of a line in /**&lt; ... */ style comments
after a parameter were included in the result.</li>
<li> Putting a C-style comment in a @code block was not handled properly.</li>
</ul>
@@ -7896,7 +8547,7 @@ make sure you add the following:
thanks to Ryunosuke Sato.</li>
<li> Included update for Slovak translator, thanks to Stanislav Kudlac.</li>
<li> Thanks to a patch by Pascal Flammant tables in the documentation
- can now have captions using &lt;caption&gt; ... &lt;/caption&gt;
+ can now have captions using &lt;caption&gt; ... &lt;/caption&gt;
within a table definition.</li>
<li> A dash-style list can now be ended without ending the paragraph.
See the list-section of the documentation for an example.</li>
@@ -7905,10 +8556,10 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> Changed the way @internal works. The "For internal use only" message,
- now appears (along with the internal documentation)
+ now appears (along with the internal documentation)
if and only if INTERNAL_DOCS = YES. </li>
<li> Subgroups are no longer sorted but presented in declaration order.</li>
-<li> Members inside todo/test/bug lists are now shown with qualified
+<li> Members inside todo/test/bug lists are now shown with qualified
names again. </li>
<li> Reorganized the XML parser. It is now structured as a library,
a header file, and a test application. See addon/doxmlparser for
@@ -7916,11 +8567,11 @@ make sure you add the following:
</ul>
<h3>New features</h3>
<ul>
-<li> Included languages updates for French, Portuguese,
+<li> Included languages updates for French, Portuguese,
Korean, Italian, Dutch, Slovene, Brazil, German and Portuguese.
- Thanks to Harry Kalogirou doxygen now has support for output in
+ Thanks to Harry Kalogirou doxygen now has support for output in
the Greek language.</li>
-<li> Included patch by Adam Doppelt to make doxysearch work
+<li> Included patch by Adam Doppelt to make doxysearch work
better with windows/IIS.</li>
<li> Added more info to the XML output: include dependencies,
member groups, re-implement relations, const/volatile specifiers,
@@ -7928,7 +8579,7 @@ make sure you add the following:
<li> Added some logic to deal with member specializations.
They should now be added as additional members to a class instead of
being ignored and producing a warning.</li>
-<li> Thanks to a patch by Bruce Korb, author of
+<li> Thanks to a patch by Bruce Korb, author of
<a href="http://autogen.sourceforge.net/">autogen</a>, doxygen now
has output support for producing autogen definition files. To do
this set GENERATE_AUTOGEN_DEF to YES in the config file. </li>
@@ -7941,7 +8592,7 @@ make sure you add the following:
or hide classes and structs defined in source files.</li>
<li> Thanks to an install script written by David Greig, the windows
version of doxygen now comes with a windows installer based on
- Jordan Russell's
+ Jordan Russell's
<a href="http://www.jrsoftware.org/isinfo.htm">Inno Setup</a>.</li>
</ul>
@@ -7951,19 +8602,19 @@ make sure you add the following:
<li> Auto detection of idl files was broken.</li>
<li> Preprocessor did not parse hexadecimal values correctly.</li>
<li> Fixed XML output problem (too many &lt;/highlight&gt; tags).</li>
-<li> Documentation for nested classes inside other nested classes was
+<li> Documentation for nested classes inside other nested classes was
not written to the output.</li>
-<li> Fixed problem mixing paragraph commands (like \param) with
+<li> Fixed problem mixing paragraph commands (like \param) with
hyphen-style lists.</li>
<li> Modules index in LaTeX was broken.</li>
<li> STRIP_FROM_PATH now works for windows-style paths as well.
Thanks to Joël Conraud for the patch.</li>
-<li> For functions whose declaration was grouped and whose definition
- contained a documentation block with a todo/test/bug item,
+<li> For functions whose declaration was grouped and whose definition
+ contained a documentation block with a todo/test/bug item,
the item did not appear in the todo/test/bug list.</li>
<li> In the source browser output, the "=" in variable initializers
was outputted as "==". </li>
-<li> Fixed parse problem for typedefs of function pointers returning
+<li> Fixed parse problem for typedefs of function pointers returning
a template instance.</li>
<li> Fixed bug in parsing method pointer function arguments of the
form "void f(void (C::*m)() const)"</li>
@@ -7972,36 +8623,36 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> Improved the speed of the todo/test/bug list generation considerably.</li>
-<li> The list of all members of a class now shows for each member,
+<li> The list of all members of a class now shows for each member,
the class in which the member is defined.</li>
-<li> Rewrote a substantial part of the source code parser
- (SOURCE_BROWSER = YES). It is now more context sensitive and
+<li> Rewrote a substantial part of the source code parser
+ (SOURCE_BROWSER = YES). It is now more context sensitive and
will generate more/better links.</li>
</ul>
<h3>New features</h3>
<ul>
<li> Added new option HIDE_UNDOC_RELATIONS that can be set to NO to show
- any undocumented inheritance and usage relations from the various
+ any undocumented inheritance and usage relations from the various
graphs.</li>
<li> Included updates for translations to Chinese (thanks to Charlie Liu)
Slovene (thanks to Matjaz Ostroversnik), Russian
(thanks to Alexandr Chelpanov), Czech (thanks to Petr Prikryl)
- and Croatian (thanks to Boris Bralo). Included Petr's translator
+ and Croatian (thanks to Boris Bralo). Included Petr's translator
adapter simplifications. Included Latin2 patch by Mitja Udovc.</li>
<li> Updated the graph legend page.</li>
<li> Added option REFERENCES_RELATION that can be enabled in combination
- with SOURCE_BROWSER to produce for each function
- a list of all called/used members/functions/variables.
- The reverse list can now be enabled/disabled using the
+ with SOURCE_BROWSER to produce for each function
+ a list of all called/used members/functions/variables.
+ The reverse list can now be enabled/disabled using the
new REFERENCED_BY_RELATION option.</li>
-<li> Added native support for typedefs of the form
+<li> Added native support for typedefs of the form
"typedef void (__stdcall *name)()", where __stdcall can be any
identifier.</li>
-<li> Included a patch by Stephen Goudge which adds an option
+<li> Included a patch by Stephen Goudge which adds an option
EXAMPLE_RECURSIVE to indicate whether or not example files should
be searched recursively.</li>
-<li> Included patch by Erik Zeek to add EOL translation to the
+<li> Included patch by Erik Zeek to add EOL translation to the
config file output.</li>
<li> Doxygen now searches the current directory for source files if
the INPUT and FILE_PATTERNS are empty (thanks to Johan Eriksson
@@ -8014,20 +8665,20 @@ make sure you add the following:
<ul>
<li> Fixed more RTF problems and added an RTF integrity check that
is performed on the generated RTF output (bracket matching).</li>
-<li> Refined the macro detection in the preprocessor a little, so it does
+<li> Refined the macro detection in the preprocessor a little, so it does
not match constructors and functions so easily.</li>
<li> the % prefix didn't work for scoped items.</li>
<li> References to groups defined in tag files did not work.</li>
<li> documentation for classes inside namespaces was generated multiple
times.</li>
-<li> Running doxytag on qt-3.0.0 resulted in a tag file containing
+<li> Running doxytag on qt-3.0.0 resulted in a tag file containing
non-breakable spaces.</li>
<li> The \package statement did not work correctly for packages whose name
contained a dot.</li>
<li> Fixed Parser bug for java initializers of the form = "\"/*";</li>
<li> Fixed LaTeX output problem when using \par followed by a (-) list.</li>
<li> Fixed LaTeX output bug in the related page index.</li>
-<li> Commands inside a conditional section would still appear in the
+<li> Commands inside a conditional section would still appear in the
result even if the section was disabled.</li>
<li> Included idea by Roberto Bagnara to make running "make" in the LaTeX
output autodetect how many times latex has to be run.</li>
@@ -8072,14 +8723,14 @@ make sure you add the following:
<ul>
<li> The source browser option now generates links to (documented)
globals and fields. Especially useful for C code.</li>
-<li> Input containing CR+LF (DOS/Windows) or CR only (Mac) are now
+<li> Input containing CR+LF (DOS/Windows) or CR only (Mac) are now
automatically converted to LF. </li>
<li> New config option SKIP_FUNCTION_MACROS that when set to YES
- (the default) makes doxygen's preprocessor automatically remove all
- function macros that are alone on a line and do not end with a
- semicolon. These are typically used as boiler-plate code and
+ (the default) makes doxygen's preprocessor automatically remove all
+ function macros that are alone on a line and do not end with a
+ semicolon. These are typically used as boiler-plate code and
confuse the parser if not removed.</li>
-<li> Added class collaboration and inheritance diagram descriptions
+<li> Added class collaboration and inheritance diagram descriptions
to the XML output. Also added source browser output for each file.</li>
<li> Added a developers part to the manual, with some information on
how doxygen is structured internally.</li>
@@ -8101,7 +8752,7 @@ make sure you add the following:
<li> Fixed bug in RTF output (bracket mismatch).</li>
<li> Initializer of the last enum value of an enum did not always appear.</li>
<li> Dots were removed from return types in Java.</li>
-<li> In some cases a broken "More..." link was generated after
+<li> In some cases a broken "More..." link was generated after
a brief class description.</li>
<li> Text of a section title containing was truncated if it contained an
asterix.</li>
@@ -8110,7 +8761,7 @@ make sure you add the following:
<li> Fixed generated makefile dependencies for USE_PDFLATEX = YES
(thanks to Marcus Holland-Moritz)</li>
<li> "\retval #VALUE" now links to VALUE if documented. The same works
- for \exception and \throws
+ for \exception and \throws
(and since the argument is a class no # is needed).</li>
<li> Sorting the alphabetical list was broken for nested classes.</li>
</ul>
@@ -8120,12 +8771,12 @@ make sure you add the following:
<li> Relations between templates and their instances are now visualized
in the inheritance and collaboration graphs. Can be disabled
by setting TEMPLATE_RELATIONS to NO in the config file.</li>
-<li> A Java package can now be documented using a comment block containing a
- @package command or by putting a documentation block in front of a
+<li> A Java package can now be documented using a comment block containing a
+ @package command or by putting a documentation block in front of a
package statement.</li>
<li> Added new command \dotfile which can be used to include a user
specified dot file as an image in the documentation. The new config
- option DOTFILE_DIRS should be used to specify directories in which
+ option DOTFILE_DIRS should be used to specify directories in which
doxygen should look for dot files (thanks to Samit Basu for the patch).</li>
<li> Added new build target macosx-c++ to build doxygen for Mac OS X
(Thanks to Jason Harris for telling me what needed to be changed).</li>
@@ -8139,24 +8790,24 @@ make sure you add the following:
<ul>
<li> Fix compile problem for the Irix compiler (thanks to Dirk Reiners)</li>
<li> Some generated &amp;nsbp; entities where missing a ; in the HTML output.
- For some browsers this resulted in argument types &amp; names being
+ For some browsers this resulted in argument types &amp; names being
glued together.</li>
<li> The heading of parameter and return value lists was not bold anymore in
the HTML output. </li>
<li> "Reimplemented to/from" member links now work between template base
classes and their derived classes.</li>
-<li> Not all documented templates class were regarded as documented
+<li> Not all documented templates class were regarded as documented
(unless EXTRACT_ALL was set to YES).</li>
<li> Fixed recursive lock-up problem for recursive templates of the form:
template&lt;class T&gt; class A : public A&lt;typename T::B&gt; {}</li>
-<li> The labels in the alphabetical list were broken when namespaces were
+<li> The labels in the alphabetical list were broken when namespaces were
used.</li>
<li> An error was given for import statements in Java sources.</li>
<li> The "list of all members" was no longer generated for nested classes.</li>
<li> Fixed bug in XML output causing mis matched &lt;para&gt; tags.</li>
<li> Fixed parse problem for enum initializers like: "enumVal = A&lt;T,C&gt;::val" </li>
<li> \hideinitializer did not hide the initializer of enum values.</li>
-<li> Undocumented enums and enum values now behave correctly when
+<li> Undocumented enums and enum values now behave correctly when
HIDE_UNDOC_MEMBERS is set to YES.</li>
<li> Fixed a problem with using \if inside alias definitions.</li>
<li> Fixed &amp; changed the layout of function arguments a little.</li>
@@ -8165,14 +8816,14 @@ make sure you add the following:
<li> Members of an unnamed namespace are now treated as static, and will
only appear in the documentation if EXTRACT_STATIC is set to YES.</li>
<li> Classes are sorted by their name, i.s.o. full scope again.</li>
-<li> Improved argument matching for members defined within (nested)
+<li> Improved argument matching for members defined within (nested)
namespaces.</li>
</ul>
<h1>Doxygen Release 1.2.9.1</h1>
<h3>Changes</h3>
<ul>
-<li> Bug/test/todo items of members are now grouped
+<li> Bug/test/todo items of members are now grouped
together with their compound.</li>
</ul>
<h3>New features</h3>
@@ -8183,14 +8834,14 @@ make sure you add the following:
<h3>Bug fixes</h3>
<ul>
<li> The .spec file still assumed the --with-xmlgen switch was available.</li>
-<li> Template instances caused double entries in the class list
+<li> Template instances caused double entries in the class list
(in LaTeX) and broke RTF output.</li>
<li> \if and \endif can now be used to make structural commands like
\brief, \ingroup, and \defgroup conditional.</li>
<li> The "const" in "func(B * const)" was parsed as a variable name.</li>
<li> Template specializations of the form A&lt;N::C&gt; where not handled
properly.</li>
-<li> Putting \relates in a function documentation block that was
+<li> Putting \relates in a function documentation block that was
within a namespace, while referring to another namespace did not work.</li>
<li> Doxywizard always complained it could not read the config file.</li>
<li> Doxywizard did not properly update boolean and integer values.</li>
@@ -8207,8 +8858,8 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> Friend class declarations are now treated as normal members.</li>
-<li> Completely rewrote the way templates are handled.
- Doxygen now (internally) computes all template instantiations it encounters.
+<li> Completely rewrote the way templates are handled.
+ Doxygen now (internally) computes all template instantiations it encounters.
This has the following advantages:
<ul>
<li>Template instantiations are now shown in the hierarchical index
@@ -8219,7 +8870,7 @@ make sure you add the following:
Since there is a lot of new code, some more testing won't hurt
to mature the code. If you are using templates, please try this
version for me and report any problems.</li>
-<li> Started moving the XML output generator back into doxygen.
+<li> Started moving the XML output generator back into doxygen.
As a result the GENERATE_XML option has reappeared.</li>
<li> Function arguments names are now nicely aligned in the generated
HTML output. Thanks to Joe Bester for doing most of the work. </li>
@@ -8242,7 +8893,7 @@ make sure you add the following:
<li> Linebreaks are now done with \par instead of \line in the RTF
output (thanks to Henning Moll).</li>
<li> Removed bogus warnings when parsing tag files.</li>
-<li> The detailed description in a @name block can now be more than
+<li> The detailed description in a @name block can now be more than
plain text.</li>
<li> Included fix for the tree view script for the Mozilla browser
(thanks to Alec Panovici).</li>
@@ -8258,22 +8909,22 @@ make sure you add the following:
now work.</li>
<li> "doxygen -g -s" now creates a file named Doxyfile i.s.o "-s" </li>
<li> Fixed a null pointer referencing problem (thanks to Nick Pratt)</li>
-<li> 8-bits characters are now correctly handled within the argument
+<li> 8-bits characters are now correctly handled within the argument
of \b, \c or \e.</li>
<li> Reimplemented links were broken for grouped members (thanks to
Johan Eriksson for the fix).</li>
-<li> Enabling the Tree view didn't result in proper RTF and LaTeX output
+<li> Enabling the Tree view didn't result in proper RTF and LaTeX output
(thanks to Paul Sydney for the fix).</li>
<li> Merged patches by Joe Bester:
<ul>
<li>Could not link to @anchors in the main page on external packages.</li>
- <li> All external modules and pages were linked to or appended
+ <li> All external modules and pages were linked to or appended
(even the TODO page, etc), even when EXTRACT_ALL is set to NO.</li>
- <li> The section containing structs and unions is labeled
- "Class Documentation" (in the English translation) even when
+ <li> The section containing structs and unions is labeled
+ "Class Documentation" (in the English translation) even when
the OPTIMIZE_OUTPUT_FOR_C was set to YES.</li>
</ul></li>
-<li> using the IDL keyword "import" in other languages did not work
+<li> using the IDL keyword "import" in other languages did not work
correctly.</li>
<li> members of a privately inherited base class were not shown in the
list of all members, while they were accessible from the derived class.</li>
@@ -8281,7 +8932,7 @@ make sure you add the following:
capable of handling nested template classes correctly. Please test
this if you are using these constructs. Thanks to Christoph Koegl
for providing some difficult test cases.</li>
-<li> Fixed parse problem when parsing &lt;&lt; as part of the first
+<li> Fixed parse problem when parsing &lt;&lt; as part of the first
argument of a typedef.</li>
<li> Further improved typedef resolution.</li>
<li> The LATEX_HEADER-config option disabled the \mainpage-output
@@ -8305,7 +8956,7 @@ make sure you add the following:
<h3>New features</h3>
<ul>
<li> Included update for Brazilian translation.</li>
-<li> Add support for &amp;lt; &amp;gt; &amp;amp; &amp;apos; &amp;quot;
+<li> Add support for &amp;lt; &amp;gt; &amp;amp; &amp;apos; &amp;quot;
in the documentation,
since these commands after occur in Java documentation.</li>
</ul>
@@ -8319,7 +8970,7 @@ make sure you add the following:
<li> When a paragraph header was directly followed by an
item list doxygen did not render the first item properly.</li>
<li> The "More..." link was often omitted for grouped members. </li>
-<li> "dangerous" characters like ":" are now escaped from man page
+<li> "dangerous" characters like ":" are now escaped from man page
file names</li>
</ul>
<h1>Doxygen Release 1.2.8</h1>
@@ -8332,7 +8983,7 @@ make sure you add the following:
<ul>
<li> The dot generated inheritance and collaboration graphs for classes
should now show the proper template instantiation for the derived/used
- classes. For instance it should show that class S uses class V
+ classes. For instance it should show that class S uses class V
(indirectly) in the following example:
<pre>
class V {};
@@ -8342,21 +8993,21 @@ make sure you add the following:
template&lt;class T&gt; class B2 : public B1&lt;T&gt; {};
class S : public B2&lt;V&gt; {};
</pre>
- Please report any example of class hierarchies that are not shown
+ Please report any example of class hierarchies that are not shown
properly.</li>
<li> Added doc/translator.pl script created by Petr Prikryl.
Its main purpose is to extract information from doxygen's sources
related to internationalization (i.e. the translator classes), to
- avoid duplication of information (i.e. doc/language.doc is now
+ avoid duplication of information (i.e. doc/language.doc is now
generated) and to generate reports about the status of the translations
(e.g. missing methods). </li>
<li> Stanislav Kudlac added support for Slovak language and
Erik Søe Sørensen added support for Danish.
- Applied language updates for
+ Applied language updates for
Italian, Croatian, Spanish, Czech, German &amp; Russian.</li>
<li> Added support for "KBD" HTML tags (thanks to Albin Wu).</li>
-<li> Added man patch by Patrick Ohly which allows to create freestyle
- man pages using \page and puts man page with non-default extension
+<li> Added man patch by Patrick Ohly which allows to create freestyle
+ man pages using \page and puts man page with non-default extension
in the correct directory.</li>
<li> Added MAN_LINKS option (thanks to Patrick Ohly for the patch).</li>
<li> Added grouping patches by Patrick Ohly:
@@ -8373,7 +9024,7 @@ make sure you add the following:
doxygen will use the name as title (this is the old behavior).
<pre>
/** \addtogroup name */
- </pre>
+ </pre>
can be used to add documentation or
members to a group (as in 1.2.7), but the group is created if
it doesn't exist yet. You can provide the title later
@@ -8390,7 +9041,7 @@ make sure you add the following:
</p>
<p>
\weakgroup is exactly the same as \addtogroup, but if a member
- is put into such a group with <code>\weakgroup name @{ @}</code>
+ is put into such a group with <code>\weakgroup name @{ @}</code>
and into
another group with <code>\[def|addto]group @{ @}</code>, then it will be
placed into the other group without issuing a warning.
@@ -8421,18 +9072,18 @@ make sure you add the following:
<li> Fixed a bug in the LaTeX output generation (empty lists).</li>
<li> Doxygen can now distinguishing f(const A) from f(const B)
even though they match from a syntactical point of view.</li>
-<li> A template base class that is actually an inherited template
- argument of the derived class is no longer shown in the output
+<li> A template base class that is actually an inherited template
+ argument of the derived class is no longer shown in the output
indices and hierarchies.</li>
<li> TOC_EXPAND could result in a broken tree view
(patch by Alexandr Chalpanov).</li>
-<li> If a base class had member names which has the same name as enumerator
- values in a derived class, the enumerator values did not show up in
+<li> If a base class had member names which has the same name as enumerator
+ values in a derived class, the enumerator values did not show up in
the documentation (thanks to John Harris for reporting this).</li>
<li> Applied a number of patches sent by Jens Seidel.</li>
<li> Fixed compiler limit problem on Windows (thanks to Trevor Robinson).</li>
-<li> Add -dBATCH in system calls to ghostscript (needed for formulas)
- to avoid a command prompt for newer versions of ghostscript
+<li> Add -dBATCH in system calls to ghostscript (needed for formulas)
+ to avoid a command prompt for newer versions of ghostscript
(thanks to Marvin Wolfthal).</li>
<li> In some situations doxygen wanted to write a files containing a \n.</li>
<li> Environment variables can now also be used for non-string values
@@ -8449,21 +9100,21 @@ make sure you add the following:
<h1>Doxygen Release 1.2.7</h1>
<h3>Changes</h3>
<ul>
-<li> The configgen tool is now replaced by a more dynamic parser. This
- will allow future output generators to add specific options without
- changing or recompiling the doxygen engine. Doxywizard has also been
- updated to use this new parser. Developers that wish to add new
+<li> The configgen tool is now replaced by a more dynamic parser. This
+ will allow future output generators to add specific options without
+ changing or recompiling the doxygen engine. Doxywizard has also been
+ updated to use this new parser. Developers that wish to add new
configuration options, please look at Config::create() in src/config.l</li>
<li> Changed the way the translators work internally (thanks to Petr
- Prikryl for ideas and code) and updated the documentation regarding
- language support and maintenance. Users of languages other than
- English will get a warning message if the translation for their
+ Prikryl for ideas and code) and updated the documentation regarding
+ language support and maintenance. Users of languages other than
+ English will get a warning message if the translation for their
language is not up to date.</li>
-<li> Did some internal cleaning up to make things
- more consistent and easier to maintain. Please let me know if you
+<li> Did some internal cleaning up to make things
+ more consistent and easier to maintain. Please let me know if you
think something has been broken in the process. </li>
<li> Doxygen now uses a more unique output file name mangling scheme, which
- generates unique file names even if entity names (like class names)
+ generates unique file names even if entity names (like class names)
only differ in case.</li>
<li> Setting ALLEXTERNALS = NO now hides external pages in the page index.</li>
</ul>
@@ -8473,17 +9124,17 @@ make sure you add the following:
<li> \image is now supported for RTF output (thanks to Joe Ninety).</li>
<li> New RTF_EXTENSIONS_FILE that can be used to configure the RTF output
(thanks to Joe Ninety for the patch).</li>
-<li> Added new command \htmlinclude that can be used to include a
- HTML file as is in the HTML documentation.
+<li> Added new command \htmlinclude that can be used to include a
+ HTML file as is in the HTML documentation.
(thanks to Uwe Wojak for the patch)</li>
-<li> &amp;nbsp; can now be put in the documentation to force a
+<li> &amp;nbsp; can now be put in the documentation to force a
non-breakable space.</li>
<li> Included support for the gcc extension #include_next
(thanks to Jac Goudsmit for the patch). </li>
-<li> Included translation for Brazilian Portuguese sent by Fabio Jun
- Takada Chino. Add update for the Czech translation
- (thanks to Petr Prikryl). Also included updates for German
- (thanks to Jens Seidel), Russian (thanks to Alexandr Chelpanov) and
+<li> Included translation for Brazilian Portuguese sent by Fabio Jun
+ Takada Chino. Add update for the Czech translation
+ (thanks to Petr Prikryl). Also included updates for German
+ (thanks to Jens Seidel), Russian (thanks to Alexandr Chelpanov) and
Croatian (thanks to Boris Bralo).</li>
<li> Added RPM spec file update by Jens Seidel.</li>
<li> Added SHORT_NAMES option which can be set to YES to make doxygen
@@ -8500,12 +9151,12 @@ make sure you add the following:
that fixes this).</li>
<li> Specifying a directory at the INPUT that ends with a \ did not
make doxygen recurse the down the directory tree in Windows.</li>
-<li> Fixed two small bugs that caused segfaults on
+<li> Fixed two small bugs that caused segfaults on
NetBSD and Linux on 64bit Alpha's (thanks to Rex McMaster
and Ovidiu Toader).</li>
-<li> "Referenced by" section now starts at a new paragraph
+<li> "Referenced by" section now starts at a new paragraph
(thanks to Joe Ninety).</li>
-<li> Setting OPTIMIZE_OUTPUT_FOR_C still produced some C++-ish
+<li> Setting OPTIMIZE_OUTPUT_FOR_C still produced some C++-ish
sentences for the list of all struct/union fields.</li>
<li> Undocumented friend functions were listed as friend classes.</li>
<li> A CORBA IDL union with a switch was not always recognized correctly. </li>
@@ -8523,11 +9174,11 @@ make sure you add the following:
<li> Generated bookmarks in the RTF output not starting with a letter caused
problems (thanks to Jonathan Beaupre for the fix).</li>
<li> Putting &amp;aring; in the docs wasn't working as expected.</li>
-<li> Fixed a number of typo's in the docs (thanks to Jens Seidel and
+<li> Fixed a number of typo's in the docs (thanks to Jens Seidel and
Philippe Lhoste).</li>
<li> Autolinking could create links inside user defined HTML links.</li>
-<li> Email addresses in the docs starting with an "a" and put inside sharp
- brackets were not properly displayed (thanks to Abramo Bagnara for
+<li> Email addresses in the docs starting with an "a" and put inside sharp
+ brackets were not properly displayed (thanks to Abramo Bagnara for
the fix).</li>
<li> Fix several man page output bugs (thanks a patch by Patrick Ohly). </li>
</ul>
@@ -8549,7 +9200,7 @@ make sure you add the following:
(default is NO).</li>
<li> Added option DOT_CLEANUP that when set to NO leaves the intermediate
dot files in the output directory.</li>
-<li> Added option BINARY_TOC to enable/disable use of a binary table of
+<li> Added option BINARY_TOC to enable/disable use of a binary table of
contents in a .chm file (thanks to Martin Slater for the patch).</li>
<li> Added option TOC_EXPAND to when enabled shows the members of a
group in the treeview and HTML help table of contents (thanks again
@@ -8557,11 +9208,11 @@ make sure you add the following:
<li> Included group support for man page output (thanks to Joe Bester for
the patch).</li>
<li> Added option SHOW_USED_FILES that can be used to disable the
- list of used files normally generated at bottom of the documentation
+ list of used files normally generated at bottom of the documentation
of classes and structs (thanks to Joe Bester).</li>
-<li> Updated the doxbar tool:
+<li> Updated the doxbar tool:
<ul>
- <li> the addin no longer requires administrator privileges to work
+ <li> the addin no longer requires administrator privileges to work
(thanks to Michael Beck)</li>
<li> the existence of files is now checked (thanks to Pekka Pessi).</li>
<li> .odl and .inl files are recognized (thanks to Pekka Pessi).</li>
@@ -8579,29 +9230,29 @@ make sure you add the following:
<li> Fixed IDL union parse problem (thanks to Richard Hash).</li>
<li> Latex output sometimes contained $\ast$ for code fragments.</li>
<li> lonely *'s were not removed inside a &lt;pre&gt; and &lt;code&gt; blocks. </li>
-<li> Applied patch sent by Joe Bester to make the treeview
+<li> Applied patch sent by Joe Bester to make the treeview
javascript work with Mozilla. Still has some problems though.</li>
<li> Fixed a bug in code parser regarding string detection, inside
the argument list of a function.</li>
<li> Using a command alias starting with \class (or other structural
commands) did not give the expected result.</li>
-<li> A function pointer returned as the template argument of a template
- class that itself is the return type of a function was not
+<li> A function pointer returned as the template argument of a template
+ class that itself is the return type of a function was not
parsed properly.</li>
<li> In IDL, typedef's followed by an attribute list where not parsed
properly. </li>
-<li> The list of all members now shows all privately accessible members
+<li> The list of all members now shows all privately accessible members
if EXTRACT_PRIVATE is set to YES, instead of just the non-inherited
private members.</li>
<li> Fixed autolink problem for grouped members.</li>
<li> Multiple static global functions with the same name (but in different
- files), which were forward declared, could make doxygen put
+ files), which were forward declared, could make doxygen put
the wrong documentation block at the wrong global function.</li>
<li> Support for Norwegian was not enabled.</li>
<li> The correct charset is now set when the treeview is used (thanks to
Boris Bralo).</li>
<li> For inline source fragments of member functions, the types
- of the arguments are now also taken into account for
+ of the arguments are now also taken into account for
cross-referencing.</li>
<li> A sentence ending with a dot, directly followed by a \n was not
handled correctly.</li>
@@ -8618,7 +9269,7 @@ make sure you add the following:
<li> Todo items in the documentation of grouped members were not
correctly referenced from the todo list.</li>
<li> Removed bogus "a" entries from appearing in doxysearch's search results.</li>
-<li> Putting &lt;a href="..."&gt;&lt;img src="..."&gt;&lt;/a&gt; in the
+<li> Putting &lt;a href="..."&gt;&lt;img src="..."&gt;&lt;/a&gt; in the
docs will now work as expected for HTML.</li>
<li> Fixed problems with &gt;pre&gt;...&gt;/pre&gt; block in LaTeX.</li>
<li> Putting &amp;ccedil; in the docs now produces a c-cedille.</li>
@@ -8634,7 +9285,7 @@ make sure you add the following:
(see addon/xmlgen).</li>
<li> Having SOURCE_BROWSER set to YES does not automatically
imply that a member is documented.</li>
-<li> Typedefs of classes are now shown in (dot) inheritance graphs with
+<li> Typedefs of classes are now shown in (dot) inheritance graphs with
their typedef name instead of the resolved name.</li>
<li> Upgraded Qt files to 2.2.3 to fix some compile issues.</li>
</ul>
@@ -8643,12 +9294,12 @@ make sure you add the following:
<ul>
<li> Added initial support for Java. The parsing of Java code
should be ok. There is a new "packages" index, with a list
- of all parsed Java packages, each of which can be documented
- (but not yet in the Java way using package.html) and contains
- links to the interfaces and classes in the package. The code
- parser still needs work (It doesn't do much cross-referencing yet).
+ of all parsed Java packages, each of which can be documented
+ (but not yet in the Java way using package.html) and contains
+ links to the interfaces and classes in the package. The code
+ parser still needs work (It doesn't do much cross-referencing yet).
Also any explicit package scope for classes is basically ignored,
- so you cannot have two classes with the same name in different
+ so you cannot have two classes with the same name in different
packages.
Let me know if you know of other improvements.</li>
<li> Added support for the Java style of linking (using
@@ -8660,7 +9311,7 @@ make sure you add the following:
<li> OPTIMIZE_OUTPUT_FOR_C flag that when set to YES makes doxygen produce
output that looks more natural for C programmers.</li>
<li> Included Czech language update sent by Petr Prikryl. </li>
-<li> Added "Binary TOC=YES" and "Create CHI file=YES" to the HtmlHelp
+<li> Added "Binary TOC=YES" and "Create CHI file=YES" to the HtmlHelp
project file for better integration with MSDN.</li>
<li> I've updated the doxbar tool:
<ul>
@@ -8682,7 +9333,7 @@ make sure you add the following:
<li> Links to operators in a "See also" section did only work if the
arguments list was given.</li>
<li> Fixed parse bug in the code parser for the case where "&lt;"
- and "&gt;" were found on a line but couldn't possibly be a
+ and "&gt;" were found on a line but couldn't possibly be a
template scope.</li>
<li> The "More..." links was incorrect for members of class grouped
with @ingroup.</li>
@@ -8694,16 +9345,16 @@ make sure you add the following:
<li> Local references to page anchors did not work.</li>
<li> Windows only: doxygen leaked process handles while running dot
(thanks to Jeroen ter Hofstede for the fix).</li>
-<li> Undefining (with #undef) a define set using PREDEFINED now
+<li> Undefining (with #undef) a define set using PREDEFINED now
longer has an effect.</li>
<li> Functions appeared twice in modules if the prototype and definition
did not match exactly.</li>
<li> the word "operator" in todo items caused problems.</li>
-<li> Fixed some more problems with references to external pages,
- local references to sections, and naming conflicts with multiple
+<li> Fixed some more problems with references to external pages,
+ local references to sections, and naming conflicts with multiple
todo/test lists.</li>
<li> "char a:1, b:2" resulting in output including both bitfields for b.</li>
-<li> The protection level of the members in the all-member list was not
+<li> The protection level of the members in the all-member list was not
always correct.</li>
<li> Fixed some typos in the Dutch and German translations.</li>
<li> \todo's in the docs of #define did not end up on the todo list.</li>
@@ -8724,10 +9375,10 @@ make sure you add the following:
description in the compound list. </li>
<li> User defined groups (a.k.a. modules) are now shown in a hierarchy.</li>
<li> If a function and its prototype are both inside different documented
- files then they may both be documented separately and will appear
- as such in their file documentation
+ files then they may both be documented separately and will appear
+ as such in their file documentation
If you only document the header file and not the source
- file you can still put your documentation in front of the function
+ file you can still put your documentation in front of the function
definition as before.</li>
<li> For unresolved base classes of a class inside a namespace, doxygen
now guesses they are defined outside the namespace (was inside).</li>
@@ -8738,28 +9389,28 @@ make sure you add the following:
<h3>New features</h3>
<ul>
<li> There is now an HTML Help like tree view, that can be enabled
- by setting GENERATE_TREEVIEW to YES.
+ by setting GENERATE_TREEVIEW to YES.
This feature requires a browser that supports frames and javascript.
- Note that frame/page-resizing requires a manual reload with
+ Note that frame/page-resizing requires a manual reload with
Netscape 4.x at the moment (it is a known netscape bug).
(thanks to Ken Wong for providing the code to generate the tree
in the proper format).</li>
<li> Added new option TREEVIEW_WIDTH that can be used to set the initial
with of the treeview frame.</li>
-<li> A warning is now generated for invalid \link targets
+<li> A warning is now generated for invalid \link targets
(again thanks to Ken Wong).</li>
<li> Wang Weihan sent an update for the Chinese translation which is now
included. Included update for the Russian and Italian language as well.</li>
-<li> Support for Borland C++ and MINGW compilers for Windows
+<li> Support for Borland C++ and MINGW compilers for Windows
(thanks to Oliver Brandt for the patch). </li>
<li> Groups and pages defined in external documentation (i.e. with tag files)
can now be referenced using \ref.</li>
<li> Pages can now be put into groups using \ingroup (thanks to Ken Wong).
- A group with only pages is rendered as a page (the group itself)
+ A group with only pages is rendered as a page (the group itself)
with subsections (the inserted pages). </li>
<li> \ingroup can now be put in a one line comments (thanks to Patrick Ohly)</li>
-<li> \ingroup in a comment block before a comma separated list of
- variables is now applied to all variables (as is the documentation
+<li> \ingroup in a comment block before a comma separated list of
+ variables is now applied to all variables (as is the documentation
itself). (thanks to Patrick Ohly for the patch)</li>
<li> @{ .. @} blocks can now be used for normal groups as well
(thanks to Trevor Robinson for the patch). Here is an example:
@@ -8769,7 +9420,7 @@ make sure you add the following:
* @{
*/
- /** @name My member group
+ /** @name My member group
* @{
*/
/** This is a function */
@@ -8799,9 +9450,9 @@ make sure you add the following:
<ul>
<li> If source files were put in the input before header files, the
- declaration against definition matching did not work for
+ declaration against definition matching did not work for
global functions (thanks to Frank Warmerdam for reporting this). </li>
-<li> The template argument type and name of template functions
+<li> The template argument type and name of template functions
were not separated by a space.</li>
<li> A comma separated list of member reference variables (like int &amp;i,&amp;j;)
was not parsed correctly.</li>
@@ -8814,7 +9465,7 @@ make sure you add the following:
definition.</li>
<li> REPEAT_BRIEF = NO now works for class, namespace and file documentation
as well.</li>
-<li> No macro-expansion was done on a file that was #include'd in a body
+<li> No macro-expansion was done on a file that was #include'd in a body
of a class or enum.</li>
<li> Fixed macro concatenation bug in the preprocessor.</li>
<li> Global functions that were \ingroup'd could appear twice in a group
@@ -8822,7 +9473,7 @@ make sure you add the following:
<li> % and &amp; can now be used in the URL in the documentation.</li>
<li> \c,\e and \b now also generate a link if they have the name of a
documented file as their argument.</li>
-<li> Made the FILTER_SOURCE_FILES actually do something
+<li> Made the FILTER_SOURCE_FILES actually do something
(it was always treated as enabled).</li>
<li> Fixed two bugs in the autolist feature (thanks to Ken Wong)</li>
<li> Fix macro expansion bug in the preprocessor, when macro's
@@ -8830,16 +9481,16 @@ make sure you add the following:
<li> // did not work inside the argument of a \todo or \test command. </li>
<li> Doxygen did not parse arrays of function pointers properly.</li>
<li> Fixed parse bug for templates with nested template arguments.</li>
-<li> Fixed parsing problem for template arguments
+<li> Fixed parsing problem for template arguments
containing &lt;&lt; or &gt;&gt; operators</li>
<li> Fixed some problems with the DOT_PATH config option on windows.</li>
<li> Group title and file names are now shown in the latex index instead
of the label names.</li>
-<li> Portability: Added workaround for SGI MipsPro compiler, that
- (hopefully) prevents it from crashing while compiling doxygen.
+<li> Portability: Added workaround for SGI MipsPro compiler, that
+ (hopefully) prevents it from crashing while compiling doxygen.
Worked around a number of compile problems with HP's C++ compiler.</li>
<li> Fixed problem with doxygen calling epstopdf.bat in Windows.</li>
-<li> Fixed some problems that occurred when regenerating the
+<li> Fixed some problems that occurred when regenerating the
doxygen manual on Windows.</li>
<li> Fixed some output formatting problems regarding templates. </li>
<li> Global functions, typedefs, and enums did not get linked when
@@ -8856,10 +9507,10 @@ make sure you add the following:
<li> <code>JAVADOC_AUTOBRIEF</code> is now set to NO by default, because too many
people expect the JavaDoc-style to behave as the Qt-style and
not in the way described in the JavaDoc spec.</li>
-<li> The distribution now includes the part of Qt-2.2.0 that is needed for
- compilation of doxygen, doxytag, and doxysearch. I've also created the
- missing files for Windows. This allows compilation of doxygen on systems
- without X11 or the full Qt. For doxywizard Qt-2.2.x is still required
+<li> The distribution now includes the part of Qt-2.2.0 that is needed for
+ compilation of doxygen, doxytag, and doxysearch. I've also created the
+ missing files for Windows. This allows compilation of doxygen on systems
+ without X11 or the full Qt. For doxywizard Qt-2.2.x is still required
however.</li>
</ul>
<h3>New features</h3>
@@ -8874,48 +9525,48 @@ make sure you add the following:
sections. (__published: is just treated as public:).</li>
<li> Included update for the Czech language. Thanks to Wang Weihan there is
also support for Chinese output now.</li>
-<li> Added a config option <code>WARN_LOGFILE</code> to log warnings to a
+<li> Added a config option <code>WARN_LOGFILE</code> to log warnings to a
file for those
- people that have to use certain "operating systems" that do not support
+ people that have to use certain "operating systems" that do not support
redirection of stderr to file.</li>
<li> Added a config option <code>GENERATE_LEGEND</code> that can be used to disable the
legend page normally generated for explaining dot graphs.</li>
<li> Thanks to a patch send by Micha Bieber, doxygen can now be run from
inside doxywizard.</li>
-<li> Environment variables can now be used in the <code>@INCLUDE_PATH</code>
- and <code>@INCLUDE</code> tags in the config file (thanks to Stephen
+<li> Environment variables can now be used in the <code>@INCLUDE_PATH</code>
+ and <code>@INCLUDE</code> tags in the config file (thanks to Stephen
Goudge).</li>
<li> Windows compilation/installation instructions are updated (thanks to
Petr Prikryl)</li>
-<li> New config tag <code>ENUM_VALUES_PER_LINE</code> to set the number of
+<li> New config tag <code>ENUM_VALUES_PER_LINE</code> to set the number of
enum values
that are grouped on one line (default=4).</li>
<li> #include's inside the body of a class are now expanded. </li>
-<li> The source browser files can now by filtered using the
- <code>INPUT_FILTER</code> if <code>FILTER_SOURCE_FILES</code> is set
+<li> The source browser files can now by filtered using the
+ <code>INPUT_FILTER</code> if <code>FILTER_SOURCE_FILES</code> is set
to YES (thanks to Paul Strauss).</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li> For #foo in member documentation doxygen was trying to find
a global variable named foo instead of a member. Use ::foo
- to make an explicit link to a global variable in case there is
+ to make an explicit link to a global variable in case there is
also a member named foo. </li>
<li> A bullet list ending with a \par sometimes caused the paragraph to
be indented.</li>
<li> When <code>STRIP_CODE_COMMENTS</code> was set to NO, and /*!&lt; .. */ style
comments were used, the code parser got out of sync with the
documentation parser.</li>
-<li> (Hopefully) fixed some Solaris compile problems
+<li> (Hopefully) fixed some Solaris compile problems
(thanks to John Sturton).</li>
<li> documentation for private slots appeared in the documentation even
though <code>EXTRACT_PRIVATE</code> was set to NO.</li>
-<li> \relates was not working for nested classes or classes defined
+<li> \relates was not working for nested classes or classes defined
within a namespace.</li>
<li> namespace alias support was broken with respect to inheritance
relations containing aliased namespace names.</li>
-<li> The documentation of members that are put into a
- group (with \ingroup) is now removed from the natural
+<li> The documentation of members that are put into a
+ group (with \ingroup) is now removed from the natural
container of the member. Also the links are now corrected.</li>
<li> Links from the code parser to static global functions are
now always pointing to the correct file (thanks to Bill Soudan
@@ -8929,14 +9580,14 @@ make sure you add the following:
<li> Doxygen no longer generates source files for input files that
end with .doc or .txt</li>
<li> Fixed argument matching problem that could result in parameter name
- changes for overloaded functions. Also fixed buglet for
+ changes for overloaded functions. Also fixed buglet for
matching things like "unsigned int" against "unsigned int name"</li>
<li> Fixed qtools compile problem with ./configure --english-only problem</li>
<li> Putting documentation between the class and its body now also works
if the class has base classes.</li>
-<li> Fixed parse problem for const function pointers like
+<li> Fixed parse problem for const function pointers like
"int* (* const name)(long);"</li>
-<li> Slightly changed the HTML output to work around display "bugs" in
+<li> Slightly changed the HTML output to work around display "bugs" in
Konquerer and Opera (thanks to Achim Spangler).</li>
<li> Examples in compress HTML help of doxygen's manual has absolute links.</li>
</ul>
@@ -8945,7 +9596,7 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> Verbatim headers are now also created if a documented header
- file does not contain a struct or class (unless VERBATIM_HEADERS = NO
+ file does not contain a struct or class (unless VERBATIM_HEADERS = NO
of course).</li>
<li> For member groups, where only the first member is documented, that
documentation is no longer automatically copied to all other
@@ -8956,15 +9607,15 @@ make sure you add the following:
<h3>New features</h3>
<ul>
<li> Added support for KDE-2 IDL (more specific: k_dcop member sections).</li>
-<li> New ALIASES config option which allows you to add one or more user
- defined aliases (a.k.a. macros) that can be used as commands in the
+<li> New ALIASES config option which allows you to add one or more user
+ defined aliases (a.k.a. macros) that can be used as commands in the
documentation. For instance:
<pre>
ALIASES = "sideeffect=\par Side Effects:\n"
</pre>
allows you to put @sideeffect in the documentation, which doxygen
- will replace by "\par Side Effects:", before parsing. As a result
- a formatted paragraph with a "Side Effects" header will appear.
+ will replace by "\par Side Effects:", before parsing. As a result
+ a formatted paragraph with a "Side Effects" header will appear.
Note that the \n's are replaced by real newlines, so in the example
you can put your paragraph text directly after the sideeffect command.</li>
<li> Added language support for Hungarian (Thanks to György Földvári),
@@ -8974,14 +9625,14 @@ make sure you add the following:
<li> Added support for namespace aliases.</li>
<li> Added RTF patch from Alexander Bartolich. Here is his description of
the changes:
- "The following patch of rtfgen.cpp allows to read *complete* style
- definitions from rtfstyle. This includes \sbasedon, \snext, \additive
+ "The following patch of rtfgen.cpp allows to read *complete* style
+ definitions from rtfstyle. This includes \sbasedon, \snext, \additive
and actual style names.
If this data is missing the default value is used.
This means old rtfstyle-files can be used without change, with one
exception:
- Reset is no longer considered a style. Since unknown style names
+ Reset is no longer considered a style. Since unknown style names
are simply ignored I don't consider this a big problem.
There is no means to write rtfstyle in old format, however.
"</li>
@@ -8991,12 +9642,12 @@ make sure you add the following:
<h3>Bug fixes</h3>
<ul>
<li> RTF output was broken w.r.t. dot generated images. </li>
-<li> Spacing and blanks inside &lt;pre&gt; ... &lt;/pre&gt; block were not
+<li> Spacing and blanks inside &lt;pre&gt; ... &lt;/pre&gt; block were not
properly preserved.</li>
<li> Fixed lock-up when parsing "enum A { A };"</li>
<li> If INLINE_INFO was set to NO an empty property list could be put after
the function definitions.</li>
-<li> Fixed source code linking for the following cases:
+<li> Fixed source code linking for the following cases:
<code>A::func().func2()</code>
and <code>a[2]-&gt;func()</code>.</li>
<li> \em %className did not remove the %</li>
@@ -9004,7 +9655,7 @@ make sure you add the following:
documentation.</li>
<li> Fixed a bug in the auto list generation.</li>
<li> \latexonly inside brief description did not work properly.</li>
-<li> "Referenced By" list did not include constructors with
+<li> "Referenced By" list did not include constructors with
inline initializers.</li>
<li> &amp;auml; and such were not parsed when used as the argument of a section.</li>
<li> A struct inheriting from a base class was marked as private inheritance
@@ -9012,7 +9663,7 @@ make sure you add the following:
<li> The autobreak routine for long return types was sometimes skipping
characters. </li>
<li> Class usage relations should now also appear in the collaboration
- diagrams for classes within the same namespace, without explicitly
+ diagrams for classes within the same namespace, without explicitly
having to mention the namespace.</li>
</ul>
@@ -9028,23 +9679,23 @@ make sure you add the following:
item indicating where the todo item was found. The todo list (and
all todo items) can be disabled by setting GENERATE_TODOLIST to NO.</li>
<li> &lt;pre&gt; ... &lt;/pre&gt; blocks now behave as in plain HTML instead of
- \code ... \endcode blocks. This also works for LaTeX of course.
- These blocks differ from \verbatim ... \endverbatim blocks in that
+ \code ... \endcode blocks. This also works for LaTeX of course.
+ These blocks differ from \verbatim ... \endverbatim blocks in that
commands can be used inside these blocks.</li>
</ul>
<h3>New features</h3>
<ul>
-<li> Added rudimentary support for XML output. Still very much work in
+<li> Added rudimentary support for XML output. Still very much work in
progress... You can enable it by setting GENERATE_XML to YES.
- There is a small utility (based on Qt &amp; Xerces-C) in addon/xmlread
- that uses the SAX interface to read a generated XML file and then dumps
+ There is a small utility (based on Qt &amp; Xerces-C) in addon/xmlread
+ that uses the SAX interface to read a generated XML file and then dumps
the class hierarchy contained in it.</li>
<li> Thanks to a patch sent by Christophe Prud'homme, doxygen now has a new
option USE_PDFLATEX that when set to YES makes doxygen use
pdflatex instead of latex to generate refman.pdf. The
result is a document with higher quality fonts.</li>
-<li> Added a \test command that works similar to \todo and can be used to
- describe test cases. Doxygen will generate a page containing a list
+<li> Added a \test command that works similar to \todo and can be used to
+ describe test cases. Doxygen will generate a page containing a list
of all test cases. To disable the list set GENERATE_TESTLIST to NO.
Thanks to Dave Murrell for the idea and the initial code.</li>
<li> For each list option in the config file += can now be used to append
@@ -9067,42 +9718,42 @@ make sure you add the following:
</pre>
Credits go to Joerg Baumann.</li>
<li> Included French and Czech language updates from Mathieu Despriée and
- Petr Prikryl. Also included a language update for German from
+ Petr Prikryl. Also included a language update for German from
Raimund Klein.</li>
-<li> Doxygen will now do give proper warnings for formulas that do not
+<li> Doxygen will now do give proper warnings for formulas that do not
end properly.</li>
<li> Improved error reporting for illegal list combinations (thanks to
Joerg Baumann for the patch)</li>
-<li> Comments from the code example in the dot graph "legend page" was
+<li> Comments from the code example in the dot graph "legend page" was
stripped if STRIP_CODE_COMMENTS was set to YES.</li>
<li> In the config file "@INCLUDE = file" can now be used to include
part of a configuration file. "@INCLUDEPATH = dir1 dir2 ..." can
be put in front of it to add search paths (default is $PWD).
Thanks to Joerg Baumann for the patch.</li>
-<li> Added alphabetical quick indices for compound, file and namespace
+<li> Added alphabetical quick indices for compound, file and namespace
member lists.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li> Running ghostscript on Windows for generating formulas was done
asynchronously, resulting in ghostscript trying to access temporary
- files that may already have been deleted by doxygen. Thanks to Robert
+ files that may already have been deleted by doxygen. Thanks to Robert
Golias for the code to fix this.</li>
<li> Include dependency graphs failed to get included in LaTeX because
- \includegraphics did not like the dots in the generated file names.
+ \includegraphics did not like the dots in the generated file names.
Those dots are now escaped by underscores.</li>
-<li> The \remark did not end a brief description in JavaDoc comments,
+<li> The \remark did not end a brief description in JavaDoc comments,
resulting in a error in the generated LaTeX.</li>
-<li> "<code>operator &gt;&gt;</code>" was not matched against
+<li> "<code>operator &gt;&gt;</code>" was not matched against
"<code>operator&gt;&gt;</code>" </li>
<li> the (required) space after \addindex ended up in the LaTeX index,
causing all generated entries to be placed after the user added entries.</li>
-<li> "<code>typedef class A&lt;B&gt; a;</code>" is now correctly handled in inheritance
+<li> "<code>typedef class A&lt;B&gt; a;</code>" is now correctly handled in inheritance
relations. </li>
<li> Fixed some typos in the manual</li>
<li> <code>\c Class::func(arg)</code> was not autolinked.</li>
<li> Doxygen stopped reading from stdin after 4096 bytes.</li>
-<li> In code fragments no autolinks for local variables or
+<li> In code fragments no autolinks for local variables or
dereferenced arguments were generated for template classes.</li>
<li> autolinking to a namespace member foo from within a class scope also
having a member foo did not work. </li>
@@ -9114,18 +9765,18 @@ make sure you add the following:
\textwidth as the width or height. </li>
<li> After expanding an environment variable in the config file, the
next environment variable was searched starting at the wrong position.</li>
-<li> Fixed LaTeX/RTF labelname collisions between members of files and
+<li> Fixed LaTeX/RTF labelname collisions between members of files and
groups, and between classes and groups with the same name.</li>
-<li> HTML image map partly appeared in RTF output when built-in class
+<li> HTML image map partly appeared in RTF output when built-in class
diagrams were used causing the RTF file to be truncated.</li>
<li> Inheritance relation was not determined correctly in case a base
class was imported from another namespace via a using declaration.</li>
-<li> Todo and test items defined with \class or related block, where
+<li> Todo and test items defined with \class or related block, where
sometimes missing from The todo &amp; test</li>
-<li> Preprocessor: Multi-line #define's where not properly parsed &amp; colored
+<li> Preprocessor: Multi-line #define's where not properly parsed &amp; colored
on windows due to \r's</li>
-<li> Preprocessor: expansion of <code>M(x)A</code>, where M is a macro
- that expands to mx, resulted in
+<li> Preprocessor: expansion of <code>M(x)A</code>, where M is a macro
+ that expands to mx, resulted in
"<code>mxA</code>", instead of "<code>mx A</code>"</li>
<li> Fixed compile problem with Qt-2.2.0beta1</li>
</ul>
@@ -9135,8 +9786,8 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> <code>CASE_SENSE_NAMES</code> is now enabled by default.</li>
-<li> In LaTeX <code>.eps</code> images are now included using the
- graphicx package instead of epsfig to simplify the use of pdflatex
+<li> In LaTeX <code>.eps</code> images are now included using the
+ graphicx package instead of epsfig to simplify the use of pdflatex
(thanks to Pier Giorgio for showing me how that works).</li>
<li> Reimplemented the <code>system()</code> call for Unix, so doxygen becomes
interruptible when calling external tools such as dot.</li>
@@ -9147,35 +9798,35 @@ make sure you add the following:
<ul>
<li> Grzegorz Kowal added support for the Polish language. His patch
is now included. </li>
-<li> A <code>\par</code> command without title argument can now be used to
+<li> A <code>\par</code> command without title argument can now be used to
add a new paragraph with the same indent under the heading of
- another command (such as <code>\par</code>, <code>\param</code>,
+ another command (such as <code>\par</code>, <code>\param</code>,
<code>\note</code>, etc...) </li>
<li> Added a legend page explaining the various arrows and box colorings
for the class diagrams generated by dot.</li>
<li> Merged update for Croatian language.</li>
-<li> Relative paths are now also allowed for the
+<li> Relative paths are now also allowed for the
<code>STRIP_FROM_PATH</code> tag.</li>
<li> Added a new section to the manual explaining the use of tag files
- in more detail. Also move the contents of the INSTALL file into
+ in more detail. Also move the contents of the INSTALL file into
the "installation" section of the manual.</li>
-<li> Added <code>ps_2on1</code> and <code>pdf_2on1</code> targets to the
+<li> Added <code>ps_2on1</code> and <code>pdf_2on1</code> targets to the
Makefile generated in the
- LaTeX directory. These can be used to generate manual with 2
+ LaTeX directory. These can be used to generate manual with 2
logical pages on 1 physical pages (Thanks to Onno).</li>
<li> Merged Czech language update from Petr Prikryl. Merged Spanish
language update sent by Lucas Cruz. </li>
-<li> Added standard GNU long options <code>--help</code> and
+<li> Added standard GNU long options <code>--help</code> and
<code>--version</code>.</li>
-<li> Added a <code>-w</code> option that can be used to generate template
+<li> Added a <code>-w</code> option that can be used to generate template
style sheet files for RTF, HTML, Latex. Thanks to Alexander Bartolich
for the idea and part of the implementation.</li>
<li> Merged patch from Steve Hespelt, which adds a new configuration
- option: <code>INCLUDE_FILE_PATTERNS</code>. This tag can be used to
- set the file patterns for the include files (if left empty the
- <code>FILE_PATTERNS</code> will be used, which was also the old
+ option: <code>INCLUDE_FILE_PATTERNS</code>. This tag can be used to
+ set the file patterns for the include files (if left empty the
+ <code>FILE_PATTERNS</code> will be used, which was also the old
behaviour). </li>
-<li> Added a couple of commands for kdoc compatibility: <code>@p</code>,
+<li> Added a couple of commands for kdoc compatibility: <code>@p</code>,
<code>@li</code>, <code>@em</code>.
Also made @ref a bit less strict.</li>
<li> Portuguese translation by Rui Lopes. </li>
@@ -9189,14 +9840,14 @@ make sure you add the following:
class B
{
public:
- void (B::*pmf)();
+ void (B::*pmf)();
};
/*! \var void (B::*B::pmf)()
* docs for this class member.
*/
</pre>
-
+
did not work.</li>
<li> Library blocks inside M$-IDL files are now also processed
(a library is treated as a namespace at the moment). </li>
@@ -9213,9 +9864,9 @@ make sure you add the following:
<li> Fixed some compiler warning on Solaris.</li>
<li> Changed grey by grey50 in dot.cpp to avoid PDF conversion problems.</li>
<li> A &lt;/pre&gt; that was not preceded by a whitespace was ignored </li>
-<li> The methods operator&lt;() and operator&lt;&lt;() were not
+<li> The methods operator&lt;() and operator&lt;&lt;() were not
automatically linked anymore.</li>
-<li> Some special characters in LaTeX were eating up the blanks that
+<li> Some special characters in LaTeX were eating up the blanks that
followed them.</li>
<li> The built-in C preprocessor did not evaluate the following to TRUE:
<pre>
@@ -9225,31 +9876,31 @@ make sure you add the following:
...
#endif
</pre></li>
-<li> Improved code parsing a bit: things like
- <code>getClass()-&gt;func()</code> and
- <code>(*pb)-&gt;func()</code> should now work. Also the scope of the
- body is correctly detected in case of inline constructor initializers
+<li> Improved code parsing a bit: things like
+ <code>getClass()-&gt;func()</code> and
+ <code>(*pb)-&gt;func()</code> should now work. Also the scope of the
+ body is correctly detected in case of inline constructor initializers
like: <code>A() : m_a(10) { ... }</code></li>
-<li> File index is now in (path,name) lexical order, instead of (name,path)
+<li> File index is now in (path,name) lexical order, instead of (name,path)
order. The file index is also only generated once instead of twice ;-)</li>
-<li> Typedefs to structs in C-style did (still) not get resolved as "usage"
+<li> Typedefs to structs in C-style did (still) not get resolved as "usage"
relations for the collaboration diagrams.</li>
<li> Fixed some HTML output typos reported by Onno Kortmann (who used
the tool "html tidy" on the generated output).</li>
<li> Merged a patch from Paul Lieverse that should solve the empty image
map problems on Solaris.</li>
-<li> If the title of a <code>\defgroup</code> contained a documented class, a
+<li> If the title of a <code>\defgroup</code> contained a documented class, a
nested (and thus broken) link was generated. </li>
<li> Externally defined variable were treated as variable definitions. </li>
<li> If a file only had a verbatim header but no documentation, a
link broken link was added to the HTML help TOC.</li>
-<li> Fixed "member with no name" warning that occurred when a enum's
+<li> Fixed "member with no name" warning that occurred when a enum's
last value ended with a comma and the enum was inside a member group.</li>
-<li> A &lt;dl&gt; type of list with multiple &lt;dd&gt;'s did not give
+<li> A &lt;dl&gt; type of list with multiple &lt;dd&gt;'s did not give
the correct output in LaTeX.</li>
-<li> <code>SORT_MEMBER_DOCS</code> is <code>NO</code> only worked for
+<li> <code>SORT_MEMBER_DOCS</code> is <code>NO</code> only worked for
class members.</li>
-<li> Both the prototype and the definition of a global function
+<li> Both the prototype and the definition of a global function
appeared in a <code>\defgroup</code>.</li>
<li> Fixed some visual problems with operator links in source code
fragments.</li>
@@ -9280,20 +9931,20 @@ make sure you add the following:
<li> Added a new config option HIDE_SCOPE_NAMES that can be set to YES
to hide the namespace and class scopes that are put in the
documentation and diagrams.</li>
-<li> added a new type of graph, that can be used to visualize
- which files #include (i.e. depend on) a given file. This graph is
+<li> added a new type of graph, that can be used to visualize
+ which files #include (i.e. depend on) a given file. This graph is
enabled by setting HAVE_DOT and INCLUDED_BY_GRAPH to YES.</li>
<li> added new configuration option EXTRACT_STATIC that can be used
to enable/disable the extraction of static file members. The behavior
of this option used to be linked with EXTRACT_PRIVATE.</li>
-<li> Added two new configuration options MAX_DOT_GRAPH_WIDTH and
+<li> Added two new configuration options MAX_DOT_GRAPH_WIDTH and
MAX_DOT_GRAPH_HEIGHT that let the user configure how big the
generated dot graph may become.</li>
<li> Added a new configuration option EXPAND_AS_DEFINED that can
- be used in combination with PREPROCESSING = YES, MACRO_EXPANSION = YES,
+ be used in combination with PREPROCESSING = YES, MACRO_EXPANSION = YES,
and EXPAND_PREDEF_ONLY = YES, to expand a given list of macro names,
as they are defined in the sources.</li>
-<li> Merged Alexander Bartolich's RTF style sheet patch.
+<li> Merged Alexander Bartolich's RTF style sheet patch.
A new config option RTF_STYLESHEET_FILE is now available with which you
can specify a style sheet file. The style sheet file should contain
a list of assignments. The assignments can be used to overwrite the
@@ -9301,10 +9952,10 @@ make sure you add the following:
<li> Added a new command @since for JavaDoc compatibility.</li>
<li> Added two new commands: \remarks and \attention that work in a
similar way as \warning, \pre, \post, et al.</li>
-<li> If SOURCE_BROWSER = YES, each member function documentation
- now includes a list of member functions that call the member
+<li> If SOURCE_BROWSER = YES, each member function documentation
+ now includes a list of member functions that call the member
somewhere in their body. </li>
-<li> RCS/CVS tags of the form $word:text$ are now nicely typeset in the
+<li> RCS/CVS tags of the form $word:text$ are now nicely typeset in the
documentation.</li>
<li> Providing all members of an enum with the same documentation can
now be done with member grouping like this:
@@ -9329,7 +9980,7 @@ make sure you add the following:
int getFunc2();
//@}
- /*@{ @name Set functions
+ /*@{ @name Set functions
* Functions for setting values.
*/
void setFunc1(int v);
@@ -9338,25 +9989,25 @@ make sure you add the following:
</pre></li>
<li> Merged Czech language support patches send by Petr Prikryl. Also
removed some obsolete methods from the translator files.</li>
-<li> Call chains like <code>a-&gt;b()-&gt;c()</code> are now followed
+<li> Call chains like <code>a-&gt;b()-&gt;c()</code> are now followed
by the code parser so <code>c()</code> is linked if documented. </li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li> the warning message in case of ambiguous file matches was containing
a bogus <code>%s</code>, which could even crash doxygen.</li>
-<li> An autolist followed by a \retval, \param, or \exception did
+<li> An autolist followed by a \retval, \param, or \exception did
produced invalid output, resulting in a compile error in LaTeX. </li>
<li> " has a special meaning in LaTeX when the german babel package
is loaded. Doxygen now produces proper output for text containing
quotes.</li>
<li> The title of a related page was not properly parsed, causing
- HTML special characters to end up in the output for some languages
+ HTML special characters to end up in the output for some languages
(German for instance). </li>
<li> The hierarchy shown in the "Contents" part of the html help
browser did not properly show the hierarchy when it contained
undocumented classes. </li>
-<li> explicit compound specifiers in the return type could lead to
+<li> explicit compound specifiers in the return type could lead to
parse problems. Example:
<pre>
enum SomeEnumType_e Func()
@@ -9371,13 +10022,13 @@ make sure you add the following:
and links to the correct reimplemented member are generated.</li>
<li> \ingroup did not work when grouping enums</li>
<li> members of a module were not cross-referenced with the sources.</li>
-<li> Function pointers like <code>void ( *func )()</code> where not
- correctly parsed because of the extra spacing between
+<li> Function pointers like <code>void ( *func )()</code> where not
+ correctly parsed because of the extra spacing between
the `(' and the `*'. </li>
<li> The const in void <code>func(int * const val /*&lt; a value. */);</code>
was named part of the name, instead of the type.</li>
<li> Removed bogus warning in case of global function pointer variables.
- Function pointers inside namespaces and member function pointers
+ Function pointers inside namespaces and member function pointers
did also produce bogus warnings.</li>
<li> Fixed a misalignment problem with inline source fragments.
Also the initializer list after a colon is now included in an inline
@@ -9398,42 +10049,42 @@ make sure you add the following:
This was already possible for functions.</li>
<li> Due to a bracket counting bug, throw clauses where not always
parsed properly.</li>
-<li> Fixed a parse bug for the following code-pattern:
+<li> Fixed a parse bug for the following code-pattern:
<pre>
void Class::
// Comment
method() {}
</pre></li>
-<li> With the newer Qt versions (2.1.x), passing a null string as the first
- argument of <code>QRegExp::match</code> seems no longer be allowed,
+<li> With the newer Qt versions (2.1.x), passing a null string as the first
+ argument of <code>QRegExp::match</code> seems no longer be allowed,
so I added some extra checks to avoid potential crashes.</li>
<li> The title of the documentation of a template class now explicitly
states that it is a template. (For non-English languages,
- this still requires a change to trCompoundReference() in
+ this still requires a change to trCompoundReference() in
translator_xx.h).</li>
<li> Fixed a problem with matching methods of template classes.</li>
-<li> commenting out a section or subsection with <code>&lt;!-- --&gt;</code>
+<li> commenting out a section or subsection with <code>&lt;!-- --&gt;</code>
did not work.</li>
-<li> Fixed some inconsistencies in the configuration page of
+<li> Fixed some inconsistencies in the configuration page of
the documentation.</li>
-<li> Some operators like <code>operator[]()</code>,
+<li> Some operators like <code>operator[]()</code>,
<code>operator|()</code> and <code>operator!()</code>
did not appear correctly in the LaTeX index.</li>
<li> If an include file name matched a directory name, then the
- directory could be found first in the INCLUDE_PATH. This resulted in a
+ directory could be found first in the INCLUDE_PATH. This resulted in a
scanner error.</li>
-<li> Fixed parse problems that occurred when &lt;&lt; or &gt;&gt; was
+<li> Fixed parse problems that occurred when &lt;&lt; or &gt;&gt; was
part of a template argument list.</li>
<li> Fixed some more parse problems that occurred when parsing base classes
that were nested templates.</li>
-<li> variables whose name started
- with an _ like <code>struct {int x; } _var;</code>
+<li> variables whose name started
+ with an _ like <code>struct {int x; } _var;</code>
where not properly parsed.</li>
-<li> LaTeX formulas did not work in the brief description of a JavaDoc
+<li> LaTeX formulas did not work in the brief description of a JavaDoc
style block that was put after an item.</li>
<li> Empty group definitions were not properly handled.</li>
<li> References to pages using \ref did not work in LaTeX.</li>
-<li> Members that are typedef's to classes are now shown in the
+<li> Members that are typedef's to classes are now shown in the
collaboration diagram.</li>
</ul>
@@ -9442,16 +10093,16 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
-<li> The member definition that is put before the detailed
+<li> The member definition that is put before the detailed
documentation section should now be layouted a bit better for members
of classes with lots of template arguments.</li>
<li> The HTML pages now have a new doxygen logo at the bottom. This logo has
- a transparent background and no shadow or anti-aliasing, so it looks
+ a transparent background and no shadow or anti-aliasing, so it looks
equally nice on all backgrounds.</li>
<li> If the first member of a member group is documented, this documentation
is now repeated for all undocumented members of that group. </li>
<li> The following is now treated as one parameter list with two
- parameters, instead of two lists with one parameter each.
+ parameters, instead of two lists with one parameter each.
<pre>
/*!
* @param a the first parameter
@@ -9490,17 +10141,17 @@ make sure you add the following:
void Member3();
};
</pre></li>
-<li> Added three new configuration options:
+<li> Added three new configuration options:
<ul>
<li>WARN_IF_UNDOCUMENTED which can be used to turn on or off warning
message related to undocumented entities. This works independently
- of the WARNING tag, which is there to enable/disable all
+ of the WARNING tag, which is there to enable/disable all
other warning messages.</li>
<li>WARN_FORMAT which can be used to specify the format of the warnings
produced by doxygen. The argument is a free form string
- that must contain a $file, $line and $text marker.
- The $file and $line markers will be replaced by the file name and line
- number from where the warning originated.
+ that must contain a $file, $line and $text marker.
+ The $file and $line markers will be replaced by the file name and line
+ number from where the warning originated.
The $text marker will be replaced by the actual warning text.
The default argument format string is: <code>"$file:$line: $text"</code>.</li>
<li>DOT_PATH that can be used to specify the path
@@ -9529,17 +10180,17 @@ make sure you add the following:
Using of individual functions remains unsupported.</li>
<li> collaboration and include dependency graph are now also included
in the LaTeX documentation.</li>
-<li> Thanks to Tim Mensch, doxygen has now has a \todo command, which
- can be used put todo items in the documentation.
- All items will automatically be cross-referenced with a
+<li> Thanks to Tim Mensch, doxygen has now has a \todo command, which
+ can be used put todo items in the documentation.
+ All items will automatically be cross-referenced with a
(generated) todo list. Here is an example:
<pre>
- /*! \mainpage
+ /*! \mainpage
* \todo write something useful here.
*/
/*! A class
- * \todo Add more comments here
+ * \todo Add more comments here
*/
class Test
{
@@ -9564,10 +10215,10 @@ make sure you add the following:
/*! A macro */
#define AMACRO 11
- //@{
+ //@{
/*! F1 macros */
- #define F1_0 0
- #define F1_1 (F1_0 + 1)
+ #define F1_0 0
+ #define F1_1 (F1_0 + 1)
#define F1_2 (F1_1 + 2)
//@}
@@ -9578,11 +10229,11 @@ make sure you add the following:
member attributes instead of return types.</li>
<li> the index page is now added to the HTML help contents.</li>
<li> In case "no matching member" is found, a list of possible
- (but non-matching) candidates is generated along with the warning.
+ (but non-matching) candidates is generated along with the warning.
This makes it much easier to see what's wrong. </li>
-<li> added two new commands:
+<li> added two new commands:
<ul>
- <li>\hideinitializer which can be put in the documentation to
+ <li>\hideinitializer which can be put in the documentation to
a variable or the define to hide the initializer or define value.</li>
<li>\showinitializer which can be used to explicitly show the
initializer of a variable or the value of a define even if it
@@ -9591,7 +10242,7 @@ make sure you add the following:
</ul>
<h3>Bug fixes</h3>
<ul>
-<li> Fixed a lock-up problem, that occurred when
+<li> Fixed a lock-up problem, that occurred when
parsing a code fragment containing something like:
<pre>
//
@@ -9600,25 +10251,25 @@ make sure you add the following:
*/
</pre>
while STRIP_CODE_COMMENTS was set to NO </li>
-<li> The auto list feature was still broken.
- Due to a bad scanner rule, things like -1 at the start of a line
- were treated as a list items (again) and a list at the end of a
+<li> The auto list feature was still broken.
+ Due to a bad scanner rule, things like -1 at the start of a line
+ were treated as a list items (again) and a list at the end of a
comment block did not always work either.</li>
<li> If an non-existent config file was specified, the directories
"html", "man" and "latex" were created anyway.</li>
-<li> A fragment like: os <code>&lt;&lt; "&gt;"</code> was misinterpreted
+<li> A fragment like: os <code>&lt;&lt; "&gt;"</code> was misinterpreted
by doxygen's code parser.</li>
<li> Parameter declarations that differ only in the presence or absence
of const and/or volatile are now treated as equivalent, as is
dictated by the C++ standard.</li>
<li> The inline function body was wrong in the following example:
<pre>
- void f(
- int i ///&lt; Parameter
- )
- {
- return 1;
- }
+ void f(
+ int i ///&lt; Parameter
+ )
+ {
+ return 1;
+ }
</pre>
Thanks to Alexander Gidon for the fix.</li>
<li> typedef'ed classes are now also resolved in code fragments
@@ -9634,22 +10285,22 @@ make sure you add the following:
<li> #includes in code fragments where not hyperlinked. Operator
methods were also not correctly recognized.</li>
<li> C/C++ comments inside initializers where not handled properly.</li>
-<li> If the type of an argument of a member definition was prefixed
- with a (redundant) scope name of an indirect base class,
+<li> If the type of an argument of a member definition was prefixed
+ with a (redundant) scope name of an indirect base class,
then it was not matched against the member declaration if that
omitted the scope.</li>
<li> \name did not work within //! comments</li>
<li> When FULL_PATH_NAMES was set to YES, doxygen did no longer
- distinguish between files with the same name (but in
+ distinguish between files with the same name (but in
different directories). </li>
<li> The file match routine now does an case-insensitive lookup
- if CASE_SENSE_NAMES = NO. Hopefully this is enough to
+ if CASE_SENSE_NAMES = NO. Hopefully this is enough to
let doxygen ignore case differences in file names on Windows.</li>
<li> The constructors and destructors of classes inside namespaces
or other classes did not end up in the constructor/destructor
section of the documentation.</li>
-<li> If an environment variable in the config file starts with a space
- followed by a list of words, the space ends up in the first word
+<li> If an environment variable in the config file starts with a space
+ followed by a list of words, the space ends up in the first word
after expansion.</li>
<li> A &lt;table&gt; inside a JavaDoc style comment block caused a bogus
warning.</li>
@@ -9657,7 +10308,7 @@ make sure you add the following:
LaTeX, causing a error while compiling the documentation.</li>
<li> Fixed a missing stdlib.h problem in doxywizard, which occurred
on non-Linux systems.</li>
-<li> The generation of dot include graphs did not work properly in
+<li> The generation of dot include graphs did not work properly in
case file names with space were used.</li>
<li> back-references from source-lines to documentation only worked for
those members of a member group that were explicitly documented.</li>
@@ -9675,9 +10326,9 @@ make sure you add the following:
<li> Changed the way anonymous enums are handled: they are now handled
just like named enums, which makes the "Enumeration Values" section
obsolete.</li>
-<li> If
+<li> If
<pre>
- /*! \file */
+ /*! \file */
</pre>
is put into a file (thus without further documentation) then the
file is treated as being documented.</li>
@@ -9691,16 +10342,16 @@ make sure you add the following:
</pre>
The front-end requires Qt 2.x to build. I've only tested with Qt-2.1.
Sources can be found in the addon directory.</li>
-<li> To make it very easy to add new configuration options, doxygen
+<li> To make it very easy to add new configuration options, doxygen
now has an additional tool called configgen. All options supported
by doxygen are now located in one place (in configgen.cpp).
- From this the configuration parser and part of the GUI are
+ From this the configuration parser and part of the GUI are
generated. You only need configgen if you want to add new options
to doxygen. Thanks go to Joerg Baumann for providing the ideas
and part of the code.</li>
<li> Added a bit of syntax highlighting to the generated source
- fragments in HTML (only keywords, comments and preprocessor directives
- are colored for now). The font color &amp; style is determined by
+ fragments in HTML (only keywords, comments and preprocessor directives
+ are colored for now). The font color &amp; style is determined by
the style sheet, so it is easy to customize :-)</li>
<li> Typedefs of classes are now resolved when the inheritance
and usage relation of classes is determined.</li>
@@ -9708,14 +10359,14 @@ make sure you add the following:
<ol>
<li>Now it uses the translator for the table of contents entry names
for the sections.</li>
- <li>writeSection now puts braces around the entry so the formatting
+ <li>writeSection now puts braces around the entry so the formatting
doesn't get messed up so easily. </li>
<li>removed extra newline in startDescList </li>
<li>writeSectionRef now writes out "title (p.pagnum)" like it should.</li>
<li>writeSectionRefAnchor now just calls writeSectionRef. </li>
</ol></li>
-<li> Doxygen's preprocessor now supports the non-ANSI "#else if"
- preprocessor construction, which some other preprocessors seem to
+<li> Doxygen's preprocessor now supports the non-ANSI "#else if"
+ preprocessor construction, which some other preprocessors seem to
accept as well.</li>
<li> Boris Bralo added language support for the Croatian language.
Nickolay Semyonov has finished the translation to Russian, which is
@@ -9742,7 +10393,7 @@ make sure you add the following:
<li> <code>\c func()</code> did not autolink to function "func" anymore. </li>
<li> template members with multiple arguments were misaligned
in the HTML output. </li>
-<li> Since 1.1.2, environment variable expansion in the config
+<li> Since 1.1.2, environment variable expansion in the config
file always resulted in a single string for each expanded variable
(just as if quotes were put around the environment variable).
The old behavior is restored again.</li>
@@ -9753,22 +10404,22 @@ make sure you add the following:
<li> fixed a problem in the namespace strip routine that could potentially
lock up doxygen.</li>
<li> Long pre-initialized arrays ended up in the documentation.</li>
-<li> Friend functions that were documented at the declaration were
+<li> Friend functions that were documented at the declaration were
cross-referenced to the wrong file when using SOURCE_BROWSER=YES.</li>
-<li> When EXTRACT_ALL=YES was used, classes that were
+<li> When EXTRACT_ALL=YES was used, classes that were
documented with \class appeared twice in the namespace documentation.</li>
<li> Setting HIDE_UNDOC_CLASS=YES could result in an incorrectly
indented textual class hierarchy. This should now be fixed.</li>
<li> Members with very long return types caused all member names to
- be pushed to the right in the HTML documentation
+ be pushed to the right in the HTML documentation
(if HTML_ALIGN_MEMBERS was YES). Now some line breaks are inserted
at the proper places.</li>
-<li> A couple of people reported that doxygen crashed while it was generating
- dot graphs. The cause was likely to be multiple frees of the same
- pointer (but I have not been able to reproduce the crash myself).
+<li> A couple of people reported that doxygen crashed while it was generating
+ dot graphs. The cause was likely to be multiple frees of the same
+ pointer (but I have not been able to reproduce the crash myself).
I've now reimplemented the deletion routine of the dot graph
representation, which hopefully fixes this problem.</li>
-<li> Elements of the configuration options in lists, which used quotes
+<li> Elements of the configuration options in lists, which used quotes
were broken up into smaller pieces anyway. This most notably broke
PREDEFINED in some cases that worked before.</li>
<li> Detailed description was present for classes, files and namespaces
@@ -9780,24 +10431,24 @@ make sure you add the following:
following situation:
<pre>
template &lt;class T&gt; class A { public: class inner { }; };
- template &lt;class T&gt; class B : public A&lt;T&gt;
- { public: class inner : public A&lt;T&gt;::inner { }; };
+ template &lt;class T&gt; class B : public A&lt;T&gt;
+ { public: class inner : public A&lt;T&gt;::inner { }; };
</pre> </li>
-<li> Fixed a bug that prevented the header links of the search engine
+<li> Fixed a bug that prevented the header links of the search engine
from working.</li>
<li> Undocumented classes &amp; enums made it in the file documentation even if
HIDE_UNDOC_MEMBERS was set to YES.</li>
<li> Backslashes in includes like
<pre>
- #include "..\blah.h"
+ #include "..\blah.h"
</pre>
did not end up in the include dependency graph.</li>
<li> If ALPHABETICAL_INDEX=YES but there were no documented classes, part
- of the LaTeX output (doxygen.sty a.o.) was not generated
+ of the LaTeX output (doxygen.sty a.o.) was not generated
(Thanks to Markus Lepper for reporting this).</li>
<li> Doxygen can now match arguments containing an explicit namespace
- qualifier against arguments containing an implicit qualifier
- (i.e. imported via a using directive).
+ qualifier against arguments containing an implicit qualifier
+ (i.e. imported via a using directive).
An example (thanks to Karl Stroetmann):
<pre>
/*! a class */
@@ -9805,10 +10456,10 @@ make sure you add the following:
{
public:
void resolve(const std::vector&lt;int&gt;&amp;);
- };
- using namespace std;
+ };
+ using namespace std;
/*! a member */
- void Test::resolve(const vector&lt;int&gt;&amp;) {}
+ void Test::resolve(const vector&lt;int&gt;&amp;) {}
</pre> </li>
<li> Template specifiers are now shown in dot generated
collaboration graphs.</li>
@@ -9854,17 +10505,17 @@ make sure you add the following:
*/
</pre></li>
<li> Again thanks to Joerg Baumann, URLs and mail addresses are now
- hyperlinked in the PDF output
+ hyperlinked in the PDF output
(=latex with <code>PDF_HYPERLINKS = YES</code>).</li>
<li> Added support for member grouping. I reimplemented this
- from scratch. I decided to follow the doc++ syntax for the member
- grouping. Here are two examples.
+ from scratch. I decided to follow the doc++ syntax for the member
+ grouping. Here are two examples.
<p>
- <b>Usage:</b> A group is defined by a <code>//@{ .. //@}</code> block
- (or <code>/*@{*/../*@}*/</code> if
- you're addicted to C style comments :-) Nesting of groups is not
- allowed. Before the opening marker of a block a separate comment
- block should be placed. This block should contain the @name
+ <b>Usage:</b> A group is defined by a <code>//@{ .. //@}</code> block
+ (or <code>/*@{*/../*@}*/</code> if
+ you're addicted to C style comments :-) Nesting of groups is not
+ allowed. Before the opening marker of a block a separate comment
+ block should be placed. This block should contain the @name
(or \name) command to specify the header of the group.
</p>
<p>
@@ -9911,7 +10562,7 @@ make sure you add the following:
<b>Example2:</b> Combining member groups with @defgroup.
</p>
<pre>
- /** @defgroup globals Global Functions
+ /** @defgroup globals Global Functions
* Functions that may be used in any translation unit.
*/
@@ -9956,38 +10607,38 @@ make sure you add the following:
included. Jens Breitenstein sent an update for the German translation.
Philippe Lhoste sent some bug fixes for the French translation.
Alessandro Falappa sent an updated of the Italian translation, which
- is now included. Nickolay Semyonov added initial support for the
+ is now included. Nickolay Semyonov added initial support for the
Russian language. I updated the Dutch translation.</li>
-<li> Thanks to Matthias Andree, the doxygen source package
- now contains a .spec file. This can be used to build an .rpm package
+<li> Thanks to Matthias Andree, the doxygen source package
+ now contains a .spec file. This can be used to build an .rpm package
for doxygen.
doing:
<pre>
rpm -ta doxygen-x.y.z.src.tar.gz
</pre>
will create the rpm (in /usr/src/packages/RPMS/i386/ on my machine).
- Running <code>rpm -Uhv</code> as root on the .rpm file will
- install/update doxygen.
+ Running <code>rpm -Uhv</code> as root on the .rpm file will
+ install/update doxygen.
After that you can use <code>rpm -e doxygen</code> to uninstall it again.</li>
-<li> Umlauts and other accents in the documentation now appear properly in
+<li> Umlauts and other accents in the documentation now appear properly in
generated RTF output. </li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li> Fixed bug in the generated config file (LATEX_BATCHMODE)</li>
-<li> When updating the config file, <code>TAB_SIZE</code> and
+<li> When updating the config file, <code>TAB_SIZE</code> and
<code>COLS_IN_ALPHA_INDEX</code>
- were reset to their default values. Environment variables in
- the config file are no longer replaced by their value when updating
+ were reset to their default values. Environment variables in
+ the config file are no longer replaced by their value when updating
the config file. </li>
<li> The version.cpp file is now automatically updated when creating
a source/cvs package.</li>
-<li> The types of arguments that are prefixed with a namespace scope
+<li> The types of arguments that are prefixed with a namespace scope
are now be matched against non-prefixed names. Example:
<pre>
namespace std { class string {}; }
//! A class
- class Test {
+ class Test {
public:
void test(std::string a);
};
@@ -9995,12 +10646,12 @@ make sure you add the following:
//! A member
void Test::test(string a);
</pre>
- <b>Note:</b> The namespace definition has to be part of the
+ <b>Note:</b> The namespace definition has to be part of the
input sources for this to work!</li>
<li> Fixed a bug in structure of the graphical class hierarchy
(thanks to Paul Bohme for pointing me at this bug)</li>
<li> Non-function members can now also be documented if they
- are inside anonymous namespaces, which themselves are nested in
+ are inside anonymous namespaces, which themselves are nested in
named namespaces.</li>
<li> #defines can now grouped with \defgroup and \ingroup as well.</li>
<li> fixed a bug in the latex output of groups (thanks to Gregory Kurz
@@ -10015,16 +10666,16 @@ make sure you add the following:
class Test {};
</pre>
Doxygen now ends the brief description when a &lt;table&gt; tag is encountered.</li>
-<li> \c and \b now also accept numbers and other printable characters,
+<li> \c and \b now also accept numbers and other printable characters,
instead of only identifiers.</li>
<li> Autolinking did not work if a member with arguments was specified
in the documentation and that member had a const or volatile postfix
- in the code. Autolinking did not also not work if a member with
+ in the code. Autolinking did not also not work if a member with
arguments contained digits (thanks to Fred Labrosse for pointing me
at this bug).</li>
<li> The first line was missed if @code was used for generating man pages.
(Thanks to Joe Bester for the patch). </li>
-<li> <code>\link create_link(long,int&amp;) bla \endlink</code>
+<li> <code>\link create_link(long,int&amp;) bla \endlink</code>
now works (doxygen was confused by the arguments before).</li>
<li> A brief description after a function definition, followed by a detailed
description now works as expected. Example:
@@ -10042,20 +10693,20 @@ make sure you add the following:
//!&lt; Brief.
//!&lt; More brief.
</pre></li>
-<li> \latexonly fragments were put on a single line causing problems
+<li> \latexonly fragments were put on a single line causing problems
when latex comments (%'s) are used. </li>
<li> The license file that came with doxygen was of LGPL, while it
should be GPL. The correct license file is included now.</li>
-<li> The heading of the alphabetical index was duplicated if
+<li> The heading of the alphabetical index was duplicated if
classes were present in both upper and lower case.</li>
<li> If ENABLE_PREPROCESSING=NO and the INPUT_FILTER was used, doxygen
did not filter properly can could even block on input!</li>
<li> Internationalization should now output proper characters with qt-2.1x.</li>
<li> If namespace contained a function prototype &amp; a function definition
they both ended up in the documentation.</li>
-<li> &lt;table&gt; without &lt;/table&gt; could cause doxygen to crash. Now a
+<li> &lt;table&gt; without &lt;/table&gt; could cause doxygen to crash. Now a
warning is given.</li>
-<li> Multiline variable and enum initializers with lots of spaces were
+<li> Multiline variable and enum initializers with lots of spaces were
shown in an ugly way.</li>
</ul>
@@ -10066,9 +10717,9 @@ make sure you add the following:
<h3>Changes</h3>
<ul>
<li> "Reimplements" for a member now points to the most direct
- base class that overrides the member instead of the base
+ base class that overrides the member instead of the base
class containing the vtable.</li>
-<li> classes, namespaces, and members are now sorted
+<li> classes, namespaces, and members are now sorted
in a case insensitive way (like in a dictionary).
Was case sensitive.</li>
<li> Kenji Nagamatsu has send me an update for the Japanese translation
@@ -10084,53 +10735,53 @@ make sure you add the following:
is set to NO the member documentation will appear in declaration
order (as was the case with version 1.0.0 and older). </li>
<li> Corba IDL exceptions are now also supported by doxygen.
- If you do not want to put the documentation in front of the
+ If you do not want to put the documentation in front of the
exception you can use \idlexcept command which behaves like \class.</li>
<li> Local file:/// URLs are now automatically linked when put in the
documentation.</li>
-<li> For \class and other structural commands you can now use
- a backslash (\) at the end of a line to continue the command on
- the next line.
+<li> For \class and other structural commands you can now use
+ a backslash (\) at the end of a line to continue the command on
+ the next line.
Example:
<pre>
\class Abstract_Server_Session_Implementation \
Abstract_Server_Session_Implementation.h \
- ATD/Abstract_Server_Session_Implementation.h
+ ATD/Abstract_Server_Session_Implementation.h
</pre></li>
<li> "make distclean" now removes all generated stuff and results in a
- package that is more clean than a normal source package
+ package that is more clean than a normal source package
(i.e. the generated flex &amp; bison code is removed). </li>
<li> Added command \note (and @note) for a "Note:" paragraph.</li>
-<li> Multi arguments can now be given as a comma separated list
+<li> Multi arguments can now be given as a comma separated list
after a \param or \retval command. Example:
<pre>
- void Zoom( int aX1, int aY1, int aX2, int aY2 );
- /*! Zoom into the data.
- * \param aX1, aY1 Upper left corner.
- * \param aX2, aY2 Lower right corner.
+ void Zoom( int aX1, int aY1, int aX2, int aY2 );
+ /*! Zoom into the data.
+ * \param aX1, aY1 Upper left corner.
+ * \param aX2, aY2 Lower right corner.
*/
</pre></li>
-<li> Added 9 new class declaration sections:
+<li> Added 9 new class declaration sections:
Public/Protected/Private Types, for member typedefs &amp; variables.
[Static] Public/Protected/Private Attributes, for member variables.</li>
<li> Doxygen now has a new command line option -u, that can be used
- to upgrade an old configuration file without losing the values that
+ to upgrade an old configuration file without losing the values that
where edited. In combination with the -s option this can also be used
to strip comments from or add comments to a configuration file.</li>
<li> Added a new tag LATEX_BATCHMODE that makes latex run in batch mode.
This will run latex non-interactively, and not stop at the first
- problem encountered. If the tag is enabled this mode will also be
+ problem encountered. If the tag is enabled this mode will also be
used when generation formulas for inclusion in the HTML documentation.</li>
<li> The \ingroup command can now also be used to group a number of
members. The only limitation is that a member can currently be in
- one group only (classes, files &amp; namespaces do
+ one group only (classes, files &amp; namespaces do
not have this limitation). </li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li> The graphical class hierarchy was not properly generated when
template classes were used.</li>
-<li> Template specialization could not be documented using the
+<li> Template specialization could not be documented using the
\class command. This is now fixed. Example:
<pre>
/*!
@@ -10138,17 +10789,17 @@ make sure you add the following:
* My template specialization of template T.
*/
</pre></li>
-<li> Fixed a bug when parsing M$-IDL code, containing
+<li> Fixed a bug when parsing M$-IDL code, containing
helpstring("bla") attributes. The attributes of a method are no longer
- shown in the documentation (the attributes of method arguments
+ shown in the documentation (the attributes of method arguments
still visible however).</li>
<li> Improved the search algorithm that tries to connect classes with their
- base classes. It should now (hopefully) work correct in all cases
+ base classes. It should now (hopefully) work correct in all cases
where nested classes and/or namespaces are used. </li>
<li> Fixed a scanner problem that could cause doxygen to get
confused after parsing struct initializers.</li>
<li> the DOTFONTPATH environment variable is now automatically set
- for Windows. This should make any "missing doxfont.ttf"
+ for Windows. This should make any "missing doxfont.ttf"
messages disappear.</li>
<li> the extra LaTeX packages specified with EXTRA_PACKAGES can now
also be used when generating formulas for HTML. </li>
@@ -10157,14 +10808,14 @@ make sure you add the following:
<li> Fixed a HTML output bug in the class/file group-pages.</li>
<li> Links to example files generated with \link ... \endlink where not
correct. </li>
-<li> made the bullet list generation more robust. A space is now required
+<li> made the bullet list generation more robust. A space is now required
after the - sign. A list can now start a paragraph.</li>
<li> the configure script now detects whether or not dot is installed.</li>
<li> The VERBATIM_HEADERS option didn't have any effect any more.
It should now work again as advertised.</li>
<li> The IGNORE_PREFIX option can now also deal with a list of prefixes.</li>
<li> @verbatim ... @endverbatim blocks did not work. </li>
-<li> removed some \n's from the systems calls that run dot. This appears to
+<li> removed some \n's from the systems calls that run dot. This appears to
cause problems for some people and was not what I intended anyway :^)</li>
<li> The following construct was not working:
<pre>
@@ -10172,14 +10823,14 @@ make sure you add the following:
/*! let's go to the bar */
class foo::bar { };
</pre></li>
-<li> Members inside anonymous namespaces nested inside named namespaces
+<li> Members inside anonymous namespaces nested inside named namespaces
were not properly handled. </li>
<li> When documenting template specializations with the \class command,
the second argument was not interpreted correctly.</li>
-<li> Interface inheritance relations are now always public for IDL
+<li> Interface inheritance relations are now always public for IDL
interfaces.</li>
<li> Templetized related functions showed a double `template' line.</li>
-<li> Related function that had a declaration and a definition
+<li> Related function that had a declaration and a definition
also appeared in file documentation but without documentation. </li>
<li> Links to files of the include dependency graph were
non existent in some situations.</li>
@@ -10189,7 +10840,7 @@ make sure you add the following:
<li> The graphical class hierarchy always contained all external class,
regardless of the ALLEXTERNALS flag.</li>
<li> operator~() was grouped with the constructor/destructors.</li>
-<li> In a number of cases, documented include files, that were
+<li> In a number of cases, documented include files, that were
shown in the include dependency diagram where not found to be
documented. As a result the diagram was often not clickable and
incomplete.</li>
@@ -10214,8 +10865,8 @@ make sure you add the following:
<pre>
/** \union XYZ
* \brief The XYZ union.
- */
- union XYZ switch ( ABC )
+ */
+ union XYZ switch ( ABC )
{
case A: D_VAR m_d; ///&lt; Docs for a member in case A
case B: E_VAR m_e; ///&lt; Docs for a member in case B
@@ -10242,22 +10893,22 @@ make sure you add the following:
<h3>New features</h3>
<ul>
-<li> Thanks to Parker Waechter, doxygen now has a new output format: RTF.
- This is Microsoft's "portable" document format. Due to the great
- "portability" of this format the output produced by doxygen will
+<li> Thanks to Parker Waechter, doxygen now has a new output format: RTF.
+ This is Microsoft's "portable" document format. Due to the great
+ "portability" of this format the output produced by doxygen will
probably only look nice with Microsoft's Word 97.
<p>
- RTF is currently disabled by default. You can set GENERATE_RTF to
+ RTF is currently disabled by default. You can set GENERATE_RTF to
YES to enable it. The directory where the RTF output is put, can
be specified using the RTF_OUTPUT tag in the configuration file.
COMPACT_RTF can be enabled to generate more compact RTF.
RTF_HYPERLINKS can be used to generate HTML like cross references
in the document. </p></li>
-<li> Doxygen can now use the "dot" tool from graphviz 1.5, which is an
- open-sourced, cross-platform graph drawing toolkit from AT&amp;T and
+<li> Doxygen can now use the "dot" tool from graphviz 1.5, which is an
+ open-sourced, cross-platform graph drawing toolkit from AT&amp;T and
Lucent Bell Labs.
<p>
- Graphviz can be found at
+ Graphviz can be found at
<a href="https://www.graphviz.org/">https://www.graphviz.org/</a>
If you have the "dot" tool available in the path, you can set
HAVE_DOT to YES in the configuration file to let doxygen use it.
@@ -10266,7 +10917,7 @@ make sure you add the following:
</p>
<ul>
<li>if GRAPHICAL_HIERARCHY is set to YES, a graphical representation
- of the overall inheritance diagram will be drawn,
+ of the overall inheritance diagram will be drawn,
along with the textual one (currently supported for HTML only).</li>
<li>if INCLUDE_GRAPH is set to YES, an include dependency graph
is generated for each documented file that includes at least one
@@ -10274,29 +10925,29 @@ make sure you add the following:
<li>if COLLABORATION_GRAPH is set to YES, a graph is drawn for each
documented class and struct that shows:
<ul>
- <li> the inheritance relation with base classes
+ <li> the inheritance relation with base classes
(using solid blue/green/red arrows, for public,protected,private
inheritance).</li>
- <li> the containment relations with other structs
+ <li> the containment relations with other structs
and class (using purple dashed arrows with variable names as labels)
(currently supported for HTML and RTF only)</li>
</ul></li>
</ul>
<p>
- For the include dependency graph and the collaboration graph,
+ For the include dependency graph and the collaboration graph,
doxygen will render a transitive closure of the relation. If
the diagram becomes too large (currently wider than 1024 pixels),
- only the maximum graph depth (as seen from the root of the
- graph) that still fits will be drawn. (the nodes that can still be
+ only the maximum graph depth (as seen from the root of the
+ graph) that still fits will be drawn. (the nodes that can still be
expanded are shown with a red border in this case).
</p><p>
For HTML all graphs are drawn as client side clickable image maps.</p></li>
-<li> Each file now has a list the files it includes
+<li> Each file now has a list the files it includes
(with links to the sources if available)</li>
<li> For class documentation it is now possible to choose how the
- <code>#include</code> statement should look like
- (i.e. like "stdio.h" or &lt;stdio.h&gt;).
- This can be done using the third argument of
+ <code>#include</code> statement should look like
+ (i.e. like "stdio.h" or &lt;stdio.h&gt;).
+ This can be done using the third argument of
the <code>\class</code> command.
Example: <pre>\class myclass myclass.h "mydir/myclass.h"</pre></li>
<li> If the - character is used as the first character in a comment line
@@ -10318,23 +10969,23 @@ make sure you add the following:
*/
</pre>
- Notice: tabs can be used for indenting, but the TAB_SIZE tag in the
+ Notice: tabs can be used for indenting, but the TAB_SIZE tag in the
configuration file must be set correctly!</li>
<li> Function/member arguments can now be documented, like this
<pre>
- /*! This function finds the first occurrence of a
- * substring in a string.
+ /*! This function finds the first occurrence of a
+ * substring in a string.
*/
char *strstr(const char *haystack, /*!&lt; the string to search in. */
- const char *needle) /*!&lt; the substring to search for. */
+ const char *needle) /*!&lt; the substring to search for. */
{
}
</pre></li>
-<li> Three new section commands <code>\pre</code>, <code>\post</code> and
+<li> Three new section commands <code>\pre</code>, <code>\post</code> and
<code>\invariant</code> are added to describe
preconditions, postconditions and invariants respectively.</li>
-<li> Variable/enum initializers and define definitions are
- now included in documentation (unless the initializer/definition
+<li> Variable/enum initializers and define definitions are
+ now included in documentation (unless the initializer/definition
is more than 30 lines long)</li>
<li> Added new configuration option IGNORE_PREFIX that can be
used to ignore a specified prefix while generating the alphabetical
@@ -10345,7 +10996,7 @@ make sure you add the following:
<ul>
<li> All defines were shown as function macros in the documentation section.</li>
<li> Fixed bug with parsing multi-line defines on Windows (\r problem). </li>
-<li> Protection level of members inside nested anonymous compounds was not
+<li> Protection level of members inside nested anonymous compounds was not
set correctly.</li>
<li> Class diagram was not correct in case the same class was inherited
via two different paths (bug introduced in 1.0.0).</li>
@@ -10357,15 +11008,15 @@ make sure you add the following:
<li> Members that were hidden deep in an inheritance tree, got multiple
scope prefixes in the "all members list", while a scope prefix to
the member in the base class was enough to use it unambiguously.</li>
-<li> <code>\latexonly ... \endlatexonly</code> in the main page produced
+<li> <code>\latexonly ... \endlatexonly</code> in the main page produced
erroneous text in refman.tex</li>
<li> The keywords in header and footer were only evaluated once.</li>
<li> Formulas now also work in documentation blocks that are put after an
item.</li>
<li> The source code could produce links to the wrong class for
- a code fragment like <code>a.f()</code> in
+ a code fragment like <code>a.f()</code> in
case two classes have the same member variable `a', but with a
- different class types and those classes both had the member
+ different class types and those classes both had the member
function `f'.</li>
<li> array type arguments (like int a[2]) where not matched if the argument
name of declaration and definition were different. </li>
diff --git a/doc/commands.doc b/doc/commands.doc
index 3415dce..1465a1e 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -29,7 +29,7 @@ Each argument has a certain range:
<li>If (round) braces are used the argument extends until the end of the line
on which the command was found.
<li>If {curly} braces are used the argument extends until the next paragraph.
- Paragraphs are delimited by a blank line or by a section indicator. Note that
+ Paragraphs are delimited by a blank line or by a section indicator. Note that
{curly} braces are also used for command options, here the braces are mandatory
and just 'normal' characters. The starting curly brace has to directly follow
the command, so without whitespace.
@@ -72,6 +72,7 @@ documentation:
\refitem cmddetails \\details
\refitem cmddiafile \\diafile
\refitem cmddir \\dir
+\refitem cmddocbookinclude \\docbookinclude
\refitem cmddocbookonly \\docbookonly
\refitem cmddontinclude \\dontinclude
\refitem cmddot \\dot
@@ -117,7 +118,7 @@ documentation:
\refitem cmdhideinitializer \\hideinitializer
\refitem cmdhtmlinclude \\htmlinclude
\refitem cmdhtmlonly \\htmlonly
-\refitem cmdidlexcept \\idlexcept
+\refitem cmdidlexcept \\idlexcept
\refitem cmdif \\if
\refitem cmdifnot \\ifnot
\refitem cmdimage \\image
@@ -135,6 +136,7 @@ documentation:
\refitem cmdline \\line
\refitem cmdlink \\link
\refitem cmdmainpage \\mainpage
+\refitem cmdmaninclude \\maninclude
\refitem cmdmanonly \\manonly
\refitem cmdmemberof \\memberof
\refitem cmdmsc \\msc
@@ -142,6 +144,7 @@ documentation:
\refitem cmdn \\n
\refitem cmdname \\name
\refitem cmdnamespace \\namespace
+\refitem cmdnoop \\noop
\refitem cmdnosubgrouping \\nosubgrouping
\refitem cmdnote \\note
\refitem cmdoverload \\overload
@@ -175,6 +178,7 @@ documentation:
\refitem cmdreturn \\return
\refitem cmdreturns \\returns
\refitem cmdretval \\retval
+\refitem cmdrtfinclude \\rtfinclude
\refitem cmdrtfonly \\rtfonly
\refitem cmdsa \\sa
\refitem cmdsecreflist \\secreflist
@@ -190,6 +194,7 @@ documentation:
\refitem cmdsnippet \\snippet
\refitem cmdsnippetdoc \\snippetdoc
\refitem cmdsnippetlineno \\snippetlineno
+\refitem cmdstatic \\static
\refitem cmdstartuml \\startuml
\refitem cmdstruct \\struct
\refitem cmdsubpage \\subpage
@@ -211,6 +216,7 @@ documentation:
\refitem cmdvhdlflow \\vhdlflow
\refitem cmdwarning \\warning
\refitem cmdweakgroup \\weakgroup
+\refitem cmdxmlinclude \\xmlinclude
\refitem cmdxmlonly \\xmlonly
\refitem cmdxrefitem \\xrefitem
\refitem cmddollar \\\$
@@ -382,7 +388,7 @@ Structural indicators
\addindex \\showrefs
When this command is put in a comment block of a function or method,
- then doxygen will generate an overview for that function or method of the
+ then doxygen will generate an overview for that function or method of the
functions and methods that call it.
The overview will be generated regardless of the value of
\ref cfg_references_relation "REFERENCES_RELATION".
@@ -601,7 +607,8 @@ Structural indicators
\par Important:
The documentation of global functions, variables, typedefs, and enums will
- only be included in the output if the file they are in is documented as well.
+ only be included in the output if the file they are in is documented as well
+ or if \ref cfg_extract_all "EXTRACT_ALL" is set to \c YES.
\par Example:
\include file.h
@@ -706,13 +713,13 @@ Structural indicators
this command in a comment block of a define or variable, the
initializer is always hidden. The maximum number of initialization lines
can be changed by means of the configuration parameter
- \ref cfg_max_initializer_lines "MAX_INITIALIZER_LINES", the default
+ \ref cfg_max_initializer_lines "MAX_INITIALIZER_LINES", the default
value is 30.
\sa section \ref cmdshowinitializer "\\showinitializer".
<hr>
-\section cmdidlexcept \\idlexcept <name>
+\section cmdidlexcept \\idlexcept <name>
\addindex \\idlexcept
Indicates that a comment block contains documentation for a
@@ -756,7 +763,7 @@ Structural indicators
\addindex \\interface
Indicates that a comment block contains documentation for an
- interface with name \<name\>. The arguments are equal to the arguments of the
+ interface with name \<name\>. The arguments are equal to the arguments of the
\ref cmdclass "\\class" command.
\sa section \ref cmdclass "\\class".
@@ -1150,7 +1157,7 @@ Structural indicators
\addindex \\struct
Indicates that a comment block contains documentation for a
- struct with name \<name\>. The arguments are equal to the arguments of the
+ struct with name \<name\>. The arguments are equal to the arguments of the
\ref cmdclass "\\class" command.
\sa section \ref cmdclass "\\class".
@@ -1172,7 +1179,7 @@ Structural indicators
\addindex \\union
Indicates that a comment block contains documentation for a
- union with name \<name\>. The arguments are equal to the arguments of the
+ union with name \<name\>. The arguments are equal to the arguments of the
\ref cmdclass "\\class" command.
\sa section \ref cmdclass "\\class".
@@ -1201,7 +1208,7 @@ Description
\addindex \\vhdlflow
This is a VHDL specific command, which can be put in the documentation of a process to
- produce a flow chart of the logic in the process.
+ produce a flow chart of the logic in the process.
Optionally a title for the flow chart can be given.
\note Currently the flow chart will only appear in the HTML output.
@@ -1310,9 +1317,9 @@ Section indicators
The section between \c \\cond and \ref cmdendcond "\\endcond" can be included by
adding its section label to the \ref cfg_enabled_sections "ENABLED_SECTIONS"
configuration option. If the section label is omitted, the section will
- be excluded from processing unconditionally. The section label can be a
+ be excluded from processing unconditionally. The section label can be a
logical expression build of section labels, round brackets, && (AND), || (OR) and ! (NOT).
- If you use an expression you need to wrap it in round brackets, i.e
+ If you use an expression you need to wrap it in round brackets, i.e
<tt>\\cond (!LABEL1 && LABEL2)</tt>.
For conditional sections within a comment block one should
@@ -1460,7 +1467,7 @@ contains \c TEST, or \c DEV
\addindex \\endif
Ends a conditional section that was started by \ref cmdif "\\if" or \ref cmdifnot "\\ifnot"
- For each \ref cmdif "\\if" or \ref cmdifnot "\\ifnot" one and only one matching
+ For each \ref cmdif "\\if" or \ref cmdifnot "\\ifnot" one and only one matching
\ref cmdendif "\\endif" must follow.
\sa sections \ref cmdif "\\if" and \ref cmdifnot "\\ifnot".
@@ -1488,11 +1495,11 @@ contains \c TEST, or \c DEV
with a matching \ref cmdendif "\\endif" command. A conditional section is
disabled by default. To enable it you must put the
section-label after the \ref cfg_enabled_sections "ENABLED_SECTIONS"
- tag in the configuration file.
+ tag in the configuration file.
The section label can be a logical expression
build of section names, round brackets, && (AND), || (OR) and ! (NOT).
- If you use an expression you need to wrap it in round brackets, i.e
+ If you use an expression you need to wrap it in round brackets, i.e
<tt>\\cond (!LABEL1 && LABEL2)</tt>.
Conditional blocks can be nested. A nested section is
@@ -1685,7 +1692,7 @@ void setPosition(double x,double y,double z,double t)
Example:
\verbatim
/** Example of a param command with a description consisting of two paragraphs
- * \param p
+ * \param p
* \parblock
* First paragraph of the param description.
*
@@ -1887,7 +1894,7 @@ void setPosition(double x,double y,double z,double t)
Alternatively, one \c \\version command may mention
several version strings.
The \\version command ends when a blank line or some other
- sectioning command is encountered.
+ sectioning command is encountered.
See section \ref cmdauthor "\\author" for an example.
<hr>
@@ -1988,9 +1995,9 @@ Commands to create links
\addindex \\cite
Adds a bibliographic reference in the text and in the list of bibliographic
- references. The \<label\> must be a valid BibTeX label that can be found
- in one of the .bib files listed in \ref cfg_cite_bib_files "CITE_BIB_FILES".
- For the \LaTeX output the formatting of the reference in the text can be
+ references. The \<label\> must be a valid BibTeX label that can be found
+ in one of the .bib files listed in \ref cfg_cite_bib_files "CITE_BIB_FILES".
+ For the \LaTeX output the formatting of the reference in the text can be
configured with \ref cfg_latex_bib_style "LATEX_BIB_STYLE". For other
output formats a fixed representation is used. Note that using this
command requires the \c bibtex tool to be present in the search path.
@@ -2038,17 +2045,17 @@ Commands to create links
<hr>
\section cmdrefitem \\refitem <name>
\addindex \\refitem
- Just like the \ref cmdref "\\ref" command, this command creates a reference
- to a named section, but this reference appears in a list that is started by
+ Just like the \ref cmdref "\\ref" command, this command creates a reference
+ to a named section, but this reference appears in a list that is started by
\ref cmdsecreflist "\\secreflist"
and ends with \ref cmdendsecreflist "\\endsecreflist".
- An example of such a list can be seen
+ An example of such a list can be seen
\ref showsecreflist "at the top of the page".
<hr>
\section cmdsecreflist \\secreflist
\addindex \\secreflist
- Starts an index list of item, created with \ref cmdrefitem "\\refitem"
+ Starts an index list of item, created with \ref cmdrefitem "\\refitem"
that each link to a named section.
<hr>
@@ -2216,7 +2223,7 @@ Commands for displaying examples
the \c \\dontinclude command.
For line by line descriptions of source files, one or more lines
- of the example can be displayed using the \ref cmdline "\\line",
+ of the example can be displayed using the \ref cmdline "\\line",
\ref cmdskip "\\skip", \ref cmdskipline "\\skipline", and
\ref cmduntil "\\until" commands. An internal pointer is used for these commands. The
\c \\dontinclude command sets the pointer to the first line of the example.
@@ -2371,16 +2378,16 @@ Commands for displaying examples
current file is taken as file to take the snippet from.
For example, the putting the following command in the documentation,
- references a snippet in file \c example.cpp residing in a subdirectory
+ references a snippet in file \c example.cpp residing in a subdirectory
which should be pointed to by \ref cfg_example_path "EXAMPLE_PATH".
\verbatim
\snippet snippets/example.cpp Adding a resource
\endverbatim
- The text following the file name is the unique identifier for the snippet.
- This is used to delimit the quoted code in the relevant snippet file as
- shown in the following example that corresponds to the above \c \\snippet
+ The text following the file name is the unique identifier for the snippet.
+ This is used to delimit the quoted code in the relevant snippet file as
+ shown in the following example that corresponds to the above \c \\snippet
command:
\code
@@ -2457,8 +2464,8 @@ Commands for displaying examples
\section cmdverbinclude \\verbinclude <file-name>
\addindex \\verbinclude
- This command includes the file \<file-name\> verbatim in the documentation.
- The command is equivalent to pasting the file in the documentation and
+ This command includes the contents of the file \<file-name\> verbatim in the documentation.
+ The command is equivalent to pasting the contents of the file in the documentation and
placing \ref cmdverbatim "\\verbatim" and \ref cmdendverbatim "\\endverbatim"
commands around it.
@@ -2469,8 +2476,9 @@ Commands for displaying examples
\section cmdhtmlinclude \\htmlinclude ["[block]"] <file-name>
\addindex \\htmlinclude
- This command includes the file \<file-name\> as is in the HTML documentation.
- The command is equivalent to pasting the file in the documentation and
+ This command includes the contents of the file \<file-name\> as is in the HTML documentation
+ and tagged with `<htmlonly>` in the generated XML output.
+ The command is equivalent to pasting the contents of the file in the documentation and
placing \ref cmdhtmlonly "\\htmlonly" and \ref cmdendhtmlonly "\\endhtmlonly"
commands around it.
@@ -2484,21 +2492,81 @@ Commands for displaying examples
Files or directories that doxygen should look for can be specified using the
\ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
- \sa section \ref cmdhtmlonly "\\htmlonly".
+ \sa section \ref cmdhtmlonly "\\htmlonly".
<hr>
\section cmdlatexinclude \\latexinclude <file-name>
\addindex \\latexinclude
- This command includes the file \<file-name\> as is in the \LaTeX documentation.
- The command is equivalent to pasting the file in the documentation and
+ This command includes the contents of the file \<file-name\> as is in the \LaTeX documentation
+ and tagged with `<latexonly>` in the generated XML output.
+ The command is equivalent to pasting the contents of the file in the documentation and
placing \ref cmdlatexonly "\\latexonly" and \ref cmdendlatexonly "\\endlatexonly"
commands around it.
Files or directories that doxygen should look for can be specified using the
\ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
- \sa section \ref cmdlatexonly "\\latexonly".
+ \sa section \ref cmdlatexonly "\\latexonly".
+<hr>
+
+\section cmdrtfinclude \\rtfinclude <file-name>
+
+ \addindex \\rtfinclude
+ This command includes the contents of the file \<file-name\> as is in the RTF documentation
+ and tagged with `<rtfonly>` in the generated XML output.
+ The command is equivalent to pasting the contents of the file in the documentation and
+ placing \ref cmdrtfonly "\\rtfonly" and \ref cmdendrtfonly "\\endrtfonly"
+ commands around it.
+
+ Files or directories that doxygen should look for can be specified using the
+ \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
+
+ \sa section \ref cmdrtfonly "\\rtfonly".
+<hr>
+
+\section cmdmaninclude \\maninclude <file-name>
+
+ \addindex \\maninclude
+ This command includes the contents of the file \<file-name\> as is in the MAN documentation
+ and tagged with `<manonly>` in the generated XML output.
+ The command is equivalent to pasting the contents of the file in the documentation and
+ placing \ref cmdmanonly "\\manonly" and \ref cmdendmanonly "\\endmanonly"
+ commands around it.
+
+ Files or directories that doxygen should look for can be specified using the
+ \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
+
+ \sa section \ref cmdmanonly "\\manonly".
+<hr>
+
+\section cmddocbookinclude \\docbookinclude <file-name>
+
+ \addindex \\docbookinclude
+ This command includes the contents of the file \<file-name\> as is in the DocBook documentation
+ and tagged with `<docbookonly>` in the generated XML output.
+ The command is equivalent to pasting the contents of the file in the documentation and
+ placing \ref cmddocbookonly "\\docbookonly" and \ref cmdenddocbookonly "\\enddocbookonly"
+ commands around it.
+
+ Files or directories that doxygen should look for can be specified using the
+ \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
+
+ \sa section \ref cmddocbookonly "\\docbookonly".
+<hr>
+
+\section cmdxmlinclude \\xmlinclude <file-name>
+
+ \addindex \\xmlinclude
+ This command includes contents of the the file \<file-name\> as is in the XML documentation.
+ The command is equivalent to pasting the contents of the file in the documentation and
+ placing \ref cmdxmlonly "\\xmlonly" and \ref cmdendxmlonly "\\endxmlonly"
+ commands around it.
+
+ Files or directories that doxygen should look for can be specified using the
+ \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
+
+ \sa section \ref cmdxmlonly "\\xmlonly".
<hr>
\htmlonly</p><center><p>\endhtmlonly
@@ -2591,14 +2659,14 @@ Commands for visual enhancements
\addindex \\code
Starts a block of code. A code block is treated differently
- from ordinary text. It is interpreted as source code. The names of
- classes and members and other documented entities are automatically
+ from ordinary text. It is interpreted as source code. The names of
+ classes and members and other documented entities are automatically
replaced by links to the documentation.
By default the language that is assumed for syntax highlighting is based
on the location where the \c \\code block was found. If this part of
a Python file for instance, the syntax highlight will be done according
- to the Python syntax.
+ to the Python syntax.
If it is unclear from the context which language is meant (for instance the
comment is in a <code>.txt</code> or <code>.markdown</code> file) then you can also explicitly
@@ -2703,10 +2771,10 @@ only copy the detailed documentation, not the brief description.
XML output. The block ends with a
\ref cmdenddocbookonly "\\enddocbookonly" command.
- \sa section \ref cmdmanonly "\\manonly",
- \ref cmdlatexonly "\\latexonly",
- \ref cmdrtfonly "\\rtfonly",
- \ref cmdxmlonly "\\xmlonly", and
+ \sa section \ref cmdmanonly "\\manonly",
+ \ref cmdlatexonly "\\latexonly",
+ \ref cmdrtfonly "\\rtfonly",
+ \ref cmdxmlonly "\\xmlonly", and
\ref cmdhtmlonly "\\htmlonly".
<hr>
@@ -2732,6 +2800,10 @@ only copy the detailed documentation, not the brief description.
The nodes of a graph can be made clickable by using the URL attribute.
By using the command \ref cmdref "\\ref" inside the URL value you can conveniently
link to an item inside doxygen. Here is an example:
+
+ \note doxygen creates a temporary file that is automatically removed unless
+ the \ref cfg_dot_cleanup "DOT_CLEANUP" tag is set to `NO`.
+
\code
/*! class B */
class B {};
@@ -2785,16 +2857,18 @@ See also the \ref emojisup "emoji support page" for details.
stripped before the caption is displayed.
The second argument is also optional and can be used to specify the
- width or height of the image.
+ width or height of the image.
For a description of the possibilities see the paragraph
\ref image_sizeindicator "Size indication" with the
\ref cmdimage "\\image" command.
\note The text fragment should only include the part of the message
sequence chart that is
- within the <code>msc {...}</code> block (this is different from
+ within the <code>msc {...}</code> block (this is different from
\ref cmdmscfile "\\mscfile").
\note mscgen is now built in into doxygen
+ \note doxygen creates a temporary file that is automatically removed unless
+ the \ref cfg_dot_cleanup "DOT_CLEANUP" tag is set to `NO`.
Here is an example of the use of the \c \\msc command.
\code
@@ -2837,7 +2911,7 @@ class Receiver
\addindex \\startuml
Starts a text fragment which should contain a valid description of a
- PlantUML diagram. See http://plantuml.com/ for examples.
+ PlantUML diagram. See https://plantuml.com/ for examples.
The text fragment ends with \ref cmdenduml "\\enduml".
\note You need to install Java and the PlantUML's jar file,
if you want to use this command. The location of the jar file should be specified
@@ -2865,6 +2939,9 @@ class Receiver
\ref image_sizeindicator "Size indication" with the
\ref cmdimage "\\image" command.
+ \note doxygen creates a temporary file that is automatically removed unless
+ the \ref cfg_dot_cleanup "DOT_CLEANUP" tag is set to `NO`.
+
Here is an example of the use of the \c \\startuml command.
\code
/** Sender class. Can be used to send a command to the server.
@@ -3163,9 +3240,9 @@ class Receiver
\note environment variables (like \$(HOME) ) are resolved inside a
HTML-only block.
- \sa section \ref cmdmanonly "\\manonly",
- \ref cmdlatexonly "\\latexonly",
- \ref cmdrtfonly "\\rtfonly",
+ \sa section \ref cmdmanonly "\\manonly",
+ \ref cmdlatexonly "\\latexonly",
+ \ref cmdrtfonly "\\rtfonly",
\ref cmdxmlonly "\\xmlonly",
\ref cmddocbookonly "\\docbookonly", and
\ref cmdhtmlinclude "\\htmlinclude".
@@ -3204,7 +3281,7 @@ class Receiver
`4in` or a symbolic width like `\textwidth`).
Currently only the option `inline` is supported. In case the option `inline` is
- specified the image is placed "in the line", when a caption s present it is shown
+ specified the image is placed "in the line", when a caption s present it is shown
in HTML as tooltip (ignored for the other formats).
Here is example of a comment block:
@@ -3480,7 +3557,7 @@ class Receiver
\section cmdchardot \\.
\addindex \\\.
- This command writes a dot (`.`) to the output. This can be useful to
+ This command writes a dot (`.`) to the output. This can be useful to
prevent ending a brief description when \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" is enabled
or to prevent starting a numbered list when the dot follows a number at
the start of a line.
diff --git a/doc/custcmd.doc b/doc/custcmd.doc
index 02805da..0cc1d4d 100644
--- a/doc/custcmd.doc
+++ b/doc/custcmd.doc
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,11 +18,11 @@
\tableofcontents{html,latex}
-Doxygen provides a large number of \ref commands "special commands",
+Doxygen provides a large number of \ref commands "special commands",
\ref xmlcmds "XML commands", and \ref htmlcmds "HTML commands".
-that can be used to enhance or structure the documentation inside a comment block.
+that can be used to enhance or structure the documentation inside a comment block.
If you for some reason have a need to define new commands you can do
-so by means of an \e alias definition.
+so by means of an \e alias definition.
The definition of an alias should be specified in the configuration file using
the \ref cfg_aliases "ALIASES" configuration tag.
@@ -32,15 +32,15 @@ The simplest form of an alias is a simple substitution of the form
\verbatim
name=value
\endverbatim
- For example defining the following alias:
+ For example defining the following alias:
\verbatim
- ALIASES += sideeffect="\par Side Effects:\n"
+ ALIASES += sideeffect="\par Side Effects:^^"
\endverbatim
will allow you to
- put the command `\sideeffect` (or `@sideeffect`) in the documentation, which
+ put the command `\sideeffect` (or `@sideeffect`) in the documentation, which
will result in a user-defined paragraph with heading <b>Side Effects:</b>.
-Note that you can put `\n`'s in the value part of an alias to insert newlines
+Note that you cannot put `\n`'s in the value part of an alias to insert newlines
(in the resulting output). You can put `^^` in the value part of an alias to
insert a newline as if a physical newline was in the original file.
@@ -52,7 +52,7 @@ use a double escape (\c \\\\{ and \c \\\\})
Also note that you can redefine existing special commands if you wish.
Some commands, such as \ref cmdxrefitem "\\xrefitem" are designed to be used in
-combination with aliases.
+combination with aliases.
\section custcmd_complex Aliases with arguments
Aliases can also have one or more arguments. In the alias definition you then need
@@ -101,9 +101,9 @@ ALIASES += reminder="\xreflist{reminders,Reminder,Reminders}"
Note that if for aliases with more than one argument a comma is used as a separator,
if you want to put a comma inside the command, you will need to escape it with a backslash,
-i.e.
+i.e.
\verbatim
-\l{SomeClass,Some text\, with an escaped comma}
+\l{SomeClass,Some text\, with an escaped comma}
\endverbatim
given the alias definition of `\l` in the example above.
diff --git a/doc/customize.doc b/doc/customize.doc
index 7b2729d..52f8d7a 100644
--- a/doc/customize.doc
+++ b/doc/customize.doc
@@ -372,7 +372,8 @@ generated output!
If the above two methods still do not provide enough flexibility, you
can also use the XML output produced by doxygen as a basis to
-generate the output you like. To do this set GENERATE_XML to YES.
+generate the output you like. To do this set
+\ref cfg_generate_xml "GENERATE_XML" to \c YES.
The XML output consists of an index file named \c index.xml which
lists all items extracted by doxygen with references to the other XML files
diff --git a/doc/docblocks.doc b/doc/docblocks.doc
index 8e99669..ac81bec 100644
--- a/doc/docblocks.doc
+++ b/doc/docblocks.doc
@@ -31,9 +31,9 @@ additional markings, so doxygen knows it is a piece of structured text that
needs to end up in the generated documentation. The \ref cppblock "next" section
presents the various styles supported by doxygen.
-For Python, VHDL, Fortran, and Tcl code there are different commenting
-conventions, which can be found in sections \ref pythonblocks, \ref vhdlblocks,
-\ref fortranblocks, and \ref tclblocks respectively.
+For Python, VHDL, and Fortran code there are different commenting
+conventions, which can be found in sections \ref pythonblocks, \ref vhdlblocks, and
+\ref fortranblocks respectively.
\subsection cppblock Comment blocks for C-like languages (C/C++/C#/Objective-C/PHP/Java)
@@ -431,7 +431,9 @@ using structural commands:
a case where the \\fn command is redundant and will only lead to problems.
When you place a comment block in a file with one of the following extensions
- `.dox`, `.txt`, or `.doc` then doxygen will hide this file from the file list.
+ `.dox`, `.txt`, `.doc`, `.md` or `.markdown` or when the extension maps to
+ `md` by means of the \ref cfg_extension_mapping "EXTENSION_MAPPING"
+ then doxygen will hide this file from the file list.
If you have a file that doxygen cannot parse but still would like to document it,
you can show it as-is using \ref cmdverbinclude "\\verbinclude", e.g.
@@ -450,7 +452,7 @@ the script can be found in the path set via \ref cfg_example_path "EXAMPLE_PATH"
\subsection pythonblocks Comment blocks in Python
For Python there is a standard way of documenting the code using
-so called documentation strings. Such strings are stored in \c __doc__
+so called documentation strings (<tt>"""</tt>). Such strings are stored in \c __doc__
and can be retrieved at runtime. Doxygen will extract such comments
and assume they have to be represented in a preformatted way.
@@ -464,8 +466,12 @@ and assume they have to be represented in a preformatted way.
for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
\endlatexonly
-Note that in this case none of doxygen's \ref cmd_intro "special commands"
-are supported.
+\note When using <tt>\"\"\"</tt> none of doxygen's \ref cmd_intro "special commands"
+are supported and the text is shown as verbatim text see \ref cmdverbatim "\\verbatim".
+To have the doxygen's \ref cmd_intro "special commands" and have the text as regular
+documentation instead of <tt>\"\"\"</tt> use <tt>\"\"\"!</tt> or set
+\ref cfg_python_docstring "PYTHON_DOCSTRING" to \c NO in the configuration file.
+\note Instead of <tt>\"\"\"</tt> one can also use <tt>'''</tt>.
There is also another way to document Python code using comments that
start with "##". These type of comment blocks are more in line with the
@@ -564,72 +570,6 @@ C> input parameter
end function A
\endcode
-\subsection tclblocks Comment blocks in Tcl
-
-Doxygen documentation can be included in normal Tcl comments.
-
-To start a new documentation block start a line with \c ## (two hashes).
-All following comment lines and continuation lines will be added to this
-block. The block ends with a line not starting with a \c # (hash sign).
-
-A brief documentation can be added with \c ;#< (semicolon, hash and
-less-than sign). The brief documentation also ends at a line not starting
-with a \c # (hash sign).
-
-Inside doxygen comment blocks all normal doxygen markings are supported.
-The only exceptions are described in the following two paragraphs.
-
-If a doxygen comment block ends with a line containing only
-\c #\\code or \c #\@code all code until a line only containing \c #\\endcode
-or \c #\@endcode is added to the generated documentation as code block.
-
-If a doxygen comment block ends with a line containing only
-\c #\\verbatim or \c #\@verbatim all code until a line only containing
-\c #\\endverbatim or \c #\@endverbatim is added verbatim to the generated
-documentation.
-
-To detect namespaces, classes, functions and variables the following
-Tcl commands are recognized. Documentation blocks can be put on the lines
-before the command.
-
-<ul>
-<li><tt>namespace eval ..</tt> Namespace
-<li><tt>proc ..</tt> Function
-<li><tt>variable ..</tt> Variable
-<li><tt>common ..</tt> Common variable
-<li><tt>itcl::class ..</tt> Class
-<li><tt>itcl::body ..</tt> Class method body definition
-<li><tt>oo::class create ..</tt> Class
-<li><tt>oo::define ..</tt> OO Class definition
-<li><tt>method ..</tt> Class method definitions
-<li><tt>constructor ..</tt> Class constructor
-<li><tt>destructor ..</tt> Class destructor
-<li><tt>public ..</tt> Set protection level
-<li><tt>protected ..</tt> Set protection level
-<li><tt>private ..</tt> Set protection level
-</ul>
-
-<!--
-To use your own keywords you an map these keyword to the recognized commands
-using the \ref cfg_tcl_subs "TCL_SUBST" entry in the configuration file.
-The entry contain a list of word-keyword mappings. To use the itcl::*
-commands without the leading namespace use p.e.:
-
-\verbatim TCL_SUBST = class itcl:class body itcl:body \endverbatim
--->
-
-Following is an example using doxygen style comments:
-
-\include tclexample.tcl
- \htmlonly
- Click <a href="examples/tclexample/html/index.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
- \latexonly
- See \hyperlink{tcl_example}{TCL example}
- for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
- \endlatexonly
-
\section docstructure Anatomy of a comment block
@@ -653,7 +593,7 @@ syntax, including parts of the
extension.
Markdown is designed to be very easy to read and write.
-It's formatting is inspired by plain text mail.
+Its formatting is inspired by plain text mail.
Markdown works great for simple, generic formatting, like an introduction
page for your project. Doxygen also supports reading of markdown files
directly. For more details see chapter \ref markdown.
diff --git a/doc/doxygen_logo.eps b/doc/doxygen_logo.eps
deleted file mode 100644
index 6539c3a..0000000
--- a/doc/doxygen_logo.eps
+++ /dev/null
@@ -1,6322 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: 0 0 634 197
-%%HiResBoundingBox: 0.000000 0.000000 634.000000 197.000000
-%.........................................
-%%Creator: GNU Ghostscript 705 (epswrite)
-%%CreationDate: 2002/09/28 21:44:36
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 2
-%%EndComments
-%%BeginProlog
-% This copyright applies to everything between here and the %%EndProlog:
-% Copyright (C) 2002 artofcode LLC, Benicia, CA. All rights reserved.
-%%BeginResource: procset GS_epswrite_2_0_1001
-/GS_epswrite_2_0_1001 80 dict dup begin
-/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
-4 index eq and{ pop pop pop}{ PageSize dup 1
-5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
-{ pop/setpagedevice where
-{ pop 1 dict dup /PageSize PageSize put setpagedevice}
-{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
-setpage}if}ifelse}ifelse}ifelse} bind def
-/!{bind def}bind def/#{load def}!/N/counttomark #
-/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
-/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
-/w/setlinewidth #/J/setlinecap #
-/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
-/m/moveto #/l/lineto #/c/rcurveto #
-/p{N 2 idiv{N -2 roll rlineto}repeat}!
-/P{N 0 gt{N -2 roll moveto p}if}!
-/h{p closepath}!/H{P closepath}!
-/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
-/re{4 -2 roll m exch dup lx exch ly neg lx h}!
-/^{3 index neg 3 index neg}!
-/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
-/q/gsave #/Q/grestore #/rf{re fill}!
-/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
-/|={pop exch 4 1 roll 3 array astore cvx exch 1 index def exec}!
-/|{exch string readstring |=}!
-/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
-/@/currentfile #/${+ @ |}!
-/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
-3 1 roll}repeat pop pop true}!
-/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
-/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
-/Ic{exch Ix false 3 colorimage}!
-/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
-/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
-/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
-/@F{@ &2<<F}!/@C{@X &2 FX}!
-/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
-/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
-/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
-currentdict end image}!
-/~{@ read {pop} if}!
-end readonly def
-%%EndResource
-/pagesave null def
-%%EndProlog
-%%Page: 1 1
-%%BeginPageSetup
-GS_epswrite_2_0_1001 begin
-/pagesave save store 100 dict begin
-0.1 0.1 scale
-%%EndPageSetup
-gsave mark
-K
-0 0 0 0 rf
-Q q
-0 0 250000 0 0 250000 ^ Y
-q[6340 0 0 1970 0 0]concat
-634 197 8[634 0 0 -197 0 197]@X false 3
-colorimage
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.]_qcA
-r;N/?b*;hr`rH)=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-r;OA/s8W#r]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.Rf*/Rr;N/_gkY.I\c;^0
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.]_qcA
-r;OA,rk/1.]_qbtr;OA,rgNcaRf*/tr;N/_rgNcaRf*/8r;M6EgkY+:X8MV0s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W#r]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.Rf*/t
-r;OA,rgNcaRf*/Rr;N/_rdaq=Qi-i5r;N/_rk/1$Qi-3gs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.]_qcA
-r;OA,rk/1.]_qcAr;N/_rk/1.]_qcAr;OA,rk/1.Rf*/tr;OA,rgNca]_qbtr;N/_rgNcaJGfD8
-r;M6ErgNcaRf*/tr;OA,rgNcWEW?(=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#rRf*/tr;N/_rk/1.]_qcAr;N/_rk/1.]_qcA
-r;OA,rgNca]_qbtr;OA,rk/1.Rf*/tr;N/_rk/1.Rf*/8r;N/_rdaqGJGfD8r;N/_rk/1.Rf*/R
-r;M6Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!r;OA,rk/1.]_qcAr;N/_rk/1.]_qcAr;N/_rk/1.]_qcAr;OA,rgNca]_qbt
-r;OA,rgNcaRf*/Rr;N/_rgNcaJGfD8r;M6ErdaqG]_qcAr;N/_rgNcaJGfDZs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#rRf*/t
-r;N/_rk/1.]_qcAr;OA,rgNca]_qcAr;N/_rk/1.Rf*/tr;OA,rgNcaRf*/tr;N/_rk/1.Rf*/8
-r;N/_rdaqGJGfCsr;N/_rk/1.]_qbZr;M6Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.Rf*/tr;OA,rk/1.Rf*/t
-r;OA,rgNca]_qcAr;N/_rk/1.Rf*/tr;N/_rgNcaRf*/Rr;N/_rdaqGJGfD8r;M6ErgNcaRf*/t
-r;N/_rdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W#r]_qbtr;OA,rk/1.Rf*/tr;OA,rk/1.]_qcAr;OA,rk/1.Rf*/t
-r;N/_rgNca]_qbtr;OA,rgNcaRf*/8r;M6ErgNcaJGfCsr;N/_rgNcaRf*/8r;M6Hs8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-r;N/_rk/1.Rf*/tr;OA,rgNca]_qbtr;OA,rgNca]_qbtr;OA,rgNca]_qbtr;N/_rgNcaRf*/R
-r;N/_rdaqGRf*/8r;N/_rdaqG]_qcAr;N/_rdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#rRf*/tr;OA,rk/1.Rf*/t
-r;OA,rk/1.Rf*/tr;OA,rk/1.Rf*/tr;N/_rgNcaRf*/tr;N/_rgNcaRf*/8r;M6ErgNcaJGfCs
-r;N/_rgNcaRf*/8r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq>^Kpr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/tr;OA,rgNcaRf*/t
-r;N/_rk/1.Rf*/tr;N/_rgNcaRf*/Rr;N/_rdaqGJGfD8r;M6ErgNcaRf*/tr;N/_rdaqGJH,ZL
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Yrk/1.]_qcAr;OA,rgNca]_qcAr;N/_rk/1.Rf*/tr;OA,rgNca]_qbtr;OA,rgNcaRf*/R
-r;N/_rgNcaRf*/8r;M6ErdaqGRf*/8r;N/_rgNcaRf*/8r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp&G'lr;N/_rgNca]_qcA
-r;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/Rr;OA,rgNcaRf*/Rr;M6ErdaqGJGfD8
-r;M6ErdaqG]_qbtr;N/_rdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d9oZ$h.Rf*/tr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/t
-r;N/_rk/1.]_qbtr;OA,rgNcaRf*/Rr;N/_rgNcaRf*/8r;M6ErgNcaJGfCsr;N/_rgNcaJGfCs
-r;N/_rk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-ilnkPXtlr;OA,rgNca]_qbtr;OA,rgNca]_qbtr;OA,rgNca]_qbtr;OA,rgNca]_qbt
-r;N/_rgNcaRf*/Rr;M6ErdaqGJGfD8r;M6ErdaqGRf*/Rr;M6ErdaqGJGfDZs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9oZ$h.Rf*/t
-r;N/_rk/1.Rf*/tr;N/_rgNca]_qbtr;OA,rgNca]_qcAr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8
-r;M6ErgNcaJGfCsr;N/_rdaqGRf*/8r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkPXtlr;OA,rgNca]_qbtr;OA,rgNca]_qbt
-r;N/_rk/1.Rf*/tr;N/_rgNca]_qbtr;N/_rgNcaRf*/Rr;M6ErdaqGJGfD8r;M6ErdaqGRf*/R
-r;M6ErdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726kj7d9oZ$h.Rf*/Rr;N/_rgNca]_qbtr;N/_rgNca]_qbtr;OA,rgNca]_qcA
-r;N/_rgNca]_qbtr;N/_rgNcaRf*/8r;N/_rdaqGJGfCsr;N/_rdaqGJGfCsr;M6Erk/:2s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n,2gt
-r;OA,rgNca]_qbtr;N/_rk/1.Rf*/tr;N/_rgNca]_qbtr;OA,rgNca]_qbtr;N/_rgNcaRf*/R
-r;N/_rdaqGRf*/8r;M6ErdaqGJGfCsr;N/_rdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVi8j)!oZ$h.Rf*/tr;N/_rk/1.Rf*/R
-r;N/_rgNca]_qbtr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/8r;M6ErgNcaJGfCs
-r;N/_rdaqGJGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_&&kOeKDr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/t
-r;N/_rk/1.Rf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8r;M6ErdaqGJGfCsr;M6ErdaqGJGfDZ
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
-kj7d9oZ$h.Rf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/Rr;OA,rgNca]_qbt
-r;OA,rgNca]_qbZr;N/_rgNcaJGfCsr;M6ErdaqGJGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n,2gtr;N/_rgNcaRf*/R
-r;N/_rgNcaRf*/Rr;N/_rgNcaRf*/Rr;OA,rgNca]_qbtr;OA,rgNcaRf*/tr;N/_rdaqGRf*/8
-r;N/_rdaqGJGfCsr;M6Erdaq=EW#gKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7d9oZ$h.Rf*/Rr;N/_rgNcaRf*/8r;N/_rgNcaJGfD8
-r;N/_rgNcaRf*/Rr;OA,rgNcaRf*/tr;N/_rgNcaRf*/Rr;N/_rgNcaJGfCsr;M6EoPsg.JGfCs
-r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_>6n,2Ojr;N/_rdaqGRf*/8r;N/_rgNcaJGfD8r;M6ErgNcaJGfD8r;N/_rgNcaRf*/R
-r;OA,rgNcaRf*/tr;N/_rdaqGJGfCsr;M6ErdaqGJGfCsr;M6Erdaq=EW#gKs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7d9oZ$h.JGfD8
-r;M6ErgNcaJGfCsr;N/_rdaqGRf*/8r;N/_rdaqGRf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8
-r;N/_rdaqGJGfD8r;M6EoPsg.JGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n+Z23r;M6ErgNcaJGfD8r;M6ErgNcaJGfCs
-r;M6ErgNcaJGfD8r;N/_rgNcaRf*/Rr;N/_rgNca]_qbtr;N/_rgNcaJGfCsr;M6ErdaqGJGfCs
-r;M6ErdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726kj7d9oZ$h.JGfCsr;N/_rdaqGJGfCsr;M6ErgNcaJGfCsr;N/_rdaqGRf*/R
-r;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6Erk/:2s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kPXtl
-r;N/_rdaqGJGfD8r;M6ErgNcaJGfCsr;M6ErgNcaJGfD8r;M6ErgNcaRf*/Rr;N/_rgNcaRf*/R
-r;N/_rdaqGJGfCsr;N/_rdaqGJGfCsr;M6ErdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d9oZ$h.Rf*/8r;N/_rdaqGJGfCs
-r;M6ErdaqGRf*/8r;M6ErdaqGRf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8r;M6ErdaqGJGfCs
-r;M6ErdaqGJGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_>6n,2Ojr;M6ErgNcaJGfCsr;N/_rdaqGRf*/8r;M6ErgNcaRf*/8
-r;N/_rdaqGRf*/Rr;N/_rgNcaRf*/Rr;N/_rdaqGJGfCsr;M6Erdaq=EW#HKr;M6ErdaqGJGfDZ
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<
-kj7d9oZ$h.JGfCsr;M6ErgNcaJGfCsr;M6ErdaqGRf*/8r;M6ErgNcaRf*/Rr;M6ErgNcaRf*/R
-r;N/_rgNcaRf*/8r;M6ErdaqGJGf%Zr:G",oPsg.JGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kPXtlr;N/_rdaqGJGfCs
-r;M6ErgNcaJGfD8r;M6ErgNcaJGfD8r;M6ErgNcaRf*/Rr;M6ErgNcaRf*/Rr;M6ErdaqGJGf%Z
-r;M6EoPsg$EW#fdr;M6Erdaq=EW#gKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9oZ$h.JGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGfD8
-r;M6ErgNcaJGfD8r;M6ErgNcaRf*/Rr;M6ErgNcaJGfCsr;M6Erdaq=EW#HKr:G",oPsg.JGfCs
-r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+QpA*q=n,2Ojr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGfD8r;N/_rgNcaRf*/R
-r;M6ErgNcaRf*/Rr;M6Erdaq=EW#HKr:G",oPsg$EW#HKr;M6Erdaq=EW#gKs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7d9m)8i$JGfCs
-r;M6ErdaqGJGfCsr;N/_rdaqGJGfCsr;N/_rdaqGJGfD8r;M6ErgNcaJGfD8r;M6ErdaqGJGf%Z
-r;M6EoPsg$EW#HKr:G",rdaq=EW#HKr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n,2Ojr;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
-r;N/_rdaqGRf*/8r;N/_rdaqGRf*/8r;N/_rdaqGRf*/Rr;M6Erdaq=EW#HKr8qbloPsg$EW#HK
-r;M6EoPsg$EW#gKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726kj7d9m)8i$JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfD8r;M6ErgNcaJGfD8
-r;M6ErgNcaJGfCsr;M6ErdaqGJGf%Zr:G",oPsfkCAd^Dr:G",rdaq=EW#HKr:G",rk/:2s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n,2Oj
-r;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;N/_rdaqGRf*/8r;N/_rdaqGJGfCsr;N/_rdaqGRf*/8
-r;M6EoPsg$EW#HKr8qblk%ahdEW#HKr;M6EoPsfqG5V?Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d9m)8i$JGfCsr;M6ErdaqGJGfCs
-r;M6ErdaqGRf*/8r;N/_rdaqGJGfCsr;N/_rdaqGJGfCsr;M6ErdaqGJGf%Zr:G",k%ahVCAd4/
-r:G",oPsg$EW#HKr8qblrk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_>6n,2Ojr;M6ErdaqGJGfCsr;M6ErdaqGRf*/Rr;M6ErgNcaJGfCs
-r;M6ErdaqGJGfCsr;N/_rdaqGRf*/8r;M6EoPsg$EW"s6r8qblk%ahdEW#HKr:G",oPsg$EW#gK
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<
-kj7d9m)8i$JGfCsr;M6ErdaqGJGfD8r;M6ErdaqGRf*/8r;M6ErgNcaJGfCsr;M6ErdaqGJGfCs
-r;M6ErdaqGJGebWr:G",k%ahVCAd4/r8qbloPsg$EW#HKr8qblrk/:2s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n,2Ojr;M6ErdaqGJGfCs
-r;M6ErdaqGJGfD8r;M6ErgNcaJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfD8r;M6EoPsfkCAd4/
-r8qblk%ahdEW#HKr:G",oPsfqG5V?Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9m)8i$JGfCsr;M6ErdaqGJGfD8r;M6ErgNcaJGfCs
-r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGf%Zr8qblk%ahVCAd4/r8qbloPsg$EW#HK
-r9SV)rk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_>6n,2Ojr;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
-r;M6ErdaqGJGfCsr;M6EoPsfkCAd4/r8qblk%ahVCAd^Dr9SV)lur=!EW#IKs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9m)8i$JGfCs
-r;M6ErdaqGJGfD8r;M6ErdaqGJGfD8r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGf%Z
-r8qblk%ahLB)Le+r8qbloPsg$EW#HKr9SV)rk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kPX\br;M6ErdaqGJGfCsr;M6ErdaqGRf*/8
-r;N/_rdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6Elur<hCAd4/r8qblk%ahVCAd^D
-r9SV)oPsg$EW#IKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<[_Gkj7d9m)8i$JGfCsr;M6ErdaqGJGfD8r;M6ErgNcaJGfCsr;M6ErdaqGJGfCs
-r;M6ErdaqGJGfCsr;M6ErdaqGJGf%Zr8qblk%ahVCAd4/r8qbloPsfqG5UuPr9SV)rk/:2s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kPX\b
-r;M6ErdaqGJGfCsr;M6ErdaqGJGfD8r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
-r;M6Ek%ahVCAd4/r7ko^k%ahVCAdFAr9SV)oPsg$EW#IKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d9m)8i$JGfCsr;M6ErdaqGJGfCs
-r;M6ErdaqGRf*/8r;N/_rdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGebWr8qblk%ahVCAd4/
-r8qbloPsfqG5UuPr8qblrk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_&&kPX\br;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;M6ErdaqGJGfCs
-r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6Ek%ah\G5UK;r8qblk%ah\G5U]Mr9SV)oPsfkCAe(D
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-kj7d9m)8i$JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;N/_rdaqGRf*/8r;M6ErdaqGJGfCs
-r;M6ErdaqGJGePEr8qblgh-KHCAdFAr8qbllur<nG5U]Mr8qbloZ$q2s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kPX\br;M6ErdaqGJGfCs
-r;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;M6ErdaqGRf*/8r;M6ErgNcaJGfCsr;M6Ek%ah\G5UK;
-r8qblk%ah\G5UK;r9SV)oPsfkCAd^js8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9m)8i$JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGRf*/8
-r;M6ErgNcaJGfD8r;M6ErdaqGJGfCsr;M6ErdaqGJGePEr8qblgh-KHCAdFAr9SV)k%ah\G5UK;
-r7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_&&kPX\br;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErgNcaJGfCsr;N/_rdaqGJGfD8
-r;M6ErgNcaJGfCsr;M6Ek%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahLB)M:fs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVi8j)!m)8i$JGfCs
-r;M6ErdaqGJGfCsr;M6ErgNcaJGfCsr;N/_rdaqGJGfD8r;M6ErgNcaJGfCsr;M6Erdaq=EW"s6
-r7ko^gh-KHCAd4/r8qblk%ahVCAd4/r7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kPX\br;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
-r;M6ErgNcaJGfCsr;N/_rdaqGJGfCsr;N/_rdaqGJGfCsr;M6Egh-K>B)LFrr8qblk%ahVCAck!
-r8qblk%ahLB)M:fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VHWp%7tRi8j)!m)8i$JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGfCs
-r;N/_rdaqGJGfCsr;M6ErdaqGJGe27r7ko^gh-K>B)LFrr8qblgh-K>B)Le+r7ko^oZ$q2s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kPX\b
-r:G",rdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGfCsr;M6ErdaqGJGfCs
-r:G",k%ahD@JnV`r7ko^gh-K>B)LFrr7ko^k%ahLB)M:fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d8jMCcnJGf%Zr;M6ErdaqGJGfCs
-r;M6ErdaqGJGfCsr;N/_rdaqGJGfCsr;M6ErdaqGJGfCsr;M6Erdaq=EW"<pr7#0Qe7&:)@Jnnm
-r7ko^e7&:1B)LFrr7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_&&kPO>Vr:G",rdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
-r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr:G",e7&:)@Jn>Tr7#0Qe7&:)@JnV`r7#0Qgh-K6@Joc;
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-kj7d9m)8hoEW#HKr:G",oPsg.JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
-r;M6Erdaq=EW"<pr6/IEb[(.j?2VoPr7#0Qb[(.r@JnV`r7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n,)1^r:G",oPsg$EW#HK
-r:G",oPsg.JGf%Zr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr:G",rdaq=EW#HKr9SV)e7&:!?2VoP
-r6/IEb[(.j?2VoPr6/IEe7&:)@JoGZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j)!m)8haCAd4/r:G",oPsg$EW#HKr:G",oPsg$EW#HK
-r:G",oPsg.JGfCsr;M6EoPsg$EW#HKr:G",oPsfkCAc:]r5;b9b[(.b=o?3@r6/IE`**#^?2VoP
-r7#0QoZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_>6n,)1^r8qblk%ahdEW#0Hr:G",oPsg$EW#HKr:G",oPsg$EW#HKr:G",oPsg$EW#HK
-r:G",oPsfqG5UuPr8qbl`**#V=o>p3r5;b9]N"gI=o?3@r5;b9`**#^?2X?7s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVi8j(ujMCcVCAd4/
-r8qblk%ah\G5U]Mr9SV)lur<nG5U]Mr9SV)lur=!EW#HKr9SV)oPsfqG5UuPr8qbllur<^B)K;@
-r5;b9`**#V=o>p3r5;b9]N"gA<;a[;r6/IEm)8r(s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n,)1^r8qblk%ahVCAd4/r8qblk%ahVCAd4/
-r8qbllur<hCAdFAr9SV)lur<nG5U]Mr9SV)k%ah\G5UK;r7ko^]N"gI=o>p3r4H#,]N"gI=o>p3
-r4H#,]N"gQ?2X#Vs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+(Hp#tc2i8j(tgopY2B)LFrr8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAdFA
-r8qblk%ahVCAd4/r8qblk%ahD@Jmc;r5;b9]N"gA<;a+"r4H#,]N"gA<;aC.r5;b9m)8r(s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W#r]`8$3s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/r:J#,oU#LARJcDpr9KdKl^@\:RJc]D
-r:J#,oZ$h$`r,JKs8W,soZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o.jQGI^kPEu;
-r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^k%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahLB)Le+
-r7#0Q]N"gA<;aC.r4H#,Zr$\5<;a+"r3T;uZr$\5<;c'Ms8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#rRf)fEr8qblk%ahVCAd4/
-r8qblk%ahVCAd4/r9SV)lur<mRJc]Dr:J#,oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,soZ$gaL]#Y1r7#0Qe7&:)@Jnnmr7ko^e7&:)@Jnnmr7#0Qgh-K>B)LFrr8qblgh-K6@Jn>T
-r5;b9]N"gA<;a[;r4HkDc%GrDM#,o1qrGTfm-!U!n)39ig"bH\gopY2B)LFrr7ko^gh-K6@Jnnm
-r7#0Qgh-K>B)LFrr7ko^gh-K>B)LFrr8qblgh-K>B)LFrr7ko^gh-K.?2V'+r3T;u]N"g9;#ICg
-r4H#,Zr$\%9`1tcr3T;um)8r(s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!r;OA,lur<hCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/
-r8qblk%ahLB)LFrr7#0Q`**#N<;a[;qV8:PoZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!r:H?Rk%ahD@JmK/r4H#,e;4%p`rH)=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8;kbr:G",lur=!QiI*cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,srk/1.Rf)et
-r9SV)lur<nG5V!Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,soZ$gQ?2Wi"r9SV)rgNles8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.]_qcAr;OA/s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;N/r9VAugopS0YPdFS
-r9KdKlur<nG5UK;r9SV)lur<hCAd4/r8qblk%ah\G5V!!r;N/bs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o:oC_JAp$D;C
-m.9oBpA+(Hp%7tRs8W,kpA+@Sq=j7=r9VB"m)8e^_>;rjqV8:Pj.ZD2U&=5Er9KdKlur<nG5UK;
-r9SV)lur<nG5V!!r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r9KdKe7&9n=o?KLr6/IEb[(.j?2W2\
-r7#0Qe7&:)@JnV`r7ko^e7&:)@Jnnmr7ko^gh-K>B)LFrr8qblgh-K>B)LFrr6/IE]N"g9;#ICg
-r2`TiUe(Eb9`1\Wr3T;u]PQfTX8:&;r7#0Qe7&:)@JnV`r7#0Qe7&:1B)L.er7ko^e7&:1B)LFr
-r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr6/IEZr$\-;#I[sr3T;uXA&Q!;#I[sr2`TiXA&Q!;#K@I
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/r8qblk%ahVCAck!
-r8qblgh-K>B)LFrr8qblk%ahLB)Le+r7ko^gh-KHCAck!r7ko^k%ahLB)LFrr7ko^gh-K>B)LFr
-r7ko^b[(.Z<;`gkr2`Ti`*)rlYQ+Y&s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r:G",k%ahVCAd4/
-r8qbl`**#>9`1tcr4H#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,slur<nG5U]M
-r:G",k%ahSU&Y/ms8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;N/_lur<hCAd4/r8qblk%ahVCAd4/r8qblgh-Tds8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s89f<r7#0Qgh-K>B)LFrr7ko^k%ahdEW#gKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-r;OA,rk/1$EW#0Hr9SV)lur<nG5U]Mr9SV)lur<nG5UuPr:G",lur=!EW#HKr:H?RrgNca]_qcA
-r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq=OCVqrGTigopRnM>Y"cr2`TiZr$\==o@&er9SV)lur<hCAdFAr9SV)k%ahVCAdFA
-r8qblk%ahVCAd4/r8qbllur<nG5UuPr:G",oPsg.]_qcAs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-r9VB"m)8hg`;AW3r9KdKl^@\2U&=5Er9KdKlur<nG5U^Fkj7crjQGd\\bag[qSe<h]PRMQ;#ICg
-r3T;uXA&Pn9`27or5;b9e7&:;CAd4/r9SV)k%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/
-r8qbloU#LT]`8$3s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8;6%r6/IE`**#V=o?3@r5;b9]N"gI=o?KLr5;b9b[(.j?2VoPr7#0Qe7&:)@JnV`
-r7ko^e7&:1B)LFrr7ko^e7&:1B)LFrr7#0Qgh-K6@JnV`r5;b9Zr$\%9`1\Wr1lm]Ue(ER6N!WM
-r1lm]Zr$\E?2W2\r6/IEe7&:)@JnV`r7#0Qe7&:1B)L.er7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
-r7#0Qe7&9n=o>?pr3T;uZr$\%9`1tcr2`TiUe(EZ8Go8Sr2`ThjMClrs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W#r]_po,r7ko^gh-K>B)L.er7ko^gh-K>B)LFrr7ko^gh-K>B)LFr
-r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7#0Qe7&:)@Jnnmr7#0Qe7&9n=o>?p
-r1lm]XA&Q)<;PCRs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r9SV)k%ahVCAd4/r8qblk%ahVCAd4/r3T;uXA&Pn9`2h3
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#`G5UK;r9SV)k%ahVCAdFAr9SV)k%ah[RK*<e
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#r]_qDg
-r8qblk%ahVCAd4/r7ko^k%ahLB)Le+r7ko^k%ahVCAck!r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!qrGTk`**#nB)LFr
-r7ko^gh-K>B)LFrr7ko^k%ahVCAdFAr;N/bs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,sm)8h^U&=5Er9SV)oPsg$EW#HKr9SV)lur<nG5U]M
-r8qblk%ah\G5U]Mr9SV)lur<hCAdFAr9SV)lur<nG5U]Mr9SV)lur<nG5U]Mr:G",lur<nG5U]M
-r:G",oU#LJQi-iOr;OA,rk/1.]_qcAr;OA/s8W#r]`8$3s8W,srk/:2s8;l/s8W,srk/1.]_qcA
-r;OA,rgNles8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n+thCqSe<hZr$\%9`1tc
-r3T;u`**#nB)Le+r9SV)k%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/
-r9SV)lur<nG5U]Mr9SV)lur<nG5V!!r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8V`bq=OCVm.9o:oC_JAp$D;C
-m.9oBpA+@Sq=j7=r9VB!jMC`S_>N>er8XLKgkYg_L]#Y1r7#0Qgh-KHCAd4/r9SV)lur<hCAdFA
-r9SV)lur<hCAd4/r9SV)e;4"/Er<:@r2`TiXA&Q!;#ICgr3T;uXA&Pn9`2h3r7#0Qk%ahVCAd4/
-r8qblk%ahVCAd4/r8qblgh-K>B)LFrr7ko^gh-K>B)Le+r7ko^k%ahLB)Le+r7ko^lur=!`rH)=
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8:oNr5;b9]N"gI=o>p3
-r4H#,]N"gA<;a[;r4H#,`**#V=o?KLr6/IEb[(.r@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:1B)L.e
-r7#0Qe7&:)@JnV`r7#0Qe7&:!?2VoPr4H#,Ue(EZ8Go8Sr1lm]S3m.D6N!oYr6/IEb[(.j?2VoP
-r6/IEb[(.r@JnV`r6/IEe7&:)@Jn>Tr7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r5;b9XA&Pn9`1tc
-r2`TiXA&Pn9`1\Wr1lm]S3m.L8GqMAs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#hQi,WN
-r7ko^e7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:1B)LFrr7ko^gh-K>B)LFrr7ko^e7&:)@Jnnm
-r7#0Qgh-K>B)L.er7#0Qe7&:)@JnV`r7#0Qb[(.r@JnV`r6/IEe7&9n=o>?pr1$+OUe(Eb9`2P>
-r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/
-r9SV)gh-K>B)LFrr7ko^k%ahLB)Le+r7ko^k%ah<?2Uctr1lm]Zr$\\U&Y/ms8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8;5,r8qblk%ahVCAd4/r8qblk%ah\G5UK;r8qblgh-KMRK*<es8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,oU#LBG5UK;r8qblk%ahVCAd4/r7ko^gh-K>B)LFr
-r7ko^gh-K>B)L.er7ko^gh-K6@K6B-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#0D#DL_r7ko^e7&:1B)LFrr7#0Qgh-K>B)LFr
-r7ko^k%ahLB)Le+r8qbllur=+]`8$3s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-qV8:Pe;4%P@JoJ8r9SV)lur<nG5U]Mr9SV)lur<nG5UK;r8qblk%ahVCAd4/r8qblk%ahVCAd4/
-r9SV)k%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r9SV)k%ah\G5U]M
-r9SV)lur<nG5U]Mr9SV)k%ahVCAdFAr9SV)lur<hCAdFAr9SV)lur<hCAd^js8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq=OCVm.9o6m-j2l\ba:%r3T;uUe(Eb9`1tcr4H#,e7&:;CAdFAr9SV)k%ahVCAd4/
-r8qblk%ahVCAd4/r8qblgh-KHCAck!r7ko^gh-K>B)LFrr8qblk%ahVCAdFAr9SV)lur<hCAd4/
-r8qblk%ahLL]$L^r:H?Us8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq=OCVm.9o:oC_JAp#tc2l.NWCgsP?/X89elqSe<h]SQHlEr<:@r2`TiUe(Er<;bln
-r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblgkYgoG5UK;r8qblk%ahVCAd4/r8qblk%ahVCAb_D
-r2`TiXA&Pn9`1tcr2`TiXA&Pn9`27or7ko^k%ahVCAd4/r7ko^gh-K>B)LFrr7ko^e7&:1B)LFr
-r7ko^gh-K6@Jnnmr7ko^e7&:1B)LFrr7ko^gh-K>B)LFrr7ko^k%ah\`;fl;s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8:Z-r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r4H#,]N"gA<;a[;
-r5;b9`**#^?2VWDr6/IEb[(.r@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@Jn>Tr6/IEb[(.j?2VoP
-r5;b9b[(.b=o?3@r2`TiS3m.D6N!WMr1$+OUe(F%=o?3@r6/IEb[(.j?2VoPr6/IEb[(.j?2VoP
-r5;b9b[(.j?2VoPr6/IEb[(.j?2VoPr6/IEb[(.b=o>?pr2`TiXA&Pn9`1DIr2`TiS3m.D6N!??
-r1$+NjMClrs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#_RJbQCr7#0Qb[(.r@Jn>Tr6/IEe7&:!?2VoP
-r6/IEe7&:!?2W2\r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
-r6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEe7&9f<;`gkr1$+OUe(EZ8GohkqV8:Ss8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/r7m)*gh-K6@Jnnmr7ko^gh-K>B)LFr
-r7ko^gh-KHCAck!r7ko^]N"g)8Go8Sr3T<#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r9KdKgh-K>B)LFr
-r8qblgh-KHCAd4/r8qbllur<hCAdFAr7m)*e7&:8U&Y/ms8W-!s8W-!s8W-!s8W-!s8W-!s8;MU
-r8qblk%ahVCAd4/r8qblk%ahVCAd4/r7ko^gh-K6@Jnnmr7#0Qe7&:)@Jn>Tr7#0Qe7&:)@JnV`
-r7#0QoZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV
-o_/+QpA+@Sq>/mMr4H#,e7&:1B)L.er7#0Qe7&:)@Jnnmr7ko^gh-K>B)LFrr7ko^gh-K>B)LFr
-r7ko^k%ah\G5V?.s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8(NSqSe<h`**#nB)Le+r9SV)k%ahVCAdFA
-r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAck!r7ko^k%ahLB)LFr
-r8qblgh-KHCAck!r8qblgh-KHCAck!r8qblgh-K>B)Le+r8qblk%ahVCAdFAr8qblk%ahVCAd4/
-r8qblk%ahVCAd4/r8qblk%ah\G5UK;r9SV)rk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Cm.9o.jQHB`VYd`@
-r1lm]XA&Pf8GoP_r4H#,gh-KHCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahLB)LFr
-r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr8qbllur<hCAd4/r8qblk%ahLB)Le+r8qblgh-KHCAd4/
-r9SV,s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o6m-j0)n)39i
-i8j(t`JOMo9`1\Wr1$+OUe(EZ8Go8Sr2`TiUe(EZ8Go8Sr4H#,gh-K>B)LFrr8qblgh-KHCAck!
-r8qblgh-KHCAd4/r8qblk%ahLL]$:Lr7m)*k%ahLB)Le+r8qbl]N"g19`1\Wr2`TiXA&Pn9`1\W
-r6/IEgh-KHCAck!r7ko^gh-K>B)LFrr7#0Qgh-K6@Jnnmr7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
-r7ko^gh-K>B)L.er7#0Qgh-K6@JnV`r7ko^gh-KV`rH)=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8:Z-
-r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r5;b9`**#V=o?KL
-r6/IEb[(.j?2W2\r6/IEb[(.j?2VoPr6/IEb[(.b=o?3@r5;b9`**#V=o?3@r4H#,`**#N<;a+"
-r1$+OS3m.D6N!WMr5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#^?2VWD
-r6/IEb[(.b=o?KLr4H#,Ue(EZ8Go8Sr1$+OS3m.L8GnuEr1$+OS3m.D6N#l;s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W#_RJbQCr6/IEb[(.j?2VoPr6/IEb[(.j?2VWDr6/IE`**#^?2VWDr6/IEb[(.j?2VoP
-r7#0Qe7&:!?2W2\r7#0Qe7&:!?2W2\r7#0Qe7&:!?2VoPr6/IEb[(.j?2VoPr5;b9b[(.j?2VoP
-r6/IE`**#^?2VWDr5;b9`**#F;#HhMr1$+OPX55C8GoP_qV8:Ss8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8;N/r7#0Qb[(.r@JnV`r7#0Qe7&:)@JnV`r7ko^gh-K>B)LFrr7ko^gh-K>B)L.e
-r2`TiS3m.L8Gp,:s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Ym)8hO@JnV`r7#0Qgh-K6@Jnnmr7ko^gh-K>B)Le+
-r7ko^k%ahVCAd4/r7ko^e7&78_>jQ8s8W-!s8W-!s8W-!s8W,sgh-K>B)LFrr7m)*gh-K>B)L.e
-r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r6/IEe7&:!?2VoPr6/IEb[(.j?2W2\s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o6m-j0)n*'-,kj7d9]PRMa=o?cX
-r7#0Qe7&:)@JnV`r7#0Qe7&:1B)LFrr7ko^gh-K6@Jnnmr7ko^gh-K>B)LFrr7ko^gh-KHCAd4/
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8Vi[kPE]4r3T;u`**#nB)Le+r8qblk%ahVCAd4/r8qblk%ahVCAd4/r7ko^k%ahLB)Le+
-r8qblgh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFr
-r7ko^gh-K6@Jnnmr7ko^gh-K>B)LFrr8qblgh-KHCAd4/r7ko^k%ahLB)Le+r8qblk%ahVCAd4/
-r8qblk%ahVCB+>6s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+(Hp$D;Ckj7crjQHBYM>X/?r1lm]Ue(ER6N!WMr4H#,e7&:;CAck!
-r8qblgh-K>B)Le+r7ko^k%ahLB)LFrr7ko^gh-K>B)LFrr8qblgh-KHCAck!r7ko^gh-K>B)LFr
-r7ko^gh-KHCAd4/r7m)*k%ahVCAck!r7ko^gh-K>B)Le+r7ko^gh-KHCAck!r9KdNs8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mm.9o6m-ilnkLnYIg"bH;gtp`>hXA+;r1lm]S3m.D6N!??
-r1$+OUe(EZ8GnuEr1$+OS3m.d<;bN`r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFr
-r8qblk%ahVCAck!r7m)*k%ahLB)K;@r1lm]Ue(Eb9`1DIr3T;ue7&:;CAd4/r7ko^gh-K6@JnV`
-r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qb[(.j?2W2\r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
-r7#0Qe7&:!?2W2\r7#0Qj.ZMQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8:oNr5;b9]N"gA<;aC.r4H#,]N"g9;#I[s
-r3T;uZr$\-;#I[sr3T;u]N"gA<;aC.r5;b9]N"gA<;a[;r5;b9`**#V=o?3@r6/IE`**#^?2VoP
-r5;b9`**#V=o?3@r5;b9`**#V=o>p3r4H#,]N"gA<;a+"r4H#,]N"g9;#HhMr00MFS3m.d<;aC.
-r4H#,`**#N<;a[;r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,`**#V=o?3@r5;b9`**#F;#I+[
-r1$+OUe(ER6N!??r1$+OPX4o!2Z/e*r1$+MgopbXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#h`r+)6r6/IEb[(.j?2VWD
-r5;b9`**#V=o?3@r5;b9`**#V=o>p3r5;b9]N"gI=o?3@r5;b9b[(.b=o?3@r6/IE`**#^?2VoP
-r6/IEb[(.j?2VoPr6/IEb[(.b=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
-r5;b9`**#>9`1DIr00MFPX55;6N!WMqrGTns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;6%r7#0Q`**#^?2VoP
-r6/IEb[(.j?2VoPr7#0Qe7&:)@JnV`r7m)*e7&:1B)L.er7ko^gh-K&=o=dVr1$+OUe(CD_>jQ8
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-j]8kPWSWr7#0Qb[(.r@JnV`r7#0Qe7&:)@Jnnmr7ko^gh-K>B)L.er7ko^e7&:1B)LFr
-r7#0Q`*)rlYQ+Y&s8W-!s8W-!s8:Z-r7#0Qgh-K6@JnV`r7#0Qe7&:)@JnV`r6/IEe7&:!?2VoP
-r6/IEb[(.j?2VWDr6/IEb[(.j?2VoPr6/IE]N"q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7d%m-ilnkMYFai8j(ZjQG[Lao&56r6/IEb[(.r@Jn>Tr7#0Qe7&:)@Jnnm
-r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qgh-K6@Jnnmr7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8Vi[kPE/Sr2`Ti]N"gaB)Le+
-r7ko^gh-K>B)LFrr7ko^gh-K6@Jnnmr7#0Qgh-K6@Jnnmr7ko^e7&:1B)L.er7ko^e7&:1B)LFr
-r7ko^e7&:1B)L.er7ko^e7&:)@JnV`r7#0Qe7&:1B)L.er7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
-r7#0Qgh-K>B)LFrr7ko^gkYg_B)Le+r7m)*k%ahLB)LG>r7ko^gh-KHCAckBr9SV,s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp$D;C
-kj7d#gt_h?M#=&>r1$+OS3m.D6N!??r2`Tie7&:1B)LFrr7ko^k%ahLB)LFrr7ko^gh-K>B)LFr
-r7ko^gh-KHCAck!r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7#0Qgh-K>B)LFrr7ko^gh-KHCAck!
-r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr:J#/s8W-!s8W-!s8W-!s8W-!s8W-!
-m.9o:oC_&&kMYFag"bH;gtpK/f$`(!daZk:]T2o[6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??
-r2`Tib[(.r@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qgh-K6@Jnnmr7ko^k%ahLB)LFr
-r8qblZr$[r8Go8Sr1$+O]N"gaB)LFrr7ko^e7&:1B)L.er7#0Qe7&:)@JnV`r6/IEe7&:!?2W2\
-r6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr7#0Qe7&:)@Jn>Tr6/IEb[(.j?2VoPr6/IEb[(.j?2VoP
-r7#0Ts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8;N/r4HkD]N"gA<;aC.r4H#,]N"g9;#I[sr4H#,Zr$\-;#I[sr3T;uZr$\-;#I[s
-r4H#,Zr$\5<;aC.r4H#,]N"gA<;aC.r5;b9]N"gA<;a[;r4H#,`**#N<;a[;r4H#,]N"gA<;aC.
-r4H#,Zr$\-;#I[sr3T;uZr$\-;#I[sr3T;uXA&P^6N!??r4H#,]N"gA<;a+"r4H#,Zr$\5<;a+"
-r3T;uZr$\-;#It*r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r3T;uS3m.D6N!WMr1$+OS3m.D6M$*n
-o8>NuM`1L'6Mf39s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8:ATr5;b9`**#V=o?3@r5;b9`**#N<;a[;r4H#,]N"gA<;aC.
-r4H#,]N"gA<;a[;r4H#,`**#N<;a[;r4H#,`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
-r5;b9`**#N<;aC.r4H#,]N"gA<;aC.r4H#,`**#N<;aC.r4H#,]N"gA<;aC.r4H#,Zr$[j6M$*n
-o8>O)PX55;6Mn-1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8;6%r7#0Q`**#V=o?3@r5;b9`**#V=o?3@r6/IEb[(.j?2VoP
-r69llb[(.r@JnV`r69lle7&:)@JnV`r7#0QXA&P^6N!??r2`Tls8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n*'-,r69ll`**#^?2VoP
-r6/IEb[(.j?2W2\r7#0Qe7&:)@JnV`r7#0Qgh-K6@Jnnmr7$Q#e7&:)@JnV`r6/IE]PRH"YQ+Y&
-s8W,sm)8hO@JnV`r7#0Qe7&:!?2VoPr6/IEb[(.j?2VoPr6/IEb[(.b=o?3@r5;b9`**#V=o?3@
-r5;b9`**#V=o?3@r69los8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
-g"bH;gtpK/f%Jj8m&ka6]N"gQ?2VoPr6/IEb[(.j?2VoPr6/IEe7&:)@JnV`r7#0Qe7&:!?2W2\
-r7#0Qe7&:)@JnV`r7$Q#e7&:)@K6B-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq>/'er1lm]Zr$\M@Jnnmr7ko^gh-K>B)LFrr7ko^gh-K6@JnV`
-r7#0Qe7&:)@JnV`r7#0Qb[(.j?2W2\r6/IEe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
-r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r6/IEe7&:)@Jn>Tr7#0Qe7&:)@JnV`r7#0Qgh-K>B)LFr
-r7ko^gkYg_B)LFrr7ko^k%ahLB)LFrr7ko^gh-KV`rH)=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<[_Gkj7ckgtqM4Nr5D6r00MFPX55362Zs5
-r1$+O]N"gY@JnV`r7#0Qgh-K>B)L.er7$Q#gh-K6@Jnnmr7#0Qe7&:1B)LFrr7#0Qgh-K>B)LFr
-r7ko^gh-K6@Jnnmr7#0Qe7&:)@JnV`r7ko^gh-K>L]#q>r7m)*gh-K>B)L.er7ko^e7&:)@JnV`
-r7#0Qe7&:)@JnV`r7#0Qe7&:)@JoJ8s8W-!s8W-!s8W-!s8W,coC_JAp#+ooi8j(SgtpK/f#u:^
-bKS5Sbg")F`T41Lr00MFPX55362Zs5r00MFS3m.D6N!'6r00MFPX55K9`3+?r6/IEb[(.j?2VoP
-r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:1B)L.er7ko^gh-K>B)K#4r1$+OS3m.l=o@&e
-r7ko^gh-K6@Jnnmr7#0Qe7&:!?2VoPr6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IE`**#^?2VWD
-r6/IEb[(.j?2VoPr5;b9b[(.j?2VoPr6/IEb[(.b=o?KLr5;b9b[(.b=o?d*s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r69llZr$\-;#I[s
-r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr2`TiZr$\%9`27or3T;uZr$\%9`27or3T;uZr$\-;#I[s
-r3T;uZr$\-;#I[sr3T;uZr$\-;#It*r4H#,]N"gA<;aC.r3T;uZr$\-;#ICgr3T;uXA&Pn9`1tc
-r2`TiXA&Pn9`1tcr3T;uS3m.\;#I[sr3T;uZr$\-;#ICgr3T;uZr$\-;#I[sr3T;uZr$\-;#It*
-r3T;u]N"gA<;aC.r4H#,]N"g9;#HhMr1$+OS3m.D6N!'6r1$+FM`10b2Y2hbr/<f8gopbXs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8:oN
-r4H#,]N"gI=o?3@r4H#,]N"gA<;aC.r4H#,]N"gA<;a+"r4H#,Zr$\-;#I[sr4H#,Zr$\-;#I[s
-r3T;u]N"g9;#It*r4H#,]N"gA<;aC.r5;b9]N"gA<;a[;r5;b9`**#V=o>p3r4H#,]N"gA<;aC.
-r4H#,]N"gA<;aC.r4H#,Zr$\5<;a+"r3T;uZr$\-;#It*r4H#,XA&PV61^!mqh.$.PX55362\u[
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;6%
-r5;b9`**#V=o?3@r5;b9`**#N<;a[;r4H#,`**#V=o?3@r5;b9`**#V=o?KLr5;b9`**#^?2VWD
-r5;b9b[(.j?2VWDr1$+OPX55362\BOs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,i8j)!e;4%@=o?3@r5;b9`**#^?2VWDr6/IEb[(.j?2VoP
-r7#0Qe7&:)@JnW2r7#0Qe7&:)@JnV`r7#0Qb[(.r@Jn>Tr5;b9XCh=QVYBH?r7$Q#e7&:"KD`r!
-r6/IEb[(.b=o?KLr5;b9`**#V=o?3@r5;b9]N"gI=o?3@r4H#,]N"gI=o>p3r4H#,]N"g9;#gRq
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH4eCN'tf#u:^bKS5_`4c)E8GpD/
-r5;b9b[(.j?2VoPr6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEb[(.j?2W2\
-r9KdNs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=rI]
-r1lm]SP8t"=o?cXr7#0Qgh-K6@JnW2r7ko^e7&:)@JnV`r7#0Qe7&:)@JnV`r6/IEb[(.j?2VoP
-r6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEe7&:!?2W2\r6/IEe7&:!?2VoPr6/IEb[(.j?2VoP
-r6/IEb[(.j?2VoPr6/IEb[(.j?2W2\r6/IEe7&:)@JnV`r7#0Qe7&:)@Jnnmr7ko^gkYgW@JnV`
-r7#0Qe7&:)@Jnnmr;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VHWp#tc2kj7crjQGaMX7;cdo8>O)PX55362Zs5o8>O)XA&Q1=o?cXr6/IEe7&:)@JnB&
-r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnW2r7#0Qgh-K6M#>b2r7#0Qe7&:)@JnV`
-r7#0Qe7&:)@JnV`r7#0Qe7&:1B)L.er7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r6/IEe7&:)@JnV`
-r6/IEb[(.r@K6B-s8W-!s8V`bq<[_Gkj7ckgtp`>hU9p)`5T^6`PoI%]u7n/]=bi0Uj2g%62Zs5
-o8>O)PX4o!2Z/e*r00MFPX4o!2Y2hbr1$+O`**#V=o?3@r5;b9b[(.b=o?3@r6/IE`**#^?2VoP
-r6/IEc%GrD@JnV`r7#0Qe7&:)@JnV`r7#0QXA&P^6N#&5r7#0Qe7&:)@JnV`r7#0Qb[(.j?2VoP
-r6/IEb[(.b=o?KLr5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
-r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#nL]@DSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r:J#,]PRMI9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tc
-r1lm]XA&Pn9`1\Wr2`TiXA&Pf8GoP_r2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tc
-r3T;uXA&Q!;#ICgr3T;uZr$\%9`27or2`TiXA&Pn9`1\Wr2`TiUe(EZ8Go8Sr2`TiUe(Eb9`1tc
-r2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr3T;uZr$\-;#I[sr4HkD]N"gA<;aC.
-r2`TiPX55362Zs5r00MFPX55361^!mo8>NuM`1Kt62]5gs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r69llZr$\-;#I[sr4H#,]N"g9;#It*
-r3T;uZr$\-;#I[sr3T;uZr$\-;#ICgr3T;uXA&Pn9`1tcr3T;uXA&Pn9`27or3T;uZr$\-;#I[s
-r4H#,Zr$\5<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r3T;uZr$\-;#I[sr3T;uZr$\-;#I[s
-r3T;uZr$\-;#I[sr3T;uZr$\-;#It*r3T;uPX4o!2Z&.go8>O)PX55CD?'Y9s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,rjMCc,<;aC.r4H#,]N"gA<;aC.
-r4H#,]N"gA<;aC.r4H#,]PRMa=o?3@r5;b9`**#V=o?3@r5;b9`**#ND#D4Sr5;b9`**#F;#H88
-o8>O)PX53-_>jQ8s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
-i8j(ZjQGdXfDN9\r4H#,]N"gI=o?3@r5;b9`**#V=o?3@r6/IEb[(.j?2VoPr6/IEe7&:!?2Vs"
-r7#0Qb[(.kKD`r!r6/IEb[(.Z<;_\<r1$+9gt_hWM#>J&r6/IEb[(.j?2VWDr5;b9`**#V=o?3@
-r5;b9`**#N<;a[;r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r3T;ue;4/)s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726i8j(SgtpK/f%A3i`5T^=bg")F`T41Lr2`Tib[(.b=o?3@r6/IE`**#V=o?3@
-r6/IE`**#V=o?KLr5;b9`**#^?2VWDr6/IEb[(.kKD`r!r6/IEc%H&rs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726n%=\YPX55C8GpD/r6/IEb[(.r@Jn>T
-r6/IEe7&:!?2W2\r69lle7&:"KD`r!r7#0Qb[(.j?2VoPr5;b9`**#V=o?3@r5;b9`**#V=o?3@
-r6/IE`**#^?2VWDr6/IE`**#V=o?KLr5;b9b[(.b=o?KLr5;b9`**#V=o?3@r5;b9`**#V=o?3@
-r6/IE`**#^?2VoPr6/IEc%GrD@JnV`r7#0Qc%GrD@Jn>Tr7#0Qb[(.r@JnB&r7#0Qe7&CWs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Ckj7crjQG4OhW1he
-r00MFPX55;6M$*no8>O)PX55S;#JOCr6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEc%Gr<?2Vs"
-r6/IEb[(.kKD`r!r6/IEe7&:)@JnV`r7#0Qe7&:)@JnB&r6/IEb[(.j?2VoPr7#0Qe7&:)@JnW2
-r7#0Qe7&:"KD`r!r6/IEb[(.j?2VoPr6/IEb[(.j?2VWDr5;b9b[(.b=o?KLr5;b9c%Grd`rH)=
-m.9o6m-iW_hV$]@bKS5L`PoI%]t:qj]=bha['[3I[+M1!o8>NuM`10b2Y2hbo8>NuM`10b2Z/Ls
-o8>O(KKB%$6N"c)r4H#,`**#N<;aC.r5;b9]PRMa=o?3@r4HkD`**#^?2VWDr5;b9b[(.kKD`r!
-r7#0Qc%GrD@Jm3#r5;b9b[(.j?2VoPr6/IE`**#^?2VWDr5;b9`**#V=o?3@r5;b9`**#V=o?3@
-r5;b9`**#N<;a[;r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r4H#,`**#N<;a[;r4H#,]N"gI=o>p3
-r4H#,]N"gA<;aC.r4H#,oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,rjMCbq9`1tcr1lm]Ue(Eb9`1tcr1lm]XA&Pf8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8GnuE
-r1lm]Ue(EZ8GnuEr1lm]S3m.D6N!??r1lm]S3m.L8Go8Sr1lm]XA&Pf8GoP_r2`TiXA&Pf8GoP_
-r1lm]XA&Pf8Go8Sr1lm]S3m.D6N!WMr1$+OS3m.L8Go8Sr1lm]Ue(Eb9`1\Wr1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8GoP_r2`TiXA&Pn9`1tcr2aN.Zr$\-;#I[sr3T;uZr$[r8Gn]<r/<f:N'7*'61^!m
-qh.$-KKB!`3r=Rkqh.$,e?JuQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,s]PRMI9`27or3T;uZr$\-;#I[sr3T;uXA&Pn9`27or2`TiXA&Pn9`1tc
-r2`TiUe(Eb9`1\Wr2`TiXA&Pf8GoP_r2`TiUe(Eb9`1tcr2`TiXA&Pn9`1tcr2`TiZr$\-;#I[s
-r3T;u]N"g9;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uXA&Pn9`1tcr2`TiXA&Q!;#I[s
-r3T;uZr$\-;#It*r1$+NKKB!`3r=Rkr/<f:S3m/?`;fl;s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r69llZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#It*
-r4H#,]N"gA<;aCFr4H#,`**#ND#CqFr5;b9]PRMa=o?3@r4H#,Ue(*82Y2hbr1$+Rs8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7d%m-iW_hW`SBr4HkDZr$\5<;aC.
-r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r5;b9`**#^?2DNsr6/IEb[(.j?2VWDr6/IE`**#^?2V?7
-r00MFPX4NVX4c:bk1nbg`JON2=o?3@r5;b9`**#V=o?3@r4H#,`**#N<;aC.r4H#,]N"gA<;aC.
-r3T;u]N"g9;#I[sr3T;uZr$\-;#ICgs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7d%m-iW_hU9p)
-bKS5L`Pod7`Pfa7`k8n\S3m.d<;a[;r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#^?2VWD
-r6/IE`**#V=o?KLr5;b9`**#V=o@'1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<[_Gq;gN)Sm;2P4oCO1r4H#,`**#V=o>pKr5;b9`**#V=o?KLr5;b9b[(.j?2VoP
-r6/IEb[(.j?2VWDr5;b9`**#V=o?3@r5;b9`**#N<;a[;r5;b9`**#V=o?3@r5;b9`**#V=o?3@
-r4H#,`**#N<;a[;r4H#,`**#N<;a[;r5;b9]N"gI=o>p3r5;b9]N"gI=o?3@r5;b9`**#^?2VoP
-r6/IEc%Gr<?2VoPr6/IEb[(.j?2VoPr5;b9b[(.j?2WK5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7crjQGI^kLe#%r1-OZPX4o!2Z/Lso8>NuM`1L'6N"Jq
-r5;b9b[(.b=o?3@r6/IE`**#^?2VWDr6/IE`**#V=o?3@r5;b9`**#V=o?3@r6/IE`**#^?2VoP
-r6/IEc%Gr<?2Vs"r6/IEb[(.j?2VoPr6/IEb[(.kKD`r!r69llb[(.j?2VoPr6/IEb[(.b=o?3@
-r6/IE]PRMa=o>p3r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b4m-!U!n)39ig"bH4eCMgec+CX%
-['[3I['Zm8XfJP*X/rGIO_"'A2Y2hbqh.$-KKB!`3qJ7fqh.$%M`1Hc3r=Rkr1$+OZr$\5<;a+"
-r3T;u]N"g9;#It*r4H#,]N"gA<;a[;r4H#,`**#V=o>p3r4H#,`**#V=o?3@r5;b9`**#V=o>p3
-r5;b9]N"gI=o?3@r5;b9]N"gI=o>p3r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;a+"
-r4H#,Zr$\5<;aC.r4H#,Zr$\5<;a+"r4H#,]N"gA<;aC.r3T;u]N"gA<;aC.r4H#,Zr$\5<;b!n
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VrNYPb1er1-OZUe(EZ8Go8S
-r1$+OUe(EZ8GnuEr1lm]Ue(ER6N!WMr1$+OS3m.D6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??
-r1$+OS3m.D6N!??r1$+OS3m.D6N!??r1lm]S3m.L8Go8Sr1lm]S3m.L8GnuEr1$+OS3m.D6N!??
-r1$+OS3m.D6N!??r1$+OS3m.D6N!WMr1$+OS3m.L8GnuEr1$+OS3m.D6N!WMr1lm]Ue(EZ8GoP_
-r2`TiXA&Pn9`1tcr2`TiXChC39`1tcr1lm]N'6cj2Y2hbo8>NuM`1Hc3r=Rkqh.#sF=Qm?2Z2'\
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+Wn;#ICg
-r2`TiXA&Pn9`1u(r2`TiXA&PfD>^J/r1lm]Ue(Eb9`1\Wr1lm]Ue(EZ8Go8Sr1lm]S3m.L8GnuE
-r1lm]Ue(ER6N!WMr1lm]Ue(EZ8Go8Sr1lm]XA&Pf8GoP_r2`TiXA&Pn9`1u(r3T;uZr$\%9`1tc
-r3T;uXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`27or3T;uZr$\-;#HhM
-qh.$-KKB!`3qJ7fr/<f9jMClrs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+ILkPVtlr2`TiZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#It*r3T;u]N"g9;#I[s
-r4H#,]N"g9;#It*r4H#,]N"gA<;a+"r/<f1M`1Hc3r?:)s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_>6n)iE\g"bH\`JON";#I[sr3T;uZr$\5<;a+"r4H#,Zr$\5<;aC.
-r4H#,]N"gAD#D4Sr4HkD`**#V=o>pKr5;b7`JON2=o>pKr4HkDS3m.44m]>!g"bH4eCN'tf)!@B
-r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"g9;#I[sr3T;uZr$\-;#I[sr3T;uXA&Pn9`27o
-r2`TiZr$VSYQ+Y&s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)39idaZjreCMgec,@T?`5T^6`Ppo@I/Kd2
-r5;b9]N"gI=o>p3r5;b9`**#N<;a[;r5;b9`**#V=o?3@r5;b9`**#ND#D4SqSe<h`**#V=o-*o
-r5;b<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d#gt_Fk>k<k3
-r/<f:Zr$\5<;aC.r4H#,]N"gI=o>pKr5;b9]PRMa=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
-r5;b9]N"gA<;aC.r4H#,]N"gA<;aCFr4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.
-r4H#,Zr$\5<;a+"r3T;u]N"g9;#It*r4H#,]N"gI=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
-r5;b9]PRMa=o?3@r5;b9oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-m.9o6m-ilnkLnYIf>PB#PX4o!2Y2hbo8>NuM`1Hc3rG4.r5;b9`**#V=o?3@r5;b9`**#V=o>pK
-r5;b9]PRMa=o>pKr5;b9]PRMa=o>pKr4H#,]PRMa=o>pKr5;b7`JON2=o?KLr5;b9b[(.b=o?KL
-r5;b9c%Gr4=o?KLr6/IEb[(.j?2VoPr5;b9`**#ND#D4Sr4HkD`**#V=o>pKr5;b9]N"gA<;aC.
-r4H#,]N"gA<;aCFr4H#,`**#N<;a[;q:sBUjQFt@f#u:^]=bhh]Y1AIXfJP*Unsl_V50o`Us+s3
-r/<f9HoV"V3r=Rkqh.$-KKB!`3r=Rkqg:BiF=R3Q62\)dr3T;uXA&Q!;#ICgr3T;uZr$\-;#I[s
-r4H#,Zr$\-;#I[sr3T;u]N"gA<;a+"r4H#,]N"gA<;a+"r4H#,]N"g9;#It*r4H#,]N"g9;#It*
-r3T;uZr$\5<;aC.r3T;u]N"g9;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[s
-r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\m`rH)=s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8(6Lr1$+OPX55;6N!'6r00MFPX55;6N!??r00MFS3m.<62[6>
-r00MFS3m.<62[6>r00MFS3m.<62[6>r00MFPX55362Zs5r00MFPX55;6N!'6r00MFPX55362Zs5
-r00MFS3m.<62[6>r00MFS3m.<62[6>r00MFS3m.<62Zs5r00MFPX55362Zs5r00MFPX55362Zs5
-r00MFS3m.<62[6>r1$+OPX55;6N!??r1$+OS3m.D6N!WMr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
-r1lm]Ue(ER6M$*nqg:C#KKA^_2Z&.gqh.#sF=R0@3r=:aqh.$,bbkF?s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s88rlr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8GnuEr1lm]S3m.L8GnuEr1lm]S3m.D6N!WMr1$+OS3m.L8GnuEr1lm]S3m.D6N!??
-r1$+OS3m.L8Go8Sr1lm]Ue(EZ8GoP_r2`TiXA&Pn9`1u(r2`TiXChC39`1tcr2`TiXA&Pf8GoP_
-r1lm]XA&Pf8Go8Sr1lm]XA&Pf8GoP_r2`TiXA&Pn9`1tcr2`TiXA&PV60r\Cqg:BiF=Qm?2Z&.g
-qrGTns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d6gsQ%q8Go8S
-r2`TiUe(Eb9`1tcr2`TiXA&Q!;#I[sr2`TiZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[s
-r3T;uZr$[r8Ge'$qh.$-KKB"k_>jQ8s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-i8j(Sgtq8<X8K%mr2`TiXA&Pn9`27or2`TiZr$\%9`27or3T;uZr$\-;#I[sr3T;u]N"gA<;aC.
-r4HkD`**#ND#CqFr5;b9]N"g!6MlEsnXa"6eCMgec-+>UbKS5nbfTdi;#I[sr3T;uZr$\-;#I[s
-r3T;uZr$\-;#I[sr3T;uZr$\%9`27or2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`Tls8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<[_Gi8j(SgtpK/f#u:^`5T^6`Pod7`Q#R%r0:.WZr$\5<;aC.r4H#,]N"gA<;aC.
-r4H#,]N"gA<;aC.r4H#,`**#ND#D4Sr5;b9`**#ND#D4Sr5;b9]N"gRKE(uOs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d%m-iW_hXR1Bqh.$-KKB%49`27or3T;uZr$\-;#@V?
-r3T;uZr$\5<;aC.r4H#,]PRMa=o>pKr5;b9`**#ND#D4Sr4HkD]N"gA<;aC.r4H#,]N"g9;#It*
-r3T;uZr$\-;#I[sr3T;uZr$\-;#ICgr3T;uZr$\%9`27or2`TiZr$\-;#I[sr2`TiZr$\-;#I[s
-r3T;uZr$\-;#It*r4H#,]PRMa=o>pKr5;b9`**#V=o?3@r4H#,]PRMa=o>p3r5;b9]N"gA<<*!u
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIg"bH:]XIEi2Y2hb
-o8>NuM`1Hc3qJ7fr00MF]N"gA<;aC.r4H#,]N"gA<;aCFr4H#,]N"gAD#CqFr4H#,]N"g9;#It*
-r4H#,Zr$\5<;aC.r4H#,]PRMa=o?3@r4HkD`**#V=o>pKr5;b9]PRMa=o>p3r5;b9]PRMa=o>pK
-r5;b9]PRMa=o>pKr5;b9]PRMa=o>pKr4H#,]N"gA<;aC.r4HkDZr$\5<;aC.r4H#,]N"gA<;aC.
-r4H#,]N"gA<9`)HdaZjkbg!c4]sP/RX/rFnSt)UQUnji_Unsm2O_"?:3;\@iluX`SHoUJ7.dV7,
-o8>NnF=Qm?2Z%k]r/<f:XA&Pn9`1tcr2`TiXA&Pn9`1tcr3T;uXA&Q!;#ICgr3T;uZr$\%9`1tc
-r2`TiZr$\%B)J`(r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#ICgr3T;uXA&Q!;#ICg
-r3T;uXA&Q!;#I[sr3T;uXA&Q!;#ICgr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr3T;uXA&Pn9`1tc
-r3T;uXA&Pn9`1tcr2`TiXA&Pn9`1tcqTPi:s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-r9VB"Pu7ID62Zs5r00MFPX55362Zs5r00MFPX55+4oCO1r00MFN'7*'62Z[)r00M=M`1Kl4oC7%
-r/<f:N'7)t4oCO1o8>O)N'7)t4oCO1r/<f:PX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5
-r00MFPX55362Zs5r00MFPX55+4oCO1r/<f:PX55362Zs5r00MFS3m.<62Zs5r1$+OPX55362Zs5
-r1$+OPX55;6N!??r1-OZSP8sP9`1GTr1-OZUe(ES9`1\Wr1lm]Ue(EZ8Go8Sr1$+NHoV"N3;\@i
-qh.$-KKAIA.f4l[luX`SHoV"N3;Ujrs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!qm:DAS3m.D6N!??r1lm]SP8sW8Go#Pr1lm]SP8sO6N!??r1$+OS3m.D6N!??
-r00MFS3m.<62[6>r00MFS3m.D6N!'6r1$+OS3m.<62[6>r1$+OS3m.D6N!??r1$+OS3m.L8Go8S
-r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8GoP_
-r1lm]XA&Pf8GoP_r2`TiUe(Eb9`1\Wr1lmTM`0pD.f4TQluX`SHoU_U2Y?_=s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQGI^kLnYIqSe<hUe(EZ8Go8Sr1lm]Ue(Eb9`1\W
-r2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2aN.XA&Pn9`27or2`TiN'7&c3;\(_
-r00MIs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhW`SBr3T;uUe(Eb9`1\W
-r2`TiXA&Pf8GoP_r2`TiXA&Pn9`1tcr3T;uZr$\-;#I[sqm:DAZr$\5<;a+"r4H#,]PRMQ;#ICg
-qg:BpM`/Mm`QQKMbKS5Sbg">Tc,@T?r4Ij`XA&Q!;#ICgr2`TiXA&Q!;#I[sr2`TiZr$\%9`27o
-r2`TiXA&Pn9`1tcr1lm]XA&Pf8Go8Sr2`TiUe(EZ8GhJas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
-fZ_O^bg")F`Pfa7`5T^JXIo*B2Z0pYr3T;uZr$\-;#I[sr3T;uZr$Y,Er<RLr3T;u]PRMQ;#ItB
-r4H#,]PRMYD#CqFr4H#,]PRMQ;#It*r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
-m.9o6m-ilnkLnYIkbX@;HoUJ7.f>f'r3T;uXA&PnB)K#4r2`TiXA&Q!;#I[sr3T;tZuZ)O;#It*
-r3T;u]N"g9;#ItBr3T;uZr$\5<;a+"r3T;uZr$\-;#I[sr3T;uXA&Q!;#ICgr3T;uXA&PnB)J`(
-r2`TiXA&Pf8GoP_r1lm]XA&Pf8GoP_r1lm]XA&Pn9`1\Wr2`TiUe(Eb9`1tcr3T;uZr$\-;#It*
-r4H#,]N"gA<;X%Cr4H#,Zr$\5<;a+"r3T;uZr$\-;#I[sr4HkGs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH4eCMXP](:h<o8>NuM`1Hc3p^r<qg:BpM`1L79`2P&
-r4H#,Zr$\-;#I[sr3T;uZr$\5<;a+"r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uXChC;;#I[s
-r3T;u]N"gA<;aCFr4HkD]N"gAD#CqFr4H#+ZuZ)W<;aC.r4HkD]N"gA<;a+"r3T;u]N"g9;#I[s
-r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;tZuZ)O;#I[sr3T;tZuYBRX2Mur
-]=bha['Zm8Xe_ehUnsl_V50o`Us+s3o8>NnF=QX!.dV7,qh.#sF=R083:(`:luX`DF=R3Q62[fX
-r2`TiXA&Pf8GoP_r1lm]Ue(Eb9`1\Wr2`TiXA&Pf8Go8Sr2`TiUe(EZ8Go8Sr1lm]XA&Pf8Go8S
-r1lm]XA&Pf8Go8Sr2`TiXA&Pn9`1tcr2`TiXA&Pf8GoP_r1lm]XA&Pf8GoP_r1lm]Ue(Eb9`1\W
-r2`TiUe(Eb9`1\Wr2`TiUe(EZ8GoP_r1lm]Ue(Eb9`1\Wr2`TiXA&Pf8GoP_r1lm]Ue(EZ8GnuE
-r1lm]S3m.TB)ho2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W"f9`0i4r/<f:N'7)t4oC7%
-r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%o8>NuM`1Hc3qJ7fo8>NuM`10b2Y2hbqh.$%M`1Hc3qJ7f
-o8>NuM`1Kl4oC7%r/<f:N'7)t4oCO1r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
-r/<f:PX55+4oCO1r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5r00MFS3m.<62Zs5
-r1$+OPX55<9`1GTr0:.WSP8sP9`1GTr1-OZSP8sG60r\CluX`DF=QX!.f4TQluX`DF=QX!.dV7,
-luX`RbbkF?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,q`JOMW62Zs5
-r1$+OPX55;6N!'6r1-OZPX55<9`1DIr00MFSP8sG62Zs5r00MFPX55362Zs5r00MFN'7*'62Z[)
-r/<f:PX55+4oCO1r00MFPX55362Zs5r1$+OPX55;6N!??r1$+OS3m.E9`1GTr1lm]SP8sWD>^2#
-r1lm]Ue(EZ8Go8Sr1-OZUe(ES9`1DIr1lm]S3m.L8Go8Sr1lm]Ue(EZ8GnuEr1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8GnuEqh.#sF=QX!.dV7,qg:C$N'74@s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-ilnkN:RTg"bH4eCN=.hYX[#r1$+OS3m.L8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]XA&Pf8Go8Sqg:BiF=QX!.f6Sns8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+QpA*Y-kMYFag"bH^[>t0\8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8GoP_r1n3-XA&Pn9`1tcr2aN.Zr$\%B)K#4r2`ThHoU_U2V>[NfZ_O^bg")F`QQKM
-`5T^=bg#@gYl(Rrr2aN.XA&Pn9`1tcr2`TiXA&Pn9`1\Wr2`TiUe(Eb9`1\Wr1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8Go8Sr1lm]XChM4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2g"bH4eCN'tf#5PH`5T^6`Pod7`TE.\
-r1lm]XA&Pn9`1tcr2aN.XA&PnB)J`(r3T;uXChC;;#ID,r3T;uZr$\-;#I[sr3T;tZuZ)O;#I[s
-r3T;u]PRWJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-ilnkLnYIdaZk"`4bMZ.f4TQ
-r/<f:XA&Pf8GoP_r2`TiUe(Eb9`1tcr1lm]XChC39`1tcr2`TiZr$Y,Er<:@r3T;uXA&Q!;#I[s
-r2`TiZr$\%9`1tcr2`TiXA&Pn9`1tcr1lm]XA&Pf8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8Go8Sr1$+OUe(EZ8Go8Sr1lm]Ue(EZ8GoP_r2`TiZr$\%B)K#4r3T;uXA&Q!;#I[s
-r3T;uZr$\%9`27or3T;uXChC[M#[MTs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
-g"bH;gtpK/f#5PHk)EF.F=R0@3p^r<luX`SHoUJ7.f?)5r2`TiZr$\-;#ICgr3T;uXA&Q!;#ID,
-r3T;uZr$\%B)K#4r2aN.XA&PnB)J`(r1n3-Ue(Eb9`1tcr2`TiXA&Pn9`1tcr2aN.Zr$\-;#I[s
-r3T;uZr$\%9`27or2aN.XA&Q!;#I[sr3T;uXChC;;#ICgr2aN.Zr$\-;#I[sr3T;uXChC39`1u(
-r2`TiXChC39`1u(r1lm]Ui$%29`1tcr2`TiXChC39`1tcqm:C^`PoI%]sP/RUnsl_V50o`Unji_
-Unsm2O_!g#.dV7,qg:BiF=QX!.eAQVluX`KM`1Hc3p^r<o8>O)XA&Pf8GoP_r1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8Go8Sr1lm]Ue(ES9`1GTr1-OZSP8sW8Go#Pr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1$+OUe(ER6N!WMr1$+OUe(ER6N!WMr1lm]Ue(ER6N!WM
-r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8GnuEr1lm]S3m.D6N!??r1$+OS3m.D6N!??r1$+Om)8r(s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s800Dqh.$.N'7)t4oC7%r/<f9KKB$i4o9mnqh.$-KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$%M`1Hc3qJ7fo8>NuM`1Kl4oCO1
-r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r00MFN'7*'62Z[)r00MFN'7)t4oCO1
-r00MFN'7*'62Z[)r00MFN'7*'62Zs5r00MFPX55362[!Fr1$+OPX55362Zs5r1$+OPX55;6N!'6
-r00MFPu7IL6N!'6r/<f*F=QX!.dV7,qg:BiF=QX!.dV7,luX`DF=QX!.f.Ads8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VoMdJT4pr00MFPX55362Zs5r00MFPX55;6N!'6
-r00MFPX55362Zs5r00MFPX55362Zs5r00MFN'7)t4oC7%r/<f1M`10b2Z/Lsr/<f:N'7*'62Z[)
-r00MFPX55362Zs5r00MFPX55362Zs5r00MFSP8sP9`1DIr1$+OSP8sP9`1GTr1-OZSP8sP9`1DI
-r1$+OS3m.<62[6>r1$+OS3m.<62[6>r1$+OS3m.D6N!??r1$+OSP8sO6N!WMr1-OZS3m.44m[8?
-luX`DF=QX!.dV7,qm:DDs8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(SgtpK/f$`(!
-fZ_Okbffp[D>]njr1$+OS3m.D6N!??r1$+OS3m.D6N!BJr1$+OSP8sO6N!BJr1-OZSP8sP9`1GT
-r1-OZSP8sP9`1GTr1-OZUe(EB4m[8?r+n1UF=R+AdJs7Hs8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
-k1nbFgtqnGXSeSTr1$+OS3m.D6N!??r1$+OS3m.D6N!WMr1$+OUe(ER6N!WMr1-OZUe(EZ8Go8S
-r1lm]XA&Pn9`1\Wr2`TiUe(B13;\(_fVEc8bg">Tc-+>UbKS5L`Pp$Ec,@T?bKS6/XChC+8GoP_
-r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]S3m.L8GnuEr1$+OUe(ER6N!WMr1$+OUe(EZ8GnuE
-r9VB%s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7crjQG4OhU9p)`5T^=bg")F`Pfa7aK268HoV&"8GoP_r1lm]Ue(EZ8GoQ$
-r2`TiXA&Pn9`1tcr2`TiXA&PnB)J`Br2aN.XA&PnB)J`(r2`TiUi$%*8Gqhms8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIg"bH4eCN9rbN=dbluX`DF=R3a8Go8Sr1lm]Ue(EZ8Go8S
-r1n3-Ue(EZ8Go8Sr2`TiXA&PnB)J`(r2`TiXA&PnB)J`(r1lm]XA&Pf8GoP_r1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8Go#Pr1lm]SP8sO6N!BJr1$+OS3m.D6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??
-r1$+OS3m.D6N!WMr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8GoP_r1lm]XA&Pf8GoP_
-r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Ci8j(SgtpK/f$`(!`5T^HPC`(B.dV7,
-luX`DF=QX!.dV7,r/<f:XA&Pf8Go8Sr2`TiUe(EbB)JGqr2`TiXA&Pf8GoQ$r2`TiXA&Pf8Go8S
-r1lm]Ue(EZ8Go8Sr1lm]Ue(EZD>^2#r2`TiUe(Eb9`1\Wr2aN.Ue(EbB)JGqr2aN.Ue(Eb9`1tc
-r2aN.XA&PnB)JGqr2`TiUe(Eb9`1]'r2`TiUi$%29`1tcr1lm]XA&Pf8Go8Sr2`TiUe(EZ8Go8S
-r1lm]Ue(EZ8Go8Sr2`TiUe(Eb9`1u(`k8mi['ZX*Unji_Unsl_V50o`Us+s3luX`DF=QX!.dV7,
-luX`DF=QX!.dV7,luX`DF=R0@3rGdEr1lm]Ue(EZ8Go8Sr1$+OUe(ER6N!??r1-OZS3m.E9`1GT
-r1$+OS3m.D6N!'6r1$+OSP8sP9`1GTr1lm]SP8sW8GnuEr1lm]S3m.D6N!??r1$+OS3m.D6N!??
-r1$+OS3m.D6N!??r1$+OPX55;6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??
-r1$+OS3m.D6N!??r00MFS3m.D6N!'6r1$+OS3m.<62JO$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-qUDbHKKB!`3r=Rkqh.$-KKB!X3;\@iqh.$-HoV"V3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$%M`1Hc3qJ7fo8>O)N'7)t4oC7%r/<f:N'6cj2Y2hb
-o8>NuM`1Kl4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
-r/<f:PX55+4oCO1r00MFPX55362[!Fr00MFPX55362Zs5r00MFPX55362Zs5r00MFN'7)t4m[8?
-lte*:F=QX!.dV7,lte*:F=QWn.-taulte*H`2s"=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!r1-OZN'7*'62Z[)r/<f:N'7*'62Zs5r00MFPX55362Zs5r00MFN'7*'62Z[)
-r00MFN'7)t4oC7%r/<f:N'7&k3r=Rkqh.$-KKA^_2Z&.go8>O)N'6cj2Z/Lsr/<f:N'7)t4oC7%
-r/<f:N'7*'62Z[)r00MFN'7*'62Z[)r00MFPu7I<4oCO1r00MFPX55362[6>r00MFPX55362Zs5
-r00MFPX55362Zs5r00MFPX55362[!Fr00MFSP8sO6N!??r1$+NHoV%F3UCi;luX`DF=QX!.f%lI
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG[\gsX^'daZjreCMgec.L7`f>PB#PX55362Zs5
-r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5
-r00MFF#iT'.-tauqg:C's8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhWE&(r1lm]PX55;6N!'6
-r00MFPX55362Zs5r1$+OPX55;6N!'6r00MFS3m.<62[6>r1$+OSP8sP9`1GTr1-OZSP8sP9`'K(
-lte*4NE4]UbL4nkbKS5L`Pp$Ec.L7``5T^=bg">Tc02gEr1-OZSP8sP9`1\Wr1-OZUe(ER6N!??
-r1$+OS3m.D6N!??r1$+OUe(ER6N!??r1$+OS3m.D6N!??r1$+OS3m.TB)ho2s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQ
-daZjkbg")F`Pfa7`5T^6`Ppu!<rA1Jr1lm]Ue(Eb9`1]'r1lm]Ue(EZD>^2#r1lm]Ui$%*8Go9#
-r1lm]XA&Pf8Go8Sr1lm]Ue(EZ8Go8Sr2aN1s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39i
-i8j(LeCN'tf#u:^f:7<VCaeXl.f>5gr1lm]SP8sW8Go#Pr1-OZSP8sO6N!BJr1lm]SP8sW8Go#P
-r1lm]Ue(EZ8GoP_r1lm]Ue(EZ8Go8Sr1-OZUe(EZ8Go#Pr1-OZSP8sP9`1GTr1-OZPu7IL6N!*G
-r1$+OS3m.<62[6>r00MFPX55362[9Ir00MFS3m.<62[6>r00MFS3m.<62[6>r1$+OS3m.D6N!??
-r1-OZSP8sP9`1GTr1-OZSP8sP9`1GTqTPi2m-"<=`qSi_r:J#$pA+ags8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5L`Pop"V<i"HluX`DCaeXl.dLUjlte*JF#j/g6N!??
-r1-OZUe(EZ8Go#Pr1lm]SP8sW8Go#Pr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go#Pr1-OZUe(ES9`1GT
-r1$+OSP8sP9`1GTr1-OZSP8sP9`1GTr00MFPX55+4oCO1r0:.WSP8sW8Go8Sr1lm]Ue(EZ8Go8S
-r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go#Pr1lm]Ue(ES9`1GTr1-OZUe(ES9`1\Wr1-OZUe(EZ8Go8S
-r1-OZUe(EZD7$[WUnsl_V50o`Unji_Unsm.Kk'Ic.-u%*lte*:CaeXd.-taulte*:F=QWn.-tau
-qg:C$Ue(ER6N!WMr1$+OS3m.D6N!??r00MFS3m.<62Zs5r00MFPX55362Zs5r00MFPX55362Zs5
-r00MFS3m.E9`1,@r1$+OS3m.D6N!'6r1$+OPX55;6N!'6r00MFPX55362Zs5r00MFPX55362Zs5
-r00MFPX55362Zs5r00MFS3m.<62[6>r00MFS3m.<62Zs5r1$+OPX55362Zs5r00MFPX55362Zs5
-r00MFS3m.<62Zs5r1$+OUi$/3s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VtU<Vq/'qg:C#HoV"N3;\(_
-qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"V3r=:aqg:C#HoV"N3;\@i
-qg:C#KKB!`3r=Rkqh.$-KKB!`3r=Rko8>NuM`10b2Y2hbo8>O(KKB$i4o9mno8>NuM`1Kl4o9mn
-r/<f9KKB$i4oC7%qh.$.N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
-r00MFN'7*'62Z[)r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%qh.#rA0gMX.-taulte*:CaeXd.-tau
-lte*:CaeXd./Ll`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,s]SQH<3rFq"
-qh.$.N'7)t4oC7%r/<f:N'7&k3rFq"r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%qh.$-KKB!`3r=Rk
-qh.$-KKB!`3r=:aqh.$-KKB!`3r=Rkqh.$-KKB!`3r=:aqg:C#KKB!`3rFq"qh.$.N'7)t4oC7%
-qi+VRN'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7*'62Z[)r00MFN'7*'62Z[)r/<f:N'7)t4oC7%
-r00MFPX55362Zs5r00MFPX55362Z[)lte*:CaeXd.-taulte*IKKB/5s8W-!s8W-!s8W-!s8W-!
-s8W,kpA*q=n)39ig"bH;gtpK/f%A3ibKS5Sbg">Tc0r<*r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
-r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4o:4=r/<f:PX55362Z[)lte*9A0gJO,lFHT
-s8W-!s8W-!s8W-!o_/+Em-ilnkN:RTg"bH^Ui$$o62Zs5r/<f:PX55362Zs5r00MFPX55362Zs5
-r/<f:PX55362Z[)r00MFPX55+4oCRBr00MFPu7IE;>c\Vqh.$.AMN@k7+0T9daZjreCMgec-+>U
-bKS5L`Pp$Ec-+>U`5T^I`4c)ED>]Var1-OZPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5
-r00MFPX55362Zs5r00MFPX55;6N!'6r00MIs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5L`Poj0]#V4`
-qg:C$Ue(EZ8Go8Sr1lm]Ue(ES9`1GTr1$+OSP8sP9`1\Wr1-OZUe(ES9`1GTr1-OZSP8sP9`1GT
-r0:.WSP8n0YlFb's8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5O[B](?.dUt"
-r,XmrS3m.E9`1GTr1-OZSP8sP9`1GTr1-OZSP8sP9`1GTr1-OZSP8sP9`1GTr1lm]SP8sW8Go#P
-r1-OZSP8sP9`1/Qr0:.WSP8sG62Zs5r00MFN'7*'62Zs5r/<f:PX55+4oCO1r/<f:Pu7I<4oCO1
-r00MFPX55362[!Fr/<f:PX55+4oCO1r00MFN'7*'62[!Fr00MFPu7ID62Zs5r00MFPX55362[!F
-r1$+OPX52RErZ1>s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYI
-daZjkbg")F`OidrkB98ZA0gMX.-kChlXV:,A0gJO,l<6Ur1$+OS3m.=;>ctYr1-OZSP8sP9`1GT
-r1-OZSP8sP9`1GTr1-OZSP8sP9`1GTr1-OZPu7IL6N!*Gr00MFSP8sG62Zs5r00MFPu7IM9_kNC
-f:7<DKOX:i.dLUjlXV:-CaeXd.-taulte*IHoV"V3rG4.r1-OZSP8sW8Go#Pr1-OZSP8sP9`1GT
-r1-OZSP8sP9`1GTr1-OZS3m.E9`1,@r1-OZPu7IM9`1GTr0:.WS3m.E9`1DIr1$+OUi!06Xe_eh
-S=Z7HV50o`Ur\7"lte*9A0gJO,jStdlXV:-CaeXd.-taulte*:Caf1.3;f:5r1$+OPX55;6N!'6
-r00MFPX55362Z[)r00MFPX55+4oCO1r/<f:PX55+4oCO1r/<f:PX55362Zs5r00MFPX554;>cYE
-r00MFPX55362Z[)r00MFN'7*'62Z[)r/<f:N'7)t4oC7%r/<f:PX55+4oCO1r00MFPX55362Z[)
-r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5r00MFN'7*'62Z[)r00MFPX55+4oCO1
-r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s800Dr,XmrF#j,F3;dhXqg:C$F#j,F3;dhXr,XmqHoV%F3W*qY
-qg:C$F#j/>3W"1`r,XmqHoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\@i
-qg:C#HoV%F3W*qYr,XmrF#j,F3;\@iqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$-KKB$i4oC7%qh.$-KKB$i4o9mnr/<f:N'7)t4o9mnr/<f9KKB$i4o9mn
-qh.$-KKB!`3r=Rkqh.$-KKB!X39t*#lXV:,A0gMX.-kChlXV:,A0gJO,jStdlXV:;`2s"=s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VoUiVS9hqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
-r/<f9KKB$i4o9mnr/<f9KKB$i4o9mnqh.$-KKB!`3r=Rkqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_
-qg:C$Cbu!#1$`?qlXV:&<$1F:,j/D^lXV:,Jn4)AO8Pejqi+VQKKB!`3r=Rkqh.$-KKB!`3r=n:
-qh.$.N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
-r/<f:N'7&c3:(H0lte*:CaeXd.-taur3_Rbs8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-j)lgtCK>
-daZjreCMgec-k+mbKS5ZeCOGlMu8Msr/<f9KKB!`3r=Rkqh.$-KKB!X3;\@iqg:C#KKB!`3r=Rk
-qh.$-KKB!`3r=Rkr/<f:N'7)t4o:4=r/<f:N'7)[3TjWslXV:,A0grn_#OH7s8W,kpA+(Hp#tc2
-i8j(Sgtqt:Nr4i!r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4o:4=
-r/<f:N'7)t4oC7%r/<f9KKAF0,j]=qkeaRWgtp`>hU9p)daZjkbg">Tc-+>U`5T^=bg">Tc-+>U
-m^/#PN'7)t4o:4=r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r00MFN'7)t4oC7%r00MFN'7*'62Zs5
-r00MFPX55362S$0s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIfZ_O^bg")F`Pfa7`5T^HPC`Ua3rGL7r1-OZSP8sP9`1GT
-r1-OZSP8sP9`1GTr1-OZPu7IM9`1GTr1-OZSP8sP9`1GTr0:.WPX554;>ctYs8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5Sbg">Tc.S&#lte*9A0h)34oCjEr1-OZSP8sP9`1/Q
-r00MFSP8sG62Zs5r00MFPu7ID62[!Fr00MFPu7IE;>ctYr0:.WSP8sH;>cqNr0:.WPX55362Zs5
-r0:.WN'7)t4o:4=r/<f:N'7)t4oC7%r/<f9KKB$i4o9mnr/<f9KKB$i4oC7%r/<f9KKB$i4o:4=
-r/<f:N'7)t4o:4=r/<f:N'7)t4oC7%r/<f:PX55+4oCRBr/<f:N'7*'62Z[)r00MEjMClrs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH-bg")F`Pfa7]=bi$O_!W[.dLUj
-k?KM">Uni7+6QlYr+n1eN'7)t4oC7%r00MFPX55362[!Fr00MFPu7ID62[!Fr0:.WPX52+<W&(I
-r00MENE,n84oCO1r/<f:PX52+<W%e=r/<f:Pu6Y5LWH9^X/rG(XKAP)Xe_ehX/rG5PDdn1;sRs>
-lXV:,A0gJO,jStdlte*9A0h(o3W+h!r0:.WSP8sP9`1DIr0:.WPX554;>cYEr0:.WPX554;>cYE
-r00MFPX55362Zs5r00MFPX554;>cYEr00MFPu7IM9`1,@gS9t.V50o`Unji_Unsm.Kk'FZ,jStd
-lXV:(>Uo&M,jStdlXV:,A0gJO,jStdr,XmrPX55362Zs5r00MFN'7)t4oC7%qh.$.N'7)t4o9mn
-r/<f:N'7)t4oC7%r/<f:N'7)t4o9mnr/<f:N'7)t4oC7%r/<f:N'7)t4o9mnqh.$-KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f9KKB$i4oC7%
-qh.$.N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7$eYlFb's8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-p[%)@F#j/71]2;Sr+n1eCbu!*1]2&Fr+n1eCbu!13W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qY
-r,XmrF#j/>3W*qYr,XmrF#j,F3;dhXr,XmqHoV%F3W*qYr+n1TA0gJO,j/D^lXV:(>Uo&M,j/D^
-lXV:,A0gJO,lD^Dqh.$-HoV"N3;\(_qg:C#HoV"N3;\@iqg:C#KKB!`3r=Rkqg:C#KKB!`3r=:a
-qh.$-HoV"V3r=Rkqg:C#KKB!X3;\@iqh.$-KKB!`3r=Rkqg:C#KKB!`3r=:aqh.$-HoV"V3r=:a
-r,XmaA0g>C.dLUjlXV:,A0gJO,jStdk?KM&A0gJO,k&C+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!r1n3,HoV"N3;\(_qg:C#HoV"N3;\(_qh.$-KKB!X3;\@iqh.$-KKB!`3r=Rk
-qh.$-HoV"V3r=:aqh.$-HoV"N3;\(_qg:C#HoV%F3W"1`r+n1eAMN:G+6?HDj]!>`<$14$+6QlY
-lte*%S:9).^!bE]fZ_O^bg"eabNQ:2qODj.KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$.N'7&k3rFq"
-qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$.N'7&k3rFq"qh.$.N'7)t4o9mnqh.#rA0gJO,jStd
-lXV:,A0gMX.0'>Is8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f$`(!daZk#bfe2Rc-+>U
-fZ_P:SP8p.3;\@iqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qh.$-KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$.AMN@Q.d(%dlte*Em-"$7q<[_Gkj7crjQG4OhWVh\qh.$-KKB!`3r=Rk
-r/<f9KKB$i4o9mnr/<f9KKB$i4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4o:4=r/<f9KKB!`3rEeM
-k?KM!Xde80kMYFag"bH;gtpK/f%A3ibKS5Sbg")F`QQKM`5T^=bg"bX^&*dhqh.$-KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr/<f9KKB$i4oC7%qh.$.N'7&k3rFq"r/<f9KKB/5s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
-g"bH4eCMRW`Pfa7`5T^6`Pom*Z0ZQ^r00MFPX55362[!Fr00MFPu7ID62Zs5qi+VRPX554;>cYE
-r0:.WPu7IE;>c\Vr0:.WPX554;>cYEr00MDbbkF?s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYI
-daZjkbg">Tc,@T?a0i2=CaeXd./[m;r00MFPX554;>cA9r0:.WPX55+4oCO1r0:.WN'7*'62Z[)
-r00MFPX55362[!Fr00MFPX554;>cYEr/<f9NE,n84oC7%r/<f9KKB$i4o:4=qODj%U2o@cLY-`S
-r+.VG>UoVU0)TNAr,XmqHoV"N3;\@iqg:C#KKAsW=Smb4qg:C#KKB!X3;\@iqh.$-KKB!`3r=Rk
-qh.$-NE,n84o9mnr/<f9KKB$i4oC7%qh.$-NE,n84oCRBs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<[_Gi8j(Sgtp5uc-+>U`5T^-]Y1hWWp=1@j]!>`<$14$+6?HDk?KLu<$2!j3rFq"
-r/<f:N'7&t<W%e=r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f9KKB$i4oC7%
-r/<f:Pu6bAO0l:$['[3@XKAP)XfJP*X/rG(XKAP)XfJP*X/rG5PDe444Qfs!lXV:,A0g>C.dLUj
-lXV:,A0gMX./SZYr/<f:PX55+4oCO1r/<f:N'7)t4oC7%r/<f:N'7&t<W%e=r/<f9NE,n84oC7%
-r/<f:PX55362Z[)r00MFPX554;9,)aX/rFnSt)UQUr\7"k?KM">Uni7+6?HDlXV9o<%[HQ.,&/h
-k?KM">UoYf1]31pr/<f:N'7)t4o9mnqh.$-KKB!`3r=Rkqg:C#KKB!X3;\@iqg:C#KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$-KKB!`3r=:aqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\@i
-qg:C#KKB!X3;\@iqh.$-KKB!`3r=Rkqg:C#KKB!`3r=Rkqg:C#KKB!`3r=Rkqg:C#KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr3_Rbs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VqcH2M5.r+n1eAMO+!1]2&F
-r+n1eAMO+!1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!*1]2;Sr+n1eF#j/71]2;Sr,XmrF#j/71]2;S
-r+n1eF#j/71]1f=lXV:(>Uni7+6?HDj]!>b>Uni7+6?HDj]!>`<$14$+513_k)EEo[&hlt^$MnL
-qh.$-HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;dhXqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_
-qg:C#HoV%F3W"1`r,XmqHoV"N3;\(_r,XmqHoV%F3W*qYr,XmqHoV%F3TjWsk?KM">UnoA.d(%d
-j]!>b>UnoA.cjVOk?KM5`2s"=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,qe?Jjl3W"1`
-r,XmrF#j/>3W"1`r,XmqHoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_
-qg:C#HoV"N3;\(_r+n1TA0g89+6?HDj]!>b>UnoA.cjVOkB98GXImqjf%Jj8daZjreCN'tf$`(!
-daZk#bfe2Rc03$KqODj.KKB!X3;\@iqh.$-KKB!X3;\@iqh.$-HoV"V3r=Rkqg:C#KKB!X3;\@i
-qg:C#KKB!`3r=:aqh.$-HoV"V3r=Rkqg:C#KKB!X3;dhXk?KM&A0gJO,jStdlXV:;S9b/7s8W-!
-s8W-!s8W-!s8W-!o_/+QpA*Y-kMYFag"bH;gtpK/f$`(!bKS5ZeCMgec.BnIqh.$-HoV"N3;\(_
-qg:C#HoV"N3;\(_r,XmqHoV%F3W"1`qg:C#HoV"N3;\(_qg:C#HoV"N3;\@iqg:C#KKB!`3rF%Z
-j]!>`<$14$+6f#<kj7d%m-ilnkLnYIl.+D_NE,k'3;\(_qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$.N'7&k3r=Rkqh.$-KKB!`3r=Rkr+n1P>Unlq<p8o=kj7d%m-ilnkN:RT
-daZjreCMgec.L7``5T^=bg")F`Pfa7bKS6,V2P4u3;\@iqg:C#KKB!`3r=Rkqh.$-KKB!`3r=Rk
-qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr4Ijcs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQFt@f$`(!bKS5Sbg")F`Pfa7
-ert[^HoV%_4oCO1qi+VRN'7)t4oC7%qi+VRN'7)t4o9mnr/<f:N'7&t<W%e=r00MFN'7&t<W%e=
-r/<f:N'7*(;?-[rs8W-!s8W-!s8W-!s8W-!s8V`bq;C>si8j(LeCMgec,@T?`5T^6`Pp&`AER2I
-lXV:<HoV%g62Z[)r0:.WN'7)t4oC7%qi+VRN'7&k3rFq"qi+VQKKB!i<VqG1r/<f:N'7)t4oC7%
-r/<f:N'7)t4o9mnqh.$-KKB!`3r,"_kbX?\[B[?V]t:qj['[3P]Y1hWWlU*Hl"!'@<$13r*W'(o
-qeSRqHoV"N3;\(_qg:C#HoV"N3;\(_qKuEBKKB!X3;\@iqKuEBKKB!X3;\@iqg:C#KKB!`3r=Rk
-qKuEBKKB!`3r=Rkqh.$-KKAtJXT/>#s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhTO-f
-bKS5L`PoI%]sP/RaG"-c<$14$+6?HDj]!>`<$14$+8f\)qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
-qi+VQKKB!`3r=Rkqh.$-KKB!`3r=Rkqg:C#KKB!X3;\@iqh.$-NE,,CS&W+P]=bhh]Y1qi]sP/R
-X/rG1['Zm8XfJP*X/rG(XKAP)XfJP*Unsm.Kk'4D+6?HDj]!>`<$14$+6?HDk?KLu<$2$S1])hd
-qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$.N'7&k3rFq"qh.$.N'7)t4o:4=r/<f:N'7&t<W%e=
-r/<f:Pu4?RUnji_UnslrHtqhL.cjVOfi0Qb<$0dm/a$@gk?KLu<$1:..cjVOr+n1eN'7&k3r=Rk
-qh.$-KKB!`3r=:aqg:C#HoV"N3;[emqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qKuEBHoV"N3;\(_
-r,XmqHoV"N3;dhXqg:C$F#j,F3;dSKr+.VKA0h%P-fn;Lqc,$AAMO+!1]2;Sqg:C#HoV%F3W"1`
-qg:C$F#j,F3;\(_r,XmqHoV"N3;\(_r,XmqHoUtM=SmJ*qg:C#KKB!X3;\@iqg:C#HoV"N3;\(_
-qg:C#KKB$r;?-[rs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7ta7r+n1eAMO*o1&G3.qckcN>V>qc1&PT;r+.V\AMO*o1&PT;
-r+.V\Cbu!#1&PiDr+.V\Cbu!*1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!*1](E0j]!>`<$14$+6?HD
-j]!>`<$14$+6?HDj]!>T<%[32+6QlYb`QGf`4aUKf$`(!bKS5Sbg"eabN,gRqh.$.F#j/>3W*qY
-r,XmrF#j/>3W*qYqg:C$F#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr+n1eF#j/71]2&F
-r+n1eCbu!13W*\Lr,XmrF#j/>3W*qYr+.VE<$14$+6?HDj]!>`<$1:..cjVOj]!>b>Uni7+8<=C
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq>$7tr+n1eCbu!*1]2;Sr,XmrF#j/>3W*qY
-r,XmrF#j/>3W"1`qg:C#FAD^\3;\(_qg:C$F#j,F3;\(_r,XmqHoV"N3;dhXr+n1TA0g89+6?HD
-j]!>`<$1:..cjVOlXV:'Xde80kMYFai8j(ZjQG[\gtCK>g"bH4eCN'tf$`(!daZjkbg"eabLa\G
-q36%"F#j,F3;\(_qg:C#HoV"N3;\(_qg:C$F#j,F3;\(_r,XmqHoV"N3;dhXqg:C#HoV%F3W"1`
-qg:C$F#j,F3;\(_qg:C$F#iPs,iquIk?KM">UnoA.dLUjp[%)Cs8W-!s8W-!s8W-!s8W-!s7H$\
-kj7d%m-j)lgtCK>daZjreCMgec-+>UdaZjkbg#@aYkrf-qg:C$F#j/>3W*qYr,XmrF#j/>3W*qY
-r,XmrF#j/>3W*qYr,XmrF#j,F3;[emqg:C#FAD^\3;dhXqg:C#HoV%81$)+Mj\6cW<$1>:Yi+U*
-i8j(SgtqmtH2DtKr,XmqHoV%F3W"1`qg:C#HoV"N3;\(_qh.$-HoV"V3r=Rkqh.$-KKB!`3r45+
-qh.$-HoV"N3;\(_qh.$.F#iDg.d(tCp[%)0oC_JAp#tc2i8j(`gt^T<hU9p)bKS5Sbg">Tc-+>U
-`5T^=bg")F`Rqi3qh.$-HoV"N3;\(_qfGU1HoV%F3W"1`r,XmqHoV"N3;\(_qg:C#HoV"N3;\(_
-qg:C#HoV"N3;\(_qKuEBKKAsW=TAF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjkbg")F`Pfa7`5T^8]XmHG./SZYqh.$.N'7&k3rFq"
-qh.$-KKB!`3r=Rkqh.$-KKAm\@f(g>qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr3_Rbs8W-!s8W-!
-s8W-!s8W-!s6T@Mkj7crjQFt@f$`(!bKS5L`Pod7`Q,Bkk?KM">Uo&M,l<6Uqh.$-NE,k/3rFq"
-qh.$-KKB$i4o9mnqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r45+qh.$-KKAsW=Sn(X
-k,k,m]Xl+q]">Vg]=bhh]Y1qi]t:qj['[3P]Y1hWWlU*Hk?KLi9-E:b)#I;\r+.V\F#j,F3;[em
-qg:C#HoV%F3W"1`qg:C#FAD^\3;\(_qg:C#HoV"N3;S#)qg:C#HoV"N3;\(_qg:C#HoV"V3r=Rk
-qh.$1s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_&&kLnYIdaZjkbg")F`Oidr]=bheXfC&R/`]A<
-fh3IL9c_n[+QZQEj\6cnF#j,F3;\(_qg:C"Hs$8n3;\(_qKuEBHoV"N3;\(_qKuEBHoUtM=SmJ*
-qKuECF#j,F3;S#)r,XmpHs$<BD:m(UbKS5Sbg")F`Oidr]=bhh]Y1\Z[&^:1X/rG(XKAP)XfJP*
-X/rG(XKAP)Xf.\Rgh]+7<$14$+6?HDj]!>`<$14$+6?HDj]!?"AMO(83r45+qg:C#KKAsW=SmJ*
-qg:C"Hs$8n3;\@iqKuEBKKB!X3;\@iqh.$-KKB!`3r=Rkr/<f:N'7)t4o9mnq36#tV50o`Ur[Xa
-j]!>T<%[32+6?HDj]!>T<%[32+5'UFj]!>`<$2$L1&H>Xqg:C#HoV"N3;[emr,XmrF#j/>3W*qY
-r,XmrF#j/>3W!VYr+n1dCdIu81]2;Sr,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr+n1eF#j/71](E0
-qc,$)7Mt2U)!".'j@1!>9-Dn\+QQ!/j@1!J<$2!;-i@d:r,XmrF#j/71]2;Sr+n1eCbu!13W*qY
-r+n1eF#j/>3W*qYr,XmrF#j/>3W!nnr,XmrF#j/>3W"1`qg:C$F#j,F3;dhXqg:BqpA+ags8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,qS9b$D1&FruqckcN>V>nY0)Jm+qc,$@<@@ZD-i7.$qckcN>V>qc1&G3.r+.V\AMO'e0)T98
-r+.V\AMO*o1&PT;r+.V\AMO*o1&Fruj\6cW<$0dd+QZ<<fh3I@9-Dn\+PBC1fh3IL<$0dd+QZQE
-g4Wqe`4ajZhV$]@g"bH;gtpK/f$`(!daZk#bfe2Rc17TLr,XmrF#j/>3W*\Lr,XmrCbu!*1]2;S
-r+n1eF#j/71]2&Fr+n1eCbu!*1]2&Fr+.V\Cbu!#1&PT;r+n1eAMO*o1&PT;r+.V\AMO*o1&PiD
-r+.V\Cbu!#1$)@Vj]!>`<$14$+5'UFj]!>`<$0dd+QZQEj]!>r\YfE,s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\prgJNCbu!#1&PiDr+.V\AMO+!1]1f=r+n1eAMO+!1]2&Fr+n1eCbu!*1]2&F
-r,XmrCbu!13W*qYr+n1eF#j/>3W*\Lr+n1d>V>,;+6?3;j\6cW9c`=p+6?HDj]!>fJn4-!\a8q\
-m.9oEm-!U!n*'-,kj7crjQG4OhV$]@g"bH4eCN'tf$`(!daZjkbg"eabPA9)qg:C#CdIu?3W*qY
-r,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qY
-r+.VE<$14$+6?HDj]!>`<$1t,H2mpEs8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp`>hU9p)
-daZjreCMgec.L7`bKS6%U2p0Q3W*qYr,XmrCbu!13W*\Lr,XmrCbu!13W*\Lr+n1eCbu!*1]2&F
-r+n1eCbu!*1]2&Fr+n1eF#j/71]2;Sr+n1N<$10j)!".'k?KM$e^rL0hY4RXr,XmrF#j/>3W*qY
-r,XmrF#j/>3W*qYqg:C$F#j/>3W"1`r,XmqHoV%F3W!nnqg:C#HoV"N3;\(_qg:C#HoV%F3TX3^
-k?KM4gsQ0%s8W-!o_/+QpA*q=n*'-,g"bH;gtpK/f#u:^bKS5L`Pp$Ec-+>UbKS5L`Pq\DH2M_D
-r,XmrF#j/>3W*qYr,XmrCbu!13W*qYr,XmrF#j/>3W*qYqg:C$F#j/>3W"1`qfGU1HoV%F3W"1`
-r,Xmp`2s"=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-i8j(SgtpK/f%A3i`5T^6`Pod7`RgW/r+n1dHoV"V3r=:aqh.$-HoV"N3;S#)qh.$-HoUtM=Smb4
-qh.$-HoV"N3;\(_qKuEBHoV"N3;S#)qg:C#HoUclq>^Kps8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
-daZjkbg")F`Q#R%`5T^:Mga\d+6?3;r+.V[HoV"N3;\(_qg:C"Hs$9!3r=RkqKuEBKKB!`3r=Rk
-qh.$-HoV"V3r=:aqKuEBHoUtM=Smb4qKuEBHoV"N3;\@iq5on)bg">Tc,@T?]=bhq`PoI%]uI^r
-['[3P]Y1qi]sP/R]=bhh]Y1hWWmbuefh3IK7MsfG)>dD]r+n1eF#j/>3W*qYr,XmrF#j/>3W*qY
-r,XmqCdIu?3W!VYr,XmrF#j/>3W"1`r,XmrF#j,F3;[emr,XmpHs$8n3;g1Es8W-!s8W-!s8W-!
-s8W-!s8VHWp#tc2i8j(LeCMgec,@T?]=bhh]Y1\Z[)m].j@1!>6Q+rS)!".'j@1!I7Mu#&-i@d:
-r,XmqCdIu?3W*qYr,XmrF#j/>3W*qYqeSRrF#j/>3W*qYr,XmrF#j/>3W*qYr+n1eF#j,F3;URp
-g"bH;gtpK/f#u:^bKS5L`PoI%]t:qj['[3I['[?FWiN5'X/rG(XKAP)Xe_eh\Vbdr<$0dd+QQ!/
-fh3I@9-E=q+5':0j]!>`<$2$S1])PZqg:C#HoV"N3;dhXqg:C#FAD^\3;\(_qg:C$F#j,F3;\(_
-qg:C"Hs$8n3;\(_qKuEBKKB!X3;\@iqg:C#KKB!`3ldYJUnsm.FC*Wn+PBC1fh3I@9-E=q+5':0
-j]!>T9-E=q+5':0qckcNHoV%F3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*\Lr+n1eCbu!*1]2&F
-r+n1eCbu!*1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!*1[BX'[uH*_D,f1U);.@pfg?Y16Q+QE);.@p
-j@1!>6Q+QE)<=7(j@1!I7Mu#&-i@O1r+n1eCbu!*1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!*1]2&F
-r+n1eF#j/71]2;Sr+n1eCbu!*1]2;Sr+n1eF#j/>3VhIXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8Vi[kPSmGqc,$@>V>nR-i6mk
-qc,$@<@@ZK0)JWrqc,$@<@@ZK0)Jm+qc,$@>V>nY0)Jm+qckcN>V>nR-i7.$qckcOAMO*o1&G3.
-j]!>_7Mt5]*TT[,fh3IL9c`:a)!+I4j\6cK9-E:b)!".'fi0QUXInG3kMYFakj7ckgtpuMkLnYI
-g"bH;gtpK/f$`(!bKS5ZeCN9b[ek_=r+n1eAMO*o1&PiDr+.V\AMO*o1&PT;r+.V\AMO'e0)Jm+
-qckcN>V>nY0)Jm+qckcOAMO'e0)T98r+.V[>V>nY0)T98qckcOAMO*o1&PT;qckc89c`:a(thP)
-fh3I@9-E=j*SF(.j\6cV7MsfO+RZUss8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+TF<W$D_
-qckcN>V>qc1&G3.qckcOAMO'e0)T98r+.V\AMO*o1&PT;r+.V\Cbu!#1&PT;r+.V\Cbu!#1&PT;
-r+.V\AMN:@*TT[,j@1!I7MsfO+QQ!/fg?Y19-EJ`II-Ruo_/+QpA+@Sq=OCVo_/+IoC_>6n*'-,
-i8j(ZjQG[\gtCK>daZjreCN'tf%A3ibKS5Sbg"eQ[ebARr+n1eCbu!#1&PiDr+n1eAMO+!1]2&F
-r+n1eCbu!*1]1f=r+n1eAMO+!1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!#1$)@Vj\6cK9-E=j*SF(.
-j]!?%s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ik1nb?eCN'tf$`(!bKS5ZeCMgec-+>U
-q36%"Cbu!*1]2&Fr+n1eCbu!#1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\Cbu!#1&PiD
-r+n1eCbu!*1]1f=j@1!>9-DnT);9aQfZ_P9HoV%?1]2&Fr+n1eF#j/>3W*qYr+n1eF#j/71]2;S
-r,XmrF#j/>3W*\Lr,XmrF#j/>3W*\Lr,XmrF#j/>3W!VYqc,#s9-F)LXT/>#s8W-!s8W-!s7H$\
-o_/+Em-iW_hV$]@daZk#bfe2Rc,@T?bKS5L`Pod7`QQKMfY"ZjCbu!*1]2&Fr+n1eCbu!*1]2&F
-r+n1eCbu!*1]2&Fr,XmrCbu!*1]2;Sr,XmrCbu!13W*qYr,XmrF#j/>3W*qYs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o.jQG4OhU9p)bKS5L`Pod7`Pfa7
-`k8n<CcqW31])PZqg:C#FADaT3W"1`qfGU1HoV%F3W"1`r,XmrF#j/>3W*qYr,XmqCdIu81](uS
-r+n1eCbu!*1]!Ves8W-!s8W-!s8W-!s8W-!s8V`bq<726g"bH4eCMgec-+>U`5T^-]Y1qi^"QsS
-fg?Y<7Mu&>1]2;Sr,XmrF#j/>3W"1`r,XmqHoV%F3W"1`qfGU1FAD^\3;\(_qfGU1HoV"N3;\(_
-qg:C#HoV"N3;\(_on[GHbfSPnhU9p)bKS5Sbg">Tc,@T?]=bhh]Y1qi]t:qj]=bhh]Y1\Z[(Eua
-]=bhh]Y2CEIG$t*j@1!A4r!'I)#IPjr+n1eF#j/71](uSr+n1eCbu!*1]2&Fr+n1eCbu!*1](uS
-r+n1eF#j,662YdaqeSRrF#j/>3W*\Lr,XmqFADl9s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhTO-f
-`5T^-]Y1qi]sP/R\?2da9-E"R']__#gccG-4qud9']__#qckcOCbu!*1]2&Fr+n1eCbu!*1]2&F
-r+n1eCbu!*1]2&Fr+n1eCbu!*1]2&Fr+n1eCbts)62YdaprgJ:m-ilnkLnYIg"bH4eCMgec,@T?
-`5T^-]Y1\Z[&^:1X/rG(XKAP)XfJP*\XJc'@nPfO)!".'j@1!I7MsfO+QZ<<j@1!I7Mu#&-i@d:
-r,XmrF#j/>3W*qYqg:C$F#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W"1`r,XmqHoV"N3;dhX
-qg:C#FAD^\3;\(_qg:C#KK>p*Ur[CPj@1!I7Mt2U(th7ofg?Y<7MsfG)<=7(j@1!I7Mu#&-iA$G
-r+n1eF#j/71]2&Fr,XmrCbu!*1]2&Fr+n1eF#j/71]2&Fr+n1eCbu!#1&PT;r+n1eAMO*o1&PiD
-r+.V\Cbu!*1](uSb`QG+St)=BS=H1@[rc*?7Mt2U(th7oj@1!I7MsoE']__#fg?Y<7MsoE']__#
-j@1!`<@@]U1&PiDr+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\Cbu!#1&PT;r+.V\Cbu!#1&PiD
-r+.V\Cbu!*1]2&Fr+n1c`2s"=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!q5onY<@@ZD-i6mkqc,$@<@@ZD-i6mkqc,$@<@@ZD-i6mk
-qc,$@<@@ZD-i6mkqc,$@<@@ZD-i6mkqc,$@<@@ZD-i6mkqc,$)7Mt2U(th7ofg?Y44r!'I(th7o
-fg?Y44r!'I(th7ofg?Y2@lDu`bNS<]kj7d%m-j0)n*'-,kj7d%m-ilnkLnYIg"bH;gtpK/f$`(!
-bKS5Sbg#sJFo5f*r+.V[>V>nY0)Jm+r+.V[<@@ZD-i6mkqc,$@<@@ZD-i6mkqckcN<@@ZD-i6mk
-qc,$@<@@ZD-i6mkqckcN<@@ZK0)Jm+qckcN>V>nR-eUj)fg?Y<7MsfG)<=7(gccG57MsfG);.@p
-gccGH\YfE,s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=rI]r+.V[<@@]U1&G3.qckcN>V>nY0)Jm+
-qckcN>V>nR-i7.$qc,$@>V>nY0)Jm+qckcOAMO'e0)Jm+r+.V\AMO'^-fd`6j@1!I7MsfG)<=7(
-fg?Y44r!'I)!IfWo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+ILkNM:$i8j(ZjQG[\gtCK>
-daZjreCN'tf$`(!bKS5_`4c"p=Su_br+.V\AMO*o1&PT;r+.V[>V>nY0)T98qckcOAMO*o1&G3.
-r+.V[>V>qc1&PT;r+.V\AMO'e0)T98r+.V[<@?Qc']__#gccG57MsfG)>]kKs8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\p[%),m-ilnkLnYIg"bH4eCN'tf#u:^bKS5ZeCN6i^&*1:r+n1eCbu!#1&PT;
-r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V[>V>qc1&PT;r+.V\AMO'^-epm"
-j@1!I7Mu#E:AeZXr+.V\Cbu!#1&PiDr+.V\AMO*o1&PT;r+n1eAMO*o1&PT;r+n1eAMO+!1]1f=
-r+n1eCbu!*1](uSr+n1d<@?He)>]kKs8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtpK/f#u:^
-bKS5Sbg">Tc-+>UfZ_OW`Pp$Ec1lp#r+.V\AMO*o1&PT;r+.VYANfs&1&PT;r+n1eAMO*o1&PiD
-r+.V\AMO*o1&PT;r+.V\Cbu!#1&PiDr+n1eCbtk0_#OH7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH4eCMgec-+>U`5T^6`PoooSblD7r,XmrF#j/71]2;S
-r,XmrCbu!*1]2&Fr+n1dCdIu81](uSr+.V[CdIu11&PiDr+.V\Cbu!#1&PiDr+.VYjPg.=s8W-!
-s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5L`PoI%]u7n/aK25k6Q+ZC'`1lXr+n1eCbu!*1]2&F
-r+n1eCbu!*1](uSr+n1dCdIu?3W*qYr,XmrF#j/>3W*qYr,XmqCdIu?3W!VYr,XmpHs$0nal)7C
-i8j(Sgtp`>hU9p)bKS5Sbg")F`Pfa7]=bhs]XkJW[(Eua]=bhh]Y1\Z['[3I['[3^HtV4u'\Phk
-gccG57Mu#-0)T98r+.V\Cbu!*1]2&Fr+.V\Cbu!#1&PiDr+.V\Cbu!*1]2&Fr+n1eCbu!*1]2&F
-r+n1eCbu!*1]2&Fq5on]s8W-!s8W-!s8W,coC_>6n(HLQdaZjkbg")F`Oidr]=bha['[o-EnNet
-gccG-4r!'I(u.:hj@1!J9ca.J1]2&Fr+n1eCbu!*1]2&Fr+.V\Cbu!*1]1f=r+.V\AMO+!1]1f=
-qeSRrCbu!*1]2&Fr+.VZ`2rV)q<726kj7crjQG4OhU9p)bKS5Sbg!c4]t:qj['[3P]Y1AIXfJP*
-X/rG6Km;9M/_iN(fg?Y44qu[;);.@pfg?Y44r!'I)#IPjr+n1eCbu!*1]2&Fr+n1eCbts)62YOT
-r,XmrCbu!*1](uSr+n1dCdIu81]2&Fr+n1eCbts)62YOTqeSRrF#j/>3W*qYr,XmrF#j,>:?ROT
-Unsm.D,f1U);ICigccG*6Q+ZC'\kkdfg?Y44qud9'\Phkqc,$AAMO+!1]2&Fr+n1eCbu!#1&PiD
-r+n1eAMO+!1]1f=r+.V\Cbu!#1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;qeSR=R>m`.S=H1@
-S=Z7HV50WQS@W9-gccG57MsoE'\kkdgccG-4qud9'\kkdgccG-4qud9'\kkdqc,$AAMO*o1&PT;
-r+.V\AMO+!1\kTFr+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V[>V>qc1&7Z(
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+Vt1&Fruqc,$@<@@ZD-i6mkqc,$@>V>nR-i7.$qc,$@>V>nR-i6mkqckcN<@@ZD-i7.$
-qc,$@<@@ZK0)JWrqc,$@<@?Qc'\kkdgccG*6Q+QE);.@pfg?Y16Q+QE);.@pgccG-4qu^\2WifM
-kj7d%m-j<4p$D;Cp[%)0oC_JAp#tc2kj7d%m-ilnkLnYIg"bH;gtpK/f$`(!bKS5qP^WF/-i6mk
-qc,$@<@@ZD-i7.$qckcN>V>nY0)T98qckcN>V>nY0)Jm+qckcN>V>nY0)JWrqckcN>V>nR-i6mk
-qckcN<@@ZD-i7.$qc,$)7MsoE'\kkdj@1!A4qud9'\kkdj@1!A4r!'I)#::us8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9oHS9b!:0)Jm+qc,$@>V>nY0)Jm+qc,$@>V>nY0)Jm+qckcOAMO'e0)Jm+
-qckcN>V>nR-i7.$qc,$@>V>nR-i6mkj@1!I7MsoE'\kkdgccG-4qud9'\kkdk_<pRs8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n*'-,i8j(Sgtp`>hV$]@daZjreCN9rbKJ,S
-f>PB#Cbtrn0)Jm+qckcN>V>nY0)T98qckcN>V>qc1&G3.r+.V\AMO*o1&G3.r+.V[>V>qc1&Fru
-r+.V[>V>nY0)JWrgccG-4qu[;);ICifg?Y?>UodRs8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
-kj7d#gt^T<hU9p)daZjreCN9rbKJ,SbKS5`]XI`S1]1f=qckcOAMO'e0)T98qckcOAMO*o1&PT;
-r+.VYANfs&1&5BDr+.V\AMO*o1&PT;r+.V[>V>qc1&PT;qckc77MsoE'`1lXr+.V\AMO*o1&PT;
-qckcOAMO*o1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&G3.r+.V\AMO*o1&PT;r+.V\AMO'^-epm"
-k\Nrms8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)iE\g"bH4eCMgec-+>U`5T^=bg")F`QQKM
-`5T^ZZ`*b;62YOTqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIar+n1dCdIu11&PT;
-r+.V\AMO*o1&PT;qKuEFs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
-kj7ckgtpK/f%A3i`5T^6`Pod7`Pfa7g1*&<>V>qj1]1f=r+.V\AMO*o1&GcQr+.V\Cbu!#1&GcQ
-r+.V\Cbts)62YOTq.2_dCdIu81](uSqeSRqCdI`MD#aP8s8W-!s8W-!s8W-!s8W,coC_>6n(HLQ
-daZjkbg")F`Pfa7`k8mp]Y2C>EnihmgccGL<@@]U1&PT;q.2_eAMO*o1&5BDr+n1eAMO+!1]2&F
-r+.V\Cbu!*1]1f=r+n1eCbu!*1]2&Fr+n1eCbu!*1\\GWo_/+IoC_>6n)39ig"bH;gtpK/f$`(!
-bKS5L`Pod7`Oidr]=bhh]Y1\Z[(Eua['[3P]Y1qi]st2Ee6YPr6Q+QE);.@pj@1!aAMO'u62YOT
-qeSRqCdIr762PIaqeSRqCdIr762YOTr+.V\AMO*o1&PiDr+n1eCbu!*1]2&Fr+n1eAMO+(3WK-Z
-s8W-!s8V`bq<[_Gi8j(Sgtp5uc,@T?]=bhh]Y1\Z['[3Ia]U^\4qud9'\kkdgccG-4qud9'`1lX
-r+n1eCbu!#1&PT;r+n1bANfs-1]1f=q.2_eCbts)62PIar+n1dCdIu11&PT;q.2_eCbtpXH2mpE
-o_/+QpA+(Hp#+ooi8j(LeCN'tf#5PH`5T^-]Y1\Z[&^:1['[39V52.A9&)TEgccG-4qud9'\kkd
-fg?Y44qud9']i%0r+.V\AMO+!1]1f=r+n1eAMO+!1]1f=r+.V\AMO*o1&PiDr+n1eAMO+!1]1f=
-r+n1eAMO+!1]1f=r+n1eAMO*o1&PT;r+n1eCbts)62Gt2\XJbYV50o`UpkGTgccG-4qu[;);.@p
-gccG*6Q+ZC'\kkdfg?Y44r!*Q*W0J'r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\AMO'u62Y:K
-qeSRrCbts)62YOTq.2_eCbu!#1&GcQr+.V\Cbt:0Cn.)eUnslWSt)=BS=H1@S=Z7LN/$"Y+PB+"
-fg?Y16Q+QE);.@pfg?Y16Q+QE);.@pfg?Y44qu[;)>n&#r+n1dCdIr762>(TqeSRrCbts)62Y:K
-q.2_eCbu!#1&GcQr+n1bANfs&1&5BDr+.VYANfs&1&GcQr+.VYP]d$+s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8'[8qc,$@<@@ZD-i6mk
-qc,$@<@@ZK0)JWrqckcN>V>nY0)Jm+qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+qckcN>V>2E.bR0,
-fg?Y16Q+!7,2#=$fh3I@6Q+QM+PB+"fh3I@6Q+!7,2#pIk01s2m-j<4p%7tRo_/+QpA+ags8W-!
-o_/+QpA+@Sq=j7=kj7crjQGI^kLnYIg"bH4eCN'tf#u:^pk*&Q>V>qc1&G3.r+.V[>V>nY0)Jm+
-qckcN>V>nY0)T98qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+qckcOAMO'e0)Jm+qckcN<@@ZD-epm"
-gccG*6Q+ZC'\kkdfg?Y44qu[;);.@pgccG9Z`*p(s8W-!s8W-!s8W-!s8W-!s8W,kpA+OFiVRFW
-qckcN>V>qc1&G3.qckcOAMO'e0)T98qckcOAMO'e0)Jm+r+.V[>V>nY0)T98qckcN>V>qc1&G3.
-r+.V[<@?Qc'\Phkfg?Y44qu[;);.@pfg?Y1>s%]Pq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\o_/+Em-j0)n*'-,k1nbFgtp`>hU9p)bKS5ZeCMgec02L4qckcOAMO'e0)T98
-r+.V[>V>qc1&PT;r+.V\AMO*o1&PT;q.2_eAMO+!1]2&Fr+.V\AMO*o1&PT;r+n1eAMN:G+5'"!
-fh3I@6Q+QE);.@pprgJQs8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,k1nbFgtp`>hTO-f
-daZjkbg"eabKJ,SkbX@<AMO*o1&PT;r+.V\AMO*o1&PT;r+.VYANfs&1&5BDq.2_eAMO!l4o&YP
-q.2_bANfj#4oAkGr+.V\AMO*o1&G3.j@1!aAMO*o1&PT;r+.VYANfs&1&PT;r+.V\AMO*o1&PT;
-r+.V\AMO*o1&PT;r+.VYANfs&1&PT;r+.V\AMO*o1&G3.fg?Y=<$1c+q>^Kps8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7d%m-iW_hU9p)fZ_O^bg"eabJ_B=bKS5L`Pp$Ec-+>Upk*&QCdIr762PIa
-qeSRqFADaT3W!nnr,XmqFAD^L62YdaqeSRrF#j,662PIaqeSRqCdIr762PIaqeSRoANfs&1&9nh
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjkbg">Tc,@T?
-`5T^:XJP#Q*W0J'r+n1dCdIr762PIaqeSRqCdIr762YdaqeSRqCdIr762PIaqeSRqCdIr762PIa
-qeSRqCdIr762PIaq:sBts8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp5uc-+>U`5T^6`Pod7`Q#R%
-e6YPr6Q+QE)>n&#qeSRrCbts)62PIaqeSRrCbts)62PIar+n1bANfs-1]1f=q.2_eAMO!l4oB+P
-q.2_eAMO+!1\kTFqi+VUs8W-!s7H$\o_/+Em-j0)n)39ig"bH4eCN'tf#u:^`5T^6`Poj0]">Vg
-`k8mi['[HX]sP/R]=bhh]Y1kEPhA\Pfg?Y16Q+QE)>dD]qeSRqCdIr762PIaqeSRqCdIr762PIa
-qeSRqCdIr762PIaqeSRrAMO'u62Y:Kq.2_eCbtlu4oB+PqeSRnbJ=/Xs8W-!m.9o.jQG4OhU9p)
-bKS5L`PoI%]sP/R['[3MPDe3['\Phkfg?Y16Q+QE);ICij@1!aCbu!#1&PT;qeSRrAMO!l4oB+P
-qeSRqCdIu81](uSr+n1dCdIu81](uSqeSRrCbts)62Pb!o_/+\s8W-!s8W-!m.9o6m-ilnkLnYI
-bKS5Sbg!c4]t:qj]=bha['[B$I+_INfg?Y16Q+QE);.@pfg?Y16Q+QE);.@pqckcOCbu!*1]2&F
-r+n1dCdIu81](uSq.2_dCdIu81](uSr+n1bANfs-1\kTFr+n1dCdIr762PIar+n1dCdIl.4oB+P
-qeSRrAMO*o1&GcQfo10OV50o`Unji_UnslqCg#FY)9G;kfg?Y16Q+QE);.@pfg?Y16Q+QE);.@p
-qc,$ACbts)62PIaqeSRqCdIr762YOTqeSRqCdIr762PIar+n1dCdIr762PIar+n1bANfs-1](uS
-qeSRrCbts)62Pb!Unsl_V50WQS=H1@W1'!ASt)=BS=H1@\n+[j6Q+!7,2#=$fg?Y16Q+QE);.@p
-fh3I@6Q+QE);.@pfg?YS<@@Z[62YOTqeSRqCdIr762>(TqeSRrCbts)62PIaqeSRoANfs-1](uS
-qeSRqCdIr762YOTqeSRrAMO*o1&?9"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,lLhurg-i7.$qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+
-qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+fh3I073]iB,0<7tfh3I073]iB,0<7t
-a[IDq73]iB,0<7ta[IE.UQap.n+?>Lo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
-kj7crjQG[\gtCK>daZjreCN9rbPQ*AqckcN>V>nY0)Jm+qckcN>V>qc1&G3.qckcN>V>nY0)T98
-qckcN>V>qc1&G3.r+.V[>V>nY0)Jm+qckcOAMO'e0)Jm+qc,#s6Q+QE)9G;kfg?Y!73^DP);.@p
-a[IE,6Q+!7,3H"ss8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mke+.s>V>nY0)Jm+qckcOAMO'e0)T98
-r+.V[>V>qc1&PT;r+.V\AMO*o1&PT;r+.V[>V>qc1&PT;qckcOAMO'^-eUj)fg?Y!73^DP);.@p
-fg?Y!73^DP)<e`;s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-kj7d%m-ilnkLnYIg"bH;gtpK/f$`(!fZ_O^bg#g:D#@j!r+.V\AMO*o1&PT;q.2_eAMO!l4o&YP
-qeSRoANfp,62PIaqeSRoANfp,62PIaqeSRqCdIr762PIaqckbo9.JUf+NI,)fh3I.9.K4S?N:'*
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIg"bH4eCN'tf#u:^daZjkbg">Tc2!TH
-r+.V\AMO*o1&5BDr+.V[CdIl.4o&YPqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762>(T
-r+n1dCdIl.4o9%]qeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIaqfGU1CdIr762PIa
-qeSRqCdIr762>(Tq.2_N9c_n[+SaI.s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
-g"bH;gtp5uc-+>UbKS5L`Pp$Ec-+>U`5T^=bg#:PS,7;&r,XmqFAD^T:A]-.qfGU1FAD^T:A]-.
-qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.r,XmqFAD^L62YdaqfGU/P]d$+s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726g"bH4eCN'tf#u:^`5T^6`Pod7`Q3.-qckcNCdIr762PIa
-r,XmqCdIr?:Af/nqfGU2F#j,>:Af/nqfGU2F#j,>:Af/nqfGU2F#j,>:Af/nqfGU1NE-#Ys8W-!
-s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2bKS5L`Pod7`Oidr]=bheXfC&I+N[%rj]!?!CdIr762PIa
-r,XmqCdIu?3W!VYqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdImPdJs7H
-s8W-!s8W-!s7H$\m.9o6m-ilnkLnYIdaZjreCMRW`Pfa7`5T^-]Y1qi]t:qj]=bha['[HX]sP/R
-]=bhuD,eVG,0<7ta%Io(73_VF62Ydar,XmrF#j/>3W*qYr,XmqCdIu?3W*qYqeSRqCdIr762PIa
-r+n1dCdIr762PIaqeSRqCdIr762[Nqs8W,kpA+(Hp#+oog"bH-bg")F`Oidr['[3I['[3I['tEt
-fg?Y16Q+QE);.@pfg?Y16Q,c$-i@d:qeSRrCbu!#1&GcQqeSRqCdIr762YOTqeSRqCdIr762PIa
-qeSRqCdIu?3W!VYqeSRp`2s"=s8W-!s8W-!s8V`bq<726i8j(LeCN'tf#5PH`5T^-]Y1AIXiPTj
-a%Io86Q+!7,0<7tfh3I073^DX+N[%rj]!?"Cbts)62PIaqeSRqCdIr762PIar,XmqCdIu?3W!VY
-qeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIar+n1dCdIu81\kTFpk*%sUn+<XUnji_
-Unsl_V50o`Ur[Xaa[IDq73]iB,0<7ta[IDq73]iB,0<7ta[IDq73^hf*W'Y=qeSRqCdIr762PIa
-qeSRqCdIr762PIaqeSRqCdIr762PIar+n1bANfp,62PIar+.VYANfp,62>(TqeSR]MfGf!Xe_eh
-UnslWSt)=BS=H1@S=Z7@St)^3I*"f$fg?Y!73]iB,0<7ta[IDq73]iB,0<7ta[IE,6Q+!7,2#=$
-qeSRqCdIr762PIaqeSRqCdIr762PIaq.2_dCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIa
-qeSRrF#j:#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VoUiVQk4k?KM6<@?s7.f33nk?KM6<@?s7.d(%dk?KM">UnoA.cjVOl"!'B>UnoA.d(%d
-k?KM$A3f<_.d:J/k?KLi<%Z3\,0*>+a[IDo9.ItT.`k+'a%Io&9.J%P,0*>+a%Io(73]fi<9W];
-o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,i8j(`gt^T<hU9p)
-daZk#XIoAp0)9'Al"!'V>V>h`4o8J:qckcN>V>h`4o8J:q.2_d>V>h`4o8J:r+.V[>V>h`4o8J:
-r+.V\AMO'e0)Jm+r+.V[>V>2E.`k+'a[IDq73]iB,2#U3a[IDq73]iB,0<7tfg?Y@Z`*p(s8W-!
-s8W-!s8W-!s8W-!o_/+Em-jb7FnoT3q.2_bANfj#4o&YPr+.VYANfj#4o&YPq.2_bANfj#4o&YP
-q.2_bANfj#4o&YPq.2_bANfs&1&5BDj]!>D73]iB,2#U3a[IDq73]iB,0<7tg20[ds8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d%m-j)lgtCK>
-daZjreCMgec-k+mf>PB"CdIl.4o&YPq.2_dCdIl.4o9%]qeSRqCdIr762PIaqeSRqCdIr762PIa
-qeSRqCdIr762PIaqeSRqCdIr76.nmRa%Io&9.ItT.`k+'a]U_*s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s6T@Mkj7d#gt^T<hV$]@daZjreCMgec-+>UdaZk"`4bi"D#8$7qeSRqCdIr762PIa
-qeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIa
-qeSRrF#j,>:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.r,XmqFAD^L62PIaqeSRqCdI/^+3?qq
-kbX@?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjreCMgec-+>U
-`5T^=bg")F`RrDX`5T^jK4=_":A]-.qfGU1FAD[[=Sm28qKuEAHs$5m=SdDIqKuEAHs$5m=Sm28
-qKuEBFAD^T:A]-.qfGU1FAD^T:A\ino_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-m.9o.jQG4OhU9p)bKS5L`Pod7`Pfa7a0i2*<%[u`62PIar,XmqCdIr?:Af/nqfGU1CdIr?:A]-.
-qfGU1FAD^T:A]-.qfGU1FAD^T:AT??qfGU0Hs$8f:AN\ms8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
-g"bH4eCMgec,@T?`k8n$`PoI%]uQP#a%Io&9.KgD0)K`cqfGU1FAD^T:A]-.qfGU2F#j,>:Af/n
-r,XmrF#j/>3W!nnr,XmrF#j/>3W*qYqeSRrF#j/>3Ven^s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
-kj7crjQG4OhU9p)daZjd`Pod7`Oidr]=bhh]Y1\Z[(Eua['[3P]Y1\Z[(2Wia[IE,9-D>F,2#U3
-k?KM6CdIr?:A]-.qfGU1CdIr?:Af/nqfGU1CdIr?:Af/nr,XmrF#j,662PIaqeSRqCdIr762Yda
-qeSRpHs$FKs6T@Mkj7ckgtpK/f#u:^`5T^-]Y1qi]sP/R\?2dQ=Za_o,0<7tfg?Y!73]iB,0<7t
-q.2_dCdIr762PIaqfGU2F#j/>3W*qYqeSRqFADaT3W!nnr,XmrF#j,>:Af/nqfGU2F#j#J@fQK.
-s8W-!s8W-!s7H$\m.9o6m-ilnkLnYIdaZjd`Pod7`ODY9a]U^G9.ItT.`Y13a%Io&9.J%P,0*>+
-a%IoXANfp4:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:Af/nqfGU2F#j,>:Af/n
-r,XmqCdIu?3W!VYqeSRqCdIr762PIaqfGTsV2r7$]rS6:Unsl_V50o`Unji_UnslrFCN?\,0<7t
-a[IDq73]iB,0<7ta[IDq73]iB,0<7tj]!?"F#j,662YdaqeSRrF#j,662PIaqeSRqCdIr762PIa
-qeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr76-,jm\?2d,V50o`Un"$HW1'!ASt)=BS=H1@
-W1'!n73]iB,0<7ta[IDq73]iB,0<7ta[IDq73]iB,0<7ta[IDq73_V60)9'AqeSRqCdIr762PIa
-qeSRqCdIr762YdaqeSRqFAD^L62PIaqfGU2F#j,662PIaqeSRqCdIr762PIao_/+\s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!pUR0a>UnoA.d(%d
-k?KM">UnoA.d(%dk?KM6>V>2E.d:J/k?KM$A3f<_.d(%dl"!'B>UnuK5j)B%k?KM$A3f<_.`Y13
-\OIsg73]cF.`Y13\OIsg73]93-cne$a%Inm7OQ;H,0*>+fY"ZbpA+ags8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n*'-,g"bH;gtpK/f$`(!l[i[1>UoP\4m?KB
-k?KM$A3fBi5l4e=l"!'DA3g#s0'Qn3qckc<A3fs%4m?KBq.2_bANfoq0'Qn3q.2_bANfoq0)9'A
-j]!>D73]iB,0<7ta[IDo9.J%P,0<7ta[IDq73]cF.d!k&s8W-!s8W-!s8W-!s8W-!s8V`bq<$Jf
-q.2_bANfj#4o&YPq.2_bANfj#4o9%]qeSRoANfp,62PIaqeSRqCdIr762>(TqeSRoANfj#4o&YP
-q.2_d>V=,e,0<7ta[IDq73]iB,0<7ta[IDq73_THXT/>#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ILkNM:$i8j(Sgtp`>hV$]@daZjkbg">Tc/kIN
-q.2_dCdIr762PIaq.2_bANfj#4o&YPqeSRoANfp,62PIaqeSRqFAD^L62PIaqeSRqCdIr762PIa
-qeSR]>Umia,0*>+a%Io&9.J%P,58XFs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726
-k1nbFgtpK/f$`(!daZjkbg">Tc-+>Uf>PB!Hs$8^62PIaqeSRqCdIr762PIaqeSRqCdIr762Pb!
-qeSRqFADaT3W!nnqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
-qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:?c:Sa%Io7KPphis8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtp`>hUp&qbKS5Sbg")F`QQKM`5T^=bg")F`TX.Z
-qfGU1FAD[[=Sm28qfGU0Hs$5m=Sm28qKuEBFAD^T:AT??qfGU0Hs$8f:AT??qKuEAHs$5m=SdDI
-qfGU0Hs$3@MuWhWs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39idaZjreCMgec,@T?
-`5T^6`PooOEr0)oqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU0Hs$8f:AT??
-qfGU0Hs$5m=Sm28on[Gas8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQFt@f#u:^bKS5L`PoI%]t:qj
-`5T^;HtUJm.`Y13qeSRpHs$8f:AT??qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qeSRqFAD^T:A]-.
-qeSRqFAD^T:A]-.qfGU/gsQ0%s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2i8j(SgtpK/f$`(!
-`5T^-]Y28&`O*"Z]=bha['[HX]sP/R]=bhh]Y2?q9$'LGa%Io(73]cF.f4$JqfGU1FADaT3W!nn
-qeSRqFAD^L62Pb!r,XmqFAD^T:A]-.r,XmqFADaT3W*qYqeSRqFAD^T:Af/nq;gMum-ilnkLnYI
-bKS5L`PoI%]sP/R['[3I['[?,MoeC3a[IDq73]iB,0<7ta[IE,9-F+J62YdaqfGU1FADaT3W!nn
-qeSRqFAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qS]K8s8W-!s8W-!s8W,kpA+(Hp#+oo
-g"bH4eCMgec,@T?[sVr29.ItT.`Y13a%Io&9.ItT.`Y13a%Io8>s%t*3Vn,*qfGU0Hs$8n3;S#)
-qfGU1HoV"F:AT??qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU2F#j,>:Af/n
-qfGU/P]bTr]u7n/['[3I['ZX*Unji_Unsl_V50o`Upb)Ba[IDq73]iB,0<7ta[IDq73]iB,0<7t
-a[IDq73^hm+8^.TqeSRqCdIr?:A]-.r,XmqFADaT3W!nnr,XmqFAD^L62YdaqeSRqCdIr762PIa
-qeSRrF#j,662Pb!pk*%f]Y1\Z[&^:1Unsl_V50WQS=H1@S=Z7@St)=BS@Vupa[IDq73]iB,0<7t
-a[IDq73]iB,0<7ta[IDq73]iB,0<7tj]!?!CdIr762PIaqeSRrF#j,662Pb!qeSRqFAD^L62Pb!
-qfGU1FAD^L62Pb!qfGU1FAD^T:A]-.qeSRqCdImXiW&rXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+!$?KYQCfj-]&>UnoA.d(%dfi0QfA3f<_.bS)h
-fj-]&>UnoA.d(%dfj-](A3fBi5hTF)k?KM$A3egR46^9@a%Inm7OQ;H,.U/j\OIsW7OQ;H,.U/j
-a%Inm7OP`9-b2\o\OIsfD,g0$q>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7d%m-ilnkMYFag"bH4eCN9ZXQa7\k?KM6>V>8O5l4e=l"!'DA3fBi5l4e=
-l"!'TANf9g5j;fEqckc<A3g#s0'Qn3q.2_RA3g#s0'Qn3q.2_RA3f<_.`Y13a%Io&9.J%P,.U/j
-a[IDo9.ItT.`Y13a[IE;Z`*p(s8W-!s8W-!s8W-!s7H$\kj7d%Z`*\24o&YPq.2_bANfj#4o9%]
-q.2_bANfp,62>(TqeSRoANfp,62>(TqeSRoANfp,62>(Tq.2_bANfj#4kWINa[IDo9.J%P,0*>+
-a%Io&9.J%P,04V#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_>6n)39ik1nb?eCN'tf$`(!fZ_Oj`4c%a62>(TqeSRoANfp,62PIa
-qeSRqCdIr762PIaqeSRqCdIr762PIaqfGU1CdIr?:A\inqeSRqFADXC4m?KBa%Io&9.J%P,0*>+
-a%Io6Ht*-Us8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n)iE\g"bH4eCN'tf#u:^
-daZjkbg"eabLj2'qfGU1FAD^T:A\inqfGU1CdIr762Pb!qeSRqFAD^T:A\inqfGU1CdIr?:A]-.
-qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU0Hs$8f:A]-.
-qfGU1FAD^T:A]-.qeSR=9.Itl9)nqks8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+(Hp#b&bg"bH4eCMgec-+>UbKS5Sbg">Tc,@T?bKS5_`4bqu@etISqfGU0Hs$8f:AT??
-qfGU0Hs$8f:AT??qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=Sm28qfGU5s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtpK/f%A3ibKS5L`Pod7`Q#R%a]U_&FAD^T:A]-.
-qfGU1FAD^T:A]-.qfGU1FAD^T:AT??qfGU0Hs$8f:A]-.qfGU0Hs$8f:AT??qfGU0Hs$6pYlFb'
-s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjkbg")F`Pfa7`5T^-]Y2=t]!cEX[o5?.9.Kg\:AT??
-qKuEBFAD[[=SdDIqfGU0Hs$8f:A]-.qfGU1FAD^T:A]-.qfGU1FAD[[=Sm28qfGU1FADU`@fQK.
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)39ig"bH4eCMgec,@T?]=bhs]XkJW[(Eua
-['[3P]Y1\Z['[3I\V5:<9JFL[.`Y13a[IE<A3g$6:A]-.qfGU1FAD^T:Af/nqfGU1CdIr?:A\in
-qfGU1CdIr?:A\inqfGU1FAD^T:A]-.qeSRqFAD\NXQ]$>i8j(LeCMgec,@T?]=bha['[3I['[3I
-[rc)i7OQ;H,.U/ja[IDq73]iB,3N2\qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
-qeSRqFAD^T:A]-.qfGU0Hs$FKs8W-!s8W-!s8V`bq<[_Gi8j(ZjQG4OhTO-faK25LAP]d63k.j;
-[o5>t9JEqS3k&$Ka%Ink;`a/R5l,k1qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEBFAD[[=SdDI
-qKuEAHs$5m=SdDIqKuEAHs$8f:AT??qfGU1FAD^T:A]-.qfGU+Lhu:fYh@ggbKS5L`PoI%]rS6:
-Unsl_V50o`Unji_UnslrFCMdM-b2\oa[IDa7OP`9-cne$\OIsg73]93-cne$fi0R#FAD^T:A]-.
-qfGU1CdIr?:A]-.qeSRqFAD^T:A\inqfGU1FAD^L62Pb!qfGU1FAD^T:A]-.qfGU1FAD(bICm/*
-['[3@XKA:pUnji_S=Z7@St)aJQ(4G9S=Z7MFCi!P-b2\o\OIsW7OP`9-b2\o\OIsg73]93-b2\o
-a[IDa7OQkg/c0?MqeSRqCdIr762Pb!qeSRqFAD^L62Pb!qfGU1FAD^L62Pb!qfGU1FAD^T:A\in
-qfGU1CdIr?:A]-.q:sBts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7ta7fk!\,>s$_F45!n$fj-\m>s%4S.bS)hfi0Qd>UnE445!Rbfj-\m>s%4S.bS)h
-fj-](A3egR45!n$fj-\m>s#Sd-b2\o\OIsW7OP`9-b2\o\OIsW7OP`9-b2\o\OIsW7OP`9-ePf-
-o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
-kj7crjQG4OhV$]@daZk3L2?*b5j;fEl"!'DA3f<_.d:J/l"!'DA3f<_.d:J/l"!'DA3fBi5j;fE
-l"!'DA3fBi5j;fEl"!'DA3fBi5j;fEfi0QD9.IJA-cne$\OIse9.IJA-b2\o\OIsW7OP`9-ePf-
-s8W-!s8W-!s8W-!s8W,kpA*q=n)oUKq.2_RA3fBi5j3#Xl"!'CCeX)(5j3#Xk\NrVCeX)(5j3#X
-k\NrVCeX&/9^$:dl"!'VCdI;r5l5@`l"!&h9JFRW,.L<#\OIse9.IJA-b2\oa%Io7XIoOms8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-m.9o6m-iW_hV$]@g"bH4eCMgec-+>Ul'-VnCdIl.4o9%]qeSRoANfp,62>(TqeSRqCdI9$9`&Wl
-qeSR^CeX_B62PIak\NriCdIr?:A\ink\NriCdH*7._&/+a%Inl9JEtM0ZdHZs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7d%m-iW_hV$]@daZjreCMgec-+>UbKS5Sbg#@JO8F#o
-qfGU1FAD^T:A]-.qfGU1FAD^T:A\inqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qKuEBFAD[[=SdDI
-qKuEAHs$8f:AT??qfGU0Hs$5m=Sm28qKuEAHs$5m=Sm28qKuEBFAD[[=Sm28qKuEBFAB;D3ltMd
-q;gN7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hU9p)
-daZjkbg">Tc,@T?`5T^6`Pp$Ec,@T?kbX@;FAD[[=SdDIqKuEBFAD[[=SdDIqKuEAHs$5m=SdDI
-qKuEAHs$5m=SdDIpk*&PHs$5m=SdDIqKuEAHs$5m=SKA's8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-ilnkLnYIdaZjkbg")F`Pfa7`5T^:Mgabn.f4<_qKuEBFAD[[=Sm28qKuEAHs$5m=SdDI
-qKuEBFAD[[=Sm28qKuEAHs$8n3;[emqKuEAHs$8f:ABHNs8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
-i8j(SgtpK/f#5PH`5T^-]Y1qi]u7n/]=bht>YV\+3ltMdpk*&PHs$5m=SdDIqKuEAHs$5m=SdDI
-qfGU0Hs$5m=SdDIqKuEBFAD[[=Sm28qKuEAHs$5m=SdDIr3_Rbs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o.jQG4OhU9p)daZjd`Pod7`Oidr]=bha['[HX]sP/R]=bha['[oMS[h3;
-a%Inl9JFL[.`Y13qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
-qfGU1FAD^T:A]-.q5on>jQG4OhU9p)`5T^-]Y1qi]sP/R['[3@XKB'>7EItB\4eTe7OP]>0Y'Y#
-\4eURCdIr?:A]-.qfGU1FAD^T:AT??qKuEAHs$8f:A]-.qKuEBFAD^T:A]-.qfGU1FAD^T:AM#V
-s8W-!s8W-!s6T@Mm.9o.jQGI^kL.l2bKS5?NJ4i?3k.j;\4eTs9.IGF0Xse1a%Inl9JFRk48X+p
-qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
-qKuEAHs$5m=SdDIqKuEAHs$3HPi1Wck1nbFgtp5uc,@T?['[3@XKA:pUnji_Unsl_V50o`UpkGT
-\OIsW7OP`9-b2\o\OIsW7OP`9-b2\o\OIsW7OQkg/c0WbqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
-qfGU1FAD^T:A]-.qfGU1CdIr?:A\inqfGU1FAD^T:A]-.fW:^``PoI%]sP/RX/rG!V50WQS=H1@
-S=Z7@St)=BS>V$f\OIsW7OP`9-b2\o\OIsb2E86:-b2\o\OIsW7OP`9-b2\o\OItDCdIr?:A]-.
-qfGU1CdIr?:A\inqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qeSRqFADV\aoDD@
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,_Z`)A[7+kj-
-e6YPm?:<IP46^9@bZ%]t>s$_F45!n$fj-\m>s$_F45!n$fj-\m>s$_F45!n$fj-\m>s$_F43'uD
-\OIsW7OP`9-b2\o\OIsD6n>f;-`09^\OIsD6n>f;-`09^\m7bgm-juSs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ILkMYFai8j(SgtpK/f%@'r
-l"!'4AOkuq5h'+.l"!'DA3fBi5j;fEk\NrWA3fBi5j;fEl"!'DA3fBi5j;fEl"!'DA3fBi5j;fE
-l"!'DA3egR41Is<\OIsV9JEtM0Y'Y#\4eTe7OP]>0Xse1\4eU/XIo.Yq>^Kps8W-!s8V`bq<[_G
-k1nbUFB7UA9^-(Qk\NrWA3g$.60VoFk\NrVCeX)(5j3#Xk\NrVCeX&/9^$:dl"!'CCeX&/9^$:d
-k\NrWA3egR41Is<\4eTd9JF"H-b)i(\4eTd9JEqS3qr"(s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8Vi[kNM:$kj7d#gt^T<hU9p)
-daZk#bfeYGXQXIoqeSRqCdIr760N,Yq.2_dFAD^L60N,YqeSR^CeX_J:A\ink\NriFAD%99`&p,
-qeSR^CeX_J:A]-.e6YPQ9JEtM0ZdHZ\4eTd9JH7b_#OH7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VHWp#tc2k1nbFgtp`>hU9p)daZjkbg"Scf%A3ibKS5qP^WFN:A]-.qfGU1FAD^T:A]-.
-qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qKuEAHs$8f:AT??qfGU0Hs$8f:AT??qKuEBFAD[[=SdDI
-qfGU0Hs$5m=Sm28qKuEBFAD[[=SdDIqKuEAHs$8f:<-U6\4eU?Z`*p(s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726k1nbFgtpK/f%A3i`5T^=bg">Tc-+>U
-`5T^=bg"eQ[ebARqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
-qKuE?K4=\)=SdDIqKuE1HsZjQs8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2g"bH4eCMgec-+>U
-`5T^6`Pod7`Q)I\qfGU0Hs$8f:AT??qKuEAHs$5m=Sm28qKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
-qKuEAHs$5m=SdDIqKuE?bJ=/Xs8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2daZjd`Pod7`Q#R%
-`5T^-]Y2@nZ+!Xm[o5?;?:=R@@etISqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEBFAD[[=SdDI
-qKuEAHs$5m=Sm28qKuEAHs$4*iW&rXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
-i8j(SgtpK/f#u:^`5T^-]Y1qi]t:qj['[3P]Y1\Z[(Eua]=bht>YV_%0ZQg9\4eTs9.Kg\:AT??
-qfGU0Hs$5m=Sm28qKuEAHs$8f:AT??qKuEAHs$5m=SdDIqKuEAHs$8f:AT??qKuEBFADY.Mr<[Z
-g"bH-bg")F`Oidr['[3I['[3I[(2Wi\4eTd9JEtM0Xse1\OIsV9JFL[.f4<_qKuEBFAD[[=SdDI
-qKuEBFAD[[=Sm28qKuEAHs$8f:AT??qKuEAHs$8f:AT??qfGU/gsQ0%s7H$\m.9o.jQGI^kLnYI
-daZjg[BZZA<4GUU\4eTd9JEtM0Xse1\4eTd9JEtM0\U"pqKuEAHs$5m=SdDIqKuEAHs$/r@etIS
-pk*&PHs$/r@etISpk*&PHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$3/Fnsh?
-o_/+Em-ilnkL.l2bKS5L`PoI%]rS6:Unsl_V50o`Unji_UnsldFChsU0Xse1\4eTd9JF"H-b)i(
-\OIsW7OP]>0Y'Y#e6YQ?FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
-qfGU1FAD^T:A]-.qfGU1FACH+]u7n/]=bha['Zm8Xe_ehUnslWSt)=BS=H1@S=Z7LN/"2t/#G]b
-`&9TP6n>f;-`09^VF2rQ2E7R%/%J+sVF2rF7OP`9-g>/,k\NriCdI9$9`&p,k\NriFAD%99`&p,
-k\NriFAD%A<p4?nqfGTsFB7UA9^$:dqfGTsFB7UA9`&p,q:sBts8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s43Bbe6YPm?:<:L7+>O2e6YPm?:<:L7+kj-
-e6YPr>s$_F44IS)fj-\`<*7gZ44IS)bZ%]t<%ZU+7*JV4fj-\M7OP'$/#G]bVF2r36n>-&/%J+s
-VF2r36n>f;-`09^VF2r36n?KDAG#Tks8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC_>6n(HLQg"bH:bfeIU;qY_Pl"!'4AOkEb8(hHD
-fk!\,AOkEb8(qfVfk!\;CeWMn8(qfVk\NrGAOks#9\EuIk\NrGAOkuq5hT^=fj-\L9JEtM0Xse1
-\4eTd9JEtM0Xse1\4eTd9JEtM0\EJ!s8W,kpA+@Sq=OCVo_/+IoC_4`_WYf0k\NrVCeX&/9\O>[
-k\NrHD,BG49^-(Qk\NrVCeX&/9^$:dk\NrVCeX&/9^$:dk\NrHD,BG49\O>[\4eTd9JEtM0Xse1
-W(f.Z9JEqS3k.j;aa@b$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQg"bH4eCN'tf#u:^bKS5rHsZ#Q9^$:d
-k\NrVCeX&/9^$:dk\NriFAD^T:?ZLfqfGTsFB7UA9`&p,k\NriFAD%A<r6u6k]BkhFB7(+8%2DX
-[o5>t9JEqS3k&$KgS9u4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)iE\
-g"bH4eCN'tf$`(!bKS5Sbg">Tc.L7`kDO?VHs$5m=SdDIqKuEAHs$5m=SdDIqKuEBFAD[[=Sm28
-qKuEAHs$8f:AT??qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
-qKuE/FB86c=R(9?fk![_;``!XIK0?Is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQdaZjreCMgec-+>U`5T^JbfdrD`QQKM`5T^WS;6rg=SdDI
-qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuE?K4=\)=SdDIpk*&PHs$5m=SdDIqKuE?K4=\)=SdDI
-prgJQs8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)fZ_OW`Pod7`Pfa7a-hq->YY'B=SdDI
-qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuE?K4=\)=SdDIpk*&PHs$/r@etISpk*&PHs$/r@fQK.
-s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2g"bH;gtp5uc,@T?`5T^-]Y1qi]t:qj\?2d?;`_Bd3ne(%
-pk*&NK4=V.@ebRbqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$/r@etIS
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)39idaZjkbg")F`Oidr
-]=bha['[HX]sP/R]=bha['[3I['t-d\4eTd9JEtM0XjtAk\NrhHs$5m=SdDIqKuEAHs$5m=SdDI
-qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIq36$TgtpK/f#u:^`5T^-]Y1qi]sP/R
-['[3=N/"i90W7]'\4eTd9JEtM0Xse1a]U_%Hs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=Sm28
-qKuEBFAD[[=Sm28qKuEAHs$&tD"RGso_/+Em-ilnkMYFadaZjkbg!VVKr7m7\4eTT9f9FS0W7]'
-\4eTd9JEtM0XjtAk]Bl%Hs$5m=SdDIqKuEAHs$5m=SRMXqKuE?K4=V.@d8>Ipk*&NK4=\)=SRMX
-pk*&NK4=\)=SRMXqKuE?K4=\)=SRMXqKuEAHs$&tD#2)Os8W-!s8V`bq<726i8j(LeCMgec,@T?
-['[3I['ZX*Unji_Unsl_V50o`UoA3<W(f.Z9JED>27Z1(W(f.Z9JEtM0W7]'\4eTd9JFRk48O>,
-qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEBFAD%A<r.2Gk]Bl%Hs#TS<p4X+k]BkhFB7UI<p59S
-daZjkbg")F`O*"ZX/rG!V50WQS=H1@S=Z7@St)=BS=,S)W(f.H6n>-&/#G]bVF2r36n>-&/#G]b
-VF2r36n>f;-`09^VF2rf>s%q*:?ZLfk\NrVCeX_J:?ZLfk\NrVCeX&7<p4?nk]BkhFB7UI<p4X+
-k]BkhFB7UI<p4X+k]BkhFB84mdJs7Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+0E`:"`9ugL5a';?g?:;h=:!$O"a]U^T?:;n<43(T#a]U^L<*7XV7*/Rn
-e6YPb=Zb;B43:Vefj-\[>YW73.],TaVF2r36n>-&/#G]bVF2r36n>-&/#G]bVF2r36n>-&/#G]b
-daZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq=OCVkj7crjQG4OhU9p)ert[<AOkEb8(hHDfk!\,AOkHk:tfb_g20[?D,Ar':tfb_
-k\NrGAOkHk:tfb_g20[?D,BG49\O>[g20[MCeVlZ9"7PK\4eTT9f9CY3iGb1[o5>s;`^jO27HLF
-Vc5n5XInkNp%7tRo_/+QpA+(Hp#tc2kbX?oD,Ar':tfb_g20[?D,Ar':tfb_g20[?D,Ar':tfb_
-g20[>AOkHk:tfb_g20[?D,Ar';!;^hg20[>AOj7(0W.l7W(f.J9f9CY3iGb1W(f.J9f:S9[f?C-
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7d%m-iW_hV$]@daZjreCMgec.f"Wk]BkhFB7UI<p4X+k]BkhFB7UI<p4?n
-k]BkhFB7UA9^$S!k]BkhFB7UI<p4X+k]BkhFB7UI<p4X+k\Nqj<'Rij3k&$KVc5mi;`_@'=o\O%
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hWEVKdaZjreCN'tf#u:^
-bKS5Sbg"eQ[d&6HqKuE/FB86c=Qjj-qKuE/FB89\:AT??qKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
-qKuE1HsZYs=SdDIl?lq7Hs$5m=R(9?qKuE1HsZ)c?M]%Ol?lq'HsZYs=R1QLpk*&2E`BMH3k'3?
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-kj7crjQG4OhTO-ffZ_O^bg">Tc,@T?bKS5L`Pp$Ec,RE-pk*&NK4=\)=SRMXpk*&NK4=\)=SRMX
-pk*&NK4=V.@ebRbpk*&NK4=\)=SRMXpk*&NK4=V.@ebRbpk*&PHs#TeD#aP8s8W-!s8W-!s8W-!
-s8W,coC_>6n(HLQdaZjreCMRW`Pfa7`5T^6`Po<.@d%o7pk*&NK4=V.@ebRbpk*&NK4=V.@ebRb
-pk*&NK4=V.@ebRbpk*&NK4=V.@ebRbpk*&NK4=V.@ebRbqS]K8s8W-!s8W-!s8W-!s8W-!s8W-!
-kj7d%m-iW_hU9p)bKS5N]Xl&#`Oidr`5T^-]Y2@nZ+!Xm[o5?AD,C"[@ebRbpk*&PHs$/r@ebRb
-pk*&NK4=V.@etISpk*&NK4=\)=SRMXpk*&NK4=V.@ebRbpk*&KLi!+ks8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhU9p)`5T^6`Poj0]">Vg['[3P]Y1\Z[(Eua
-['[3LHtp/b0XjtA[o5>t9JG.28,@U8qKuEAHs$5m=SdDIqKuEAHs$5m=SRMXqKuE?K4=V.@ebRb
-pk*&NK4=V.@ebRbpk*&PHs$&tCt[V#daZjd`PoI%]sP/R['[3I['[3I['t-dW(f.Z9JED>27Q=6
-W(f.J9f:U88,.^GqKuEAHs$5m=SdDIl?lq7Hs$5m=SdDIpk*&PHs$5m=SdDIqKuEAHs$5m=SdDI
-q5'#9oC_>6n)39ig"bH4eCM[JZ*nIOW(f.J9f9FS0W%5gW(f.Z9JED>27Q=6a(%a<Hs#Z]?M]%O
-l?lq'HsZYs=R(9?l?lq'HsZ)c?KuoEl?lq7Hs#]dAEnPKl[i[4HsZT#@d8>Il?lq5K4=+n?MK.^
-l[i[5Jn4Y/@eljYo_/+\s8W-!s8W-!o_/+Em-ilnkLnYIdaZj[]Y1qi]rS6:Unsl_V50o`Unji_
-UnsldFChsU0W7]'W(f.J9f9FS0W7]'W(f.Z9JED>25j5,a';@&FB7UI<pG'=k]BkhFB86c=Qjj-
-k]BkhFB7UI<pG'=qKuE/FB7[S?KuoEk]BkjHsZ#Y<pG'=k]BkVRZQ4XhU9p)`5T^-]Y1\Z[%sOo
-UnslWSt)aJQ(4G9S=Z7@St)`R25WblVF2r36n>-&/#G]bVF2r36n>-&/#G]bVF2r36n>-&/&tmh
-k\NrVCeX&7<p4?nk\NrVFB7UA9^$S!k\NrVFB7UA9^$S!k\NrVFB7UI<p4X+k]BkhFB7UA9^$S!
-q:sBts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V?6f?%/W
-a]U^I=Za`.43(T#a]U^G>YW7D:!$O"a';?\=ZaZ/:!$O"a]U^I=Za`.43:Vea]U^G>YW=C43:Ve
-\4eTR6n>-&/#G]bVF2r36n>-&/#G]bVF2r36n>-&/#G]bVF2rGAP_slq>^Kps8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
-k1nbFgtp\r[b54^g20[?D,Ar':tfb_g20[?D,Ar':tfb_g20[?D,Ar':t'G`g20[?D,Ar':tfb_
-drJC@D,Ar':t'G`aDFnc;`^gU5IXQPVc5mi;`^gU5GqIF[o5>c<'Rij3nUg@m.9oBpA+(Hp$D;C
-m.9o6m-iVdGhR"2g20[?D,Ar':tfb_g20[?D,Ar':tfb_g20[AE`Cb0:tfb_g20[?D,Ar':tfb_
-g20[?D,Ar':qBq$W(f.J9f9FS0W7]'W(f.J9f8kD25j5,q;gN7s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726
-k1nbFgtpK/f$`(!bKS5`]XHU9<7l=uk]BkXF^4-P<p4X+fQCH_FB71;<9SF)k]BkhFB7UI<p4X+
-k]BkhFB7UI<p4X+k]BkWHt);]<ju!gVc5mY<'Rij3i>qAVc5n\s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtp`>hU9p)daZjreCN9rbKJ,SbKS5`XIng1AEnPK
-qKuE1HsZYs=R(9?l?lq'HsZ)c?KuoEl?lq'HsZ)c?KuoEl?lq'HsZ)c?KuoEl?lq'HsZ)c?KuoE
-l[i[5Jn42!AGCddl?lq(Jn4Y/@dAVVl[i[4HsZ#Y<k;R*\m7c#jPg.=s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH;gtp5uc-+>U
-bKS5L`Pp$Ec,@T?bKS5L`Ppr/L\QL2k_<pKK4=V.@dAVVon[GMJn4Y/@dAVVpk*&NK4=V.@ebRb
-pk*&NK4=V.@ebRbpk*&PHs#]dAGCddl?lq5bJ=/Xs8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^
-bKS5L`Pod7`Q4jGa(%a:K4=V.@eGOnpk*&NK4=M0D"rWlpk*&NK4=M0D"rWlpk*&NK4=V.@ebRb
-pk*&NK4=V.@ebRbpk*&KLi!+ks8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCMRW`Oidr
-]=bhq`PoI%]u7n/\?2d?;`_Bd3ll/;qKuE?K4=V.@ebRbpk*&PHs$/r@ebRbqKuE?K4=V.@ebRb
-pk*&NK4=V.@ebRbpk*&NK4=V.@eGOns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VHWp#tc2g"bH4eCMgec,@T?]=bha['[HX]sP/R]=bha['[HX]r-6sW(f.I<'R<U27HLF
-a(%a:K4=V.@ebRbpk*&NK4=V.@ebRbpk*&NK4=.uAG(appk*&AJn4Y/@dAVVpk*&AJn4Y/@dAVV
-l[iZqeCMgec,@T?]=bha['[3I['[3IX/rG%AQ5U&25j5,W(f.J9f8kD27Q=6k]BkjHsZ)c?MK.^
-l?lq'HsZT#@d8>Il[i[DHs#Z]?M]%OqKuEAHs$5m=SdDIqKuEAHs#UFYi+U*i8j(SgtpK/f!pp%
-Vc5mZ9f8kD25j5,W(f.J9f8kD25j5,[o5?AD,C(V=R(9?qKuE1HsZ)c?MK.^l?lq(Jn4.o?MK.^
-l[i[5Jn42!AF"hXl[i[5Jn42!AEnPKl[i[5Jn42!AF"hXl[i[5Jn42!AG(appsdFcs8W-!s8W-!
-s8W-!s8VHWp#tc2i8j(LeCMgec,@T?['[3I['ZX*Unji_Unsl_V50o`UoAHIW(f.J9f8kD25j5,
-W(f.J9f8kD25j5,W(f.Z9JFRk46h3"pk*&@HsZ)c?KuoEl?lq'HsZYs=R(9?k]BkhFB7UI<pG'=
-k]BkhFB7UI<pG'=k]BkhFB7UI<p6B@g"bH4eCMRW`Oidr['[3@XKA:pUn"$HS=Z7@St)=BS=H1@
-VHZKd6n>-&/#G]bVF2r36n>-&/#G]bVF2r36n>-&/#G]bVF2rE9JG[H9\O>[k\NrVFB7+4;!;^h
-k]BkhCeWW)<9SF)gi?BXFB71;<8;Lngi?BJD,B#.<8;Lng20[MFB7YVfDkmNs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!fY"Z(>t)e=:!$O"\m7bH=ZaZ69"J:s
-a]U^I=ZaZ69$(3ta]U^I=ZaZ/:!$O"a';?\=ZaZ/:!$O"a]U^:>t(VY/#G]bVF2r36n>-&/#G]b
-VF2r36n>-&/#G]bVF2r36n>-&/'*p-o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjiHtV,D8(2KW
-a(%`qD,A;j<8)1caDFo1D,A;j<7>kdaDFo1D,A]%;qc(bdrJC@D,A]%;quCmfQCHSE`C+s<2W\[
-VHZKu;`^gU5GqIFVHZKu;`^gU5GhXRVHZL1XJP:Tp$D;Cm.9oBpA*q=n)39ifQCHSE`CM.;quCm
-drJCBE`Ch7<7>kdgi?BCE`:G-;qQ4tdrJC>F^3RA>hF1(g20[=F^3^B<7>kdgi?B*>t(\d25aD<
-Vc5mZ9f8kD25aD<W(f.XCg$f<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n)iE\daZjreCN9rbKJ,S
-fS".pF^3OG@b>g.fQCHOF^3RA>j-91fQCHOF^4-P<nMP"k]BkXF^4-P<nMP"l?lpjF^3OG@d8>I
-f6h&=>t(Yj5GqIFVc5mY<'R9[5PaC!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA*q=n)39ik1nbFgtpK/f#u:^daZjkbg">Tc-+>Ujd_+kHsZ)c?KuoEl?lq'HsZ)c?KuoE
-qKuE1HsZ)c?KuoEqKuE1HsZ)c?KuoEl?lq'HsZT#@dAVVpk*&AJn42!AF"hXl?lq(Jn42!AF"hX
-l[i[5Jn42!AF"hXa(%`=>=IbgYlFb's8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j)lgtCK>daZjkbg">Tc-+>U`5T^=bg")F`QQKM
-fX.aDL2?X;@d&P_k_<p;L2?(.D"WU#k_<p;L2?(.D!6Uil[i[5Jn42!AF"hXl[i[5Jn42!AF"hX
-l[i[5Jn42!AD)ods8W-!s8W-!s8W-!o_/+Em-j)lgsX^'fZ_O^bg")F`Pfa7`5T^)Htq;V>jHuP
-on[GWLhuj=@d&P_pk*&KLhuj=@eGOnpk*&KLhua?D"rWlon[GWLhua?D"WU#on[GWLhua?D"kK;
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhTO-f`5T^6`Pod7`Oidr`5T^-]Y2=t\u91>
-[o5?/D,g1aD"rWlon[GZK4=V.@eGOnpk*&NK4=V.@eGOnpk*&KLhuj=@eGOnpk*&KLhua?D"WU#
-on[G[P]d$+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
-bKS5L`PoI%]t:qj['[3P]Y1\Z[(Eua['[3LFCM.I5GqIFVc5mY<'SE59'_(>l[i[5Jn42!AF"hX
-l[i[5Jn42!AF"hXpk*&AJn42!AF"hXl[i[5Jn42!AF"hXl[i[4HsZK%CsphabKS5L`PoI%]sP/R
-['[3I['[?FWi&f\W(f.J9f8hJ5H%:6W(f.I<'TYq?L*2Rl[i[5Jn42!AF"hXl[i[5Jn4Y/@dAVV
-pk*&AJn42!AF"hXl[i[4HsZ)c?L*2Rk01s#gtpK/f#P2'WGQ"@9f8kD25j5,W(f.J9f8kD25j5,
-W(f.i@nQ$6?KuoEl?lq'HsZ)c?L*2Rl[i[4HsZ,jAF"hXl[i[5Jn4.o?L*2Rl[i[5Jn4)"D!Q[`
-k_<p>Jn42!AF"hXl[i[5Jn42!AF"hXq5'#Ls8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2
-bKS5L`PoI%]rS6:Unsl_V50o`Unji_UnsldFChCF25j5,W(f.J9f8kD25j5,W(f.J9f8kD25j5,
-a(%a,HsZ)c?KuoEl?lq'HsZ)c?KcK3k]BkhFB7[S?KcK3k]BkhFB7UI<nMP"k]BkXF^3RA>hF1(
-fQCHO[&hs9hU9p)bKS5L`Po3k[&^:1UnslWSt)=BS=H1@S=Z7@St)0N8Z"m+VF2r36n>-&/#G]b
-VF2r36n>-&/#G]bVF2r36n>-&/%8G<g20[MFB71;<8)1ck\NrJE`Cb0:u$(jgi?BLE`Ch7<8)1c
-gi?BLE`Ch7<8;Lngi?BLE`Ch7<8)1cq:sBts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA*:.ON1j'\m7b9>t)k<41\]d\m7bH=Za3#7Clbna]U^:>t)eD9$(3t
-\n+[X@nOjG43(i'a(%`^@nOdO9"._[VF2r36n>-&/#G]bVF2r36n=[$4JkLsVF2r36n=[$4JkLs
-R85rt]XIk?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7ckgtp`>hU[mAaDFntD,eu);oifTg20[-D,eSn<7>kd
-g20[*DI1e4;q#bcdrJC9E`:V5>hF1(aE1b@F^3RA>hF1(`GT"[<'R6a7Aj*LVHZKd>=GGh5GhXR
-VHZKe<'R9[5KKq&p[%)0oC_>6n*'-,kj7d&e^rGr>hF1(fQCHOF^3RA>hF1(fQCHOF^3RA>hF1(
-fQCHOF^3RA>hF1(fQCHOF^3RA>hF1(fQCHOF^3C9;l<SZVc5mY<'R9[5GqIFVc5mY<'R9[5KK%A
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7ckgtp`>hU9p)bKS5Sbg"_-OP"\\fQCHOF^43Z?J'C*
-fQCHOF^3RA>j-91fQCHOF^4-P<nMP"fQCHaHsYHJ>h=@4k]BkWHt(`N>fU>HVc5mY<'R9[5GqIF
-Vc5nE]WhG9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-j)lgtCK>
-g"bH4eCN'tf#u:^fZ_O^bg">Tc0:I@l?lq(Jn4.o?L*2Rl[i[5Jn42!AF"hXl?lq(Jn42!AF"hX
-l[i[5Jn42!AF"hXk_<p=HsZ#kD!6Uik_<p;L2?(.D!6Uik_<p>Jn42!AF"hXl[iZk@V)E@7EC[G
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<[_Gi8j(SgtpK/f%A3ibKS5L`Pp$Ec,@T?`5T^=bg")F`T<VFk_<p;L2?(.D!-^r
-k_<p:MfIp<ET`7"k_<p;L2?%2ETi-non[GJL2?1-AE\bal[i[2L2?1-AF"hXon[GLHsZ'ffDkmN
-s8W,kpA+(Hp#+oog"bH4eCMgec-+>U`5T^6`Pom*Z+=LBk_<pHLhuC/AE\bak_<p:MfIs8D!-^r
-k_<p:MfIs8D!6UikDO?DL2?%2ETi-nk_<p;L2?(.D!-^rkDO?[s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA*q=n)39ig"bH:bfdrD`Oidr`k8mp]Y1qi]u7n/]=bhcCg!W>7E8n1on[GWLhua?D"WU#
-k_<pHLhua?D"WU#on[GWLhua?D!6Uion[GJL2?O=D!-^ron[GWLhu74EV5-(s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<i8j(SgtpK/f#5PH]=bhh]Y1\Z[(Eua
-['[3P]Y1\Z[&.%rVc5mY<'R9[5GqIFdrJCNL2?1-AE\baon[GMJn42!AE\bal[i[2L2?(.D!Q[`
-l[i[2L2?1-AE\bal[i[5Jn42!AF"hXk_<osbg")F`Oidr['[3I['[3I[&^:1W1'!L<'R9[5GqIF
-Vc5mY<'R9[5It,hl[i[4HsZ,jAE\bal[i[5Jn4)"D!Q[`k_<p>Jn42!AF"hXl[i[5Jn42!AF"hX
-l[i[5Jn3NXbL4nk\XJb[>=GJb2476&W(f.I<'R<U25j5,W(f.Y;``BJ;sJa:l[i[5Jn4Y/@dAVV
-l[i[5Jn42!AF"hXl[i[2L2?1-AE\bak_<p;L2?(.D!6Uik_<p;L2?(.D!6Uil[i[2L2?1-AE\ba
-kDO?UgsQ0%s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp5uc,@T?['[3@XKA:pUnji_
-Unsl_V50o`UoAHIR85rD9f8>74K(t3W(f.J9f8kD25j5,W(f.J9f9Ln:[3=6l?lq%FB7UI<pG'=
-k]BkWHt)Ag?IsR6k]BkWHt);]<nMP"fQCH_FB7%:>hF1(fQCHOF^3RA>iio@i8j(LeCMgec,@T?
-['[3I['ZX*Un"$HS=Z7LR['D7S=H1@Qs!"K:HYLB/#G]bR85rB6n>-&.ssB?VF2r36n>-&/#G]b
-VF2rG>t*Oh<7l=uk]Bk\E`C\6>hj@!gi?BLE`Ch7<8;LnfQCHSE`C\6>gm^lgi?BLE`Ch7<7l=u
-gi?BHF^41]fDkmNs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-aFnTF>t)>17Clbn\m7b9AP^EN41\]d\n+[Z=Za3+:WHs;\n+[K>t)eD9"JS0a(%`QAP^?V9"JS0
-a(%`><'R<U2476&R85r5:HY%@4IJu-VF2r&:HY%@4IJu-VF2r&:HYOS5N(Vcs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+QpA*q=n)39ig"bH*XJNmR?H?t_`GT#$DI1D+?H$egaE1b-DI1D+?H@4paE1b0FC)q(?H@4p
-`GT#'FC*%1?H@4paE1b0FC*%*<2W\[VHZKe<'R6a7Aj*LVHZKe<'QaQ8Z,NPVHZL1XJP.In*'-,
-m.9o6m-j0)n(>:]aE1b0FC*%1?J'C*aE1b?Ht(3FB@q?3f6h&KFC*RH@b>g.f6h&LHtUQKB@hN?
-aa@aQHt(0=?IsR6`GT"[<'R9[5GqIFVc5mY<'R6a7Aj*LVHZLAXIoOms8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA*q=n*'-,g"bH4eCN'tf#u:^fW:^tF^3OG@b>g.f6h&[F^3OG@b>g.fQCHOF^3OG@b>g.
-f6h&ZHt(`N>h=@4f6h&[F^3OG@b6!:f6h&HDI05?5GqIFVc5mY<'QdH4P6a-s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d#gt^T<hU9p)daZjreCN'tf#u:^
-bKS5N]Xm9aES,q^k_<p>Jn3MeDX)UUfS"/.Jn4)"CtF&Dk_<p*Ht)DnACuQQl?lq%L2>Ih@d&P_
-fS"/.Jn3MeDWlgkfS"/+L2?(.CtODYk_<p;L2=qQ?D^pq[sVrjs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)iE\
-daZjreCMgec-+>UbKS5Sbg")F`QQKM`5T^9[B\nQETi-nkDO?CMfIs8D!-^rkDO?DL2?%2ET`7"
-k_<p:MfIs8D!6Uik_<p;L2?(.D!6Uik_<p>Jn4)"D!6Uies_^#s8W-!s7H$\kj7crjQFt@f$`(!
-bKS5L`Pod7`Pfa7VhBHHE`;1VD!6UikDO?CMfIp<ETi-nkDO?DL2?%2ET`7"kDO?CMfIp<ET`7"
-kDO?CMfIp<ET`7"kDO?CMfJQpPlLd`s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQFt@f$`(!
-`5T^-]Y28&`Oidr`5T^-]Y28&`M\*&Vc5ml>t*q7ETi-nk_<p:MfJEGD!-^rkDO?CMfIs8D!-^r
-k_<p:MfIp<ET`7"on[GJL2?%2ET`7"kDO?QLhu_Wq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjd`Poj0]">Vg]=bha['[HX]sP/R\XJb[>=FrU4Jl=O
-Vc5mY<'Su^@d&P_k_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p;L2?(.D!6Ui
-k_<p;L2?+=IF?WrbKS5C]Y1\Z['[3I['[3I['ZcrOI00BVc5mJ=\5Mj5GqIFVc5mlAP_NED!6Ui
-k_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p*Ht);oD!6Uik_<p;L2?(.D!-^r`k8m^D-s2?5FG;0
-Vc5mY<'R9[5FG;0Vc5mY<'Rs*:[3=6k_<p>Jn4)"D!Q[`k_<p>Jn4P1D!6Uik_<p;L2?(.D!6Ui
-k_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<pJ\YfE,s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o6m-ilnkL.l2bKS5L`PoI%]sP/RUnsl_V50o`Unji_UnslbHuPKL4K(t3
-R85rD9f8>74IJu-W(f.;:HY%@4IJu-\m7bVHt(]T@dAVVf6h&ZHt(`N>j?]CfQCHOF^3RA>hF1(
-fQCHOF^3RA>hF1(fQCHOF^3RA>hF1(fQCHN`4ajZhV$]@bKS5L`Po3k['[3IUnslWSt)=BS=H1@
-S=Z7@St)0N8Z"m+MGZ^;6n=-l6Dd.$R85rB6n=[$4JkLsHoaBX:HY%@4M"fefQCH_FB7%:>hF1(
-fQCHOF^3RA>hF1(fQCHOF^3RA>hF1(fQCHOF^3RA>fCSefQCHOF^3"0?J'C*q:sBts8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC]S?C:[\>\m7b9>t)>17Clbn
-\n+[KAP^?V9"JS0\n+[KAP^?V9"JS0aDFnfAP]mK:V(+5a(%`QAP]mK:T%/VR85r5:HYLB/"'0q
-R85r5:HY%@4IJu-R85r5:HY%@4IJu-Qs!#QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7d%m-j)lgt0KX
-`GT#'FC*%1?H@4paE1b0FC*%1?H@4paE1b0FC*%1?H@4paE1b1HtUNB?H@4paE1b1HtUNB?HIS-
-[VT*6=\4u`8XNXPR85r4=\4u`8XW@:Qs!"J=\4u`8]\!0kj7d%m-j0)n*'-,kj7cj[&h>j?H@4p
-fQCH@HtUNB?IsR6aE1b?Ht(3FB@hN?aa@aCHtV&Y@`WXtf6h&LHtV&Y@`a"1f6h&LHtTm(=f54`
-VHZKd>=GDn7Aj*LVHZKd>=GGh5M*ies8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG[\gsX^'
-daZjkbg"eIXOhi/f6h&ZHt(`N>h=@4fQCHNHt(]T@b6!:fQCHNHt(]T@b6!:f6h&[F^3OG@b6!:
-f6h&ZHt(]T@`WXtR85rC<'QaQ8Z,NPQs!#$R>q7Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH;gtpK/f$`(!bKS5Sbg"eabKJ,SfX.a4KPp".CtODY
-k_<p+KPp".CtODYfS"/.Jn3MeDV0V[fS"/-HsYHYDV0V[fS".oHt);oCtF&DfS".pKPp".CtF&D
-fS"/+L2>LqDV'8FVHZKfAQ8EjkPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhU9p)daZjd`Pod7`Pfa7
-bKS5L`Pod7`Pfa7l'-VLN-O!.DWcptfo11=MfIp<ET`7"kDO?CMfIF/Git!)fo11>L2>P%Gj'lu
-k_<p;L2?(.D!6Uik_<p;L2>Ih@d2Fpm.9o6m-ilnkLnYIdaZjkbg">Tc,@T?`5T^8]Xk[c:YLJ2
-k_<p;L2?(.D!6UikDO?CMfIp<ET`7"kDO?CMfJ!GIHQN.kDO?CMfIp<ET`7"l'-V\P^V_QETr^9
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH-bg")F`Oidr`5T^-]Y28&`Oidr
-]=bhdNJ3a&8Z#]\k_<p:MfIp<ETi-nkDO?DL2?(.D!-^rk_<p:MfIs8D!6Uik_<p:MfIp<ET`7"
-kDO?CMfIp<ET`7"prgJQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
-kj7ckgtpK/f#5PH]=bhh]Y1\Z[(Eua['[3P]Y14rI$e&.VHZKV=\5Mj5GhXRfo11=MfIs8CtODY
-k_<p+KPp".CtODYk_<p+KPoFqDWcptfS"/*MfIC&DWcptfS"/+L2>LqDWlgkes_]Dbg")F`Oidr
-['[3I['[3I['[3IW/QJ/<'QaQ8Z,NPQs!"J=\5Mj5IPB2kDO?5N-OQ@D!-^rfo11>L2>LqDWlgk
-fS".pKPp".CtODYk_<p+KPoFqDV0V[fS".oHt'$c<1-NER85rC<'QdH4IJu-R85rC<'R9[5KIqQ
-k_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p;L2?(.D!-^rkDO?CMfIp<ET`7"kDO?CMfIp<ET`7"
-kDO?4KPot2ES,q^fS"/,P^WAgiUlj>s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
-i8j(Sgtp5uc,@T?['[3@XKA:pUnji_Unsl_V50o`UmH1=R85r5:HY%@4IJu-R85r5:HY%@4IJu-
-Vc5mK:HZ4":[3=6fS".oHt(]T@d8>If6h&[F^3OG@d8>If6h&[F^3OG@d8>If6h&[F^3OG@d8>I
-fQCHNHt(`N>iio@i8j(Sgtp5uc,@T?]=bhXXKAP)XdkuQS=Z7@St)=BS=H1@Q=Ep_:HYLB.uI1j
-VF2ql;*q-J/"'0qR85r5:HYLB/#G]bR85rS;``NX@b6!:f6h&mHsYEP@b6!:f6h&ZHt(`N>h=@4
-fQCH@HtV)S>hF1(aE1b@F^3RA>f_"nfQCH?FC+4^fDkmNs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV[VT*XAP]mK:V(+5\n+[KAP]mK:V(+5\n+[KAP]mK:V(+5
-[VT*XAP]mK:V(+5\n+[KAP]mK:UY(B\n+[*:HY%@4IJu-R85r5:HY%@4IJu-R85r5:HY%@4IJu-
-R85r5:HYP&E:il"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+ooi8j(LeCM]_?FP#c[VT*UFCM_$@^gGg
-[rc)gFCM_$@^gGg[rc)tH[WAF@`WXt[rc)tH[WtW?FP;saE1atHtp*+=dW>`Qs!"J=\4u`8XNXP
-Qs!"J=\4u`8XNXPQs!#%Un-`9n*'-,kj7d%m-ilnkLcl.aE1b1HtUNB?HIS-aa@aBFC*(:B?>O6
-aE1b1HtV)S>fhA+aa@aCHtUQKB?>O6aE1b1HtUNB?IsR6\n+[)=\5Mj5F>SFVc5mJ=\4u`8XNXP
-Qs!#CbfTnbs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8Vi[kNM:$g"bH;gtpK/f%A3i`5T^IHt(]T@`a"1
-f6h&ZHt(]T@b6!:f6h&ZHt(]T@b6!:f6h&ZHt(]T@b6!:aa@aRF^3%9B@hN?aa@aBFC(hK7@74L
-Vc5mJ=\4u`8][*Ks8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-p[%),m-ilnkN:RTg"bH4eCN9rbL4nkbKS5Sbg">Tc.K+ifS".pKPoFqDV0V[fS".pKPoFqDV'8F
-fS".oHt(`]DV0V[fS".oHt(`]DV0V[fS".pKPoFqDV0V[fo11.KPoFqDV0V[fS".@AQ5O27G#Jk
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH4eCN'tf#u:^fZ_OW`Pp$Ec,@T?bKS5L`PpK:XOr2D
-fo11/N-O!.DV9tnfo11.KPoJ%Gh@[efo11.KPoJ%Gh@[ekDO?4KPoJ%Gh@[efo11.KPoFqDV0V[
-k_<ooR>pFsn*'-,i8j(SgtpK/f#u:^`5T^6`Pod7`OM+i[VT+1L2?%2ES6:qkDO?5N-ONDES,q^
-fo11=MfIF/GhJ%#fo11/N-O$7GhJ%#fo11/N-O$7Gh@[efo11>V2tZVs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7crjQFt@f$`(!`5T^-]Y28&`Oidr`k8mp]Y28&`ODY9Qs!"X>=HY]BBY(d
-fo11=MfIF/Git!)fo11>L2>P%Gh@[efo11=MfIC&DV9tnk_<p,N-ONDETi-nkDO?CMfIjKL]@DS
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjkbg!c4]t:qj
-]=bha['[HX]sP/RW+Ar*>=Fo^8Z#]\Qs!"iFCNp^Git!)fo11/N-OQ@CtXblkDO?4KPoJ%Gj'lu
-fo11=MfIC&DV9tnkDO?5N-ONDES6:qfo11/N-O!^XNSi4`5T^&['[3I['[3I['[3I['ZcjL6u+8
-Qs!"J=\5Mj5F>SFQs!#%FC+-gES6:qfo11/N-O!.DV9tnfo11/N-O!.DV9tnfS".pKPoFqDV0V[
-fS"/+L2>LqDV0V[Qs!"K:HY"I8XW@:Qs!"Y<'QaQ8\/J/fS".rKOX,&ES,q^kDO?4KPp".D!-^r
-fS"/+L2>P%Git!)fo11=MfIp<ES6:qkDO?5N-ONDES6:qkDO?5N-O$7GhJ%#k_<p,N-P*-VZ6\r
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkL.l2bKS5L`PoI%]sP/R
-Unsl_V50o`Unji_UnslRFDI:?4IB8CR85r5:HY%@4IJu-R85r5:HY%@4IJu-\n+[iKPoFqDV0V[
-fS".oHt(`]DV'8Ff6h&ZHt(]T@dAVVf6h&ZHt(]T@b6!:fS".oHt(]T@b6!:f6h&[bfer*kLnYI
-daZjd`PoI%]sP/RUnsl_V50WQS=H1@S=Z7LR['7C8XW@:MGZ^;6n=-l6Dd.$R85r&;*q-J/"'0q
-R85r5:HY%@4M"fefQCHNHt(`N>h=@4f6h&ZHt(]T@b6!:f6h&[KPoCh@b>g.aa@aQHt(`N>fhA+
-fQCH@HtV&Y@`WXtq:sBts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-hMs:V(+5\n+[KAP]mK:V(+5\n+[KAP]aN=h80?[VT*XAP]aN=gi-L[VT*TCg"2_=gi-L
-[VT*TCg"2_=d`&JR85r5:HXM36CCV3R85r5:HXM36C:nIMGZ^-=\4KJ6C:nIVgNI`s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o6m-ilnkLnYI[sVr"FCM_$@`WXt[rc)gFCM_$@`WXt[rc)gFCM_$@^gGg
-aa@a1FCM_,C:A:o[sVr"FCM_,C<1L'WGQ"0=\5#W4IB8CQs!"J=\4KJ6C:nIMGZ]t;*p.;6Fa.t
-kj7d%m-ilnkNM:$i8j(UUQ`07C<1L'aa@aCHtUQKB?>O6`-ZpSHtUQKB?>O6`-ZpSHtUQKB?>O6
-aa@aQHt(3FB?>O6aa@aCHtTBh<2W\[Qs!"J=\4u`8XNXPVc5mJ=\4u`8`n7=s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIdaZjkbg")F`RfKHf6h&ZHt(3FB@hN?aa@aQHt(]T@b??O
-f6h&[KPoCh@`3VAfS".\H[XP"DV0V[`-ZpbKPoFqDTR9=Qs!"J=\4u`8Z#]\Qs!"jPDfJ@s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQG4OhV$]@
-daZjreCMgec-+>UbKS5Sbg"_-OP#5(fS".pKPoFqDV0V[fS".\H[XP"DV0V[aFnTdKPn_TIFs3j
-fS".pKPnkaEnH%_fS".qN-O!.DV9tnfo11/N-MdI=dW>`Q=EqepA+ags8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-ilnkLnYIdaZk#bfe2Rc-+>U`5T^6`Pp$Ec,@T?`5T^HPC_DGGhJ%#fo11/N-O!.DV9tn
-fo11/N-O!.DV9tnfS".qN-O!.DV9tnfo11>L2>P%GhJ%#k_<p,N-O!.DTR9=daZk+jQG4OhU9p)
-fZ_OW`Pp$Ec,@T?`k8m^D-tqKDV9tnkDO?5N-ONDES6:ql'-VLN-O$7GhJ%#fo11.KPot2ES6:q
-fo11/N-O$7GhJ%#fo11/N-O$7Gk^Rfs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39i
-g"bH-bg")F`Pfa7]=bhq`PoI%]t:qj`5T^&['Z]77@74L[rc*4N-ONDES6:qfo11.KPoJ%Gh@[e
-fo11/N-O!.DV9tnfo11/N-O$7Gh@[efo11/N-O$7Git!)kDO?[s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtpK/f#5PH]=bhh]Y1\Z[(Eua['[3=P`V888XNXP
-Qs!"X>=Fo^8_A]6fo11=MfIF/Git!)fo11/N-ONDES6:qfo11/N-O$7GhJ%#kDO?5N-O$7GhJ%#
-kDO?5N-ONDES6:qfY"Z2`PoI%]t:qj['[3I['[3I[&^:1W/QIu=\4u`8XNXPQs!"J=\4u`8[ieN
-fo11/N-O!.DV9tnfo11.KPoFqDV9tnfS".qN-O$7Gh@[efo11/N-O!.DV0V[fS".pKPm/[8XNXP
-Qs!"J=\5#W4IB8CaE1bAN-O!.DV9tnfS"/*MfIF/GhJ%#kDO?4KPoJ%Git!)fS".qN-ONDES6:q
-fo11/N-O$7GhJ%#fo11/N-O$7GhJ%#fS".qN-OHSL\^#is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp5uc,@T?]=bhXXKA:pUnji_Unsl_V50o`UmQOP
-MGZ^.:HXM36CCV3Qs!"K:HY%@4IJu-R85r5:HYRe<7cM,f6h&[KPoCh@b??Of6h&ZHt(`]DV'8F
-f6h&ZHt(`]DV0V[fS".pKPoCh@b??O`-ZpbKPoCh@bAoJi8j(SgtpK/f#5PH]=bha['Zm8XdkuQ
-S=Z7@St)=BS=H1@Q=Ep_:HY%@4IJu-MGZ^.:HY%@4IJu-MGZ^.:HY%@4Gm!&R85rB>=I.k@b6!:
-f6h&[KPoFb>f:u;f6h&LHtV&Y@`a"1aa@aRKPn_TIFijUaa@aQHt($@IFijUaa@aCHtVTsh#IES
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s5;u$W+Ar>AP]79<4ZX:
-W+Ar:Cg"2_=gi-L[VT*TCg"2_=gi-L[VT*TCg"2_=gi-L\n+[HFCM[p=gi-L[VT*6=\4KJ6CCV3
-Qs!"<;*pXQ8W$A3Qs!"K:HXM36C:nIR85r5:HYP.I.[..s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726
-i8j(SgtoSqGd_Ek[rc)fCg"5h@^gGg[rc)gFCM_$@^gGg[rc)gFCM_$@^g`"[rc)gFCM_$@^g`"
-[rc)gHtoWt?]%]IQs!"<;*p.;6AeW,Lg!Q2;*p(B:7,0ULg!QpUn-H)kNM:$k1nbUm-ilnkK'Hi
-aa@aBFC*(:B=E8'aa@a1HtpcNB?>O6aa@aBKQ>1^B?5aHf6h&KKQ>.eEl<<Qaa@a>H[X"`B?>O6
-W+Aqq=\4u`8Z#]\Qs!"J=\4u`8XNXPQs!#4`4c3Ns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-i8j(SgtpK/f#u:^f>PAEHtUQKB@hN?`-ZpaHt($@IFijU`-ZpSHtUQKB>f.Ff6h&KKQ>^uDV0V[
-aa@aRKPnkaEn>\JaFnTTKQ<G_8Z#]\Qs!"H@o\n!8]R6Ys8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,g"bH;gtpK/f$`(!bKS5`bfe2Rc-k+m
-`k8n(KQ>^uDTIKOaFnTPH[WtgEnH%_aFnTdKPn_TIFs3jaFnTdKPnkaEl`oSfS".`KQ>b)GfYPY
-fo10sMga62DT$mMW+Aqo@o\n!8\'P"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d#gt^?-f#u:^
-bKS5Sbg")F`RrDX`5T^6`Pp$Ec,cu_fo11/N-O$7GfYekfo10sMga9;GfYekfo10sMga9;GhJ%#
-fo11/N-O$7GhJ%#fo11/N-O$7GhJ%#fo11/N-NF>S`\__g"bH4eCMgec,@T?`5T^6`PoBVPdYC2
-fo11=MfIF/GhJ%#kDO?5N-O$7GhJ%#fo11.KPoJ%GhJ%#fo11/N-O$7Gh@[efo11/N-O$7GhJ%#
-kbX@?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQFt@f$`(!`5T^-]Y28&`Oidr
-`5T^-]Y2=t]">VgVgNHN=\6&<=kSaYfo11/N-O$7GhJ%#fo11/N-O$7GhJ%#fo11.KPoJ%Gh@[e
-fo11/N-O$7GhJ%#fS".nPC_DGGj)K4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_&&kLnYIdaZjd`Pod7`Oidr['[3P]Y1\Z[&J.YQs!"H@o\n!8XNXPW+Ar]N-Np;J_?!,
-fo11,PC_DGGhJ%#fo11/N-ONDES6:qkDO?5N-O$7GhJ%#kDO?5N-O$7GhJ%#fo11/N-NOic-+>U
-]=bha['[3I['[3I['[3I['Z`aI$e&.Qs!"J=\4u`8XNXPQs!"iHtq>nGhJ%#fo10sMga62DTI`a
-fS".`Mg`["EnQCraFnTeN-NF%IFs3jaGYK"N-NF%IFs3jQ=EpP;*pXQ8XW@:WGQ"`KQ>b)GhJ%#
-fo11/N-O$7GhJ%#fS".qN-O$7GhJ%#fo11/N-O$7GhJ%#fo11/N-OTOIFaU5fo11?P^V5DGhJ%#
-fo11/N-Np;Jbm<ds8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-m.9o6m-ilnkLnYIbKS5L`Po3k['[3IUnsl_V50o`Unji_UnslRFDHb26AeW,MGZ]t;*p.;6AeW,
-MGZ]t;*p.;6AeW,W+ArLKQ>^uDT$mMf6h&GH[XP"DV'8F`-ZpbKPnkaEn>\J`-ZpaHt(]T@`3VA
-fS".`KQ>^uDTIKOfS".pbff5:n(HLQdaZjkbg!c4]sP/RUnsl_V50WQS>_mAS=Z7@St)*V<JjX?
-R85r&;*p[H4IJu-MGZ^.:HY%@4Gm!&R85r5:HY%@4K)gjfS".oHt($@IFijU`-ZpaHt(]T@`3VA
-f6h&GH[XLn@`a"1fS".\H[XP"DTR9=aFnTUHtUQKB?>O6q:sBts8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+=jQEsf=fH7F[VT*FAQ6-\@]3j;[VT*GD-s8Z?`@mL
-[VT*GFChFg?aacRWGQ"NCg"5h@^^)U[rc)fCg!`S?^OtfQs!"<;*pXQ8W$A3Qs!"<;*pXQ8W$A3
-Qs!"<;*p.;6C:nIQu-=4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)iE\\V5::Cg"5h@]=H\
-[rc)YD-sbo@]=H\[rc)YFChq'@]+Tm[rc)WHuQQ:@^g`"[sVr"FCM_,C:A:oWGQ!u>#'lW:7,0U
-Qs!":>#(Gf8VgPFQs!":>#(Gf8[kLgi8j(ZjQGI^kMYFai8j(BUn,VTB=E8'[rc*$HtUQKB?>O6
-[sVr/H[WtgEli]AaFnTPH[WtgEl`oSaa@aBKQ>.eEl`oSaFnTUHtTEq?^OtfQs!"J=\4u`8XNXP
-Q=Ep^=\4u`8]\!0s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kN:RTdaZjreCMXP]#f>4
-aFnTTKQ>.eEli]AaFnTTKQ>1^B?5aHaFnTdKPnkaEl`oSaFnTTKQ>.eEl`oSfS".`KQ>.eEl`oS
-Qs!"H@o\h)<L?o\Q=Eq9XJPsss8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjreCMgec-+>UbKS5Sbg"1rNQ?cn`-ZpRKQ>.eEl`oS
-aFnTUHtUNREli]AaFnTTKQ>.eEl`oSaFnTTMg`["Ela/eaGYJfKQ>.lIFs3jaGYJfKQ>1^B:)gn
-Qs!"H@o^UGScA`is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n(HLQg"bH4eCMgec-+>U`5T^=bg")F`QQKM
-`5T^6`PpDlJ]NataGYJfMg`[)IG'R(aGYJfMga9;GfYekfo10sMg`[)IG'R(aGYK"N-NF%IG'R(
-aGYJfMga9;GfYek[sVrCbfeGaf#u:^bKS5L`Pod7`Pfa7Qu-<RKQ>b)GhJ%#fo11/N-O$7GhJ%#
-fo11/N-O$7GhJ%#fo11/N-O$7GfYekfo10sMga9;GfYekfo10sMgbE^iW&rXs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCMRW`Pfa7]=bhs]Xk_f]u7n/]=bhh]Y18.OI00B
-Q=EqJN-Np;J_?!,fo11/N-O$7GhJ%#aGYK!KPoJ%GfYekaGYK"N-NEsEnQCraGYK!KPnkhIG'R(
-fo11/N-PC&s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(Sgtp5uc,@T?
-]=bhh]Y1qi]sP/RW0EC2=\4u`8XNXPQs!"H@o^WuB@`8tfo11,PC_;KJ_$$9ert[9PC_DGGh/(0
-fo11,PC_DGGh/(0l'-VLN-O$7GhJ%#fo11/N-O$7Gh/=FdaZjd`PoI%]sP/R['[3I['[3I['[3I
-R?Nhl;*p.;6AeW,Lg!Q@=\4KJ6FV&Gert[+Mga9;GfYPYaFnTeN-NEsEl`oSfS".`Mg`["Ela/e
-fS".`Mg`[)IE7(^fo10sMg_O8</=^QQs!"iHtp`UEnQCraGYK"N-NF%IG'R(fo11/N-Np;J_?!,
-ert[9PC_DGGh/(0ert[<N-Np;J_$$9ert[9PC_;KJ_$$9ert[<N-O$7Gh]!Wo_/+\s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp5uc,@T?
-]=bhXXKAP)Xe_ehUnsl_V50o`UmH1=MGZ]t;*p.;6AeW,MGZ]t;*p.;6AeW,MGZ]t;*q-a7EC.&
-`-ZpRKQ>.eEl`oSaa@aBKQ>.eEli]A`-ZpRKQ>.eEl`oSaa@aBKQ>1^B?5aHaFnTTKQ>.eEotTf
-i8j(SgtpK/f#5PH]=bhh]Y1AIXdkuQS=Z7@St)=BS=H1@Q=Ep_:HXM36CCV3MGZ]t;*p[H4Gm!&
-MGZ^.:HXM36AeW,R85rDAQ6a(EnH%_aFnTcHt(0MEnH%_aFnTTKQ>.eEl`oSaFnTTKQ>.eEl`oS
-aFnTTKQ>1^B?5aH`-ZpSHtVTsh#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726[rc)YD-s8Z?`A-YWGQ"OFCM4kAZ9NR[rc)YD-s8aA[ZDXWGQ"NCg!`ZA[ZDX
-WGQ"OFCM4d?ak,d[VT*(;*pXQ8W$A3Qs!"<;*pXQ8W$A3MGZ]t;*p.;6C:nILg!Q2;*pXQ8a,O0
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(SgtoMfC8l;dWGQ"OFCM_$@]=H\[rc)gFCM4kA[cbj
-[rc)YFChFnA[cbjWH;^LHuQQ:@]+Tm[sVr"HtoWt?\hl\Qs!":>#'lW:5E(KLg!Q@=\4EQ:5E(K
-Lg!QpXJOk9kMYFakj7crjQGI^kLcl.[sVr"FCN@>B=E8'[sVr4HtU!DGfb>G\V5:LKQ>.eEl`oS
-aFnTTKQ>.eEl`oSaa@aBKQ=PLC<2'KWH;^;@o\n!8W%"[Qs!"H@o\n!8W%"[Qs!"iNJ7E4s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtpK/f%A3i`k8n)HtUNREl<<Qaa@aBKQ>1^B?5aH
-aFnTTKQ>.eEl`oSaFnTTKQ>.eEl`oSaGYJfMg`[)IE7=paFnTEKm8tf8X<jdQs!"H@o\h)<S,1&
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-i8j(`gt^?-f$`(!daZk#bfe2Rc,c]OaFnTPH[WtgEl`oS`-ZpSHtUQKB>f.FaFnTPH[WtgEli]A
-aFnTdKPnkhIE7(^fS".`Mg`["EnQCraGYJfMg`[)IG'R(aGYJUFCLPG<L?o\Qs!#CbfTnbs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\m.9o6m-iW_hU9p)bKS5`bfe2Rc,@T?bKS5L`Pod7`QQKMaJ>BJMg`[)IE7=p
-aGYJfKQ>.lIE7=paFnTTMg`[)IE7(^fo10sKQ>.lIE7(^aGYJfMga62DTI`aaFnTeN-NEsEjqj;
-daZjkbg">Tc,@T?`5T^)UnFYt<8!4TfS".pKPoFqDV9tnfo10sKQ>b)GfYPYfo10sKQ>b)GfYek
-aFnTdKPnkhIE7(^aFnTTKQ>.lIFaU5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-m.9o.jQG4OhU9p)`5T^6`Pod7`Oidr]=bhq`PoI%]u7n/\?2cg@p#+$8]ZR*aGYJtPC^f5IFaU5
-aGYK"N-NF%IFaU5aGYJfMga62DTI`aaGYJfKQ>.lIE7=paFnTTMg`["Ela/eke+/"s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkL.l2daZjd`PoI%]sP/R]=bheXf@b*@Ye2_
-Qs!":>#(Gf8Z63"aHM;1N-NpBOOfVHert[9PC_;KJ_$$9es_]OPC_;KJ_$$9ert[9PC_DGGh/(0
-ert[9PC_DGGhJ%#ert[;[&hHpc-+>U]=bha['[3I[&^:1['[3I['Zd#Q&&U=Qs!":>#'rP6C:nI
-Lg!Q_FCN=LIG'R(aFnTeN-NF%IE7(^aFnTTKQ>.lIE7(^fo10sMg`[)IE7(^fo10sMg`[)IE7=p
-WGQ"@AQ6a(Ela/efo10sMga9;GfYekfo10sMga0?J]NataGYJtPC^f5IG'R(ert[<N-Np;J_$$9
-ert[9PC_;KJ_$$9ert[9PC_;KJ_$9OpsdFcs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIbKS5L`Po3k['[3IUnsl_V50WQS><!W
-UnslSI!(<D6AeW,MGZ]t;*p.;6AeW,MGZ]t;*p.;6AeW,Q=Eq9KQ>.eEl`oSaFnTPH[WtgEl`oS
-aa@aBKQ>.eEli]AaFnTPH[WtgEl`oSaFnTTKQ>.eEl`oSaFnTdbff5:n(HLQdaZjkbg!c4]sP/R
-X/rG!V50WQS>_mAS=Z7@St([J=GU-UMGZ]t;*p.;6AeW,MGZ^-=\4KJ6AeW,R85r&;*p[H4K)gj
-aFnTTKQ>^uDTIKOaFnTTKQ>.eEl`oSaFnTdKPnkaEl`oSaFnTTKQ>1^B?5aHaFnTTKQ>.eEl`oS
-k1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC]YJGc>Oe
-WH;^ND-s8aAZ9NRWGQ"AFChFg?`A-YWGQ"AFChFnAZ9c_WGQ"OFCM4kA[ZDXWH;^[Cg!`ZAXHUl
-MGZ]r>#'rP6ASf?MGZ]r>#'lW:7,0UMGZ]r>#'rP6ASf?Lg!R+bfg%ds8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_>6n(>k-WH;^\FCM4kA[cbjWH;^NFChq'@]+Tm[rc)WHuQ',AZ9c_WH;^NFChFnA[cbj
-VgNHmHtoX&A[d&%WH;^->#(Gf8VgPFQs!":>#(Gf8VgPFLg!Q@=\4EQ::RF+i8j(ZjQGI^kMYFa
-i8j(A[B[2_@`a"1[sVr"HtpTHICFT=aa@a3Km:^eB=W_@aFnTEKm:[lEk-mKaFnTEKm:.^GfYPY
-\V5:;Htp-<C7&-qMITbU=\4K\=GU-UQ=EpN>#(An<L@W4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_>6n(HLQdaZjreCM^:S]HJ)aFnTTKQ=VWGfYPYaFnTTKQ>.eEl`oSaGYJWML<L'IE7=p
-aGYJfMg`[)IE7(^aGYJfMg`[)ICFT=Q=Ep\@o\h)<L.,pQ=EqWgt_r0s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n(HLQg"bH4eCMgec-+>U
-a0i1nKQ=PLC<2'K[sVr"Htp`UEk-mK[sVr3KQ=VWGfYPYaa@aBKQ>.eEl`oSaFnTTKQ>.lIE7(^
-aGYJfKQ>.lIE7(^aGYJfKQ>.lIE7(^W+Aqq=\4u`8X<jds8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
-k1nbFgtpK/f#u:^bKS5L`Pod7`RrDX`5T^6`Poj0]#]eXaFnTTMg`["Ela/eaFnTTMg`[)IE7=p
-aFnTTMg`["El`oSaGYJfMg`["Ela/eaFnTTKQ>.eEl`oSaFnTCHtpjKc-+>U`5T^6`Pod7`Kt[^
-[rc*#KQ>.eEla/eaFnTTKQ>.eEnH%_aFnTTMg`["Ela/eaFnTTMg`[)IE7=paFnTTMg`[)IE7(^
-aGYKAeB.ajs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2g"bH4eCMgec,@T?
-]=bhq`PoI%]u7n/]=bhs]Xk_f]pNYGQs!"[FCj-aGfYekert[+Mga0?J]NataGYJfKQ>.lIE7=p
-aGYJfMg`["Ela/eaFnTTMg`[)IE7(^aGYJfMg`["EqK)$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VHWp#+oog"bH4eCMRW`Pfa7]=bhh]Y1\Z[$Z5`Lg!Q>@o\Cr=GU-UQ=Eq*Km;14J]O%.
-ert[+PD%MUOOfVHes_]OPC_;KJ_$$9es_]OPC_;KJ_$$9aHM;.PC_;KJ]O%.ert[+PD%VJGhC6`
-daZjd`PoI%]sP/R['[3I['[3I['[3IUnslC>#'lW:5E(KLg!Q2;*p(B:8r);aGYJfMg`[)IE7=p
-aFnTTMg`[)IE7(^aFnTTKQ>.lIE7(^aGYJfMg`[)IE7=paGYJfMg`["Ela/eaGYJfMg`[1KZK("
-ert[+Mga0?J]Natfo10sMga0?J_$$9aGYJtPC^f=K[u?<ert[9PC_;KJ_$$9ert[9RZQ*aJ_$$9
-kd.5fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726i8j(Sgtp5uc,@T?]=bhXXKAP)Xe_ehUnsl_V50o`UmQOPG#Cqg>#'6=8r?J4
-G#Cqi;*oG(8r?J4MGZ]t;*pRY<QKi6\V5:LKQ>.eEl`oS\V5:LKQ>.eEk-mKaFnTEKm:[lEk-mK
-`-ZpCKm:[lEl<<QaFnTTKQ=VWGhC6`i8j(SgtpK/f#u:^]=bhh]Y1,;Unji_S=Z7@St)=BS=H1@
-Q=EpN>#'rP6ASf?Lg!Q2;*p(B:5Vn8MGZ]t;*p.;6AeW,MGZ^>D-tA;El`oSaFnTTKQ>.eEl`oS
-aFnTTKQ>.eEl`oSaFnTTKQ>.eEl`oSaFnTTKQ>.eEl`oSaFnTTKQ?51h#IESs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726\<DiMD-s8aAZ9NRWH;^NFChFg?`A-Y
-WGQ"AFChFg?`@mLWGQ"AFChFnAZ9NRWH;^NFChFnAZ9c_WH;^;@o\=g:5E(KMGZ]r>#'lW:5Vn8
-Lg!Q2;*p(B:5E(KLg!Q0>#'lW:<9N5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7bmCkj7cV`Po<.@]=H\
-WH;^NFChFnA[cbjVgNH_FCh@tE49puVgNHmFCM.qE4:40VgNH]HuQQ:@]+Tm[sVr"HtoX&AXHUl
-Lg!Q2@p#+$8VgPFMITbG@p#+$8W%"[Lg!QpXJOk9kMYFai8j(ZjQGI^kL[Yc[sVr"Htp-<C:AS*
-[sVr3KQ=VWGfYPY\V5:LKQ=VWGfYPY\V5:=Km:.^GfYPY\V5:=Km:.^Ge&NQ\V59o@o\h)<JXgR
-Q=Ep\@o\h)<L.,pQ=EpP@p&QfiW&rXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7d#gt^?-f$`(!
-a-hptKm:.^Ge&NQ\V5:LMg`-nI(>,^\VbdUMg`'oKuf1#\VbdUMg`-nI)q4oaGYJUNJ5H3ICG2i
-aGYJGFCg>>=I*GsMITbS@o\Cr=TAF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVi8j(ZjQFt@f$`(!fZ_OY]XkY-Ge&NQ[sVr$Km:(SC:AS*
-[sVr"Htp-<C:AS*aFnTCHtp3GGe&NQ`-ZpCKm:[lEl`oSaFnTTMg`[)IE7=paGYJfMga0?J]Nat
-fo10sMg`["EgC38Q=Ep^=\5N=E<#t<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQdaZjkbg">Tc-+>U
-`5T^=bg")F`QQKM`5T^9R>nb2Ge&NQ\V5:LMg`-iGe&NQaFnTEKm:[sIE7(^\V5:LKQ>.eEl`oS
-aGYJfKQ=VWGfYekaFnTTMg`[)ICFT=\"o\8`Pod7`Pfa7\?2cu=\6\fEl`oSaFnTTKQ>.eEla/e
-aFnTTMg`["El`oSaFnTTMg`[)IE7(^aGYJfKQ>.lIE7=paFnTTMg`[1K`D)Ps8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2bKS5L`Pod7`Oidr`k8mp]Y28&`Oidr
-]=bhUP`V2@<L.,paHM:uMg`[)IFaU5aGYJfMg`[)IE7=paGYJfMg`[)IE7=paGYJWKm:[lEk-mK
-\V5:LMg`-iGe&]ZaGYJtRZRRLs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQG4OhU9p)
-`5T^6`PoI%]sP/RR!a%B@o\Cr=GU-UQ=EpN>#(uCE7U5(aHM:uPD%MUON3cKert[*R>o7TNRjP[
-a-hq<RZPRXNRjP[a-hq<RZQ*hON<W=es_]OPC^f=K[u?<aJ>B[gtp5uc,@T?]=bha['[3I['[3I
-X/rG1['[?FWet:gQs!":>#'lW:7,0ULg!QQD-tABIE7V*aGYJfMg`[)IE7(^aGYJfMg`[)IE7=p
-aGYJfMg`[)IE7=p\VbdUMg`[)IE7=paGYJfMg`[1KZK@1ert[+PD%#@KZK@1aHM;.PC^cBNRj;E
-a-hq<PC^f=K[u?<aHM;.PC^f=K[u?<a-hq<PC_;ROOfVHes_]qeB.ajs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYI
-bKS5L`Po3k['[3IUnsl_V50o`Unji_UnslSI!'^=</OO>Lg!Q2;*p(B:5Vn8Lg!Q0>#'6=8r-YG
-Qu-<CML<L'IE7(^\VbdFKm:[sICY&V\V5:LKQ=VWGe&NQ[sVr$Km:.^Gdi'8\V5:=Km:.^Gf4rW
-\V5:\bff5:n)39idaZjkbg!c4]sP/RX/rG!V50WQS=H1@S=Z7@St([J=GU-ULg!Q0>#'lW:5Vn8
-Lg!Q2;*p(B:5E(KLg!Q0>#'rP6C;V!aFnTTMg`[)IE7(^aGYJfKQ>.eEl`oSaFnTEKm:[lEk-mK
-aFnTTKQ=VWGfYPY\V5:LKQ=VWGfYPYk1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o:oC]SgTW)d8Qu-<3FCghV@]=3OWH;^ND-s8Z?`@mLWH;^ND-s8Z?`A-Y
-WH;^NFChFg?`A-YWH;^NFChFnAX6h+MGZ]r>#'lW:5E(KMGZ]r>#'lW:5E(KLg!Q0>#'lW:5E(K
-Lg!QPN/%B4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n&V;qWH;^NFChq/C8ZGuWH;^LHuQ',AZ'op
-VgNH]HuQ!2E2S)&WH;^LHuQQ:@]+TmVgNHmHtoR,E4:40QZR#!>#'rb=GU-UMITbE>#'lW:5E(K
-MITbE>#'rb=LbK5q;gMmjQGI^kMYFai8j(RbfdPNGdi'8\V5:=Km:.^Gdi'8\V5:=Km:.^Ge&NQ
-\V5:=Km:.^Ge&NQ\V5:=Km:.^Ge&NQaFnTEKm:.^Ga;i>Q=EpP@p#%,<Jk9gMITbG@p"Uu=GgTj
-`k8n_s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjkbg!\UI)pt]\V5:=Km:[lEk.'T
-\VbdUMg`-nI(>,^aGYJUNJ5H3ICG2i[uH*_Mg`+!Mo^g)[uH*_Mg`'oKrK0*MITbG@p"Uu=GgTj
-VgNI`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,_m-j0)n)iE\daZjreCMRW`Q3sc\V5:;Htp-<C:T%C[sVr$Km:(SC:AS*\V5:;Htp3GGfYPY
-[sVr3KQ=VWGfYPYaGYJWKm:[lEla/eaGYJfMga9;GfYekaGYJfMg`[)IE7=paGYJfKQ;lP:6oBi
-Lg!Q`PDfJ@s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mi8j(Sgtp`>hU9p)bKS5Sbg")F`Pfa7`5T^6`Pp$Ec,[5s
-\V5:=Km:.^Ge&NQ\VbdUMg`-iGe&NQ\V5:=Km:[sICY&V\V5:LMg`-iGfYPYaGYJWKm:.^GfYPY
-aFnTTKQ<uDI)O"C`5T^6`Pna.I&Usi\V5:LKQ=VWGfYPYaFnTTKQ>.lIE7(^aGYJfMg`[)IE7=p
-aFnTTMg`-nI)q4o[uH*_Mg`-iGfYekk01sIs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VHWp#tc2i8j(Sgtp5uc,@T?`5T^-]Y1qi]u7n/]=bhq`PoI%]sP/RQ=Ep\@o^U'ElXT-
-aHM:uPD%#8IE7V*aGYJfMg`[)ICG2iaGYJWKm:.cI(>,^\VbdFML<L'ICY&V\VbdUMg`'oKt3(g
-aJ>C,s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjkbg")F`OidrUnslSD.8B4=GgTj
-MITbG@p"Uu=JpOca-hq=S:8MHNQ7HHa-hq-R>o7TNQ7HHes_]@R>o:OKZBL?es_]APD%MUON<W=
-a-hq<PC^cBNRjP[aHM;.RZQ17[aN[VdaZjd`PoI%]sP/R['[3I['[3I['[3I['[3,FDH\9:5E(K
-Lg!Q0>#'lW:6oBiaHM:uMg`[1KZK("aGYJfPD%#8IE7=paGYJfMg`[)ICG2iaGYJfMg`[1KXZqp
-aGYJUNJ5H;KZK@1aHM:uPD%#@KZBL?aHM;.RZPUSKZBL?es_]@R>oddON<W=es_]@R>od]J]O%.
-ert[*R>oddON<W=aHM;@]WhG9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(LeCMgec,@T?]=bhXXKA:pUnji_
-Unsl_V50o`UmQOPG#Cqg>#'6=8r-YGH!=7(>#'6=8r-YGLg!Q2;*pXe@`XIU\VbdFML;slI(>,^
-\V5:=Km:.^Ge&NQ\V5:=Km:.^Ge&NQ[sVr$Km:(SC8Z`4[sVqgKRC=aGhC6`i8j(SgtpK/f#u:^
-]=bhh]Y1AIXdkuQS=Z7@St)=BS=H1@LM^[[>#'lW:5E(KLg!Q0>#'lW:5E(KG#Cqg>#'lW:5Vn8
-Lg!Q@D.:SEICY5_\V5:=ML;sgGfYek\V5:=Km:.^GfYPY\V5:=Km:.^GfYek\V5:=Km:.^Ge&NQ
-\V5:=Km;b8h#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-a0i1>D.9J]?^P\>Qu-<3FCghV@]=H\Qu-<"D.9JdAXI=DWH;^ND-s8aAZ9c_WH;^NFChFnAZ9c_
-WH;^NFCghB8VgPFLg!Q0>#'lW:5E(KLg!Q0>#'lW:5E(KLg!Q0>#'lW:6oBikj7d<s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s6/h<kj7cJPDc>dE2dqjVgNH_FCh@tE2S)&VgNH]HuQ!2E2dqjVgNH]HuQ!2E2S)&
-VgNHmHtoR,E2SA:[sVqgKRBb@AVsu"Lg!Q2@p"Oj:5WO`MITbG@p"Uu=GgTjLg!Q`XfC=?kNM:$
-i8j(ZjQGI^kLnYI\<Di]Km:(SC:T%C[sVr$Km:(SC:T%C\V5:=Km:.^Ge&]Z\V5:=Km:.^Ge&NQ
-\V5:=ML;sgGe&]Z\V5:-FCg>>=I*GsMITbE>#(An<Jk9gQ=EpN>#(uKI/j6Hs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726kj7d#gt^T<hT!4>\V5:=Km:.cI(=rU[uH*PML;sgGe&]Z\VbdDNJ4j$Kt!%q
-\<DilMg`'oKt*>)aGYJUNJ4j$Kuf1#[uH*/D.8B4=GgTjQ=EpP@p$49T`>&ls8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtp`>hUp&q
-a-hptKm:(SC:T%C\V5:;Htp3GGdi'8\V5:;Htp3GGe&NQ[sVr$Km:.^Ge&NQ\V5:LMg`-iGfYek
-\VbdUMg`[)IE7=paGYJfPD%#8IE7=paGYJfMg`[)IE7=p[sVqH>#'lW:5E(KfY"Zms8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+ILkMYFag"bH4eCN9rbKJ,S`5T^JbfdrD`QQKM`5T^6`PoBVPduKm\V5:=Km:.^Ge&NQ
-\V5:LMg`-nI(>,^\V5:LMg`-iGe&NQ\V5:=Km:.^Ge&NQaFnTEML;slI(=rU[sVr"UnGZF`Oidr
-Lg!Q_Htp-<C:T%C\V5:=Km:[sICG2i\V5:=ML;slI)q4o\V5:;NJ5H3ICG2iaGYJUNJ5H;KZK("
-[uH*^R>q7Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYI
-daZjd`Pod7`Pfa7`5T^-]Y28&`Oidr`k8n$`Pn1&MMbnGWH;^mPD%#@KZK@1a-hq.PD$uENQ@$+
-\<DilMg`'oKt!%qaGYJUNJ5H3ICG2i\VbdDNJ4j$Kt!%q[uH*_Mg`'oKug'\p[%)Cs8W-!s8W-!
-s8W,kpA+(Hp#tc2g"bH;gtpK/f#u:^['[3-I!(<V=GgTjMITbG@p"Uu=GgTj\V5:LPD$uENQ7HH
-a-hq-R>o7TNRjP[a-hq-R>o7TNQ7HHes_]@R>o7TNQ7HHa-hq<RZPRXNRjP[a-hq-R>o7TNQ7HH
-g"bH;gtpK/f#5PH]=bha['[3I['[3I['[3I['[3I[$QGsLg!Q0>#'lW:5E(KLg!Q0>#*.sIE7V*
-aGYJfPD%#@KZK("aHM:dNJ5H;KXZqpaHM:uPD%#@KXZqpaGYJfPD%#@KZK@1aGYJUNJ5H;KZK@1
-aHM:uPD$uENQ@<:a-hq-R>o:OKZBL?a-hq-R>o:OKZBL?a-hq-R>o7TNRj;Ea-hq<RZR@+iW&rX
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIdaZjd`PoI%]sP/RUnsl_V50o`Unji_UnslSI!'U18r?J4
-G#CqU;G)gD6?Z7!Lg!Ps;G)aK:3KN-Qu-<CML;slI(>,^aGYJWML;sgGdiZd\V5:=Km:.^Ge&NQ
-\V5:;Htp3GGc,q.\V5:=Km9MCE4L[I[sVr6bg#),kMYFadaZjkbg!c4]sP/RX/rG!V50WQS=H1@
-S=Z7@St(RQB8B_dLg!Q!>?$D^:5E(KH!=7(>#'lW:5E(KLg!Q0>#'lW:7,m-aGYJUNJ5H3ICY5_
-aGYJWML;slI(=rU\V5:=Km:.^GfYPY\V5:=Km:.^Ge&NQ\V5:HH[WGYGe&NQk1nbls8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC^b[bF!-UQu-<"D.9JdAXI=D
-Qu-<3FCge\CT2DeQu-<3FCghV@]=H\WH;^NFChFnAZ'opVgNH_FCh@tE2dqjMITbE>#'lW:5E(K
-Q=EpN>#'lW:5E(KLg!Q0>#'lW:5E(KLg!Q0>#*)M])Vg1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC^elhPkU.
-WH;^LHuQ',AZ'opVgNH]HuQ!2E2S)&VgNH]HuQ!2E4:40VgNH]HuQ!:I&D@2[sVqgKRB\FE4L[I
-QZR##@p"Uu=GgTjLg!Q2@p"Oj:5E(KLg!Q!>?$Ji=LbK5i8j(ZjQGann)39ii8j(LeCM^:SYq-g
-\V5:;HtoR4I(+K<VhBH.Km9MCE4L[I\V5:=Km:.^Ge&NQ\VbdFKm:.^Ge&NQVhBH.Km:.^Gc-4B
-MITbG@p"Uu=GgTjLg!Q2@p"Oj:5WO`Lg!R;m-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYI
-daZjhUn,&RI(>,^\VbdFML;sgGdiZd\VbdDNJ4p#I(,)h[uH*NNJ4j$Kt!%q\<Di]ML;ptMn+^m
-\<Di[NJ4osG`$!5MITbG@p"Uu=GgTjfZ_P=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjhXJNI]Ge&NQ\V5:=Km:.^Ge&NQ
-\V5:=Km:.^Ge&NQ\V5:=Km:.^Ge&]Z\V5:LKQ=V\I)q4o\VbdUMg`[)IE7V*[uH*_PD%#@KZK@1
-aGYJfPD%#8ICPK!aGYJVPDdM?I@#%kMITbE>#'rb=Q\Dos8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hU9p)
-daZjkbg">Tc,@T?bKS5L`Pp$Ec,@T?a0i1_Km:.^GdiZd\VbdDNJ4p#I(>,^\VbdFML;slI(>,^
-[uH*_Mg`'oKuf1#\VbdFML;slI(=rU\VbdUMg`-nI&DXF`5T]oN/!^:@_%2;\V5:=Km:.^Ge&]Z
-\VbdFML<L'ICG2iaGYJUNJ5H;KXZqpaHM:dNJ5H;KXZqpaHM:dNJ5H;K\+/Us8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtpK/f#u:^`5T^-]Y2=t]">Vg
-]=bhq`PoI%]t:qj['[3-D.8B4=NH\Za-hq-R>o7TNQ7HH\<DilPD$H0Mo_*8\<DilMg`+!Mmn\"
-[uH*NNJ5H;KXZqp[uH*_PD$E)Kt*>)\<DilMg`+!Mq>n\o_/+\s8V`bq<[_Gkj7ckgtp`>hTO-f
-UnslSI!(6K:5WO`Lg!Q2@p"Oj:5WO`QZR#RML<I4NQ7HHa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HH
-a-hq-R>o7TNQ7HHa-hq-R>o7TNQ@<:a-hq-R>o:OKZBL?es_]Q]XHbZkLnYIbKS5L`PoI%]sP/R
-['[3@XKAk:['[3IX/rG%R[&\4:3U5VLg!Q2@p"Oj:5E(KVhBH=PD$E)KufI2[uH*_PD$E)KufI2
-aHM:uPD$E)KufI2aHM:uPD$E)KufI2[uH*_PD%#@KZBL?aHM:ePDdJLNQ@<:a-hq-R>o7TNQ7HH
-a-hq-R>o7TNQ7HHa-hq.PD$uENQ@<:a-hq-R>ok+XT/>#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-i8j(Sgtp5uc,@T?]=bhXXKAP)XdkuQUnsl_V50o`UkX8DG#CqU;G)4=</OO>G#CqU;G)gD6?Z7!
-G#Cqi;*pXe@_%2;\VbdFKm:.cI(=rU\V5:=Km:.cI(>,^VhBH.Km9MKI(=rUVhBGqHuQ!:I&D@2
-\V5:+HuQ!:I+ZZdi8j(SgtpK/f#u:^]=bhh]Y1AIXe_ehS=Z7@St)44PGG%NLM^[L>?$D^:3g&C
-Lg!Q!>?$D^:5WO`H!=7(>#'9P@#.u]MITbUD.:#=Mo^g)[uH*_Mg`'oKt3(gaGYJWKm:.^Ge&NQ
-\V5:=Km:.^Ge&NQ\V5:=Km:.^Ge&NQVgNHoKm;b8h#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gk1naYFDI7\@[M"AQu-<"D.8lL@[D1PWGQ"/FDI7\@]=H\
-QZR#BFCge\CSuQ!VgNH_FCh@tE2S)&WH;^LHuPHi@Ye2_Lg!Q0>#'lW:5E(KLg!Q0>#'lW:5E(K
-Lg!Q!>?$D^:3g&CVhBHts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726a0i1=FDI4bCR9-YR!a%CFDI4bCSuQ!
-QZR#@HuQ!2E2S)&VgNH]KRB\FE2S)&VgNH]KRB\FE2SA:VgNH]KRB,.CPZ.hLg!Q!>?$Ji=F"+M
-Lg!PtA71:)=F"+MLg!Q_UnHr<n*'-,i8j(bm-ilnkLnYIa0i1_Km9MCE2SA:VhBH,HtoR4I&D@2
-\V5:+KRB\NI&DXFVhBGqKRB\NI&DXFVhBGqKRC=aGe&]ZVhBH.Km8nn<JXgRLg!Q0>#'rb=F"+M
-Lg!PtA713s::RF+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f!pp%\VbdFKm:(dKt2n^
-W/QJAKm:(dKt!%q[uH*NNJ4j$Kt!%q\<Di[NJ4j$Kt!%q[uH*OPDcu/I(5AuVgNH@@p"Uu=GgTj
-MITbDD.inKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+@Sq<726i8j(Sgtp)ZZ)EV9\V5:+KRC=aGe&NQ\V5:=Km9MKI(=rU\V5:=Km:(dKt2n^
-\VbdFML<L'ICG2i[uH*PML<L/KXZqpaHM:dNJ5H3ICG2iaHM:dNJ4m+Mmn\"[uH*OPDdM?ICG2i
-aGYJWML:e.@Z"YtMITbTFDLpVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5Sbg")F`QQKM
-`5T^6`Pod7`Mf#_\Vbd4KRC=fI(,)hVhBH.ML;mmKt3(g\VbdDNJ4j$Kt!%q[uH*NNJ4p#I(,)h
-\VbdFKm:(dKt2n^\Vbd4HuQQjTSQcHVhBH.Km:.cI(>,^\VbdDNJ4osGdiZd[uH*NNJ4j$Kt!%q
-[uH*NNJ4j$Kt!%q[uH*NNJ4j$Kt!%q[uH+As8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH-bg")F`Pfa7`5T^-]Y28&`Oidr`k8n$`PoI%]r7Bb
-MITbTFDJpbNQ7HHa-hq-R>o7TNQ7HHa-hpsPDdJLNOY11\<Di\PDdMGKXd5([uH*OPDcr7Mmn\"
-\<Di\PDco0Kt*>)\<Di[NJ5E@NQ8H3`k8mi['[?FWi2AOR!a%6@p"Oj:3g&CH!=6n>?#lP</=^Q
-QZR#RML<I4NQ7HHaHM:tR>o7TNQ7HHa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HH
-a-hq-R>o7TNQ7HHa-hq-R>o:`S`&Slkj7ckgtpK/f#u:^]=bha['[3I['[3I['[3I['[3I[%sOo
-MITb6>?$Ji=GU-UH!=7*@p#^PA]U'g\<DilPD$H0Mo_*8\<DilPD$H0Mo_*8aHM:uPD$H0Mo_*8
-aHM:tR>o:OKZBL?\<DilPD$H0Mo_*8a-hq.PD$H0Mo_*8a-hq-R>o7TNQ7HHaHM:tR>o:OKZK@1
-a-hq-R>o:`Sb_@*s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIbKS5L`Po3k['[3I
-Unsl_V50o`Unji_UnslSI!'U18p4*)G#CqU;G)+18pOW?G#CqU;G)+18p4*)MITbtNJ4osGdiZd
-\V5:;NJ49`I(=rUVhBH.Km9MKI(>,^\V5:+HuQWMGc,q.VgNHoKm9MCE2SA:VgNI9bfer*kMYFa
-daZjkbg!c4]sP/RX/rG!V50NCPGG%NS=Z7@St(RQB6d]\Lg!Q!>?#lP</=^QH!=6n>?$D^:3g&C
-Lg!Q!>?$D^:7$'<[uH*OPDcr7Mn"t/[uH*NNJ4j$Kt3(g[uH*PKm:.^Ge&NQ\V5:=Km:.^Ge&NQ
-\V5:+KRC=aGc,q.k1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_>6n#22"Qu-<"D.8lL@[D1PQu-<"D.8iRCRAsJQZR#1D.8iRCSuQ!VgNH_FCgheFf0V+
-WH;^LHuQ',AZ'opQu-;g>#'?I</=^QH!=6n>?$D^:3g&CH!=6n>?#lP</=^QH!=6k;G)gV=P;Kd
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o6m-gm;OI(')WH;^<FDIe%E0kZ^VgNHMFDI7kFf0V+R!a%DI!)?7E2S)&
-VgNH]KRB\FE2S)&VhBGqHuQ!:I&D@2QZR##@p!qc@#.u]H!=7*@p""\<-_\IH!=6n>?#lP<4K'1
-kj7crjQGann)39ii8j(`gt^)sc)65BVgNH]HuQ!2E2S)&VgNH]KRB\FE2S)&VgNH]KRB\FE2S)&
-\V5:+HuQWMGc-4BVhBGqKRB\NI&DXFQZR#!>#'9P@#.u]H!=7*@p""\</=^QG@Y*KD.<PFs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o6m-j)lgtCK>a0i1MKRC=aGc6RUVhBH.ML;sgGc6RU[uH*NNJ4j$Kt!%q
-\<Di[NJ4j$Kt!%q\<Di[NJ4m+Mmn\"[uH*NNJ3^@CPlV(MITb4A71:)=K%15s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQGI^kLe#%
-[uH*PKm9MKI(>,^W/QJ?NJ49`I(,)h\V5:;NJ4<iL:<.r[uH*PML;mmKt*>)[uH*OPDdMGKXZqp
-aHM:dNJ4j$KufI2[uH*_PD$E)KufI2[uH*_PD$E)Kuf1#\<Di[NJ4m+Mo^g)\Vbcl@p"Uu=GU-U
-VhBHts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQdaZjreCMgec-+>U`5T^6`PpKRbJ_B=bKS5PXJMhJI(>,^
-VhBH.ML;@]L:N1hW/QJ?NJ4p#I(,)h[uH*NNJ4j$KufI2[uH*PML;mmKt3(g[uH*PKm:(dKt2n^
-LM^[ZD.gD5Ge&NQVhBH,NJ4osGdiZd\VbdFML;slI(,)h[uH*PML;mmKt!%q[uH*OPDco0Kt!%q
-[uH*NNJ6#t[f?C-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-m.9o.jQG4OhU9p)bKS5L`PoI%]u7n/]=bhh]Y1qi]u7n/]=bhq`Pn0sJVmr>[uH*^R>n_?MoV6F
-\XJbmPDdJLNObLBa-hpsPDdJLNOY11\XJbmPDcr7Mn"t/[uH*OPDcr7Mn"t/\<Di]ML;ptMmn\"
-[uH*OPDdM?ICG2iQZR#1D.7cp<-_\IH!=6n>?$Ji=I<r7R!a%eML;ptMn"t/\<Di\PDcr7Mn"t/
-aHM:fRZtj\NQ7HHa-hq-R>nbGPfK2Oa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HH
-k1nbapA*Y-kLnYIdaZjd`PoI%]sP/R['[3I['[3I['[3I['[3I['YU1E-YYeH!=7(>#'9P@#.u]
-LM^\ER>n_?Mn"t/aHM:ePDdMGKXd5(aHM:fRZtj\NObLBa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HH
-a-hq-R>n_?MoV6Fa-hptRZtmWKXd5(aHM:ePDdMGKXd5(\<Di\PDcr7MqG\Ns8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(LeCN'tf#5PH]=bhXXKAP)Xe_ehUnsl_V50WQS;23*
-G#CqU;G)+18p4*)G#CqU;G)+18p4*)G#CqU;G*<n@]+m,\V5:+KRB\NI&DXF\V5:+KRB\NI&DXF
-\V5:+KRB\NI&D@2VgNH]KRB\FE2S)&VgNH]HuQ!:I+ZZdi8j(SgtpK/f#u:^]=bhh]Y1,;Unji_
-S=Z7@St)=BS=H1@LM^[I;G)4=<-_\IH!=6n>?#lP<-_\IH!=6n>?$D^:3g&CH!=77FDJFEI(5Au
-\VbdEPDco0Kuf1#[uH*PKm9MKI(=rUVhBGqKRB\NI&DXFVgNH]KRB\FE2SA:VgNH]HuS6'h#IES
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7cJXf@b*@Y\f5
-Qu-;fD.f5Q@[M"AQu-<"D.8lL@[D1PQZR#0FDI4bCSuQ!QZR#BFCgheFdI2cVgNHMFDI4bCPlV(
-Lg!Q!>?$D^:3KN-H!=6n>?#lP</=^QG#CqX>?#cD8pOW?G#Cr2R[*pQs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq:XQ[
-QZR#0FDI4bCR9-YQZR#1I!(ctCSuQ!QZR#1I!(ctCSuQ!R!a%DI!)?7E0u#qVgNHNI!)?7E2SA:
-VgNH]HuPEoCPZ.hH!=6n>?#lP<-_\IH!=6n>?$Ji=F"+MH!=7XXfCUOn*'-,kj7d4m-!<fkMYFa
-daZjHN/"6XE0u#qVgNHNI!)?7E0u#qVhBGqHuQ!2E2S)&VgNH]HuQ!2E2S)&VhBGqHuQ!:I(+K<
-VhBGqKRB\FE/J.-G@Y*;>#'9P@#.u]G@Y*;>#'9P@#.u]`5T^qs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,
-g"bH;gtoT1Pc0Oq\Vbd4KRC=fI&DXFW/QJ?NJ4j$KrBrb[uH*NNJ4j$Kt!%q[uH*NNJ4j$Kt!%q
-W/QJ@PDco0Kt!%qLM^[]@p!qc@#AGrMITc,`PqlWs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n)39ifZ_OKPDc>lI&N!Y\Vbd5N/"g$Kr9TO
-[uH*>KRC7gKrBrb\VbdDNJ4j$Kt!%q[uH*OPDcr7Mmn\"\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/
-\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/[uH*OPDco0Kr9TOMITbG@p""\<4AZrs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-kj7d#gt^T<hU9p)bKS5Sbg">Tc,@T?`5T^6`Pod7`Pfa7\<DiKKRB_WL:N1hW/QJ?NJ4j$Kt!%q
-[uH*NNJ4j$Kt*>)[uH*NNJ4j$Kt!%q[uH*NNJ4j$Kt!%q[uH*>KRB\FE2S)&W/QJAKm9PTL:N"_
-W/QJ/KRB\NI&N!YVhBH,NJ4<iL:<.r[uH*NNJ4j$Kt!%q[uH*NNJ4<iL:<.rs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(LeCMgec,@T?
-`5T^6`PoI%]u7n/`5T^-]Y1qi]t:qj]=bhDFDHYKB=O.`a-hptRZtj\NObLBa-hpsPDcu?PfK2O
-\XJbmPDcu?Pdlp8\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/
-\Vbd5N/"lsGc6RU\VbdEPDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/a-hpsPDcu?Pe!6I
-a-hptRZt@OPfK2O\XJbnRZt@OPe!6Ia-hptRZtj\NQ7HHa-hqLbfTnbs6T@Mkj7ckgtpK/f#u:^
-`5T^&['[3I['[3I['[3@XKAk:['[3IQ\9pI@p""\<-_\IH!=6n>?$Ji=LX9DaHM:ePDdMGKXd5(
-\<DilPD$H0MoV6F\<DikR>o7TNQ7HH\XJc'R>nbGPfT&A\XJc'R>nbGPfK2Oa-hptRZtj\NQ7HH
-\<DikR>nbGPfT&A\XJbmPDdMGKZKs[p[%)Cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-m.9o6m-ilnkLnYIbKS5L`PoI%]sP/RUnsl_V50o`Unji_UnslAI!^$78p4*)BMV3C;G)+18p4*)
-G#CqU;G)+18p4*)MITbdKRB\NI&DXF\V5:+KRB\FE2SA:VhBGqKRB\FE2SA:VgNH]KRB\FE2S)&
-VhBGqHuQ!:I&DXFVgNI,bg#A<n(HLQdaZjkbg!c4]sP/RX/rFnSt)=BS=H1@R?Ni)St("8@!PsU
-G#CqX>?#cD8pOW?G#CqX>?#lP<-_\IH!=6n>?#lP<1%N3[uH*NNJ4m+Mmn\"\<DiLN/"g$Kt!%q
-VhBH,NJ49`I(=rUVhBH.Km9MKI&DXFVgNH]KRB\NI&DXFk1nbls8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n&32aQu-;fD.f5Q@Z"YtQZR"uD.f2WCRAsJ
-QZR#0FDI4bCR9-YQZR#0FDI4bCR9-YQZR#0FDI4bCR9-YQZR#1D.7Zd8pOW?H!=6n>?#cD8pOW?
-G#CqX>?#lP<-D/3H!=6n>?#cD8p=fRkj7d<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9nZUnF)l@[D1PQZR#0FDI4bCR9-Y
-QZR#1I!(g(Ff0V+R!a%DI!)?7E0u#qR!a%SHuPI#Ff0V+R!a%DI!(g(Ff0V+LNIK\>?#lP<-_\I
-H!=6n>?#lP<-_\IH!=6n>?#lP<4K'1kj7d%m-j0)n*'-,kj7ckgtp`>hRB;RR!a%SHuPI#Ff0V+
-R!a%SHuPEoCRBKlR!a%DI!)?7E0u#qR!a%SHuQ!:I&D@2VhBGqKRB\NI&DXFVhBGQD.eZ.:3U5V
-H!=6n>?#fW@#.u]G@Y*,>?$r2C]FG7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG[\grmpdW/QJAML;@]L8^&c
-W/QJAML;@]L:<.rW/QJ?NJ4j$KrC5t[uH*?N/"j+Ml;Sh[uH*?N/"g$KrBrb\<Di;KRo"j=Ee:`
-MITb4A71:)=TAF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq;C>si8j(SgtoN9TXTo7W/QJAML;@]L:N"_W/QJAML;@]L:N1hW/QJ/KRC7gKrBrb
-[uH*OPDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mmn\"
-\<Di[NJ4m+Mn+^m[uH*NNJ3aIFa71jH!=6n>?'4m^&S-4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH4eCN9rbKJ,S
-`5T^=bg")F`QQKM`5T^=bg!Z"WjdtA[uH*?N/"g$KrBrb[uH*?N/"j+Mmn\"\<Di\PDco0Kt*>)
-\<Di\PDco0Kt!%q[uH*NNJ4j$Kt!%q[uH*NNJ4j$KrBrb[uH*?N/"g$Kt!%qW/QJ?NJ4j$KrBrb
-[uH*OPDcAuL:<.rW/QJ?NJ4<iL8^&c\V5:LXJPsss8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjkbg")F`Pfa7]=bhs]Xk_f]t:qj
-`5T^-]Y1qi]st2ELM^[jFDJFUPe!6I\XJc'R>nbGPe!6I\XJbnRZt@OPdlp8\<Di\PDcr7Mn"t/
-\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/[uH*OPDcr7Ml;Sh
-\<Di\PDcAuL:EG*\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/a-hptRZt@OPfK2O\XJbnRZtj\NQ7HH
-\XJc'R>nbGPfK2O\XJbnRZuFB^&S-4s8W,coC_>6n)39idaZjkbg")F`O*"Z['[3I['[3I['[3I
-['[3@XKA:pUj60DH!=6lA713s:3g&CH!=7GKRC:nMn,:@\<Di]RZt@OPe!6I\XJc'R>nbGPfK2O
-\XJbnRZtj\NObLBa-hptRZtj\NObLBa-hptRZt=GMoV6F\XJc'R>n_?Mo_*8\<Di\PDcr7Mo_*8
-f>PB&s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(Sgtp5uc,@T?
-]=bhXXKAP)XdkuQUnsl_V50o`Uka&2BMV35:J#_-8n_!lG#CqG:J#_-8p4*)G#CqU;G)gV=Lj<:
-VhBGqKRB\NI&DXFVhBGqKRB\FE2S)&R!a%SHuPF*JZ!m7VhBGqKRB\NI&DXFVhBGqKRB\NI*9aY
-i8j(SgtpK/f#5PH]=bha['Zm8Xe_ehS=Z7@St)=BS>_mAG@Y*);G(Uu8U4N>BMV3C;G)+18p4*)
-G#CqU;G)4=<-D/3G#CqfD.ff+L8^&cW/QJ?NJ4<iL:<.rW/QJ0N/"g$Kr9TOW/QJ/KRB\NI&DXF
-VhBGqHuQ!:I&DXFVgNH]KRDq;h#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq=OCVkj7crjQDnXFbagHLM^[ZD.f5Q@Y\f5Qu-;fFE!RgCR9-YQZR#0FDI4bCR9-Y
-QZR#0FDI4bCR9-YQZR#0FDI4bCR9-YH!=6n>?#cD8p4*)H!=6k;G)4=<-D/3BMV3F>?#938Tn!(
-BMV3C;G*mPOT5@\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA*k+gmEJ3LM^[jFDHYRE0kZ^QZR#0FDI4bCR9-YQZR#1I!(g(Ff0V+
-R!a%DI!)?7E0u#qR!a%DI!)?7E0u#qVgNHNI!(ctCO',`H!=6n>?#lP<-_\IH!=6n>?#lP<-_\I
-H!=7XXfD-^kNM:$kj7d%m-j0)n)iE\g"bH(]XjJXFdI2cQZR#1I!(ctCRBKlQZR#0FDI4bCR9-Y
-QZR#0FDI4bCRBKlR!a%DI!)?7E0u#qVhBGqKRB\NI$f;(H!=6lA70[e</P0fH!=6lA70[e<-Mk\
-G@Y+$]Xn.Cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bGnUnFZFL8^&cVhBGqKRB_WL8^&c[uH*?N/"g$KrBrb
-[uH*?N/"g$KrBrb[uH*?N/"g$KrBrb\<DiLN/"g$KpQmsG@Y*=@p!qc@#.u]Q]-h%s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhT2dp
-VhBGqKRB_WL8T]PW/QJ0N/"9iL8^&cVhBGrN/"m#I&N!YW/QJ?NJ4<iL8^&c\<DiLN/"j+Ml;l%
-\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/[uH*OPDcAuL:<.r[uH*?N/"g$KrBrb
-\V59`D.e,u<-_\IG@Y+Um-"EKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+=jQGI^kLnYIdaZk#bfe2Rc,@T?`5T^6`Pod7`QQKM
-`k8m]P`Vi&L8^&c[uH*?P`WA6KrC5t[uH*?P`WD=Mmn\"W0ECQNJ4m+Mmn\"\<Di[NJ4j$Kt!%q
-W/QJ?NJ4<iL8^&c[uH*OPDco0Kt!%qW/QJ0N/"g$KrBrbW/QJ?NJ4<iL8^&c[uH*?N/"g$KrBrb
-VhBGrN/"6`I.[..s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7crjQFt@f#u:^bKS5L`Pod7`Pfa7]=bhq`PoI%]uI^r]=bhh]Y1hWWcr;q
-VgNHoRZt@OPe!6I\XJbnRZt@OPe!6I\<Di]RZt=GMn"t/\<Di\PDcB(OLUL4\<Di\PDcr7Mn"t/
-\<Di\PDcr7Mmn\"[uH*?N/"g$Kt*>)W/QJ@PDcAuL:EG*W/QJ@PDcr7Ml;l%\<Di\PDcr7Mn"t/
-\<Di\PDcr7Mn"t/\<Di\PDcr7Mn,:@\<Di]RZt@OPe!6I\XJbnRZt@OPe!6Ia-hptRZt@OPi]j#
-s8W-!s8W-!s7H$\kj7crjQG4OhTO-f`5T^-]Y1\Z['[3I['[3I['[3I['[3I['[2qD.e,u<-_\I
-H!=6n>?#fW@$btN\<Di\PDcr7Mn,:@\<Di]RZt=GMn,:@a-hptRZt@OPfK2O\XJbnRZt@OPfK2O
-\<Di]RZt=GMoV6F\XJc'R>n_?MoV6F\<Di]RZt=GMn,:@aJ>C!pA+ags8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7bnD.eTNH`3Bu
-a0i2#eCO9cq>^Kps8W-!s8W-!s8W-!m.9o6m-ilnkL.l2daZjd`PoI%]sP/RUnsl_V50o`Unji_
-UnslBFDuD$8n_!lBMV35:J#4q8Tn!(BMV35:J#4q8SCmkMITbdKRB\NI&DXFVhBGqKRB\NI$f;(
-VgNHNI!)?7E2S)&R!a%SKRB\NI$f;(VhBGqKRB\NI&DXFVhBH@bg#),kLnYIdaZjkbg!c4]sP/R
-X/rFnSt)=BS=H1@S=Z7@St("8?t`>-BMV35:J#h9<+o'!BMV3F>?#938SCmkG#CqF>Zu;K8r@+\
-W/QJ0N/"6`I&N!YW/QJ/KRC7gKr9TOW/QJ/KRC7gKr9TOVhBGqKRB\NI&DXFVhBGqKRB\NI&DXF
-k1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
-\XJbMD.89;B:*OFLM^[ZD.f2WCPQb>QZR"uD.f2WCPQb>QZR"uFE!RgCPR"NQu-;fFE!Ua@Y]&E
-QZR"uFE!+I=D1K%H!=6]:J#4q8SCmkBMV35:J#h9<+o'!BMV3F>?#938SCmkH!=8$gtr)2s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
-\?2cdD.eW@B8:>:QZR"uFE!"WE//OSQZR#1I!(g(FdRQ!R!a%DI!(g(Ff0n?R!a%CFDI7kFdRQ!
-R!a%DI!(g(FdRQ!QZR"g>?#lP<-_\IH!=6k;G)4=<-_\IH!=6]:J#h9<4K'1m.9o:oC_kEkNqg5
-kj7crjQG4OhU9p)VhBGaFDI4bCR9-YQZR#0FDI4bCR9-YQZR"uD.f2WCR9-YQZR#1I!(ctCRBKl
-R!a%DI!)??I$]M;VhBGqKRAPlB8U2$G@Y*,>?#fW@!PsUG@Y*;>#'?I<-N1po_/+\s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
-kj7d#gt^)sc)?SUW/QJ/KRB_WL8^&cW/QJ0N/"9iL8^>uW/QJ0P`Vi&L8^&cW/QJ0N/"9iL:EG*
-W/QJ0N/"9iL:<.rW/QIg@p""\<-Mk\H!=6lA74'6bQ%VBs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkMYFa`k8m\KRB\NI&DXFW/QJ/KRB_WL8T]P
-VhBGrN/"6`I&N!YVhBGrN/"6`I&N!YW/QJ?NJ4<iL8^>u[uH*?P`WD=Ml;l%W0ECBP`Vi.OLUL4
-W0ECBN/"9qOLL4'W0ECBN/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cMITb6>?#lP</5R7
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<[_Gi8j(SgtpK/f#u:^bKS5Sbg")F`QQKM`5T^6`Pp$Ec*sLA\<DiLN/"9qOJn+m
-W/QJ?NJ4<iL8^&cW/QJ0N/"g$KrBrbW/QJ0N/"9iL8^&cW/QJ?NJ4<iL:<.rW/QJ@PDcr7Ml;l%
-\<DiLP`WA6KrBrb\<DiLN/"9iL8^&cW/QJ?NJ4<iL8^&cW/QJ0N/"9iL8T]PaJ>C,s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
-k1nb?eCMgec,@T?`5T^6`PoI%]uI^r]=bhh]Y28&`Oidr]=bhQV5/l`B;^E1\XJbnRZt@OPe!6I
-\XJbmPDcB.Q+3$9W0ECBP`Vi.OLUL4W0ECRPDcB(OJn+mW0ECQNJ4<qOJn+mW0ECBN/"9iL:<.r
-W/QJ0N/"9iL:<.rW0ECRPDcB(OLUL4W0ECRPDcB(OLUL4W1'!]PDcB.Q+3$9\<DiLP`WD=Ml;l%
-\<DiLP`WD=Mn"t/\XJbnRZt@OPe!6I\XJbnRZt=GMn,:@f>PB&s8W-!s8W-!s8W,kpA+(Hp#+oo
-daZjreCMRW`Oidr['[3I['[3I['[3IX/rG1['[3I[$Q`/H!=6lA70[e<-Mk\H!=7*@p#[oOL^gE
-\XJbnRZt=GMn,:@\XJbnRZt@OPe!6I\XJbnRZt=GMoV6F\XJbnRZtj\NObLBa-hptRZt@OPe!6I
-\XJbmPDcu?Pdlp8a-hqOe^sj$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,]gt[*a@!PsUBMV3F>?#6?>'<e9H!=6n>?$u;Ff:ao
-['[4(m-jT?q<[_Gi8j(Sgtp5uc,@T?]=bhXXKAP)Xe_ehUnsl_V50o`Uka&2BMV35:J#4q8SCmk
-BMV35:J#4q8SCmkG#CqG:J$FR=Jph"VhBGbI!)?7E0u#qVgNHNI!)?7E0u#qVhBGbI!)?7E0u#q
-VhBGqKRB\NI$f;(VhBGqKRB\NI*9aYi8j(SgtpK/f#5PH]=bha['Zm8XdkuQS=Z7@St)=BS=H1@
-G@Y)p:J#_-8n_!lBMV35:J#4q8SCmkBMV3F>?#938Tn!(BMV3TD.ff+L8T]PVhBGqKRB_WL8T]P
-W/QJ/KRB\NI&DXFW/QJ/KRB\NI&DXFR!a%SKRB\NI&DXFVhBGbI!+,thZ*WUs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-hm3`J8PSLM^[ZD.eW@B8:>:
-QZR"uFE!"WE0tKOLM^[ZD.eWGE//:CQu-;fD.eW@B8:>:LM^[kD.89;B8:>:LM^[L>?#938SCmk
-H!=6]:J#h9<+o'!BMV3F>?#938SCmkB3\VR:J#4q8V_D,o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+=jQDkOCPQb>Qu-;fD.eW@B8:>:
-QZR#0FDHYRE0u#qR!a%DI!(g(FdRQ!R!a%DI!(g(FdRQ!R!a%DI!(ctCRBKlR!a%DI!(3dE->,O
-H!=6n>?#cD8nVC4H!=6]:J#2(>'X=OBMV4,[']2kp$D;Cm.9oBpA*q=n)39ig"bH4eCM+)TSIAs
-LNIL%FDHYKB:!^ULM^[jFDHYKB8:SJLNIL%FDHYRE0kZ^R!a%DI!(g(FdRQ!R!a%CKRp%SI&DXF
-R!a%#A70Ul@!PsUH!=6lA70[e<-Mk\G@Y*,>?$rBJcGcMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI\XJb]N/"6`I&DXF
-W/QJ/KRB_WL8^&cW/QJ?NJ4<iL8^&cW/QJ?NJ4<iL:EG*W/QJ0N/"9iL:N1hW/QJ0N/!^IFa%A(
-MITb4A71:)=GM!;s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA*q=n*'-,i8j(>`Pnd7L8T]PQ\9pfKRB\NI&N!YVhBGqKRB\NI&DXFVhBGaKRp%SI&N!Y
-VhBGrN/"9iL8^&cW/QJ0N/"9iL8^>uW0ECBP`WD=Ml;l%\<DiLP`WD=Ml;l%[uH*?P`Vi&L8^&c
-W/QJ0N/"6`I&DXFVhBGqKRB_WL8^&cW/QJ0N/![PJU(I!H!=6lA71a_MZ<_Vs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n(HLQ
-g"bH4eCMgec-+>U`5T^6`Pod7`QQKM`5T^8]Xk&+OJnD*W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
-W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW0ECBP`WD=Ml;l%W0ECRPDcB(OLUL4W0ECRPDcB(OJn+m
-W/QJ@PDcAuL8^&cW/QJ0N/"9iL8^&cVhBGrN/%)nkPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjkbg")F`Pfa7
-`5T^-]Y28&`Oidr]=bhq`PoI%]uI^rW1&uqD/6)/L:Nb;\XJb]P`WGEPc0h.\<DiLP`Vi.OLUL4
-W/QJ0N/"9iL8^&cW0ECQNJ4<iL8^&cW0ECQNJ4<iL:<.rW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
-\<DiLN/"9qOLUL4W0ECBP`Vi.OLUL4W0ECRPDcB(OLUL4W0ECBN/"9iL:EG*W0ECRPDcB(OLUL4
-\XJbmPDcu?Pe!6I\<Dj8e^sj$s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hTO-fbKS5C]Y1qi]sP/R
-X/rG1['[3I['[3I['[39V5/B@<-_\IH!=6n>?#lP<-_\IW/QJ@PDcu?Pe!6I\XJbnRZt@OPe!6I
-\XJbnRZtj\NObLB\XJbnRZt@OPdlp8\XJbmPDcu?Pe!6I\<DikR>nbGPdlp8\XJc(XJPsss8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8U$V`FiFZBMV35:J#4q8SCmkBMV3F>?#938S;:3B3\V`;G)^dE5oQ%m.9o6m-ilnkLnYI
-daZjd`PoI%]sP/RUnsl_V50o`Unji_UnslBFDtnh8QA2FBMV3I3]q(O8SCmkBMV35:J#4q8SCmk
-G@Y*JKRp%SI$f;(VhBGqKRB/7Ff0n?R!a%CKRp%KE0u#qR!a%SKRB/7Ff0n?Q\9pfKRB\NI$]M;
-VhBH@bg#),kLnYIdaZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7@St("8?t`>-BMV35:J#4q8SCmk
-BMV35:J#4q8SCmkBMV35:J#4q8W%"[VhBGaKRp%SI&DXFVhBGqKRB\NI&DXFW/QJ/KRB\NI&DXF
-Q\9pfKRB,>JZ"0KQ\9pfKRB,>JZ"0Kk1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+@Sq<726i8j'gI!(3]B8:>:LM^[ZD.eW@B8:>:LM^[ZD.eWGE0tKO
-LM^[ZD.eW@B8U2$LM^[ZD.eW@B8:>:LNIL%FDHYKB8:>:BMV34>Ztf:8SCmkB3\VR:J#4q8SCmk
-BMV35:J#4q8SCmkBMV35:J$t<PQ1[_s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8VHWor+=ELNIKjD.eW@B8:>:LM^[jFDHYRE//OSQZR"uFE!RgCPR"N
-QZR"uFE!RgCPR"NQZR#0FDHYRE0u#qQZR#1I!(ctCRBKlLM^[I;G(S,>%g]'B3\V`;G(Uu8S;:3
-BMV35:J#4q8[Pk3o_/+QpA+@Sq<[_Gm.9o6m-ilnkLnYI`5T]^FDHYKB8:>:LM^[ZFE!RgCPQb>
-LNIL&D.89BE//OSQZR#1I!(ctCRBKlR!a%DI!(d/JX;%@VhBGaN/FNdI$f;(H!=6lA70Ul@!PsU
-G@Y*,>?#fW@!?-hG@Y*[R[*pQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+@Sq<726i8j(A[BZ'WMPl,TQ]-g"KRB_WL8^&cW/QJ0N/"9iL8^&c
-W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cQZR"eA70[e<-Mk\G@Y*kXfDF$s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7d#gt^?-eu4gp
-VhBGaKRoJCJZ"0KQ\9pVKRoJCJZ"0KQ]-fgKRp%SI$]M;Q\9pVKRoJCJZ"0KQ]-g"KRB_WL8^&c
-W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"6`I$]eLW/QItKRp(\L8^&c
-W/QJ0N/"9qOJn+mW0EC2I!'XD@!PsUH!=7XXfDF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)fZ_O^bg")F`RrDX
-`5T^6`Pp$Ec,@T?\"o[qP`Vi&L8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
-W/QJ@PDcAuL:<.rW0ECBN/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8T]P
-W/QJ/KRB_WL:Nb;s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtp`>hU9p)bKS5L`Pod7`Oidr`5T^-]Y28&`Oidr
-]=bhh]Y1qi]qhL#G@Y*[N/"9qOJnD*W0ECBP`Vi.OJn+mW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
-W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^>uW/QJ0P`Vi.OJnD*\<DiLN/"9qOLUL4
-W0ECBP`WGEPc0h.\<DiLP`WD=Ml<)0\<DiLP`WD=Ml<)0\XJbnRZsb8OL^gE\XJbnRZuakkPtS^
-s8W-!s8W-!s8W-!s8W-!s8VHWp#+ooi8j(LeCMgec,@T?]=bha['[3I['[3IX/rG1['[3I[(*6<
-LNIKZA70[e<-_\IG@Y*,>?$B"E4D*i\<Di]RZt@OPe!6I\XJbmPDcu?Pdlp8\XJbnRZt=GMn,:@
-\XJbnRZt@OPe!6I\XJbnRZt@OPdlp8\XJbnRZusih#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+IoC_JAp%7tRo_/+\s8V`bq4+%HBMV35:J#4q8SCmk
-BMV35:J#4q8SCmkBMV35:J#4q8V_D,W/QJ0P`XhakNqg5i8j(Sgtp5uc,@T?]=bhXXKAP)Xe_eh
-Unsl_V50o`Uj$p&BMV3"76tT_8Q\YWBMV3"76tT_8SCmkBMV35:J$@G:7$WbVgNHMKRoJCJXCh-
-VhBGaKRp%KE0l6/VhBGaKRp%SI$]M;VhBGaKRp%SI&DXFQ]-g"KRB_WL<Ifci8j(SgtpK/f#5PH
-]=bha['ZX*Unji_S=Z7@St)aJQ(4G9G@Y)p:J#4q8SCmkBMV35:J#4q8SCmkBMV35:J#4q8SCmk
-BMV3DA72<gI$f;(Q\9pVKRoJCJX;%@VhBGaKRp%SI$]M;VhBGaKRp%SI$]M;Q\9pVKRp%SI$]M;
-VhBGaN/HcQh#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-j0)n$f*cLM^[ZD.e`9=GLa+LM^[ZD.eW@B8:>:LM^[ZD.eW@B8:>:LM^[JD/5#==GLa+
-LM^[ZD.eW@B8:>:LM^[ZD.e''?t`>-BMV35:J#4q8SCmkBMV35:J#4q8SCmkBMV35:J"Y^88(dj
-BMV3uR[*pQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-fZ_NoD.eW@B8:>:LM^[ZD.eW@B8:>:LM^[ZFE!RgCPR"NLNIL&I!(3dE0kZ^L4"?7FDHVYH^Ahi
-L4"?7FDHVYH\Z]^LNIL%FDHYKB4kIQBMV35:J#4q8S;:3BMV35:J#4q8SCmkBMV40XfD$eq=OCV
-o_/+QpA+@Sq<726i8j(SgtpK/esV_cQu-;fD.eW@B8:>:LM^[ZD.eW@B8:>:LM^[jFDHYRE//OS
-R!a%2I!_6.FdIc4R!a%CKRoJCJZ"0KQ\9pVKRnnqB6d]\G@Y**A70Ul@!?-hG@Y)o>ZuDW<-Mk\
-Q]-h%s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-kj7crjQF_1c'OBHVhBGaKRoJCJZ+N^Q]-g"KRB,FMPuJgW/QJ0P`Vi&L8^&cW0ECBN/"9iL8^&c
-W/QJ0N/"9iL8^&cW/QJ/KR@uS@!?-hG@Y**A70Ul@/p9,s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7d%m-ilnkLnYIW1'!<KRoJCJX;%@Q\9pVKRoJCJZ"0K
-Q\9pVKRoJCJX;%@Q\9pVKRoJCJZ"0KQ\9pVKRp%SI$]M;Q]-g#N/![XMO8d6G@Y*[N/"9iL8^>u
-W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ/KRB,>JZ+N^Q\9pgN/"9iL8^&cW/QJ0N/"9iL8^>u
-LNIKZA70%T>'X=Og"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+@Sq<726i8j(LeCN'tf#u:^bKS5L`Pp$Ec,@T?`5T^6`Poj0\u:jT
-W/QJ0N/"9iL8^&cVhBGaN/FNdI&N!YW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0P`Vi&L8^&c
-W0ECBP`Vi&L8^>uW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cQ]-g#N/![PJZ+N^Q\9qRm-juSs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+@Sq;C>sg"bH4eCMgec-+>U`5T^6`Pod7`Oidr]=bhs]Xk_f]u7n/]=bhs]Xjo8Uk`f"
-Q]-g3PDcAuL8^>uW/QJ0N/"9qOJn+mW/QJ0N/"9iL6mjVW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
-W/QJ0N/"9iL8^>uW/QJ0N/"9iL8^&cW/QJ0P`Vi.OJnD*W0ECBP`Vi4Q+3$9W0ECBP`Vi4Q+<?J
-W1'!]PDcB.Q+<?JW1'!^RZt@OPc1%9\XJbnRZt:WT`>&ls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_&&kLnYIbKS5L`PoI%]sP/R['[3I['[3I['[3I['[3@XK@nSPBgA3G@Y)o>ZuDW<-_\I
-G@Y*[P`WGEPdlp8\XJbmPDcu?Pe!6I\XJbnRZt=GMn,:@\XJbnRZt@OPdlp8\<Di]RZt=GMn"t/
-\XJbmPDdJhZ2ak(s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-m.9o:oC_>6n*'-,kj7d%m-j<4p#+ooL4">J76spB5ug?><CK2U9Lr8Z86APVBMV3%9Lrhm8SCmk
-QZR#AN/![PJZ"0K]=bi@m-ilnkL.l2daZjd`Po3k['[3IUnsl_V50o`Unji_UnslBFDt5K6"j%c
-<CK2e:J"Y^8:3H\BMV3"76spB6"j%cH!=7GHuPF*JXCh-VhBGbI!(d/JZ"0KQ\9pWI!(d/JXCh-
-Q\9pfKRB,>JX;%@VhBGaKRp(\L8^&cQ]-gFbg#),kLnYIdaZjd`PoI%]sP/RX/rFnSt)44PFS57
-S=Z7@St'Fu>#e!W<CK2R76spB5ug?>BMV35:J#4q8SCmkBMV35:J#4q8W%"[Q\9pWI!(g(FdRQ!
-VgNHMKRp%SI$]eLVhBGaKRoJCJX;%@Q\9pWI!)??I$]M;Q\9pVKRoJCJZ"0Kg"bHas8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7c]bfto[B8:>:
-GAV,Q@p"M'B8:>:LM^[ZD.eW@B8:>:G@Y*=@p!qlCNj;sGAV,Q@p!qlCPQb>LM^[ZD.eWGE//:C
-LM^[;:J#4q8SCmkBMV35:J"Y^88(dj=A28!:J"Y^88(djBMV3%9Lr8Z88(djL4"@3m-juSs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,Pgtmg.E//:CLM^[ZD.eW@B6S3.
-LM^[ZD.eW@B8:>:LNIKjFE!"WE//OSLNIL%FDHYRE/&aeLNIKjFE!RgCPR"NLNIKjFE!RgCPI4`
-LM^[;:J#4q8SCmkBMV35:J#4q8SCmkBMV3%9Lrhm8[Pk3o_/+\s8V`bq=OCVo_/+Em-ilnkN:RT
-daZjT['YU*B8:SJLM^[ZD.eW@B8:>:LM^[ZD.eW@B8:SJLNIL%FDHVYH^AhiL4"?8I!(d/JX;%@
-VhBGaKRoJCJZ+N^Q\9p6D/4?+@!PsUB3\Vc>?#fW@!PsUB3\VaA70[e</5R7daZkJs8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLe#%W/QItKRoJCJX;%@
-Q\9pVKRoJCJX;%@W/QItN/FQmL8^&cW/QJ0P`Vi&L8^&cW0ECBN/"9iL8^&cW0ECBN/"9iL5()&
-G@Y*,>?#fW@!PsUUnsmes8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA*q=n)39ik1nb%Xf@_@JXCh-Q\9pWI!(d/JX;%@Q\9pVKRoJCJXCh-Q\9pWI!(d/JX;%@
-R!a%CKRoJCJX;%@Q]-g"KRB,>JZ+N^Q\9p6A70%T>*k2*W/QItN/FQmL6mjVQ]-g#N/![XMO09Z
-W/QItN/Es\MPuJgQ]-g"KRB,FMPuJgQ]-g#N/"9iL8^>uW0ECBN/"9iL3IKMH!=6\>Zu>^@/p9,
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-ilnkLnYIdaZjkbg")F`QQKM`5T^6`Pp$Ec,@T?`5T]oR['h1L6mjVVhBGaN/EsTJZ+N^
-Q\9pgN/![XMPl,TQ]-fgKRp(\L6mjVW/QItN/FQmL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
-Q]-g#N/![PJX;=QVhBGaN/FNdI$]M;Q]-fgKRp(dOT5@\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n(HLQ
-daZjreCMgec,@T?`5T^-]Y28&`Oidr]=bhs]Xk_f]t:qj]=bhQV5/lgE0l6/W0ECBN/"9iL8^&c
-W/QItN/Es\MPuJgQ\9pfKRB,FMO0!IQ]-g#N/![XMPuJgQ]-g#N/![XMPuJgQ]-g#N/"9iL8^&c
-W0ECBN/"9qOLUL4W0ECRPDcB(OJnD*\<DiLP`Vi4Q+<?JW0ECBP`Vi4Q+<?JW1'!^RZsb>Q+<?J
-W1'!^RZsb>Q,LY\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(SgtpK/f#5PH
-]=bhh]Y1\Z['[3I['[3@XKAk:['[3IX/rFIA70%T>'X=OB3\VaA70[e<2bb1W1'!^RZsb>Q+<?J
-\XJb]P`WGEPe!6IW0ECSRZt=GMn,:@W0ECSRZt@OPc1%9\XJb]R[(FPPe!6IfZ_P=s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kMYFai8j(SgtpuMkMYFa
-['[2Q>Zt,r5ug?><CK2R76spB5ug?><CK2R76spB5ug?>BMV3SI!_35JX;%@Q\9pVKRp(dOPo3_
-i8j(Sgtp5uc,@T?]=bha['ZX*Unji_Unsl_V50o`Uka&2BMV3%9Lr/P6"j%c<CK2U9Lrhm8QA2F
-BMV3"76u3'<0r8hR!a%CKRoM<FdIc4R!a%CKRoJCJX;%@Q\9pVKRoJCJX;%@VhBGaN/EsTJZ+N^
-Q\9pgN/![PJ^W'!i8j(LeCN'tf#5PH]=bha['ZX*Unji_S=Z7@St)=BS=H1@B3\V?76spB5ug?>
-BMV3"76spB5ug?><CK2R76spB6"j%c<CK2tA71dPFdRQ!R!a%CKRoM<FdRQ!Q\9pVKRoJCJX;%@
-Q\9pWI!(d/JXCh-Q\9pWI!(d/JZ"0KQ\9pVKRr:@h#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)39iQ]-fGA7110B6RloGAV,>A70Ul@!?I'
-G@Y**D/4?+@!?I'MITb4A70Ul@!?I'G@Y**A70Ul@!?I'LM^[JA70Ul@#&T3B3\VB9Lrhm8Q\YW
-BMV3%9Lrhm8Q\YWBMV3%9Lr8Z86APVBMV3%9Lr8Z89\TP]=biWs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8Ud-hM-E)LM^[ZD.e'0CPQb>GAV,ND.eW@B6S3.LM^[ZFE!"PB8:SJ
-LNIKjFE!"WE//OSLNIL%FDHYRE//OSLNIKjFE!"PB8:>:LNIKjFDuG7?t`>-BMV35:J"Y^88(dj
-=A27f9Lr8Z86APV=A28m[']l5s8W-!s8W-!s8V`bq=OCVi8j(ZjQG4OhUp&qQ\9pFD.eW@B8:>:
-LM^[ZD.eW@B8:>:LM^[ZFE!"WE//OSLNIKjFDut^H^K2'R!a%DI!(g(FdIc4Q\9pVKRoJCJX;%@
-LM^[:>ZuDW<-Mk\B3\VaA70%T>'FLbB3\VQ>ZuDW<1/r6o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+@Sq<726`5T]^KRoJCJXCh-Q\9pWI!(d/JX;%@Q\9pfKRB,>JX;%@
-W/QItN/FQmL6mjVW/QItN/FQmL8^&cR?Ni5N/"9iL7+6hW/QITA70Ul@!?-hG@Y**A75''q>^Kp
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp&`\sJ)$
-Q\9pVKRoJCJX;%@Q\9pVKRoJCJX;%@L4"?8I!(0kH^K2'L4"?8I!(d/JXCh-Q\9pVKRp%SI$]eL
-Q]-g#N.uOnCN`TJL4"?d`PndEQ'[/TQ]-fgKRp(\L6mjVW/QItN/FQmL6mjVW/QItN/FQmL6mjV
-W/QItKRoJKMO09ZW/QJ!PEVr(L8^>uW/QItN/Dgi?t`>-B3\VpI!bnns8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7ckgtpK/f$`(!
-fZ_OW`Pp$Ec,@T?`5T^6`Pod7`OidrQ\9pgN/![PJX;%@W/QItKRp(\L6mjVW/QItKRp(\L6mRE
-VhBGaKRoJKMPl,TQ]-fgKRoJKMO09ZQ]-fgN/FQmL6mjVW/QItKRoJKMO0!IQ\9pfKRB,FMO0!I
-Q]-fgN/FNdI$]eLl.+Dcs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5Sbg")F`Pfa7
-`5T^-]Y28&`Oidr]=bhq`PoI%]uI^r\?2cTD/5JkJZ+fpW0ECBN/![XMPuJgQ]-g"KRB,>JX;%@
-Q\9pfKRB,>JX;%@Q\9pgN/![XMPuJgQ]-g#N/"9iL6mjVW/QItN/FQmL8^>uW/QJ0P`Vi.OJnV5
-\XJb]R['h?Q+<?JW1'!MP`Vi.OJnV5\<DiLR[(FPPc0h.\XJb]R[(FPPc1%9f>PB&s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjd`Pod7`Oidr['[3I['[3I['[3I
-['[3@XKAk:["sBgH!=6\>Zu>^@!PsUB3\VqD.ff3OJnD*\XJb]R['h9OL^gEW0ECBR[(FPPe!6I
-W1'!MP`WGEPc1%9\XJb]P`WGEPe!6IW0ECBR[(FPPigcVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,coC_JAp#+ooi8j(SgtpK/f$`(!bKS4iMi:Y)5ug?><CK2R76spB5ug?>
-<CK2R76spB5ug?><CK2e:J$=`E0u#qR!a%DI!(d/JXCh-LkLH"`PpcrkLnYIdaZjd`PoI%]sP/R
-Unsl_V50o`Unji_UnslBFDt5K6"j%c<CK2e:J"Y^88(dj<CK2e:J"PT6!-fOH!=78I!(d/JX;%@
-R!a%CKRoM<FdIc4R!a%DI!(d/JX;%@Q\9pVKRoJCJZ+N^Q\9pVN/Es\MPuJgQ]-gFbg#),kLnYI
-daZjd`PoI%]rS6:X/rFnSt)=BS=H1@S=Z7@St't%8l\;G<CK2R76spB5ug?><CK2R76spB5ug?>
-<CK2R76spB6$Z[6L4"?8I!(0kH^K2'R!a%CKRoM<FdRQ!R!a%CKRoM<FdIc4R!a%DI!(d/JX;%@
-R!a%CKRoJCJX;%@g"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7d%m-hs,\p&",G@Y**A70Ul@#AGrGAV,Q@p!qc@!?-hG@Y**A70Ul@!?-h
-G@Y*,>?#fW@!?-hG@Y**A70Ul@!?I'G@Y**A70Ul@!PsU=A28!:J"Y^88(dj=A27f9Lrhm8Q\YW
-BMV3"76t$L86&)E=A27c76spB6&0Q$bKS62s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s2;mq
-LNIKjD.e''@#&T3GAV,>A7110B6S3.LM^[ZD.e'7FGF^GLNIKjD.eWGE//OSLNIKjFDut^H\Z]^
-LNIKjFE!"WE//:CGB@q^D.eW@B8:SJG@Y)`9Lr8Z86APV=A27f9Lrhm8Q\YW=A28!:J"Y^8@5b2
-s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH4eCM.3Wcqu]LM^[JD/4oDB6S3.LM^[ZD.e'0CPQb>
-LNIKjFE!"WE//OSR!a%3FDut^H\d?.R!a%4KS5_?FdRQ!Q\9pVKRoJKMO8d6G@Y)o>ZuDW<+fH>
-H!=6\>Zu>^@!?-hB3\VaA70%T>+D1Sp[%)Cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV
-i8j(1UnF'-JX;%@L4"?7KRoJCJX;%@Q\9pWI!(d7MO0!IQ]-g#N/![XMPuJgQ]-g#N/"9qOI(o`
-W/QItN/FQmL7+6hQ]-g#N/!+0E-Gi#G@Y)o>Zu>^@&TNZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7d%m-ilnkKD)oQ]-fgKRoJCJX;%@Q\9pVKRoJCJX;%@
-Q\9pWI!(0kH^K2'L4"?8I!(0kH^BD:Q\9pGKS5_?FdIc4Q\9pVKRp%SI"uf_BMV34>[#(b`RrDX
-`k8m]N/![XMO0!IQ]-fgKRp(\L6mjVQ]-g#N/![XMPuJgQ]-fgN/FQmL6mjVW/QJ0N/![XMPuJg
-W0EC3PEVr(L6mjVQ\9p&>Ztf:8SCmkR?Nj7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH4eCMgec-+>U`5T^=bg")F`Pfa7
-f>PA@`Pnd?OI(WOQ\9pVKRoJCJX;%@Q]-g"KRB,FMO09ZQ\9pVKRoJKMPl,TQ\9pVN/EsTJX;%@
-Q\9pVKRp%SI$]eLQ]-g#N/![XMO0!IQ\9pVKRoJCJX;%@Q\9pVKRp%SI$]M;Q\9pgP`YqFs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp`>hTO-fbKS5L`Pod7`Oidr]=bhq`PoI%]t:qj
-]=bhh]Y1\ZZtN6,BMV3TFE!S*MO09ZVhBGaN/EsTJX;%@Q]-fgKRoJCJX;%@Q\9pfKRB,FMO09Z
-W/QItN/FQmL6mjVW/QItN/FQmL8^>uW0EC3PEVr0OJnD*W0ECBP`Vi4Q)Kq/W1'!MP`Vi4Q+<?J
-W1'!MR['h?Q)L.:W1'!^RZsb>Q)L.:W1'!MR['h9OQP?Rs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s6T@Mkj7crjQG4OhTO-f`5T^-]Y1\Z['[3IX/rG1['[3I['[3I['[39V5.a/>%_)D
-BMV34>ZuDW<+fH>W/QJ0P`Vi.OJnD*W0ECBP`WGEPc0h.W1'!MP`WGEPc1%9W0ECBR['h9OJnV5
-\XJb]R['h9OL^gEW0ECBR[)glkPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp#tc2
-i8j(SgtpK/f$`(!bKS53XK>uCAQ;/b<CK2R76spB5ug?><CK2R76spB5ug?><CK2R76u-.@$l=a
-L4"?&I!_6.FbY9jR!a%DI!(d/JXM^ci8j(Sgtp5uc,@T?]=bha['ZX*Unji_Unsl_V50o`Uj$p&
-=A27c76tT_8QA2FBMV3"76tT_8QA2FBMV35:J#2(>*jnnR!a%DI!(d/JVJQ!Q\9pWI!(6uKU7@C
-R!a%CKRoJCJX;%@Q\9pVKRoJCJX;%@Q]-fgKRoJKMTa5gi8j(Sgtp5uc,@T?]=bha['ZX*Un"$H
-S=Z7@St)=BS=,S)B3\V?76spB5ug?><CK2R76spB5ug?><CK2R76spB5ug?><CK2s;G)^dE0u#q
-LNIL&I!(0kH\Z]^L4"?8I!(0kH^K2'R!a%2I!^TqH\QopR!a%4KS5_?FdIc4R!a%CN/HcQh#IES
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
-k1naHI!^'J@!?-hG@Y**A70Ul?tW_JG@Y*,>?#fW@!?-hG@Y*,>?#fW@!?-hG@Y**A70Ul@!?-h
-G@Y**A70Ul@!?-hG@Y**A70Ul?t`>-=A27f9Lr8Z86APV=A27c76spB6!-fO<CK2R76spB6!-fO
-<CK2R76spB6$IEm]=biWs8W-!s8W-!s8W-!s8W-!s5;u$W1&uqA7110B6S3.GAV,>A7110B6S3.
-G@Y**D/4?4CPQb>GAV,ND.e'0CPR"NLM^[ZFE!"WE//OSLNIKjFE!"WE//OSLNIKjFE!"WE-HDG
-LNIKZD/4?+?t`>-=A27f9Lrhm8Q\YW=A27f9Lr8Z86APV=A28m[']l5s8W-!s8W-!s8W-!s7H$\
-kj7crjQGI^kL.l2bKS4cI!^WcB6RloLM^[ZD.e'0CPQb>LM^[JD/4oKE//:CLNIKjD.eWGE/&ae
-LNIKiI!_6.FbY9jL4"?(KS5\FJX;%@Q\9pGKS5_?Fbb'XB3\VaA70%T>'FLbB3\VQ>ZtcF>%_)D
-H!=6\>ZtcF>*k2*`5T^qs8W-!s8W-!s8W-!s8W-!s7H$\m.9ni]XjGgMMQq=R!a%4KS5\FJVJQ!
-Q\9pEI!_35JX;%@Q\9pVKRoJCJX;=QQ]-fgN/FQmL6mjVQ]-g#N/![XMOBZlW/QItN/FQmL6mjV
-G@Y)o>Zu>^?tW_JG@Y+RpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,_m-j0)n)iE\daZjHP`V5jMO0!IQ\9pVKRoJCJX;=QQ\9pVKRoJKMO0!ILkLGKI!(6uKSFl$
-R!a%2I!_6.FdIc4Q\9pGKS5_?FdIc4L4">]:J"Mb<Of02bKS5Sbg")F`ON%MQ\9pgN/![PJZ+N^
-Q]-fgN/FQmL6mjVW/QJ!PEVr(L6mjVW/QItN/FQmL6mjVW/QJ!PEV>lMPuJgQ]-fgN/Es\MMH:m
-BMV3!<)mU-8\;XKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\o_/+=jQG4OhU9p)bKS5Sbg"eabJ_B=`5T^=bg")F`Pfa7\?2ctKRoJCJX;=Q
-Q\9pVKRoJCJX;=QQ\9pVKRp(\L6mREQ\9pVKRoJCJXCh-Q\9pVKRoM<FdIc4Q\9pVKRoJCJV\u4
-R!a%CKRoJCJXCh-LkLGKI!(d/JX;%@Q\9pVKRoJCJ_82is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA*q=n)iE\g"bH4eCMgec,@T?`5T^6`Pod7`Oidr`k8mp]Y28&`OidrS=Z6Q9Lrhm8Q\YW
-LNIL5KRB,FMO0!IW/QItN/FNdI$]M;R!a%CKRoJCJX;=QQ]-g#N/"9iL7+6hW/QJ!PEVr(L7+6h
-W/QJ!PEVr0OJnD*W1'!MR['h?Q)L.:W1'!MR['h?Q+<?JW1'!MR['h9OL^gEW1'!^RZsb>Q)L.:
-W1'!MR['h9OL^gEW1'!MR[*$jh#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#+oo
-g"bH-bg">Tc+CX%]=bha['[3I['[3I['[3@XKAk:['[3IL4">]:J#2(>%_)DB3\VQ>Zuo)E2]"_
-W0ECBP`Vi.OJnV5W1'!MP`Vi4Q)Kq/W0ECBP`Vi.OJnD*\XJb]P`Vi4Q)Kq/W1'!MP`Vi.OJnD*
-W0ECleCO["s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp$D;Ci8j(ZjQG4OhU9p)bKS53XK?5RDHKS'
-<CK2R76spB5ug?><CK2R76sC+4B4g9<CK2R76tT_8V_.qR!a%2I!_6.FbY9jL4"?&I!^TqH\Qop
-L4"?&I!`fN`S'&'daZjd`PoI%]sP/RUnsl_V50o`Unji_UnslBFDt5K6!-fO<CK2R76spB5ug?>
-<CK2e:J"PT6!-fOB3\W,KRoJCJVJQ!R!a%2I!_35JVJQ!R!a%2I!_6.Fbk^(R!a%4KS5\FJX;%@
-Q\9pVN/EsTJX;=QQ]-gFbg#),kLnYIdaZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7LR[%Mj>#e!W
-<CK2R76spB5ug?>HoaAi76spB5ug?><CK2R76spB6"aG+L4"?'FE!"WE//OSL4"?'FE!"WE/&ae
-LNIKiI!^WjE/&aeR!a%2I!_6.FbY9jQ\9pVKRoJCJX;=Qg"bHas8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkI@XoG@Y**A70%T>'X=O
-B3\VaA70[e<+BHMG@Y)o>Zu>^?t3_YG@Y**A70Ul@!?-hG@Y**A70Ul@!?-hG@Y**A70Ul@!?-h
-G@Y**A70%T>$+Hh<CK2R76spB5ug?><CK2R76t$L86&)E<CK2R76spB6!-fO779RE76spB6"j%c
-R?NiXbg#MGp#tc2['[2qFDuG7@!?I'G@Y**D/4?+@!?I'G@Y**A70UuCNjW2LM^[JD/4oDB6SH>
-LNIKjFDuGGFGFsWGB@q^FE!"WE/&aeLNIKZFEE:[E-HDGLNIKjD.e'7FGFsWG@Y)`9Lr8Z86APV
-=A28!:J"Y^88(dj=A28!:J"Y^8@uOJs8W-!s8W-!s8W-!s8W,kpA+@Sq<726k1nbFgtpK/f!qi^
-LM^[JD/4oDB6S3.LM^[JD/4oDB6S3.LM^[JD/4oKE-HDGLM^[ZFE!"WE/&aeLNIKiI!_6.FdRQ!
-LkLGKI!(d/JX;%@Q\9pVKRnr4KSODWB3\Vc>?#6?>'X=OB3\VaA70%T>'X=OB3\VQ>ZtcF>'FLb
-LkLGkXfB=Y`S'&'daZjd`Pnd7L5:M9L4"?8I!(0kH^BD:L4"?7KRoJCJX;%@LkLGKI!(6uKU7@C
-Q]-fgN/FQmL6mjVQ]-g#P`V5jMO09ZW/QItN/Es\MO09ZW/QIcI!^'J?tW_JG@Y)o>["MA[/^1+
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2i8j(Sgtnj'Uo96,
-Q]-fgN/EsTJX;=QQ\9pVKRoJKMO0!IQ\9pVKRoJCJV\u4R!a%2I!^TqH^BD:LkLGJKRoJCJX;%@
-LkLG9I!]L2>%g]'Q\9q<eCMgec-+>UbKS5Sbg!)TQ'[/TQ]-fgKRoJKMPuJgQ]-fgN/FQmL6mjV
-W0EC3PEV>lMPuc$R?Ni5N/!aaPF%5cW/QItN/Es\MO09ZQ\9pVKRn>aCM6L8=A27b<)r)9h#IES
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
-i8j(SgtpK/f#u:^`5T^=bg")F`Pfa7bKS5L`Pod7`Ku7/Q\9pWI!(d/JX;=QQ\9pVKRoJCJX;%@
-Q\9pVKRoJCJV\u4L4"?8I!(0kH\QopL4"?8I!(6uKU@.0LkLGKI!(0kH\QopL4"?&I!_6.FbY9j
-L4"?&I!_35JV\u4Q\9qis8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hV$]@
-daZjkbg")F`Pfa7]=bhh]Y1qi]t:qj`k8mp]Y0&IHWWs4=A27f9Lsq\E0lN@Q\9pgN/![XMO0!I
-Q\9pVKRoJCJX;%@Q]-g#N/![XMPuJgR?Ni5N/!aaPGjFpR?Ni5P`V;sPGj_-W0EC3PEVr0OJnV5
-W0ECBR['h?Q)L.:W1'!MR['h9OJnV5W1'!MR['h?Q)Kq/W1'!MP`Vi4Q)L.:W1'!MR['h?Q)Kq/
-W1'"0jQHRCs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkL.l2bKS5L`PoI%]sP/R
-['[3I['[3I['[3I['[3I['ZX*Uh<q9B3\VR:J#2(>%g]'B3\W=P`Vi.OJnD*W0ECBP`Vi4Q)L.:
-W1'!MP`Vi4Q)Kq/W0ECBR['h9OJnD*W0ECBR['h9OJnD*W0ECBP`Vi.OJnD*`k8nTpA+ags8W-!
-o_/+IoC_JAp#tc2i8j(ZjQG4OhU9p)['[3!Mi;:R>"(hJ=A27c76spB5ug?><CK2R76spB5ug?>
-<CK2R76spB6$Z[6L4"?&I!^TqH\QopLNIKiI!_6.FbY9jR!a%2I!_6.FbY9jUnsm?gtp5uc,@T?
-]=bha['ZX*Unji_Unsl_V50o`Uj$p&=A27f9Lr8Z86APV=A28!:J"PT5ug?><CK2e:J#2(>*s\[
-L4"?&I!_6.FbY9jL4"?8I!(0kH\d?.R!a%2I!^TqH^BD:LkLGJKRoJCJX;%@Q\9pVKRoJCJ]l9^
-i8j(LeCN'tf#5PH]=bha['ZX*Un"$HS=Z7@St)=BS=H1@B3\V04Zl_55t4""<CK2C4Zl_55ug?>
-<CK2R76spB5ug?><CK2s;G)[kH^K2'LNIKiI!^WjE//OSL4"?'FE!"WE/&aeLNIKjFDut^H\Qop
-Q\9pEI!_35JX;%@Q]-fgN/HcQh#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7ckgtm6sFE_8'B3\VaA70%T>'FLbB3\VQ>Zu>^?tW_J
-G@Y**A70Ul@!?-hB3\VaA70%T>'X=O@q9.pA70Ul@!?-hGAV,>A70UuCNjW2G@Y**A70%T>$+Hh
-=A27c76t$L86&)E<CK2R76spB5t+11<CK2B6q(*E5ug?>779RE76s@179E5SGAV,MI!^WjE-Gi#
-GAV,>A70UuCNj;sLM^[JD/4?4CNjW2G@Y*:D.e'0CNjW2GAV,>D/4oDB6SH>LNIKjFE!"WE-HDG
-LNIKjFDut^H\QopLNIKiI!^WjE-HDGLNIKjFDuG7?s$)n=A27f9Lrhm8Q\YW<)ck2:J"Y^85rPg
-BMV4,[']l5s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkMYFadaZjkbftliH\Z]^LNIKjD.e'7FGF^G
-GAV,NFDuG@CPR"NGB@q^FE!"WE//OSLNIKiI!^TqH^K2'LkLG;KS5_?Fbk^(N/NX]KRo)?N0f3K
-Q\9pVKRo)?N/)LoG@Y)kA7]CY>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%_)D@q9/+D.eTNH^BD:
-L4"?(KS5_?Fbk^(L4"?(KS5_?Fbk^(Q\9pGKS5\FJV\u4Q\9pVKRoJCJX;=QQ]-g#N/![XMO09Z
-Q]-fgN/Es\MPuJgQ]-fiPEV>dJTkX4G@Y)o>ZtcF>).3=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhRK\fQ\9pVN/FNdI$]eLQ]-fgKRoJKMO0!I
-Q]-fgKRoJKMO0!IQ\9pGKS5\FJVJQ!Q\9pGKS5\FJX;%@Q\9pGKS5_?Fa%A(=A280D/7>=c-+>U
-bKS5Sbg">Tc-+>U`5T]^KRoJCJX;=QQ\9pVN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09Z
-Q]-fgN/Es\MO09ZQ]-fgKRoJCJX;%@L4">\>Zt6'86APVB3\X?s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kLnYIdaZk#bfe2Rc,@T?
-bKS5L`Pod7`Pfa7`5T]kV5/inH^BD:LkLGJKRoJCJX;%@Q]-fgKRoJKMO0!IQ\9pEI!_35JVJQ!
-L4"?8I!(0kH\QopR!a%2I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!`lG])Vg1
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^`5T^6`PoI%]t:qj
-`5T^-]Y1qi]t:qjB3\VB9Lr8Z88(djL4"?7KRoJKMO09ZQ]-g#N/![XMO09ZQ]-fgN/EsTJX;=Q
-W/QItN/FQuOI(o`W0EC3PEVr0OI;;rW0ECBP`V;sPGj_-W1'!MP`Vi4Q)Kq/W1'!MP`Vi4Q)Kq/
-W1'!MR['h?Q)L.:W0ECBR['h?Q)L.:W1'!MR['h?Q)L.:W1'!MR['h?Q)L.:o_/+\s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(Sgtp5uc,@T?]=bhh]Y1\Z['[3IX/rG1['[3I[&^:1
-['[2pI!]L2>%_)DBMV34>ZtcF>).3=R?Ni&PEVr0OJnD*W1'!MR['h9OJnV5W0ECBR['h9OJnV5
-W0ECBR['h9OJnD*W1'!MP`Vi4Q'mi"W0EC1N/F$ePIR`pi8j(foC_JAp#tc2i8j(LeCM7E]pt[a
-H[C0C>[CE!5t+11<CK2U9Lr/P6!-fO<CK2U9Lr/P6!-fO<CK2R76t$L89nE=LNIKiI!^TqH\Qop
-L4"?'FDut^H\QopLNIKiI!^WjE/&aeLNIKiI!^[&KZhTadaZjd`PoI%]rS6:X/rG!V50o`Unji_
-UnslBFDt>U86&)E<CK2U9Lr/P6!-fO=A27f9Lr8Z86APVB3\W,KRnr4KU7@CL4"?7KRnl*H\d?.
-R!a%2I!^TqH^K2'LkLGJKRoJCJX;%@Q]-fgN/ERPN0f3KQ]-g?`PpcrkLnYIdaZjd`PoI%]sP/R
-Unsl_V50WQS=H1@S=Z7@St'Ii8Obj*7Qik676sC+4B4g9<CK2C4Zl1s4B4g9<CK2R76spB6"j%c
-L4"?&I!^TqH^AhiL4"?&I!^WjE//OSLNIKjFE!"WE/&aeLNIKiI!_6.Fbk^(Q\9pVKRoJCJX;=Q
-g"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+IoC_>6n)39i\?2cD>Zu>^?t3_YG@Y)o>Zu>^?t3_YG@Y)o>Zu>^?t3_YG@Y)kA7]sq?t3_Y
-G@Y)kA7]sq@!?-h@q9.pA7/nXATqZmC2@d3A7/nXATqZmG@Y**A70%T>$+Hh=A27S6q(*E5t+11
-<CK2R76spB5ug?><CK2R76t$L87u12G@Y*:FDuGGFGFsWGAV,>FEE:TB6S3.GAV,>D/4?+@!?I'
-LM^[JD/4?4CNjW2LM^[JD/4oKE-H/7GB@q^FDuGGFGFsWGB@q^FDuGGFGFsWH[C0rFDut^H\Z]^
-L4"?&I!^WjE-lq[GAV+t9Lrhm8Q8Yh=A28!:J"Mb<EMpcB3\VB9Lr,^<Q;\_s8W-!s8W-!s8W-!
-s8W-!s8V`bq<[_Gkj7ckgtp`>hU9p)['[2aD/4oKE-HDGLNIKjFDuGGFGF^GGB@q^FE!"WE//OS
-H[C0qI!^TqH\Z]^L4"?&I!^TqH^K2'LkLG;KS5_?FdIc4Q\9pVN/EsTJX;%@Q\9pVN/EsTJV\u4
-LNIKZD/4?+?tW_JG@Y)o>Zu>^@!?I'LNIKiI!_35JV\u4Q\9pEI!_35JV\u4L4"?&I!_6.FbY9j
-LkLG9I!^[&KU@.0LkLGJKRo)?N/3.?Q]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09Z
-LNIKJ>ZtcF>%_)DB3\WgeCO["s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-ilnkN:RT`k8mLN/Es\MO09ZQ\9pVN/EsTJX;=QQ\9pVN/EsTJX;%@LkLGJKRnr4KSY;7
-R!a%4KS5_?Fbk^(Q\9pGKS5\FJX;%@GAV+t9Lrhm8\;XKdaZjreCN'tf#u:^bKS5Sbg">Tc+'mU
-LkLGJKRoJCJX;%@Q]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/EsTJX;=Q
-LkLGJKRnr4KSOYg=A27c76t$L89]/ts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQG4OhU9p)bKS5Sbg")F`Pfa7bKS5L`Pp$Ec,RE-
-Q]-fXKS5\FJX;%@Q]-fgN/EsTJW,MGQ]-fgKRnr4KU7@CLkLG9I!^[&KSFl$L4"?(KS5)-H\d?.
-R!a%2I!^TqH\Z]^LNIKjFE!"WE/&aeLNIKiI!^TqH^K2's8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,coC_>6n(HLQg"bH-bg">Tc,@T?`k8mp]Y1qi]t:qj]=bhQV5.*[5ug?>
-=A28!:J$n3MO0!IQ]-fgKRoJKMO09ZQ]-fgN/EsTJX;=QQ]-fgN/Es\MOBZlQ]-g#P`V5jMPuc$
-Q]-g#P`V;sPF7VuW0EC3PEVr0OIVo4W0EC6St)aDOJnV5W0ECBR['h?Q)Kq/W1'!MR['h?Q)L.:
-W1'!MR['h?Q)Kq/W1'!MR['h?Q)L.:W1'!MP`V];V#UJps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,coC_&&kLnYIdaZjkbg")F`Oidr['[3I['[3I['[3IX/rG1['[3I[%sOoB3\VB9Lrf$>#\I$
-B3\VQ>[!JQMPuc$R?Ni5R['h9OJnV5W0ECBR[';)PGj_-R?Ni5R[';)PGjq8R?Ni5R['D7S>_[6
-R?Ni5P`V;sPGj_-Q]-fgN/FR&Q(4G9LkLG*FED86DHKS'=A27f9Lr8Z86&)E=A27c76spB5t+11
-<CK2R76s@179)cB<CK2U9Lrf$>'FLbL4"?&I!^[&KU@.0L4"?'FE!"WE/&aeLNIKjFDut^H\Z]^
-LNIKiI!^WjE/&aeQ\9pjXKBq#f#5PH]=bha['ZX*Unji_Unsl_V50o`Uj$p&=A27f9Lr8Z86&)E
-=A27c76spB5ug?>=A27c76tQk>*jnnL4"?7KRnr4KSFl$Q\9pEI!^[&KU7@CL4"?(KS5\FJW,MG
-Q\9pKMi=!]MO0!IQ\9pKMi=!UJ]l9^i8j(Sgtp5uc,@T?]=bha['ZX*Un"$HS=Z7@St)44PFS57
-<)cje4Zl1s4@VIr7Qik'4Zl1s4B4g97Qik676sC+4B4g9<CK2e:J$:gH\QopLNIKiI!^TqH\Z]^
-L4"?&I!^TqH\QopLNIKiI!^TqH\QopLkLG9I!_35JX;%@Q]-fgKRr(BkPtS^s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhKsTt
-G@Y**A7/nXATqZmB3\VaA70%T>'FLb@q9.r>?#*CAS57OG@Y)o>ZtcF>'FLbB3\VaA7/nXATqZm
-@q9.pA7/nXATqZmG@Y**A7/nXATr!,B3\VaA70%T>%_)DB3\VR:J"Mb<G50"<)ck">[D&J>'FLb
-GAV,>FED_KFG>0iLNIKZFEE:[E//:CGAV,>D/4?4CNjW2GAV,NFDuG@CNjlBLM^[JD/4?4CNjW2
-GAV,>D/4?4CNjW2LNIKZFED_KFGFsWH[C0rFDuGGFG>0iL4"?&I!^TqH\QopL4"?&I!^'SCM6L8
-<)ck2:J"Mb<G50"<)ck2:J"Mb<G50"<)cl0]Y4@Fs8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,
-g"bH4eCN9rbEn0FGAV,NFDuGGFGFsWGB@q^FDuGGFGFsWGB@q]I!^TqH\QopL4"?(KS5)-H\d?.
-R!a%4KS5/7KU@.0LkLG?Mi=!UJW,MGQ\9pKMi<IFKT(hJQ\9pVKRnr4KU7@CLkLGJKRnr4KSY;7
-Q\9pEI!^TqH\d?.R!a%4KS5)-H^BD:LkLG;KS5\FJV\u4L4"?&I!^TqH\QopL4"?(KS5/7KSY;7
-LkLGJKRnr4KU7@CQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgKRmWDAS57OB3\VQ>["(pQ2gma
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,g"bH-bfuQ>PF%5c
-Q\9pVN/Es\MO0!IQ]-fgN/EsTJX;%@Q]-fgKRoJKMO0!IQ\9pGKS5\FJV\u4Q\9pGKS5\FJVJQ!
-LkLG9I!]O&8Q\YWS=Z8(gtp`>hU9p)daZk#bfe2Rc-+>UbKS5L`PndEQ&(*HLkLG;KS5\FJX;=Q
-Q\9pVN/Es\MO09ZQ]-fgN/Es\MO0!IQ]-fgKRoJKMMQq=Q]-fgKRnr4KU7@CLkLG9I!^'SCKO8$
-<CK2R77!H8SH&Whs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V<Ln)39ig"bH4eCN9rbJ_B=fZ_OW`Pod7`Pfa7`5T^6`PnXLUmHacQ]-fgN/Es\MO09Z
-Q]-fgN/Es\MO09ZQ]-fgKRnl*H^BD:L4"?7KRnl*H\QopL4"?&I!^TqH\QopL4">pH[UZkE-lq[
-GB@q^FDuGGFGFsWLNILFXfDF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
-kj7crjQFt@f$`(!bKS5L`PoI%]t:qj`5T^-]Y2=t\ql#m<CK2B6q(*E6"=G:L4"?(KS5\FJX;%@
-Q]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/FQuOI;;rR?Ni&PEVDuPF%5cW0EC3PEVr0OI;;r
-Q]-fiPEVN.S>_[6W0EC6St)aDOIVo4W1'!>PEVr6Q'mi"W1'!>PEVr6Q'mi"W1'!MR[';)PGjq8
-W1'!>PEVr6Q)L.:W0ECRXfDF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQG4OhTO-f
-`5T^-]Y1\Z['[3IX/rG1['[3I['[3I['[3@XK@G>N+c!Y<)ck2:J"Y^87u12LNIL%N/Es\MOBZl
-R?Ni&PEVDuPF7VuR?Ni&PEVDuPF7VuW0EC3PEVr6Q'mi"W0EC6St)aJQ)Kq/R?Ni&PEVDuPF%5c
-R?Ni$N/Es\MM?M*G@Y)o>Zt6'86APV=A27f9Lr8Z86APV=A27f9Lr8Z86&)EB3\VQ>Zu>gCPR"N
-L4"?&I!^[&KSFl$L4"?&I!^TqH\QopL4"?'FDut^H\Z]^L4"?'FDut^H\Z]^L4"?&I!^[&KT(hJ
-bKS5L`PoI%]sP/RX/rG!V50o`Unji_Unsl2FECVY86&)E=A27f9Lr8Z86APV=A27c76t$L86APV
-B3\W,KRnr4KSFl$Q\9pVKRnr4KU7@CQ\9pGKS5\FJV\u4N/NX]KRoJKMO09ZQ]-fgN/EsTJW,MG
-LkLH"`PpcrkLnYIdaZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7LR[%Mj>"1Y;7Qik'4Zl1s4@VIr
-7Qik'4Zl1s4@VIr7Qik'4Zl1s4B,9[LNIKZFEE:[E-HDGLNIKjFDut^H\Z]^LNIKjFDut^H\Qop
-L4"?(KS5_?FbY9jLkLG;KS5/7KU7XTg"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(.['X=RATqZm@q9.pA7/nXAS57O
-B3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%;)SG@Y)o>Zu>^?tW_JG@Y)kA7]CY>%;)S
-G@Y)o>Zu>gCM-mUGAV,.>Zu>^?tsLqG@Y)rCi4H-@!?I'GAV,>D/4?;FGFsWGB@q^FDuSRI>3,r
-GB@qNFED_KFGF^GGB@qND/4oKE-HDGGB@q^FDuG@CNjW2GAV,>D/4?4CPR"NGAV,>FED_DCPR"N
-GB@qNFED_KFGFsWL4"?&I!^'ZFG>0iL4"?&I!^WjE/&aeGAV+p<)mU-8Q]5(BMV3!<)mU-8Q]5(
-BMV3!<)mU-8\;XKs8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQGI^kLnYIdaZj[]Y0)BE-HDG
-LNIKZFEE:[E-HDGLNIKZFEE7bH\Z]^H[C0qI!^TqH\QopR!a%4KS5/7KSY;7R!a%4KS5/7KU7@C
-LkLGJKRo)?N0f3KLkLGJKRnr4KSY;7LkLGJKRnr4KSY;7LkLG;KS5)-H\d?.L4"?(KS5)-H\d?.
-Q\9pGKS5)-H\d?.L4"?&I!^TqH\QopL4"?&I!^TqH^BD:LkLGJKRnr4KSY;7Q\9pVN/Es\MO09Z
-Q]-fgN/Es\MO09ZQ]-fgN/Es\MK`oQB3\VQ>ZtcF>'kUEs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(ZjQFt@eu4gpQ]-fgKRoJCJX;=QQ]-fgN/Es\MO09Z
-Q\9pKMi=!UJW,MGQ\9pGKS5\FJV\u4Q\9pGKS5\FJV\u4LkLG9I!^TqHY6Se=A284H[Xi5kMYFa
-g"bH;gtpK/f$`(!bKS5Sbg">Tc-+>U`5T]^N/EFEKSY;7Q\9pKMi=!]MO09ZQ]-fgN/Es\MO09Z
-Q]-fgN/EFEKU7@CN/NX]KRoJKMMQq=LkLG;KS5/7KSFl$L4">\>Zt6'84>p8<CK3l`PqlWs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hV$]@
-daZjkbg")F`Pfa7fZ_OW`Pp$Ec,@T?`k8mLN/EFEKU7XTQ]-f\Mi=!]MO09ZQ]-fgN/ERPN/3.?
-LkLG9I!^TqH\QopL4"?&I!^TqH\Z]^H[C0qI!^WjE/&aeGB@q^FDuGGFGFsWGB@q^FDuGGFT;C@
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCMRW`Pfa7
-`5T^-]Y1qi]u7n/]=bgeA7\4n4B4g9<CK2tD/4r\KSFl$Q\9pGKS5\FJX;%@Q]-fgN/Es\MPuJg
-Q]-fgN/Es\MPuJgR?Ni$N/FQmL7+6hW0EC3PEVr0OI;;rR?Ni&PEVr0OI;;rW0EC3PEVN.S>_[6
-R?Ni5P`V;sPGjq8S=Z7LR['h?Q'mi"W1'!MR[';)PGjq8W1'!>PEVr6Q'mi"W1'!>PEVr6Q(4G9
-`5T^qs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#+oog"bH4eCMgec,@T?]=bha['[3I['[3I
-X/rG1['[3I['[3IX/rF<Ci3o^8Q]5(BMV3!<)mR9>)7ibR?Ni$N/Es\MOBZlW0EC3PEVDuPGj_-
-R?Ni&PEVDuPF7VuR?Ni5R[';)PGjq8R?Ni&PEVDuPGj_-Q]-fiPEV>lMOBZlQ]-fgN/Es\MO09Z
-LkLG9I!^'SCMI['@q9.pA70.gDKfr5GB@q]I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!^TqH\Qop
-L4"?'FDut^H\Z]^GB@q^FDuGGFG>0iGB@q]I!^TqH\d?.L4"?7KRpM;[)Br&]=bha['ZX*Unji_
-Unsl_V50o`Uj$p&=A27f9Lr8Z86APV8k_r]9Lr8Z86APV=A27c76tQk>)7ibL4"?7KRnr4KU7@C
-Q]-f\Mi<IFKU7@CLkLGJKRoJCJW,MGQ]-fgN/Es\MN!IPN/NXNKS5/7KZ(jKi8j(SgtpK/f#5PH
-]=bha['ZX*Un"$HS=Z7@St)=BS=H1@<)cje4Zl1s4B4g97Qik'4Zl1s4@VIr7Qik'4Zl1s4@VIr
-7QikI:J#bPFGFsWGB@q^FDuGGFE_hKLNIKZFEE7bH\QopH[C0qI!^TqH\QopLkLG9I!_35JV\u4
-LkLGJKRqh3hZ*WUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+Em-j0)n)39iN/NX=A7/nXAS57OB3\VQ>ZtWJAS57OB3\VQ>ZtcF>%;)S
-B3\VQ>ZtcF>%;)SG@Y)kA7]CY>%_)D@q9.\A7]CY>%_)DB3\VQ>ZtcF>%;)SB3\VMA7]7]ATqZm
-@q9.pA7/nXATqZmC2@d3A70UuCNjW2GAV,>FED_KFF/@_LNIK^H[UZkE-HDGLNIKZFED_KFE_hK
-GB@qND/4?4CNjlBGAV,>D/4?4CNjlBGAV,>D/4?;FE_hKGAV,>FED_DCNjW2LNIKZFED_KFGFsW
-L4"?&I!^TqH\QopL4">pH[U*TCM6L8<)cjs<)mU-8Q8Yh<)ck2:J"Yn?>*,+<)cl0]Y4@Fs8W-!
-s8W-!s8W-!s8W-!s8W-!s8VHWp%Rh9i8j(Sgtp`>hU9p)Unsl2D/4?;FE_hKLNIKZD/4?;FG>0i
-LNIK^H[UWrH\Z]^L4"?&I!^TqH\QopL4"?&I!^[&KSY;7LkLG;KS5\FJV\u4LkLG;KS5/7KSY;7
-LkLG;KS5/7KSY;7LkLG;KS5\FJVJQ!LkLG;KS5\FJVJQ!LkLG;KS5)-H\d?.L4"?(KS5)-H\Qop
-L4"?&I!^TqH\QopL4"?&I!^TqH\d?.R!a%4KS5/7KT(hJLkLGJN/ERPN0f3KQ]-fgN/EsTJX;=Q
-LNIKJ>ZtcF>%_)D@q907m-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-kj7d%m-j0)n']_:UnslRN/Es\MN!IPQ\9pVN/Es\MO0!IQ]-fgKRo)?N0fK\Q\9pGKS5\NMMQq=
-Q\9pGKS5\FJV\u4LkLGJKRnl*H\QopGAV+t9Lrf$>1q]fkj7d%m-ilnkN:RTg"bH4eCMgec.L7`
-bKS5Sbg">Tc*XjbQ\9pGKS5/7KU7XTQ]-fgN/Es\MO09ZQ]-fgN/Es\MO0!IN/NX]N/EFEKT(hJ
-Q\9pGKS5/7KU@.0LkLG9I!^TqHZsRRB3\VB9Lr/P5u^f`kj7d<s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5Sbg")F`Pfa7
-`5T^6`Pod7`MB?+Q\9pKMi=!]MO09ZN/NX]N/ERPN/W[RQ\9pGKS5)-H\QopL4"?&I!^TqHZsRR
-L4">pH[UZkE/&aeGB@q^FDuGGFE_hKGB@qNFEE:[E-HDGS=Z8Ns8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7d%m-iW_hU9p)bKS5L`Poj0]#;S,`5T^6`Po3kZrKO\
-7Qik'4Zl_56&'c6L4"?(KS5/7KU7@CN/NX]KRoJKMO09ZQ]-fgN/Es\MOBZlQ]-fiPEV>lMOBZl
-R?Ni5R[';)PGjq8R?Ni&PEVr0OI;;rR?Ni&PEVDuPGjq8R?Ni5R[';)PFS57W1'!>PEVr6Q'mi"
-R?Ni5R[';)PGj_-R?Ni&PEVDuPGjq8R?Ni5R[';)PGjq8R?Ni&PEVr0OQc'"s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o:oC_&&kL.l2bKS5L`PoI%]sP/R['[3I['[3I['[3I['[3@XKB"7WgoZN
-B3\V><)lms<G50"<)ckAD/5JsMPuc$Q]-fiPEVDuPF7VuR?Ni&PEVDuPF7VuR?Ni&PEVDuPF7Vu
-R?Ni&PEVr0OI;;rR?Ni$N/F$ePF%5cQ]-fgN/Es\MO09ZN/NXRMi=!]MN!IPQ\9pGKS5\FJV\u4
-LkLGJKRnr4KSY;7L4"?(KS5)-H\QopL4"?&I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!^TqHZsRR
-GB@q]I!^TqH\QopL4"?&I!^[&KT(hJS=Z7h`PoI%]sP/RUnsl_V50o`Unji_Unsl2FECVY86APV
-8k_r]9Lr8Z86APV=A27S6q(3O86APVB3\W,KRnr4KU7@CLkLG;KS5/7KSY;7Q\9pGKS5/7KSY;7
-N/NX]N/Es\MN!IPQ]-fgN/Es\MMQq=LkLH"`PpcrkLnYIdaZjd`PoI%]sP/RUnsl_V50WQS=H1@
-S=Z7@St'Ii8Obj*7Qik'4Zl1s4@VIr7Qik'4Zl1s4@VIr7Qik'4Zl_55u^f`LNIKZFED_DCNjlB
-GB@q^FDuGGFE_hKGB@qRH[UZkE/&aeL4"?&I!^TqH\d?.L4"?(KS5/7KSY;7g"bHas8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-kj7crjQF_1c!t9qB3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtWJAS57OB3\VQ>ZtcF>%_)D
-B3\VMA7]sq?tW_JB3\VMA7]sq?tW_J@q9.pA70%T>'FLbB3\VTCi3`nATr!,G@Y)rCi4H6CMI['
-GAV,>D/4?;FE_hKLNIKZFED_KFGFsWGB@qNFED_KFE_hKLNIKZD/4?;FE_S;GB@qND/4?4CNjW2
-GB@qND/4?4CNjlBGAV,NFDuGGFE_S;GAV,>FED_DCNjlBGB@qNFEE7bHZsRRL4"?&I!^TqH\Qop
-GAV+p<)mU-8S;:3<)ck1>Ztf:8Q]5(=A27f>[D)>8\;XKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,coC_>6n)39ig"bH4eCN9rbD:h)GB@qND/4?;FE_hKLNIKZFED_KFG>0iGB@q]I!^3eI>;o`
-L4"?&I!^TqH\QopL4"?(KS5)-H\d?.LkLG;KS5/7KSY;7L4"?(KS5)-H^BD:L4"?(KS5)-H\d?.
-LkLG;KS5)-H\d?.L4"?&I!^TqH\QopL4"?&I!^[&KSFl$L4"?(KS5/7KSFl$L4"?&I!^[&KSFl$
-LkLG;KS5)-H\d?.LkLGJKRoJKMMQq=Q]-f\Mi<UQN0fK\N/NXLI!]L2>%_)DB3\VQ>[#S*f)PdM
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bGoXf@_HMO09Z
-Q]-fgN/Es\MO09ZQ]-fgN/ERPN0fK\Q\9pKMi<UQN0f3KN/NX]N/ERPN0f3KN/NX]KRnr4KSFl$
-LkLG:FDt>U85rPg]=biLpA*q=n*'-,kj7crjQG4OhV$]@daZjreCMgec-+>UbKS5Sbfur[Ukj\W
-LkLG;KS5\NMN!IPQ]-fgN/Es\MO09ZN/NX]N/ERPN0f3KN/NXNKS5/7KSY;7LkLG;KS5)-H\d?.
-L4"?&I!^'ZFBD4-=A27c76tEoAcMf1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjreCMgec,@T?`5T^=bg")F`Pfa7`5T^-]Y0,SKT(hJ
-Q]-f\Mi=!]MN!IPQ]-fXKS5/7KSY;7LkLG9I!^TqH[C*fL4"?&I!^TqHZsRRH[C0bFEE:[E-HDG
-GB@q^FDuG@CNjlBGB@q^FE$I1n,NFfs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VHWp#tc2g"bH;gtp5uc,@T?`5T^6`Pp$Ec-+>US=Z6?4Zl1s4@VIrBMV3HH[UZkE/&ae
-LkLG;KS5/7KU7@CN/NX]N/Es\MO09ZR?Ni5P`V];UoUT!\?2d<['[3I[(Eua]=bhh]Y1\Z['[3I
-X/rG!V51&SOJnV5R?Ni)St)44PFS57R?Ni5R[';)PF7VuR?Ni5R[';)PF7VuR?Ni&PEVDuPGj_-
-R?Ni&PEVDuPF7VuR?Ni&PEVDuPF7VuR?Ni5R[*pQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
-i8j(SgtpK/f#u:^`5T^-]Y1\Z['[3I['[3@XKAk:['[3IX/rG1['YXBKNLo==A27b<)mU-8Q]5(
-LkLGJN/F$ePF7VuR?Ni$N/F$ePF%5cR?Ni$N/F$ePF7VuR?Ni&PEVDuPF7VuQ]-fiPEVDuPF%5c
-Q]-fgN/ERPN0fK\N/NXRMi=!]MMQq=Q]-fXKS5;BN/3.?LkLG;KS5)-H\d?.L4"?&I!^[&KSY;7
-L4"?&I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!^3eI>;o`H[C0rFDut^HZsRRL4"?&I!^TqH\d?.
-LkLGJKRo)?N3ot!]=bha['Zm8Xe_ehUnsl_V50o`Uj$p&=A27X9MJV_86&)E=A27f9Lr8Z86APV
-=A27f9Lrf$>)7ibLkLG9I!^[&KSY;7Q\9pGKS5\FJW,MGQ\9pKMi=!UJW,MGQ]-fgN/Es\MN!IP
-Q\9pKMi<IFKZ(jKi8j(Sgtp5uc,@T?]=bha['ZX*Un"$HS=Z7@St)aJQ(4G9<)cje4Zl1s4@VIr
-7Qik'4Zl1s4@VIr7Qik'4Zl_55t4""7QikI:J#bPFE_hKGB@qND/4?;FE_S;GB@qNFED_KFGFsW
-GB@qRH[UZkE/&aeL4"?&I!^TqH\QopLkLG;KS8%6hZ*WUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq;C>si8j'sV5.a/>%_)D
-B3\VB>[D&J>$,$9B3\VB>[D&J>%_)D@q9.`>ZtcF>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtWJAS57O
-@q9.`>ZtcF>%_)DB3\VMA7]7]AS57OG@Y)kA7]t%CL^mdGAV,>A70.gDKfr5GAV,>FED_KFGFsW
-GB@qRH[UWrHZsRRLNIKZFED_KFGFsWGB@qNFED_DCNjW2C2@d3D/4?4CNjlBGB@qND/4?;FE_hK
-GAV,>FED_KFE_S;GAV,>FED_KFGFsWGB@q]I!^TqH\QopL4"?&I!^'SCK+85B3\V><)m$o85rPg
-<)ck2:J"Mb<EMpc<)cl0]Y4@Fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG[\gtCK>
-daZjd`PmUSE-H/7GAV,>FEE:[E-HDGL4"?&I!^TqH\Z]^H[C0qI!^3eI>3,rH[C0qI!^TqH\d?.
-L4"?(KS5)-H\d?.L4"?&I!^[&KSY;7LkLG;KS5/7KSY;7Q\9pGKS5)-H\d?.L4"?(KS5)-H\Qop
-L4"?&I!^3eI>3,rL4"?&I!^TqH\QopL4"?(KS5/7KSFl$L4"?&I!^TqH\QopL4"?&I!^[&KSY;7
-LkLG?Mi=!UJV\u4Q]-fXKS5;BN-Af?=Bo0F>ZtcF>11pOs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp&`\sJA5Q]-fgN/Es\MO09ZN/NX]N/ERPN0fK\
-N/NXNKS5\NMMQq=Q]-fXKS5/7KT(hJQ\9pGKS5/7KSY;7LkLG;KS5)-HY6Se<)ckaN/IZ8s8W-!
-s8W,kpA*q=n*'-,i8j(SgtpK/f$`(!bKS5Sbg">Tc-+>U`5T]^N/EFEKU7@CLkLG?Mi=!]MOBZl
-N/NX]N/EFEKU7XTLkLG?Mi=!]MO0!ILkLGJKRnr4KSFl$LkLG9I!^TqH\QopL4">lD/36I86&)E
-779S!I!bnns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-kj7crjQG4OhU9p)bKS5Sbg")F`Pfa7bKS5L`Pod7`Pfa7S=Z7,KS5;BN1#lnQ]-fgN/EFEKU7XT
-LkLG;KS5)-H\QopL4"?(KS5/7KSFl$H[C0qI!^TqHZsRRGB@qNFED_KFE_S;GB@qND/4?;FIA>V
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYI
-daZjreCN'tf#u:^daZjreCKA%HU^.\7Qik'4Zm4bATr6<L4"?&I!^TqH\d?.LkLG;KS5\NMOBZl
-X/rG8]Y28&`QQKM`5T^6`Pod7`Oidr`5T^-]Y1\Z[(Eua['[3P]Y1\Z[(Eua['[3@XK@nSPF7Vu
-W0EC3PEVr6Q'mi"R?Ni&PEVDuPF7VuQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/Es\MOBZl
-R?Ni&PEVDuPF7Vu`5T^qs8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp#+oodaZjkbg")F`Oidr
-]=bha['[3I[&^:1['[3I['Zm8XgGIBX/rFIFECVY86APV<)ck"9Lrf$>*k2*Q]-fgN/F$ePF7Vu
-R?Ni&PEVDuPF7VuR?Ni&PEV>lMOBZlQ]-fgN/F$ePF7VuQ]-f\Mi=!]MN!IPN/NXRMi=!]MN!IP
-N/NX]N/ERPN0fK\N/NX]KRnr4KSY;7LkLG;KS5)-H\QopL4"?(KS5)-H[C*fL4">pH[UWrH\Qop
-L4"?&I!^TqH\QopL4"?&I!^'ZFE_hKH[C0qI!^3eI>3,rL4"?&I!^[&KSY;7N/NXjV51`9]sP/R
-Unsl_V50o`Unji_Unsl2FECVY86APV=A27X9MJV_84lQM=A27X9MJV_86APVB3\VrKS5)-H\d?.
-Q\9pEI!^[&KT(hJN/NXRMi=!UJW,MGN/NX]N/Es\MN!IPQ]-f\Mi<UQN/3.?LkLH"`PpcrkLnYI
-daZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7@St&nV84Ga)7Qijk1c.Zb4@VIr7Qik'4Zl1s4@VIr
-2)I-Z4Zl1s4B,9[GB@qND/4?;FE_S;GAV,>FED_DCNjW2GAV,>FED_DCNjlBGAV,>FED_KFE_hK
-L4"?&I!^TqH\d?.g"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-j0)n(HLQLkLF\<)mR9>#\I$B3\VQ>Zt*+<G,Q?
-B3\VQ>ZtcF>$,$9=Bo0F>Zt*+<G,Q?=Bo0F>ZtcF>%_)DB3\VQ>ZtWJATqZm@q9.`>ZtWJATqZm
-@q9.pA70.gDI[3gG@Y)kA7]t%CL^mdGAV,1Ci4H6CNjW2GB@qNFED_KFG>0iGB@qNFEE7bHZsRR
-GB@qNFED_KFE_hKGAV,>FED_DCNjW2C2@d3D/4?;FE_hKLNIKZFEE:[E-HDGGAV,>FED_DCPR"N
-GB@q]I!^TqH[C*fL4"?&I!^3eI>3,rGAV+p<)m$o88(dj=Bo079Lr,^<E)pt<)ck"9Lr,^<P,oW
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp`>hU9p)['[2aD/4?4CNjlB
-GB@q]I!^'ZFF/@_H[C0qI!^3eI>;o`H[C0bFEE7bHZsRRL4"?&I!^TqH\QopL4"?&I!^[&KSFl$
-L4"?&I!^[&KSFl$LkLG;KS5)-H\d?.L4"?&I!^3eI<TdTL4">pH[U*[FF/@_GB@q]I!^3eI=$<h
-L4">pH[UWrH\QopLkLG.H[U^'KR8&oLkLG;KS5/7KSFl$LkLG;KS5/7KSY;7N/NXRMi<IFKU7XT
-GAV+t>[D&J>&%kkdaZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-kj7d%m-j)lgrmpdR?NhnMi<UQN/W[RN/NX]N/ERPN0fK\N/NX]N/ERPN0fK\N/NXNKS5\NMMQq=
-Q\9pKMi<IFKSY;7LkLG;KS5)-H\d?.GAV+t9Lro7DY3Yus8W-!s8W-!s8W-!o_/+Em-j0)n)iE\
-g"bH4eCN'tf%A3ibKS5Sbg">Tc+CX%LkLG;KS5\NMN!IPQ]-f\Mi=!]MN!IPN/NXNKS5\FJV\u4
-LkLG;KS5/7KSFl$L4"?(KS5)-H\QopL4">lFEE7bHZsRRC2@cV6q'O477KF&S=Z8Ns8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq;C>sk1nb?eCN9rbKJ,S
-`5T^6`Pod7`Pfa7f>PA@`Po3k[$Q`/N/NXRMi<UQN/W[RQ]-f\Mi<IFKSY;7LkLG;KS5/7KSFl$
-LkLG;KS5)-H[C*fLNIKZFEE:[E-HDGGB@qNFED_KFE_S;GB@r[gtr)2s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2i8j(Sgtp`>hU9p)daZjreCN=.hV$]@
-<)cje4Zl1s4B4g9GAV,MI!^TqH\QopLkLG;KS5/7KW(?)]=bi1gtp`>hV$]@daZjreCMgec-+>U
-`5T^6`Pod7`Oidr]=bhh]Y1qi]t:qj['[3I['[HX]sP/R['[2pI!^[&KUJ$fR?Ni&PEVr6Q'mi"
-R?Ni&PEVDuPF%5cR?Ni$N/ERPN/W[RQ]-fiPEV>lMO09ZQ]-fgN/Es\MOBZlR?Ni&PEVDuPP"SE
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o.jQG4OhU9p)bKS5L`PoI%]sP/R['[3I['[3I['[3I
-X/rG1['[3I[&^:1C2@c[9MJV_84lQM=A27qA7^^XN0fK\Q]-fgN/Es\MOBZlR?Ni$N/F$ePF%5c
-Q]-fgN/F$ePF%5cN/NX]N/Es\MO09ZN/NXRMi=!UJW,MGLkLGJN/ERPN/W[RQ\9pKMi<IFKSY;7
-LkLG9I!^TqH[C*fL4"?&I!^3eI>3,rH[C0qI!^3eI>3,rL4">pH[UWrH[C*fL4">pH[UWrH\Qop
-L4"?&I!^[&KSY;7LkLG;KS5/7KSY;7LkLGJN/ERPN0fK\['[3I['ZX*Unji_Unsl_V50o`Uj$p&
-<)ck"9Lr8Z86APV8k_r]9Lr8Z86APV8k_r]9LrZ(AVc"mLkLG;KS5/7KSY;7Q\9pKMi=!UJW,MG
-N/NX]KRo)?N0fK\N/NX]N/ERPN/3.?Q\9pGKS5)-HcsXXi8j(SgtpK/f#5PH]=bha['ZX*Un"$H
-S=Z7@St)=BS=H1@<)cje4Zl1s4@VIr2)I-Z4Zl1s4>erP7Qik'4Zl1s4@VIr7Qik99LsALFE_hK
-GAV,>FED_KFE_S;GAV,>FED_DCNjlBGB@qND/4?;FE_hKGB@qNFEDkVI=$<hL4"?&I!aQ%hZ*WU
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq=OCVkj7crjQFt@eou4XB3\VQ>ZtcF>$,$9B3\VQ>ZtWJAS57O=Bo0F>ZtcF>#\I$
-B3\V><)mR9>#\I$B3\VMA7]CY>%;)S@q9.`>ZtWJARf7^B3\VQ>ZtWJARf7^G@Y)kA7]7]ATqZm
-@q9.\A7]7]ARf7^GAV,>FED_DCNjlBGB@qNFEDkVI>3,rH[C0bFED_KFGFsWGB@qNFED_KFE_S;
-GB@qNFED_KFE_S;GAV,>FED_KFE_hKGB@qND/4?;FE_hKGB@qNFEE7bHZsRRH[C0bFEE7bH[C*f
-L4">pH[U*TCK+85<)cjs<)m$o85rPg<)ck2:J"Mb<E)pt=A28t]Y4@Fs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+QpA*q=n)39ig"bH4eCN'tetf.<C2@d3D/4?;FE_hKGB@q^FDuGGFF/@_
-GB@qRH[U6fI>;o`H[C0qI!^3eI>3,rH[C0sKS4]!I>3,rL4"?&I!^TqH\QopL4"?&I!^[&KSFl$
-L4"?&I!^3eI=$<hGB@q^FDuGGFE_hKGB@qNFED_KFE_hKL4">lFEDkVI>3,rH[C0fH[UWrH[C*f
-L4">pH[UWrH\QopL4"?(KS5/7KSY;7LkLG;KS5/7KU7XTLkLG*D/36Y?>!MHLkLHFm-juSs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kMYFadaZj9PEUfUKU7XT
-Q]-fXKS5\NMN!IPQ\9pKMi=!]MMQq=N/NX]N/EFEKT(hJLkLG?Mi<IFKSY;7LkLG;KS5)-H\Qop
-LkLG*D/36I86APVg"bHas8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhV$]@daZjkbg">Tc-+>U
-`5T^=bg!Z"Wec=]N/NXNKS5;BN0fK\LkLG?Mi=!UJW,MGLkLG;KS5/7KSY;7L4"?(KS5)-H\Qop
-L4"?&I!^'ZFF/@_GB@q^FDuGGFD"i^7Qik'4ZkSY1t'n)s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZk#bfdrD`RrDX`5T^6`Pp$Ec,@T?
-`5T]`PEV>lMO09ZN/NX]N/ERPN/W[RLkLG;KS5/7KR8&oLkLG.H[UWrH\d?.LkLG9I!^3eI>3,r
-H[C0bFED_KFGFsWGB@qNFEEk.MZ<_Vs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH;gtp`>hVdJXi8j(5]Y.<65t+11<CK2U9LsMWI=$<h
-H[C0qI!^[&KW(?)bKS5pm-j<4p#tc2kj7crjQGI^kLnYIdaZjreCN'tf#5PH`5T^6`PoI%]uI^r
-['[3P]Y1qi]t:qj['[3P]Y1\Z[&^:1B3\VTCi52iN1#lnR?Ni&PEVDuPF7VuR?Ni&PEUr`N0fK\
-Q]-fgN/ERPN0fK\N/NX_PEV>lMN!IPR?Ni&PEVDuPF7VuR?NiH]Y4@Fs8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<[_Gi8j(SgtpK/f#5PH]=bhh]Y1\Z['[3I['[3I['[3I['[3IX/rG1['Zm8X`nl/
-<CK2B6q'^A9it([GAV,SMi<UQN/W[RQ]-fgN/Es\MN!IPQ]-f\Mi='fPDkEYQ]-f\Mi<UQN0fK\
-N/NXRMi<UQN/W[RN/NX]N/EFEKT(hJLkLG;KS5;BN/3.?LkLG;KS5)-H\QopH[C0bFEDkVI=$<h
-L4">pH[UWrH[C*fL4"?&I!^3eI>3,rH[C0qI!^3eI>3,rLkLG.H[U^'KSFl$L4"?(KS5/7KT(hJ
-Q]-fXKS5;BN/W[RN/NXNKS6D-XgGIBUnsl_V50o`Unji_Unsl2FECVY86APV8k_r]9Lr,^<EMpc
-8k_r]9Lr8Z86APVB3\VrKS5/7KSY;7LkLG;KS5/7KT(hJN/NX]KRo)?N/W[RQ]-f\Mi=!]MN!IP
-N/NXRMi<IFKSY;7H[C1Z`PpcrkLnYIdaZjd`PoI%]sP/RX/rFnSt)aJQ(4G9S=Z7LR[$iO<CT,6
-7Qik'4Zl1s4@VIr7Qik'4Zl1s4>erP7Qik'4Zl1s4BP9JGB@qNFED_KFE_hKGAV,>D/4?;FE_hK
-GB@qNFED_KFE_hKGB@qNFED_KFE_hKGB@qRH[UWrH[C*fg"bHas8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
-i8j(Ebft?RFD"i^@q9.`>ZtWJARf7^B3\VMA7]CY>%_)D<)ck1>Zt*+<G,Q?<)ck1>ZtcF>$,$9
-B3\VMA7]CY>%;)S@q9.pA7/nXARf7^B3\VMA7]7]ARf7^@q9.\A7]CY>%;)SG@Y)kA7]t%CMI['
-GAV,>FED_KFG>0iL4">pH[U*[FG>0iH[C0fH[U*[FGFsWGB@qNFED_KFE_hKGB@qNFED_KFE_hK
-LNIKZFED_KFE_hKGAV,NFDuGGFE_hKGB@qNFED_KFE_hKGB@qNFEDkVI<TdTGAV+t9Lr,^<G50"
-<)cjs<)m$o85rPg=A27f9Lr,^<P,oWs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-m.9o6m-ilnkLnYIg"bH4eCLFlUj$ZkC2@d3D/4?;FE_hKGB@qNFED_KFG>0iGB@qRH[U*[FE_hK
-H[C0fH[UWrH[C*fL4">pH[U6fI>EQ0H[C0qI!^3eI>3,rL4">pH[U6fI<TODGB@qND/4?;FE_hK
-H[C0bFEE:[E-HDGL4">lFEDkVI<TdTLNIK^H[UWrH[C*fL4">pH[U6fI>3,rH[C0fH[U6fI>3,r
-L4"?&I!^[&KSY;7N/NXNKS4PdCK+85B3\W9V54.ks8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(LeCLFlUl:4jQ]-fXKS5;BN/W[RN/NXNKS5;BN/W[R
-N/NXRMi<IFKU7XTN/NX]N/ERPN0fK\LkLG;KS5)-H\QopL4"?&I!^3eI99`\<CK3SXKDO&s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f$`(!fZ_O^bg">Tc-+>U`5T]`PEV>lMO09Z
-N/NX]N/ERPN/3.?LkLG;KS5/7KSY;7L4">pH[UWrH[C*fH[C0qI!^3eI<TdTL4">lFED_KFE_hK
-GB@qND/2R.75ZnY7Qik&6q..Us8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5Sbg")F`Pfa7`5T^6`Pod7`ON%MN/NXRMi<UQN0fK\
-N/NXRMi<IFKSY;7LkLG9I!^[&KSY;7LkLG;KS5/7KSY;7LkLG;KS5)-H\QopL4">pH[UWrH[C*f
-daZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
-m.9o6m-ilnkNM:$i8j(bm-j<4ophVD7Qik676sC+4C_o5L4"?&I!^TqH^U(]bKS6'pA+ags7H$\
-o_/+IoC_JAp#tc2kj7crjQG4OhV$]@daZjkbg">Tc,@T?`5T^-]Y1qi]t:qj]=bhh]Y1qi]sP/R
-]=bhh]Y0_sP>kL]B3\VeH[V<GPF7VuR?Ni&PEVDuPF7VuQ]-fiPEUr`N/W[RN/NX_PEUr`N1#ln
-R?Ni&PEUr`N1#lnR?Ni&PEVDuPF7Vus8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQ
-daZjkbg")F`Oidr]=bha['[3I[&^:1['[3I['Zm8XgGIBX/rG5Xf@21KM"p4<CK2B6q(3O89]/t
-LkLG;KS5;BN/W[RN/NX]N/ERPN/W[RN/NXRMi<UQN/W[RN/NXRMi<UQN/3.?LkLG;KS5;BN/W[R
-N/NXNKS5/7KSY;7LkLG;KS5)-H[C*fH[C0bFED_KFE_hKL4">lFEDkVI>3,rH[C0fH[UWrH[C*f
-L4">pH[UWrH[C*fLkLG;KS5/7KSY;7LkLG;KS5/7KSY;7N/NXNKS5;BN/W[RQ]-f\Mi<UQN1#ln
-['[3I['Zm8Xe_ehUnsl_V50o`Uj$p&8k_r]9LqcL9it([8k_r]9Lr8Z84lQM=A27f9LrZ(AXA@5
-LkLG?Mi<IFKU7XTLkLG?Mi=!]MN!IPN/NX]N/ERPN1#lnN/NXRMi=!UJW,MGL4"?(KS4]!IDj+D
-i8j(SgtpK/f#5PH]=bha['ZX*Unji_S=Z7@St)=BS=H1@=Bo0$6q'O477KF&7Qik'4Zl1s4@VIr
-7Qik'4Zl1s4@VIr7Qik99LsALFF/@_GB@qRH[U6fI<TdTGB@qNFED_KFE_hKGB@qNFED_KFE_hK
-L4">pH[UWrH\QopL4"?(KS8%6hZ*WUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kMYFabKS4cI!]@6ARf7^
-B3\VMA7]7]ARf7^B3\VQ>ZtcF>$,$9B3\VB>[D&J>$,$9B3\VQ>ZtWJAS57O@q9.`>ZtcF>%;)S
-B3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%;)S@q9.cCi4H6CNjW2GB@qRH[UWrHZsRR
-L4">lFED_KFE_hKGB@qNFED_DCNjlBGAV,>FED_KFE_S;GB@qNFED_KFE_hKGAV,>FED_KFE_hK
-GB@q^FDuGGFE_hKGB@qND/4?4CNjlBGB@qNFED_DCK+85=A27b<)m$o86APV=A27b<)m$o85rPg
-=A28m[']l5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=j7=kj7crjQG4OhV$]@
-daZjT['Y%!FD>W0GAV,>FED_DCNjlBGAV,>FED_KFF/@_GB@qNFED_KFE_hKH[C0bFEDkVI=$<h
-H[C0fH[U6fI=$<hH[C0fH[U6fI<TdTGB@qNFED_KFE_S;GB@qNFED_DCNjlBGB@qNFED_KFE_hK
-GB@qRH[U*[FE_hKGB@qRH[U6fI=$<hH[C0fH[U6fI>3,rL4">pH[U6fI>EQ0LkLG;KS5/7KO\P(
-<)ckPI!af4kPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-kj7crjQG4OhRK\fLkLG?Mi<IFKT(hJQ]-fXKS5\NMMQq=N/NXRMi<IFKU7XTN/NXNKS5;BN/W[R
-LkLG?Mi<IFKSY;7H[C0fH[U6fI=$<hB3\V04Zmq1FT;C@s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-j0)n)iE\g"bH4eCN'tf#u:^bKS5Sbg">Tc+CX%R?NhnMi=!]MN!IPN/NXNKS5;BN.u_,
-LkLG9I!^[&KR8&oGB@qNFEDkVI=$<hL4">pH[U*[FE_hKGB@qNFED86DKfr5B3\V04ZkSY1c7*H
-@q90Ns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39i
-g"bH4eCMgec,@T?`5T^=bg")F`Pfa7`5T^6`Pn7/PDkEYN/NXRMi<UQN/W[RN/NXLI!^[&KSY;7
-H[C0sKS5/7KT(hJLkLG;KS5/7KSY;7LkLG;KS4]!I=$<hL4"?(KS9C*s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVkj7d%m-j<4p%7tR
-o_/*NSt&5;77BU5779RgD/4KFI>EQ0]=biWs8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
-i8j(Sgtp`>hV$]@bKS5Sbg")F`Pfa7]=bhs]XkJW[(Eua['[3P]Y1\Z[(Eua['[2aFECJ]<E)pt
-H[C1/PEUr`N1#lnR?NhnMi='fPDkEYN/NXRMi<UQN/W[RN/NX_PEUr`N1#lnR?Ni&PEVDuPDkEY
-R?Ni&PEXGEf)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hU9p)daZjd`PoI%]t:qj
-['[3I['[3I[&^:1['[3@XKAk:[&^:1X/rFkPESsF<D#qZ779R:9MK_QFGPU'N/NXRMi<UQN/3.?
-N/NXRMi=!]MN!IPN/NXRMi<UQN/W[RLkLG?Mi<IFKSY;7LkLG;KS5/7KSY;7LkLG;KS5/7KR8&o
-L4">pH[U6fI<TdTGB@qNFED_KFF/@_H[C0fH[UWrH\QopH[C0fH[U6fI>3,rH[C0qI!^[&KSY;7
-LkLG;KS5;BN/3.?N/NXNKS5;BN/W[RN/NXRMi<UQN/3.?S=Z7h`PoI%]sP/RUnsl_V50o`Unji_
-Unsl2FEC,K9it([8k_rO9MJV_84lQM8k_r]9LqcL9it([@q9/,KS5;BN/3.?LkLG;KS5;BN/3.?
-N/NXRMi<UQN/W[RQ]-f\Mi=!]MN!IPLkLG;KS5)-H[C*fH[C1Z`PpcrkLnYIdaZjd`PoI%]sP/R
-X/rFnSt)=BS=H1@S=Z7@St'Fu>"(hJ=A27T4Zl>19gqH=<CK2C4Zl_55t4""7Qik'4Zl/$79!5d
-GB@qRH[UZkE-lq[GB@qRH[U6fI=$<hH[C0bFED_KFE_hKGB@qNFEE7bHZsRRH[C0fH[U^'KR8&o
-g"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7d%m-ilnkL.l2Q]-f3A7]7]ATqZm@q9.\A7]7]ARf7^
-@q9.`>ZtcF>%_)DB3\VB>[CoNAS57O@q9.`>ZtWJAS57O@q9.`>Zt67?>!MH=Bo07>[D&J>#\I$
-=Bo03<)m%*?<CH=B3\VQ>ZtWJATqZmC2@d&Ci4H6CNjlBGB@qNFED_KFE_hKGB@qND/4?4CNjlB
-GAV,>FED_DCL^mdGAV,>FED_DCNjlBGB@qNFED_KFE_hKGB@qNFED_KFE_hKGB@qND/4?4CNjW2
-GB@qND/4KFI<TdTC2@ci9Lr,^<EMpc=A27b<)m$o84lQM=A27X9MJ,Q9tS'Os8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(`gt^T<hU9p)`5T]OKS3iGATr!,
-GAV,>D/4?4CNjlBGAV,>FED_DCNjlBGB@qNFED_KFE_hKGB@qNFED_KFGFsWGB@qND/4?;FE_S;
-GB@qNFED_KFE_S;GB@qND/4?;FE_S;GB@qND/4?4CNjlBGB@qNFED_DCNjlBGB@qRH[U*[FG>0i
-GB@qNFEE7bH\QopLkLG.H[U^'KR8&oLkLG.H[U^'KQhN[B3\VMA7`]u`W,u<s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkN:RT]=bh9Mi<IFKT(hJ
-LkLG?Mi<IFKT(hJLkLG?Mi<IFKSY;7N/NXNKS5;BN/W[RLkLG?Mi<UQN/3.?LkLG.H[U6fI<TOD
-GB@q:A7\4n4B,9[o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7d%m-iW_hV$]@
-daZk#bfe2Rc-+>UbKS5Sbg!N%[#Bp%N/NXRMi<UQN/3.?LkLG;KS4]!I=$<hH[C0fH[U*[FE_hK
-H[C0bFEDkVI<TdTGB@qND/4?4CNjW2C2@d&Ci4!(DJ*3X2)I-I1c1PXMZ<_Vs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5Sbg")F`Pfa7
-`5T^=bg")F`Pfa7X/rFZKS5/7KSY;7N/NXNKS5;BN/3.?LkLG;KS5/7KSY;7LkLG;KS5;BN/W[R
-N/NXRMi<IFKSY;7LkLG.H[UWrHd^Eps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+@Sq=OCVs8W-!s8W-!s8W-!UnskZ9MJ,Q9m_58
-UnsmZpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(SgtpK/f$`(!
-bKS5L`Pod7`Oidr]=bhh]Y1qi]sP/R['[3P]Y1\Z[&BFY<)ck2:J"Yn?AO8fN/NX_PEVDuPF7Vu
-N/NX_PEUr`N0fK\N/NXRMi='fPDkEYR?Ni&PEVDuPF7VuR?Ni&PEUr`N1#lnX/rH's8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(SgtpK/f#u:^`5T^-]Y1qi]sP/R['[3I['[3I[(*6<
-X/rG1['[3I['[3IUnsl2FECVY84>p8=A28#Ci5&^KSY;7LkLG;KS5/7KSY;7LkLG;KS5/7KSY;7
-LkLG;KS5/7KSY;7LkLG;KS5/7KSY;7L4"?&I!^TqH[C*fL4">pH[U6fI<TdTGB@qNFED_DCNjW2
-GB@qNFEE7bH[C*fL4">pH[UWrH[C*fL4">pH[U^'KSY;7LkLG;KS5;BN/3.?N/NXRMi<UQN/W[R
-LkLG;KS5;BN/3.?Q]-g&XKB[ic,@T?]=bha['ZX*Unji_Unsl_V50o`Uj$Zk779R:9MIrD79E5S
-8k_r]9LqcL9it([8k_rO9MK/)>)7ibLkLG;KS5/7KSY;7LkLG;KS5/7KSY;7LkLG;KS5;BN/W[R
-LkLG;KS5/7KR8&oH[C0fH[U*[FMu/;i8j(SgtpK/f#5PH]=bha['ZX*Unji_S=Z7@St)44PGG%N
-<)cjd6q'O477BU5<CK2R76s@177BU5779R:9MJMU5t4""779RH>[E/4H[C*fH[C0fH[U6fI=$<h
-GB@q]I!^TqH\QopLkLG.H[UWrH[C*fH[C0fH[UWrH[C*fH[C0qI!aQ%hZ*WUs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726i8j(Sgtp`>hQ*`[GAV,*A7]sq?tsLqG@Y)rCi3lj>%;)S=Bo0BA7]CY>%;)S
-B3\VQ>Zt67?>!MHB3\VQ>Zt67?>!MH=Bo0F>Zt*+<E)pt<)cjs<)mR9>#\I$<)cjs<)m%*?=RMW
-@q9.\A7]7]ARf7^C2@d&Ci4H=FE_S;GAV,>FED_DCNjW2C2@d3D/3m&DKfr5=Bo03<)n-ZCNjlB
-GAV,>FEDkVI<TdTL4">lFED_KFE_hKC2@d3D/3m&DJF!*C2@d&Ci4H6CNjlBGB@qNFED86DHKS'
-=A27f9LqcL9hJ)R8k_rO9MJ,Q9hJ)R779SO[']l5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+Em-j0)n)39ii8j(SgtpK/f$`(!Unsl2D/3m&DJF!*C2@d3D/4?4CNjlB
-GB@qNFED_KFE_S;GB@qND/4?;FE_S;H[C0bFED_DCO:DVGB@qNFED_KFE_S;GB@qND/4?;FE_hK
-GB@qND/3m&DKg2EC2@d3D/4?4CNjlBGB@qNFED_KFE_hKGB@qNFEDkVI=$<hH[C0fH[U6fI>EQ0
-H[C0qI!^3eI<TdT@q9.cCi6Ve[/^1+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA*q=n)39ii8j(>`PmdoN/3.?LkLG;KS5/7KSY;7LkLG;KS5;BN/3.?
-LkLG;KS5/7KT(hJLkLG?Mi<IFKSY;7LkLG;KS4]!I=$<hGB@qNFED_DCJ%8p779S_`PqlWs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726k1nbFgtpK/f$`(!bKS5Sbg">Tc-+>U
-`5T]cSt(atN/W[RN/NXNKS5)-H\d?.H[C0qI!^TqHZsRRH[C0bFED_KFE_hKGB@qNFED_KFE_hK
-GAV,1Ci4H6CL^md@q9.\A7\_><EMpcs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH4eCN9rbKJ,SbKS5L`Pod7`Pfa7`5T^6`PmRZH[C*f
-LkLG;KS5/7KSY;7N/NXNKS5/7KSY;7N/NXNKS5/7KSY;7LkLG?Mi<UQN/W[RN/NXRMi<IFKR8&o
-N/NYps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s2;mqGAV-Kgtr)2s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kMYFag"bH4eCN'tf#5PH`5T^-]Y2=t]!SiO
-]=bha['[HX]sP/R]=bha['XRaDH'S8<)ck-A7^^XN1#lnN/NX_PEVDuPF7VuN/NX_PEUr`N1#ln
-N/NX_PEVDuPDkEYN/NXRMi='fPDkEYN/NXRMi<UQN;rqXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+(Hp#+oog"bH4eCMgec,@T?`5T^-]Y1qi]sP/R['[3@XKAk:[&^:1['[3@XKAk:[&^:1
-S=Z6`>ZsQa77BU5@q9.tH[U6fI>EQ0H[C0sKS5/7KSY;7LkLG;KS4]!I>EQ0LkLG;KS5/7KSY;7
-LkLG.H[U^'KR8&oH[C0fH[U6fI=$<hGB@qRH[U*[FE_hKGAV,>D/4?;FF/@_H[C0qI!^3eI>3,r
-H[C0qI!^3eI>EQ0LkLG;KS5/7KSY;7N/NXRMi<UQN/W[RN/NXNKS5;BN/W[RN/NX_PEWr(`S'&'
-bKS5L`PoI%]rS6:X/rG!V50o`Unji_Unsl2FEBr>77BU5779RE76s@177BU5779R:9MJV_84lQM
-@q9/,KS5)-H\d?.LkLG;KS5/7KR8&oLkLG;KS5/7KSY;7LkLG;KS5/7KSY;7H[C0fH[U6fI<TdT
-GB@rF`PpcrkLnYIdaZjkbg!c4]sP/RX/rFnSt)=BS=H1@S=Z7@St'Fu>"(hJ<CK2B6q'R.4@MY,
-779R56q(*E5t+11779R:9MIrD7;#k/H[C0fH[UWrH[C*fH[C0fH[UWrH[C*fLkLG.H[UWrH[C*f
-L4">pH[U6fI=$<hH[C0qI!^3eI=$<hdaZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+(Hp#tc2
-i8j(Sgtoug`JB2#@q9.\A7]7]ARf7^C2@d#>ZtWJARf7^=Bo0F>Zt67?<CH==Bo07>[CB/<ENL4
-=Bo03<)lms<E)pt<)cjs<)lms<E)pt<)cjs<)lms<E)ptB3\VB>[D&J>%;)SGAV,*A7]sq?tsLq
-C2@d&Ci3`nASQ%!GAV,1Ci4!(DJF!*C2@ce<)l@T79!5dGAV,1Ci4!(DKg2EGB@qNFED_DCNjW2
-GAV,1Ci4!(DI[3gC2@d#>ZtlYDJF!*C2@d3D/4?4CNjW2@q9.C9MJ,Q9hJ)R8k_rZ76sO>9iXVJ
-<CK2R76sO>9sh:7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+Em-ilnkMYFag"bH;gtpK/f#5PHN/NX0Ci4!(DJF!*GAV,1Ci4H6CNjW2GB@qNFED_DCNjW2
-GAV,>FED_KFE_hKGB@qNFED_DCNjW2GB@qND/4?;FD>W0GB@qND/4?;FD>W0GB@qND/3m&DKg2E
-C2@d3FED_DCNjlBGAV,>FED_KFF/@_GB@qRH[U6fI=$<hLkLG.H[U6fI=$<hC2@d3FEFms[/^1+
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-m.9o.jQFt@esV_cLkLG.H[U^'KSY;7LkLG;KS5/7KSY;7H[C0sKS4]!I>EQ0H[C0sKS5/7KSY;7
-LkLG;KS5/7KR8&oLkLG*FED_KFD>W0<)cjt76uljN;rqXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQg"bH4eCN'tf%A3ibKS5Sbg">Tc,@T?Q]-fXKS5/7KR8&o
-H[C0fH[U6fI=$<hH[C0fH[U*[FE_hKH[C0bFEE7bH[C*fGB@qNFED86DKg2EC2@d&Ci3`nATqZm
-N/NYYm-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-m.9o6m-j)lgtCK>bKS5Sbg")F`Pfa7bKS5L`Pod7`O*"Z=Bo0eI!^[&KSY;7LkLG;KS5;BN/3.?
-LkLG;KS5/7KSY;7LkLG;KS5;BN/W[RN/NXRMi<UQN/W[RLkLG;KS7:_`W,u<s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\o_/+Em-ilnkLnYIdaZjkbg">Tc,@T?]=bhh]Y1qi]sP/R]=bha['[3I[(Eua
-Q]-f(9Lr,^<E)ptGB@qcMi='fPDkEYN/NX_PEUr`N/W[RN/NXRMi<UQN/W[RN/NXRMi<UQN/W[R
-N/NXRMi<UQN/W[RN/NYQjQHRCs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
-daZjkbg")F`Oidr]=bhh]Y1\Z['[3I['[3@XKAk:[&^:1['[3@XKAP)XfJP*N/NWo<)l@T79!5d
-H[C0fH[U^'KSY;7LkLG;KS4]!I=$<hLkLG.H[U^'KR8&oLkLG.H[U6fI>EQ0H[C0fH[U6fI=$<h
-GB@qRH[U*[FE_hKGB@qND/4?;FD>W0GB@qRH[U6fI=$<hH[C0sKS4]!I>EQ0LkLG;KS5/7KT(hJ
-LkLG;KS5;BN0fK\N/NXRMi<UQN/W[RN/NXNKS6.tUtOP[i8j(LeCN'tf#5PH]=bha['ZX*Unji_
-Unsl_V50o`Uj$Zk4$5Yq4Zkeg4[qRs779RE76spB5t4""779R56q(`n>'kUELkLG.H[U6fI=$<h
-H[C0sKS4]!I>EQ0LkLG.H[U6fI=$<hH[C0fH[U6fI=$<hH[C0bFED_KFM#3!i8j(SgtpK/f#5PH
-]=bha['Zm8XdkuQS=Z7@St)=BS=H1@=Bo0$6q'^A9gqH=<CK2B6q'O477BU5779R64Zl/$79)cB
-779RH>[Dc(I=$<hH[C0fH[UWrH[C*fH[C0sKS4]!I=$<hH[C0fH[U6fI=$<hH[C0bFEDkVI=$<h
-H[C0fH[XT&hZ*WUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+Em-j0)n)39ig"bH;gto*5X`nl/
-@q9.\A7]CY>%;)S@q9.Q>[D&J>$,$9<)cjs<)lms<E)pt<)cjs<)lms<EMpc<)ck"9Lr,^<EMpc
-<)ck"9Lr,^<E)pt=A27b<)lms<G,Q?@q9.\A7]7]ARf7^@q9.\A7]7]ARf7^@q9.cCi4!(DKfr5
-C2@d#>ZsQa77BU5779RH9Lro7DJF!*C2@d&Ci4H6CMI['C2@d&Ci4!(DJF!*B3\VMA7]CY>%;)S
-@q9.`>ZtWJASQ%!C2@d&Ci3`nAP,Wj8k_rO9MJMU5tXgF779R64Zl/$76<Up7QilG]Y4@Fs8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVp[%),m-ilnkMYFa
-g"bH;gtpK/f!MfkL4">_Ci4!(DJF!*C2@d&Ci4H=FD>W0GB@qNFED_KFE_hKGB@qNFED_KFE_hK
-GB@qNFED86DKg2EC2@d3FED86DKg2EGB@qNFED86DKg2EGB@qACi4H=FE_hKC2@d3FED_KFE_hK
-GB@qND/4?;FE_hKGB@qRH[U6fI=$<hGB@qpPEX26c2[hDs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39idaZjKXK@G>N/3.?
-H[C0fH[U^'KR8&oLkLG.H[U^'KR8&oH[C0fH[U6fI<TdTH[C0fH[U6fI=$<hH[C0fH[U6fI=$<h
-GB@q:A7\1t7:Tk>s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-kj7d%m-iW_hV$]@daZjkbg">Tc,@T?bKS5Sbg!2iXc/0sH[C0sKS4]!I>EQ0H[C0fH[U6fI<TdT
-GB@qNFED_KFE_hKGB@qNFED_KFE_hKC2@d3D/3m&DKfr5UnsmNm-juSs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726g"bH;gtp5uc-+>U
-`5T^6`Pod7`Pfa7`5T]BH[TXFDL6_YLkLG.H[U^'KSY;7LkLG;KS5/7KSY;7N/NXAH[U^'KSY;7
-N/NXRMi<UQN/W[RN/NXRMi<IFKT(hJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<
-kj7crjQG4OhU9p)bKS5L`Poj0]">Vg]=bhh]Y1\Z[(Eua]=bha['Zm8X]Sh7=A27f9Lr8j?Asf$
-N/NXRMi<UQN/W[RN/NXNKS5;BN/W[RLkLG?Mi<UQN/W[RN/NXRMi<UQN/W[RN/NXRMi<UQN4Za9
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o.jQG4OhU9p)bKS5Sbg")F`Oidr
-]=bhh]Y1\Z['[3IX/rG5XfAG'XgGIBX/rG1['[?FWiN5'LkLF\<)lOa9k.^FH[C0sKS4]!I>EQ0
-LkLG;KS4]!I>EQ0H[C0sKS4]!I>EQ0H[C0fH[U*[FF/@_GB@qRH[U*[FE_hKGB@qNFED_KFD>W0
-C2@d&Ci4H6CNjlBGB@qRH[U6fI=$<hH[C0fH[U^'KSY;7LkLG;KS5;BN/W[RN/NX_PEUr`N/W[R
-N/NXNKS5bWPJkGZm.9o6m-ilnkLnYIbKS5L`PoI%]rS6:Unsl_V50o`Unji_Unsl2D/2!c1c7*H
-4$5Yq4Zkeg4Zbbh4$5Yp6q(*E5t+11=Bo0ZH[U6fI=$<hLkLG.H[U6fI=$<hLkLG.H[U6fI=$<h
-H[C0fH[U6fI<TdTH[C0fH[U6fI<TdTC2@e+`PpcrkLnYIdaZjd`PoI%]sP/RX/rFnSt)=BS>_mA
-S=Z7@St'Fu>"(hJ<CK2G9MIrD77BU5<CK2G9MJ,Q9gqH=779R56q(*E5u^f`H[C0fH[U6fI=$<h
-H[C0fH[U6fI=$<hH[C0fH[U6fI=$<hH[C0fH[U6fI>3,rGB@qRH[U6fI=$<hdaZkJs8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-ilnkMYFag"bH4eCL.]S9K's@q9.\A7]CY>#\I$
-=Bo03<)lms<E)pt<)ck"9Lr8Z86APV=A27b<)lms<EMpc<)cjs<)lms<EMpc<)cjs<)lms<E)pt
-<)cjs<)m%*?>!MHB3\VB>[CoNARf7^@q9.`>ZtWJARf7^@q9.\A7\_><CK;E7Qik'4Zkeg4[hb-
-@q9.\A7]7]ASQ%!C2@ctA7]7]ARf7^@q9.\A7]CY>%;)S@q9.Q>[D&J>$,$9@q9.\A7]7]ATr!,
-B3\V?76s@177KF&779R64Zl1s4@MY,4$5Yq4Zm4bA^])Zs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d%m-ilnkN:RTg"bH;gtpK/f!qi^
-H[C0UCi4H6CMI['GAV,>FED_KFD>W0GB@qACi4H=FD>W0C2@d3D/3m&DJF!*GB@qACi4H=FE_S;
-GB@qNFEDkVI<TdTGB@qNFED86DKfr5C2@d&Ci4H=FD>W0GB@qACi4!(DKg2EGB@qNFED_KFE_hK
-LkLG^XKCFAkPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hV$]@daZj[]Y0i,S;`AbH[C0sKS5/7KR8&o
-H[C0fH[U6fI<TdTGB@qNFED_KFE_hKH[C0fH[U6fI=$<hH[C0bFED86DG!Ss8k_t-eCO["s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2k1nbFgtpK/f$`(!
-daZk#bfe2Rc-+>UbKS5$St(UiKR8&oH[C0bFEDkVI=$<hGB@qNFED_KFD>W0GB@qNFED_KFE_hK
-GB@qACi4!(DMWt!]=biWs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIbKS5Sbg")F`RrDX`5T^6`Po3kZrC")
-LkLG;KS5/7KSY;7H[C0sKS4]!I>EQ0LkLG;KS4]!I>EQ0LkLG;KS5;BN/W[RN/NXRMi<UQN/W[R
-LkLGn]Y4@Fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCN'tf#5PH
-`5T^-]Y1qi]sP/R]=bha['[3I[(Eua['[2aD/3*M<E)pt<)ckAFEEJ"N/3.?LkLG;KS5/7KSY;7
-H[C0sKS4]!I>EQ0LkLG?Mi<UQN/W[RN/NXRMi<UQN/W[RN/NXbSt,i\s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(ZjQG4OhU9p)bKS5L`Pod7`Oidr]=bhh]Y1\Z['[3I
-['[3@XKAk:[&^:1X/rG(XKB"7WiN5'N/NX)A7\_><GH>fH[C0fH[U^'KSY;7LkLG.H[U^'KR8&o
-LkLG.H[U6fI=$<hGB@qNFED_KFE_hKGB@qNFED86DKg2EC2@d3FED86DJF!*C2@d3D/4?;FE_hK
-H[C0fH[U^'KT(hJH[C1"Mi<IFKT(hJN/NXRMi<UQN/W[RN/NX_PEUr`N2s%^m.9oMs8VHWp#tc2
-i8j(LeCN'tf"8T.]=bha['ZX*Unji_Unsl_V50o`UgmqH2)I-I1c.'H1c7*H4$5Yq4Zkeg4Zbbh
-4$5Yq4Zl\C<I9(@H[C0fH[U6fI=$<hH[C0fH[U6fI=$<hH[C0fH[U6fI<TdTGB@qNFED_KFE_hK
-GB@qNFED86DS*Qpkj7ckgtpK/f#5PH]=bha['Zm8Xe_ehS=Z7@St)=BS=H1@<)cjd6q'O477KF&
-779R:9MIrD77BU5<CK2B6q'^A9gqH=779RH>[E/4H[C*fH[C0fH[U^'KR8&oLkLG.H[U6fI=$<h
-H[C0fH[U6fI=$<hH[C0fH[U6fI=$<hH[C0bFEGs\f)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq=OCVkj7d%m-ilnkMYFag"bH-bfuZLS8)kX=Bo0F>Zt*+<E)pt<)cjs<)m$o85rPg
-8k_rY<)lOa9iP(l8k_rO9MJJc<EMpc8k_rY<)lOa9it([=A27b<)lms<E)pt<)cjs<)lms<ENL4
-B3\V><)m%*?<CH=@q9.`>Zt67?:@7N7Qijk1c.'H1cmf_<)ckAD/36Y?>!MHB3\VQ>ZtcF>%;)S
-@q9.`>ZtWJAS57O@q9.Q>[D&J>#\I$=Bo03<)lms<G,Q?@q9.\A7\_><CK;E7Qik&6q'R.4?GYg
-<)ckEH[VrrXm#-?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+@Sq=j7=kj7d%m-ilnkMYFag"bH;gtpK/f!MfkN/NX0Ci4H=FD>W0
-GB@qACi4H=FE_S;C2@d&Ci4H=FD>W0C2@d3D/3m&DKg2EC2@d3FED_KFF/@_GB@qRH[U*[FE_hK
-GB@qNFED_KFD>W0GB@qACi4!(DJF!*GB@qNFED_KFF/@_R?NiXbg$1fs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726i8j(ZjQG4OhV$]@g"bH-bg!N%[$d,ALkLG;KS4]!I=$<hGB@qNFED_KFD>W0
-C2@d&Ci4!(DKg2EGB@qNFED_KFE_hK<)cje4ZoO:V#UJps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)iE\g"bH4eCN'tf#u:^bKS5Sbg"Scf#u:^
-N/NXAH[U6fI<TdTH[C0bFED_KFE_hKC2@d3FED_KFD>W0GB@qNFEDkVI@Qn!g"bHas8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<726i8j(Sgtp]-bKJ,S`5T^6`Pp$Ec,@T?L4">XA7^+7I=$<hH[C0fH[U6fI=$<h
-H[C0sKS4]!I>EQ0LkLG?Mi<"0I>j)CH[C1"Mi<UQN/W[RN/NXRMi<UQN;rqXs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQdaZjkbg")F`Oidr]=bhh]Y1\Z['[3I
-]=bha['[HX]nh>p<)ck"9Lr,^<F]QNN/NXAH[Uj2N-fo"N/NXAH[U6fI=$<hH[C0sKS4]!I=$<h
-N/NXAH[U^'KSY;7N/NXRMi<UQN/W[Rs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+QpA+(Hp#tc2g"bH;gtpK/f$`(!bKS5L`PoI%]t:qj]=bhh]Y1\Z['[3I['[3@XKAk:['[3I
-X/rG(XKAP)XfJP*S=Z6pFED#'AUAcPH[C0fH[U6fI>EQ0H[C0sKS4]!I=$<hH[C0fH[U6fI=$<h
-GB@qACi4THI;3S9GB@qACi4!(DI[3gC2@ctA7]LlDJF!*C2@d&Ci4H=FF/@_H[C0fH[U^'KR8&o
-LkLG?Mi<UQN/W[RN/NX_PEUr`N1?K0i8j)$s8W-!s8W-!m.9o6m-ilnkLnYIbKS5L`PoI%]rS6:
-Unsl_V50o`Unji_Unsl%Ci2*e1c7*H2)I-B/1i_91bL=22)I-O4?YPY1cmf_8k_s'FED86DKg2E
-C2@d3FED_KFF/@_GB@qNFED_KFD>W0GB@qACi4H=FD>W0GB@qACi4!(DJF!*C2@e"]Y37akLnYI
-daZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7@St'Fu>"(hJ8k_rJ6q'^A9gqH=8k_rJ6q'O477BU5
-8k_rJ6q(*E6"=G:H[C0fH[U6fI=$<hH[C0fH[U^'KR8&oH[C0bFEDkVI<TdTH[C0bFEDkVI=$<h
-H[C0bFED_KFF/@_daZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<[_G
-kj7crjQGI^kMYFag"bH:bfcNJS8)kX<)cjs<)m$o84lQM8k_rO9MJV_84lQM8k_rO9MJV_85rPg
-8k_rO9MJJc<EMpc<)cji9MJJc<E)pt<)cjs<)m%*?;sm(=Bo03<)lms<E)pt<)cjs<)lms<CK;E
-2)I-O4?ZYC<JGmJUnsm*`Pp9Tf!qi^=Bo07>[CN;?<CH==Bo0F>Zt67?<CH==Bo0F>Zt67?>!MH
-=Bo03<)lms<E)pt<)cjs<)m%*?>!MH<)cjZ4?Z;19k.^FR?NiQ`PqKCq>^Kps8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+(Hp%7tRkj7d%m-ilnkMYFag"bH;gtp`>hSdCPS=Z6tH[TXFDKg2EGB@qACi4H=FD>W0
-C2@d3FED_DCNjlBGB@qNFED_KFE_hKGB@qRH[U6fI<TdTH[C0bFED_KFE_hKC2@d&Ci4!(DJF!*
-GB@qACi4H=FF/@_X/rG]jQHRCs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n)39i
-i8j(Sgtp`>hV$]@daZjreCMRW`MB?+N/NXAH[U*[FE_hKC2@d&Ci3`nARf7^C2@d&Ci4H=FE_hK
-GB@q/>[Bl_4C_o5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\m.9o6m-iW_hV$]@daZk$gtpK/f$`(!daZk$gtoug`Hur[H[C0fH[U6fI<TdT
-H[C0bFED_KFD>W0C2@d3FEE=lKXA+nm.9oMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hV$]@
-bKS5Sbg")F`Pfa7`5T^&['WG!9m:]$H[C0fH[U6fI=$<hH[C0fH[U6fI=$<hH[C0sKS4]!I>EQ0
-LkLG;KS5/7KSY;7H[C1"Mi<UQN/3.?['[4?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s6T@Mkj7crjQG4OhTO-f`5T^6`PoI%]sP/R]=bhh]Y1\Z[(Eua['[31St&DH9iP(l
-8k_rY<)na-KT(hJN/NXNKS5;BN-fo"H[C0fH[U6fI=$<hH[C1"Mi<"0I>j)CLkLG.H[Uj2N-fo"
-N/NXRMi@#op&G'ls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_JAp#+oo
-g"bH;gtpK/f$`(!bKS5L`PoI%]t:qj]=bha['[3I['[3I['[3@XKAk:[&^:1['[3@XKAP)XfJP*
-X/rF^Mi<"0I=$<hN/NXAH[U6fI=$<hH[C0fH[U6fI=$<hH[C0bFED_KFE_hKH[C0UCi4H=FD>W0
-@q9.\A7]7]ASQ%!@q9.cCi4H=FD>W0GB@qRH[U6fI=$<hLkLG.H[Uj2N-fo"N/NXRMi<UQN1?K0
-`5T^qs8W-!s8W-!s8W-!s8V`bq<726i8j(LeCMgec,@T?['[3I['ZX*Unji_Unsl_V50o`Uj$Zk
-2)I-I1c.'H1c7*H2)I-B/1iJ*/N#@A2)I-I1c.fu9knK^C2@d&Ci4!(DKg2EC2@d&Ci4!(DJF!*
-C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DS*Qpkj7ckgtpK/f#5PH]=bha['Zm8XdkuQ
-S=Z7@St)=BS=H1@B3\V/6q'^A9iXVJ779RE76s@177BU5779R:9MIu>4@MY,779RH>[Dc(I>EQ0
-H[C0sKS5/7KSY;7LkLG.H[U6fI=$<hH[C0fH[U*[FF/@_GB@qNFED_KFE_hKGB@qNFEGs\f)PdM
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVkj7d%m-ilnkMYFa
-g"bH;gto*5XbM4M<)cjs<)lOa9hJ)R8k_r]9LqcL9hJ)R8k_rO9MJ,Q9iP(l8k_rY<)lms<E)pt
-=A27b<)lms<E)pt<)cjs<)m$o85rPg=A27b<)lms<E)pt@q9/,KS6k;Wm]DJi8j(ZjQG4OhVdJX
-g"bGk['We3<E)pt<)cjs<)lms<E)pt<)cjs<)m$o85rPg<)cjs<)lms<E)pt<)ck"9Lr8j??^7%
-H[C1"Mi<UQN2s%^g"bHNoC`.`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=j7=
-kj7d%m-j0)n)39ii8j(Sgtp`>hU9p)['[3!Mi;k%FE_hKC2@d3FED86DKg2EGB@qNFED_KFD>W0
-GB@qNFED_KFF/@_H[C0fH[U6fI<TdTGB@qACi4!(DJF!*C2@d&Ci4THI@Qn!bKS62s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+Em-j0)n*'-,i8j(ZjQG4OhV$]@
-g"bH;gtpK/f"8T.R?NhYFED86DI[3g=Bo07>[CN;?>=:o@q9.cCi3`nAO\gF=Bo2!oC`.`s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-kj7crjQG4OhWEVKg"bH;gtq2KgtCK>i8j(.['YXBKR8&oGB@qRH[U*[FD>W0C2@d&Ci52iN6BGi
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726g"bH;gtp5uc-+>U`5T^6`Pp$Ec%^Um
-=Bo0VFED_KFE_hKGB@qNFED_KFE_hKGB@qRH[U6fI=$<hH[C0sKS5/7KT(hJN/NXRMi<UQN/W[R
-H[C1"Mi@]9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#+oo
-g"bH4eCMRW`Pfa7]=bhh]Y1\Z['[3I['[3P]Y1\Z[%sOo8k_rY<)lOa9iP(lH[C0sKS5/7KSY;7
-LkLG;KS5/7KSY;7H[C0fH[U6fI=$<hH[C0sKS4]!I>EQ0LkLG?Mi<IFKT(hJdaZkJs8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC_>6n)39ig"bH;gtpK/f$`(!
-bKS5L`Pod7`Oidr]=bhh]Y1\Z['[3I['[3I['Zm8XgGIBX/rG(XKAP)XfJP*X/rG!V50'.N/W[R
-N/NXRMi<"0I=$<hH[C0fH[U6fI<TdTC2@d3FED_KFD>W0GB@qACi4!(DI[3g@q9.\A7]7]ASQ%!
-C2@d3FED_KFE_hKH[C0fH[U6fI>EQ0H[C0sKS5;BN1#ln`5T^qs8W-!s8W-!s8W-!s8W-!s8W-!
-m.9o6m-iW_hU9p)bKS5L`PoI%]rS6:X/rG!V51/nXe_ehUnsl6H[S=N77KF&2)I-Z4ZkSY1c7*H
-2)I-I1c.'H1bL=2779RZCi4!(DJF!*C2@d&Ci3`nASQ%!@q9.\A7]7]ASQ%!@q9.\A7]7]ARf7^
-@q9.\A7]7]ASQ%!C2@e"]Y37akLnYIdaZjkbg!c4]sP/RX/rFnSt)UQUn"$HUnslWSt'P3DFHr^
-779R56q'O477BU5779R:9MJ,Q9gqH=8k_rO9MIrD79Ef$H[C0sKS5/7KR8&oLkLG.H[U^'KT(hJ
-H[C0sKS4]!I=$<hGB@qNFED86DJF!*C2@d3FED_KFE_hKdaZkJs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+(Hp#tc2kj7d%m-ilnkMYFag"bHBjQFJ#`LNNi
-GAV+p<)lOa9hJ)R8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9iP(l<)cjs<)lms<E)pt<)cjs<)lms<E)pt
-8k_rY<)n-aFIA>V]=bi1gtq8]n*'-,kj7d%m-j0)n*'-,kj7crjQGI^kI\C?=Bo07>[CB/<E)pt
-<)ck-A7]LlDKg2EH[C1"Mi=0tS><!W['[3[]Xl;1c.Un/i8j(bm-j<4p$D;Co_/+QpA+@Sq>^Kp
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVkj7d%m-j0)n*'-,
-i8j(ZjQGI^kLnYIdaZjT['Z6bPC%Y)GB@qACi4H=FD>W0H[C0bFEDkVI<TdTH[C0fH[U6fI=$<h
-H[C0bFED86DKg2EC2@d7H[V<GPJkGZm.9oMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq>^Kpo_/+Em-j0)n*'-,i8j(ZjQGI^kLnYIi8j(ZjQGI^kL.l2
-['[2rKS3H4?<CH=@q9.\A7]7]ASQ%!779S'Mi@]9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2kj7crjQGann)39i
-kj7d%m-j<4p#tc2R?Nh]H[U6fI<TdTGB@qRH[V]dV!.16s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\m.9o.jQG[\gsX^'bKS5Sbg")F`Pfa7['[249MK8<DJF!*GB@qNFED_KFE_hK
-GB@qACi4THI;3S9H[C0fH[U6fI>j)CLkLG;KS5;BN/3.?N/NXNKS5/7KWD2Vs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIbKS5L`PoI%]t:qj
-['[3[]Xk_f]sP/R]=bhQV5-^W9it([8k_r]9LrZ(AVc"mLkLG;KS4]!I>j)CH[C0fH[U6fI=$<h
-H[C0fH[U6fI=$<hH[C0fH[U6fI>j)CH[C0fH[WN=^&S-4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-ilnkMYFag"bH;gtpK/f$`(!bKS5Sbg")F`Pfa7
-]=bhh]Y1qi]sP/R]=bha['[3I['[3I['[3I['[3I['[3I['[3I['Zm8XdkuQLkLG.H[U6fI=$<h
-H[C0UCi4H=FD>W0C2@d3FED86DJF!*@q9.\A7]7]ARf7^@q9.\A7]LlDJF!*C2@d7H[U6fI=$<h
-H[C0fH[Uj2N3ot!g"bHVpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^
-]=bhh]Y1AIXgGIB['[3I['[3I['[3IUnslGMi;jsCJ%8p7Qik'4Zkeg4Z,&Q2)I-I1c.Wh7;?XV
-C2@d&Ci4!(DJF!*@q9.cCi3`nASQ%!@q9.\A7]LlDI[3g@q9.\A7]7]ARf7^@q9.\A7]LlDS*Qp
-kj7ckgtp`>hTO-f`5T^-]Y1\Z[&^:1UnslfXKAP)XfJP*X/rG!V50'.N-BAc=Bo0)9MJ,Q9gqH=
-<CK2B6q'^A9gqH=8k_r]>[Dc(I>EQ0LkLG;KS5/7KR8&oLkLG.H[U^'KR8&oH[C0fH[U6fI;3S9
-GB@qNFED_KFD>W0GB@qACi7\Nf)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+@Sq<726kj7d%m-j0)n)39ii8j(ZjQG4OhTO-fUnsl6H[TC7AP,Wj
-8k_rO9MJ,Q9iP(l8k_rY<)lms<E)pt<)cjs<)m%*?>=:oLkLGOSt*F*^#7u7kj7d%m-j<4p%7tR
-o_/+QpA+@Sq=OCVm.9o:oC_kEkNM:$kj7ckgto*5Xh26Z`5T^=bg"hrhVdJXi8j(bm-j0)n*'-,
-kj7d%m-j0)n*'-,m.9o:oC_bLq=OCVo_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVp[%)0oC_>6n*'-,kj7d%m-ilnkMYFa
-i8j(Sgtoug`MB?+S=Z7,KS4]!I<TdTGB@qNFEDkVI<TdTGB@qACi4THI>j)CS=Z7X['\92f(A\3
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\o_/+IoC_JAp#tc2kj7d%m-j0)n*'-,i8j(foC_>6n*KZ=g"bG[V5/<WFD>W0
-@q9.cCi7G?c2[hDs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+ILkNqg5kj7d)oC_JAp%7tRo_/+QpA*Y-kBhQ(
-H[C1"Mi>Tn`Urm"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39i
-g"bH4eCMgec-+>U`5T^6`PmXdKN(oNGB@qNFEDkVI=$<hGB@qRH[U6fI=$<hH[C0bFED86DL6_Y
-H[C0fH[U6fI=$<hLkLG;KS5/7KT(hJLkLHJoC`.`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#5PH`k8mp]Y1qi]sP/R]=bha['[3I[%*_X
-8k_rO9MJ,Q9hJ)R=Bo0gKS5;BN-fo"N/NXAH[U6fI=$<hH[C0fH[TXFDKg2EH[C0fH[U6fI=$<h
-H[C0fH[U^'KR8&oX/rH's8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq=OCVm.9o:oC_&&kMYFag"bH;gtpK/f$`(!bKS5Sbg">Tc,@T?`5T^6`PoI%]t:qj
-]=bhh]Y1qi]t:qj]=bhh]Y1qi]u7n/]=bhq`PoI%]sP/RS=Z7,KS4]!I=$<hC2@d&Ci4!(DJF!*
-C2@ctA7]7]ARf7^=Bo0BA7]7]ARf7^C2@d&Ci4!(DJF!*LkLGOSt*a<`TZ[Ws8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH4eCMRW`Pfa7]=bha['[HX]t:qj
-]=bhh]Y1qi]t:qj`5T^-]Y1,;Ul:4j@q9.>6q'R.4@VIr8k_s'FED_KFD>W0C2@d3FED86DJF!*
-C2@d&Ci4THI=$<hN/NXbSt)UQUpRM9]=bi#bg"Scf&5WPkj7d%m-j0)n)39ig"bH4eCN'tf#5PH
-]=bha['[3I['[3I['[3I['[3I[(Eua['[3I['[HX]sP/RS=Z70Mi;CeDH'S87Qik&6q(*E6!.Au
-H[C0sKS5/7KSY;7N/NXAH[U^'KR8&oH[C1"Mi<UQN1?K0UnslfXKB+I]t:qjbKS5agtq8]n*KZ=
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+\s8V`bq<726kj7d%m-j0)n)39ii8j(ZjQGI^kMYFag"bH-bg!N%[%*_XQ]-fXKS5/7KT(hJ
-N/NXbSt*0p[)Br&daZk+jQGann*'-,kj7d)oC_JAp%7tRo_/+QpA+ags8W-!o_/+\s8V`bq=OCV
-o_/+QpA+@Sq=OCVkj7d%m-j0)n*'-,kj7d%m-j<4p#tc2o_/+Em-jT?q=OCVm.9oBpA+@Sq=OCV
-o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+IoC_JAp#tc2kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
-g"bH4eCMRW`Oidr`5T^-]Y2M4c.Un/kj7d)oC`.`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-o_/+QpA+(Hp$D;Cm.9o:oC_JAp$D;Co_/+QpA+ags8W-!s8W,PgtoEF[/^1+s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVs8W-!s8W-!s8W-!s8W,Pgtp`>hXpO;s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7ckgtpK/f$`(!bKS5L`Pod7`Q#R%
-8k_roCi4!(DKg2EH[C0UCi4THI=$<hGB@qNFED86DJF!*C2@d7H[TXFDL6_YH[C1"Mi<"0I>j)C
-H[C1"Mi=0tSH&Whs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,+['WG!:"e=Y
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,coC_&&kLnYIdaZjd`Pod7`Oidr['[3I['[3I[(Eua]=bhDN/C5$9gqH=8k_rO9MJJc<JZ<]
-H[C1"Mi<"0I>j)CH[C0fH[U6fI=$<hH[C0UCi4THI;3S9H[C0fH[U6fI=$<hH[C0fH[VEUSH&Wh
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV
-m.9o6m-ilnkMYFag"bH;gtp`>hU9p)daZjkbg">Tc-+>UbKS5Sbg")F`QQKM`5T^6`Pod7`Pfa7
-`5T^6`Pp$Ec,@T?daZjkbg"Scf#u:^]=bhXXKA"aS9oU2GB@qACi4!(DI[3g@q9.\A7]7]ARf7^
-@q9.pFEEJ"N2s%^bKS5toC_bLq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq<[_Gkj7crjQG4OhV$]@bKS5Sbg")F`Pfa7`5T^6`Pod7`QQKMbKS5Sbg")F`QQKM
-bKS5ZeCN'tf$`(!X/rF^Mi;CeDN'L4S=Z7OXKB+I]u7n/daZk+jQGann+?>Ls8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Cm.9o6m-ilnkLnYIdaZjd`Pod7`Oidr]=bhh]Y1qi]t:qj
-`5T^-]Y28&`Oidr`5T^6`Pp$Ec-k+mdaZk$gtoug`MB?+LkLG.H[VEUS?&`n['[3Y`Pp$Ec.Un/
-i8j(bm-j<4p%7tRs8W-!s8W-!s8W-!o_/+\s8W-!s7H$\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCV
-m.9o:oC_>6n*'-,kj7d%m-ilnkNM:$i8j(ZjQGI^kMYFai8j(ZjQGann*'-,kj7d%m-j0)n*'-,
-m.9o:oC_bLq=OCVo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVs8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+IoC`.`s6T@Mm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp%7tR
-o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjkbg">Tc-+>U`5T]SMi:8%9m:]$C2@d3FED_KFE_hK
-C2@d&Ci4THI;3S9H[C0UCi4!(DJF!*H[C0UCi4THI=$<hH[C0fH[U6fI=$<hi8j)$s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8UNsejVtq779R:9MNsbf)PdMs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7crjQFt@f#u:^
-]=bhh]Y1qi]t:qj['[3P]Y1\Z[!-V6779R:9MJ,Q9hJ)R8k_s<Mi<"0I>j)CH[C0fH[U6fI=$<h
-H[C0fH[U6fI<TdTH[C0fH[TXFDL6_YC2@d7H[U6fI=$<hR?Nj7s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o:oC_>6n)39i
-i8j(Sgtp`>hV$]@g"bH4eCN'tf#u:^daZjkbg">Tc-k+mbKS5ZeCN'tf$`(!daZjreCN'tf$`(!
-g"bH;gtpuMkMYFai8j(bm-iW_hTO-f`5T^-]Y28&`OidrdaZk+jQGn$p&G'ls8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp$D;C
-i8j(Sgtp`>hU9p)bKS5Sbg">Tc-k+mdaZjkbg">Tc-+>UdaZjreCN'tf%Jj8i8j(ZjQGann*KZ=
-o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,coC_JAp#tc2i8j(Sgtp`>hU9p)daZjd`Pod7`Pfa7`5T^=bg")F`Pfa7bKS5Sbg">Tc-+>U
-daZk$gtpuMkMYFai8j(foC_JAp$D;Co_/+QpA+@Sq=OCVo_/+QpA+@Sq>^Kps8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9oBpA*q=n*KZ=
-kj7d%m-j0)n*'-,kj7d)oC_>6n*KZ=kj7d)oC_>6n+?>Lo_/+QpA+@Sq=OCVs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+ags8W-!s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
-g"bH;gtpK/f#u:^`5T^6`PoI%]h1sm@q9.cCi4!(DKg2EC2@d&Ci4!(DKg2EC2@d7H[TXFDJF!*
-C2@d&Ci4!(DJF!*C2@d7H[U6fI=$<hH[C1"Mi@]9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s5;u$779R+4?Z.s4@MY,8k_t-eCO["s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjkbg")F`Oidr['[3I['[HX]sP/R
-['[2><)l@T77p6J779R:9MJ,Q9m_58H[C1"Mi<"0I=$<hH[C0fH[U6fI=$<hH[C0fH[TXFDL6_Y
-C2@d7H[U*[FE_hKC2@d7H[Uj2N;rqXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o:oC_JAp#+ooi8j(ZjQG4OhV$]@
-g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@i8j(ZjQGI^kMYFai8j(bm-j0)n*KZ=
-m.9o:oC_bLq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC_>6n*'-,g"bH;gtpK/f%Jj8
-g"bH;gtpK/f%Jj8g"bH;gtp`>hV$]@i8j(ZjQGI^kNqg5m.9oBpA+@Sq=OCVs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o:oC_JAp#+oo
-i8j(SgtpK/f$`(!daZjkbg"Scf$`(!daZjreCN'tf$`(!daZjreCN=.hV$]@i8j(bm-j<4p$D;C
-m.9oBpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
-m.9oBpA+@Sq=OCVo_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5Sbg")F`QQKM
-N/NWe9MK8<DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DKg2EC2@d&Ci4!(DJF!*
-C2@d7H[TXFDUR%cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+@Sq>^Kpkj7b;<)l"B4Zbbh
-4$5Yf4?Z;19o+IUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s6T@Mkj7crjQFt@f#u:^`5T^-]Y1qi]sP/R]=bha['Z6bP=7l.779R56q'^A9gqH=
-=Bo0kMi<"0I=$<hH[C0fH[U6fI=$<hH[C0fH[TXFDL6_YH[C0UCi4THI;3S9C2@d7H[TXFDKg2E
-N/NYps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+@Sq<[_Gm.9o:oC_>6n*'-,i8j(ZjQGI^kLnYIi8j(Sgtp`>hV$]@
-g"bHBjQG4OhVdJXi8j(ZjQGI^kMYFakj7d%m-j<4p$D;Cm.9o:oC_bLq>^Kps8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+(Hp$D;Cm.9o6m-ilnkMYFag"bH;gtp`>hV$]@g"bHBjQG4OhVdJX
-i8j(ZjQGI^kMYFakj7d)oC_JAp$D;Co_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp$D;Ckj7d%m-ilnkMYFag"bH4eCN'tf$`(!
-daZjreCN'tf$`(!daZk$gtp`>hV$]@i8j(ZjQGann*KZ=m.9o:oC_bLq=OCVs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+ags7H$\o_/+QpA+@Sq=OCVm.9oBpA+ags7H$\o_/+\s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA*q=n)39idaZk#bfe2Rc,@T?bKS5N]Xg^/9knK^C2@d&Ci4!(DJF!*
-C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*H[C0UCi4!(DJF!*C2@d&Ci4!(DJF!*H[C2@s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o:oC_>6n*KZ=m.9o6m-eFpAMl;$2)I-O4?Ybg4[hb-@q9.tH[WiO`W,u<
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQ
-g"bH-bg")F`O*"Z]=bha['[HX]sP/R@q9.>6q'O479)cB779R56q(TrAUAcPH[C0fH[U6fI=$<h
-H[C0fH[U6fI;3S9H[C0UCi4!(DL6_YC2@d7H[TXFDL6_YC2@d&Ci6&FV#UJps8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-o_/+IoC_JAp#tc2i8j(bm-ilnkMYFai8j(SgtpuMkLnYIi8j(Sgtp`>hV$]@i8j(ZjQGI^kMYFa
-i8j(bm-j0)n*'-,kj7d)oC_JAp$D;Co_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV
-m.9o:oC_>6n*'-,i8j(ZjQG4OhV$]@g"bHBjQG4OhV$]@i8j(ZjQG4OhVdJXi8j(ZjQGann*'-,
-m.9o:oC_bLq=OCVo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VHWp$D;Cm.9o6m-j0)n)39ii8j(Sgtp`>hU9p)daZk$gtpK/f%Jj8daZk$gtp`>hU9p)
-g"bH;gtpuMkMYFam.9o6m-j<4p$D;Co_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags7H$\
-o_/+\s8V`bq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+ags8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-i8j(SgtpK/f#u:^bKS5Sbg")F`Jf_68k_rhA7]LlDJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*
-C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci721`W,u<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n*'-,
-i8j(ZjQGI^kBhQ(/hAS31c.'H1cmf_4$5Z.>[Dc(I=$<hH[C2@s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtpK/f#u:^]=bhh]Y1\Z[(Eua
-['[31St&5;77KF&779R56q'O477BU5C2@d7H[U6fI=$<hH[C0fH[TXFDL6_YC2@d&Ci4!(DJF!*
-C2@d&Ci4!(DJF!*H[C0UCi4!(DJF!*['[4?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVm.9o6m-j0)n)39i
-i8j(ZjQG4OhVdJXg"bH;gtp`>hVdJXg"bHBjQG4OhVdJXi8j(ZjQGann)39ikj7d%m-j0)n*KZ=
-m.9oBpA+@Sq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o:oC_JAp#tc2kj7crjQGI^kLnYI
-g"bH;gtpuMkLnYIi8j(ZjQG4OhVdJXi8j(ZjQGI^kMYFakj7d%m-j0)n*KZ=m.9o:oC_JAp$D;C
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+(Hp$D;Cm.9o6m-j0)n*'-,
-i8j(ZjQG4OhV$]@g"bH4eCN'tf$`(!g"bH4eCN=.hU9p)daZk$gtp`>hVdJXi8j(ZjQGI^kNqg5
-m.9o:oC_bLq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq>^Kpo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2daZjkbg")F`Pfa7
-`5T\p<)mF=ARf7^@q9.\A7]LlDJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*
-C2@d&Ci4!(DJF!*o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(Sgtp`>hV$]@R?Ngl1c-g9/N#@A
-/hAS31c.fu9m:]$GB@qRH[U6fI@Qn!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjkbg")F`Oidr['[3I['[3IZrgR>4$5Yf4?Z,$77BU5
-779R:9MKk\I=$<hH[C0fH[U6fI=$<hC2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DL6_Y
-C2@d&Ci7\Nf)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o:oC_JAp#tc2kj7crjQGI^kMYFai8j(SgtpuMkLnYI
-g"bH;gtpuMkLnYIi8j(ZjQGI^kMYFai8j(bm-j0)n*'-,m.9o:oC_JAp$D;Cm.9oBpA+(Hp%7tR
-o_/+\s8V`bq>^Kpo_/+\s8V`bq=OCVs8W,kpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+IoC_bLq<[_G
-o_/+IoC_bLq<[_Gm.9o:oC_>6n*'-,i8j(bm-ilnkMYFai8j(SgtpuMkLnYIg"bH;gtp`>hVdJX
-g"bHBjQG4OhVdJXi8j(ZjQGann)39ikj7d%m-j0)n*KZ=m.9o6m-j<4p$D;Cm.9o6m-j<4p#tc2
-kj7d%m-j0)n*'-,kj7d%m-j<4p#tc2kj7d%m-j0)n)39ii8j(ZjQG4OhV$]@g"bH;gtpK/f$`(!
-daZjreCN'tf%Jj8g"bH;gtpK/f%Jj8daZk$gtpuMkMYFakj7d)oC_JAp$D;Co_/+QpA+ags8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH4eCMgec-+>UbKS5L`Pn7/P<1li@q9.\A7]7]ARf7^
-@q9.\A7]LlDI[3gC2@d&Ci4!(DJF!*@q9.\A7]7]ASQ%!C2@d&Ci4!(DJF!*@q9/OXKDO&s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s6T@Mkj7ckgtp`>hU9p)daZjDV5-184Z,&Q/hAS,/1i_91cmf_C2@d&Ci4!(DKg2E
-H[C0fH[WiO`W,u<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
-i8j(SgtpK/f#5PH]=bhh]Y1qi]sP/RLkLFC4?Ybg4Zbbh4$5Yf4?Z,$7:Tk>H[C0fH[U6fI=$<h
-H[C0UCi4THI;3S9C2@d&Ci3`nARf7^@q9.\A7]7]ARf7^C2@d&Ci4!(DJF!*i8j)$s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\s8W,kpA+ags7H$\s8W,kpA+@Sq>^Kpo_/+QpA+(Hp#tc2
-kj7d%m-j0)n)39ii8j(ZjQGI^kLnYIg"bH;gtpK/f$`(!bKS5ZeCN'tf$`(!bKS5ZeCN'tf$`(!
-daZjreCN'tf$`(!daZjreCN=.hV$]@g"bH;gtpuMkLnYIg"bH;gtp`>hV$]@g"bH;gtp`>hU9p)
-g"bH4eCN'tf$`(!daZjreCN'tf$`(!daZjreCMgec-k+mbKS5Sbg">Tc-+>UbKS5Sbg">Tc,@T?
-`5T^6`Pod7`Pfa7]=bhh]Y1qi]t:qj]=bhh]Y1qi]t:qj]=bhh]Y1qi]t:qj['[3P]Y1qi]t:qj
-]=bhh]Y1qi]t:qj]=bhh]Y1qi]sP/R]=bha['[3I[(Eua['[3I['[3I[(Eua['[3@XKAk:[&^:1
-['[3@XKAk:[&^:1X/rG(XKA:pUoUT!Unsl_V50WQS><!WS=Z7@St)=BS><!WS=Z7@St)=BS=H1@
-S=Z7@St)=BS=H1@Unsl_V50o`UoUT!X/rG(XKAk:['[3I['[3P]Y1qi^!"XEs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!kj7cF['Z?pS=H1@S=Z7@St)=BS=,S)S=Z7@St)44PFS57S=Z7=PEVN.S=H1@
-S=Z70Mi=0tS=H1@N/NXbSt)44PF7VuS=Z7=PEVDuPF7VuR?Ni&PEVDuPF7VuN/NX_PEVDuPF7Vu
-R?Ni&PEUr`N/W[RN/NX_PEUr`N/W[RR?NhnMi<UQN1#lnN/NXRMi<UQN/W[RN/NXRMi<UQN/W[R
-N/NXRMi<UQN/W[RLkLG;KS5/7KSY;7LkLG?Mi<IFKSY;7N/NXNKS5;BN/3.?LkLG;KS5/7KSY;7
-H[C1"Mi<IFKSY;7H[C0sKS4]!I>3,rH[C0fH[U^'KR8&oH[C0qI!^3eI=$<hH[C0fH[U6fI=$<h
-H[C0fH[U6fI=$<hH[C0bFEDkVI<TdTGB@qNFED_KFE_hKGB@qNFED_KFE_hKGB@qNFED86DKg2E
-C2@d3FED86DKg2EC2@d3FED86DKg2EC2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*
-C2@ctA7]LlDI[3gC2@ctA7]LlDI[3gC2@ctA7]LlDJ*3X@q9.\A7]7]AS57O@q9.\A7]7]ARf7^
-@q9.\A7\kJ?>!MH=Bo0F>Zt67?=RMW=Bo0F>Zt67?>!MH=Bo07>[CB/<ENL4<)ck">[CB/<ENL4
-<)ck">[CB/<ENL4<)cjs<)lms<E)pt<)cjs<)lms<E)pt<)cjs<)lOa9it([8k_r]9LqcL9it([
-8k_rO9MJV_84lQM=A27X9MIrD77p6J779R:9MJ,Q9gqH==A27X9MIrD77p6J779R56q'O477BU5
-779R56q'O477BU5779R56q'O477KF&4$5Yp6q'1"4[qRs4$5Yq4Zkeg4[qRs4$5Yq4Zkeg4Z,&Q
-4$5Y`1c.9V4Z,&Q4$5Y`1c.9V4Z,&Q4$5Y`1c.'H1c7*H2)I-I1c.'H1c7*H2)I-I1c.'H1c7*H
-/hAS31c-g9/M8S+/hAS,/1i_91bL=22)I-I1c.'H1bL=22)I-B/1iJ*/M8S+/hASe>[%1-s6T@M
-kj7crjQG4OhU9p)bKS5L`Pod7`Pfa7<)cjs<)mF=ARf7^=Bo0BA7]7]AQW2D@q9.Q>[CoNAQW2D
-@q9.\A7]7]AQW2D@q9.cCi3`nARf7^@q9.\A7]7]AaK$]s8W-!s8W-!s8W-!s8W-!s8W-!s+YoJ
-'b1Zk)]BG$%2B?^)B0S0%Lj-_%2B?^'b1Zf%Lj-_%2B?^'b1Zf%Lj-_%2B?^$k!IP$OdFO$l'6]
-$k!IY%Lj-_%2B?^'b1Zf%Lj-_%H-=1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hV$]@
-daZjkbg!N%ZpdAO2)I-I1c.'H1bL=24$5Z9A7]7]ASQ%!C2@d3FEDkVI<TdTH[C1ogtr)2s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hV$]@bKS5L`Pod7`Oidr
-['[3!Mi9_[4Z,&Q4$5Yf4?Ybg4[hb-779RZCi4THI=$<hH[C0UCi4THI;3S9C2@d&Ci4!(DJF!*
-@q9.\A7]7]AQW2D=Bo07>[CoNARf7^C2@d7H[Xi5k7nI9"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-">25WH[C1abg$1fs8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V<Ln$KI/C2@c+)]Ah\"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"B\o8o_/+Em-ilnkLnYIdaZjkbg">Tc,@T?
-`5T]cSt%Yp1h1'-@q9.Q>[CoNARf7^@q9.\A7\kJ?=RMW=Bo07>[CoNAQW2D@q9.\A7]7]ARf7^
-@q9.\A7]7]AQW2DS=Z8Ns8W-!s8W-!s8W-!s8W-!s7H$\i8j&(!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]O,:*<hs8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQg"bH4eCMgec+CX%<)cjZ4?YPY1c7*H
-2)I-O4?ZeO?>=:o@q9.cCi4!(DJF!*C2@d3FEDkVI>j)CdaZkJs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,coC_>6n)39ig"bH4eCN'tf#5PH]=bha['Y1,I5Ni<2)I-I1c.9V4Z,&Q
-4$5Yf4?ZeO?@.$IC2@d7H[TXFDL6_YC2@d7H[TXFDJF!*C2@ctA7]7]ARf7^=Bo0BA7\kJ?<CH=
-@q9.\A7]LlDOd;gS=Z5R!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]`1c0Q+IF?Wrs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/*m]Y/&rDBpGP"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J_<]Y3\'p#tc2i8j(Sgtp]-bKJ,SbKS5L`Pod7`E6AO8k_rhA7\kJ?>=:o
-@q9.\A7]7]ARf7^@q9.Q>[CoNARf7^@q9.\A7]7]ASQ%!@q9.Q>[CoNAQW2D@q9.Q>[H+=hZ*WU
-s8W-!s8V`bq=OCVm.9o:oC[<LF9DXJ"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/Unsmes8W-!s8W-!
-s8W-!s8V`bq<726i8j(SgtpK/f#u:^`5T]1Ci2<s4Zbbh2)I-I1c.'H1fRFSC2@d&Ci4!(DJF!*
-C2@d7H[U6fI=$<hGB@qRH[TXFDN'L4daZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
-i8j(ZjQFt@f#u:^`5T^6`Pn@=S4ZIL/hAS,/1iJ*/M8S+2)I-I1c.9V4[hb-C2@d&Ci4H=FD>W0
-H[C0UCi4!(DJF!*C2@ctA7]7]AQW2D@q9.\A7]7]ARf7^=Bo0BA7]7]ASQ%!C2@dp['VG:/Hc+X
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
-"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/(BO^B!X&W-"9\c/(BO^B!X&W-"9\c/(BO^B!X';@"9\c/
-(BO^B!X';@"9\c/(BO^B!X';@"9\c/(BO^U!X&W-";_+B(BO^U!X&W-";_+B(BO^U!X&W-";_+B
-(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^U!X';@";_+B
-(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^e!X';@"=F6R(BO^e!X';@"=F6R
-(BO^U!X'kP";_+B-NXDe!X'kP";_+B-NXDe!X'kP";_+B-NXDe!X'kP"=F6R-NXDu!X'kP"=F6R
--NXDu!X'kP"=F6R-NXDu!X'kP"=F6R-NXDu!X'kP"=F6R-NXDu!X'kP"=F6R-NXDu!X'kP"=F6R
--NXDu!X'kP"=F6R-NXDu!X)U,"K"R;ke+/"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W+r>=DWq"?HSe
-3W]FF!X(Oc"?HSe3W]FF!X)$q"?HSe3W]FF!X(Oc"@rRs3W]FF!X)$q"?HSe3W]FT!X)$q"?HSe
-8-/ob!X(Oc"@rRs8-/oT!X)$q"@rRs8-/ob!X)$q"@rRs8-/ob!X)$q"@rRs8-/ob!X)$q"@rRs
-8-/ob!X)$q"@rRs8-/ob!X)$q"@rRs8-/or!X)$q"BY^.8-/ob!X)U,"@rRs=98Ur!X)U,"@rRs
-=98V-!X)$q"BY^.=98V-!X)U,"BY^.=98V-!X)U,"BY^.=98V-!X)U,"BY^.=98V-!X)U,"BY^.
-=98V-!X)U,"BY^.=98V=!X)U,"BY^.=98V-!X*0<"BY^.=98V=!X)U,"D@i>=98V=!X)U,"D@i>
-=98V=!X)U,"D@i>BEA<M!X*0<"D@i>BEA<M!X*0<"D@i>BEA<M!X*0<"D@i>BEA<M!X*0<"D@i>
-BEA<M!X*0<"D@i>BEA<M!X*0<"F1%OBEA<M!X*cM"D@i>BEA<M!X*cM"D@i>Gle+^!X*cM"D@i>
-Gle+o!X*0<"F1%OGle+^!X*cM"F1%OGle+o!X*cM"F1%OGle+o!X*cM"F1%OGle+o!X*cM"F1%O
-Gle+o!X*cM"F1%OGle+o!X*cM"F1%OGle,)!X*cM"Gd*^Gle,)!X*cM"Gd*^Gle,)!X*cM"Gd*^
-L]R^8!X+;\"F1%OL]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^
-L]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^L]R^D!X+_h"Gd*^PQCuP!X+;\"I&rj
-PQCuD!X+_h"I&rjPQCuP!X+_h"I&rjPQCuP!X+_h"I&rjPQCuP!X+_h"J>f!PQCu\!X+_h"J>f!
-PQCu\!X+_h"J>f!PQCu\!X,.t"J>f!PQCu\!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X-G"3:-80
-p[%)$jQG4OhU9p)bKS5Sbg")F`Pfa7UnskK4?ZeO?<CH==Bo0ICi4!(DI[3gC2@ctA7]7]ARf7^
-=Bo0BA7]7]ARf7^@q9.cCi4!(DI[3g@q9.Q>[CN;?Asf$s8W-!s8W-!s7H$\m.9o6m-j0)n(HLQ
-"9J]/!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X-7T)#sX9s8W-!s8W-!s6T@Mkj7crjQFt@f$`(!
-bKS5SbftK]I76Om779R+4?Ybg4Z,&Q<)ck4Ci3`nASQ%!C2@d&Ci4!(DJF!*C2@d&Ci4THI;3S9
-H[C0NA7[hb4_&#6['[4,oC`.`s8W-!s8W-!s8W-!s6T@Mm.9o.jQGI^kL.l2daZjd`PmdoN(Qc<
-/hAS",:"lm/M8S+/hAS,/1iJ*/N#@A4$5Z.>[D/]DJF!*C2@d&Ci4!(DJF!*C2@d&Ci3`nARf7^
-@q9.\A7\kJ?=RMW=Bo0ICi4!(DJF!*C2@d&Ci4THIB0HO"9J]/!X&W-"9\c/"9J]/!X,h2"J>f!
-ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
-ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:99!X,.t"LA.4
-ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,h2"J>f!TE58&!X,.t"J>f!
-ZN:9&!X,.t"J>f!ZN:9&!X,.t"J>f!ZN:9&!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X+_h"J>f!
-PQCu\!X,.t"J>f!PQCu\!X,.t"I&rjTE57h!X+_h"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"O(=ds8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7ta7`&9TJ!X,h2"J>f!ZN:9&!X,.t"LA.4
-TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!
-ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,.t"LA.4ZN:99!X,.t"LA.4
-ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:9B$P'fW%^Q3>
-]F,4^$P'KE"M>*P]F,4U!X-.D%^Q3>ZN:99!X,h2"LA.4]F,4U!X,h2"LA.4ZN:99!X-.D%^Q3>
-ZN:99!X,h2"LA.4]F,4U!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:9B$P'fW%^Q3>ZN:9B$P'KE"M>*PZN:99!X,h2"LA.4kbX@(m-j0)n)39ig"bH4eCMgec-+>U
-`5T^6`Pkqa?:mmc@q9.\A7]7]ARf7^C2@ci>[CoNARf7^=Bo07>[CN;?=RMW=Bo0BA7]7]ASQ%!
-@q9.Q>[CoNARf7^=Bo1\eCO9cq=OCVm.9o6m-ilnkMYFag"bG.FE@We"?HSeZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:9pHsZjQs8W-!o_/+IoC_&&kLnYIdaZjkbg">Tc'acZ4$5Yf4?Z,$77BU5
-4$5Yu9MK8<DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DL6_YC2@d&Ci4H=FD>W0C2@cL4?YPY1cmf_
-@q9/=PEWr(`S'&'m.9o6m-ilnkLnYI]=bh9Mi;.VAM,Mc,U4Q[,:"NZ,VCW"/hAS,/1iJ*/M8S+
-/hAS31c/02<GH>fC2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*@q9.Q>[CoNAQW2D=Bo07>[D/]DJF!*
-C2@d&Ci4THI;3S9N/NWe9MGWk"9\c/"9J]/!X&W-"BY^.TE58&!X,h2"J>f!ZN:99!X,.t"LA.4
-TE58&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,.t"J>f!ZN:9&!X,.t"LA.4TE57h!X,h2"J>f!
-TE57h!X,h2"J>f!TE57h!X,.t"LA.4TE57h!X,h2"J>f!TE58&!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-PQCu\!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X+_h"J>f!TE57\!X,.t"I&rjTE57\!X,.t"I&rj
-TE57\!X,.t"I&rjTE57\!X+_h"J>f!PQCu\!X+_h"I&rjPQCuP!X+_h"I&rjTE57\!X,eG)X5f(
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq:L@<ZN:9&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,.t"LA.4
-TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!
-TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!
-TE58&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4ZN:99!X,.t"LA.4
-TE58&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X,h2"LA.4ZN:99!X-.D%^Q3>
-]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P
-]F,4U!X-.D%_N/Z]F,4U!X-.D%_N/Z]F,4^$P'fW%^Q3>]F,4^$P'fW%_N/Z]F,4^$P'KE"M>*P
-]F,4^$P'fW%_N/Z]F,4^$P'fW%^Q3>]F,4^$P'KE"M>*P]F,4^$P'KE"M>*P]F,4^$P'KE"M>*P
-ZN:99!X,h2"M>*P]F,4^$P'fW%_N/Z]F,4^$P'KE"M>*P]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P
-ZN:9B$P'KE"M>*P]F,4f,:)L>n*'-,i8j(SgtpK/f%A3ibKS5L`Pod7`MB?+4$5Z.>[CoNAQW2D
-@q9.\A7]7]ARf7^@q9.Q>[CN;?<CH==Bo07>[CoNAQW2D=Bo0BA7]LlDI[3g@q9.\A7^RMK^A='
-o_/+IoC_&&kMYFag"bH;gtp]-b6.kL"9J_!!X,h2"LA.4ZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>
-ZN:9B$P'KE"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ji#%.pA*q=n)39ig"bH;gtp5uc-+>UUnskK4?YPY1cmf_779R+4?Z;19m_58C2@d7H[TXFDJF!*
-C2@d&Ci3`nARf7^C2@d&Ci4!(DL6_YC2@d&Ci4!(DI[3g8k_r:1c.'H1aF:k/hAS",:#?54Zbbh
-779Qs/1hbZ)B'P5)B0S5)]BtH,U=T[,U4Q[,:"NZ,VCW"/hAS",:#-'1fRFS@q9.\A7]7]ARf7^
-@q9.cCi3`nASQ%!@q9.\A7]7]AQW2D=Bo0BA7]7]ARf7^C2@d&Ci4!(DJF!*C2@d&Ci5c7S-/lr
-"9J]/!X&W-"9\c/"9J_!!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"LA.4TE58&!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,.t"LA.4
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4
-TE57h!X,h2"J>f!TE58&!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57\!X,.t"J>f!TE57h!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X,.t"I&rjTE57h!X+_h"J>f!
-PQCu\!X,.t"I&rjTE57h!X+_h"J>f!TE57h!X+_h"J>f!TE57\!X,.t"J>f!PQCu\!X+_h"J>f!
-PQCu\!X+_h"I&rjTE57\!X,.t"J>f!PQCu\!X+_h"I&rjTE57h!X.28GlRgDs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8U]h]tYC$TE57h!X,h2"J>f!TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4
-TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
-ZN:99!X,.t"LA.4ZN:9&!X,h2"LA.4TE58&!X,h2"J>f!ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4
-TE58&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:99!X,h2"LA.4TE58&!X,h2"LA.4
-ZN:99!X,.t"LA.4TE58&!X,.t"LA.4ZN:9&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:9B$P'KE"M>*PZN:9B$P'KE"LA.4
-ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'fW%_N/Z]F,4^$P'fW%_N/Z
-ZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P
-ZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*P]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
-]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%^Q3>
-]F,4^$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*P]F,4U!X-.D%_N/Z]F,4U!X-.D%^Q3>
-]F,4U!X,h2"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%_N/Z]F,4U!X-.D%^Q3>]F,4U!X,h2"Qc//
-kj7d%m-ilnkLnYIdaZjkbg">Tc,@T?bKS4@A7\A,9k.^F@q9.\A7]7]AQW2D=Bo07>[CN;?<CH=
-=Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo0BA7]7]ARf7^`5T^^oC_JAp#+oog"bH;gtpK/f#u:^
-H[C/D!X'kP"LA.4ZN:9B$P'KE"M>*PZN:9B$P'KE"LA.4ZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>
-]F,4U!X-.D%^Q3>]F,4U!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,_S.,!D4kj7ckgtp`>hTO-f
-bKS5L`Pl=tAM,Mc/hAS31c.9V4[hb-GB@qRH[U6fI<TdTC2@d&Ci4!(DI[3g@q9.Q>[D/]DJF!*
-C2@d&Ci4!(DJF!*C2@d&Ci3`nAQW2D779R%1c-I&,VCW")B0S5)]BV6)B'P5)B0S?,:"0H)B'P5
-,U4QQ)]BV6)C-OQ,U4Q[,:#-'1eLG9=Bo07>[CN;?<CH==Bo0BA7]7]ARf7^=Bo0BA7]7]ARf7^
-=Bo0BA7\kJ?=RMW@q9.\A7]LlDI[3gC2@d&Ci4THI=$<h8k_q^!X&W-"9\c/"9J]/!X'kP"LA.4
-TE58&!X,h2"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4
-TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4
-TE57h!X,h2"J>f!TE58&!X,.t"J>f!TE57h!X,h2"J>f!ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4
-TE58&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"LA.4TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X+_h"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X+_h"J>f!
-PQCu\!X+_h"J>f!TE57\!X,.t"I&rjTE57\!X,.t"J>f!PQCu\!X,.t"I&rjTE57\!X,.t"I&rj
-PQCuP!X,.t"I&rjTE57\!X,.t"I&rjTE58#-7J]NiW&rXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+=jQFQg9sXm(
-TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4
-ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"J>f!ZN:99!X,h2"LA.4ZN:9&!X,h2"J>f!
-ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4
-ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"J>f!ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:9B$P'KE"LA.4]F,4U!X,h2"LA.4
-]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>ZN:99!X,h2"LA.4]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P
-ZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>ZN:99!X,h2"LA.4ZN:99!X-.D%^Q3>]F,4U!X-.D%_N/Z
-ZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%^Q3>ZN:9B$P'KE"M>*P
-ZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'fW%_N/ZZN:9B$P'KE"M>*P
-]F,4U!X-.D%^Q3>]F,4^$P'fW%^Q3>]F,4U!X-.D%_N/Z]F,4^$P'KE"LA.4]F,4U!X-.D%_N/Z
-ZN:9B$P'fW%^Q3>]F,4U!X-.D%_N/Z]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'fW%^Q3>
-]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*P]F,4U!X-.D%_N/Z^DIgGjQGann)39ig"bH4eCMgec-+>U
-bKS5L`PnXLUcU\%=Bo0BA7]7]ARf7^@q9.\A7\kJ?=RMW=Bo07>[CN;?<CH=<)ck">[CN;?<CH=
-=Bo0BA7\kJ?=RMW@q9.tH[Y8Pp$D;Ci8j(ZjQFt@f#u:^bKS5Sbfpq*"9\c/PQD!#$P'KE"LA.4
-]F,4U!X,h2"LA.4ZN:9B$P'KE"LA.4]F,4U!X,h2"M>*PZN:99!X-.D%^Q3>ZN:99!X,h2"M>*P
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:9.AQ7@<hV$]@daZjkbg")F`Pfa7UnskE1c-g9/M8S+
-4$5Z9A7]t,FD>W0C2@d3FED86DJF!*@q9.\A7]7]AQW2D@q9.cCi4!(DJF!*C2@d&Ci4!(DHL.M
-@q9.\A7]7]AQW2D8k_r:1c-g9/L2Pd)B0S5)]BV6)B'P5)B0S5)]BV6)C-OQ)B0S?,:"lm/P8]2
-<)ck">[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CoNARf7^
-@q9.cCi4!(DJF!*C2@dHMi7c?"9\c/"9J]/!X&W-"9\c/L]R^c!X,h2"J>f!ZN:9&!X,h2"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,h2"LA.4TE57h!X,h2"J>f!
-TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!
-TE58&!X,.t"LA.4TE57h!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,h2"J>f!
-TE58&!X,.t"J>f!TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"I&rjTE57h!X+_h"J>f!TE57h!X+_h"J>f!TE57\!X,.t"I&rj
-TE57h!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X+_h"J>f!TE57\!X,.t"I&rj
-TE57\!X,.t"J>f!PQCu\!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X,.t"I&rjTE57\!X,.t"I&rj
-TE57\!X+_h"J>f!TE58NUQb`Xs8W-!s8W-!s8W-!s7H$\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7cZUn+gn"J>f!ZN:9&!X,.t"LA.4
-TE57h!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
-ZN:9&!X,h2"J>f!ZN:9&!X,h2"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4
-TE58&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4
-TE58&!X,h2"J>f!ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,.t"LA.4
-ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4]F,4U!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>
-ZN:9B$P'KE"M>*PZN:9B$P'KE"LA.4]F,4U!X,h2"LA.4]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4
-]F,4U!X-.D%_N/Z]F,4^$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
-]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*P]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/ZZN:9B$P'fW%^Q3>
-]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P]F,4^$P'KE"M>*P
-ZN:9B$P'fW%_N/ZZN:99!X-.D%_N/Z]F,4^$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>
-]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/Z]F,4U!X-.D%^Q3>]F,4^$P'fW%^Q3>]F,4U!X-.D%_N/Z
-]F,4U!X-.D%^Q3>]F,4U!X.\EETlcXi8j(`gt^T<hU9p)bKS5Sbg")F`Pfa7@q9.C9MJVo?<CH=
-=Bo07>[CoNAQW2D=Bo07>[CoNAQW2D=Bo07>[CN;?<CH==Bo07>[CN;?<CH=@q9.Q>[CoNA[JhO
-m.9o6m-iW_hU9p)daZjkbg")F`JB2#"9J]B!X,h2"LA.4]F,4U!X,h2"M>*PZN:9B$P'KE"M>*P
-ZN:9B$P'KE"LA.4]F,4U!X,h2"M>*PZN:99!X-.D%^Q3>ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>
-ZN:99!X,h2"J>f!\"o\FeCMgec,@T?`5T^6`PoI%]o7l./hAS31c/02<GH>fC2@d&Ci4!(DJF!*
-@q9.\A7]7]ARf7^@q9.\A7]7]ARf7^@q9.\A7]7]ARf7^=Bo0BA7\kJ?=RMW@q9.\A7]7]AQW2D
-=Bo0)9MIT24YA9;)B0S5)]BtH,U=T[,U4Qe/1iqG4\ACB<)cji9MJ,Q9iP(l8k_rO9MJ,Q9iP(l
-8k_rO9MJ,Q9hJ)R=Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo0BA7]7]ASQ%!C2@d7H[U6fI76Om
-"9J]/!X&W-"9\c/"9J]B!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4ZN:9&!X,h2"J>f!
-ZN:99!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
-ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,.t"LA.4
-TE57h!X,.t"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!TE57h!X,.t"J>f!TE58&!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X+_h"J>f!TE57\!X,.t"I&rjTE57h!X+_h"J>f!
-PQCu\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X,.t"I&rjTE57\!X,.t"I&rj
-TE57h!X+_h"J>f!PQCu\!X+_h"I&rjTE57\!X+_h"J>f!PQCuP!X+_h"J>f!PQCu\!X+_h"J>f!
-cV74!m-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!o_/+QpA*q=n)39ifZ_OL7OOi1"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
-TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4TE58&!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"LA.4TE58&!X,.t"LA.4
-TE58&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"J>f!ZN:99!X,h2"LA.4TE58&!X,h2"LA.4
-ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4ZN:99!X,.t"LA.4
-ZN:99!X,h2"LA.4TE58&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:9B$P'KE"M>*PZN:99!X,h2"LA.4ZN:9B$P'KE"LA.4ZN:9B$P'KE"LA.4
-]F,4U!X,h2"LA.4]F,4^$P'KE"LA.4]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4]F,4U!X,h2"LA.4
-ZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P
-]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%_N/Z
-ZN:9B$P'KE"M>*P]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'fW%_N/ZZN:9B$P'fW%_N/Z
-ZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'fW%^Q3>
-]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"MYcj
-k1nbUm-ilnkLnYIdaZk#bfe2Rc,@T?`5T]rXK=*+/Qc7a=Bo07>[CN;?<CH=@q9.\A7]7]AQW2D
-=Bo07>[D/]DHL.M=Bo0BA7]LlDI[3g=Bo0BA7]7]ARf7^C2@eOm-j0)n)39ig"bH;gtp5uc,@T?
-`5T\6)]Ah\"Gd*^ZN:99!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X,h2"LA.4ZN:9B$P'KE"LA.4
-]F,4U!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X+;\"N89u
-`5T^6`Pod7`Oidr]=bhh]Y.EP?:@7N=Bo0BA7]7]ARf7^@q9.\A7\kJ?=RMW=Bo07>[CoNARf7^
-@q9.\A7]7]ARf7^@q9.Q>[CN;?<CH=@q9.Q>[CoNAQW2D=Bo07>[CN;?<CH==Bo03<)lms<D#qZ
-8k_rY<)lms<E)pt<)cji9MJ,Q9hJ)R8k_rO9MJ,Q9hJ)R8k_rJ6q'O477BU58k_rO9MJ,Q9hJ)R
-8k_rY<)lms<E)pt8k_rO9MJVo?<CH==Bo0BA7]7]ASQ%!H[C/D!X&W-"9\c/"9J]/!X&W-"F1%O
-ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE57h!X,h2"J>f!
-ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4TE57h!X,.t"LA.4TE57h!X,.t"LA.4TE58&!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"LA.4TE58&!X,.t"J>f!TE57h!X,h2"J>f!TE57h!X,h2"J>f!
-TE57h!X,.t"J>f!TE57h!X,h2"J>f!TE57h!X,.t"J>f!TE57h!X,.t"LA.4TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"I&rjTE57h!X,.t"J>f!PQCu\!X,.t"J>f!
-TE57\!X,.t"J>f!TE57\!X,.t"J>f!TE57h!X,.t"I&rjTE57h!X,.t"J>f!PQCu\!X+_h"J>f!
-PQCu\!X,.t"I&rjTE57h!X,.t"J>f!PQCu\!X,.t"I&rjTE57\!X,.t"I&rjTE57\!X,.t"I&rj
-TE57\!X,.t"I&rjTE57\!X,.t"I&rjTE57\!X,.t"I&rjTE57\!X,.t"J>f!ke+/"s8W-!s8W-!
-s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-m.9o6m-j0)n)39iaGYJQ!X,.t"J>f!TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
-ZN:99!X,.t"LA.4TE58&!X,h2"LA.4TE58&!X,h2"J>f!ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4
-ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"LA.4TE58&!X,.t"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"J>f!ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>
-ZN:99!X,h2"LA.4]F,4U!X,h2"LA.4]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4
-]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
-]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'fW%^Q3>
-]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
-]F,4^$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/Z
-ZN:9B$P'fW%_N/ZZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>
-]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%_N/ZZN:9^KPp#?n)39ii8j(SgtpK/f#u:^
-`5T^6`Pp$Ec!t9q4$5Z.>[CN;?<CH==Bo07>[CN;?=RMW@q9.\A7]7]ARf7^C2@ctA7]LlDI[3g
-@q9.\A7]7]AQW2D=Bo07>[FeE[-[DWm.9o6m-iW_hV$]@daZjreCM"6ZigF5(BO`G!X,h2"M>*P
-ZN:99!X-.D%^Q3>ZN:99!X,h2"M>*PZN:9B$P'KE"LA.4]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:8W3]t@"`Pfa7]=bhh]Y1qi]t:qj
-X/rF<Ci3`nAQW2D@q9.Q>[CN;?<CH==Bo07>[CN;?<CH==Bo0BA7\kJ?=RMW=Bo0BA7\kJ?<CH=
-=Bo07>[CN;?=RMW@q9.\A7]7]AQW2D=Bo07>[CB/<E)pt<)cjs<)lms<D#qZ8k_rO9MJ,Q9hJ)R
-8k_rO9MIrD77BU5779R56q'O477BU5779R:9MIrD77BU58k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9itY,
-=Bo07>[CN;?=RMW@q9.tH[Uj2N!'1b"9J]/!X&W-"9\c/(BO`G!X,.t"LA.4ZN:9&!X,h2"J>f!
-ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
-ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,.t"LA.4TE58&!X,.t"LA.4
-TE57h!X,.t"LA.4TE57h!X,h2"J>f!TE57h!X,.t"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,h2"J>f!TE57h!X,h2"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!PQCu\!X,.t"J>f!TE57\!X,.t"J>f!
-TE57\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X+_h"I&rj
-TE57\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X+_h"I&rjTE57\!X+_h"J>f!PQCu\!X+_h"I&rj
-TE57\!X+_h"I&rjTE57\!X+_h"I&rjPQCu\!X+_h"O(=ds8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVkj7d%m-ilnkLdGU
-`%3U8!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!
-ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"LA.4
-TE58&!X,.t"LA.4TE58&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4
-ZN:9&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4TE58&!X,h2"J>f!ZN:99!X,.t"LA.4
-ZN:99!X,h2"LA.4TE58&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X,h2"M>*P
-ZN:9B$P'KE"LA.4ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4
-]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>
-]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4U!X-.D%_N/Z
-ZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4^$P'KE"M>*P
-ZN:9B$P'fW%^Q3>]F,4U!X-.D%_N/Z]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>
-]F,4^$P'KE"M>*P]F,4^$P'KE"M>*PZN:9B$P'fW%^Q3>ZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>
-]F,4^$P'KE"M>*PZN:9B$P'fW%d)R%kj7d%m-iW_hU9p)bKS5Sbg">Tc,@T?['[1m/1jIf9iP(l
-<)cji9MJJc<ENL4=Bo07>[CN;?<CH=@q9.\A7]LlDJF!*@q9.cCi4!(DI[3g@q9.Q>[CN;?>=:o
-m.9oBpA+@Sq<[_Gkj7ckgtp`>hV$]@`5T[u!X*cM"LA.4ZN:99!X-.D%^Q3>ZN:9B$P'KE"M>*P
-ZN:99!X-.D%^Q3>]F,4U!X,h2"M>*PZN:99!X,h2"LA.4]F,4U!X,h2"M>*PZN:99!X-.D%^Q3>
-ZN:99!X,h2"LA.4ZN:99!X,h2"J>f!Q]-g?`PoI%]u7n/]=bhh]Y1qi]qhL#@q9.Q>[CN;?<CH=
-=Bo07>[CN;?;sm(<)ck">[CN;?<CH==Bo07>[CoNAQW2D@q9.\A7\kJ?=RMW=Bo0BA7]7]ARf7^
-@q9.\A7\kJ?<CH==Bo07>[CN;?;sm(<)cji9MJ,Q9hJ)R779R56q'1"4[hb-779R56q'O477BU5
-779R56q'O477BU5779R56q'O476<Up779R:9MJ,Q9hJ)R8k_rO9MJ,Q9itY,@q9.\A7]7]AXo?^
-bKS5<['V(s(^'mC"9J]/!X*cM"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"J>f!ZN:99!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4
-TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,.t"J>f!TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!
-TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE57h!X,.t"J>f!TE57h!X,.t"LA.4TE57h!X,.t"LA.4
-TE58&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,h2"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57\!X,.t"J>f!TE57h!X,.t"J>f!TE57\!X,.t"J>f!TE57h!X+_h"J>f!TE57h!X+_h"J>f!
-TE57\!X,.t"J>f!PQCu\!X,.t"I&rjTE57h!X+_h"J>f!TE57h!X+_h"J>f!PQCu\!X+_h"I&rj
-TE57\!X,.t"I&rjPQCu\!X+_h"J>f!PQCu\!X+_h"I&rjTE57\!X+_h"J>f!PQCu\!X+_h"I&rj
-PQCu\!X+_h"J>f!PQCuP!X,eG)Ud-ds8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Ckj7d%m-iW_hT0eFZN:9&!X,h2"J>f!
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"LA.4TE58&!X,.t"LA.4ZN:9&!X,h2"J>f!
-ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:9&!X,h2"LA.4ZN:9&!X,h2"LA.4ZN:9&!X,h2"LA.4
-TE58&!X,.t"LA.4TE58&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-]F,4U!X,h2"LA.4]F,4U!X,h2"M>*PZN:99!X,h2"M>*PZN:99!X-.D%^Q3>ZN:9B$P'KE"M>*P
-ZN:99!X-.D%^Q3>ZN:99!X,h2"M>*PZN:99!X,h2"LA.4]F,4U!X-.D%^Q3>ZN:9B$P'KE"M>*P
-ZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
-]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>ZN:9B$P'KE"M>*P
-ZN:9B$P'KE"M>*P]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
-]F,4U!X-.D%_N/Z]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*P]F,4^$P'fW%^Q3>]F,4U!X-.D%^Q3>
-]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P
-fQCHnm-!<fkN:RTg"bH4eCMgec-+>U`5T^6`PlS.DD!Il<)cji9MJJc<E)pt=Bo0)9MJVo?<CH=
-=Bo0BA7\kJ?=RMWC2@ctA7]7]ASQ%!C2@ctA7\kJ?<CH==Bo1.V53bWq>^Kpo_/+IoC_>6n*'-,
-i8j(SgtpuMk;iYIZN:99!X,h2"M>*PZN:99!X-.D%^Q3>ZN:9B$P'KE"M>*PZN:99!X,h2"M>*P
-ZN:99!X-.D%^Q3>ZN:9B$P'KE"LA.4]F,4U!X,h2"M>*PZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,#/'ZRes]=bhh]Y1qi]t:qj]=bhh]Y0_sP?;'r<)cjs<)lms<D#qZ8k_rY<)lms<E)pt
-=Bo07>[CN;?<CH==Bo0BA7\kJ?=RMW=Bo07>[CN;?=RMW@q9.cCi3`nAQW2D=Bo07>[CN;?<CH=
-=Bo07>[CB/<D#qZ<)cji9MIrD77BU5779R56q'O477BU5779R56q'O477BU5779R56q'O477BU5
-779R56q'^A9gqH=8k_rO9MJ,Q9hJ)R<)ck">[CN;?=RMWH[C1abg"Scf$`(!g"bG2H[Q"u";_+B
-ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4
-TE58&!X,.t"LA.4TE58&!X,.t"J>f!TE58&!X,.t"J>f!TE58&!X,.t"LA.4TE57h!X,.t"J>f!
-TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE57h!X,.t"LA.4TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE58&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
-TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X+_h"J>f!
-TE57h!X+_h"J>f!TE57\!X,.t"J>f!TE57\!X,.t"I&rjTE57h!X+_h"J>f!TE57\!X,.t"I&rj
-TE57h!X+_h"J>f!TE57\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X+_h"J>f!
-PQCu\!X+_h"I&rjTE57\!X+_h"J>f!PQCuP!X,.t"I&rjTE57\!X,.t"I&rjPQCuP!X,.t"I&rj
-TE57h!X-GgIK0?Is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+@Sq<726kj7crjQG1&XKiZ]TE57h!X,h2"J>f!TE57h!X,h2"J>f!
-TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"LA.4
-TE58&!X,.t"LA.4ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
-ZN:99!X,h2"LA.4ZN:99!X-.D%^Q3>ZN:99!X,h2"LA.4ZN:9B$P'KE"LA.4ZN:9B$P'KE"LA.4
-]F,4U!X-.D%_N/Z]F,4^$P'fW%_N/Z]F,4^$P'fW%_N/Z]F,4^$P'fW%_iht]F,4^$P'fW%_N/Z
-]F,4^$P'fW%_iht]F,4a(`9mn%_iht]F,4a(`:")(q^4d^DIg#$P'og(r$n)^DIg&(`:")(r$n)
-^DIg&(`:")(r$n)^DIg&(`:")(r$n)^DIg+,:(#@(r$n)`$6PB(`:")(r$n)^DIg+,:(2P,fCoQ
-^DIg+,:(2P,fCoQ^DIg+,:(2P,fCoQ`$6PG/25!e,fD5f`$6PG,:(2Y0Z51]`%3U\,:(2Y0Z5Lr
-`%3U\/25!n0Z5Lr`%3U\/25!n0Z5Lr`%3U\2E8W535d@%`&9Tn/25"#35d@%`&9Tn/25"#35d@%
-`&9Tn2E8W535d^7`&9Tn2E8W535d^7`&9Tn2E8W536XKL`&9U!4?pbB36XKL`&9Tn2E8W536XKL
-`&9Tn2E8oC5Kl5SbWJ,64?q%P5Kl5SbWJ,64?q%P5Kl5SbWJ,66q#6]5KlM`bWJ,66q#6]5KlM`
-bWJ,66q#6]5KlM`bX=kF9i&u$7*eS'cV73]9i')0:X;a2cV73]9i($(fBDSii8j(SgtpK/f%A3i
-bKS5L`Pod7`O*"Z/hASC6q'^A9hJ)R<)ck">[CB/<ENL4<)ck">[CN;?<CH==Bo0BA7\kJ?=RMW
-=Bo0BA7\kJ?=RMW@q9.Q>[CoNAaK$]s8W-!s8W-!s7H$\m.9o6m-j0)n*'-,kj7cVH[Wq>:!?R=
-bZ%]g<*7@D=Nj`HbZ%]g<*7@D=Nj`HbZ%]g<*7XV7*K+ObZ%]g<*7@RA^"+Ue6YPe<*7@RA^"+U
-b[P/-@V*bmA^"Upb[P/-@V+5(8'GFRb[P/-@V*b_=Nk5cb[P/-<*6_;7Ee_5[o5>sUnG?4]u7n/
-]=bhh]Y1qi]t:qj]=bh(H[Sjm<ENL4<)cjs<)m%*?:mmc<)cjs<)lms<ENL4=Bo07>[CN;?<CH=
-=Bo07>[CN;?<CH=@q9.\A7]7]ASQ%!C2@ctA7]7]AQW2D=Bo07>[CN;?<CH==Bo07>[CB/<D#qZ
-8k_rJ6q'O476<Up779R+4?Z,$77BU5779R+4?Z,$76<Up779R56q'1"4[hb-779R:9MJ,Q9hJ)R
-8k_rY<)lms<ENL4@q9.\A7`-T[+X6ki8j(Sgtp`>hV$]@]=bhdHtpTHIE6M:`-ZpRFC)n4IDgJ\
-aa@a>H[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\
-`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\
-`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\aFnTPH[WtgEl<<Q\V5:HH[WGYGf4rW
-\V5:HH[WtgEl<<QaGYJbH[WGYGfYek`-ZpRMg`NjIE7=p`-ZpRMg`'oKuf1#\VbdUMg`[)IE7=p
-\VbdUMg`-nI)q4o\VbdUMg`'oKuf1#[uH*_Mg`[)ICG2iaGYJUNJ5H3ICY5_aHM:dNJ5H;KXZqp
-aHM:dNJ5H;KXZqp[uH*NNJ4j$Kt!%q\<Di\PDcr7Mn"t/aHM:dNJ4m+Mn"t/aHM:dNJ4m+Mn"t/
-\<Di\PDcr7Mn"t/[uH*OPDco0Kt*>)[uH*OPDcu?Pdlp8\<Di\PDcu?Pdlp8\<Di\PDcr7Mn,:@
-\XJbnRZt@OPe!6I\XJbnRZt@OPe!6I\XJbnRZtmhS[YDfaK25ZXJO">V:`/VfY"ZF]XHG1^#d2L
-k01s3e^s'9fD*k;l.+DMe^s'9fBLi;l.+DMe^s'9fBLi;l.+DJgt_/EfD44Ll.+DXpA+ags8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+QpA+@Sq<[_Gm.9o6m-j)\al^ghf>PATbff.mak4h\fZ_P$bfSM]bLk%^fZ_OkbfeY_bLk%^
-fZ_Okbff8$f@\<jdaZk4e^rHtbL4nkl.+D6eCNm7f@&1"l.+D=gtq;GfB1lDl.+D=gtq;Gf@es9
-k1nbFgtq;Gf@es9k1nbSgt_&IgtCK>i8j(`gt_&IgudDIg"bHHgt^iKkMYFai8j(ZjQG[\h!"+n
-k1nbMjQGI^kN:RTi8j(bm-ilnkNM:$i8j(bm-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
-m.9o6m-j<4p#tc2m.9o6m-j<4p#tc2o_/+Em-jT?q<726o_/+Em-jT?q<726o_/+Em-j<4p#tc2
-m.9oEm-!a,p$D;Ckj7d1pA*q=n*'-,o_/+Tm-"$7q<726o_/+Tm-"$7q=j7=o_/+Tm-"$7q=j7=
-o_/+Tm-"$7q=OCVo_/+Tm-"$7q=OCVp[%)8pA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=j7=
-o_/+QpA+@Sq=j7=o_/+QpA+ILkOeKDp[%)8pA+@Sq=OCVo_/+QpA+ILkOeKDo_/+QpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+\s8W-!s7H$\o_/+QpA+@Sq=OCVo_/+QpA+ags7H$\
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+\s8V`bq=OCVo_/+\s8V`bq=OCVo_/+QpA+ags7H$\
-o_/+\s8V`bq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+\s8V`bq=OCVo_/+QpA+ags7H$\s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVkj7d%m-ilnkLnYIdaZjkbg">Tc,@T?`5T]>FEB,d/P8]2
-8k_rO9MJJc<ENL4<)ck">[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH=
-S=Z8CpA+ags8W-!s8W-!s8W-!s7H$\m.9o:oC_JAp$D;Ckj7d1pA+@Sq=OCVm.9oBpA+(Hp%7tR
-m.9oBpA+(Hp%7tRkj7d1pA+@Sq=OCVp[%)0oC_JAp%7tRp[%)0oC_bLq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+ILkNM:$kj7crjQG4OhV$]@daZjkbg")F`Pfa7`k8mp]Y1qi]t:qj]=bhh]Y1qi]t:qj
-H[C059MJJc<E)pt<)cjs<)lms<E)pt<)ck">[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH=
-C2@d&Ci3`nAQW2D=Bo07>[CN;?<CH=<)cji9MJJc<E)pt8k_rY<)lOa9hJ)R8k_rO9MIrD77p6J
-8k_rO9MJ,Q9hJ)R779R56q'O477p6J8k_rO9MJ,Q9hJ)R8k_rO9MJVo?:mmc=Bo07>[CN;?Asf$
-kj7d%m-ilnkNM:$kj7crjQGann)39ii8j(ZjQGI^kMYFai8j(ZjQGI^kN:RTi8j(SgtpuMkLnYI
-i8j(SgtpuMkLnYIi8j(ZjQGI^kLnYIi8j(ZjQG4OhVdJXg"bHBjQGI^kLnYIi8j(SgtpuMkLnYI
-i8j(SgtpuMkLnYIi8j(ZjQGI^kMYFai8j(SgtpuMkLnYIi8j(SgtpuMkLnYIi8j(Sgtp`>hV$]@
-g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hVdJX
-g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@daZk$gtpK/f%Jj8daZjreCN'tf$`(!
-daZjreCN'tf$`(!daZjreCN'tf$`(!daZjreCN'tf$`(!daZjreCN'tf$`(!daZjreCN'tf%Jj8
-daZk$gtpK/f%Jj8daZjreCN'tf$`(!daZjreCN'tf$`(!daZjreCN'tf#u:^daZjreCN'tf#u:^
-daZjkbg"Scf#u:^daZjkbg"Scf#u:^bKS5ZeCMgec-k+mbKS5Sbg">Tc-+>UdaZjkbg">Tc-+>U
-bKS5ZeCMgec-k+mbKS5ZeCN'tf&5WPi8j(bm-j0)n*KZ=m.9oMs8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCV
-kj7d)oC_>6n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
-m.9oEm-!U!n*'-,kj7d1pA*q=n*KZ=kj7d)oC_JAp#tc2m.9oBpA*q=n*KZ=m.9o:oC_JAp$D;C
-m.9oBpA+@Sq=OCVm.9o:oC_bLq=OCVm.9oBpA+@Sq=OCVo_/+IoC_JAp%Rh9m.9oBpA+(Hp%7tR
-o_/+QpA+@Sq=OCVp[%)8pA+(Hp%Rh9o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
-s8W,kpA+@Sq=OCVo_/+QpA+@Sq>^Kpo_/+QpA+@Sq>^Kpo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+\s8V`bq>^Kpo_/+\s8V`bq>^Kp
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
-s8W-!s8V`bq>^Kps8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+QpA*q=n)39ig"bH4eCMgec-+>U`5T^6`PoI%]eqW'779R:9MJ,Q9hJ)R8k_rO9MJVo?:mmc
-=Bo0)9MJJc<E)pt<)ck">[C#r9hJ)R8k_rO9MJ,Q9iP(l<)ck">[Hdgp&G'ls8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+QpA+ags7H$\o_/+QpA+@Sq=OCVo_/+QpA+ags7H$\
-o_/+\s8V`bq>^Kps8W,kpA+ags8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+(Hp#tc2
-i8j(SgtpK/f$`(!bKS5L`Pod7`Pfa7]=bhq`PoI%]t:qj`5T^-]Y1\Z[!-V6=Bo03<)m%*?;sm(
-<)cji9MJJc<E)pt<)ck">[C#r9iP(l<)cjs<)lms<E)pt=Bo07>[CN;?=RMW@q9.\A7\kJ?<CH=
-=Bo07>[CN;?<CH=<)cjs<)m%*?;sm(<)cji9MJ,Q9hJ)R8k_rO9MJJc<D#qZ8k_rO9MJ,Q9hJ)R
-8k_rO9MJ,Q9iP(l8k_r]>[CB/<E)pt<)ck">[CN;?<CH=C2@eGjQGn$p$D;Cm.9o:oC_JAp$D;C
-m.9o:oC_JAp$D;Cm.9o:oC_JAp#tc2kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
-kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
-kj7d%m-j0)n*'-,kj7crjQGann)39ikj7crjQGI^kMYFakj7crjQGI^kMYFakj7crjQGI^kMYFa
-i8j(bm-j0)n)39ikj7crjQGI^kNM:$i8j(bm-ilnkNM:$kj7crjQGI^kNM:$i8j(ZjQGann)39i
-kj7crjQGI^kMYFai8j(ZjQGI^kMYFai8j(SgtpuMkMYFag"bHBjQGI^kMYFag"bHBjQGI^kLnYI
-i8j(ZjQG4OhVdJXi8j(SgtpuMkLnYIi8j(SgtpuMkMYFai8j(Sgtp`>hVdJXg"bH;gtp`>hV$]@
-i8j(SgtpuMkLnYIg"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@daZk$gtp`>hV$]@
-g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtpK/f%Jj8g"bH;gtp`>hU9p)g"bH;gtp`>hV$]@
-i8j(ZjQGI^kNM:$m.9oBpA+@Sq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq<[_Go_/+QpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVs8W,kpA+@Sq>^Kpo_/+\s8W-!s7H$\s8W-!s8W-!s8W-!
-o_/+\s8V`bq=OCVo_/+QpA+ags7H$\s8W-!s8V`bq=OCVs8W,kpA+@Sq=OCVs8W,kpA+ags8W-!
-o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7crjQG4OhU9p)
-fZ_O^bg")F`Pfa7H[C/n/1jIf9hJ)R8k_rO9MJ,Q9hJ)R<)cji9MJVo?<CH=8k_rO9MJ,Q9hJ)R
-8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9oP!hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH4eCN'tf#u:^
-`5T^6`PoI%]t:qj]=bhh]Y1qi]t:qj]=bha['Y1,I99`\<)cjs<)lms<E)pt<)ck">[C#r9iP(l
-8k_rY<)lOa9itY,8k_r]>[CN;?<CH==Bo0BA7\kJ?<CH=@q9.Q>[CN;?<CH=<)cji9MJJc<ENL4
-<)ck">[CB/<E)pt<)cjs<)lms<E)pt<)cjs<)lms<E)pt<)cji9MJJc<D#qZ=Bo03<)m%*?<CH=
-=Bo03<)m%*?<CH==Bo0BA7a3=f'N#$m.9oBpA+@Sq=OCVs8W-!s8W-!s7H$\o_/+QpA+@Sq=OCV
-o_/+QpA+ags7H$\o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+(Hp%7tRo_/+IoC_bLq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVm.9o:oC_bLq<[_G
-m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp#tc2m.9o:oC_>6n*KZ=
-m.9o6m-j<4p$D;Ckj7d)oC_>6n*KZ=kj7d)oC_JAp#tc2m.9o6m-j<4p$D;Ckj7d%m-j<4p#tc2
-kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,i8j(bm-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-ilnkNM:$
-kj7d%m-j0)n*'-,kj7crjQGann*'-,kj7crjQGann*'-,kj7d%m-ilnkNM:$kj7d%m-j0)n*'-,
-i8j(bm-ilnkMYFai8j(ZjQGI^kLnYIi8j(ZjQGI^kMYFai8j(SgtpuMkMYFai8j(SgtpuMkMYFa
-i8j(ZjQGI^kMYFai8j(ZjQGI^kMYFai8j(ZjQGI^kMYFai8j(ZjQGann*'-,kj7d%m-j<4p$D;C
-o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8V`bq>^Kp
-o_/+\s8W-!s7H$\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kN:RTdaZjreCMgec-+>U`5T^-]Y-0Z1eLG9
-<)cji9MJ,Q9hJ)R8k_rO9MIrD77p6J779R:9MJ,Q9gqH=8k_r@4?Ybg4Zbbh4$5Yf4?Ybg4Zbbh
-779T.m-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n(HLQdaZjreCMgec,@T?`5T^6`Pod7`Oidr
-]=bhh]Y1qi]t:qj['[2eH[SL[9itY,<)ck">[CB/<ENL4<)cjs<)lOa9hJ)R8k_rY<)lOa9hJ)R
-=Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo03<)lms<E)pt<)cjs<)lOa9iP(l<)cjs<)m%*?<CH=
-<)ck">[CB/<E)pt=Bo07>[CN;?;sm(<)cjs<)m%*?<CH==Bo07>[CN;?<CH==Bo07>[CoNA\5Ug
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8V`bq>^Kps8W-!s8W-!s8W-!o_/+\s8V`bq>^Kpo_/+\s8V`bq>^Kpo_/+\s8V`bq=OCV
-o_/+QpA+@Sq<[_Go_/+QpA+@Sq=OCVo_/+QpA+(Hp%7tRo_/+QpA+@Sq=OCVo_/+QpA+@Sq<[_G
-o_/+QpA+(Hp%7tRo_/+IoC_bLq=OCVm.9oBpA+@Sq=OCVo_/+IoC_bLq<[_Gm.9o:oC_JAp$D;C
-m.9o:oC_JAp$D;Cm.9o:oC_JAp#tc2m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;C
-m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_>6n*'-,kj7d%m-j0)n*KZ=kj7d%m-j0)n*'-,
-kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n)39ikj7d%m-ilnkNM:$
-kj7d%m-j0)n*'-,kj7crjQGann*'-,kj7d)oC_JAp$D;Co_/+QpA+@Sq=OCVs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8VHWp#tc2i8j(SgtpK/f#u:^bKS5L`Pod7`Hur[/hASH9MJ,Q9hJ)R8k_rJ6q'O476<Up
-8k_rJ6q'O477BU5779R+4?Ybg4Zbbh4$5Yf4?Ybg4Zbbh4$5Yf4?\%<IJ!7/s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s7H$\kj7crjQGI^kL.l2daZjkbg")F`Pfa7]=bhh]Y28&`Oidr]=bhh]Y1qi]sP/R
-H[C0C>[CN;?;sm(<)cjs<)lms<D#qZ<)cji9MJ,Q9hJ)R8k_r]>[CB/<ENL4=Bo07>[CN;?<CH=
-=Bo03<)lOa9iP(l8k_rO9MJ,Q9iP(l<)cjs<)lms<ENL4<)ck">[CB/<ENL4<)ck">[CB/<ENL4
-=Bo07>[CB/<ENL4=Bo07>[CN;?=RMW=Bo07>[CN;?=RMW]=biLpA+ags8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8W-!s8W-!o_/+\s8V`bq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+ags7H$\
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+IoC_bLq=OCVm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;C
-m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;C
-m.9o:oC_JAp$D;Co_/+QpA+@Sq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-ilnkL.l2
-daZjkbg">Tc,@T?]=bg71c.9V4\ACB8k_rJ6q'^A9gqH=779R56q'O476<Up8k_rJ6q'^A9fkI#
-4$5Yf4?Ybg4Zbbh4$5Yf4?Ybg4Zbbhg"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
-i8j(Sgtp`>hU9p)bKS5Sbg")F`Pfa7`5T^-]Y1qi]t:qj]=bhh]Y1qi]o7l.<)ck">[CB/<ENL4
-<)cjs<)lOa9iP(l8k_rO9MJJc<D#qZ<)cjs<)lms<ENL4=Bo07>[CN;?<CH==Bo03<)lms<E)pt
-8k_rY<)lOa9iP(l<)ck">[CB/<E)pt=Bo0)9MJJc<E)pt<)ck">[CN;?<CH==Bo07>[CN;?<CH=
-@q9.Q>[CN;?<CH=C2@e@gtr)2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+ags8W-!s8W,kpA+@Sq>^Kpo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
-o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVs8W,kpA+ags8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq>^Kp
-o_/+\s8V`bq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCMgec-+>U`5T^6`Pm1NI3^$_
-8k_r@4?Ybg4Zbbh4$5Yf4?Ybg4Zbbh779R56q'O477BU5779R56q'O477BU5779R56q'^A9gqH=
-779RZCi8n=q>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH;gtpK/f#u:^
-`5T^6`Pod7`Oidr`5T^-]Y1qi]t:qj]=bhh]Y0i,S60$&<)ck">[CB/<E)pt<)cjs<)m%*?<CH=
-<)ck">[CB/<E)pt<)cjs<)lms<ENL4=Bo07>[CB/<E)pt8k_rY<)lms<E)pt=Bo07>[CB/<E)pt
-<)cji9MJ,Q9iP(l<)ck">[CN;?<CH==Bo07>[CoNARf7^=Bo0BA7\kJ?=RMW=Bo0kMi@#op&G'l
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s6T@Mkj7d#gt^?-f$`(!bKS5L`Pod7`Pfa78k_r@4?Ybg4Zbbh4$5Yf4?Z,$76<Up
-4$5Yf4?Ybg4Zbbh779R56q'^A9fkI#779R56q'O477BU5779R56q'O47G6JQs8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n)39ig"bH;gtpK/f#u:^bKS5L`Pod7`Oidr
-`5T^-]Y1qi]t:qj]=bhQV5.jBDH'S8=Bo03<)lms<ENL4=Bo07>[CN;?<CH==Bo03<)lms<D#qZ
-=Bo07>[CN;?<CH=<)ck">[CB/<E)pt<)cjs<)lms<ENL4=Bo03<)m%*?;sm(8k_rO9MJJc<ENL4
-=Bo07>[CoNARf7^@q9.\A7]7]ARf7^@q9.tH[X>lf)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W,kpA+ags8W-!s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)39i
-g"bH4eCMgec-+>UbKS5C]Y,pK/NZ'X4$5YY/1i_91c7*H4$5Yf4?Z,$77p6J8k_rJ6q'^A9gqH=
-4$5Yu9MIrD77p6J8k_rO9MJ,Q9hJ)RC2@e[pA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!m.9o6m-ilnkMYFag"bH4eCN'tf#u:^bKS5L`Pod7`Pfa7]=bhq`PoI%]t:qj
-['[2rKS3H4?<CH=@q9.Q>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH=
-<)cjs<)lms<E)pt<)ck">[CB/<ENL4=Bo03<)m%*?<CH==Bo07>[CN;?<CH=@q9.\A7]LlDJF!*
-C2@d&Ci6kt^%D$oo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq>^Kp
-s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)daZjreCMgec(q23
-/hAS31c.'H1bL=22)I-B/1iqG4Zbbh779R56q'1"4[hb-779R+4?Z;19gqH=779R:9MJ,Q9gqH=
-8k_rO9MN^Sc2[hDs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
-m.9o.jQGI^kLnYIg"bH4eCN'tf#u:^bKS5Sbg")F`Pfa7`5T^6`PoI%]t:qjUnsl6H[TC7ARf7^
-=Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CB/<E)pt=Bo03<)lms<ENL4
-8k_r]>[CB/<E)pt<)ck">[CN;?<CH=@q9.\A7]LlDI[3gC2@d7H[W9.[/^1+s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8V`bq>^Kp
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2i8j(ZjQG4OhU9p)daZj(KS23>1bL=2/hAS31c-g9/N#@A
-2)I-O4?Z,$77p6J8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9knK^o_/+\s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o.jQGI^kLnYI
-g"bH;gtpK/f$`(!bKS5Sbg">Tc,@T?bKS5L`Pod7`OidrS=Z6tH[TC7AQW2D=Bo07>[CN;?<CH=
-@q9.Q>[CN;?<CH=8k_r]>[C#r9iP(l<)ck">[C#r9itY,<)cjs<)m%*?:mmc<)ck">[CB/<ENL4
-=Bo07>[CoNARf7^@q9/0Mi>j'c1L`*o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+QpA*q=n)39ii8j(ZjQGI^kG4rMC2@ci>[BKS4YA9;2)I-B/1iqG4Zbbh4$5Yp6q'^A9gqH=
-8k_rO9MJ,Q9iP(l<)cjs<)lms<D#qZ8k_sk]Y4@Fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d)oC_&&kMYFag"bH;gtp`>hU9p)
-daZjreCN'tf#u:^daZjkbg">Tc-+>U['[3!Mi;CeDHL.M=Bo07>[CN;?<CH==Bo0)9MJVo?;sm(
-=Bo07>[C#r9iP(l<)cjs<)lms<E)pt<)ck">[C#r9iP(l8k_rO9MJVo?<CH=@q9/HV53>An+?>L
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+\s8W-!s7H$\s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+Em-j0)n*'-,
-kj7crjQGI^kMYFai8j(>`Po3k[%*_XN/NXAH[TC7AP,Wj4$5Yu9MJ,Q9iP(l<)cjs<)lms<E)pt
-8k_rY<)m%*?N:'*s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o6m-j0)n)39ii8j(ZjQG4OhV$]@g"bH;gtpK/f$`(!
-g"bH4eCN=.hU9p)daZj[]Y0i,S9K's=Bo0)9MJ,Q9itY,=Bo0)9MJVo?:mmc8k_rO9MJ,Q9hJ)R
-8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9itY,S=Z8!eCO9cq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8W-!s8W-!
-o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+IoC_JAp$D;Cm.9o:oC_>6n*KZ=
-kj7d)oC_>6n*KZ=m.9o:oC_&&kKD)o]=bhXXK@G>N-fo"=Bo03<)lms<E)pt['[4?s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W,kpA+@Sq<[_Gm.9o:oC_>6n*'-,i8j(ZjQGI^kLnYIi8j(ZjQG4OhVdJXg"bH;gtpuMkLnYI
-g"bHBjQG4OhSdCPUnslGMi<"0I99`\<)cjs<)lOa9hJ)R8k_rO9MJ,Q9hJ)R8k_r]>[EAIN3ot!
-i8j)$s8V`bq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVm.9o:oC_JAp$D;Cm.9oBpA+@Sq=OCV
-o_/+\s8V`bq=OCVo_/+\s8V`bq>^Kpm.9o.jQH1/q>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
-o_/+IoC_JAp$D;Ckj7d%m-j0)n)39ikj7crjQGann*'-,i8j(bm-j0)n*'-,kj7d)oC_JAp$D;C
-m.9o:oC_&&kL.l2daZjd`Pp$Ec-k+mg"bHBjQGn$p&G'lo_/+QpA+ags8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-o_/+\s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+IoC_bLq<[_G
-m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Co_/+QpA+ags7H$\s8W,kpA+ags7H$\
-s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8V`bq>^Kp
-s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags7H$\o_/+QpA+(Hp%7tR
-o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
-s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8N~>
-Q
-cleartomark end end pagesave restore showpage
-%%PageTrailer
-%%Trailer
-%%Pages: 1
diff --git a/doc/doxygen_logo.gif b/doc/doxygen_logo.gif
deleted file mode 100644
index 6b45597..0000000
--- a/doc/doxygen_logo.gif
+++ /dev/null
Binary files differ
diff --git a/doc/doxygen_logo.pdf b/doc/doxygen_logo.pdf
new file mode 100644
index 0000000..2291358
--- /dev/null
+++ b/doc/doxygen_logo.pdf
Binary files differ
diff --git a/doc/doxygen_logo.svg b/doc/doxygen_logo.svg
new file mode 100644
index 0000000..d42dad5
--- /dev/null
+++ b/doc/doxygen_logo.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 104 31" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <linearGradient id="a">
+ <stop stop-color="#5373B4" offset="0"/>
+ <stop stop-color="#7C95C6" offset="1"/>
+ </linearGradient>
+ <linearGradient id="d" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="c" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientTransform="matrix(.6816 0 0 1.0248 72.391 -.91809)" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="b" x1="56.295" x2="56.295" y1="24.622" y2="26.574" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="e" x1="49.067" x2="48.956" y1="19.719" y2="9.5227" gradientTransform="matrix(.97968 0 0 1.0207 -.25579 -.25579)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#C0CCE3" offset="0"/>
+ <stop stop-color="#EEF1F7" offset="1"/>
+ </linearGradient>
+ <filter id="f" x="-.010676" y="-.045304" width="1.0214" height="1.0906" color-interpolation-filters="sRGB">
+ <feGaussianBlur stdDeviation="0.45293203"/>
+ </filter>
+ </defs>
+ <g>
+ <path transform="translate(-2.5759 -27.848)" d="m13.609 32.203v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23645 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88018-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35277 3.7988-1.0566 1.0471-0.70387 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.92299-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.4611 0.28066 1.7988 0.84375 0.33777 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5976v-8.3926c0-0.84464-0.0765-1.6106-0.22851-2.2969-0.13511-0.70387-0.37971-1.2925-0.73438-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.063 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07028-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06051 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3438h-0.05078l-2.9648-9.3438zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914 0.38844 0.24635 0.6991 0.57184 0.93555 0.97656 0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13253 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10134 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88814-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70105 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.4927-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89025 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74023 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" filter="url(#f)" opacity=".3" stroke="#969696" xlink:href="#path141"/>
+ <path d="m0.97202 24.161 43.605-0.0019 0.0508 3.3061-43.6 0.04174z" fill="url(#d)" stroke="#000" stroke-width=".5"/>
+ <path d="m10.283 3.5547v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23644 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88017-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35278 3.7988-1.0566 1.0471-0.70386 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.923-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.461 0.28066 1.7988 0.84375 0.33778 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5977v-8.3926c0-0.84464-0.0765-1.6106-0.22852-2.2969-0.13511-0.70387-0.3797-1.2925-0.73437-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.062 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07027-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06052 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3437h-0.05078l-2.9648-9.3437zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914s0.6991 0.57184 0.93555 0.97656c0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13254 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10133 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88813-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70106 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.49271-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89026 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74024 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" fill="url(#e)" stroke="#4665A2" stroke-width=".7"/>
+ <path d="m52.988 27.291c0.99602-1.0359 1.3944-1.8725 1.7928-3.1076l3.8247-0.03984c0.3113 1.6096 0.82413 2.5137 1.6335 3.1474z" fill="url(#b)" stroke="#000" stroke-width=".5"/>
+ <path d="m73.89 24.04 28.885-0.2011-0.12476 3.3879-31.033 0.16229c1.2621-1.0234 1.9665-2.2859 2.2724-3.3491z" fill="url(#c)" stroke="#000" stroke-width=".41788"/>
+ </g>
+</svg>
diff --git a/doc/doxygen_logo_low.gif b/doc/doxygen_logo_low.gif
deleted file mode 100644
index 02e3c9a..0000000
--- a/doc/doxygen_logo_low.gif
+++ /dev/null
Binary files differ
diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex
index e350013..7d8e889 100644
--- a/doc/doxygen_manual.tex
+++ b/doc/doxygen_manual.tex
@@ -122,6 +122,7 @@
\usepackage{etoc}
\etocsettocstyle{\doxytocparskip}{\doxynormalparskip}
\begin{document}
+\raggedbottom
\pagenumbering{alph}
\begin{titlepage}
\includegraphics[width=\textwidth]{doxygen_logo}
@@ -171,87 +172,84 @@ Written by Dimitri van Heesch\\[2ex]
\chapter{Perl Module Output}\label{perlmod}\hypertarget{perlmod}{}\input{perlmod}
\chapter{Doxygen's internals}\label{arch}\hypertarget{arch}{}\input{arch}
\renewcommand{\thepart}{}
+\renewcommand{\partname}{}
\part{Appendices}
\appendix
%mean that subinputfrom requires a / at the end of the path
\chapter{Autolink Example}\label{autolink_example}\hypertarget{autolink_example}{}
-\subinputfrom{../html/examples/autolink/latex/}{refman_doc}
+\subinputfrom{examples/autolink/latex/}{refman_doc}
\chapter{Resolving Typedef Example}\label{restypedef_example}\hypertarget{restypedef_example}{}
-\subinputfrom{../html/examples/restypedef/latex/}{refman_doc}
+\subinputfrom{examples/restypedef/latex/}{refman_doc}
-\IfFileExists{../html/examples/diagrams/latex/refman_doc.tex}
+\IfFileExists{examples/diagrams/latex/refman_doc.tex}
{
\chapter{Diagrams Example}\label{diagrams_example}\hypertarget{diagrams_example}{}
- \subinputfrom{../html/examples/diagrams/latex/}{refman_doc}
+ \subinputfrom{examples/diagrams/latex/}{refman_doc}
}{}
\chapter{Modules Example}\label{modules_example}\hypertarget{modules_example}{}
-\subinputfrom{../html/examples/group/latex/}{refman_doc}
+\subinputfrom{examples/group/latex/}{refman_doc}
\chapter{Member Groups Example}\label{memgrp_example}\hypertarget{memgrp_example}{}
-\subinputfrom{../html/examples/memgrp/latex/}{refman_doc}
+\subinputfrom{examples/memgrp/latex/}{refman_doc}
\chapter{Style Examples}
\doxysection{After Block Example}\label{afterdoc_example}\hypertarget{afterdoc_example}{}
\begin{DoxygenSubAppendix}
- \subinputfrom{../html/examples/afterdoc/latex/}{refman_doc}
+ \subinputfrom{examples/afterdoc/latex/}{refman_doc}
\end{DoxygenSubAppendix}
\doxysection{QT Style Example}\label{qtstyle_example}\hypertarget{qtstyle_example}{}
\begin{DoxygenSubAppendix}
- \subinputfrom{../html/examples/qtstyle/latex/}{refman_doc}
+ \subinputfrom{examples/qtstyle/latex/}{refman_doc}
\end{DoxygenSubAppendix}
\doxysection{Javadoc Style Example}\label{jdstyle_example}\hypertarget{jdstyle_example}{}
\begin{DoxygenSubAppendix}
- \subinputfrom{../html/examples/jdstyle/latex/}{refman_doc}
+ \subinputfrom{examples/jdstyle/latex/}{refman_doc}
\end{DoxygenSubAppendix}
\doxysection{Javadoc Banner Example}\label{javadoc_banner_example}\hypertarget{javadoc_banner_example}{}
\begin{DoxygenSubAppendix}
- \subinputfrom{../html/examples/javadoc-banner/latex/}{refman_doc}
+ \subinputfrom{examples/javadoc-banner/latex/}{refman_doc}
\end{DoxygenSubAppendix}
\chapter{Structural Commands Example}\label{structcmd_example}\hypertarget{structcmd_example}{}
-\subinputfrom{../html/examples/structcmd/latex/}{refman_doc}
+\subinputfrom{examples/structcmd/latex/}{refman_doc}
\chapter{Language Examples}
\doxysection{Python Docstring Example}\label{python_example}\hypertarget{python_example}{}
\begin{DoxygenSubAppendix}
- \subinputfrom{../html/examples/docstring/latex/}{refman_doc}
+ \subinputfrom{examples/docstring/latex/}{refman_doc}
\end{DoxygenSubAppendix}
\doxysection{Python Example}\label{py_example}\hypertarget{py_example}{}
\begin{DoxygenSubAppendix}
- \subinputfrom{../html/examples/pyexample/latex/}{refman_doc}
+ \subinputfrom{examples/pyexample/latex/}{refman_doc}
\end{DoxygenSubAppendix}
\doxysection{VHDL Example}\label{vhdl_example}\hypertarget{vhdl_example}{}
\begin{DoxygenSubAppendix}
- \subinputfrom{../html/examples/mux/latex/}{refman_doc}
- \end{DoxygenSubAppendix}
- \doxysection{Tcl Example}\label{tcl_example}\hypertarget{tcl_example}{}
- \begin{DoxygenSubAppendix}
- \subinputfrom{../html/examples/tclexample/latex/}{refman_doc}
+ \subinputfrom{examples/mux/latex/}{refman_doc}
\end{DoxygenSubAppendix}
\chapter{Class Example}\label{class_example}\hypertarget{class_example}{}
-\subinputfrom{../html/examples/class/latex/}{refman_doc}
+\subinputfrom{examples/class/latex/}{refman_doc}
\chapter{Define Example}\label{define_example}\hypertarget{define_example}{}
-\subinputfrom{../html/examples/define/latex/}{refman_doc}
+\subinputfrom{examples/define/latex/}{refman_doc}
\chapter{Enum Example}\label{enum_example}\hypertarget{enum_example}{}
-\subinputfrom{../html/examples/enum/latex/}{refman_doc}
+\subinputfrom{examples/enum/latex/}{refman_doc}
\chapter{Example Example}\label{example_example}\hypertarget{example_example}{}
-\subinputfrom{../html/examples/example/latex/}{refman_doc}
+\subinputfrom{examples/example/latex/}{refman_doc}
\chapter{Extends/Implements Example}\label{extends_example}\hypertarget{extends_example}{}
-\subinputfrom{../html/examples/manual/latex/}{refman_doc}
+\subinputfrom{examples/manual/latex/}{refman_doc}
\chapter{File Example}\label{file_example}\hypertarget{file_example}{}
-\subinputfrom{../html/examples/file/latex/}{refman_doc}
+\subinputfrom{examples/file/latex/}{refman_doc}
\chapter{Fn Example}\label{fn_example}\hypertarget{fn_example}{}
-\subinputfrom{../html/examples/func/latex/}{refman_doc}
+\subinputfrom{examples/func/latex/}{refman_doc}
\chapter{Overload Example}\label{overload_example}\hypertarget{overload_example}{}
-\subinputfrom{../html/examples/overload/latex/}{refman_doc}
+\subinputfrom{examples/overload/latex/}{refman_doc}
\chapter{Page Example}\label{page_example}\hypertarget{page_example}{}
-\subinputfrom{../html/examples/page/latex/}{refman_doc}
+\subinputfrom{examples/page/latex/}{refman_doc}
\chapter{Relates Example}\label{relates_example}\hypertarget{relates_example}{}
-\subinputfrom{../html/examples/relates/latex/}{refman_doc}
+\subinputfrom{examples/relates/latex/}{refman_doc}
\chapter{Author Example}\label{author_example}\hypertarget{author_example}{}
-\subinputfrom{../html/examples/author/latex/}{refman_doc}
+\subinputfrom{examples/author/latex/}{refman_doc}
\chapter{Par Example}\label{par_example}\hypertarget{par_example}{}
-\subinputfrom{../html/examples/par/latex/}{refman_doc}
+\subinputfrom{examples/par/latex/}{refman_doc}
\chapter{Include Example}\label{include_example}\hypertarget{include_example}{}
-\subinputfrom{../html/examples/include/latex/}{refman_doc}
+\subinputfrom{examples/include/latex/}{refman_doc}
\printindex
diff --git a/doc/doxywizard.gif b/doc/doxywizard.gif
deleted file mode 100644
index 80bb636..0000000
--- a/doc/doxywizard.gif
+++ /dev/null
Binary files differ
diff --git a/doc/doxywizard_expert.png b/doc/doxywizard_expert.png
index 5eb14d4..d07152f 100644
--- a/doc/doxywizard_expert.png
+++ b/doc/doxywizard_expert.png
Binary files differ
diff --git a/doc/doxywizard_main.png b/doc/doxywizard_main.png
index b170e15..1c4ee1b 100644
--- a/doc/doxywizard_main.png
+++ b/doc/doxywizard_main.png
Binary files differ
diff --git a/doc/doxywizard_menu.png b/doc/doxywizard_menu.png
deleted file mode 100644
index 7f37192..0000000
--- a/doc/doxywizard_menu.png
+++ /dev/null
Binary files differ
diff --git a/doc/doxywizard_menu_file.png b/doc/doxywizard_menu_file.png
new file mode 100644
index 0000000..e3c6092
--- /dev/null
+++ b/doc/doxywizard_menu_file.png
Binary files differ
diff --git a/doc/doxywizard_menu_help.png b/doc/doxywizard_menu_help.png
new file mode 100644
index 0000000..4d6812b
--- /dev/null
+++ b/doc/doxywizard_menu_help.png
Binary files differ
diff --git a/doc/doxywizard_menu_settings.png b/doc/doxywizard_menu_settings.png
new file mode 100644
index 0000000..c22e361
--- /dev/null
+++ b/doc/doxywizard_menu_settings.png
Binary files differ
diff --git a/doc/doxywizard_page1.png b/doc/doxywizard_page1.png
index 3e008d0..7834573 100644
--- a/doc/doxywizard_page1.png
+++ b/doc/doxywizard_page1.png
Binary files differ
diff --git a/doc/doxywizard_page2.png b/doc/doxywizard_page2.png
index 8343902..ec5ce51 100644
--- a/doc/doxywizard_page2.png
+++ b/doc/doxywizard_page2.png
Binary files differ
diff --git a/doc/doxywizard_page3.png b/doc/doxywizard_page3.png
index 0201981..dff15e7 100644
--- a/doc/doxywizard_page3.png
+++ b/doc/doxywizard_page3.png
Binary files differ
diff --git a/doc/doxywizard_page4.png b/doc/doxywizard_page4.png
index 1068e6c..8378a5c 100644
--- a/doc/doxywizard_page4.png
+++ b/doc/doxywizard_page4.png
Binary files differ
diff --git a/doc/doxywizard_run.png b/doc/doxywizard_run.png
new file mode 100644
index 0000000..156fc9d
--- /dev/null
+++ b/doc/doxywizard_run.png
Binary files differ
diff --git a/doc/doxywizard_usage.doc b/doc/doxywizard_usage.doc
index 310c358..8b9e428 100644
--- a/doc/doxywizard_usage.doc
+++ b/doc/doxywizard_usage.doc
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,134 +14,272 @@
*/
/*! \page doxywizard_usage Doxywizard usage
-Doxywizard is a GUI front-end for configuring and running doxygen.
+Doxywizard is a GUI front-end for configuring and running doxygen.
-Note it is possible to start the doxywizard with as argument the configuration file to be used.
+When starting doxywizard one can specify an existing configuration file to use as argument,
+otherwise the default settings will be used as a starting point.
-When you start doxywizard it will display the main window
-(the actual look depends on the OS used).
+When you start doxywizard it will display the main window
+(the actual look depends on the platform used).
\image html doxywizard_main.png "Main window"
\image latex doxywizard_main.png "Main window" width=15cm
-The windows shows the steps to take to configure and run doxygen.
-The first step is to choose one of the ways to configure doxygen.
+The user interface consists of the following sections:
<dl>
-<dt>Wizard<dd>Click this button to quickly configure the most important
- settings and leave the rest of the options to their defaults.
-<dt>Expert<dd>Click this button to gain access to the
- \ref config "full range of configuration options".
-<dt>Load<dd>Click this button to load an existing configuration file
- from disk.
+<dt>\ref dw_menu
+<dd> In the menu bar the following parts are available:
+\ref dw_menu_file, \ref dw_menu_settings and \ref dw_menu_help.
+
+<dt>Specify the working directory from which doxygen will run
+<dd>
+Using the <tt>Select...</tt> button a directory can be selected.
+When doxywizard is started with a configuration file or one is loaded using the open command
+(see: \ref dw_menu_file) the directory of this settings file used as the working directory.
+
+<dt>Configure doxygen using the Wizard and/or Expert tab...
+<dd>
+ <dl>
+ <dt>\ref dw_wizard <dd>with this tab it is possible to quickly configure the most
+ important settings and leave the rest of the options to
+ their defaults.
+ <dt>\ref dw_expert <dd>with this tab one gains access to the \ref config
+ "full set of configuration options".
+ <dt>\ref dw_run <dd>with this tab it is possible to run doxygen and view the used settings.
+ </dl>
+
+Switching between these tabs is possible, e.g you could start with the wizard tab
+and then fine tune some settings by switching to the expert tab.
+
</dl>
-Note that you can select multiple buttons in a row, for instance to first
-configure doxygen using the Wizard and then fine tune the settings via
-the Expert.
-After doxygen is configured you need to save the configuration as a file
-to disk. This second step allows doxygen to use the configuration
-and has the additional advantage that the configuration can be reused
-to run doxygen with the same settings at a later point in time.
+After doxygen is configured you need to save (see: \ref dw_menu_file) the configuration as a file
+to disk. This allows doxygen to use the configuration
+and also allows running doxygen again with the same settings at a later point in time.
-Since some configuration options may use relative paths, the next step is
-to select a directory from which to run doxygen. This is typically the root
-of the source tree and will most of the time already be filled in correctly.
+Since some configuration options may use relative paths, be sure to
+select a working directory that is root of those paths.
+This is often the root of the source tree and will typically be correctly filled in
+if the configuration file is stored at this location as well.
Once the configuration file is saved and the working directory is set, you
-can run doxygen based on the selected settings. Do this by pressing the
-"Start" button. Once doxygen runs you can cancel it by clicking the same
-button again. The output produced by doxygen is captured and shown in a log
-window. Once doxygen finishes, the log can be saved as a text file.
+can run doxygen based on the selected settings. Do this by switching to the
+\ref dw_run "Run" tab, and click the "Run doxygen" button.
+
+Once doxygen runs you can cancel it by clicking the same
+button again. The output produced by doxygen is captured and shown in the "Output produced by doxygen"
+pane. Once doxygen finishes, the log can be saved as a text file.
-<h3>The Wizard Dialog</h3>
+\section dw_wizard Wizard tab
+
+The Wizard tab is divided into two panes
+<dl>
+<dt>Left pane<dd>The main topics for easy setting up doxygen.
+By clicking on a topic the corresponding settings will appear in the Right
+pane.
+<dt>Right pane<dd>The wizard's settings pane, in this pane you will find the
+settings that are available for the selected topic.
+</dl>
-If you select the Wizard button in step 1, then a dialog with
-a number of tabs will appear.
+The wizard only gives the possibility to quickly setup doxygen, for full control
+one should use the \ref dw_expert.
-\image html doxywizard_page1.png "Wizard dialog: Project settings"
-\image latex doxywizard_page1.png "Wizard dialog: Project settings" width=13cm
+\forceNewPage
+\subsection dw_wizard_project Project settings
-The fields in the project tab speak for themselves. Once doxygen has finished
+The fields in the Project pane speak for themselves. Once doxygen has finished
the Destination directory is where to look for the results. Doxygen will
-put each output format in a separate sub-directory.
+put each output format in a separate sub-directory by default.
+
+\image html doxywizard_page1.png "Wizard tab: Project settings"
+\image latex doxywizard_page1.png "Wizard tab: Project settings" width=15cm
+
+\forceNewPage
+\subsection dw_wizard_mode Mode of operating
+
+The Mode pane allows you to select how doxygen will look at your sources.
+The default is to only look for things that have been documented. Furthermore, the
+terminology used in the output can be changed to better match the main programming language used
+(this doesn't affect the way doxygen parses your source code).
-\image html doxywizard_page2.png "Wizard dialog: Mode of operating"
-\image latex doxywizard_page2.png "Wizard dialog: Mode of operating" width=13cm
+\image html doxywizard_page2.png "Wizard tab: Mode of operating"
+\image latex doxywizard_page2.png "Wizard tab: Mode of operating" width=15cm
-The mode tab allows you to select how doxygen will look at your sources.
-The default is to only look for things that have been documented.
+\forceNewPage
+\subsection dw_wizard_output Output to produce
-You can also select how doxygen should present the results.
-The latter does not affect the way doxygen parses your source code.
+The Output pane allows you to select what kinds of output doxygen will produce.
+For HTML and \LaTeX there are additional options available.
-\image html doxywizard_page3.png "Wizard dialog: Output to produce"
-\image latex doxywizard_page3.png "Wizard dialog: Output to produce" width=13cm
+\image html doxywizard_page3.png "Wizard tab: Output to produce"
+\image latex doxywizard_page3.png "Wizard tab: Output to produce" width=15cm
-You can select one or more of the output formats that doxygen should
-produce. For HTML and \LaTeX there are additional options.
+\forceNewPage
+\subsection dw_wizard_diagrams Diagrams to generate
-\image html doxywizard_page4.png "Wizard dialog: Diagrams to generate"
-\image latex doxywizard_page4.png "Wizard dialog: Diagrams to generate" width=13cm
+Doxygen can produce a number of diagrams. Using the Diagrams pane you
+can select which ones to generate. For most diagrams the
+`dot` tool of the <a href="http://www.graphviz.org">GraphViz</a> package
+is needed. This needs to be installed separately.
-Doxygen can produce a number of diagrams. Using the diagrams tab you
-can select which ones to generate. For most diagrams the
-dot tool of the <a href="http://www.graphviz.org">GraphViz</a> package
-is needed (if you use the binary packages for MacOSX this
-tool is already included).
+\image html doxywizard_page4.png "Wizard tab: Diagrams to generate"
+\image latex doxywizard_page4.png "Wizard tab: Diagrams to generate" width=15cm
-<h3>Expert dialog</h3>
+\section dw_expert Expert tab
-The Expert dialog has a number of tab fields, one
-for each section in the configuration file. Each tab-field
-contains a number of lines, one for each configuration option in
-that section.
+The Expert tab is divided into a number of panes:
+<dl>
+<dt>Top left pane<dd>The Topics pane (i.e. sections in the
+configuration file) that are available. By clicking on a topic the
+corresponding settings will appear in the Right pane.
+<dt>Bottom left pane<dd>The help pane, this will be updated when one
+hovers over the name of a setting in the Right pane.
+<dt>Right pane<dd>The Settings pane, in this pane you will find the
+settings that are available for the selected topic. In case the name for a setting is colored
+red, the setting has a non-default value.
+In case a setting is grayed out, the setting is depending on another setting that is disabled.
+Which setting it depends on is indicated in the help pane on the bottom left.
+</dl>
-The kind of input widget depends on the type of the configuration option.
+\image html doxywizard_expert.png "Some options from the Expert tab"
+\image latex doxywizard_expert.png "Some options from the Expert tab" width=15cm
+
+The representation of the input field depends on the type of the configuration option.
<ul>
-<li>For each boolean option (those options that are answered with YES or
- NO in the configuration file) there is a check-box.
-<li>For items taking one of a fixed set of values (like
+<li>For each boolean option (those options that are answered with `YES` or
+ `NO` in the configuration file) there is a check-box. A typical field
+ looks like:<br>
+ \image{inline} html expert_bool.png
+ \image{inline} latex expert_bool.png width=4.6cm
+<li>For items taking one of a fixed set of values (like
\ref cfg_output_language "OUTPUT_LANGUAGE") a combo box is used.
+ A typical field looks like:<br>
+ \image{inline} html expert_enum.png
+ \image{inline} latex expert_enum.png width=7.3cm
<li>For items taking an integer value from a range, a spinbox is used.
-<li>For free form string-type options there is a one line edit field
-<li>For options taking a lists of strings, a one line edit field is
- available, with a `+' button to add this string to the list and
- a `-' button to remove the selected string from the list. There
- is also a `*' button that, when pressed,
- replaces the selected item in the list with the string entered in the
- edit field.
-<li>For file and folder entries, there are special buttons
- that start a file selection dialog.
+ A typical field looks like:<br>
+ \image{inline} html expert_int.png
+ \image{inline} latex expert_int.png width=10.1cm
+<li>For free form string-type options there is a one line edit field.
+ A typical field looks like:<br>
+ \image{inline} html expert_string_string.png
+ \image{inline} latex expert_string_string.png width=12.3cm
+ <br>Additionally, when the string field should contain a file or a folder name, there are the special buttons
+ \image{inline} html images/file.png height=14px \ilinebr \image{inline} latex images/file.png height=\DoxyInlineHeightChar
+ and
+ \image{inline} html images/folder.png height=14px \ilinebr \image{inline} latex images/folder.png height=\DoxyInlineHeightChar
+ that start a file / folder selection dialog.
+ A typical field for a file looks like:<br>
+ \image{inline} html expert_string_file.png
+ \image{inline} latex expert_string_file.png width=11.0cm
+ <br>and a folder looks like:<br>
+ \image{inline} html expert_string_dir.png
+ \image{inline} latex expert_string_dir.png width=11.0cm
+ <br>In case a file represents an image, doxygen also tries to display the selected image.
+ Then a typical field looks like:<br>
+ \image{inline} html expert_string_image.png
+ \image{inline} latex expert_string_image.png width=11.8cm
+<li>For options taking a list of strings, an editor field is
+ shown with a non-editable list below it. The
+ \image{inline} html images/add.png height=14px \ilinebr \image{inline} latex images/add.png height=\DoxyInlineHeightChar
+ button adds the string in the editor field to the list and a the
+ \image{inline} html images/del.png height=14px \ilinebr \image{inline} latex images/del.png height=\DoxyInlineHeightChar
+ button removes the selected string from the list. The
+ \image{inline} html images/refresh.png height=14px \ilinebr \image{inline} latex images/refresh.png height=\DoxyInlineHeightChar
+ button can be clicked to replace the selected item in the list with the string entered in the editor field.
+ A typical field looks like:<br>
+ \image{inline} html expert_list_string.png
+ \image{inline} latex expert_list_string.png width=11.2cm
+ <br>additionally when the list contains file and / or folder names, there are special buttons
+ \image{inline} html images/file.png height=14px \ilinebr \image{inline} latex images/file.png height=\DoxyInlineHeightChar
+ and
+ \image{inline} html images/folder.png height=14px \ilinebr \image{inline} latex images/folder.png height=\DoxyInlineHeightChar
+ that start a file / folder selection dialog.
+ A typical field would for a file looks like:<br>
+ \image{inline} html expert_list_file.png
+ \image{inline} latex expert_list_file.png width=11.2cm
+ <br>and for a folder it looks like<br>
+ \image{inline} html expert_list_dir.png
+ \image{inline} latex expert_list_dir.png width=11.2cm
+ <br>and in case both files and folders are allowed, the look is:<br>
+ \image{inline} html expert_list_filedir.png
+ \image{inline} latex expert_list_filedir.png width=11.9cm
</ul>
-\image html doxywizard_expert.png "Some options from the Expert dialog"
-\image latex doxywizard_expert.png "Some options from the Expert dialog" width=15cm
+\section dw_run Run tab
-The get additional information about the meaning of an option, click
-on the "Help" button at the bottom right of the dialog and then on the
-item. A tooltip with additional information will appear.
+The run tab gives the possibility to run doxygen with the given settings, see the HTML results,
+see the settings used and save the output as displayed in the output pane.
-<h3>Menu options</h3>
+\image html doxywizard_run.png "Run tab"
+\image latex doxywizard_run.png "Run tab" width=15cm
-The GUI front-end has a menu with a couple of useful items
+<dl>
+<dt>Specify additional command line options for running doxygen<dd>Field to
+specify extra options used when running doxygen, e.g. for debugging purposes.
+<dt>Run doxygen<dd>When clicked will start running doxygen.
+The "Output produced by doxygen" pane shows the messages produced by doxygen while it is running.
+Before being able to run doxygen the settings have to be saved.
+<dt>Show HTML output<dd>Clicking this button will open the main HTML output page in the default browser.
+The button will be enabled after doxygen has finished.
+<dt>Show configuration<dd>Clicking this button shows the configuration settings that are used when running
+doxygen. The results will be shown in the "Output produced by doxygen" pane in compact textual form.
+<dt>Condensed<dd>When checked the "Show configuration" button will only list the configuration
+settings that differ from the default settings (analogous to `doxygen -x`).
+<dt>Save Log ...<dd>Will save the information from the "Output produced by doxygen"
+pane in a file as specified by the user.
+</dl>
+
+\section dw_menu Menu options
+
+\subsection dw_menu_file File menu
+
+The file menu with a couple of useful items for loading and saving settings.
-\image html doxywizard_menu.png "File menu"
-\image latex doxywizard_menu.png "File menu" width=15cm
+\image html doxywizard_menu_file.png "File menu"
+\image latex doxywizard_menu_file.png "File menu" width=12.0cm
<dl>
-<dt>Open...<dd>This is the same as the "Load" button in the main window
- and allows to open a configuration file from disk.
-<dt>Save as..<dd>This is the same as the "Save" button in the main window
- and can be used to save the current configuration settings to disk.
-<dt>Recent configurations<dd>Allow to quickly load a recently saved
- configuration.
-<dt>Set as default...<dd>Stores the current configuration settings as the
+<dt>Open...<dd>Load a configuration file from disk, based on a file
+ selection dialog. In case unsaved settings exist you will be asked to
+ confirm the action.
+<dt>Open recent<dd>Quickly load a recently saved configuration file.
+ In case unsaved settings exist you will be asked to confirm the action.
+ This menu item is only accessible when there are recent files in the list.
+<dt>Save<dd>Saves a configuration file to disk. In case the configuration
+ file has already been set this file name is used otherwise a selection dialog
+ will appear. In case the file already exists a confirmation is required.
+<dt>Save as..<dd>Saves the current configuration settings to disk with
+ a specific name. This file name will become the currently set file name.
+<dt>Quit<dd>Leave doxywizard, in case unsaved settings exist you will be asked to
+ confirm the action.
+</dl>
+
+\subsection dw_menu_settings Settings menu
+
+\image html doxywizard_menu_settings.png "Settings menu"
+\image latex doxywizard_menu_settings.png "Settings menu" width=6.7cm
+
+<dl>
+<dt>Reset to factory defaults<dd>Restores the factory defaults as the default settings to use.
+ You will be asked to confirm the action. This menu item is only accessible when the current
+ settings differ from the default settings.
+<dt>Use current settings at startup<dd>Stores the current configuration settings as the
default to use next time the GUI is started. You will be asked to
confirm the action.
-<dt>Reset...<dd>Restores the factory defaults as the default settings to use.
- You will be asked to confirm the action.
+<dt>Clear recent list<dd>Clears the "Open recent" list in the \ref dw_menu_file. This menu
+ item is only accessible when there are recent files in the "Open recent" list.
</dl>
+\subsection dw_menu_help Help menu
+
+\image html doxywizard_menu_help.png "Help menu"
+\image latex doxywizard_menu_help.png "Help menu" width=7.0cm
+
+<dl>
+<dt>Online Manual<dd>Opens the doxygen manual from the doxygen home page in the system defined default HTML browser.
+<dt>About<dd>Shows an About dialog with version information.
+</dl>
\htmlonly
Go to the <a href="config.html">next</a> section or return to the
diff --git a/doc/emojisup.doc b/doc/emojisup.doc
index 0175780..2b8a16c 100644
--- a/doc/emojisup.doc
+++ b/doc/emojisup.doc
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2018 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -105,8 +105,8 @@ When invoking it with the `-d image_dir` option the images will by downloaded in
By means of the doxygen configuration parameter
\ref cfg_latex_emoji_directory "LATEX_EMOJI_DIRECTORY" the requested directory can be selected.
-For convenience a zip with the result of running the script can also be downloaded from
-http://www.doxygen.nl/dl/github_emojis.zip
+For convenience a zip with the result of running the script can also be downloaded from
+https://www.doxygen.nl/dl/github_emojis.zip
For an overview of the supported emoji one can issue the command:<br>
`doxygen -f emoji <outputFileName>`
@@ -117,4 +117,4 @@ Go to the <a href="langhowto.html">next</a> section or return to the
\endhtmlonly
*/
-
+
diff --git a/doc/expert_bool.png b/doc/expert_bool.png
new file mode 100644
index 0000000..c2081e0
--- /dev/null
+++ b/doc/expert_bool.png
Binary files differ
diff --git a/doc/expert_enum.png b/doc/expert_enum.png
new file mode 100644
index 0000000..4672080
--- /dev/null
+++ b/doc/expert_enum.png
Binary files differ
diff --git a/doc/expert_int.png b/doc/expert_int.png
new file mode 100644
index 0000000..e5048f8
--- /dev/null
+++ b/doc/expert_int.png
Binary files differ
diff --git a/doc/expert_list_dir.png b/doc/expert_list_dir.png
new file mode 100644
index 0000000..6089dd1
--- /dev/null
+++ b/doc/expert_list_dir.png
Binary files differ
diff --git a/doc/expert_list_file.png b/doc/expert_list_file.png
new file mode 100644
index 0000000..2d5a99b
--- /dev/null
+++ b/doc/expert_list_file.png
Binary files differ
diff --git a/doc/expert_list_filedir.png b/doc/expert_list_filedir.png
new file mode 100644
index 0000000..08681ec
--- /dev/null
+++ b/doc/expert_list_filedir.png
Binary files differ
diff --git a/doc/expert_list_string.png b/doc/expert_list_string.png
new file mode 100644
index 0000000..9e5d96e
--- /dev/null
+++ b/doc/expert_list_string.png
Binary files differ
diff --git a/doc/expert_string_dir.png b/doc/expert_string_dir.png
new file mode 100644
index 0000000..61479ca
--- /dev/null
+++ b/doc/expert_string_dir.png
Binary files differ
diff --git a/doc/expert_string_file.png b/doc/expert_string_file.png
new file mode 100644
index 0000000..a4a61ae
--- /dev/null
+++ b/doc/expert_string_file.png
Binary files differ
diff --git a/doc/expert_string_image.png b/doc/expert_string_image.png
new file mode 100644
index 0000000..c5cc9a0
--- /dev/null
+++ b/doc/expert_string_image.png
Binary files differ
diff --git a/doc/expert_string_string.png b/doc/expert_string_string.png
new file mode 100644
index 0000000..5d680ae
--- /dev/null
+++ b/doc/expert_string_string.png
Binary files differ
diff --git a/doc/faq.doc b/doc/faq.doc
index 8a3aee8..95de571 100644
--- a/doc/faq.doc
+++ b/doc/faq.doc
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -32,7 +32,7 @@ You should use the \ref cmdmainpage "\\mainpage" command inside a comment block
* \section install_sec Installation
*
* \subsection step1 Step 1: Opening the box
- *
+ *
* etc...
*/
\endverbatim
@@ -41,13 +41,13 @@ You should use the \ref cmdmainpage "\\mainpage" command inside a comment block
Check the following:
<ol>
- <li>Is your class / file / namespace documented? If not, it will not
+ <li>Is your class / file / namespace documented? If not, it will not
be extracted from the sources unless \ref cfg_extract_all "EXTRACT_ALL" is set to \c YES
in the configuration file.
<li>Are the members private? If so, you must set \ref cfg_extract_private "EXTRACT_PRIVATE" to \c YES
to make them appear in the documentation.
- <li>Is there a function macro in your class that does not end with a
- semicolon (e.g. MY_MACRO())? If so then you have to instruct
+ <li>Is there a function macro in your class that does not end with a
+ semicolon (e.g. MY_MACRO())? If so then you have to instruct
doxygen's preprocessor to remove it.
This typically boils down to the following settings in the configuration file:
@@ -61,14 +61,14 @@ PREDEFINED = MY_MACRO()=
Please read the \ref preprocessing "preprocessing" section of the
manual for more information.
- </ol>
+ </ol>
\section faq_extract_all When I set EXTRACT_ALL to NO none of my functions are shown in the documentation.
-In order for global functions, variables, enums, typedefs, and defines
+In order for global functions, variables, enums, typedefs, and defines
to be documented you should document the file in which these commands are
-located using a comment block containing a \ref cmdfile "\\file" (or \ref cmdfile "\@file")
-command.
+located using a comment block containing a \ref cmdfile "\\file" (or \ref cmdfile "\@file")
+command.
Alternatively, you can put all members in a group (or module)
using the \ref cmdingroup "\\ingroup" command and then document the group using a comment
@@ -76,28 +76,28 @@ block containing the \ref cmddefgroup "\\defgroup" command.
For member functions or functions that are part of a namespace you should
document either the class or namespace.
-
+
\section faq_ext_mapping My file with a custom extension is not parsed (properly) (anymore).
Doxygen only parses files that are specified as input (via the \ref cfg_input "INPUT" tag)
and that match a specified extension (mentioned in \ref cfg_file_patterns "FILE_PATTERNS")
-The list of files is then reduced by excluding files listed as \ref cfg_exclude "EXCLUDE" or
+The list of files is then reduced by excluding files listed as \ref cfg_exclude "EXCLUDE" or
files that match the patterns set by \ref cfg_exclude_patterns "EXCLUDE_PATTERNS".
In the past doxygen parsed all files with an unknown extension as C files which could lead to
undesired results. Since version 1.8.8, doxygen requires that you specify a mapping that tells
-for a certain file extension, which parser to use.
+for a certain file extension, which parser to use.
This mapping is specified using the \ref cfg_extension_mapping "EXTENSION_MAPPING" tag.
If no mapping is specified the file's contents will be ignored.
\section faq_code How can I make doxygen ignore some code fragment?
-The new and easiest way is to add one comment block
-with a \ref cmdcond "\\cond" command at the start and one comment block
+The new and easiest way is to add one comment block
+with a \ref cmdcond "\\cond" command at the start and one comment block
with a \ref cmdendcond "\\endcond" command at the end of the piece of
code that should be ignored. This should be within the same file of course.
-But you can also use doxygen's preprocessor for this:
+But you can also use doxygen's preprocessor for this:
If you put
\verbatim
#ifndef DOXYGEN_SHOULD_SKIP_THIS
@@ -115,7 +115,7 @@ as \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to `YES`.
\section faq_code_inc How can I change what is after the \#include in the class documentation?
-In most cases you can use \ref cfg_strip_from_inc_path "STRIP_FROM_INC_PATH"
+In most cases you can use \ref cfg_strip_from_inc_path "STRIP_FROM_INC_PATH"
to strip a user defined part of a path.
You can also document your class as follows
@@ -132,7 +132,7 @@ To make doxygen put <br><br>
\#include \<path/include.h\>
</code>
-in the documentation of the class MyClassName regardless of the name of the actual
+in the documentation of the class MyClassName regardless of the name of the actual
header file in which the definition of MyClassName is contained.
If you want doxygen to show that the include file should be included using
@@ -146,14 +146,14 @@ quotes instead of angle brackets you should type:
\section faq_chm How can I use tag files in combination with compressed HTML?
-If you want to refer from one compressed HTML file
-\c a.chm to another compressed HTML file
+If you want to refer from one compressed HTML file
+\c a.chm to another compressed HTML file
called \c b.chm, the
link in \c a.chm must have the following format:
\verbatim
<a href="b.chm::/file.html">
\endverbatim
-Unfortunately this only works if both compressed HTML files are in the same
+Unfortunately this only works if both compressed HTML files are in the same
directory.
As a result you must rename the generated \c index.chm files for all projects
@@ -161,7 +161,7 @@ into something unique and put all <code>.chm</code> files in one directory.
Suppose you have a project \e a referring to a project \e b using tag file
\c b.tag, then you could rename the \c index.chm for project \e a into
-\c a.chm and the \c index.chm for project \e b into \c b.chm. In the
+\c a.chm and the \c index.chm for project \e b into \c b.chm. In the
configuration file for project \e a you write:
\verbatim
TAGFILES = b.tag=b.chm::
@@ -175,7 +175,7 @@ put in your own header file by writing your own header and feed that to
\section faq_html_header The overall HTML output looks different, while I only wanted to use my own html header file
-You probably forgot to include the stylesheet <code>doxygen.css</code> that
+You probably forgot to include the stylesheet <code>doxygen.css</code> that
doxygen generates. You can include this by putting
\verbatim
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
@@ -184,11 +184,11 @@ in the HEAD section of the HTML page.
\section faq_use_qt Why does doxygen use Qt?
-The most important reason is to have a platform abstraction for most
-Unices and Windows by means of the QFile, QFileInfo, QDir, QDate,
-QTime and QIODevice classes.
-Another reason is for the nice and bug free utility classes, like QList,
-QDict, QString, QArray, QTextStream, QRegExp, QXML etc.
+The most important reason is to have a platform abstraction for most
+Unices and Windows by means of the QFile, QFileInfo, QDir, QDate,
+QTime and QIODevice classes.
+Another reason is for the nice and bug free utility classes, like QList,
+QDict, QString, QArray, QTextStream, QRegExp, QXML etc.
The GUI front-end doxywizard uses Qt for... well... the GUI!
@@ -207,32 +207,32 @@ remove the % and keep the word unlinked.
\section faq_pgm_X My favorite programming language is X. Can I still use doxygen?
-No, not as such; doxygen needs to understand the structure of what it reads.
+No, not as such; doxygen needs to understand the structure of what it reads.
If you don't mind spending some time on it, there are several options:
- If the grammar of X is close to C or C++, then it is probably not too hard to
tweak \c src/scanner.l a bit so the language is supported. This is done
- for all other languages directly supported by doxygen
+ for all other languages directly supported by doxygen
(i.e. Java, IDL, C#, PHP).
- If the grammar of X is somewhat different than you can write an input
filter that translates X into something similar enough to C/C++ for
doxygen to understand (this approach is taken for VB, Object Pascal, and
- JavaScript, see http://www.doxygen.org/download.html#helpers).
-- If the grammar is completely different one could write a parser for X and
- write a backend that produces a similar syntax tree as is done by
+ JavaScript, see https://www.doxygen.org/download.html#helpers).
+- If the grammar is completely different one could write a parser for X and
+ write a backend that produces a similar syntax tree as is done by
\c src/scanner.l (and also by \c src/tagreader.cpp while reading tag files).
\section faq_lex Help! I get the cryptic message "input buffer overflow, can't enlarge buffer because scanner uses REJECT"
This error happens when doxygen's lexical scanner has a rule that matches
-more than 256K of input characters in one go. I've seen this happening
-on a very large generated file (\>256K lines), where the built-in preprocessor
+more than 256K of input characters in one go. I've seen this happening
+on a very large generated file (\>256K lines), where the built-in preprocessor
converted it into an empty file (with \>256K of newlines). Another case
where this might happen is if you have lines in your code with more than
-256K characters.
+256K characters.
If you have run into such a case and want me to fix it, you
should send me a code fragment that triggers the message. To work around
-the problem, put some line-breaks into your file, split it up into smaller
+the problem, put some line-breaks into your file, split it up into smaller
parts, or exclude it from the input using EXCLUDE.
Another way to work around this problem is to use the cmake command with the option:
@@ -244,17 +244,17 @@ In case this option is not given the default value of 262144 (i.e. 256K) will be
\section faq_latex When running make in the latex directory I get "TeX capacity exceeded". Now what?
-You can edit the texmf.cfg file to increase the default values of the
+You can edit the texmf.cfg file to increase the default values of the
various buffers and then run "texconfig init".
\section faq_stl Why are dependencies via STL classes not shown in the dot graphs?
-Doxygen is unaware of the STL classes, unless the
+Doxygen is unaware of the STL classes, unless the
option \ref cfg_builtin_stl_support "BUILTIN_STL_SUPPORT" is turned on.
\section faq_search I have problems getting the search engine to work with PHP5 and/or windows
-Please read <a href="searching.html">this</a> for hints on where to look.
+Please read <a href="searching.html">this</a> for hints on where to look.
\section faq_cmdline Can I configure doxygen from the command line?
@@ -266,18 +266,23 @@ in a configuration file from the command line (assuming a UNIX like environment)
( cat Doxyfile ; echo "PROJECT_NUMBER=1.0" ) | doxygen -
\endverbatim
-For Windows the following would do the same:
+For Windows command line the following would do the same:
\verbatim
( type Doxyfile & echo PROJECT_NUMBER=1.0 ) | doxygen.exe -
\endverbatim
-If multiple options with the same name are specified then doxygen will use
+For Windows Powershell (checked with version 5.1) the following would do the same:
+\verbatim
+&{ type Doxyfile ; echo "PROJECT_NUMBER=1.0" } | doxygen -
+\endverbatim
+
+If multiple options with the same name are specified then doxygen will use
the last one. To append to an existing option you can use the += operator.
\section faq_name How did doxygen get its name?
-Doxygen got its name from playing with the words
+Doxygen got its name from playing with the words
documentation and generator.
\verbatim
@@ -286,19 +291,19 @@ generator -> gen
\endverbatim
At the time I was looking into \c lex and \c yacc, where a lot of things start with
-"yy", so the "y" slipped in and made things pronounceable
+"yy", so the "y" slipped in and made things pronounceable
(the proper pronouncement is Docs-ee-gen, so with a long "e").
\section faq_why What was the reason to develop doxygen?
I once wrote a GUI widget based on the Qt library (it is still available at
-https://sourceforge.net/projects/qdbttabular/ but hasn't been updated since 2002).
-Qt had nicely generated documentation (using an internal tool which
-<a href="http://rant.gulbrandsen.priv.no/udoc/history">they didn't want to release</a>)
-and I wrote similar docs by hand.
+https://sourceforge.net/projects/qdbttabular/ but hasn't been updated since 2002).
+Qt had nicely generated documentation (using an internal tool which
+<a href="https://rant.gulbrandsen.priv.no/udoc/history">they didn't want to release</a>)
+and I wrote similar docs by hand.
This was a nightmare to maintain, so I wanted a similar tool. I looked at
Doc++ but that just wasn't good enough (it didn't support signals and
-slots and did not have the Qt look and feel I had grown to like),
+slots and did not have the Qt look and feel I had grown to like),
so I started to write my own tool...
\htmlonly
diff --git a/doc/features.doc b/doc/features.doc
index 65fc343..e746ac3 100644
--- a/doc/features.doc
+++ b/doc/features.doc
@@ -29,7 +29,7 @@
<li>Generates structured XML output for parsed sources, which can be
used by external tools.
<li>Supports C/C++, Java, (Corba and Microsoft) Java, Python, VHDL, PHP
- IDL, C#, Fortran, TCL, Objective-C 2.0, and to some extent D sources.
+ IDL, C#, Fortran, Objective-C 2.0, and to some extent D sources.
<li>Supports documentation of files, namespaces, packages, classes,
structs, unions, templates, variables, functions, typedefs, enums and
defines.
@@ -100,7 +100,7 @@
Although doxygen can now be used in any project written in a language that is
supported by doxygen, initially it was specifically designed to be used for projects
that make use of Qt Software's
-<A HREF="https://www.qt.io/developers/">Qt toolkit</A>. I have tried to
+<A HREF="https://www.qt.io/developers">Qt toolkit</A>. I have tried to
make doxygen `Qt-compatible'. That is: Doxygen can read the documentation contained in
the Qt source code and create a class browser that looks quite similar to the
one that is generated by Qt Software. Doxygen understands the C++ extensions
diff --git a/doc/formulas.doc b/doc/formulas.doc
index 88a8725..e9a8076 100644
--- a/doc/formulas.doc
+++ b/doc/formulas.doc
@@ -106,13 +106,12 @@ get rid of an incorrect formula as well as the <code>form_*</code> files.
To have the possibility to define your own \LaTeX commands, for e.g. formula building blocks
or consistent writing of certain words, the configuration option \ref cfg_formula_macrofile "FORMULA_MACROFILE"
can be used. to supply a file with \LaTeX commands.
-This file can contain \LaTeX `\newcommand` and \`renewcommand` commands and they are included
+This file can contain \LaTeX `\newcommand` and `\renewcommand` commands and they are included
formulas (image version and MathJax version) as well as in the generated \LaTeX output (for PDF generation).<br>
The `\newcommand` (and `\renewcommand`) are restricted to a version without optional
parameters so only the following types are supported:
```
\newcommand{\cmd}{replacement}
- and
\newcommand{\cmd}[nr]{replacement}
```
e.g.
diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc
index edc14d9..524233c 100644
--- a/doc/htmlcmds.doc
+++ b/doc/htmlcmds.doc
@@ -390,6 +390,7 @@ comments can be used:
\verbatim
/*! <!-- This is a comment with a comment block --> Visible text */
\endverbatim
+The part `<!-- ... -->` will not be shown in the main documentation.
\htmlonly
diff --git a/doc/index.doc b/doc/index.doc
index 2148add..ae46087 100644
--- a/doc/index.doc
+++ b/doc/index.doc
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -14,13 +14,13 @@
* input used in their production; they are not affected by this license.
*
*/
-/*!
-\mainpage
+/*!
+\mainpage
<!--Doxygen Manual-->
\if logo_on
<center>
\htmlonly
-<img src="doxygen_logo.gif" width="634" height="197" alt="doxygen"/><br/>
+<img src="doxygen_logo.svg" width="634" height="197" alt="doxygen"/><br/>
Version: $(VERSION)
\endhtmlonly
</center>
@@ -28,32 +28,32 @@ Version: $(VERSION)
<h2>Introduction</h2>
Doxygen is the de facto standard tool for generating documentation from
-annotated C++ sources, but it also supports other popular programming
-languages such as C, Objective-C, C#, PHP, Java, Python, IDL
-(Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL, Tcl, and to some extent D.
+annotated C++ sources, but it also supports other popular programming
+languages such as C, Objective-C, C#, PHP, Java, Python, IDL
+(Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL and to some extent D.
Doxygen can help you in three ways:
<ol>
-<li> It can generate an on-line documentation browser (in HTML) and/or an
- off-line reference manual (in \LaTeX) from a set
- of documented source files.
- There is also support for generating output in RTF (MS-Word),
+<li> It can generate an on-line documentation browser (in HTML) and/or an
+ off-line reference manual (in \LaTeX) from a set
+ of documented source files.
+ There is also support for generating output in RTF (MS-Word),
PostScript, hyperlinked PDF, compressed HTML, and Unix man pages.
The documentation is extracted directly from the sources, which
makes it much easier to keep the documentation consistent with the
source code.
-<li> You can \ref extract_all "configure" doxygen to extract the code structure
- from undocumented source files. This is very useful to quickly
- find your way in large source distributions.
- Doxygen can also visualize the relations between the various elements
+<li> You can \ref extract_all "configure" doxygen to extract the code structure
+ from undocumented source files. This is very useful to quickly
+ find your way in large source distributions.
+ Doxygen can also visualize the relations between the various elements
by means of include dependency graphs, inheritance diagrams,
and collaboration diagrams, which are all generated automatically.
<li> You can also use doxygen for creating normal documentation (as I did
for the doxygen user manual and web-site).
</ol>
-Doxygen is developed under Mac OS X and Linux, but is set-up to be highly
-portable. As a result, it runs on most other Unix flavors as well.
+Doxygen is developed under Mac OS X and Linux, but is set-up to be highly
+portable. As a result, it runs on most other Unix flavors as well.
Furthermore, executables for Windows are available.
\n
@@ -61,21 +61,21 @@ This manual is divided into three parts, each of which is divided into several s
The first part forms a user manual:
<ul>
-<li>Section \ref install discusses how to
- <a href="http://www.doxygen.org/download.html">download</a>, compile and install
+<li>Section \ref install discusses how to
+ <a href="https://www.doxygen.org/download.html">download</a>, compile and install
doxygen for your platform.
-<li>Section \ref starting tells you how to generate your first piece of
- documentation quickly.
+<li>Section \ref starting tells you how to generate your first piece of
+ documentation quickly.
<li>Section \ref docblocks demonstrates the various ways that code can
be documented.
<li>Section \ref markdown show the Markdown formatting supported by doxygen.
<li>Section \ref lists shows how to create lists.
-<li>Section \ref grouping shows how to group things together.
+<li>Section \ref grouping shows how to group things together.
<li>Section \ref tables shows how to insert tables in the documentation.
<li>Section \ref formulas shows how to insert formulas in the documentation.
<li>Section \ref diagrams describes the diagrams and graphs that doxygen can generate.
<li>Section \ref preprocessing explains how doxygen deals with macro definitions.
-<li>Section \ref autolink shows how to put links to files, classes,
+<li>Section \ref autolink shows how to put links to files, classes,
and members in the documentation.
<li>Section \ref output shows how to generate the various output formats
supported by doxygen.
@@ -85,7 +85,7 @@ The first part forms a user manual:
by doxygen.
<li>Section \ref custcmd show how to define and use custom commands in your comments.
<li>Section \ref external explains how to let doxygen create links to externally generated documentation.
-<li>Section \ref faq gives answers to frequently asked questions.
+<li>Section \ref faq gives answers to frequently asked questions.
<li>Section \ref trouble tells you what to do when you have problems.
</ul>
@@ -94,10 +94,10 @@ The second part forms a reference manual:
<ul>
<li>Section \ref features presents an overview of what doxygen can do.
<li>Section \ref doxygen_usage shows how to use the \c doxygen program.
-<li>Section \ref doxywizard_usage shows how to use the \c doxywizard program.
-<li>Section \ref config shows how to fine-tune doxygen, so it
+<li>Section \ref doxywizard_usage shows how to use the \c doxywizard program.
+<li>Section \ref config shows how to fine-tune doxygen, so it
generates the documentation you want.
-<li>Section \ref commands shows an overview of the special commands that can be
+<li>Section \ref commands shows an overview of the special commands that can be
used within the documentation.
<li>Section \ref htmlcmds shows an overview of the HTML commands that
can be used within the documentation.
@@ -121,14 +121,14 @@ The third part provides information for developers:
\addindex license
\addindex GPL
-Copyright &copy; 1997-2019 by
+Copyright &copy; 1997-2019 by
<a href="mailto:doxygen@gmail.com">Dimitri van Heesch</a>.<p>
Permission to use, copy, modify, and distribute this software and its
-documentation under the terms of the GNU General Public License is hereby
-granted. No representations are made about the suitability of this software
+documentation under the terms of the GNU General Public License is hereby
+granted. No representations are made about the suitability of this software
for any purpose. It is provided "as is" without express or implied warranty.
-See the
+See the
<a href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">
GNU General Public License</a>
for more details.
@@ -139,23 +139,22 @@ input used in their production; they are not affected by this license.
<h2>User examples</h2>
Doxygen supports a number of \ref output "output formats" where HTML is the
-most popular one. I've gathered
-<a href="http://www.doxygen.org/results.html">some nice examples</a>
+most popular one. I've gathered
+<a href="https://www.doxygen.org/results.html">some nice examples</a>
of real-life projects using doxygen.
These are part of a larger
-<a href="http://www.doxygen.org/projects.html">list of projects</a>
+<a href="https://www.doxygen.org/projects.html">list of projects</a>
that use doxygen.
-If you know other projects, let <a href="mailto:doxygen@gmail.com?subject=New%20project%20using%20Doxygen">me</a>
-know and I'll add them.
+If you know other projects, let <a href="mailto:doxygen@gmail.com?subject=New%20project%20using%20Doxygen">me</a>
+know and I'll add them.
<h2>Future work</h2>
-Although doxygen is successfully used by large number of companies and
-open source projects already, there is always room for improvement.
+Although doxygen is successfully used by large number of companies and
+open source projects already, there is always room for improvement.
<p>
-You can submit enhancement requests in
+You can also submit enhancement requests in
<a href="https://github.com/doxygen/doxygen/issues">the bug tracker</a>.
-Make sure the severity of the bug report is set to "enhancement".
<h2>Acknowledgments</h2>
\addindex acknowledgments
@@ -163,19 +162,19 @@ Thanks go to:
<ul>
<li>\addindex Doc++
Malte Z&ouml;ckler and Roland Wunderling, authors of DOC++.
- The first version of doxygen borrowed some code of an old version of DOC++.
- Although I have rewritten practically all code since then, DOC++ has still
+ The first version of doxygen borrowed some code of an old version of DOC++.
+ Although I have rewritten practically all code since then, DOC++ has still
given me a good start in writing doxygen.
<li>All people at Qt Software, for creating a beautiful GUI Toolkit
(which is very useful as a Windows/Unix platform abstraction layer :-)
<li>My brother Frank
for rendering the logos.
<li>Harm van der Heijden for adding HTML help support.
-<li>Wouter Slegers of
- <a href="http://www.yourcreativesolutions.nl">Your Creative Solutions</a>
+<li>Wouter Slegers of
+ <a href="http://www.yourcreativesolutions.nl">Your Creative Solutions</a>
for registering the www.doxygen.org domain.
<li>Parker Waechter for adding the RTF output generator.
-<li>Joerg Baumann, for adding conditional documentation blocks,
+<li>Joerg Baumann, for adding conditional documentation blocks,
PDF links, and the configuration generator.
<li>Tim Mensch for adding the todo command.
<li>Christian Hammond for redesigning the web-site.
@@ -183,7 +182,7 @@ Thanks go to:
<li>Talin for adding support for C# style comments with XML markup.
<li>Petr Prikryl for coordinating the internationalization support.
All language maintainers for providing translations into many languages.
-<li>The band <a href="http://www.porcupinetree.com/">Porcupine Tree</a> for
+<li>The band <a href="http://www.porcupinetree.com/">Porcupine Tree</a> for
providing hours of great music to listen to while coding.
<li>many, many others for suggestions, patches and bug reports.
</ul>
diff --git a/doc/index.hhp.txt b/doc/index.hhp.txt
index b676d83..3bf8701 100644
--- a/doc/index.hhp.txt
+++ b/doc/index.hhp.txt
@@ -102,7 +102,7 @@ examples/tag/html/tab_a.png
examples/tag/html/tab_b.png
examples/tag/html/tab_h.png
examples/tag/html/tab_s.png
-examples/template/html/tab_a.png
-examples/template/html/tab_b.png
-examples/template/html/tab_h.png
-examples/template/html/tab_s.png
+examples/templ/html/tab_a.png
+examples/templ/html/tab_b.png
+examples/templ/html/tab_h.png
+examples/templ/html/tab_s.png
diff --git a/doc/install.doc b/doc/install.doc
index b711cd4..99cecc6 100644
--- a/doc/install.doc
+++ b/doc/install.doc
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,26 +19,25 @@
\addindex installation
\tableofcontents{html,latex}
-First go to the
-<a href="http://www.doxygen.org/download.html">download</a> page
+First go to the
+<a href="https://www.doxygen.org/download.html">download</a> page
to get the latest distribution, if you have not downloaded doxygen already.
\section install_src_unix Compiling from source on UNIX
-If you downloaded the source distribution, you need at least the
+If you downloaded the source distribution, you need at least the
following to build the executable:
<ul>
-<li>The <a href="ftp://prep.ai.mit.edu/pub/gnu/">GNU</a> tools
- \c flex, \c bison, \c libiconv and <code>GNU make</code>, and \c strip
+<li>The <a href="ftp://prep.ai.mit.edu/pub/gnu/">GNU</a> tools
+ \c flex, \c bison, \c libiconv and <code>GNU make</code>
\addindex flex
\addindex bison
\addindex libiconv
\addindex make
- \addindex strip
\addindex python
-<li>You need \c python (version 2.6 or higher, see https://www.python.org).
-<li>In order to generate a \c Makefile for your platform, you need
- <a href="https://cmake.org/">cmake</a> version 3.1.3 or later.
+<li>You need \c python (version 2.7 or higher, see https://www.python.org).
+<li>In order to generate a \c Makefile for your platform, you need
+ <a href="https://cmake.org/">cmake</a> version 3.3 or later.
\addindex cmake
</ul>
@@ -46,24 +45,24 @@ To take full advantage of doxygen's features the following additional
tools should be installed.
<ul>
-<li>Qt Software's GUI toolkit
- <a href="https://www.qt.io/developers/">Qt</A>
+<li>Qt Software's GUI toolkit
+ <a href="https://www.qt.io/developers">Qt</A>
\addindex Qt
version 4.3 or higher (including Qt 5).
- This is needed to build the GUI front-end doxywizard.
+ This is needed to build the GUI front-end doxywizard.
<li>A \LaTeX distribution: for instance
<a href="http://www.tug.org/interest.html#free">TeX Live</a>
This is needed for generating \LaTeX, Postscript, and PDF output.
<li><a href="http://www.graphviz.org/">
- the Graph visualization toolkit version 1.8.10 or higher</a>
- Needed for the include dependency graphs,
+ the Graph visualization toolkit version 2.38 or higher</a>
+ Needed for the include dependency graphs,
the graphical inheritance graphs, and the collaboration graphs.
If you compile graphviz yourself, make sure you do include
- freetype support (which requires the freetype library and header files),
+ freetype support (which requires the freetype library and header files),
otherwise the graphs will not render proper text labels.
<li>For formulas in the HTML output (when MathJax is not used)
or in case you do not wish to use `pdflatex`,
- the ghostscript interpreter is needed. You can find it at
+ the ghostscript interpreter is needed. You can find it at
<a href="https://www.ghostscript.com/">www.ghostscript.com</a>.
</ul>
@@ -71,7 +70,7 @@ Compilation is now done by performing the following steps:
<ol>
<li>Unpack the archive, unless you already have done that:
-
+
gunzip doxygen-$VERSION.src.tar.gz # uncompress the archive
tar xf doxygen-$VERSION.src.tar # unpack it
@@ -106,16 +105,16 @@ Compilation is now done by performing the following steps:
should be available in the bin directory within the build directory.
<li>Optional: Generate the user manual.
-
+
cmake -Dbuild_doc=YES ..
make docs
To let doxygen generate the HTML and PDF documentation.
-
+
The HTML directory within the build directory will now contain the html
documentation (just point a HTML browser to the file
<code>index.html</code> in the html directory).
-
+
<li>Optional: static linking
If you want to build a statically linked version of doxygen that embeds libclang
@@ -142,32 +141,22 @@ Compilation is now done by performing the following steps:
\section install_bin_unix Installing the binaries on UNIX
After the compilation of the source code do a <code>make install</code>
-to install doxygen. If you downloaded the binary distribution for UNIX,
+to install doxygen. If you downloaded the binary distribution for Linux,
type:
- ./configure
make install
-Binaries are installed into the directory <code>\<prefix\>/bin</code>.
-Use <code>make install_docs</code> to install the
-documentation and examples into <code>\<docdir\>/doxygen</code>.
-
-<code>\<prefix\></code> defaults to <code>/usr/local</code> but can be changed with
-the `--prefix` option of the configure script.
-The default <code>\<docdir\></code> directory is
-<code>\<prefix\>/share/doc/packages</code> and can be changed with
-the `--docdir` option of the configure script.
-
-Alternatively, you can also copy the binaries from the <code>bin</code>
-directory manually to some <code>bin</code> directory in your search path.
-This is sufficient to use doxygen.
+Binaries are installed into the directory <code>/usr/local/bin</code>,
+man pages in <code>/usr/local/man/man1</code> and documentation in
+<code>/usr/local/doc/doxygen</code>
+To change this just edit the Makefile.
\note You need the GNU install tool for this to work (it is part of
-the coreutils package). Other install tools may put the binaries in
+the coreutils package). Other install tools may put the binaries in
the wrong directory!
-If you have a RPM or DEP package, then please follow the
-standard installation procedure that is required for these packages.
+If you have a RPM or DEP package, then please follow the
+standard installation procedure that is required for these packages.
\section install_src_windows Compiling from source on Windows
@@ -175,11 +164,11 @@ From version 1.8.10 onwards, build files need to be generated by cmake.
cmake can be downloaded from https://cmake.org/download/
\addindex cmake
-At the moment only the express version of Visual Studio 2013 is tested,
+At the moment only the express version of Visual Studio 2015 and 2017 are tested,
but other version might also work.
-Alternatively, you can compile doxygen
-\ref install_src_unix "the UNIX way" using
+Alternatively, you can compile doxygen
+\ref install_src_unix "the UNIX way" using
<a href="https://en.wikipedia.org/wiki/Cygwin">Cygwin</a>
or <a href="http://www.mingw.org/">MinGW</a>.
@@ -189,7 +178,7 @@ The next step is to install modern versions of \c bison and \c flex
(see https://sourceforge.net/projects/winflexbison/. After installation and adding them to
your `path` rename `win_flex.exe` to `flex.exe` and `win_bison.exe` to `bison.exe`)
\addindex python
-Furthermore you have to install \c python (version 2.6 or higher, see https://www.python.org).
+Furthermore you have to install \c python (version 2.7 or higher, see https://www.python.org).
These packages are needed during the compilation process.
Download doxygen's source tarball and put it somewhere (e.g. use <code>c:\\tools</code>)
@@ -209,11 +198,20 @@ cd into the \c doxygen-x.y.z directory, create and cd to a build directory
\verbatim
mkdir build
cd build
-cmake -G "Visual Studio 12 2013" ..
+cmake -G "Visual Studio 14 2015" ..
+\endverbatim
+This will create a project file then can be opened in Visual Studio.
+
+If you prefer compiling from the command prompt you can use the following instead:
+\verbatim
+mkdir build
+cd build
+cmake -G "NMake Makefiles" ..
+nmake
\endverbatim
Note that compiling Doxywizard requires Qt 4.3 or newer
-(see https://www.qt.io/developers/).
+(see https://www.qt.io/developers).
Also read the next section for additional tools you may need to install to run
doxygen with certain features enabled.
@@ -224,34 +222,34 @@ Doxygen comes as a self-installing archive, so installation is extremely simple.
Just follow the dialogs.
After installation it is recommended to also download and install GraphViz
-(version 2.20 or better is highly recommended). Doxygen can use the \c dot tool
-of the GraphViz package to render nicer diagrams, see the
+(version 2.38 or better is highly recommended). Doxygen can use the \c dot tool
+of the GraphViz package to render nicer diagrams, see the
\ref cfg_have_dot "HAVE_DOT" option in the configuration file.
-If you want to produce compressed HTML files (see \ref
-cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the configuration file, then
-you need the Microsoft HTML help workshop.
-You can download it from
+If you want to produce compressed HTML files (see \ref
+cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the configuration file, then
+you need the Microsoft HTML help workshop.
+You can download it from
<a href="https://www.microsoft.com/en-us/download/details.aspx?id=21138">Microsoft</a>.
-If you want to produce Qt Compressed Help files (see \ref
-cfg_qhg_location "QHG_LOCATION") in the configuration file, then
-you need qhelpgenerator which is part of Qt.
+If you want to produce Qt Compressed Help files (see \ref
+cfg_qhg_location "QHG_LOCATION") in the configuration file, then
+you need qhelpgenerator which is part of Qt.
You can download Qt from <a href="https://www.qt.io/download">Qt Software Downloads</a>.
In order to generate PDF output or use scientific formulas you will also need to
-install <a href="https://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and
-<a href="https://en.wikipedia.org/wiki/Ghostscript">Ghostscript</a>.
+install <a href="https://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and
+<a href="https://en.wikipedia.org/wiki/Ghostscript">Ghostscript</a>.
For \LaTeX a number of distributions exists. Popular ones that should work with
-doxygen are <a href="https://miktex.org/">MikTex</a>
+doxygen are <a href="https://miktex.org/">MikTex</a>
and <a href="https://www.tug.org/protext/">proTeXt</a>.
-Ghostscript can be <a href="https://sourceforge.net/projects/ghostscript/">downloaded</a>
+Ghostscript can be <a href="https://sourceforge.net/projects/ghostscript/">downloaded</a>
from Sourceforge.
After installing \LaTeX and Ghostscript you'll need to make sure the tools
-latex.exe, pdflatex.exe, and gswin32c.exe are present in the search path of a
+latex.exe, pdflatex.exe, and gswin32c.exe (or gswin64c.exe) are present in the search path of a
command box. Follow <a href="https://www.computerhope.com/issues/ch000549.htm">these</a>
instructions if you are unsure and run the commands from a command box to verify it works.
diff --git a/doc/language.tpl b/doc/language.tpl
index 9e334c6..4728007 100644
--- a/doc/language.tpl
+++ b/doc/language.tpl
@@ -106,28 +106,12 @@ Just follow the following steps:
See the HTML specification for the codes.
</ul>
</ul>
-<li>
- <ul>
- <li>On *nix systems:<br>
- <ul>
- <li>Rerun the `configure` script from the root (i.e. in the \c doxygen directory) so
- that it generates `doxygen/src/lang_cfg.h`.
- This file should now contain a \c \#define for your language code.<br>
- <li>Run \c make again from the root (i.e. in the \c doxygen
- directory) of the distribution, in order to regenerate the `Makefile`s.
- </ul>
- <li> On Windows:<br>
- <ul>
- <li>stop Visual Stdio<br>
- <li>open a command window<br>
- <li>goto the directory `doxygen\src`<br>
- <li>give the command `python languages.py > ..\winbuild\Languages.rules`<br>
- <li>close the command window<br>
- <li>start Visual Studio again<br>
- <li>Your language should now be selectable in the `General` part of the `Settings` of the `Properties`
- window of `lang_cfg.py`, by default Your language will be `on`. Rebuild `doxygen` (and `doxywizard`) now.
- </ul>
- </ul>
+<li>Edit <code>doxygen/doc/maintainers.txt</code> and add yourself to the list of maintainers like:
+ \code
+ TranslatorYourLanguage
+ <your name>: <your dot email at your dot domain>
+ \endcode
+<li>Build the documentation by giving the appropriate build command (like: `make docs`).
<li>Now you can use <code>OUTPUT_LANGUAGE = your_language_name</code>
in the config file to generate output in your language.
<li>Send <code>translator_xx.h</code> to me so I can add it to doxygen.
diff --git a/doc/manual.sty b/doc/manual.sty
index 643bd40..12f3911 100644
--- a/doc/manual.sty
+++ b/doc/manual.sty
@@ -8,33 +8,43 @@
% Setup fancy headings
\RequirePackage{fancyhdr}
-\pagestyle{fancyplain}
\newcommand{\clearemptydoublepage}{%
\newpage{\pagestyle{empty}\cleardoublepage}%
}
+% Used by @image
+% (only if inline is specified)
+\newlength{\DoxyInlineHeightChar}
+\settoheight{\DoxyInlineHeightChar}{H}
+\renewenvironment{DoxyInlineImage}{%
+\settoheight{\DoxyInlineHeightChar}{H}
+}{%
+}
+
+% Headers & footers
+\pagestyle{fancyplain}
+\renewcommand{\footrulewidth}{0.4pt}
+%
+\fancypagestyle{fancyplain}{
+\fancyhf{}
+\fancyhead[LE, RO]{\bfseries\thepage}
+\fancyhead[LO]{\bfseries\rightmark}
+\fancyhead[RE]{\bfseries\leftmark}
+\fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen @VERSION@ }
+}
+%
+\fancypagestyle{plain}{
+\fancyhf{}
+\fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen @VERSION@ }
+\renewcommand{\headrulewidth}{0pt}}
+%
+\pagestyle{fancyplain}
\renewcommand{\chaptermark}[1]{%
\markboth{#1}{}%
}
\renewcommand{\sectionmark}[1]{%
\markright{\thesection\ #1}%
}
-\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
-\fancyhead[CE]{\fancyplain{}{}}
-\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
-\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
-\fancyhead[CO]{\fancyplain{}{}}
-\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
-\fancyfoot[LE]{\fancyplain{}{}}
-\fancyfoot[CE]{\fancyplain{}{}}
-\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen @VERSION@ }}
-\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen @VERSION@ }}
-\fancyfoot[CO]{\fancyplain{}{}}
-\fancyfoot[RO]{\fancyplain{}{}}
-
-% Define caption that is also suitable in a table
-\makeatletter
-\def\doxyfigcaption{%
-\refstepcounter{figure}%
-\@dblarg{\@caption{figure}}}
-\makeatother
+%
+\usepackage{xpatch}
+\xpatchcmd{\part}{plain}{empty}{}{}
diff --git a/doc/markdown.doc b/doc/markdown.doc
index 883e831..eba9431 100644
--- a/doc/markdown.doc
+++ b/doc/markdown.doc
@@ -155,7 +155,10 @@ Examples:
______
Note that using asterisks in comment blocks does not work. See
-\ref mddox_stars for details.
+\ref mddox_stars for details.<br>
+Note that when using hyphens and the previous line is not empty you have to
+use at least one whitespace in the sequence of hyphens otherwise it might be
+seen as a level 2 header (see \ref md_headers).
\subsection md_emphasis Emphasis
diff --git a/doc/output.doc b/doc/output.doc
index 6d1a567..77f4092 100644
--- a/doc/output.doc
+++ b/doc/output.doc
@@ -33,7 +33,7 @@ The following output formats are \e directly supported by doxygen:
<dt><b>XML</b>
<dd>Generated if \ref cfg_generate_xml "GENERATE_XML" is set to \c YES in the configuration file.<p>
<dt><b>DocBook</b>
-<dd>Generated if \ref cfg_generate_docbook "GENERATE_DOCBOOOK" is set to \c YES in the configuration file.<p>
+<dd>Generated if \ref cfg_generate_docbook "GENERATE_DOCBOOK" is set to \c YES in the configuration file.<p>
</dl>
The following output formats are \e indirectly supported by doxygen:
diff --git a/doc/starting.doc b/doc/starting.doc
index 045f66c..3ae2692 100644
--- a/doc/starting.doc
+++ b/doc/starting.doc
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -17,12 +17,12 @@
/*! \page starting Getting started
\tableofcontents{html,latex}
-The executable \c doxygen is the main program that parses the sources and
+The executable \c doxygen is the main program that parses the sources and
generates the documentation. See section \ref doxygen_usage for more
detailed usage information.
-Optionally, the executable \c doxywizard can be used, which is a
-\ref doxywizard_usage "graphical front-end" for editing the configuration file
+Optionally, the executable \c doxywizard can be used, which is a
+\ref doxywizard_usage "graphical front-end" for editing the configuration file
that is used by doxygen and for running doxygen in a graphical environment.
For Mac OS X doxywizard will be started by clicking on the doxygen application
icon.
@@ -31,29 +31,29 @@ The following figure shows the relation between the tools and the flow
of information between them (it looks complex but that's only because it
tries to be complete):
-\image html infoflow.png "Doxygen information flow"
+\image html infoflow.png "Doxygen information flow"
\image latex infoflow.eps "Doxygen information flow" width=14cm
\section step0 Step 0: Check if doxygen supports your programming language
First, assure that your programming language has a reasonable chance of being
recognized by doxygen. These languages are supported by default: C, C++, C#,
-Objective-C, IDL, Java, VHDL, PHP, Python, Tcl, Fortran, and D. It
+Objective-C, IDL, Java, VHDL, PHP, Python, Fortran and D. It
is possible to configure certain file type extensions to use certain parsers:
-see the \ref cfg_extension_mapping "Configuration/ExtensionMappings" for details.
-Also, completely different languages can be supported by using preprocessor
-programs: see the <a href="http://www.doxygen.org/helpers.html">Helpers page</a>
+see the \ref cfg_extension_mapping "Configuration/ExtensionMappings" for details.
+Also, completely different languages can be supported by using preprocessor
+programs: see the <a href="https://www.doxygen.org/helpers.html">Helpers page</a>
for details.
\section step1 Step 1: Creating a configuration file
Doxygen uses a configuration file to determine all of its settings.
Each project should get its own configuration file. A project can consist
-of a single source file, but can also be an entire source tree that is
+of a single source file, but can also be an entire source tree that is
recursively scanned.
-To simplify the creation of a configuration file, doxygen can create a
-template configuration file for you. To do this call \c doxygen
+To simplify the creation of a configuration file, doxygen can create a
+template configuration file for you. To do this call \c doxygen
from the command line with the \c -g option:
\verbatim
doxygen -g <config-file>
@@ -61,48 +61,49 @@ doxygen -g <config-file>
where \<config-file\> is the name of the configuration file. If you omit
the file name, a file named \c Doxyfile will be created. If a file with the
-name \<config-file\> already exists, doxygen will rename it to
+name \<config-file\> already exists, doxygen will rename it to
\<config-file\>.bak before generating the configuration template.
-If you use <code>-</code> (i.e. the minus sign) as the file name then
-doxygen will try to read the configuration file from standard
+If you use <code>-</code> (i.e. the minus sign) as the file name then
+doxygen will try to read the configuration file from standard
input (<code>stdin</code>), which can be useful for scripting.
-The configuration file has a format that is similar to that of a (simple)
+The configuration file has a format that is similar to that of a (simple)
Makefile. It consists of a number of assignments (tags) of the form:
<tt>TAGNAME = VALUE</tt> or <br>
<tt>TAGNAME = VALUE1 VALUE2 ... </tt><br>
-You can probably leave the values of most tags in a generated template
-configuration file to their default value. See section \ref config for
-more details about the configuration file.
+You can probably leave the values of most tags in a generated template
+configuration file to their default value. See section \ref config for
+more details about the configuration file.
-If you do not wish to edit the configuration file with a text editor, you should
-have a look at \ref doxywizard_usage "doxywizard", which is a GUI
-front-end that can create, read and write doxygen configuration files,
+If you do not wish to edit the configuration file with a text editor, you should
+have a look at \ref doxywizard_usage "doxywizard", which is a GUI
+front-end that can create, read and write doxygen configuration files,
and allows setting configuration options by entering them via dialogs.
-For a small project consisting of a few C and/or C++ source
+For a small project consisting of a few C and/or C++ source
and header files, you can leave
\ref cfg_input "INPUT" tag empty and doxygen will search for sources in
-the current directory.
-
-If you have a larger project consisting of a source directory or tree
-you should assign the root directory or
-directories to the \ref cfg_input "INPUT" tag, and add one or more file
-patterns to the \ref cfg_file_patterns "FILE_PATTERNS" tag
-(for instance `*.cpp *.h`). Only files that match one of the
-patterns will be parsed (if the patterns are omitted a list of
+the current directory.
+
+If you have a larger project consisting of a source directory or tree
+you should assign the root directory or
+directories to the \ref cfg_input "INPUT" tag, and add one or more file
+patterns to the \ref cfg_file_patterns "FILE_PATTERNS" tag
+(for instance `*.cpp *.h`). Only files that match one of the
+patterns will be parsed (if the patterns are omitted a list of
typical patterns is used for the types of files doxygen supports).
-For recursive parsing of a source tree you must set
-the \ref cfg_recursive "RECURSIVE" tag to \c YES. To further fine-tune the
-list of files that is parsed the \ref cfg_exclude "EXCLUDE" and
+For recursive parsing of a source tree you must set
+the \ref cfg_recursive "RECURSIVE" tag to \c YES. To further fine-tune the
+list of files that is parsed the \ref cfg_exclude "EXCLUDE" and
\ref cfg_exclude_patterns "EXCLUDE_PATTERNS" tags can be used.
To omit all \c test directories from a source tree for instance, one could use:
-\verbatim EXCLUDE_PATTERNS = */test/*
+\verbatim EXCLUDE_PATTERNS = */test/*
\endverbatim
+\anchor default_file_extension_mapping
Doxygen looks at the file's extension to determine how to parse a file,
using the following table:
@@ -114,15 +115,15 @@ Extension | Language | Extension | Language | Extension | Language
.cc |C / C++ | .java |Java | .f95 |Fortran
.cxx |C / C++ | .cs |C# | .f03 |Fortran
.cpp |C / C++ | .d |D | .f08 |Fortran
-.c++ |C / C++ | .php |PHP | .vhd |VHDL
-.ii |C / C++ | .php4 |PHP | .vhdl |VHDL
-.ixx |C / C++ | .php5 |PHP | .ucf |VHDL
-.ipp |C / C++ | .inc |PHP | .qsf |VHDL
-.i++ |C / C++ | .phtml |PHP | .tcl |TCL
-.inl |C / C++ | .m |Objective-C | .md |Markdown
-.h |C / C++ | .M |Objective-C | .markdown |Markdown
-.H |C / C++ | .py |Python | .ice |Slice
-.hh |C / C++ | .pyw |Python | | |
+.c++ |C / C++ | .php |PHP | .f18 |Fortran
+.ii |C / C++ | .php4 |PHP | .vhd |VHDL
+.ixx |C / C++ | .php5 |PHP | .vhdl |VHDL
+.ipp |C / C++ | .inc |PHP | .ucf |VHDL
+.i++ |C / C++ | .phtml |PHP | .qsf |VHDL
+.inl |C / C++ | .m |Objective-C | &nbsp; |&nbsp;
+.h |C / C++ | .M |Objective-C | .md |Markdown
+.H |C / C++ | .py |Python | .markdown |Markdown
+.hh |C / C++ | .pyw |Python | .ice |Slice
.HH |C / C++ | | | | |
.hxx |C / C++ | | | | |
.hpp |C / C++ | | | | |
@@ -130,27 +131,30 @@ Extension | Language | Extension | Language | Extension | Language
.mm |C / C++ | | | | |
.txt |C / C++ | | | | |
-Any other extension is not parsed unless it is added to
-\ref cfg_file_patterns "FILE_PATTERNS" and the appropriate
+Please note that the above list might contain more items than that by default set
+in the \ref cfg_file_patterns "FILE_PATTERNS".
+
+Any extension that is not parsed can be set by adding it to
+\ref cfg_file_patterns "FILE_PATTERNS" and when the appropriate
\ref cfg_extension_mapping "EXTENSION_MAPPING" is set.
\anchor extract_all
-If you start using doxygen for an existing project (thus without any
+If you start using doxygen for an existing project (thus without any
documentation that doxygen is aware of), you can still get an idea of
-what the structure is and how the documented result would look like.
-To do so, you must set
-the \ref cfg_extract_all "EXTRACT_ALL" tag in the configuration file
-to \c YES. Then, doxygen will pretend everything in your sources is documented.
-Please note that as a consequence warnings about undocumented members
-will not be generated as long as \ref cfg_extract_all "EXTRACT_ALL" is
+what the structure is and how the documented result would look like.
+To do so, you must set
+the \ref cfg_extract_all "EXTRACT_ALL" tag in the configuration file
+to \c YES. Then, doxygen will pretend everything in your sources is documented.
+Please note that as a consequence warnings about undocumented members
+will not be generated as long as \ref cfg_extract_all "EXTRACT_ALL" is
set to \c YES.
-To analyze an existing piece of software it is useful to cross-reference
+To analyze an existing piece of software it is useful to cross-reference
a (documented) entity with its definition in the source files. Doxygen will
-generate such cross-references if you set
-the \ref cfg_source_browser "SOURCE_BROWSER" tag to \c YES.
+generate such cross-references if you set
+the \ref cfg_source_browser "SOURCE_BROWSER" tag to \c YES.
It can also include the sources directly into the documentation by setting
-\ref cfg_inline_sources "INLINE_SOURCES" to \c YES (this can be handy for
+\ref cfg_inline_sources "INLINE_SOURCES" to \c YES (this can be handy for
code reviews for instance).
\section step2 Step 2: Running doxygen
@@ -160,168 +164,168 @@ To generate the documentation you can now enter:
doxygen <config-file>
\endverbatim
-Depending on your settings doxygen will create \c html, \c rtf,
-\c latex, \c xml, \c man, and/or docbook directories inside the output directory.
+Depending on your settings doxygen will create \c html, \c rtf,
+\c latex, \c xml, \c man, and/or docbook directories inside the output directory.
As the names suggest these directories contain the
generated documentation in HTML, RTF, \LaTeX, XML,
Unix-Man page, and DocBook format.
The default output directory is the directory in which \c doxygen
-is started. The root directory to which the output is written can be changed
+is started. The root directory to which the output is written can be changed
using the \ref cfg_output_directory "OUTPUT_DIRECTORY". The format specific
directory within the output directory can be selected using the
\ref cfg_html_output "HTML_OUTPUT", \ref cfg_rtf_output "RTF_OUTPUT",
\ref cfg_latex_output "LATEX_OUTPUT", \ref cfg_xml_output "XML_OUTPUT",
\ref cfg_man_output "MAN_OUTPUT", and \ref cfg_docbook_output "DOCBOOK_OUTPUT".
-tags of the configuration file. If the output directory does not exist,
+tags of the configuration file. If the output directory does not exist,
\c doxygen will try to create it for you (but it will \e not try to create
-a whole path recursively, like <code>mkdir -p</code> does).
+a whole path recursively, like <code>mkdir -p</code> does).
\subsection html_out HTML output
\addindex browser
The generated HTML documentation can be viewed by pointing a HTML browser
to the \c index.html file in the \c html directory. For the best results
a browser that supports cascading style sheets (CSS) should be used
-(I'm using Mozilla Firefox, Google Chrome, Safari, and sometimes
-IE8, IE9, and Opera to test the generated output).
+(I'm using Mozilla Firefox, Google Chrome, Safari, and sometimes
+IE8, IE9, and Opera to test the generated output).
-Some of the features the HTML section (such as
-\ref cfg_generate_treeview "GENERATE_TREEVIEW" or the search engine)
-require a browser that supports Dynamic HTML and JavaScript enabled.
+Some of the features the HTML section (such as
+\ref cfg_generate_treeview "GENERATE_TREEVIEW" or the search engine)
+require a browser that supports Dynamic HTML and JavaScript enabled.
\subsection latex_out LaTeX output
\addindex LaTeX
-The generated \LaTeX documentation must first be compiled by
+The generated \LaTeX documentation must first be compiled by
a \LaTeX compiler (I use a recent teTeX distribution for Linux
-and MacOSX and MikTex for Windows).
+and MacOSX and MikTex for Windows).
To simplify the process of compiling the generated
documentation, \c doxygen writes a \c Makefile into the \c latex directory
-(on the Windows platform also a \c make.bat batch file is generated).
+(on the Windows platform also a \c make.bat batch file is generated).
The contents and targets in the \c Makefile depend on the setting of
\ref cfg_use_pdflatex "USE_PDFLATEX". If it is disabled (set to \c NO), then
typing \c make in the \c latex directory a \c dvi file called \c refman.dvi
-will be generated. This file can then be viewed using \c xdvi or
-converted into a PostScript file \c refman.ps by
-typing `make ps` (this requires `dvips`).
+will be generated. This file can then be viewed using \c xdvi or
+converted into a PostScript file \c refman.ps by
+typing `make ps` (this requires `dvips`).
To put 2 pages on one physical page use `make ps_2on1` instead.
The resulting PostScript file can be send to a PostScript
-printer. If you do not have a PostScript printer, you can try to use
+printer. If you do not have a PostScript printer, you can try to use
ghostscript to convert PostScript into something your printer understands.
Conversion to PDF is also possible if you have installed the ghostscript
-interpreter; just type `make pdf` (or `make pdf_2on1`).
+interpreter; just type `make pdf` (or `make pdf_2on1`).
-To get the best results for PDF output you should set
-the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS"
-and \ref cfg_use_pdflatex "USE_PDFLATEX" tags to \c YES.
-In this case the \c Makefile will only contain a target to build
+To get the best results for PDF output you should set
+the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS"
+and \ref cfg_use_pdflatex "USE_PDFLATEX" tags to \c YES.
+In this case the \c Makefile will only contain a target to build
\c refman.pdf directly.
\subsection rtf_out RTF output
\addindex RTF
Doxygen combines the RTF output to a single file called refman.rtf. This
file is optimized for importing into the Microsoft Word. Certain information
-is encoded using so called fields. To show the actual value you need to
+is encoded using so called fields. To show the actual value you need to
select all (Edit - select all) and then toggle fields (right click and select
the option from the drop down menu).
\subsection xml_out XML output
\addindex XML
-The XML output consists of a structured "dump" of the information gathered
-by doxygen. Each compound (class/namespace/file/...) has its own XML file
-and there is also an index file called `index.xml`.
+The XML output consists of a structured "dump" of the information gathered
+by doxygen. Each compound (class/namespace/file/...) has its own XML file
+and there is also an index file called `index.xml`.
A file called `combine.xslt`
-XSLT script is also generated and can be used to combine all XML files
-into a single file.
+XSLT script is also generated and can be used to combine all XML files
+into a single file.
Doxygen also generates two XML schema files `index.xsd`
(for the index file) and `compound.xsd` (for the compound files).
-This schema file describes the possible elements, their attributes and
-how they are structured, i.e. it the describes the grammar of the XML
+This schema file describes the possible elements, their attributes and
+how they are structured, i.e. it the describes the grammar of the XML
files and can be used for validation or to steer XSLT scripts.
In the `addon/doxmlparser` directory you can find a parser library for reading
-the XML output produced by doxygen in an incremental way
+the XML output produced by doxygen in an incremental way
(see `addon/doxmlparser/include/doxmlintf.h` for the interface of the library)
\subsection man_out Man page output
\addindex man
The generated man pages can be viewed using the \c man program. You do need
to make sure the man directory is in the man path (see the \c MANPATH
-environment variable). Note that there are some limitations to the
-capabilities of the man page format, so some information
+environment variable). Note that there are some limitations to the
+capabilities of the man page format, so some information
(like class diagrams, cross references and formulas) will be lost.
\subsection docbook_out DocBook output
\addindex docbook
-Doxygen can also generate output in the
+Doxygen can also generate output in the
<a href="https://docbook.org/">DocBook</a> format. How to process the
DocBook output is beyond the scope of this manual.
\section step3 Step 3: Documenting the sources
-Although documenting the sources is presented as step 3, in a new project
+Although documenting the sources is presented as step 3, in a new project
this should of course be step 1. Here I assume
-you already have some code and you want doxygen to generate a nice document
+you already have some code and you want doxygen to generate a nice document
describing the API and maybe the internals and some related design
documentation as well.
-If the \ref cfg_extract_all "EXTRACT_ALL" option is set to \c NO in the
-configuration file (the default), then doxygen will only generate
-documentation for \e documented entities. So
-how do you document these? For members, classes and namespaces there are
+If the \ref cfg_extract_all "EXTRACT_ALL" option is set to \c NO in the
+configuration file (the default), then doxygen will only generate
+documentation for \e documented entities. So
+how do you document these? For members, classes and namespaces there are
basically two options:
1. Place a \e special documentation block in front of the declaration or
definition of the member, class or namespace. For file, class and namespace
- members it is also allowed to place the documentation directly after the
- member.
-
- See section \ref specialblock to learn more about special
+ members it is also allowed to place the documentation directly after the
+ member.
+
+ See section \ref specialblock to learn more about special
documentation blocks.
-2. Place a special documentation block somewhere else (another file or
- another location) \e and put a <em>structural command</em> in the
- documentation block. A structural command links a documentation block
- to a certain entity that can be documented (e.g. a member, class,
- namespace or file).
-
- See section \ref structuralcommands to learn more
+2. Place a special documentation block somewhere else (another file or
+ another location) \e and put a <em>structural command</em> in the
+ documentation block. A structural command links a documentation block
+ to a certain entity that can be documented (e.g. a member, class,
+ namespace or file).
+
+ See section \ref structuralcommands to learn more
about structural commands.
The advantage of the first option is that you do not have to repeat the
name of the entity.
Files can only be documented using the second option, since there is
-no way to put a documentation block before a file. Of course, file members
-(functions, variables, typedefs, defines) do not need an explicit
-structural command; just putting a special documentation block in front or
-behind them will work fine.
+no way to put a documentation block before a file. Of course, file members
+(functions, variables, typedefs, defines) do not need an explicit
+structural command; just putting a special documentation block in front or
+behind them will work fine.
The text inside a special documentation block is parsed
before it is written to the HTML and/or \LaTeX output files.
\addindex parsing
During parsing the following steps take place:
-- Markdown formatting is replaced by corresponding HTML or special
+- Markdown formatting is replaced by corresponding HTML or special
commands.
- The special commands inside the documentation are executed. See
section \ref commands for an overview of all commands.
-- If a line starts with some whitespace followed by one or more asterisks
- (`*`) and then optionally more whitespace,
+- If a line starts with some whitespace followed by one or more asterisks
+ (`*`) and then optionally more whitespace,
then all whitespace and asterisks are removed.
- All resulting blank lines are treated as a paragraph separators.
- This saves you from placing new-paragraph commands yourself
+ This saves you from placing new-paragraph commands yourself
in order to make the generated documentation readable.
- Links are created for words corresponding to documented classes
(unless the word is preceded by a \%; then the word will not be linked and
- the \% sign is removed).
+ the \% sign is removed).
- Links to members are created when certain patterns are found in the
text. See section \ref autolink
for more information on how the automatic link generation works.
-- HTML tags that are in the documentation are interpreted and converted
- to \LaTeX equivalents for the \LaTeX output.
+- HTML tags that are in the documentation are interpreted and converted
+ to \LaTeX equivalents for the \LaTeX output.
See section \ref htmlcmds for an overview of all supported HTML tags.
\htmlonly
diff --git a/doc/translator.py b/doc/translator.py
index c04a367..af1ec4c 100644
--- a/doc/translator.py
+++ b/doc/translator.py
@@ -1231,10 +1231,14 @@ class TrManager:
self.src_path = os.path.join(self.doxy_path, 'src')
# Normally the original sources aren't in the current directory
# (as we are in the build directory) so we have to specify the
- # original source directory.
+ # original source /documentation / ... directory.
self.org_src_path = self.src_path
+ self.org_doc_path = self.doc_path
+ self.org_doxy_path = self.doxy_path
if (len(sys.argv) > 1 and os.path.isdir(os.path.join(sys.argv[1], 'src'))):
self.org_src_path = os.path.join(sys.argv[1], 'src')
+ self.org_doc_path = os.path.join(sys.argv[1], 'doc')
+ self.org_doxy_path = sys.argv[1]
# Get the explicit arguments of the script.
self.script_argLst = sys.argv[2:]
else:
@@ -1290,7 +1294,7 @@ class TrManager:
# The translator.h must exist (the Transl object will check it),
# create the object for it and let it build the dictionary of
# required methods.
- tr = Transl(os.path.join(self.src_path, 'translator.h'), self)
+ tr = Transl(os.path.join(self.org_src_path, 'translator.h'), self)
self.requiredMethodsDic = tr.collectPureVirtualPrototypes()
tim = tr.getmtime()
if tim > self.lastModificationTime:
@@ -1298,7 +1302,7 @@ class TrManager:
# The translator_adapter.h must exist (the Transl object will check it),
# create the object for it and store the reference in the dictionary.
- tr = Transl(os.path.join(self.src_path, 'translator_adapter.h'), self)
+ tr = Transl(os.path.join(self.org_src_path, 'translator_adapter.h'), self)
self.adaptMethodsDic = tr.collectAdapterPrototypes()
tim = tr.getmtime()
if tim > self.lastModificationTime:
@@ -1310,11 +1314,11 @@ class TrManager:
if self.script_argLst:
lst = ['translator_' + x + '.h' for x in self.script_argLst]
for fname in lst:
- if not os.path.isfile(os.path.join(self.src_path, fname)):
+ if not os.path.isfile(os.path.join(self.org_src_path, fname)):
sys.stderr.write("\a\nFile '%s' not found!\n" % fname)
sys.exit(1)
else:
- lst = os.listdir(self.src_path)
+ lst = os.listdir(self.org_src_path)
lst = [x for x in lst if x[:11] == 'translator_'
and x[-2:] == '.h'
and x != 'translator_adapter.h']
@@ -1323,7 +1327,7 @@ class TrManager:
# content of the file. Then insert the object to the dictionary
# accessed via classId.
for fname in lst:
- fullname = os.path.join(self.src_path, fname)
+ fullname = os.path.join(self.org_src_path, fname)
tr = Transl(fullname, self)
tr.processing()
assert(tr.classId != 'Translator')
@@ -1402,7 +1406,7 @@ class TrManager:
self.numLang -= 1 # the couple will be counted as one
# Extract the version of Doxygen.
- f = xopen(os.path.join(self.doxy_path, 'VERSION'))
+ f = xopen(os.path.join(self.org_doxy_path, 'VERSION'))
self.doxVersion = f.readline().strip()
f.close()
@@ -1557,7 +1561,7 @@ class TrManager:
# The e-mail addresses of the maintainers will be collected to
# the auxiliary file in the order of translator classes listed
# in the translator report.
- fmail = xopen('mailto.txt', 'w')
+ fmail = xopen(os.path.join(self.doc_path, 'mailto.txt'), 'w')
# Write the list of "up-to-date" translator classes.
if self.upToDateIdLst:
@@ -1720,7 +1724,7 @@ class TrManager:
Fills the dictionary classId -> [(name, e-mail), ...]."""
- fname = os.path.join(self.doc_path, self.maintainersFileName)
+ fname = os.path.join(self.org_doc_path, self.maintainersFileName)
# Include the maintainers file to the group of files checked with
# respect to the modification time.
@@ -1775,7 +1779,7 @@ class TrManager:
# Check the last modification time of the template file. It is the
# last file from the group that decide whether the documentation
# should or should not be generated.
- fTplName = os.path.join(self.doc_path, self.languageTplFileName)
+ fTplName = os.path.join(self.org_doc_path, self.languageTplFileName)
tim = os.path.getmtime(fTplName)
if tim > self.lastModificationTime:
self.lastModificationTime = tim
@@ -1998,11 +2002,11 @@ class TrManager:
if __name__ == '__main__':
- # The Python 2.6+ or 3.3+ is required.
+ # The Python 2.7+ or 3.3+ is required.
major = sys.version_info[0]
minor = sys.version_info[1]
- if (major == 2 and minor < 6) or (major == 3 and minor < 0):
- print('Python 2.6+ or Python 3.0+ are required for the script')
+ if (major == 2 and minor < 7) or (major == 3 and minor < 0):
+ print('Python 2.7+ or Python 3.0+ are required for the script')
sys.exit(1)
# The translator manager builds the Transl objects, parses the related
diff --git a/doc/xmlcmds.doc b/doc/xmlcmds.doc
index b59095b..3a58301 100644
--- a/doc/xmlcmds.doc
+++ b/doc/xmlcmds.doc
@@ -17,7 +17,7 @@
/*! \page xmlcmds XML Commands
Doxygen supports most of the XML commands that are typically used in C#
-code comments. The XML tags are defined in Appendix E of the
+code comments. The XML tags are defined in Appendix D of the
<a href="http://www.ecma-international.org/publications/standards/Ecma-334.htm">ECMA-334</a>
standard, which defines the C# language. Unfortunately, the specification is
not very precise and a number of the examples given are of poor quality.
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 967f3d4..194b427 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,6 +1,7 @@
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/examples
- ${PROJECT_BINARY_DIR}/html/examples)
-file(GLOB EXAMPLE_FILES RELATIVE ${CMAKE_SOURCE_DIR}/examples "*")
+ ${PROJECT_BINARY_DIR}/html/examples
+ ${PROJECT_BINARY_DIR}/latex/examples)
+file(GLOB EXAMPLE_FILES RELATIVE ${PROJECT_SOURCE_DIR}/examples "*")
if (DOT)
set(DIAGRAM_EXAMPLE ${PROJECT_BINARY_DIR}/html/examples/diagrams/html/index.html)
@@ -8,249 +9,72 @@ endif()
foreach (f ${EXAMPLE_FILES})
add_custom_command(
- COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/examples/${f}" "${PROJECT_BINARY_DIR}/examples/"
- DEPENDS "${CMAKE_SOURCE_DIR}/examples/${f}"
+ COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/examples/${f}" "${PROJECT_BINARY_DIR}/examples/"
+ DEPENDS "${PROJECT_SOURCE_DIR}/examples/${f}"
OUTPUT "${PROJECT_BINARY_DIR}/examples/${f}"
)
set_source_files_properties("${PROJECT_BINARY_DIR}/examples/${f}" PROPERTIES GENERATED 1)
list(APPEND OUT_EXAMPLE_FILES "${PROJECT_BINARY_DIR}/examples/${f}")
endforeach()
+set(BASIC_EXAMPLES
+ class:h
+ define:h
+ enum:h
+ file:h
+ func:h
+ javadoc-banner:h
+ structcmd:h
+ afterdoc:h
+ relates:cpp
+ author:cpp
+ par:cpp
+ overload:cpp
+ example:cpp
+ include:cpp
+ qtstyle:cpp
+ jdstyle:cpp
+ autolink:cpp
+ restypedef:cpp
+ tag:cpp
+ group:cpp
+ memgrp:cpp
+ templ:cpp
+ page:doc
+ docstring:py
+ pyexample:py
+ manual:c
+ mux:vhdl
+)
+
+foreach (f_inp ${BASIC_EXAMPLES})
+ string(REGEX REPLACE ".*:" "" f_ext ${f_inp})
+ string(REGEX REPLACE ":.*" "" f ${f_inp})
+ add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/html/examples/${f}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/latex/examples/${f}
+ COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen ${f}.cfg
+ COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/latex/examples/${f}/latex/refman.tex > ${PROJECT_BINARY_DIR}/latex/examples/${f}/latex/refman_doc.tex
+ DEPENDS doxygen ${f}.${f_ext} ${f}.cfg ${TOP}/examples/strip_example.py
+ OUTPUT ${PROJECT_BINARY_DIR}/html/examples/${f}/html/index.html ${PROJECT_BINARY_DIR}/latex/examples/${f}/latex/refman_doc.tex
+ )
+ set(EXAMPLES_RES ${EXAMPLES_RES} "" ${PROJECT_BINARY_DIR}/html/examples/${f}/html/index.html)
+endforeach()
+
add_custom_target(examples
DEPENDS ${OUT_EXAMPLE_FILES}
- ${PROJECT_BINARY_DIR}/html/examples/class/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/define/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/enum/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/file/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/func/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/javadoc-banner/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/page/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/relates/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/author/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/par/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/overload/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/example/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/include/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/qtstyle/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/jdstyle/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/structcmd/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/autolink/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/restypedef/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/afterdoc/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/template/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/tag/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/group/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/memgrp/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/docstring/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/pyexample/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/tclexample/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/mux/html/index.html
- ${PROJECT_BINARY_DIR}/html/examples/manual/html/index.html
+ ${EXAMPLES_RES}
${DIAGRAM_EXAMPLE}
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/examples
)
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen class.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/class/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/class/latex/refman_doc.tex
- DEPENDS doxygen class.h class.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/class/html/index.html ${PROJECT_BINARY_DIR}/html/examples/class/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen define.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/define/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/define/latex/refman_doc.tex
- DEPENDS doxygen define.h define.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/define/html/index.html ${PROJECT_BINARY_DIR}/html/examples/define/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen enum.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/enum/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/enum/latex/refman_doc.tex
- DEPENDS doxygen enum.h enum.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/enum/html/index.html ${PROJECT_BINARY_DIR}/html/examples/enum/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen file.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/file/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/file/latex/refman_doc.tex
- DEPENDS doxygen file.h file.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/file/html/index.html ${PROJECT_BINARY_DIR}/html/examples/file/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen func.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/func/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/func/latex/refman_doc.tex
- DEPENDS doxygen func.h func.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/func/html/index.html ${PROJECT_BINARY_DIR}/html/examples/func/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen javadoc-banner.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/javadoc-banner/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/javadoc-banner/latex/refman_doc.tex
- DEPENDS doxygen javadoc-banner.h javadoc-banner.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/javadoc-banner/html/index.html ${PROJECT_BINARY_DIR}/html/examples/javadoc-banner/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen page.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/page/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/page/latex/refman_doc.tex
- DEPENDS doxygen page.doc page.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/page/html/index.html ${PROJECT_BINARY_DIR}/html/examples/page/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen relates.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/relates/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/relates/latex/refman_doc.tex
- DEPENDS doxygen relates.cpp relates.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/relates/html/index.html ${PROJECT_BINARY_DIR}/html/examples/relates/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen author.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/author/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/author/latex/refman_doc.tex
- DEPENDS doxygen author.cpp author.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/author/html/index.html ${PROJECT_BINARY_DIR}/html/examples/author/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen par.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/par/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/par/latex/refman_doc.tex
- DEPENDS doxygen par.cpp par.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/par/html/index.html ${PROJECT_BINARY_DIR}/html/examples/par/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen overload.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/overload/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/overload/latex/refman_doc.tex
- DEPENDS doxygen overload.cpp overload.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/overload/html/index.html ${PROJECT_BINARY_DIR}/html/examples/overload/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen example.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/example/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/example/latex/refman_doc.tex
- DEPENDS doxygen example.cpp example_test.cpp example.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/example/html/index.html ${PROJECT_BINARY_DIR}/html/examples/example/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen include.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/include/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/include/latex/refman_doc.tex
- DEPENDS doxygen include.cpp include_test.cpp include.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/include/html/index.html ${PROJECT_BINARY_DIR}/html/examples/include/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen qtstyle.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/qtstyle/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/qtstyle/latex/refman_doc.tex
- DEPENDS doxygen qtstyle.cpp qtstyle.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/qtstyle/html/index.html ${PROJECT_BINARY_DIR}/html/examples/qtstyle/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen jdstyle.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/jdstyle/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/jdstyle/latex/refman_doc.tex
- DEPENDS doxygen jdstyle.cpp jdstyle.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/jdstyle/html/index.html ${PROJECT_BINARY_DIR}/html/examples/jdstyle/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen structcmd.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/structcmd/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/structcmd/latex/refman_doc.tex
- DEPENDS doxygen structcmd.h structcmd.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/structcmd/html/index.html ${PROJECT_BINARY_DIR}/html/examples/structcmd/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen autolink.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/autolink/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/autolink/latex/refman_doc.tex
- DEPENDS doxygen autolink.cpp autolink.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/autolink/html/index.html ${PROJECT_BINARY_DIR}/html/examples/autolink/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen tag.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/tag/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/tag/latex/refman_doc.tex
- DEPENDS doxygen tag.cpp tag.cfg ${PROJECT_BINARY_DIR}/html/examples/example/html/index.html ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/tag/html/index.html ${PROJECT_BINARY_DIR}/html/examples/tag/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen restypedef.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/restypedef/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/restypedef/latex/refman_doc.tex
- DEPENDS doxygen restypedef.cpp restypedef.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/restypedef/html/index.html ${PROJECT_BINARY_DIR}/html/examples/restypedef/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen afterdoc.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/afterdoc/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/afterdoc/latex/refman_doc.tex
- DEPENDS doxygen afterdoc.h afterdoc.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/afterdoc/html/index.html ${PROJECT_BINARY_DIR}/html/examples/afterdoc/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen templ.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/template/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/template/latex/refman_doc.tex
- DEPENDS doxygen templ.cpp templ.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/template/html/index.html ${PROJECT_BINARY_DIR}/html/examples/template/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen group.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/group/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/group/latex/refman_doc.tex
- DEPENDS doxygen group.cpp group.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/group/html/index.html ${PROJECT_BINARY_DIR}/html/examples/group/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen memgrp.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/memgrp/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/memgrp/latex/refman_doc.tex
- DEPENDS doxygen memgrp.cpp memgrp.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/memgrp/html/index.html ${PROJECT_BINARY_DIR}/html/examples/memgrp/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen pyexample.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/pyexample/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/pyexample/latex/refman_doc.tex
- DEPENDS doxygen pyexample.py pyexample.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/pyexample/html/index.html ${PROJECT_BINARY_DIR}/html/examples/pyexample/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen tclexample.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/tclexample/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/tclexample/latex/refman_doc.tex
- DEPENDS doxygen tclexample.tcl tclexample.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/tclexample/html/index.html ${PROJECT_BINARY_DIR}/html/examples/tclexample/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen mux.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/mux/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/mux/latex/refman_doc.tex
- DEPENDS doxygen mux.vhdl mux.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/mux/html/index.html ${PROJECT_BINARY_DIR}/html/examples/mux/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen manual.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/manual/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/manual/latex/refman_doc.tex
- DEPENDS doxygen manual.c manual.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/manual/html/index.html ${PROJECT_BINARY_DIR}/html/examples/manual/latex/refman_doc.tex
-)
-
-add_custom_command(
- COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen docstring.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/docstring/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/docstring/latex/refman_doc.tex
- DEPENDS doxygen docstring.py docstring.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/docstring/html/index.html ${PROJECT_BINARY_DIR}/html/examples/docstring/latex/refman_doc.tex
-)
-
if (DOT)
add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/html/examples/diagrams
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/latex/examples/diagrams
COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen diagrams.cfg
- COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/html/examples/diagrams/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/diagrams/latex/refman_doc.tex
+ COMMAND ${PYTHON_EXECUTABLE} ${TOP}/examples/strip_example.py < ${PROJECT_BINARY_DIR}/latex/examples/diagrams/latex/refman.tex > ${PROJECT_BINARY_DIR}/latex/examples/diagrams/latex/refman_doc.tex
DEPENDS doxygen diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg ${TOP}/examples/strip_example.py
- OUTPUT ${PROJECT_BINARY_DIR}/html/examples/diagrams/html/index.html ${PROJECT_BINARY_DIR}/html/examples/diagrams/latex/refman_doc.tex
+ OUTPUT ${PROJECT_BINARY_DIR}/html/examples/diagrams/html/index.html ${PROJECT_BINARY_DIR}/latex/examples/diagrams/latex/refman_doc.tex
)
endif(DOT)
diff --git a/examples/afterdoc.cfg b/examples/afterdoc.cfg
index 0542929..71c2a88 100644
--- a/examples/afterdoc.cfg
+++ b/examples/afterdoc.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "AfterDocs"
-OUTPUT_DIRECTORY = ../html/examples/afterdoc
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/afterdoc/html
+LATEX_OUTPUT = latex/examples/afterdoc/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/author.cfg b/examples/author.cfg
index 2fafbfe..1107e2c 100644
--- a/examples/author.cfg
+++ b/examples/author.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Author Command"
-OUTPUT_DIRECTORY = ../html/examples/author
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/author/html
+LATEX_OUTPUT = latex/examples/author/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/autolink.cfg b/examples/autolink.cfg
index 68e5192..25607eb 100644
--- a/examples/autolink.cfg
+++ b/examples/autolink.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Automatic link generation"
-OUTPUT_DIRECTORY = ../html/examples/autolink
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/autolink/html
+LATEX_OUTPUT = latex/examples/autolink/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/class.cfg b/examples/class.cfg
index 5d75373..c8c8bdc 100644
--- a/examples/class.cfg
+++ b/examples/class.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Class Command"
-OUTPUT_DIRECTORY = ../html/examples/class
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/class/html
+LATEX_OUTPUT = latex/examples/class/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/define.cfg b/examples/define.cfg
index 61c0f52..63662c5 100644
--- a/examples/define.cfg
+++ b/examples/define.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Define Command"
-OUTPUT_DIRECTORY = ../html/examples/define
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/define/html
+LATEX_OUTPUT = latex/examples/define/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -12,3 +14,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/diagrams.cfg b/examples/diagrams.cfg
index c2e637d..04d972c 100644
--- a/examples/diagrams.cfg
+++ b/examples/diagrams.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Diagrams"
-OUTPUT_DIRECTORY = ../html/examples/diagrams
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/diagrams/html
+LATEX_OUTPUT = latex/examples/diagrams/latex
HAVE_DOT = YES
EXTRACT_ALL = YES
GENERATE_LATEX = YES
@@ -15,3 +17,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/docstring.cfg b/examples/docstring.cfg
index 60b089e..2e18b0a 100644
--- a/examples/docstring.cfg
+++ b/examples/docstring.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Python"
-OUTPUT_DIRECTORY = ../html/examples/docstring
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/docstring/html
+LATEX_OUTPUT = latex/examples/docstring/latex
EXTRACT_ALL = YES
GENERATE_LATEX = YES
GENERATE_MAN = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/enum.cfg b/examples/enum.cfg
index e5540bd..8439b6f 100644
--- a/examples/enum.cfg
+++ b/examples/enum.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Enum Command"
-OUTPUT_DIRECTORY = ../html/examples/enum
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/enum/html
+LATEX_OUTPUT = latex/examples/enum/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/example.cfg b/examples/example.cfg
index 22266d4..1f8809d 100644
--- a/examples/example.cfg
+++ b/examples/example.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Example Command"
-OUTPUT_DIRECTORY = ../html/examples/example
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/example/html
+LATEX_OUTPUT = latex/examples/example/latex
GENERATE_TAGFILE = example.tag
GENERATE_LATEX = YES
GENERATE_MAN = NO
@@ -12,3 +14,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/file.cfg b/examples/file.cfg
index ef67ae6..1137fec 100644
--- a/examples/file.cfg
+++ b/examples/file.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "File Command"
-OUTPUT_DIRECTORY = ../html/examples/file
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/file/html
+LATEX_OUTPUT = latex/examples/file/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/func.cfg b/examples/func.cfg
index 2f455d9..a46a02d 100644
--- a/examples/func.cfg
+++ b/examples/func.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Fn Command"
-OUTPUT_DIRECTORY = ../html/examples/func
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/func/html
+LATEX_OUTPUT = latex/examples/func/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/group.cfg b/examples/group.cfg
index 83911b8..3d357fc 100644
--- a/examples/group.cfg
+++ b/examples/group.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Grouping"
-OUTPUT_DIRECTORY = ../html/examples/group
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/group/html
+LATEX_OUTPUT = latex/examples/group/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/include.cfg b/examples/include.cfg
index abaecc6..0a88b8b 100644
--- a/examples/include.cfg
+++ b/examples/include.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Include Command"
-OUTPUT_DIRECTORY = ../html/examples/include
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/include/html
+LATEX_OUTPUT = latex/examples/include/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/javadoc-banner.cfg b/examples/javadoc-banner.cfg
index d650dbc..06afc88 100644
--- a/examples/javadoc-banner.cfg
+++ b/examples/javadoc-banner.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Javadoc Banner"
-OUTPUT_DIRECTORY = ../html/examples/javadoc-banner
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/javadoc-banner/html
+LATEX_OUTPUT = latex/examples/javadoc-banner/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -13,3 +15,4 @@ SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
EXTRACT_ALL = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/jdstyle.cfg b/examples/jdstyle.cfg
index d94089d..7594b78 100644
--- a/examples/jdstyle.cfg
+++ b/examples/jdstyle.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Javadoc Style"
-OUTPUT_DIRECTORY = ../html/examples/jdstyle
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/jdstyle/html
+LATEX_OUTPUT = latex/examples/jdstyle/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/manual.cfg b/examples/manual.cfg
index 07040d9..aac6d2c 100644
--- a/examples/manual.cfg
+++ b/examples/manual.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Manual inheritance and membership"
-OUTPUT_DIRECTORY = ../html/examples/manual
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/manual/html
+LATEX_OUTPUT = latex/examples/manual/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -16,3 +18,4 @@ REFERENCES_RELATION = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/memgrp.cfg b/examples/memgrp.cfg
index d609778..ac68e69 100644
--- a/examples/memgrp.cfg
+++ b/examples/memgrp.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Member Grouping"
-OUTPUT_DIRECTORY = ../html/examples/memgrp
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/memgrp/html
+LATEX_OUTPUT = latex/examples/memgrp/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/mux.cfg b/examples/mux.cfg
index 861f2f6..bfc3472 100644
--- a/examples/mux.cfg
+++ b/examples/mux.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = Mux
-OUTPUT_DIRECTORY = ../html/examples/mux
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/mux/html
+LATEX_OUTPUT = latex/examples/mux/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -16,3 +18,4 @@ ENABLE_PREPROCESSING = NO
EXTRACT_PACKAGE = YES
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/overload.cfg b/examples/overload.cfg
index 71ebcc5..2950b71 100644
--- a/examples/overload.cfg
+++ b/examples/overload.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Overloaded Command"
-OUTPUT_DIRECTORY = ../html/examples/overload
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/overload/html
+LATEX_OUTPUT = latex/examples/overload/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/page.cfg b/examples/page.cfg
index 972368a..f5a1540 100644
--- a/examples/page.cfg
+++ b/examples/page.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Page Command"
-OUTPUT_DIRECTORY = ../html/examples/page
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/page/html
+LATEX_OUTPUT = latex/examples/page/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/par.cfg b/examples/par.cfg
index fe4be84..977cd07 100644
--- a/examples/par.cfg
+++ b/examples/par.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Par Command"
-OUTPUT_DIRECTORY = ../html/examples/par
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/par/html
+LATEX_OUTPUT = latex/examples/par/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/pyexample.cfg b/examples/pyexample.cfg
index 4569425..edbaeac 100644
--- a/examples/pyexample.cfg
+++ b/examples/pyexample.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Python"
-OUTPUT_DIRECTORY = ../html/examples/pyexample
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/pyexample/html
+LATEX_OUTPUT = latex/examples/pyexample/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/qtstyle.cfg b/examples/qtstyle.cfg
index 1516c7e..6c9f67a 100644
--- a/examples/qtstyle.cfg
+++ b/examples/qtstyle.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Qt Style"
-OUTPUT_DIRECTORY = ../html/examples/qtstyle
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/qtstyle/html
+LATEX_OUTPUT = latex/examples/qtstyle/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/relates.cfg b/examples/relates.cfg
index 89f46da..9c05def 100644
--- a/examples/relates.cfg
+++ b/examples/relates.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Relates Command"
-OUTPUT_DIRECTORY = ../html/examples/relates
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/relates/html
+LATEX_OUTPUT = latex/examples/relates/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/restypedef.cfg b/examples/restypedef.cfg
index 63d2ea5..76c07e4 100644
--- a/examples/restypedef.cfg
+++ b/examples/restypedef.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Resolving Typedefs"
-OUTPUT_DIRECTORY = ../html/examples/restypedef
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/restypedef/html
+LATEX_OUTPUT = latex/examples/restypedef/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/structcmd.cfg b/examples/structcmd.cfg
index f926ddf..7521516 100644
--- a/examples/structcmd.cfg
+++ b/examples/structcmd.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Structural commands"
-OUTPUT_DIRECTORY = ../html/examples/structcmd
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/structcmd/html
+LATEX_OUTPUT = latex/examples/structcmd/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/tag.cfg b/examples/tag.cfg
index 12b3c5b..db0f621 100644
--- a/examples/tag.cfg
+++ b/examples/tag.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Tag Files"
-OUTPUT_DIRECTORY = ../html/examples/tag
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/tag/html
+LATEX_OUTPUT = latex/examples/tag/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -11,3 +13,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/examples/tclexample.cfg b/examples/tclexample.cfg
deleted file mode 100644
index e151d14..0000000
--- a/examples/tclexample.cfg
+++ /dev/null
@@ -1,14 +0,0 @@
-PROJECT_NAME = "Tcl"
-OUTPUT_DIRECTORY = ../html/examples/tclexample
-GENERATE_LATEX = YES
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = tclexample.tcl
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
-SEARCHENGINE = NO
-INLINE_SOURCES = YES
-HIDE_UNDOC_MEMBERS = YES
-COMPACT_LATEX = YES
-LATEX_HIDE_INDICES = YES
diff --git a/examples/tclexample.tcl b/examples/tclexample.tcl
deleted file mode 100644
index e512aee..0000000
--- a/examples/tclexample.tcl
+++ /dev/null
@@ -1,82 +0,0 @@
-## \file tclexample.tcl
-# File documentation.
-#\verbatim
-
-# Startup code:\
-exec tclsh "$0" "$@"
-#\endverbatim
-## Documented namespace \c ns .
-# The code is inserted here:
-#\code
-namespace eval ns {
- ## Documented proc \c ns_proc .
- # \param[in] arg some argument
- proc ns_proc {arg} {}
- ## Documented var \c ns_var .
- # Some documentation.
- variable ns_var
- ## Documented itcl class \c itcl_class .
- itcl::class itcl_class {
- ## Create object.
- constructor {args} {eval $args}
- ## Destroy object.
- destructor {exit}
- ## Documented itcl method \c itcl_method_x .
- # \param[in] arg Argument
- private method itcl_method_x {arg}
- ## Documented itcl method \c itcl_method_y .
- # \param[in] arg Argument
- protected method itcl_method_y {arg} {}
- ## Documented itcl method \c itcl_method_z .
- # \param[in] arg Argument
- public method itcl_method_z {arg} {}
- ## Documented common itcl var \c itcl_Var .
- common itcl_Var
- ## \protectedsection
-
- variable itcl_var1;#< Documented itcl var \c itcl_var1 .
- variable itcl_var2;#< Documented itcl var \c itcl_var2 .
- }
- ## Documented oo class \c oo_class .
- oo::class create oo_class {
- ## Create object.
- # Configure with args
- constructor {args} {eval $args}
- ## Destroy object.
- # Exit.
- destructor {exit}
- ## Documented oo var \c oo_var .
- # Defined inside class
- variable oo_var
- ## \private Documented oo method \c oo_method_x .
- # \param[in] arg Argument
- method oo_method_x {arg} {}
- ## \protected Documented oo method \c oo_method_y .
- # \param[in] arg Argument
- method oo_method_y {arg} {}
- ## \public Documented oo method \c oo_method_z .
- # \param[in] arg Argument
- method oo_method_z {arg} {}
- }
-}
-#\endcode
-
-itcl::body ::ns::itcl_class::itcl_method_x {argx} {
- puts "$argx OK"
-}
-
-oo::define ns::oo_class {
- ## \public Outside defined variable \c oo_var_out .
- # Inside oo_class
- variable oo_var_out
-}
-
-## Documented global proc \c glob_proc .
-# \param[in] arg Argument
-proc glob_proc {arg} {puts $arg}
-
-variable glob_var;#< Documented global var \c glob_var\
- with newline
-#< and continued line
-
-# end of file
diff --git a/examples/templ.cfg b/examples/templ.cfg
index 9d42e79..3dbf4a5 100644
--- a/examples/templ.cfg
+++ b/examples/templ.cfg
@@ -1,5 +1,7 @@
PROJECT_NAME = "Template Test"
-OUTPUT_DIRECTORY = ../html/examples/template
+OUTPUT_DIRECTORY = ..
+HTML_OUTPUT = html/examples/templ/html
+LATEX_OUTPUT = latex/examples/templ/latex
GENERATE_LATEX = YES
GENERATE_MAN = NO
GENERATE_RTF = NO
@@ -10,3 +12,4 @@ JAVADOC_AUTOBRIEF = YES
SEARCHENGINE = NO
COMPACT_LATEX = YES
LATEX_HIDE_INDICES = YES
+WARN_AS_ERROR = FAIL_ON_WARNINGS
diff --git a/libmscgen/CMakeLists.txt b/libmscgen/CMakeLists.txt
index 079fcfc..0a23900 100644
--- a/libmscgen/CMakeLists.txt
+++ b/libmscgen/CMakeLists.txt
@@ -1,14 +1,14 @@
include_directories(
- ${CMAKE_SOURCE_DIR}/liblodepng
- ${CMAKE_SOURCE_DIR}/libmscgen
+ ${PROJECT_SOURCE_DIR}/liblodepng
+ ${PROJECT_SOURCE_DIR}/libmscgen
${GENERATED_SRC}
)
set(LEX_FILES mscgen_lexer)
foreach(lex_file ${LEX_FILES})
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/scan_states.py ${CMAKE_SOURCE_DIR}/libmscgen/${lex_file}.l > ${GENERATED_SRC}/${lex_file}.l.h
- DEPENDS ${CMAKE_SOURCE_DIR}/src/scan_states.py ${CMAKE_SOURCE_DIR}/libmscgen/${lex_file}.l
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/src/scan_states.py ${PROJECT_SOURCE_DIR}/libmscgen/${lex_file}.l > ${GENERATED_SRC}/${lex_file}.l.h
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/scan_states.py ${PROJECT_SOURCE_DIR}/libmscgen/${lex_file}.l
OUTPUT ${GENERATED_SRC}/${lex_file}.l.h
)
set_source_files_properties(${GENERATED_SRC}/${lex_file}.l.h PROPERTIES GENERATED 1)
diff --git a/libmscgen/gd.c b/libmscgen/gd.c
index 7e8b241..a9a8aa6 100644
--- a/libmscgen/gd.c
+++ b/libmscgen/gd.c
@@ -1967,7 +1967,7 @@ BGD_DECLARE(void) gdImageString (gdImagePtr im, gdFontPtr f,
{
int i;
int l;
- l = strlen ((char *) s);
+ l = (int)strlen((char *) s);
for (i = 0; (i < l); i++) {
gdImageChar (im, f, x, y, s[i], color);
x += f->w;
@@ -1982,7 +1982,7 @@ BGD_DECLARE(void) gdImageStringUp (gdImagePtr im, gdFontPtr f,
{
int i;
int l;
- l = strlen ((char *) s);
+ l = (int)strlen((char *) s);
for (i = 0; (i < l); i++) {
gdImageCharUp (im, f, x, y, s[i], color);
y -= f->w;
diff --git a/libmscgen/mscgen_api.c b/libmscgen/mscgen_api.c
index b28d653..e2cdcb9 100644
--- a/libmscgen/mscgen_api.c
+++ b/libmscgen/mscgen_api.c
@@ -300,7 +300,7 @@ static char *splitStringToWidth(Context *ctx, char *l, unsigned int width)
/* Copy the remaining line to the start of the string */
m = 0;
- n = (p - l);
+ n = (int)(p - l);
while (isspace(orig[n]) && orig[n] != '\0')
{
@@ -390,7 +390,7 @@ static unsigned int computeLabelLines(Context *ctx,
char *nextLine = strstr(label, "\\n");
if (nextLine)
{
- const int lineLen = nextLine - label;
+ const int lineLen = (int)(nextLine - label);
/* Allocate storage and duplicate the line */
retLines[c] = malloc_s(lineLen + 1);
@@ -457,6 +457,7 @@ static RowInfo *computeCanvasSize(Context *ctx,
nextYmin = ymin = ctx->opts.entityHeadGap;
yskipmax = 0;
+ ymax = 0;
MscResetArcIterator(m);
do
{
@@ -633,11 +634,11 @@ static char *getLine(const char *string,
/* Determine the length of the line */
if(lineEnd != NULL)
{
- lineLen = lineEnd - lineStart;
+ lineLen = (unsigned int)(lineEnd - lineStart);
}
else
{
- lineLen = strlen(string) - (lineStart - string);
+ lineLen = (unsigned int)(strlen(string) - (lineStart - string));
}
/* Clamp the length to the buffer */
@@ -1328,8 +1329,8 @@ static void arcLine(Context *ctx,
hasArrows = FALSE;
/* Get co-ordinates of the arc end-point */
- ADrawComputeArcPoint(sx, y - 1, ctx->opts.entitySpacing - 8,
- ctx->opts.loopArcHeight, 180.0f - 45.0f,
+ ADrawComputeArcPoint((float)sx, (float)(y - 1), (float)(ctx->opts.entitySpacing - 8),
+ (float)ctx->opts.loopArcHeight, 180.0f - 45.0f,
&px, &py);
/* Draw a cross */
@@ -1392,8 +1393,9 @@ static void arcLine(Context *ctx,
hasArrows = FALSE;
/* Get co-ordinates of the arc end-point */
- ADrawComputeArcPoint(sx, y - 1, ctx->opts.entitySpacing - 8,
- ctx->opts.loopArcHeight, 45.0f,
+ ADrawComputeArcPoint((float)sx, (float)(y - 1),
+ (float)(ctx->opts.entitySpacing - 8),
+ (float)ctx->opts.loopArcHeight, 45.0f,
&px, &py);
/* Draw a cross */
diff --git a/libmscgen/mscgen_gd_out.c b/libmscgen/mscgen_gd_out.c
index 8d8198c..72c79f5 100644
--- a/libmscgen/mscgen_gd_out.c
+++ b/libmscgen/mscgen_gd_out.c
@@ -180,7 +180,7 @@ unsigned int gdoTextWidth(struct ADrawTag *ctx,
const char *string)
{
#ifndef USE_FREETYPE
- const unsigned int l = strlen(string);
+ const unsigned int l = (unsigned int)strlen(string);
/* Remove 1 pixel since there is usually an uneven gap at
* the right of the last character for the fixed width
diff --git a/libmscgen/mscgen_language.y b/libmscgen/mscgen_language.y
index 0c0ab50..52dedb3 100644
--- a/libmscgen/mscgen_language.y
+++ b/libmscgen/mscgen_language.y
@@ -179,7 +179,7 @@ int yywrap()
char *removeEscapes(char *in)
{
- const uint16_t l = strlen(in);
+ const uint16_t l = (uint16_t)strlen(in);
char *r = (char *)malloc_s(l + 1);
uint16_t t, u;
@@ -209,6 +209,7 @@ Msc MscParse(FILE *in)
yyin = in;
+ lex_resetparser();
/* Parse, and check that no errors are found */
if(yyparse((void *)&m) != 0)
{
diff --git a/libmscgen/mscgen_lexer.h b/libmscgen/mscgen_lexer.h
index 0cbb21f..bba38c1 100644
--- a/libmscgen/mscgen_lexer.h
+++ b/libmscgen/mscgen_lexer.h
@@ -56,6 +56,7 @@ Boolean lex_getutf8(void);
unsigned long lex_getlinenum(void);
char *lex_getline(void);
void lex_destroy(void);
+void lex_resetparser(void);
#endif /* MSCGEN_LEXER_H */
diff --git a/libmscgen/mscgen_lexer.l b/libmscgen/mscgen_lexer.l
index 52f5e05..ea812f9 100644
--- a/libmscgen/mscgen_lexer.l
+++ b/libmscgen/mscgen_lexer.l
@@ -234,5 +234,12 @@ Boolean lex_getutf8(void)
return lex_utf8;
}
+void lex_resetparser()
+{
+ lex_linenum = 1;
+ lex_line = NULL;
+ lex_utf8 = FALSE;
+}
+
#include "mscgen_lexer.l.h"
/* END OF FILE */
diff --git a/libversion/CMakeLists.txt b/libversion/CMakeLists.txt
index 6952cea..9bd87c3 100644
--- a/libversion/CMakeLists.txt
+++ b/libversion/CMakeLists.txt
@@ -1,16 +1,16 @@
# vim:ts=4:sw=4:expandtab:autoindent:
# setup information for doxygen version handling
-set(PRE_CONFIGURE_DOXYGEN_VERSION_FILE "${CMAKE_SOURCE_DIR}/libversion/doxyversion.cpp.in")
+set(PRE_CONFIGURE_DOXYGEN_VERSION_FILE "${PROJECT_SOURCE_DIR}/libversion/doxyversion.cpp.in")
set(POST_CONFIGURE_DOXYGEN_VERSION_FILE "${GENERATED_SRC}/doxyversion.cpp")
# setup information for git version handling
-set(PRE_CONFIGURE_GIT_VERSION_FILE "${CMAKE_SOURCE_DIR}/libversion/gitversion.cpp.in")
+set(PRE_CONFIGURE_GIT_VERSION_FILE "${PROJECT_SOURCE_DIR}/libversion/gitversion.cpp.in")
set(POST_CONFIGURE_GIT_VERSION_FILE "${GENERATED_SRC}/gitversion.cpp")
set(GIT_STATE_FILE "${GENERATED_SRC}/git_state")
-include(${CMAKE_SOURCE_DIR}/cmake/git_watcher.cmake)
-include(${CMAKE_SOURCE_DIR}/cmake/doxygen_version.cmake)
+include(${PROJECT_SOURCE_DIR}/cmake/git_watcher.cmake)
+include(${PROJECT_SOURCE_DIR}/cmake/doxygen_version.cmake)
include_directories(
.
@@ -19,6 +19,7 @@ include_directories(
add_library(doxygen_version STATIC
${POST_CONFIGURE_DOXYGEN_VERSION_FILE}
${POST_CONFIGURE_GIT_VERSION_FILE}
+ fullversion.cpp
)
add_dependencies( doxygen_version check_git_repository )
diff --git a/libversion/doxyversion.cpp.in b/libversion/doxyversion.cpp.in
index 11bca8d..fcdac77 100644
--- a/libversion/doxyversion.cpp.in
+++ b/libversion/doxyversion.cpp.in
@@ -1,6 +1,6 @@
#include "version.h"
-char *getVersion(void)
+const char *getDoxygenVersion(void)
{
static char versionString[] = "@DOXYGEN_VERSION@";
return versionString;
diff --git a/libversion/fullversion.cpp b/libversion/fullversion.cpp
new file mode 100644
index 0000000..e0a779f
--- /dev/null
+++ b/libversion/fullversion.cpp
@@ -0,0 +1,22 @@
+#include <string.h>
+#include <version.h>
+
+const char *getFullVersion(void)
+{
+#define BUF_SIZE 100
+ static char fullVersionString[BUF_SIZE];
+ static bool init = false;
+ if (!init)
+ {
+ strncpy(fullVersionString,getDoxygenVersion(),BUF_SIZE-1);
+ if (strlen(getGitVersion())>0)
+ {
+ strncat(fullVersionString," (",BUF_SIZE-1);
+ strncat(fullVersionString,getGitVersion(),BUF_SIZE-1);
+ strncat(fullVersionString,")",BUF_SIZE-1);
+ }
+ fullVersionString[BUF_SIZE-1]='\0';
+ init = true;
+ }
+ return fullVersionString;
+}
diff --git a/libversion/gitversion.cpp.in b/libversion/gitversion.cpp.in
index 164b50b..242dd59 100644
--- a/libversion/gitversion.cpp.in
+++ b/libversion/gitversion.cpp.in
@@ -6,11 +6,18 @@
* - No git information is present (no .git directory)
* in those cases clear the gitVersionString (would have string GIT-NOTFOUND).
*/
-char *getGitVersion(void)
+const char *getGitVersion(void)
{
- static char gitVersionString[100];
- strcpy(gitVersionString,"@GIT_HEAD_SHA1@");
- strcat(gitVersionString,!strcmp("@GIT_IS_DIRTY@","true")?"*":"");
- if (!strcmp("@GIT_HEAD_SHA1@", "GIT-NOTFOUND")) gitVersionString[0] = '\0';
+#define BUF_SIZE 100
+ static char gitVersionString[BUF_SIZE];
+ static bool init = false;
+ if (!init)
+ {
+ strncpy(gitVersionString,"@GIT_HEAD_SHA1@",BUF_SIZE-1);
+ strncat(gitVersionString,!strcmp("@GIT_IS_DIRTY@","true")?"*":"",BUF_SIZE-1);
+ if (!strcmp("@GIT_HEAD_SHA1@", "GIT-NOTFOUND")) gitVersionString[0] = '\0';
+ gitVersionString[BUF_SIZE-1]='\0';
+ init = true;
+ }
return gitVersionString;
}
diff --git a/libversion/version.h b/libversion/version.h
index a656e74..212e8d4 100644
--- a/libversion/version.h
+++ b/libversion/version.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -17,6 +15,7 @@
#ifndef VERSION_H
#define VERSION_H
-char *getVersion(void);
-char *getGitVersion(void);
+const char *getDoxygenVersion(void);
+const char *getGitVersion(void);
+const char *getFullVersion(void);
#endif
diff --git a/qtools/CMakeLists.txt b/qtools/CMakeLists.txt
index cc64de1..d49ca47 100644
--- a/qtools/CMakeLists.txt
+++ b/qtools/CMakeLists.txt
@@ -10,12 +10,10 @@ qdir.cpp
qfile.cpp
qfileinfo.cpp
qgarray.cpp
-qgcache.cpp
qgdict.cpp
qglist.cpp
qglobal.cpp
qgstring.cpp
-qgvector.cpp
qiodevice.cpp
qregexp.cpp
qstring.cpp
@@ -25,8 +23,6 @@ qstringlist.cpp
qcstringlist.cpp
qxml.cpp
qmap.cpp
-qthread.cpp
-qmutex.cpp
qutfcodec.cpp
)
@@ -35,9 +31,6 @@ list(APPEND qtools_src
qfile_unix.cpp
qdir_unix.cpp
qfileinfo_unix.cpp
-qthread_unix.cpp
-qmutex_unix.cpp
-qwaitcondition_unix.cpp
)
endif()
@@ -46,9 +39,6 @@ list(APPEND qtools_src
qfile_win32.cpp
qdir_win32.cpp
qfileinfo_win32.cpp
-qthread_win32.cpp
-qmutex_win32.cpp
-qwaitcondition_win32.cpp
)
endif()
diff --git a/qtools/Doxyfile b/qtools/Doxyfile
index 109d3dc..d3ab25a 100644
--- a/qtools/Doxyfile
+++ b/qtools/Doxyfile
@@ -28,7 +28,6 @@ INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
ALIASES =
-TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
diff --git a/qtools/qasciidict.h b/qtools/qasciidict.h
index 29fcf2f..6a93a02 100644
--- a/qtools/qasciidict.h
+++ b/qtools/qasciidict.h
@@ -46,7 +46,7 @@
template<class type> class Q_EXPORT QAsciiDict : public QGDict
{
public:
- QAsciiDict(int size=17, bool caseSensitive=TRUE, bool copyKeys=TRUE )
+ QAsciiDict(uint size=17, bool caseSensitive=TRUE, bool copyKeys=TRUE )
: QGDict(size,AsciiKey,caseSensitive,copyKeys) {}
QAsciiDict( const QAsciiDict<type> &d ) : QGDict(d) {}
~QAsciiDict() { clear(); }
diff --git a/qtools/qcache.h b/qtools/qcache.h
deleted file mode 100644
index 39d4f7a..0000000
--- a/qtools/qcache.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QCache template class
-**
-** Created : 950209
-**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
-**
-** This file is part of the tools module of the Qt GUI Toolkit.
-**
-** This file may be distributed under the terms of the Q Public License
-** as defined by Trolltech AS of Norway and appearing in the file
-** LICENSE.QPL included in the packaging of this file.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
-** licenses may use this file in accordance with the Qt Commercial License
-** Agreement provided with the Software.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
-** information about Qt Commercial License Agreements.
-** See http://www.trolltech.com/qpl/ for QPL licensing information.
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
-
-#ifndef QCACHE_H
-#define QCACHE_H
-
-#ifndef QT_H
-#include "qgcache.h"
-#endif // QT_H
-
-template<class type> class Q_EXPORT QCache : public QGCache
-{
-public:
- QCache( const QCache<type> &c ) : QGCache(c) {}
- QCache( int maxCost=100, int size=17, bool caseSensitive=TRUE )
- : QGCache( maxCost, size, AsciiKey, caseSensitive, TRUE ) {}
- ~QCache() { clear(); }
- QCache<type> &operator=( const QCache<type> &c )
- { return (QCache<type>&)QGCache::operator=(c); }
- int maxCost() const { return QGCache::maxCost(); }
- int totalCost() const { return QGCache::totalCost(); }
- void setMaxCost( int m ) { QGCache::setMaxCost(m); }
- uint count() const { return QGCache::count(); }
- uint size() const { return QGCache::size(); }
- bool isEmpty() const { return QGCache::count() == 0; }
- void clear() { QGCache::clear(); }
- bool insert( const char *k, const type *d, int c=1, int p=0 )
- { return QGCache::insert_other(k,(Item)d,c,p);}
- bool remove( const char *k )
- { return QGCache::remove_other(k); }
- type *take( const char *k )
- { return (type *)QGCache::take_other(k); }
- type *find( const char *k, bool ref=TRUE ) const
- { return (type *)QGCache::find_other(k,ref);}
- type *operator[]( const char *k ) const
- { return (type *)QGCache::find_other(k);}
- void statistics() const { QGCache::statistics(); }
- int hits() const { return QGCache::hits(); }
- int misses() const { return QGCache::misses(); }
-private:
- void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
-};
-
-
-
-template<class type> class Q_EXPORT QCacheIterator : public QGCacheIterator
-{
-public:
- QCacheIterator( const QCache<type> &c ):QGCacheIterator((QGCache &)c) {}
- QCacheIterator( const QCacheIterator<type> &ci)
- : QGCacheIterator( (QGCacheIterator &)ci ) {}
- QCacheIterator<type> &operator=(const QCacheIterator<type>&ci)
- { return ( QCacheIterator<type>&)QGCacheIterator::operator=( ci ); }
- uint count() const { return QGCacheIterator::count(); }
- bool isEmpty() const { return QGCacheIterator::count() == 0; }
- bool atFirst() const { return QGCacheIterator::atFirst(); }
- bool atLast() const { return QGCacheIterator::atLast(); }
- type *toFirst() { return (type *)QGCacheIterator::toFirst(); }
- type *toLast() { return (type *)QGCacheIterator::toLast(); }
- operator type *() const { return (type *)QGCacheIterator::get(); }
- type *current() const { return (type *)QGCacheIterator::get(); }
- const char *currentKey() const{ return QGCacheIterator::getKeyAscii(); }
- type *operator()() { return (type *)QGCacheIterator::operator()();}
- type *operator++() { return (type *)QGCacheIterator::operator++(); }
- type *operator+=(uint j) { return (type *)QGCacheIterator::operator+=(j);}
- type *operator--() { return (type *)QGCacheIterator::operator--(); }
- type *operator-=(uint j) { return (type *)QGCacheIterator::operator-=(j);}
-};
-
-
-#endif // QCACHE_H
diff --git a/qtools/qcollection.cpp b/qtools/qcollection.cpp
index e70b64b..4f86227 100644
--- a/qtools/qcollection.cpp
+++ b/qtools/qcollection.cpp
@@ -60,7 +60,7 @@
*/
-/*! \enum QCollection::Item
+/*! \typedef QCollection::Item
This type is the generic "item" in a QCollection.
*/
diff --git a/qtools/qcollection.h b/qtools/qcollection.h
index a169b7c..c187569 100644
--- a/qtools/qcollection.h
+++ b/qtools/qcollection.h
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Definition of base class for all collection classes
**
@@ -43,7 +43,6 @@
#endif // QT_H
-class QGVector;
class QGList;
class QGDict;
diff --git a/qtools/qcstring.cpp b/qtools/qcstring.cpp
index 64417e3..da7a46f 100644
--- a/qtools/qcstring.cpp
+++ b/qtools/qcstring.cpp
@@ -218,135 +218,6 @@ int QCString::contains( const QRegExp &rx ) const
return count;
}
-bool QCString::startsWith( const char *s ) const
-{
- const char *p = data();
- if (p==0 || s==0) return s==0;
- while (*p!=0 && *p==*s) p++,s++;
- return *s==0;
-}
-
-bool QCString::stripPrefix(const char *prefix)
-{
- if (prefix==0 || length()==0) return FALSE;
- int len = qstrlen(prefix);
- if (qstrncmp(prefix,data(),len)==0)
- {
- m_rep=mid(len,length()-len).m_rep; // need to make a deep copy
- return TRUE;
- }
- return FALSE;
-}
-
-QCString QCString::left( uint len ) const
-{
- if (isEmpty())
- {
- return QCString();
- }
- else if (len>=length())
- {
- return QCString(data());
- }
- else
- {
- QCString s( len+1 );
- memcpy( s.rawData(), data(), len);
- return s;
- }
-}
-
-QCString QCString::right( uint len ) const
-{
- if (isEmpty())
- {
- return QCString();
- }
- else
- {
- int l = length();
- if ((int)len>l) len=l;
- const char *pos = data() + (l-len);
- return QCString(pos);
- }
-}
-
-QCString QCString::mid( uint index, uint len) const
-{
- uint slen = (uint)length();
- if (len==0xffffffff) len = slen-index;
- if (isEmpty() || index>=slen || len==0)
- {
- return QCString();
- }
- else
- {
- const char *p = data()+index;
- QCString s(len+1);
- qstrncpy( s.rawData(), p, len+1 );
- return s;
- }
-}
-
-QCString QCString::lower() const
-{
- if (length()==0) return QCString();
- QCString s(data());
- char *pos = s.rawData();
- if (pos)
- {
- while (*pos)
- {
- *pos = tolower((unsigned char)*pos);
- pos++;
- }
- }
- return s;
-}
-
-QCString QCString::upper() const
-{
- if (length()==0) return QCString();
- QCString s(data());
- char *pos = s.rawData();
- if (pos)
- {
- while (*pos)
- {
- *pos = toupper((unsigned char)*pos);
- pos++;
- }
- }
- return s;
-}
-
-QCString QCString::stripWhiteSpace() const
-{
- if ( isEmpty() ) // nothing to do
- return *this;
-
- const char *cs = data();
- int reslen = length();
- if ( !isspace((uchar)cs[0]) && !isspace((uchar)cs[reslen-1]) )
- return *this; // returns a copy
-
- QCString result(cs);
- char *s = result.rawData();
- int start = 0;
- int end = reslen - 1;
- while ( isspace((uchar) s[start]) ) // skip white space from start
- start++;
- if ( s[start] == '\0' )
- { // only white space
- return QCString();
- }
- while ( end && isspace((uchar) s[end]) ) // skip white space from end
- end--;
- end -= start - 1;
- qmemmove( s, &s[start], end );
- result.resize( end + 1 );
- return result;
-}
QCString QCString::simplifyWhiteSpace() const
{
@@ -375,67 +246,6 @@ QCString QCString::simplifyWhiteSpace() const
return result;
}
-QCString &QCString::assign( const char *str )
-{
- return operator=(str);
-}
-
-QCString &QCString::insert( uint index, const char *s )
-{
- int len = s ? qstrlen(s) : 0;
- if ( len == 0 ) return *this;
- int olen = length();
- int nlen = olen + len;
- if ((int)index>=olen)
- {
- resize(nlen+index-olen+1);
- memset(rawData()+olen, ' ', index-olen);
- memcpy(rawData()+index,s, len+1);
- }
- else
- {
- resize(nlen+1);
- qmemmove(rawData()+index+len,data()+index,olen-index+1);
- memcpy(rawData()+index,s,len);
- }
- return *this;
-}
-
-QCString &QCString::insert( uint index, char c)
-{
- char buf[2];
- buf[0] = c;
- buf[1] = '\0';
- return insert( index, buf );
-}
-QCString &QCString::append( const char *s )
-{
- return operator+=(s);
-}
-QCString &QCString::prepend( const char *s )
-{
- return insert(0,s);
-}
-QCString &QCString::remove( uint index, uint len )
-{
- uint olen = length();
- if ( index + len >= olen ) // range problems
- {
- if ( index < olen ) // index ok
- {
- resize( index+1 );
- }
- }
- else if ( len != 0 )
- {
- QCString tmp(olen-index-len+1);
- qmemmove( tmp.rawData(), data()+index+len, olen-index-len+1 );
- resize( olen-len+1 );
- memcpy( rawData()+index,tmp.data(),tmp.length() );
- }
- return *this;
-}
-
QCString &QCString::replace( uint index, uint len, const char *s)
{
remove( index, len );
@@ -645,65 +455,6 @@ bye:
return is_ok ? val : 0;
}
-QCString &QCString::setNum(short n)
-{
- return setNum((long)n);
-}
-
-QCString &QCString::setNum(ushort n)
-{
- return setNum((ulong)n);
-}
-
-QCString &QCString::setNum(int n)
-{
- return setNum((long)n);
-}
-
-QCString &QCString::setNum(uint n)
-{
- return setNum((ulong)n);
-}
-
-QCString &QCString::setNum(long n)
-{
- char buf[20];
- char *p = &buf[19];
- bool neg;
- if ( n < 0 )
- {
- neg = TRUE;
- n = -n;
- }
- else
- {
- neg = FALSE;
- }
- *p = '\0';
- do
- {
- *--p = ((int)(n%10)) + '0';
- n /= 10;
- } while ( n );
- if ( neg ) *--p = '-';
- operator=( p );
- return *this;
-}
-
-QCString &QCString::setNum( ulong n)
-{
- char buf[20];
- char *p = &buf[19];
- *p = '\0';
- do
- {
- *--p = ((int)(n%10)) + '0';
- n /= 10;
- } while ( n );
- operator=( p );
- return *this;
-}
-
//-------------------------------------------------
void *qmemmove( void *dst, const void *src, uint len )
@@ -828,15 +579,108 @@ QDataStream &operator>>( QDataStream &s, QCString &str )
inline QCString operator+( const QCString &s1, const QGString &s2 )
{
- QCString tmp(s1);
- tmp += s2.data();
- return tmp;
+ return s1.str()+s2.data();
}
inline QCString operator+( const QGString &s1, const QCString &s2 )
{
- QCString tmp(s1.data());
- tmp += s2;
- return tmp;
+ return s1.data()+s2.str();
+}
+
+/// substitute all occurrences of \a src in \a s by \a dst
+QCString substitute(const QCString &s,const QCString &src,const QCString &dst)
+{
+ if (s.isEmpty() || src.isEmpty()) return s;
+ const char *p, *q;
+ int srcLen = src.length();
+ int dstLen = dst.length();
+ int resLen;
+ if (srcLen!=dstLen)
+ {
+ int count;
+ for (count=0, p=s.data(); (q=strstr(p,src))!=0; p=q+srcLen) count++;
+ resLen = s.length()+count*(dstLen-srcLen);
+ }
+ else // result has same size as s
+ {
+ resLen = s.length();
+ }
+ QCString result(resLen+1);
+ char *r;
+ for (r=result.rawData(), p=s; (q=strstr(p,src))!=0; p=q+srcLen)
+ {
+ int l = (int)(q-p);
+ memcpy(r,p,l);
+ r+=l;
+
+ if (dst) memcpy(r,dst,dstLen);
+ r+=dstLen;
+ }
+ if (r)
+ {
+ qstrcpy(r,p);
+ }
+ //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data());
+ return result;
+}
+
+
+/// substitute all occurrences of \a src in \a s by \a dst, but skip
+/// each consecutive sequence of \a src where the number consecutive
+/// \a src matches \a skip_seq; if \a skip_seq is negative, skip any
+/// number of consecutive \a src
+QCString substitute(const QCString &s,const QCString &src,const QCString &dst,int skip_seq)
+{
+ if (s.isEmpty() || src.isEmpty()) return s;
+ const char *p, *q;
+ int srcLen = src.length();
+ int dstLen = dst.length();
+ int resLen;
+ if (srcLen!=dstLen)
+ {
+ int count;
+ for (count=0, p=s.data(); (q=strstr(p,src))!=0; p=q+srcLen) count++;
+ resLen = s.length()+count*(dstLen-srcLen);
+ }
+ else // result has same size as s
+ {
+ resLen = s.length();
+ }
+ QCString result(resLen+1);
+ char *r;
+ for (r=result.rawData(), p=s; (q=strstr(p,src))!=0; p=q+srcLen)
+ {
+ // search a consecutive sequence of src
+ int seq = 0, skip = 0;
+ if (skip_seq)
+ {
+ for (const char *n=q+srcLen; qstrncmp(n,src,srcLen)==0; seq=1+skip, n+=srcLen)
+ ++skip; // number of consecutive src after the current one
+
+ // verify the allowed number of consecutive src to skip
+ if (skip_seq > 0 && skip_seq != seq)
+ seq = skip = 0;
+ }
+
+ // skip a consecutive sequence of src when necessary
+ int l = (int)((q + seq * srcLen)-p);
+ memcpy(r,p,l);
+ r+=l;
+
+ if (skip)
+ {
+ // skip only the consecutive src found after the current one
+ q += skip * srcLen;
+ // the next loop will skip the current src, aka (p=q+srcLen)
+ continue;
+ }
+
+ if (dst) memcpy(r,dst,dstLen);
+ r+=dstLen;
+ }
+ qstrcpy(r,p);
+ result.resize((int)strlen(result.data())+1);
+ //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data());
+ return result;
}
diff --git a/qtools/qcstring.h b/qtools/qcstring.h
index c2a5dc3..75bdf29 100644
--- a/qtools/qcstring.h
+++ b/qtools/qcstring.h
@@ -21,51 +21,22 @@
#include "qarray.h"
#endif // QT_H
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include <string>
+#include <algorithm>
-#if !defined(_OS_WIN32_) || defined(__MINGW32__)
-#include <stdint.h>
-#endif
-
-#if defined(_OS_SUN_) && defined(_CC_GNU_)
-#include <strings.h>
-#endif
-
-#include <assert.h>
+#include <cctype>
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <cstdint>
class QGString;
/*****************************************************************************
- Fixes and workarounds for some platforms
- *****************************************************************************/
-
-#if defined(_OS_HPUX_)
-// HP-UX has badly defined strstr() etc.
-// ### fix in 3.0: change hack_* to qt_hack_*
-// by the way HP-UX is probably right, the standard has evolved and
-// we'll have to adapt to it
-inline char *hack_strstr( const char *s1, const char *s2 )
-{ return (char *)strstr(s1, s2); }
-inline char *hack_strchr( const char *s, int c )
-{ return (char *)strchr(s, c); }
-inline char *hack_strrchr( const char *s, int c )
-{ return (char *)strrchr(s, c); }
-#define strstr(s1,s2) hack_strstr((s1),(s2))
-#define strchr(s,c) hack_strchr((s),(c))
-#define strrchr(s,c) hack_strrchr((s),(c))
-#endif
-
-/*****************************************************************************
Safe and portable C string functions; extensions to standard string.h
*****************************************************************************/
-Q_EXPORT void *qmemmove( void *dst, const void *src, uint len );
-
-#if defined(_OS_SUN_) || defined(_CC_OC_)
-#define memmove(s1,s2,n) qmemmove((s1),(s2),(n))
-#endif
+void *qmemmove( void *dst, const void *src, uint len );
#if defined(_OS_WIN32_)
#define qsnprintf _snprintf
@@ -73,45 +44,45 @@ Q_EXPORT void *qmemmove( void *dst, const void *src, uint len );
#define qsnprintf snprintf
#endif
-Q_EXPORT char *qstrdup( const char * );
+char *qstrdup( const char * );
-Q_EXPORT inline uint cstrlen( const char *str )
+inline uint cstrlen( const char *str )
{ return (uint)strlen(str); }
-Q_EXPORT inline uint qstrlen( const char *str )
+inline uint qstrlen( const char *str )
{ return str ? (uint)strlen(str) : 0; }
-Q_EXPORT inline char *cstrcpy( char *dst, const char *src )
+inline char *cstrcpy( char *dst, const char *src )
{ return strcpy(dst,src); }
-Q_EXPORT inline char *qstrcpy( char *dst, const char *src )
+inline char *qstrcpy( char *dst, const char *src )
{ return src ? strcpy(dst, src) : 0; }
-Q_EXPORT char * qstrncpy(char *src,const char *dst, uint len);
+char * qstrncpy(char *dst,const char *src, uint len);
-Q_EXPORT inline int cstrcmp( const char *str1, const char *str2 )
+inline int cstrcmp( const char *str1, const char *str2 )
{ return strcmp(str1,str2); }
-Q_EXPORT inline int qstrcmp( const char *str1, const char *str2 )
+inline int qstrcmp( const char *str1, const char *str2 )
{ return (str1 && str2) ? strcmp(str1,str2) : (int)((intptr_t)str2 - (intptr_t)str1); }
-Q_EXPORT inline int cstrncmp( const char *str1, const char *str2, uint len )
+inline int cstrncmp( const char *str1, const char *str2, uint len )
{ return strncmp(str1,str2,len); }
-Q_EXPORT inline int qstrncmp( const char *str1, const char *str2, uint len )
+inline int qstrncmp( const char *str1, const char *str2, uint len )
{ return (str1 && str2) ? strncmp(str1,str2,len) :
(int)((intptr_t)str2 - (intptr_t)str1); }
-Q_EXPORT int qstricmp( const char *str1, const char *str2 );
+int qstricmp( const char *str1, const char *str2 );
-Q_EXPORT int qstrnicmp( const char *str1, const char *str2, uint len );
+int qstrnicmp( const char *str1, const char *str2, uint len );
/*****************************************************************************
QByteArray class
*****************************************************************************/
#if defined(Q_TEMPLATEDLL)
-template class Q_EXPORT QArray<char>;
+template class QArray<char>;
#endif
typedef QArray<char> QByteArray;
@@ -119,120 +90,75 @@ typedef QArray<char> QByteArray;
QByteArray stream functions
*****************************************************************************/
#ifndef QT_NO_DATASTREAM
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QByteArray & );
-Q_EXPORT QDataStream &operator>>( QDataStream &, QByteArray & );
+QDataStream &operator<<( QDataStream &, const QByteArray & );
+QDataStream &operator>>( QDataStream &, QByteArray & );
#endif
class QRegExp;
/** This is an alternative implementation of QCString. It provides basically
- * the same functions but uses reference counting and copy on write.
+ * the same functions but uses std::string as the underlying string type
*/
class QCString
{
-public:
- /** creates an empty string */
- QCString() : m_rep()
- {
- }
+ public:
+ QCString() = default;
+ ~QCString() = default;
+ QCString( const QCString &s ) = default;
+ QCString &operator=( const QCString &s ) = default;
+ QCString( QCString &&s ) = default;
+ QCString &operator=( QCString &&s ) = default;
- /** destroys the string */
- ~QCString()
- {
- }
-
- /** makes a copy of a string. */
- QCString( const QCString &s ) : m_rep(s.m_rep)
- {
- }
+ QCString( const std::string &s ) : m_rep(s) {}
/** creates a string with room for size characters
- * @param[in] size the number of character to allocate (including the 0-terminator)
+ * @param[in] size the number of character to allocate (also counting the 0-terminator!)
*/
- explicit QCString( int size ) : m_rep(size)
- {
- }
+ explicit QCString( uint size ) { m_rep.resize(size>0 ? size-1 : 0); }
/** creates a string from a plain C string.
* @param[in] str A zero terminated C string. When 0 an empty string is created.
*/
- QCString( const char *str ) : m_rep(str)
- {
- }
+ QCString( const char *str ) : m_rep(str?str:"") {}
/** creates a string from \a str and copies over the first \a maxlen characters. */
- QCString( const char *str, uint maxlen ) : m_rep(str,maxlen)
- {
- }
+ QCString( const char *str, uint maxlen ) : m_rep(str?str:"") { m_rep.resize(maxlen); }
/** replaces the contents by that of string \a s. */
- QCString &operator=( const QCString &s )
- {
- m_rep = s.m_rep;
- return *this;
- }
/** replaces the contents by that of C string \a str. */
- QCString &operator=( const char *str)
- {
- m_rep = str;
- return *this;
- }
+ QCString &operator=( const char *str) { m_rep = str?str:""; return *this; }
/** Returns TRUE iff the string is empty. Equivalent to isEmpty(). */
- bool isNull() const
- {
- return m_rep.isEmpty();
- }
+ bool isNull() const { return m_rep.empty(); }
/** Returns TRUE iff the string is empty */
- bool isEmpty() const
- {
- return m_rep.isEmpty();
- }
+ bool isEmpty() const { return m_rep.empty(); }
- /** Returns the length of the string, excluding the 0-terminator. Equivalent to size(). */
- uint length() const
- {
- return m_rep.length();
- }
+ /** Returns the length of the string, not counting the 0-terminator. Equivalent to size(). */
+ uint length() const { return (uint)m_rep.size(); }
- /** Returns the length of the string, excluding the 0-terminator. */
- uint size() const
- {
- return m_rep.length();
- }
+ /** Returns the length of the string, not counting the 0-terminator. */
+ uint size() const { return (uint)m_rep.size(); }
/** Returns a pointer to the contents of the string in the form of a 0-terminated C string */
- const char *data() const
- {
- return m_rep.data();
- }
+ const char *data() const { return m_rep.empty() ? 0 : m_rep.c_str(); }
/** Returns a writable pointer to the data.
* @warning if the string is shared it will modifying the string directly and
* this will overwrite all copies as well!
*/
- char *rawData() const
- {
- return m_rep.rawData();
- }
+ char *rawData() const { return m_rep.empty() ? 0 : const_cast<char*>(&m_rep[0]); }
/** Resizes the string to hold \a newlen characters
- * (this value should include the 0-terminator). If the string is enlarged the contents will
+ * (this value should also count the 0-terminator).
+ * If the string is enlarged the contents will
* be left unmodified.
*/
- bool resize( uint newlen )
- {
- m_rep.resize(newlen);
- return TRUE;
- }
+ bool resize( uint newlen ) { m_rep.resize( newlen>0 ? newlen-1 : 0 ); return TRUE; }
/** Truncates the string at position \a pos. */
- bool truncate( uint pos )
- {
- return resize(pos+1);
- }
+ bool truncate( uint pos ) { return resize( pos + 1 ); }
/** Fills a string with a predefined character
* @param[in] c the character used to fill the string with.
@@ -242,523 +168,286 @@ public:
*/
bool fill( char c, int len = -1 )
{
- m_rep.fill(c,len);
+ int l = len==-1 ? (int)m_rep.size() : len;
+ m_rep = std::string(l,c);
return TRUE;
}
/** Returns a deep copy of the string. */
- QCString copy() const
- {
- if (length()==0) return QCString();
- QCString cs(length()+1);
- memcpy(cs.rawData(),data(),length());
- return cs;
- }
+ QCString copy() const { return *this; }
QCString &sprintf( const char *format, ... );
+
int find( char c, int index=0, bool cs=TRUE ) const;
int find( const char *str, int index=0, bool cs=TRUE ) const;
int find( const QCString &str, int index=0, bool cs=TRUE ) const;
int find( const QRegExp &rx, int index=0 ) const;
+
int findRev( char c, int index=-1, bool cs=TRUE) const;
int findRev( const char *str, int index=-1, bool cs=TRUE) const;
int findRev( const QRegExp &rx, int index=-1 ) const;
+
int contains( char c, bool cs=TRUE ) const;
int contains( const char *str, bool cs=TRUE ) const;
int contains( const QRegExp &rx ) const;
- bool stripPrefix(const char *prefix);
- QCString left( uint len ) const;
- QCString right( uint len ) const;
- QCString mid( uint index, uint len=0xffffffff) const;
- QCString lower() const;
- QCString upper() const;
- QCString stripWhiteSpace() const;
+
+ bool stripPrefix(const char *prefix)
+ {
+ if (prefix==0 || m_rep.empty()) return FALSE;
+ if (m_rep.rfind(prefix,0)==0) // string starts with prefix
+ {
+ m_rep.erase(0,qstrlen(prefix));
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ QCString left( uint len ) const
+ {
+ return m_rep.empty() ? QCString() : QCString(m_rep.substr(0,len));
+ }
+
+ QCString right( uint len ) const
+ {
+ return m_rep.empty() ? QCString() :
+ len<m_rep.size() ? QCString(m_rep.substr(m_rep.size()-len,len)) :
+ *this;
+ }
+
+ QCString mid( uint index, uint len=(uint)-1) const
+ {
+ uint slen = (uint)m_rep.size();
+ if (len==(uint)-1) len = slen-index;
+ return m_rep.empty() || index>slen || len==0 ? QCString() :
+ QCString(m_rep.substr(index,len));
+ }
+
+ QCString lower() const
+ {
+ std::string s = m_rep;
+ std::transform(s.begin(),s.end(),s.begin(),
+ [](unsigned char c){ return (unsigned char)std::tolower(c); });
+ return s;
+ }
+
+ QCString upper() const
+ {
+ std::string s = m_rep;
+ std::transform(s.begin(),s.end(),s.begin(),
+ [](unsigned char c){ return (unsigned char)std::toupper(c); });
+ return s;
+ }
+
+ QCString stripWhiteSpace() const
+ {
+ int sl = (uint)m_rep.size();
+ if (sl==0 || (!std::isspace(m_rep[0]) && !std::isspace(m_rep[sl-1]))) return *this;
+ int start=0,end=sl-1;
+ while (start<sl && std::isspace(m_rep[start])) start++;
+ if (start==sl) return QCString(); // only whitespace
+ while (end>start && std::isspace(m_rep[end])) end--;
+ return QCString(m_rep.substr(start,1+end-start));
+ }
+
QCString simplifyWhiteSpace() const;
- QCString &assign( const char *str );
- QCString &insert( uint index, const char *s );
- QCString &insert( uint index, char c);
- QCString &append( const char *s );
- QCString &prepend( const char *s );
- QCString &remove( uint index, uint len );
+
+ QCString &insert( uint index, const char *s )
+ {
+ uint len = s ? qstrlen(s) : 0;
+ if (len>0)
+ {
+ uint ol = (uint)m_rep.size();
+ if (index>ol) // insert beyond end of string and fill gap with spaces
+ {
+ m_rep.resize(index+len);
+ std::memset(&m_rep[ol],' ',index-ol);
+ std::memcpy(&m_rep[index],s,len+1);
+ }
+ else // insert inside the string
+ {
+ m_rep.insert(index,s);
+ }
+ }
+ return *this;
+ }
+
+ QCString &insert( uint index, char c)
+ {
+ char s[2] = { c, '\0' };
+ return insert(index,s);
+ }
+
+ QCString &append( const char *s )
+ {
+ return operator+=(s);
+ }
+
+ QCString &prepend( const char *s )
+ {
+ return insert(0,s);
+ }
+
+ QCString &remove( uint index, uint len )
+ {
+ uint ol = (uint)m_rep.size();
+ if (index<ol && len>0) m_rep.erase(index,index+len>=ol ? std::string::npos : len);
+ return *this;
+ }
+
QCString &replace( uint index, uint len, const char *s);
QCString &replace( const QRegExp &rx, const char *str );
- short toShort( bool *ok=0, int base=10 ) const;
+
+ short toShort( bool *ok=0, int base=10 ) const;
ushort toUShort( bool *ok=0, int base=10 ) const;
- int toInt( bool *ok=0, int base=10 ) const;
- uint toUInt( bool *ok=0, int base=10 ) const;
- long toLong( bool *ok=0, int base=10 ) const;
- ulong toULong( bool *ok=0, int base=10 ) const;
+ int toInt( bool *ok=0, int base=10 ) const;
+ uint toUInt( bool *ok=0, int base=10 ) const;
+ long toLong( bool *ok=0, int base=10 ) const;
+ ulong toULong( bool *ok=0, int base=10 ) const;
uint64 toUInt64( bool *ok=0, int base=10 ) const;
- QCString &setNum(short n);
- QCString &setNum(ushort n);
- QCString &setNum(int n);
- QCString &setNum(uint n);
- QCString &setNum(long n);
- QCString &setNum(ulong n);
- bool startsWith( const char *s ) const;
- /** Converts the string to a plain C string */
- operator const char *() const
+ QCString &setNum(short n)
{
- return (const char *)data();
+ m_rep = std::to_string(n);
+ return *this;
}
- /** Appends string \a str to this string and returns a reference to the result. */
- QCString &operator+=( const char *str )
+ QCString &setNum(ushort n)
{
- if (!str) return *this;
- int len1 = length();
- int len2 = (int)strlen(str);
- resize(len1+len2+1);
- memcpy(rawData()+len1,str,len2);
+ m_rep = std::to_string(n);
return *this;
}
- /** Appends character \a c to this string and returns a reference to the result. */
- QCString &operator+=( char c )
+ QCString &setNum(int n)
{
- int len = length();
- resize(len+2);
- rawData()[len]=c;
+ m_rep = std::to_string(n);
return *this;
}
- /** Returns a reference to the character at index \a i. */
- char &at( uint i) const
+ QCString &setNum(uint n)
{
- return m_rep.at(i);
+ m_rep = std::to_string(n);
+ return *this;
}
- /** Indexing operator. Equivalent to at(). */
- char &operator[]( int i ) const
+ QCString &setNum(long n)
{
- return m_rep.at((uint)i);
+ m_rep = std::to_string(n);
+ return *this;
}
- private:
-
- struct LSData;
-
- // long string representation
- struct LongStringRep
+ QCString &setNum(ulong n)
{
- uchar isShort; // : 1; // should be shared with ShortStringRep
- //uchar : 7;
- LSData *d;
- };
+ m_rep = std::to_string(n);
+ return *this;
+ }
-#define SHORT_STR_CAPACITY ((int)sizeof(LongStringRep)-2)
-#define SHORT_STR_MAX_LEN (SHORT_STR_CAPACITY-1)
+ bool startsWith( const char *s ) const
+ {
+ if (m_rep.empty() || s==0) return s==0;
+ return m_rep.rfind(s,0)==0; // looking "backward" starting and ending at index 0
+ }
- // short string representation
- struct ShortStringRep
+ /** Converts the string to a plain C string */
+ operator const char *() const
{
- uchar isShort; // : 1; // should be shared with LongStringRep
- uchar len; // : 7;
- char str[SHORT_STR_CAPACITY]; // size including 0-terminator
- };
+ return data();
+ }
- // ref counting string header
- struct LSHeader
+ std::string str() const
{
- int len; // length of string without 0 terminator
- int refCount; // -1=leaked, 0=one ref & non-cost, n>0, n+1 refs, const
- };
- // ref counting string data and methods
- struct LSData : public LSHeader
+ return m_rep;
+ }
+
+ /** Appends string \a str to this string and returns a reference to the result. */
+ QCString &operator+=( const char *str )
{
- char *toStr()
- {
- return (char*)(this+1); // string data starts after the header
- }
+ if (str) m_rep+=str;
+ return *this;
+ }
- // creates a LSData item with room for size bytes (which includes the 0 terminator!)
- // if size is zero, an empty string will be created.
- static LSData *create(int size)
- {
- LSData *data;
- data = (LSData*)malloc(sizeof(LSHeader)+size);
- data->len = size-1;
- data->refCount = 0;
- data->toStr()[size-1] = 0;
- return data;
- }
- // remove out reference to the data. Frees memory if no more users
- void dispose()
- {
- if (--refCount<0) free(this);
- }
+ /** Appends character \a c to this string and returns a reference to the result. */
+ QCString &operator+=( char c )
+ {
+ m_rep+=c;
+ return *this;
+ }
- // resizes LSData so it can hold size bytes (which includes the 0 terminator!)
- // Since this is for long strings only, size should be > SHORT_STR_CAPACITY
- static LSData *resize(LSData *d,int size)
- {
- if (d->len>0 && d->refCount==0) // non-const, non-empty
- {
- d = (LSData*)realloc(d,sizeof(LSHeader)+size);
- d->len = size-1;
- d->toStr()[size-1] = 0;
- return d;
- }
- else // need to make a copy
- {
- LSData *newData = LSData::create(size);
- int len = d->len;
- if (len>=size) len=size-1;
- memcpy(newData->toStr(),d->toStr(),len);
- newData->toStr()[len]=0;
- d->dispose();
- return newData;
- }
- }
- };
+ /** Returns a reference to the character at index \a i. */
+ char &at( uint i) const
+ {
+ return const_cast<char&>(m_rep[i]);
+ }
- class StringRep
+ /** Indexing operator. Equivalent to at(). */
+ char &operator[]( int i ) const
{
- public:
- StringRep()
- {
- initEmpty();
- }
- void initEmpty()
- {
- u.s.isShort=TRUE;
- u.s.len=0;
- //memset(u.s.str,0,SHORT_STR_CAPACITY);
- }
- ~StringRep()
- {
- if (!u.s.isShort)
- {
- u.l.d->dispose();
- }
- }
- StringRep(const StringRep &s)
- {
- if (&s!=this)
- {
- u.s.isShort = s.u.s.isShort;
- if (s.u.s.isShort)
- {
- u.s.len = s.u.s.len;
- memcpy(u.s.str,s.u.s.str,s.u.s.len+1);
- }
- else
- {
- u.l.d = s.u.l.d;
- u.l.d->refCount++;
- }
- }
- else // self-assignment
- {
- u = s.u; // avoid uninitialized warning from gcc
- }
- }
- StringRep(int size)
- {
- u.s.isShort = size<=SHORT_STR_CAPACITY;
- if (size<=SHORT_STR_CAPACITY) // init short string
- {
- if (size>0)
- {
- u.s.len = size-1;
- u.s.str[size-1]='\0';
- }
- else
- {
- u.s.len = 0;
- }
- }
- else // int long string
- {
- u.l.d = LSData::create(size);
- }
- }
- StringRep(const char *str)
- {
- if (str)
- {
- int len = (int)strlen(str);
- u.s.isShort = len<SHORT_STR_CAPACITY;
- if (len<SHORT_STR_CAPACITY)
- {
- u.s.len = len;
- qstrncpy(u.s.str,str,SHORT_STR_CAPACITY);
- }
- else
- {
- u.l.d = LSData::create(len+1);
- memcpy(u.l.d->toStr(),str,u.l.d->len);
- }
- }
- else // create empty string
- {
- initEmpty();
- }
- }
- StringRep( const char *str, uint maxlen )
- {
- if (str && maxlen>0)
- {
- uint len=(uint)strlen(str);
- if (len>maxlen) len=maxlen;
- u.s.isShort = len<=SHORT_STR_MAX_LEN;
- if (u.s.isShort)
- {
- u.s.len = len;
- memcpy(u.s.str,str,len);
- u.s.str[len]='\0';
- }
- else
- {
- u.l.d = LSData::create(len+1);
- memcpy(u.l.d->toStr(),str,len);
- }
- }
- else // create empty string
- {
- initEmpty();
- }
- }
- StringRep &operator=(const StringRep &s)
- {
- if (&s!=this)
- {
- if (!u.s.isShort)
- {
- u.l.d->dispose();
- }
- u.s.isShort = s.u.s.isShort;
- if (u.s.isShort) // copy by value
- {
- u.s.len = s.u.s.len;
- memcpy(u.s.str,s.u.s.str,s.u.s.len+1);
- }
- else // copy by reference
- {
- u.l.d = s.u.l.d;
- u.l.d->refCount++;
- }
- }
- else // self-assignment
- {
- u = s.u; // avoid uninitialized warning from gcc
- }
- return *this;
- }
- StringRep &operator=(const char *str)
- {
- if (!u.s.isShort)
- {
- u.l.d->dispose();
- }
- if (str)
- {
- int len = (int)strlen(str);
- u.s.isShort = len<SHORT_STR_CAPACITY;
- if (len<SHORT_STR_CAPACITY)
- {
- u.s.len = len;
- qstrncpy(u.s.str,str,SHORT_STR_CAPACITY);
- }
- else
- {
- u.l.d = LSData::create(len+1);
- memcpy(u.l.d->toStr(),str,len);
- }
- }
- else
- {
- initEmpty();
- }
- return *this;
- }
- bool isEmpty() const
- {
- return u.s.isShort && u.s.len==0;
- }
- uint length() const
- {
- uint l = u.s.isShort ? u.s.len : u.l.d->len;
- return l;
- }
- const char *data() const
- {
- if (u.s.isShort)
- {
- return u.s.len==0 ? 0 : u.s.str;
- }
- else
- {
- return u.l.d->len==0 ? 0 : u.l.d->toStr();
- }
- }
- char *rawData() const
- {
- if (u.s.isShort)
- {
- return u.s.len==0 ? 0 : (char*)u.s.str;
- }
- else
- {
- //assert(u.l.d->refCount==0); // string may not be shared when accessed raw
- return u.l.d->len==0 ? 0 : u.l.d->toStr();
- }
- }
- char &at(int i) const
- {
- if (u.s.isShort)
- {
- return (char&)u.s.str[i];
- }
- else
- {
- return u.l.d->toStr()[i];
- }
- }
- bool resize( uint newlen )
- {
- if (u.s.isShort && newlen<=SHORT_STR_CAPACITY) // resize short string
- {
- if (newlen>0)
- {
- u.s.len = newlen-1;
- u.s.str[newlen-1]='\0';
- }
- else // string becomes empty
- {
- initEmpty();
- }
- }
- else if (u.s.isShort) // turn short string into long string
- {
- StringRep tmp = *this;
- u.s.isShort=FALSE;
- u.l.d = LSData::create(newlen);
- if (tmp.u.s.len>0)
- {
- memcpy(u.l.d->toStr(),tmp.u.s.str,tmp.u.s.len+1);
- }
- else
- {
- u.l.d->toStr()[0]='\0';
- }
- }
- else if (!u.s.isShort && newlen<=SHORT_STR_CAPACITY) // turn long string into short string
- {
- if (newlen>0)
- {
- StringRep tmp(newlen); // copy short part into tmp buffer
- memcpy(tmp.u.s.str,u.l.d->toStr(),newlen-1);
- tmp.u.s.str[newlen-1]='\0';
- u.l.d->dispose();
- u.s = tmp.u.s;
- }
- else
- {
- u.l.d->dispose();
- initEmpty();
- }
- }
- else // resize long string
- {
- u.l.d = u.l.d->resize(u.l.d,newlen);
- }
- return TRUE;
- }
- bool fill( char c, int len )
- {
- if (len<0) len=length();
- if (!u.s.isShort) // detach from shared string
- {
- resize(len+1);
- }
- else if (len!=(int)length())
- {
- if (len>0)
- {
- resize(len+1);
- }
- }
- if (len>0)
- {
- memset(rawData(),c,len);
- }
- return TRUE;
- }
- private:
- union ShortOrLongStringSelector
- {
- ShortStringRep s;
- LongStringRep l;
- } u;
- };
- StringRep m_rep;
+ return const_cast<char&>(m_rep[i]);
+ }
+ private:
+ std::string m_rep;
};
/*****************************************************************************
QCString stream functions
*****************************************************************************/
#ifndef QT_NO_DATASTREAM
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QCString & );
-Q_EXPORT QDataStream &operator>>( QDataStream &, QCString & );
+QDataStream &operator<<( QDataStream &, const QCString & );
+QDataStream &operator>>( QDataStream &, QCString & );
#endif
/*****************************************************************************
QCString non-member operators
*****************************************************************************/
-Q_EXPORT inline bool operator==( const QCString &s1, const QCString &s2 )
+inline bool operator==( const QCString &s1, const QCString &s2 )
{ return qstrcmp(s1.data(),s2.data()) == 0; }
-Q_EXPORT inline bool operator==( const QCString &s1, const char *s2 )
+inline bool operator==( const QCString &s1, const char *s2 )
{ return qstrcmp(s1.data(),s2) == 0; }
-Q_EXPORT inline bool operator==( const char *s1, const QCString &s2 )
+inline bool operator==( const char *s1, const QCString &s2 )
{ return qstrcmp(s1,s2.data()) == 0; }
-Q_EXPORT inline bool operator!=( const QCString &s1, const QCString &s2 )
+inline bool operator!=( const QCString &s1, const QCString &s2 )
{ return qstrcmp(s1.data(),s2.data()) != 0; }
-Q_EXPORT inline bool operator!=( const QCString &s1, const char *s2 )
+inline bool operator!=( const QCString &s1, const char *s2 )
{ return qstrcmp(s1.data(),s2) != 0; }
-Q_EXPORT inline bool operator!=( const char *s1, const QCString &s2 )
+inline bool operator!=( const char *s1, const QCString &s2 )
{ return qstrcmp(s1,s2.data()) != 0; }
-Q_EXPORT inline bool operator<( const QCString &s1, const QCString& s2 )
+inline bool operator<( const QCString &s1, const QCString& s2 )
{ return qstrcmp(s1.data(),s2.data()) < 0; }
-Q_EXPORT inline bool operator<( const QCString &s1, const char *s2 )
+inline bool operator<( const QCString &s1, const char *s2 )
{ return qstrcmp(s1.data(),s2) < 0; }
-Q_EXPORT inline bool operator<( const char *s1, const QCString &s2 )
+inline bool operator<( const char *s1, const QCString &s2 )
{ return qstrcmp(s1,s2.data()) < 0; }
-Q_EXPORT inline bool operator<=( const QCString &s1, const char *s2 )
+inline bool operator<=( const QCString &s1, const char *s2 )
{ return qstrcmp(s1.data(),s2) <= 0; }
-Q_EXPORT inline bool operator<=( const char *s1, const QCString &s2 )
+inline bool operator<=( const char *s1, const QCString &s2 )
{ return qstrcmp(s1,s2.data()) <= 0; }
-Q_EXPORT inline bool operator>( const QCString &s1, const char *s2 )
+inline bool operator>( const QCString &s1, const char *s2 )
{ return qstrcmp(s1.data(),s2) > 0; }
-Q_EXPORT inline bool operator>( const char *s1, const QCString &s2 )
+inline bool operator>( const char *s1, const QCString &s2 )
{ return qstrcmp(s1,s2.data()) > 0; }
-Q_EXPORT inline bool operator>=( const QCString &s1, const char *s2 )
+inline bool operator>=( const QCString &s1, const char *s2 )
{ return qstrcmp(s1.data(),s2) >= 0; }
-Q_EXPORT inline bool operator>=( const char *s1, const QCString &s2 )
+inline bool operator>=( const char *s1, const QCString &s2 )
{ return qstrcmp(s1,s2.data()) >= 0; }
-Q_EXPORT inline QCString operator+( const QCString &s1, const QCString &s2 )
+inline QCString operator+( const QCString &s1, const QCString &s2 )
{
- QCString tmp(s1);
- tmp += s2;
- return tmp;
+ return QCString(s1.str()+s2.str());
}
@@ -766,28 +455,28 @@ inline QCString operator+( const QCString &s1, const QGString &s2 );
inline QCString operator+( const QGString &s1, const QCString &s2 );
-Q_EXPORT inline QCString operator+( const QCString &s1, const char *s2 )
+inline QCString operator+( const QCString &s1, const char *s2 )
{
QCString tmp(s1);
tmp += s2;
return tmp;
}
-Q_EXPORT inline QCString operator+( const char *s1, const QCString &s2 )
+inline QCString operator+( const char *s1, const QCString &s2 )
{
QCString tmp(s1);
tmp += s2;
return tmp;
}
-Q_EXPORT inline QCString operator+( const QCString &s1, char c2 )
+inline QCString operator+( const QCString &s1, char c2 )
{
QCString tmp( s1.data() );
tmp += c2;
return tmp;
}
-Q_EXPORT inline QCString operator+( char c1, const QCString &s2 )
+inline QCString operator+( char c1, const QCString &s2 )
{
QCString tmp;
tmp += c1;
@@ -805,4 +494,25 @@ inline const char *qPrint(const QCString &s)
if (!s.isEmpty()) return s.data(); else return "";
}
+inline const char *qPrint(const std::string &s)
+{
+ return s.c_str();
+}
+
+inline std::string toStdString(const QCString &s)
+{
+ return s.str();
+}
+
+// helper functions
+QCString substitute(const QCString &str,const QCString &find,const QCString &replace);
+QCString substitute(const QCString &s,const QCString &src,const QCString &dst,int skip_seq);
+
+inline QCString substitute(const QCString &s,char srcChar,char dstChar)
+{
+ std::string ss = s.str();
+ std::replace(ss.begin(),ss.end(),srcChar,dstChar);
+ return ss;
+}
+
#endif // QCSTRING_H
diff --git a/qtools/qcstringlist.h b/qtools/qcstringlist.h
index 604a196..7ffd4d2 100644
--- a/qtools/qcstringlist.h
+++ b/qtools/qcstringlist.h
@@ -29,6 +29,10 @@ public:
QCStringList( const QValueList<QCString>& l ) : QValueList<QCString>(l) { }
QCStringList( const QCString& i ) { append(i); }
QCStringList( const char* i ) { append(i); }
+ QCStringList &operator=(const QCStringList &l)
+ {
+ return static_cast<QCStringList&>(QValueList<QCString>::operator=(l));
+ }
static QCStringList fromStrList(const QStrList&);
diff --git a/qtools/qdatastream.cpp b/qtools/qdatastream.cpp
index 5190b53..d539daf 100644
--- a/qtools/qdatastream.cpp
+++ b/qtools/qdatastream.cpp
@@ -730,7 +730,7 @@ QDataStream &QDataStream::operator<<( Q_INT16 i )
if ( printable ) { // printable data
char buf[16];
sprintf( buf, "%d\n", i );
- dev->writeBlock( buf, strlen(buf) );
+ dev->writeBlock( buf, (int)strlen(buf) );
} else if ( noswap ) { // no conversion needed
dev->writeBlock( (char *)&i, sizeof(Q_INT16) );
} else { // swap bytes
@@ -761,7 +761,7 @@ QDataStream &QDataStream::operator<<( Q_INT32 i )
if ( printable ) { // printable data
char buf[16];
sprintf( buf, "%d\n", i );
- dev->writeBlock( buf, strlen(buf) );
+ dev->writeBlock( buf, (int)strlen(buf) );
} else if ( noswap ) { // no conversion needed
dev->writeBlock( (char *)&i, sizeof(Q_INT32) );
} else { // swap bytes
@@ -793,7 +793,7 @@ QDataStream &QDataStream::operator<<( Q_INT64 i )
if ( printable ) { // printable data
char buf[20];
sprintf( buf, "%ld\n", i );
- dev->writeBlock( buf, strlen(buf) );
+ dev->writeBlock( buf, (int)strlen(buf) );
} else if ( noswap ) { // no conversion needed
dev->writeBlock( (char *)&i, sizeof(Q_INT64) );
} else { // swap bytes
@@ -815,13 +815,6 @@ QDataStream &QDataStream::operator<<( Q_INT64 i )
}
/*!
- \fn QDataStream &QDataStream::operator<<( uint i )
- Writes an unsigned integer to the stream as a 32-bit unsigned integer
- (Q_UINT32).
- Returns a reference to the stream.
-*/
-
-/*!
\fn QDataStream &QDataStream::operator<<( int i )
Writes a signed integer to the stream as a 32-bit signed integer (Q_INT32).
Returns a reference to the stream.
@@ -839,7 +832,7 @@ QDataStream &QDataStream::operator<<( float f )
if ( printable ) { // printable data
char buf[32];
sprintf( buf, "%g\n", (double)f );
- dev->writeBlock( buf, strlen(buf) );
+ dev->writeBlock( buf, (int)strlen(buf) );
} else {
float g = f; // fixes float-on-stack problem
if ( noswap ) { // no conversion needed
@@ -869,7 +862,7 @@ QDataStream &QDataStream::operator<<( double f )
if ( printable ) { // printable data
char buf[32];
sprintf( buf, "%g\n", f );
- dev->writeBlock( buf, strlen(buf) );
+ dev->writeBlock( buf, (int)strlen(buf) );
} else if ( noswap ) { // no conversion needed
dev->writeBlock( (char *)&f, sizeof(double) );
} else { // swap bytes
diff --git a/qtools/qfile.cpp b/qtools/qfile.cpp
index 98ed9a3..7939160 100644
--- a/qtools/qfile.cpp
+++ b/qtools/qfile.cpp
@@ -497,7 +497,7 @@ QCString QFile::encodeName( const QString &fileName )
}
/*!
- \enum QFile::EncoderFn
+ \typedef QFile::EncoderFn
This is used by QFile::setEncodingFunction().
*/
@@ -532,7 +532,7 @@ QString QFile::decodeName( const QCString &localFileName )
}
/*!
- \enum QFile::DecoderFn
+ \typedef QFile::DecoderFn
This is used by QFile::setDecodingFunction().
*/
diff --git a/qtools/qgcache.cpp b/qtools/qgcache.cpp
deleted file mode 100644
index 230823c..0000000
--- a/qtools/qgcache.cpp
+++ /dev/null
@@ -1,878 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QGCache and QGCacheIterator classes
-**
-** Created : 950208
-**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
-**
-** This file is part of the tools module of the Qt GUI Toolkit.
-**
-** This file may be distributed under the terms of the Q Public License
-** as defined by Trolltech AS of Norway and appearing in the file
-** LICENSE.QPL included in the packaging of this file.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
-** licenses may use this file in accordance with the Qt Commercial License
-** Agreement provided with the Software.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
-** information about Qt Commercial License Agreements.
-** See http://www.trolltech.com/qpl/ for QPL licensing information.
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
-
-#include "qgcache.h"
-#include "qinternallist.h"
-#include "qdict.h"
-#include "qstring.h"
-
-
-// NOT REVISED
-/*!
- \class QGCache qgcache.h
-
- \brief The QGCache class is an internal class for implementing QCache template classes.
-
- QGCache is a strictly internal class that acts as a base class for the
- \link collection.html collection classes\endlink QCache and QIntCache.
-*/
-
-
-/*****************************************************************************
- QGCacheItem class (internal cache item)
- *****************************************************************************/
-
-struct QCacheItem
-{
- QCacheItem( void *k, QCollection::Item d, int c, short p )
- : priority(p), skipPriority(p), cost(c), key(k), data(d), node(0) {}
- short priority;
- short skipPriority;
- int cost;
- void *key;
- QCollection::Item data;
- QLNode *node;
-};
-
-
-/*****************************************************************************
- QCList class (internal list of cache items)
- *****************************************************************************/
-
-class QCList : private QInternalList<QCacheItem>
-{
-friend class QGCacheIterator;
-friend class QCListIt;
-public:
- QCList() {}
- ~QCList();
-
- void insert( QCacheItem * ); // insert according to priority
- void insert( int, QCacheItem * );
- void take( QCacheItem * );
- void reference( QCacheItem * );
-
- void setAutoDelete( bool del ) { QCollection::setAutoDelete(del); }
-
- bool removeFirst() { return QInternalList<QCacheItem>::removeFirst(); }
- bool removeLast() { return QInternalList<QCacheItem>::removeLast(); }
-
- QCacheItem *first() { return QInternalList<QCacheItem>::first(); }
- QCacheItem *last() { return QInternalList<QCacheItem>::last(); }
- QCacheItem *prev() { return QInternalList<QCacheItem>::prev(); }
- QCacheItem *next() { return QInternalList<QCacheItem>::next(); }
-
-#if defined(DEBUG)
- int inserts; // variables for statistics
- int insertCosts;
- int insertMisses;
- int finds;
- int hits;
- int hitCosts;
- int dumps;
- int dumpCosts;
-#endif
-};
-
-
-QCList::~QCList()
-{
-#if defined(DEBUG)
- ASSERT( count() == 0 );
-#endif
-}
-
-
-void QCList::insert( QCacheItem *ci )
-{
- QCacheItem *item = first();
- while( item && item->skipPriority > ci->priority ) {
- item->skipPriority--;
- item = next();
- }
- if ( item )
- QInternalList<QCacheItem>::insert( at(), ci );
- else
- append( ci );
-#if defined(DEBUG)
- ASSERT( ci->node == 0 );
-#endif
- ci->node = currentNode();
-}
-
-inline void QCList::insert( int i, QCacheItem *ci )
-{
- QInternalList<QCacheItem>::insert( i, ci );
-#if defined(DEBUG)
- ASSERT( ci->node == 0 );
-#endif
- ci->node = currentNode();
-}
-
-
-void QCList::take( QCacheItem *ci )
-{
- if ( ci ) {
-#if defined(DEBUG)
- ASSERT( ci->node != 0 );
-#endif
- takeNode( ci->node );
- ci->node = 0;
- }
-}
-
-
-inline void QCList::reference( QCacheItem *ci )
-{
-#if defined(DEBUG)
- ASSERT( ci != 0 && ci->node != 0 );
-#endif
- ci->skipPriority = ci->priority;
- relinkNode( ci->node ); // relink as first item
-}
-
-
-class QCListIt: public QInternalListIterator<QCacheItem>
-{
-public:
- QCListIt( const QCList *p ): QInternalListIterator<QCacheItem>( *p ) {}
- QCListIt( const QCListIt *p ): QInternalListIterator<QCacheItem>( *p ) {}
-};
-
-
-/*****************************************************************************
- QCDict class (internal dictionary of cache items)
- *****************************************************************************/
-
-//
-// Since we need to decide if the dictionary should use an int or const
-// char * key (the "bool trivial" argument in the constructor below)
-// we cannot use the macro/template dict, but inherit directly from QGDict.
-//
-
-class QCDict : public QGDict
-{
-public:
- QCDict( uint size, uint kt, bool caseSensitive, bool copyKeys )
- : QGDict( size, (KeyType)kt, caseSensitive, copyKeys ) {}
-
- QCacheItem *find_string(const QCString &key) const
- { return (QCacheItem*)((QCDict*)this)->look_string(key, 0, 0); }
- QCacheItem *find_ascii(const char *key) const
- { return (QCacheItem*)((QCDict*)this)->look_ascii(key, 0, 0); }
- QCacheItem *find_int(long key) const
- { return (QCacheItem*)((QCDict*)this)->look_int(key, 0, 0); }
-
- QCacheItem *take_string(const QCString &key)
- { return (QCacheItem*)QGDict::take_string(key); }
- QCacheItem *take_ascii(const char *key)
- { return (QCacheItem*)QGDict::take_ascii(key); }
- QCacheItem *take_int(long key)
- { return (QCacheItem*)QGDict::take_int(key); }
-
- bool insert_string( const QCString &key, const QCacheItem *ci )
- { return QGDict::look_string(key,(Item)ci,1)!=0;}
- bool insert_ascii( const char *key, const QCacheItem *ci )
- { return QGDict::look_ascii(key,(Item)ci,1)!=0;}
- bool insert_int( long key, const QCacheItem *ci )
- { return QGDict::look_int(key,(Item)ci,1)!=0;}
-
- bool remove_string( QCacheItem *item )
- { return QGDict::remove_string(*((QCString*)(item->key)),item); }
- bool remove_ascii( QCacheItem *item )
- { return QGDict::remove_ascii((const char *)item->key,item); }
- bool remove_int( QCacheItem *item )
- { return QGDict::remove_int((intptr_t)item->key,item);}
-
- void statistics() { QGDict::statistics(); }
-};
-
-
-/*****************************************************************************
- QGDict member functions
- *****************************************************************************/
-
-/*!
- \internal
- Constructs a cache.
-*/
-
-QGCache::QGCache( int maxCost, uint size, KeyType kt, bool caseSensitive,
- bool copyKeys )
-{
- keytype = kt;
- lruList = new QCList;
- CHECK_PTR( lruList );
- lruList->setAutoDelete( TRUE );
- copyk = ((keytype == AsciiKey) && copyKeys);
- dict = new QCDict( size, kt, caseSensitive, FALSE );
- CHECK_PTR( dict );
- mCost = maxCost;
- tCost = 0;
-#if defined(DEBUG)
- lruList->inserts = 0;
- lruList->insertCosts = 0;
- lruList->insertMisses = 0;
- lruList->finds = 0;
- lruList->hits = 0;
- lruList->hitCosts = 0;
- lruList->dumps = 0;
- lruList->dumpCosts = 0;
-#endif
-}
-
-/*!
- \internal
- Cannot copy a cache.
-*/
-
-QGCache::QGCache( const QGCache & )
- : QCollection()
-{
-#if defined(CHECK_NULL)
- qFatal( "QGCache::QGCache(QGCache &): Cannot copy a cache" );
-#endif
-}
-
-/*!
- \internal
- Removes all items from the cache and destroys it.
-*/
-
-QGCache::~QGCache()
-{
- clear(); // delete everything first
- delete dict;
- delete lruList;
-}
-
-/*!
- \internal
- Cannot assign a cache.
-*/
-
-QGCache &QGCache::operator=( const QGCache & )
-{
-#if defined(CHECK_NULL)
- qFatal( "QGCache::operator=: Cannot copy a cache" );
-#endif
- return *this; // satisfy the compiler
-}
-
-
-/*!
- \fn uint QGCache::count() const
- \internal
- Returns the number of items in the cache.
-*/
-
-/*!
- \fn uint QGCache::size() const
- \internal
- Returns the size of the hash array.
-*/
-
-/*!
- \fn int QGCache::maxCost() const
- \internal
- Returns the maximum cache cost.
-*/
-
-/*!
- \fn int QGCache::totalCost() const
- \internal
- Returns the total cache cost.
-*/
-
-/*!
- \internal
- Sets the maximum cache cost.
-*/
-
-void QGCache::setMaxCost( int maxCost )
-{
- if ( maxCost < tCost ) {
- if ( !makeRoomFor(tCost - maxCost) ) // remove excess cost
- return;
- }
- mCost = maxCost;
-}
-
-
-/*!
- \internal
- Inserts an item into the cache.
-
- \warning If this function returns FALSE, you must delete \a data
- yourself. Additionally, be very careful about using \a data after
- calling this function, as any other insertions into the cache, from
- anywhere in the application, or within Qt itself, could cause the
- data to be discarded from the cache, and the pointer to become
- invalid.
-*/
-
-bool QGCache::insert_string( const QCString &key, QCollection::Item data,
- int cost, int priority)
-{
- if ( tCost + cost > mCost ) {
- if ( !makeRoomFor(tCost + cost - mCost, priority) ) {
-#if defined(DEBUG)
- lruList->insertMisses++;
-#endif
- return FALSE;
- }
- }
-#if defined(DEBUG)
- ASSERT( keytype == StringKey );
- lruList->inserts++;
- lruList->insertCosts += cost;
-#endif
- if ( priority < -32768 )
- priority = -32768;
- else if ( priority > 32767 )
- priority = 32677;
- QCacheItem *ci = new QCacheItem( new QCString(key), newItem(data),
- cost, (short)priority );
- CHECK_PTR( ci );
- lruList->insert( 0, ci );
- dict->insert_string( key, ci );
- tCost += cost;
- return TRUE;
-}
-
-
-/*! \internal */
-
-bool QGCache::insert_other( const char *key, QCollection::Item data,
- int cost, int priority)
-{
- if ( tCost + cost > mCost ) {
- if ( !makeRoomFor(tCost + cost - mCost, priority) ) {
-#if defined(DEBUG)
- lruList->insertMisses++;
-#endif
- return FALSE;
- }
- }
-#if defined(DEBUG)
- ASSERT( keytype != StringKey );
- lruList->inserts++;
- lruList->insertCosts += cost;
-#endif
- if ( keytype == AsciiKey && copyk )
- key = qstrdup( key );
- if ( priority < -32768 )
- priority = -32768;
- else if ( priority > 32767 )
- priority = 32677;
- QCacheItem *ci = new QCacheItem( (void*)key, newItem(data), cost,
- (short)priority );
- CHECK_PTR( ci );
- lruList->insert( 0, ci );
- if ( keytype == AsciiKey )
- dict->insert_ascii( key, ci );
- else
- dict->insert_int( (intptr_t)key, ci );
- tCost += cost;
- return TRUE;
-}
-
-
-/*!
- \internal
- Removes an item from the cache.
-*/
-
-bool QGCache::remove_string( const QCString &key )
-{
- Item d = take_string( key );
- if ( d )
- deleteItem( d );
- return d != 0;
-}
-
-
-/*! \internal */
-
-bool QGCache::remove_other( const char *key )
-{
- Item d = take_other( key );
- if ( d )
- deleteItem( d );
- return d != 0;
-}
-
-
-/*!
- \internal
- Takes an item out of the cache (no delete).
-*/
-
-QCollection::Item QGCache::take_string( const QCString &key )
-{
- QCacheItem *ci = dict->take_string( key ); // take from dict
- Item d;
- if ( ci ) {
- d = ci->data;
- tCost -= ci->cost;
- lruList->take( ci ); // take from list
- delete (QCString*)ci->key;
- delete ci;
- } else {
- d = 0;
- }
- return d;
-}
-
-/*!
- \internal
- Takes an item out of the cache (no delete).
-*/
-
-QCollection::Item QGCache::take_other( const char *key )
-{
- QCacheItem *ci;
- if ( keytype == AsciiKey )
- ci = dict->take_ascii( key );
- else
- ci = dict->take_int( (intptr_t)key );
- Item d;
- if ( ci ) {
- d = ci->data;
- tCost -= ci->cost;
- lruList->take( ci ); // take from list
- if ( copyk )
- delete [] (char *)ci->key;
- delete ci;
- } else {
- d = 0;
- }
- return d;
-}
-
-
-/*!
- \internal
- Clears the cache.
-*/
-
-void QGCache::clear()
-{
- QCacheItem *ci;
- while ( (ci = lruList->first()) ) {
- switch ( keytype ) {
- case StringKey:
- dict->remove_string( ci );
- delete (QCString*)ci->key;
- break;
- case AsciiKey:
- dict->remove_ascii( ci );
- if ( copyk )
- delete [] (char*)ci->key;
- break;
- case IntKey:
- dict->remove_int( ci );
- break;
- case PtrKey: // unused
- break;
- }
- deleteItem( ci->data ); // delete data
- lruList->removeFirst(); // remove from list
- }
- tCost = 0;
-}
-
-
-/*!
- \internal
- Finds an item in the cache.
-*/
-
-QCollection::Item QGCache::find_string( const QCString &key, bool ref ) const
-{
- QCacheItem *ci = dict->find_string( key );
-#if defined(DEBUG)
- lruList->finds++;
-#endif
- if ( ci ) {
-#if defined(DEBUG)
- lruList->hits++;
- lruList->hitCosts += ci->cost;
-#endif
- if ( ref )
- lruList->reference( ci );
- return ci->data;
- }
- return 0;
-}
-
-
-/*!
- \internal
- Finds an item in the cache.
-*/
-
-QCollection::Item QGCache::find_other( const char *key, bool ref ) const
-{
- QCacheItem *ci = keytype == AsciiKey ? dict->find_ascii(key)
- : dict->find_int((intptr_t)key);
-#if defined(DEBUG)
- lruList->finds++;
-#endif
- if ( ci ) {
-#if defined(DEBUG)
- lruList->hits++;
- lruList->hitCosts += ci->cost;
-#endif
- if ( ref )
- lruList->reference( ci );
- return ci->data;
- }
- return 0;
-}
-
-
-/*!
- \internal
- Allocates cache space for one or more items.
-*/
-
-bool QGCache::makeRoomFor( int cost, int priority )
-{
- if ( cost > mCost ) // cannot make room for more
- return FALSE; // than maximum cost
- if ( priority == -1 )
- priority = 32767;
- QCacheItem *ci = lruList->last();
- int cntCost = 0;
- int dumps = 0; // number of items to dump
- while ( cntCost < cost && ci && ci->skipPriority <= priority ) {
- cntCost += ci->cost;
- ci = lruList->prev();
- dumps++;
- }
- if ( cntCost < cost ) // can enough cost be dumped?
- return FALSE; // no
-#if defined(DEBUG)
- ASSERT( dumps > 0 );
-#endif
- while ( dumps-- ) {
- ci = lruList->last();
-#if defined(DEBUG)
- lruList->dumps++;
- lruList->dumpCosts += ci->cost;
-#endif
- switch ( keytype ) {
- case StringKey:
- dict->remove_string( ci );
- delete (QCString*)ci->key;
- break;
- case AsciiKey:
- dict->remove_ascii( ci );
- if ( copyk )
- delete [] (char *)ci->key;
- break;
- case IntKey:
- dict->remove_int( ci );
- break;
- case PtrKey: // unused
- break;
- }
- deleteItem( ci->data ); // delete data
- lruList->removeLast(); // remove from list
- }
- tCost -= cntCost;
- return TRUE;
-}
-
-
-/*!
- \internal
- Outputs debug statistics.
-*/
-
-void QGCache::statistics() const
-{
-#if defined(DEBUG)
- QCString line;
- line.fill( '*', 80 );
- qDebug( "%s",line.data() );
- qDebug( "CACHE STATISTICS:" );
- qDebug( "cache contains %d item%s, with a total cost of %d",
- count(), count() != 1 ? "s" : "", tCost );
- qDebug( "maximum cost is %d, cache is %d%% full.",
- mCost, (200*tCost + mCost) / (mCost*2) );
- qDebug( "find() has been called %d time%s",
- lruList->finds, lruList->finds != 1 ? "s" : "" );
- qDebug( "%d of these were hits, items found had a total cost of %d.",
- lruList->hits,lruList->hitCosts );
- qDebug( "%d item%s %s been inserted with a total cost of %d.",
- lruList->inserts,lruList->inserts != 1 ? "s" : "",
- lruList->inserts != 1 ? "have" : "has", lruList->insertCosts );
- qDebug( "%d item%s %s too large or had too low priority to be inserted.",
- lruList->insertMisses, lruList->insertMisses != 1 ? "s" : "",
- lruList->insertMisses != 1 ? "were" : "was" );
- qDebug( "%d item%s %s been thrown away with a total cost of %d.",
- lruList->dumps, lruList->dumps != 1 ? "s" : "",
- lruList->dumps != 1 ? "have" : "has", lruList->dumpCosts );
- qDebug( "Statistics from internal dictionary class:" );
- dict->statistics();
- qDebug( "%s",line.data() );
-#endif
-}
-
-int QGCache::hits() const
-{
- return lruList->hits;
-}
-
-int QGCache::misses() const
-{
- return lruList->finds - lruList->hits;
-}
-
-
-/*****************************************************************************
- QGCacheIterator member functions
- *****************************************************************************/
-
-/*!
- \class QGCacheIterator qgcache.h
-
- \brief An internal class for implementing QCacheIterator and QIntCacheIterator.
-
- QGCacheIterator is a strictly internal class that does the heavy work for
- QCacheIterator and QIntCacheIterator.
-*/
-
-/*!
- \internal
- Constructs an iterator that operates on the cache \e c.
-*/
-
-QGCacheIterator::QGCacheIterator( const QGCache &c )
-{
- it = new QCListIt( c.lruList );
-#if defined(DEBUG)
- ASSERT( it != 0 );
-#endif
-}
-
-/*!
- \internal
- Constructs an iterator that operates on the same cache as \e ci.
-*/
-
-QGCacheIterator::QGCacheIterator( const QGCacheIterator &ci )
-{
- it = new QCListIt( ci.it );
-#if defined(DEBUG)
- ASSERT( it != 0 );
-#endif
-}
-
-/*!
- \internal
- Destroys the iterator.
-*/
-
-QGCacheIterator::~QGCacheIterator()
-{
- delete it;
-}
-
-/*!
- \internal
- Assigns the iterator \e ci to this cache iterator.
-*/
-
-QGCacheIterator &QGCacheIterator::operator=( const QGCacheIterator &ci )
-{
- *it = *ci.it;
- return *this;
-}
-
-/*!
- \internal
- Returns the number of items in the cache.
-*/
-
-uint QGCacheIterator::count() const
-{
- return it->count();
-}
-
-/*!
- \internal
- Returns TRUE if the iterator points to the first item.
-*/
-
-bool QGCacheIterator::atFirst() const
-{
- return it->atFirst();
-}
-
-/*!
- \internal
- Returns TRUE if the iterator points to the last item.
-*/
-
-bool QGCacheIterator::atLast() const
-{
- return it->atLast();
-}
-
-/*!
- \internal
- Sets the list iterator to point to the first item in the cache.
-*/
-
-QCollection::Item QGCacheIterator::toFirst()
-{
- QCacheItem *item = it->toFirst();
- return item ? item->data : 0;
-}
-
-/*!
- \internal
- Sets the list iterator to point to the last item in the cache.
-*/
-
-QCollection::Item QGCacheIterator::toLast()
-{
- QCacheItem *item = it->toLast();
- return item ? item->data : 0;
-}
-
-/*!
- \internal
- Returns the current item.
-*/
-
-QCollection::Item QGCacheIterator::get() const
-{
- QCacheItem *item = it->current();
- return item ? item->data : 0;
-}
-
-/*!
- \internal
- Returns the key of the current item.
-*/
-
-QCString QGCacheIterator::getKeyString() const
-{
- QCacheItem *item = it->current();
- return item ? *((QCString*)item->key) : QCString();
-}
-
-/*!
- \internal
- Returns the key of the current item, as a \0-terminated C string.
-*/
-
-const char *QGCacheIterator::getKeyAscii() const
-{
- QCacheItem *item = it->current();
- return item ? (const char *)item->key : 0;
-}
-
-/*!
- \internal
- Returns the key of the current item, as a long.
-*/
-
-intptr_t QGCacheIterator::getKeyInt() const
-{
- QCacheItem *item = it->current();
- return item ? (intptr_t)item->key : 0;
-}
-
-/*!
- \internal
- Moves to the next item (postfix).
-*/
-
-QCollection::Item QGCacheIterator::operator()()
-{
- QCacheItem *item = it->operator()();
- return item ? item->data : 0;
-}
-
-/*!
- \internal
- Moves to the next item (prefix).
-*/
-
-QCollection::Item QGCacheIterator::operator++()
-{
- QCacheItem *item = it->operator++();
- return item ? item->data : 0;
-}
-
-/*!
- \internal
- Moves \e jumps positions forward.
-*/
-
-QCollection::Item QGCacheIterator::operator+=( uint jump )
-{
- QCacheItem *item = it->operator+=(jump);
- return item ? item->data : 0;
-}
-
-/*!
- \internal
- Moves to the previous item (prefix).
-*/
-
-QCollection::Item QGCacheIterator::operator--()
-{
- QCacheItem *item = it->operator--();
- return item ? item->data : 0;
-}
-
-/*!
- \internal
- Moves \e jumps positions backward.
-*/
-
-QCollection::Item QGCacheIterator::operator-=( uint jump )
-{
- QCacheItem *item = it->operator-=(jump);
- return item ? item->data : 0;
-}
diff --git a/qtools/qgcache.h b/qtools/qgcache.h
deleted file mode 100644
index 5d8a243..0000000
--- a/qtools/qgcache.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QGCache and QGCacheIterator classes
-**
-** Created : 950208
-**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
-**
-** This file is part of the tools module of the Qt GUI Toolkit.
-**
-** This file may be distributed under the terms of the Q Public License
-** as defined by Trolltech AS of Norway and appearing in the file
-** LICENSE.QPL included in the packaging of this file.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
-** licenses may use this file in accordance with the Qt Commercial License
-** Agreement provided with the Software.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
-** information about Qt Commercial License Agreements.
-** See http://www.trolltech.com/qpl/ for QPL licensing information.
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
-
-#ifndef QGCACHE_H
-#define QGCACHE_H
-
-#ifndef QT_H
-#include "qcollection.h"
-#include "qglist.h"
-#include "qgdict.h"
-#endif // QT_H
-
-
-class QCList; // internal classes
-class QCListIt;
-class QCDict;
-
-
-class Q_EXPORT QGCache : public QCollection // generic LRU cache
-{
-friend class QGCacheIterator;
-protected:
- enum KeyType { StringKey, AsciiKey, IntKey, PtrKey };
- // identical to QGDict's, but PtrKey is not used at the moment
-
- QGCache( int maxCost, uint size, KeyType kt, bool caseSensitive,
- bool copyKeys );
- QGCache( const QGCache & ); // not allowed, calls fatal()
- ~QGCache();
- QGCache &operator=( const QGCache & ); // not allowed, calls fatal()
-
- uint count() const { return ((QGDict*)dict)->count(); }
- uint size() const { return ((QGDict*)dict)->size(); }
- int maxCost() const { return mCost; }
- int totalCost() const { return tCost; }
- void setMaxCost( int maxCost );
- void clear();
-
- bool insert_string( const QCString &key, QCollection::Item,
- int cost, int priority );
- bool insert_other( const char *key, QCollection::Item,
- int cost, int priority );
- bool remove_string( const QCString &key );
- bool remove_other( const char *key );
- QCollection::Item take_string( const QCString &key );
- QCollection::Item take_other( const char *key );
-
- QCollection::Item find_string( const QCString &key, bool ref=TRUE ) const;
- QCollection::Item find_other( const char *key, bool ref=TRUE ) const;
-
- void statistics() const;
- int hits() const;
- int misses() const;
-
-private:
- bool makeRoomFor( int cost, int priority = -1 );
- KeyType keytype;
- QCList *lruList;
- QCDict *dict;
- int mCost;
- int tCost;
- bool copyk;
-};
-
-
-class Q_EXPORT QGCacheIterator // generic cache iterator
-{
-protected:
- QGCacheIterator( const QGCache & );
- QGCacheIterator( const QGCacheIterator & );
- ~QGCacheIterator();
- QGCacheIterator &operator=( const QGCacheIterator & );
-
- uint count() const;
- bool atFirst() const;
- bool atLast() const;
- QCollection::Item toFirst();
- QCollection::Item toLast();
-
- QCollection::Item get() const;
- QCString getKeyString() const;
- const char *getKeyAscii() const;
- intptr_t getKeyInt() const;
-
- QCollection::Item operator()();
- QCollection::Item operator++();
- QCollection::Item operator+=( uint );
- QCollection::Item operator--();
- QCollection::Item operator-=( uint );
-
-protected:
- QCListIt *it; // iterator on cache list
-};
-
-
-#endif // QGCACHE_H
diff --git a/qtools/qglist.cpp b/qtools/qglist.cpp
index 8197db5..878aa04 100644
--- a/qtools/qglist.cpp
+++ b/qtools/qglist.cpp
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Implementation of QGList and QGListIterator classes
**
@@ -36,7 +36,6 @@
**********************************************************************/
#include "qglist.h"
-#include "qgvector.h"
#include "qdatastream.h"
@@ -243,10 +242,10 @@ bool QGList::operator==( const QGList &list ) const
{
if ( count() != list.count() )
return FALSE;
-
+
if ( count() == 0 )
return TRUE;
-
+
QLNode *n1 = firstNode;
QLNode *n2 = list.firstNode;
while ( n1 && n2 ) {
@@ -256,7 +255,7 @@ bool QGList::operator==( const QGList &list ) const
n1 = n1->next;
n2 = n2->next;
}
-
+
return TRUE;
}
@@ -866,25 +865,6 @@ QCollection::Item QGList::prev()
}
-/*!
- \internal
- Converts the list to a vector.
-*/
-
-void QGList::toVector( QGVector *vector ) const
-{
- vector->clear();
- if ( !vector->resize( count() ) )
- return;
- QLNode *n = firstNode;
- uint i = 0;
- while ( n ) {
- vector->insert( i, n->data );
- n = n->next;
- i++;
- }
-}
-
void QGList::heapSortPushDown( QCollection::Item* heap, int first, int last )
{
int r = first;
diff --git a/qtools/qglist.h b/qtools/qglist.h
index f400b64..0f30594 100644
--- a/qtools/qglist.h
+++ b/qtools/qglist.h
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Definition of QGList and QGListIterator classes
**
@@ -68,7 +68,6 @@ private:
class Q_EXPORT QGList : public QCollection // doubly linked generic list
{
friend class QGListIterator;
-friend class QGVector; // needed by QGVector::toList
public:
uint count() const; // return number of nodes
@@ -122,8 +121,6 @@ protected:
QCollection::Item next(); // set next item in list curr
QCollection::Item prev(); // set prev item in list curr
- void toVector( QGVector * ) const; // put items in vector
-
virtual int compareItems( QCollection::Item, QCollection::Item );
#ifndef QT_NO_DATASTREAM
diff --git a/qtools/qglobal.h b/qtools/qglobal.h
index d37bdf2..0deef5d 100644
--- a/qtools/qglobal.h
+++ b/qtools/qglobal.h
@@ -507,7 +507,6 @@ Q_EXPORT bool qSysInfo( int *wordSize, bool *bigEndian );
#pragma warning(disable: 4244)
#pragma warning(disable: 4275)
#pragma warning(disable: 4514)
-#pragma warning(disable: 4800)
#pragma warning(disable: 4097)
#pragma warning(disable: 4706)
#elif defined(_CC_BOR_)
diff --git a/qtools/qgstring.h b/qtools/qgstring.h
index 6934c93..0af1045 100644
--- a/qtools/qgstring.h
+++ b/qtools/qgstring.h
@@ -43,7 +43,7 @@ class QGString
bool truncate( uint pos ) { return resize(pos+1); }
operator const char *() const { return (const char *)data(); }
char &at( uint index ) const { return m_data[index]; }
- char &operator[]( int i ) const { return at(i); }
+ char &operator[]( uint i ) const { return at(i); }
private:
char * m_data;
diff --git a/qtools/qgvector.cpp b/qtools/qgvector.cpp
deleted file mode 100644
index 2d08ede..0000000
--- a/qtools/qgvector.cpp
+++ /dev/null
@@ -1,638 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QGVector class
-**
-** Created : 930907
-**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
-**
-** This file is part of the tools module of the Qt GUI Toolkit.
-**
-** This file may be distributed under the terms of the Q Public License
-** as defined by Trolltech AS of Norway and appearing in the file
-** LICENSE.QPL included in the packaging of this file.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
-** licenses may use this file in accordance with the Qt Commercial License
-** Agreement provided with the Software.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
-** information about Qt Commercial License Agreements.
-** See http://www.trolltech.com/qpl/ for QPL licensing information.
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
-
-#define QGVECTOR_CPP
-#include "qgvector.h"
-#include "qglist.h"
-#include "qstring.h"
-#include "qdatastream.h"
-#include <stdlib.h>
-
-#define USE_MALLOC // comment to use new/delete
-
-#undef NEW
-#undef DELETE
-
-#if defined(USE_MALLOC)
-#define NEW(type,size) ((type*)malloc(size*sizeof(type)))
-#define DELETE(array) (free((char*)array))
-#else
-#define NEW(type,size) (new type[size])
-#define DELETE(array) (delete[] array)
-#define DONT_USE_REALLOC // comment to use realloc()
-#endif
-
-// NOT REVISED
-
-/*!
- \class QGVector qgvector.h
-
- \brief The QGVector class is an internal class for implementing Qt
- collection classes.
-
- QGVector is a strictly internal class that acts as a base class for
- the QVector collection class.
-
- QGVector has some virtual functions that may be reimplemented in
- subclasses to customize behavior.
-
- <ul>
- <li> compareItems() compares two collection/vector items.
- <li> read() reads a collection/vector item from a QDataStream.
- <li> write() writes a collection/vector item to a QDataStream.
- </ul>
-*/
-
-/*****************************************************************************
- Default implementation of virtual functions
- *****************************************************************************/
-
-/*!
- This virtual function compares two list items.
-
- Returns:
- <ul>
- <li> 0 if \a item1 == \a item2
- <li> non-zero if \a item1 != \a item2
- </ul>
-
- This function returns \e int rather than \e bool so that
- reimplementations can return one of three values and use it to sort
- by:
-
- <ul>
- <li> 0 if \e item1 == \e item2
- <li> \> 0 (positive integer) if \a item1 \> \a item2
- <li> \< 0 (negative integer) if \a item1 \< \a item2
- </ul>
-
- The QVector::sort() and QVector::bsearch() functions require that
- compareItems() is implemented as described here.
-
- This function should not modify the vector because some const
- functions call compareItems().
-*/
-
-int QGVector::compareItems( Item d1, Item d2 )
-{
- return d1 != d2; // compare pointers
-}
-
-#ifndef QT_NO_DATASTREAM
-/*!
- Reads a collection/vector item from the stream \a s and returns a reference
- to the stream.
-
- The default implementation sets \e item to 0.
-
- \sa write()
-*/
-
-QDataStream &QGVector::read( QDataStream &s, Item &d )
-{ // read item from stream
- d = 0;
- return s;
-}
-
-/*!
- Writes a collection/vector item to the stream \a s and returns a reference
- to the stream.
-
- The default implementation does nothing.
-
- \sa read()
-*/
-
-QDataStream &QGVector::write( QDataStream &s, Item ) const
-{ // write item to stream
- return s;
-}
-#endif // QT_NO_DATASTREAM
-
-/*****************************************************************************
- QGVector member functions
- *****************************************************************************/
-
-/*!
- \internal
-*/
-
-QGVector::QGVector() // create empty vector
-{
- vec = 0;
- len = numItems = 0;
-}
-
-/*!
- \internal
-*/
-QGVector::QGVector( uint size ) // create vectors with nullptrs
-{
- len = size;
- numItems = 0;
- if ( len == 0 ) { // zero length
- vec = 0;
- return;
- }
- vec = NEW(Item,len);
- CHECK_PTR( vec );
- memset( (void*)vec, 0, len*sizeof(Item) ); // fill with nulls
-}
-
-/*!
- \internal
-*/
-
-QGVector::QGVector( const QGVector &a ) // make copy of other vector
- : QCollection( a )
-{
- len = a.len;
- numItems = a.numItems;
- vec = NEW(Item,len);
- CHECK_PTR( vec );
- for ( uint i=0; i<len; i++ ) {
- vec[i] = a.vec[i] ? newItem( a.vec[i] ) : 0;
- CHECK_PTR( vec[i] );
- }
-}
-
-/*!
- \internal
-*/
-
-QGVector::~QGVector()
-{
- clear();
-}
-
-
-/*!
- \internal
-*/
-
-QGVector& QGVector::operator=( const QGVector &v )
-{ // assign from other vector
- clear(); // first delete old vector
- len = v.len;
- numItems = v.numItems;
- vec = NEW(Item,len); // create new vector
- CHECK_PTR( vec );
- for ( uint i=0; i<len; i++ ) { // copy elements
- vec[i] = v.vec[i] ? newItem( v.vec[i] ) : 0;
- CHECK_PTR( vec[i] );
- }
- return *this;
-}
-
-
-/*!
- \fn Item *QGVector::data() const
- \internal
-*/
-
-/*!
- \fn uint QGVector::size() const
- \internal
-*/
-
-/*!
- \fn uint QGVector::count() const
- \internal
-*/
-
-/*!
- \fn Item QGVector::at( uint index ) const
- \internal
-*/
-
-/*!
- \internal
-*/
-
-bool QGVector::insert( uint index, Item d ) // insert item at index
-{
-#if defined(CHECK_RANGE)
- if ( index >= len ) { // range error
- qWarning( "QGVector::insert: Index %d out of range", index );
- return FALSE;
- }
-#endif
- if ( vec[index] ) { // remove old item
- deleteItem( vec[index] );
- numItems--;
- }
- if ( d ) {
- vec[index] = newItem( d );
- CHECK_PTR( vec[index] );
- numItems++;
- return vec[index] != 0;
- } else {
- vec[index] = 0; // reset item
- }
- return TRUE;
-}
-
-/*!
- \internal
-*/
-
-bool QGVector::remove( uint index ) // remove item at index
-{
-#if defined(CHECK_RANGE)
- if ( index >= len ) { // range error
- qWarning( "QGVector::remove: Index %d out of range", index );
- return FALSE;
- }
-#endif
- if ( vec[index] ) { // valid item
- deleteItem( vec[index] ); // delete it
- vec[index] = 0; // reset pointer
- numItems--;
- }
- return TRUE;
-}
-
-/*!
- \internal
-*/
-
-QCollection::Item QGVector::take( uint index ) // take out item
-{
-#if defined(CHECK_RANGE)
- if ( index >= len ) { // range error
- qWarning( "QGVector::take: Index %d out of range", index );
- return 0;
- }
-#endif
- Item d = vec[index]; // don't delete item
- if ( d )
- numItems--;
- vec[index] = 0;
- return d;
-}
-
-
-/*!
- \internal
-*/
-
-void QGVector::clear() // clear vector
-{
- if ( vec ) {
- for ( uint i=0; i<len; i++ ) { // delete each item
- if ( vec[i] )
- deleteItem( vec[i] );
- }
- DELETE(vec);
- vec = 0;
- len = numItems = 0;
- }
-}
-
-/*!
- \internal
-*/
-
-bool QGVector::resize( uint newsize ) // resize array
-{
- if ( newsize == len ) // nothing to do
- return TRUE;
- if ( vec ) { // existing data
- if ( newsize < len ) { // shrink vector
- uint i = newsize;
- while ( i < len ) { // delete lost items
- if ( vec[i] ) {
- deleteItem( vec[i] );
- numItems--;
- }
- i++;
- }
- }
- if ( newsize == 0 ) { // vector becomes empty
- DELETE(vec);
- vec = 0;
- len = numItems = 0;
- return TRUE;
- }
-#if defined(DONT_USE_REALLOC)
- Item *newvec = NEW(Item,newsize); // manual realloc
- memcpy( newvec, vec, (len < newsize ? len : newsize)*sizeof(Item) );
- DELETE(vec);
- vec = newvec;
-#else
- vec = (Item*)realloc( (char *)vec, newsize*sizeof(Item) );
-#endif
- } else { // create new vector
- vec = NEW(Item,newsize);
- len = numItems = 0;
- }
- CHECK_PTR( vec );
- if ( !vec ) // no memory
- return FALSE;
- if ( newsize > len ) // init extra space added
- memset( (void*)&vec[len], 0, (newsize-len)*sizeof(Item) );
- len = newsize;
- return TRUE;
-}
-
-
-/*!
- \internal
-*/
-
-bool QGVector::fill( Item d, int flen ) // resize and fill vector
-{
- if ( flen < 0 )
- flen = len; // default: use vector length
- else if ( !resize( flen ) )
- return FALSE;
- for ( uint i=0; i<(uint)flen; i++ ) // insert d at every index
- insert( i, d );
- return TRUE;
-}
-
-
-static QGVector *sort_vec=0; // current sort vector
-
-
-#if defined(Q_C_CALLBACKS)
-extern "C" {
-#endif
-
-static int cmp_vec( const void *n1, const void *n2 )
-{
- return sort_vec->compareItems( *((QCollection::Item*)n1), *((QCollection::Item*)n2) );
-}
-
-#if defined(Q_C_CALLBACKS)
-}
-#endif
-
-
-/*!
- \internal
-*/
-
-void QGVector::sort() // sort vector
-{
- if ( count() == 0 ) // no elements
- return;
- Item *start = &vec[0];
- Item *end = &vec[len-1];
- Item tmp;
- while ( TRUE ) { // put all zero elements behind
- while ( start < end && *start != 0 )
- start++;
- while ( end > start && *end == 0 )
- end--;
- if ( start < end ) {
- tmp = *start;
- *start = *end;
- *end = tmp;
- } else {
- break;
- }
- }
- sort_vec = (QGVector*)this;
- qsort( vec, count(), sizeof(Item), cmp_vec );
- sort_vec = 0;
-}
-
-/*!
- \internal
-*/
-
-int QGVector::bsearch( Item d ) const // binary search; when sorted
-{
- if ( !len )
- return -1;
- if ( !d ) {
-#if defined(CHECK_NULL)
- qWarning( "QGVector::bsearch: Cannot search for null object" );
-#endif
- return -1;
- }
- int n1 = 0;
- int n2 = len - 1;
- int mid = 0;
- bool found = FALSE;
- while ( n1 <= n2 ) {
- int res;
- mid = (n1 + n2)/2;
- if ( vec[mid] == 0 ) // null item greater
- res = -1;
- else
- res = ((QGVector*)this)->compareItems( d, vec[mid] );
- if ( res < 0 )
- n2 = mid - 1;
- else if ( res > 0 )
- n1 = mid + 1;
- else { // found it
- found = TRUE;
- break;
- }
- }
- if ( !found )
- return -1;
- // search to first of equal items
- while ( (mid - 1 >= 0) && !((QGVector*)this)->compareItems(d, vec[mid-1]) )
- mid--;
- return mid;
-}
-
-
-/*!
- \internal
-*/
-
-int QGVector::findRef( Item d, uint index) const // find exact item in vector
-{
-#if defined(CHECK_RANGE)
- if ( index >= len ) { // range error
- qWarning( "QGVector::findRef: Index %d out of range", index );
- return -1;
- }
-#endif
- for ( uint i=index; i<len; i++ ) {
- if ( vec[i] == d )
- return i;
- }
- return -1;
-}
-
-/*!
- \internal
-*/
-
-int QGVector::find( Item d, uint index ) const // find equal item in vector
-{
-#if defined(CHECK_RANGE)
- if ( index >= len ) { // range error
- qWarning( "QGVector::find: Index %d out of range", index );
- return -1;
- }
-#endif
- for ( uint i=index; i<len; i++ ) {
- if ( vec[i] == 0 && d == 0 ) // found null item
- return i;
- if ( vec[i] && ((QGVector*)this)->compareItems( vec[i], d ) == 0 )
- return i;
- }
- return -1;
-}
-
-/*!
- \internal
-*/
-
-uint QGVector::containsRef( Item d ) const // get number of exact matches
-{
- uint count = 0;
- for ( uint i=0; i<len; i++ ) {
- if ( vec[i] == d )
- count++;
- }
- return count;
-}
-
-/*!
- \internal
-*/
-
-uint QGVector::contains( Item d ) const // get number of equal matches
-{
- uint count = 0;
- for ( uint i=0; i<len; i++ ) {
- if ( vec[i] == 0 && d == 0 ) // count null items
- count++;
- if ( vec[i] && ((QGVector*)this)->compareItems( vec[i], d ) == 0 )
- count++;
- }
- return count;
-}
-
-
-/*!
- \internal
-*/
-
-bool QGVector::insertExpand( uint index, Item d )// insert and grow if necessary
-{
- if ( index >= len ) {
- if ( !resize( index+1 ) ) // no memory
- return FALSE;
- }
- insert( index, d );
- return TRUE;
-}
-
-
-/*!
- \internal
-*/
-
-void QGVector::toList( QGList *list ) const // store items in list
-{
- list->clear();
- for ( uint i=0; i<len; i++ ) {
- if ( vec[i] )
- list->append( vec[i] );
- }
-}
-
-
-void QGVector::warningIndexRange( uint i )
-{
-#if defined(CHECK_RANGE)
- qWarning( "QGVector::operator[]: Index %d out of range", i );
-#else
- Q_UNUSED( i )
-#endif
-}
-
-
-/*****************************************************************************
- QGVector stream functions
- *****************************************************************************/
-#ifndef QT_NO_DATASTREAM
-QDataStream &operator>>( QDataStream &s, QGVector &vec )
-{ // read vector
- return vec.read( s );
-}
-
-QDataStream &operator<<( QDataStream &s, const QGVector &vec )
-{ // write vector
- return vec.write( s );
-}
-
-/*!
- \internal
-*/
-
-QDataStream &QGVector::read( QDataStream &s ) // read vector from stream
-{
- uint num;
- s >> num; // read number of items
- clear(); // clear vector
- resize( num );
- for (uint i=0; i<num; i++) { // read all items
- Item d;
- read( s, d );
- CHECK_PTR( d );
- if ( !d ) // no memory
- break;
- vec[i] = d;
- }
- return s;
-}
-
-/*!
- \internal
-*/
-
-QDataStream &QGVector::write( QDataStream &s ) const
-{ // write vector to stream
- uint num = count();
- s << num; // number of items to write
- num = size();
- for (uint i=0; i<num; i++) { // write non-null items
- if ( vec[i] )
- write( s, vec[i] );
- }
- return s;
-}
-#endif // QT_NO_DATASTREAM
diff --git a/qtools/qgvector.h b/qtools/qgvector.h
deleted file mode 100644
index 6a7999d..0000000
--- a/qtools/qgvector.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QGVector class
-**
-** Created : 930907
-**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
-**
-** This file is part of the tools module of the Qt GUI Toolkit.
-**
-** This file may be distributed under the terms of the Q Public License
-** as defined by Trolltech AS of Norway and appearing in the file
-** LICENSE.QPL included in the packaging of this file.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
-** licenses may use this file in accordance with the Qt Commercial License
-** Agreement provided with the Software.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
-** information about Qt Commercial License Agreements.
-** See http://www.trolltech.com/qpl/ for QPL licensing information.
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
-
-#ifndef QGVECTOR_H
-#define QGVECTOR_H
-
-#ifndef QT_H
-#include "qcollection.h"
-#endif // QT_H
-
-
-class Q_EXPORT QGVector : public QCollection // generic vector
-{
-friend class QGList; // needed by QGList::toVector
-public:
-#ifndef QT_NO_DATASTREAM
- QDataStream &read( QDataStream & ); // read vector from stream
- QDataStream &write( QDataStream & ) const; // write vector to stream
-#endif
- virtual int compareItems( Item, Item );
-
-protected:
- QGVector(); // create empty vector
- QGVector( uint size ); // create vector with nullptrs
- QGVector( const QGVector &v ); // make copy of other vector
- ~QGVector();
-
- QGVector &operator=( const QGVector &v ); // assign from other vector
-
- Item *data() const { return vec; }
- uint size() const { return len; }
- uint count() const { return numItems; }
-
- bool insert( uint index, Item ); // insert item at index
- bool remove( uint index ); // remove item
- Item take( uint index ); // take out item
-
- void clear(); // clear vector
- bool resize( uint newsize ); // resize vector
-
- bool fill( Item, int flen ); // resize and fill vector
-
- void sort(); // sort vector
- int bsearch( Item ) const; // binary search (when sorted)
-
- int findRef( Item, uint index ) const; // find exact item in vector
- int find( Item, uint index ) const; // find equal item in vector
- uint containsRef( Item ) const; // get number of exact matches
- uint contains( Item ) const; // get number of equal matches
-
- Item at( uint index ) const // return indexed item
- {
-#if defined(CHECK_RANGE)
- if ( index >= len )
- warningIndexRange( index );
-#endif
- return vec[index];
- }
-
- bool insertExpand( uint index, Item ); // insert, expand if necessary
-
- void toList( QGList * ) const; // put items in list
-
-#ifndef QT_NO_DATASTREAM
- virtual QDataStream &read( QDataStream &, Item & );
- virtual QDataStream &write( QDataStream &, Item ) const;
-#endif
-private:
- Item *vec;
- uint len;
- uint numItems;
-
- static void warningIndexRange( uint );
-};
-
-
-/*****************************************************************************
- QGVector stream functions
- *****************************************************************************/
-
-#ifndef QT_NO_DATASTREAM
-Q_EXPORT QDataStream &operator>>( QDataStream &, QGVector & );
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QGVector & );
-#endif
-
-#endif // QGVECTOR_H
diff --git a/qtools/qintdict.h b/qtools/qintdict.h
index ddc5fdf..0606ec8 100644
--- a/qtools/qintdict.h
+++ b/qtools/qintdict.h
@@ -46,7 +46,7 @@
template<class type> class Q_EXPORT QIntDict : public QGDict
{
public:
- QIntDict(int size=17) : QGDict(size,IntKey,0,0) {}
+ QIntDict(uint size=17) : QGDict(size,IntKey,0,0) {}
QIntDict( const QIntDict<type> &d ) : QGDict(d) {}
~QIntDict() { clear(); }
QIntDict<type> &operator=(const QIntDict<type> &d)
diff --git a/qtools/qinternallist.h b/qtools/qinternallist.h
index 09dbfce..b1cc64e 100644
--- a/qtools/qinternallist.h
+++ b/qtools/qinternallist.h
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Definition of QList template/macro class
**
@@ -88,7 +88,6 @@ public:
type *last() { return (type *)QGList::last(); }
type *next() { return (type *)QGList::next(); }
type *prev() { return (type *)QGList::prev(); }
- void toVector( QGVector *vec )const{ QGList::toVector(vec); }
private:
void deleteItem( QCollection::Item d );
};
diff --git a/qtools/qlist.doc b/qtools/qlist.doc
index 4f97e35..d28d662 100644
--- a/qtools/qlist.doc
+++ b/qtools/qlist.doc
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** QList and QListIterator class documentation
**
@@ -681,15 +681,6 @@
\sa first(), last(), next(), current()
*/
-/*!
- \fn void QList::toVector( QGVector *vec ) const
- Stores all list items in the vector \e vec.
-
- The vector must be have the same item type, otherwise the result
- will be undefined.
-*/
-
-
/*****************************************************************************
QListIterator documentation
*****************************************************************************/
diff --git a/qtools/qmap.h b/qtools/qmap.h
index f384a3d..0031e0d 100644
--- a/qtools/qmap.h
+++ b/qtools/qmap.h
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Definition of QMap class
**
@@ -102,6 +102,7 @@ class Q_EXPORT QMapIterator
QMapIterator() : node( 0 ) {}
QMapIterator( QMapNode<K,T>* p ) : node( p ) {}
QMapIterator( const QMapIterator<K,T>& it ) : node( it.node ) {}
+ QMapIterator &operator=(const QMapIterator &it) = default;
bool operator==( const QMapIterator<K,T>& it ) const { return node == it.node; }
bool operator!=( const QMapIterator<K,T>& it ) const { return node != it.node; }
diff --git a/qtools/qmutex.cpp b/qtools/qmutex.cpp
deleted file mode 100644
index 08a13bc..0000000
--- a/qtools/qmutex.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <stdio.h>
-
-#include "qglobal.h"
-
-#include "qmutex.h"
-#include "qmutex_p.h"
-
-QMutex::QMutex() : d(new QMutexPrivate())
-{
-}
-
-QMutex::~QMutex()
-{
- delete d;
-}
-
-void QMutex::lock()
-{
- //printf("%p: QMutex::lock(): enter\n",this);
- bool isLocked;
- isLocked = d->contenders.testAndSet(0, 1);
- if (!isLocked)
- {
- isLocked = d->contenders.fetchAndAdd(1)==0;
- if (!isLocked)
- {
- // didn't get the lock, wait for it
- //printf("%p: QMutex::lock(): wait() %d\n",this,(int)d->contenders);
- d->wait();
-
- // release lock
- d->contenders.fetchAndAdd(-1);
- }
- }
- //printf("%p: QMutex::lock(): leave\n",this);
-}
-
-bool QMutex::tryLock()
-{
- bool isLocked = d->contenders.testAndSet(0, 1);
- return isLocked;
-}
-
-void QMutex::unlock()
-{
- //printf("%p: QMutex::unlock(): enter %d\n",this,(int)d->contenders);
- if (!d->contenders.testAndSet(1, 0))
- {
- //printf("%p: QMutex::unlock(): wakeUp()\n",this);
- d->wakeUp();
- }
- //printf("%p: QMutex::unlock(): leave\n",this);
-}
-
diff --git a/qtools/qmutex.h b/qtools/qmutex.h
deleted file mode 100644
index d3d2ac0..0000000
--- a/qtools/qmutex.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QMUTEX_H
-#define QMUTEX_H
-
-#include "qglobal.h"
-
-class QMutexPrivate;
-
-class QMutex
-{
-public:
- QMutex();
- ~QMutex();
-
- void lock();
- bool tryLock();
- void unlock();
-
-private:
- QMutex(const QMutex &);
- QMutex &operator=(const QMutex &);
-
- QMutexPrivate *d;
-};
-
-class QMutexLocker
-{
- public:
- QMutexLocker(QMutex *m) : m_mutex(m)
- {
- m_mutex->lock();
- }
- ~QMutexLocker()
- {
- m_mutex->unlock();
- }
- QMutex *mutex() const { return m_mutex; }
-
- private:
- QMutex *m_mutex;
-};
-
-#endif // QMUTEX_H
diff --git a/qtools/qmutex_p.h b/qtools/qmutex_p.h
deleted file mode 100644
index a47b407..0000000
--- a/qtools/qmutex_p.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QMUTEX_P_H
-#define QMUTEX_P_H
-
-#include "qglobal.h"
-
-#if defined(_OS_UNIX_) || defined(_OS_MAC_)
-#include <pthread.h>
-#elif defined(_OS_WIN32_)
-#include <windows.h>
-#endif
-
-class QAtomicInt
-{
- public:
- QAtomicInt(int v=0) : m_value(v) {}
- bool testAndSet(int expectedValue,int newValue);
- int fetchAndAdd(int valueToAdd);
- operator int () const { return m_value; }
- bool operator==(int value) const { return m_value == value; }
- bool operator!=(int value) const { return m_value != value; }
- bool operator!() const { return m_value == 0; }
-
- private:
- volatile int m_value;
-};
-
-class QMutexPrivate
-{
-public:
- QMutexPrivate();
- ~QMutexPrivate();
-
- void wait();
- void wakeUp();
-
- QAtomicInt contenders;
-
-#if defined(_OS_UNIX_) || defined(_OS_MAC_)
- volatile bool wakeup;
- pthread_mutex_t mutex;
- pthread_cond_t cond;
-#elif defined(_OS_WIN32_)
- HANDLE event;
-#else
-#error "unsupported platform"
-#endif
-};
-
-#endif // QMUTEX_P_H
diff --git a/qtools/qmutex_unix.cpp b/qtools/qmutex_unix.cpp
deleted file mode 100644
index 4fe9a58..0000000
--- a/qtools/qmutex_unix.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <errno.h>
-#include <pthread.h>
-
-#include "qglobal.h"
-#include "qmutex.h"
-#include "qmutex_p.h"
-
-static pthread_mutex_t qAtomicMutex = PTHREAD_MUTEX_INITIALIZER;
-
-static void report_error(int code, const char *where, const char *what)
-{
- if (code != 0)
- qWarning("%s: %s failure: %d", where, what, code);
-}
-
-
-QMutexPrivate::QMutexPrivate()
- : contenders(0), wakeup(FALSE)
-{
- report_error(pthread_mutex_init(&mutex, NULL), "QMutex", "mutex init");
- report_error(pthread_cond_init(&cond, NULL), "QMutex", "cv init");
-}
-
-QMutexPrivate::~QMutexPrivate()
-{
- report_error(pthread_cond_destroy(&cond), "QMutex", "cv destroy");
- report_error(pthread_mutex_destroy(&mutex), "QMutex", "mutex destroy");
-}
-
-void QMutexPrivate::wait()
-{
- report_error(pthread_mutex_lock(&mutex), "QMutex::lock", "mutex lock");
- int errorCode = 0;
- while (!wakeup)
- {
- errorCode = pthread_cond_wait(&cond, &mutex);
- if (errorCode)
- {
- report_error(errorCode, "QMutex::lock()", "cv wait");
- }
- }
- wakeup = FALSE;
- report_error(pthread_mutex_unlock(&mutex), "QMutex::lock", "mutex unlock");
-}
-
-void QMutexPrivate::wakeUp()
-{
- report_error(pthread_mutex_lock(&mutex), "QMutex::unlock", "mutex lock");
- wakeup = TRUE;
- report_error(pthread_cond_signal(&cond), "QMutex::unlock", "cv signal");
- report_error(pthread_mutex_unlock(&mutex), "QMutex::unlock", "mutex unlock");
-}
-
-bool QAtomicInt::testAndSet(int expectedValue,int newValue)
-{
- bool returnValue = false;
- pthread_mutex_lock(&qAtomicMutex);
- if (m_value == expectedValue)
- {
- m_value = newValue;
- returnValue = true;
- }
- pthread_mutex_unlock(&qAtomicMutex);
- return returnValue;
-}
-
-int QAtomicInt::fetchAndAdd(int valueToAdd)
-{
- int returnValue;
- pthread_mutex_lock(&qAtomicMutex);
- returnValue = m_value;
- m_value += valueToAdd;
- pthread_mutex_unlock(&qAtomicMutex);
- return returnValue;
-}
-
diff --git a/qtools/qmutex_win32.cpp b/qtools/qmutex_win32.cpp
deleted file mode 100644
index 2d662ea..0000000
--- a/qtools/qmutex_win32.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <windows.h>
-
-#include "qmutex.h"
-#include "qmutex_p.h"
-
-QMutexPrivate::QMutexPrivate()
- : contenders(0)
-{
- event = CreateEvent(0, FALSE, FALSE, 0);
- if (!event)
- qWarning("QMutexPrivate::QMutexPrivate: Cannot create event");
-}
-
-QMutexPrivate::~QMutexPrivate()
-{
- CloseHandle(event);
-}
-
-void QMutexPrivate::wait()
-{
- WaitForSingleObject(event, INFINITE);
-}
-
-void QMutexPrivate::wakeUp()
-{
- SetEvent(event);
-}
-
-//----------------------------------------------------------------------
-
-class QCriticalSection
-{
- public:
- QCriticalSection() { InitializeCriticalSection(&section); }
- ~QCriticalSection() { DeleteCriticalSection(&section); }
- void lock() { EnterCriticalSection(&section); }
- void unlock() { LeaveCriticalSection(&section); }
-
- private:
- CRITICAL_SECTION section;
-};
-
-static QCriticalSection qAtomicCriticalSection;
-
-bool QAtomicInt::testAndSet(int expectedValue,int newValue)
-{
- bool returnValue = false;
- qAtomicCriticalSection.lock();
- if (m_value == expectedValue)
- {
- m_value = newValue;
- returnValue = true;
- }
- qAtomicCriticalSection.unlock();
- return returnValue;
-}
-
-int QAtomicInt::fetchAndAdd(int valueToAdd)
-{
- int returnValue;
- qAtomicCriticalSection.lock();
- returnValue = m_value;
- m_value += valueToAdd;
- qAtomicCriticalSection.unlock();
- return returnValue;
-}
-
diff --git a/qtools/qptrdict.h b/qtools/qptrdict.h
index c075e30..df8bcb4 100644
--- a/qtools/qptrdict.h
+++ b/qtools/qptrdict.h
@@ -46,7 +46,7 @@
template<class type> class Q_EXPORT QPtrDict : public QGDict
{
public:
- QPtrDict(int size=17) : QGDict(size,PtrKey,0,0) {}
+ QPtrDict(uint size=17) : QGDict(size,PtrKey,0,0) {}
QPtrDict( const QPtrDict<type> &d ) : QGDict(d) {}
~QPtrDict() { clear(); }
QPtrDict<type> &operator=(const QPtrDict<type> &d)
diff --git a/qtools/qregexp.cpp b/qtools/qregexp.cpp
index d958f0a..8709858 100644
--- a/qtools/qregexp.cpp
+++ b/qtools/qregexp.cpp
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Implementation of QRegExp class
**
@@ -901,8 +901,6 @@ static uint *dump( uint *p )
#endif // DEBUG
-static const int maxlen = 1024; // max length of regexp array
-static uint rxarray[ maxlen ]; // tmp regexp array
/*!
\internal
@@ -913,6 +911,9 @@ static uint rxarray[ maxlen ]; // tmp regexp array
void QRegExp::compile()
{
+ const int maxlen = 1024; // max length of regexp array
+ uint rxarray[ maxlen ]; // tmp regexp array
+
if ( rxdata ) { // delete old data
delete [] rxdata;
rxdata = 0;
@@ -1006,7 +1007,7 @@ void QRegExp::compile()
numFields++;
}
if ( d >= rxarray + maxlen ) { // pattern too long
- error = PatOverflow;
+ error = PatOverflow;
return;
}
if ( !pl ) { // At least ']' should be left
diff --git a/qtools/qshared.h b/qtools/qshared.h
index 79fab7b..58ad6fc 100644
--- a/qtools/qshared.h
+++ b/qtools/qshared.h
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Definition of QShared struct
**
@@ -42,13 +42,15 @@
#include "qglobal.h"
#endif // QT_H
+#include <atomic>
+
struct QShared
{
- QShared() { count = 1; }
+ QShared() : count(1) { }
void ref() { count++; }
bool deref() { return !--count; }
- uint count;
+ std::atomic_uint count;
};
diff --git a/qtools/qstring.h b/qtools/qstring.h
index d459132..ed56d7f 100644
--- a/qtools/qstring.h
+++ b/qtools/qstring.h
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Definition of the QString class, and related Unicode
** functions.
@@ -64,6 +64,7 @@ public:
QChar( short rc );
QChar( uint rc );
QChar( int rc );
+ QChar &operator=(const QChar &c);
QT_STATIC_CONST QChar null; // 0000
QT_STATIC_CONST QChar replacement; // FFFD
@@ -147,8 +148,8 @@ public:
QString decomposition() const;
Decomposition decompositionTag() const;
- char latin1() const { return rw ? 0 : cl; }
- ushort unicode() const { return (rw << 8) | cl; }
+ char latin1() const { return rw ? 0 : (char)cl; }
+ ushort unicode() const { return (ushort)((rw << 8) | cl); }
#ifndef QT_NO_CAST_ASCII
// like all ifdef'd code this is undocumented
operator char() const { return latin1(); }
@@ -266,6 +267,15 @@ inline QChar::QChar( int rc )
#endif
}
+inline QChar &QChar::operator=(const QChar &c)
+{
+ rw = c.rw;
+ cl = c.cl;
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+ return *this;
+}
inline int operator==( char ch, QChar c )
{
@@ -333,7 +343,7 @@ struct Q_EXPORT QStringData : public QShared {
QStringData() :
unicode(0), ascii(0), len(0), maxl(0), dirtyascii(0) { ref(); }
QStringData(QChar *u, uint l, uint m) :
- unicode(u), ascii(0), len(l), maxl(m), dirtyascii(0) { }
+ unicode(u), ascii(0), len(l), maxl(m&0x3FFFFFFF), dirtyascii(0) { }
~QStringData() { if ( unicode ) delete[] ((char*)unicode);
if ( ascii ) delete[] ascii; }
@@ -409,7 +419,7 @@ public:
inline QString(const Null &): d(shared_null) { d->ref(); }
inline QString &operator=(const Null &) { *this = QString(); return *this; }
inline bool isNull() const { return d == shared_null; }
-
+
bool isEmpty() const;
uint length() const;
void truncate( uint pos );
@@ -603,6 +613,7 @@ class Q_EXPORT QCharRef {
QString& s;
uint p;
QCharRef(QString* str, uint pos) : s(*str), p(pos) { }
+ QCharRef(const QCharRef &ref) : s(ref.s), p(ref.p) { }
public:
// Most QChar operations repeated here...
diff --git a/qtools/qtextcodec.cpp b/qtools/qtextcodec.cpp
index 8ce266d..13c3d51 100644
--- a/qtools/qtextcodec.cpp
+++ b/qtools/qtextcodec.cpp
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Implementation of QTextCodec class
**
diff --git a/qtools/qthread.cpp b/qtools/qthread.cpp
deleted file mode 100644
index 02c99f2..0000000
--- a/qtools/qthread.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qthread.h"
-#include "qthread_p.h"
-
-QThread::QThread()
- : d(new QThreadPrivate)
-{
-}
-
-QThread::~QThread()
-{
- QMutexLocker locker(&d->mutex);
- if (d->running && !d->finished)
- qWarning("QThread: Destroyed while thread is still running");
- delete d;
-}
-
-bool QThread::isFinished() const
-{
- QMutexLocker locker(&d->mutex);
- return d->finished;
-}
-
-bool QThread::isRunning() const
-{
- QMutexLocker locker(&d->mutex);
- return d->running;
-}
-
-void QThread::setStackSize(unsigned int stackSize)
-{
- QMutexLocker locker(&d->mutex);
- if (d->running)
- {
- qWarning("QThread: Cannot change stack size while thread is running!");
- return;
- }
- d->stackSize = stackSize;
-}
-
-unsigned int QThread::stackSize() const
-{
- QMutexLocker locker(&d->mutex);
- return d->stackSize;
-}
-
diff --git a/qtools/qthread.h b/qtools/qthread.h
deleted file mode 100644
index 81868bd..0000000
--- a/qtools/qthread.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QTHREAD_H
-#define QTHREAD_H
-
-class QThreadPrivate;
-
-class QThread
-{
- public:
- explicit QThread();
- virtual ~QThread();
-
- bool isFinished() const;
- bool isRunning() const;
-
- void start();
- void terminate();
- void wait();
- void setStackSize(unsigned int stackSize);
- unsigned int stackSize() const;
- static int idealThreadCount();
-
-protected:
- // events
- virtual void started() {}
- virtual void finished() {}
- virtual void terminated() {}
-
- // main loop
- virtual void run() {}
-
-private:
- QThreadPrivate *d;
- friend class QThreadPrivate;
-};
-
-#endif // QTHREAD_H
diff --git a/qtools/qthread_p.h b/qtools/qthread_p.h
deleted file mode 100644
index 87692aa..0000000
--- a/qtools/qthread_p.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QTHREAD_P_H
-#define QTHREAD_P_H
-
-#include "qglobal.h"
-
-#if defined(_OS_UNIX_) || defined(_OS_MAC_)
-#include <pthread.h>
-#elif defined(_OS_WIN32_)
-#include <windows.h>
-#endif
-
-#include "qthread.h"
-#include "qmutex.h"
-#include "qwaitcondition.h"
-
-class QThreadPrivate
-{
-public:
- QThreadPrivate();
- ~QThreadPrivate();
-
- mutable QMutex mutex;
-
- bool running;
- bool finished;
- bool terminated;
- uint stackSize;
-
-#if defined(_OS_UNIX_) || defined(_OS_MAC_)
- pthread_t thread_id;
- QWaitCondition thread_done;
- static void *start(void *arg);
- static void finish(void *arg);
-#elif defined(_OS_WIN32_)
- HANDLE handle;
- static unsigned int __stdcall start(void *);
- static void finish(void *,bool lockAnyway=TRUE);
- int waiters;
-#else
-#error "unsupported platform!"
-#endif
-};
-
-#endif // QTHREAD_P_H
diff --git a/qtools/qthread_unix.cpp b/qtools/qthread_unix.cpp
deleted file mode 100644
index 5871605..0000000
--- a/qtools/qthread_unix.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglobal.h"
-
-#if defined(_OS_HPUX_)
-#include <sys/pstat.h>
-#elif defined(_OS_MAC_)
-#undef DEBUG
-#include <CoreServices/CoreServices.h>
-#elif defined(_OS_BSDI_)
-#include <mach/mach_types.h>
-#include <sys/systm.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#endif
-#include <signal.h>
-#include <unistd.h>
-#include <stdio.h>
-
-#include "qthread.h"
-#include "qthread_p.h"
-
-
-/**************************************************************************
- ** QThreadPrivate
- *************************************************************************/
-
-QThreadPrivate::QThreadPrivate() :
- running(FALSE), finished(FALSE), terminated(FALSE), stackSize(0)
-{
- thread_id = 0;
-}
-
-QThreadPrivate::~QThreadPrivate()
-{
-}
-
-void *QThreadPrivate::start(void *arg)
-{
-#ifndef __ANDROID__
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
-#endif
- pthread_cleanup_push(QThreadPrivate::finish, arg);
-
- QThread *thr = reinterpret_cast<QThread *>(arg);
-
- thr->started();
-#ifndef __ANDROID__
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
- pthread_testcancel();
-#endif
- thr->run();
-
- pthread_cleanup_pop(1);
- return 0;
-}
-
-void QThreadPrivate::finish(void *arg)
-{
- QThread *thr = reinterpret_cast<QThread *>(arg);
- QThreadPrivate *d = thr->d;
- QMutexLocker locker(&d->mutex);
-
- d->running = FALSE;
- d->finished = TRUE;
- if (d->terminated)
- thr->terminated();
- d->terminated = FALSE;
- thr->finished();
-
- d->thread_id = 0;
- d->thread_done.wakeAll();
-}
-
-
-
-
-/**************************************************************************
- ** QThread
- *************************************************************************/
-
-void QThread::start()
-{
- QMutexLocker locker(&d->mutex);
- if (d->running) return;
-
- // Block the SIGINT signal. The threads will inherit the signal mask.
- // This will avoid them catching SIGINT instead of this thread.
- sigset_t sigset, oldset;
- sigemptyset(&sigset);
- sigaddset(&sigset, SIGINT);
- pthread_sigmask(SIG_BLOCK, &sigset, &oldset);
-
- d->running = TRUE;
- d->finished = FALSE;
-
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
-#ifndef __ANDROID__
- pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
-#endif
- if (d->stackSize>0)
- {
-#if defined(_POSIX_THREAD_ATTR_STACKSIZE) && (_POSIX_THREAD_ATTR_STACKSIZE-0>0)
- pthread_attr_setstacksize(&attr,d->stackSize);
-#endif
- }
- int code = pthread_create(&d->thread_id, &attr, QThreadPrivate::start, this);
- pthread_attr_destroy(&attr);
-
- if (code)
- {
- qWarning("QThread::start: Thread creation error: %d", code);
-
- d->running = FALSE;
- d->finished = FALSE;
- d->thread_id = 0;
- }
- else
- {
- // Restore the old signal mask only for this thread.
- pthread_sigmask(SIG_SETMASK, &oldset, NULL);
- }
-}
-
-void QThread::terminate()
-{
- QMutexLocker locker(&d->mutex);
-#ifndef __ANDROID__
- if (!d->thread_id) return;
-
- int code = pthread_cancel(d->thread_id);
- if (code)
- {
- qWarning("QThread::start: Thread termination error: %d", code);
- }
- else
- {
- d->terminated = TRUE;
- }
-#endif
-}
-
-void QThread::wait()
-{
- QMutexLocker locker(&d->mutex);
- if (d->finished || !d->running) return;
-
- while (d->running)
- {
- d->thread_done.wait(locker.mutex());
- }
-}
-
-#if defined(QT_LINUXBASE) && !defined(_SC_NPROCESSORS_ONLN)
-// LSB doesn't define _SC_NPROCESSORS_ONLN.
-# define _SC_NPROCESSORS_ONLN 84
-#endif
-
-int QThread::idealThreadCount()
-{
- int cores = -1;
-#if defined(_OS_MAC_)
- // Mac OS X
- cores = (int)MPProcessorsScheduled();
-#elif defined(_OS_HPUX_)
- // HP-UX
- struct pst_dynamic psd;
- if (pstat_getdynamic(&psd, sizeof(psd), 1, 0) == -1)
- {
- perror("pstat_getdynamic");
- cores = -1;
- }
- else
- {
- cores = (int)psd.psd_proc_cnt;
- }
-#elif defined(_OS_BSDI_)
- // FreeBSD, OpenBSD, NetBSD, BSD/OS
- size_t len = sizeof(cores);
- int mib[2];
- mib[0] = CTL_HW;
- mib[1] = HW_NCPU;
-
- if (sysctl(mib, 2, &cores, &len, NULL, 0) != 0)
- {
- perror("sysctl");
- cores = -1;
- }
-#elif defined(_OS_IRIX_)
- // IRIX
- cores = (int)sysconf(_SC_NPROC_ONLN);
-#else
- // the rest: Linux, Solaris, AIX, Tru64
- cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
-#endif
- return cores;
-}
-
diff --git a/qtools/qthread_win32.cpp b/qtools/qthread_win32.cpp
deleted file mode 100644
index 2c62e93..0000000
--- a/qtools/qthread_win32.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qthread.h"
-#include "qthread_p.h"
-
-/**************************************************************************
- ** QThreadPrivate
- *************************************************************************/
-
-QThreadPrivate::QThreadPrivate() :
- running(FALSE), finished(FALSE), terminated(FALSE), stackSize(0)
-{
- handle = NULL;
- waiters = 0;
-}
-
-QThreadPrivate::~QThreadPrivate()
-{
-}
-
-unsigned int __stdcall QThreadPrivate::start(void *arg)
-{
- QThread *thr = reinterpret_cast<QThread *>(arg);
- thr->started();
- thr->run();
- finish(arg);
- return 0;
-}
-
-void QThreadPrivate::finish(void *arg,bool lockAnyway)
-{
- QThread *thr = reinterpret_cast<QThread *>(arg);
- QThreadPrivate *d = thr->d;
-
- if (lockAnyway) d->mutex.lock();
-
- d->running = FALSE;
- d->finished = TRUE;
- if (d->terminated) thr->terminated();
- d->terminated = FALSE;
- thr->finished();
-
- if (!d->waiters)
- {
- CloseHandle(d->handle);
- d->handle = 0;
- }
-
- if (lockAnyway) d->mutex.unlock();
-}
-
-/**************************************************************************
- ** QThread
- *************************************************************************/
-
-void QThread::start()
-{
- QMutexLocker locker(&d->mutex);
-
- if (d->running) return;
-
- d->running = TRUE;
- d->finished = FALSE;
- d->terminated = FALSE;
-
- d->handle = CreateThread(NULL,d->stackSize,
- (LPTHREAD_START_ROUTINE)QThreadPrivate::start,this,0,NULL);
-
- if (!d->handle)
- {
- qWarning("QThread::start: Failed to create thread: errno=%d",errno);
- d->running = FALSE;
- d->finished = TRUE;
- return;
- }
-}
-
-void QThread::terminate()
-{
- QMutexLocker locker(&d->mutex);
- if (!d->running) return;
- TerminateThread(d->handle, 0);
- d->terminated = TRUE;
- QThreadPrivate::finish(this);
-}
-
-void QThread::wait()
-{
- QMutexLocker locker(&d->mutex);
- if (d->finished || !d->running) return;
-
- ++d->waiters;
- locker.mutex()->unlock();
-
- WaitForSingleObject(d->handle,INFINITE);
-
- locker.mutex()->lock();
- --d->waiters;
- if (!d->finished) // thread was terminated by someone else
- {
- d->terminated = TRUE;
- QThreadPrivate::finish(this);
- }
-
- if (d->finished && d->waiters)
- {
- CloseHandle(d->handle);
- d->handle = 0;
- }
-}
-
-int QThread::idealThreadCount()
-{
- SYSTEM_INFO sysinfo;
- GetSystemInfo(&sysinfo);
- return sysinfo.dwNumberOfProcessors;
-}
-
-
diff --git a/qtools/qtools.pro.in b/qtools/qtools.pro.in
deleted file mode 100644
index ba8a086..0000000
--- a/qtools/qtools.pro.in
+++ /dev/null
@@ -1,101 +0,0 @@
-TEMPLATE = lib
-CONFIG = warn_on staticlib $extraopts
-HEADERS = qarray.h \
- qbuffer.h \
- qcache.h \
- qgcache.h \
- qcollection.h \
- qconfig.h \
- qcstring.h \
- qdatastream.h \
- qdatetime.h \
- qdict.h \
- qdir.h \
- qfeatures.h \
- qfile.h \
- qfiledefs_p.h \
- qfileinfo.h \
- qgarray.h \
- qfeatures.h \
- qgdict.h \
- qgeneric.h \
- qglist.h \
- qglobal.h \
- qgstring.h \
- qgvector.h \
- qintdict.h \
- qiodevice.h \
- qinternallist.h \
- qptrdict.h \
- qqueue.h \
- qregexp.h \
- qshared.h \
- qsortedlist.h \
- qstack.h \
- qstring.h \
- qstringlist.h \
- qstrlist.h \
- qstrvec.h \
- qtextstream.h \
- qtl.h \
- qvaluelist.h \
- qvector.h \
- qxml.h \
- qvaluestack.h \
- qmap.h \
- qmodules.h \
- qthread.h \
- qthread_p.h \
- qmutex.h \
- qmutex_p.h \
- qutfcodec.h \
- qwaitcondition.h
-
-SOURCES = qbuffer.cpp \
- qcollection.cpp \
- qcstring.cpp \
- qdatastream.cpp \
- qdatetime.cpp \
- qdir.cpp \
- qfile.cpp \
- qfileinfo.cpp \
- qgarray.cpp \
- qgcache.cpp \
- qgdict.cpp \
- qglist.cpp \
- qglobal.cpp \
- qgstring.cpp \
- qgvector.cpp \
- qiodevice.cpp \
- qregexp.cpp \
- qstring.cpp \
- qtextstream.cpp \
- qtextcodec.cpp \
- qstringlist.cpp \
- qxml.cpp \
- qmap.cpp \
- qthread.cpp \
- qmutex.cpp \
- qutfcodec.cpp
-
-unix:SOURCES += qfile_unix.cpp \
- qdir_unix.cpp \
- qfileinfo_unix.cpp \
- qthread_unix.cpp \
- qmutex_unix.cpp \
- qwaitcondition_unix.cpp
-
-win32:SOURCES += qfile_win32.cpp \
- qdir_win32.cpp \
- qfileinfo_win32.cpp \
- qthread_win32.cpp \
- qmutex_win32.cpp \
- qwaitcondition_win32.cpp
-
-INCLUDEPATH = .
-#TMAKE_CXXFLAGS += -DQT_NO_CODECS -DQT_LITE_UNICODE
-TMAKE_CXXFLAGS += -DQT_LITE_UNICODE
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
-win32-g++:TMAKE_CXXFLAGS += -D__CYGWIN__ -DALL_STATIC
-OBJECTS_DIR = ../objects/qtools
-DESTDIR = ../lib
diff --git a/qtools/qvaluelist.h b/qtools/qvaluelist.h
index a1014ed..8885bea 100644
--- a/qtools/qvaluelist.h
+++ b/qtools/qvaluelist.h
@@ -1,5 +1,5 @@
/****************************************************************************
-**
+**
**
** Definition of QValueList class
**
@@ -43,10 +43,6 @@
#include "qdatastream.h"
#endif // QT_H
-#if defined(_CC_MSVC_)
-#pragma warning(disable:4284) // "return type for operator -> is not a UDT"
-#endif
-
template <class T>
class Q_EXPORT QValueListNode
{
@@ -54,7 +50,7 @@ public:
QValueListNode( const T& t ) : data( t ) { }
QValueListNode() { }
#if defined(Q_TEMPLATEDLL)
- // Workaround MS bug in memory de/allocation in DLL vs. EXE
+ // Workaround MS bug in memory de/allocation in DLL vs. EXE
virtual ~QValueListNode() { }
#endif
@@ -83,6 +79,11 @@ class Q_EXPORT QValueListIterator
QValueListIterator() : node( 0 ) {}
QValueListIterator( NodePtr p ) : node( p ) {}
QValueListIterator( const QValueListIterator<T>& it ) : node( it.node ) {}
+ QValueListIterator &operator=(const QValueListIterator &it)
+ {
+ node = it.node;
+ return *this;
+ }
bool operator==( const QValueListIterator<T>& it ) const { return node == it.node; }
bool operator!=( const QValueListIterator<T>& it ) const { return node != it.node; }
@@ -136,6 +137,11 @@ class Q_EXPORT QValueListConstIterator
QValueListConstIterator( NodePtr p ) : node( p ) {}
QValueListConstIterator( const QValueListConstIterator<T>& it ) : node( it.node ) {}
QValueListConstIterator( const QValueListIterator<T>& it ) : node( it.node ) {}
+ QValueListConstIterator &operator=(const QValueListConstIterator &it)
+ {
+ node = it.node;
+ return *this;
+ }
bool operator==( const QValueListConstIterator<T>& it ) const { return node == it.node; }
bool operator!=( const QValueListConstIterator<T>& it ) const { return node != it.node; }
@@ -199,7 +205,7 @@ public:
}
#if defined(Q_TEMPLATEDLL)
- // Workaround MS bug in memory de/allocation in DLL vs. EXE
+ // Workaround MS bug in memory de/allocation in DLL vs. EXE
virtual
#endif
~QValueListPrivate() {
diff --git a/qtools/qvector.doc b/qtools/qvector.doc
deleted file mode 100644
index 2acf567..0000000
--- a/qtools/qvector.doc
+++ /dev/null
@@ -1,344 +0,0 @@
-/****************************************************************************
-**
-**
-** QVector class documentation
-**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
-**
-** This file is part of the Qt GUI Toolkit.
-**
-** This file may be distributed under the terms of the Q Public License
-** as defined by Trolltech AS of Norway and appearing in the file
-** LICENSE.QPL included in the packaging of this file.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
-** licenses may use this file in accordance with the Qt Commercial License
-** Agreement provided with the Software.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
-** information about Qt Commercial License Agreements.
-** See http://www.trolltech.com/qpl/ for QPL licensing information.
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
-
-
-/*****************************************************************************
- QVector documentation
- *****************************************************************************/
-
-// BEING REVISED: ettrich
-/*!
- \class QVector qvector.h
-
- \brief The QVector class is a template collection class that
- provides a vector (array).
-
- \ingroup tools
-
- QVector is implemented as a template class. Define a template
- instance QVector\<X\> to create a vector that contains pointers to
- X, or X*.
-
- A vector is the same as an array. The main difference between
- QVector and QArray is that QVector stores pointers to the elements,
- while QArray stores the elements themselves (i.e. QArray is
- value-based).
-
- Unless where otherwise stated, all functions that remove items from
- the vector will also delete the element pointed to if auto-deletion
- is enabled - see setAutoDelete(). By default, auto-deletion is
- disabled. This behaviour can be changed in a subclass by
- reimplementing the virtual method deleteItem().
-
- Functions that compares items, e.g. find() and sort(), will do so
- using the virtual function compareItems(). The default
- implementation of this function will only compare the absolute
- pointer values. Reimplement compareItems() in a subclass to get
- searching and sorting based on the item contents.
-
- \sa \link collection.html Collection Classes\endlink, QArray
-*/
-
-/*!
- \fn QVector::QVector()
-
- Constructs a null vector.
-
- \sa isNull()
-*/
-
-/*!
- \fn QVector::QVector( uint size )
-
- Constructs an vector with room for \a size items. Makes a null
- vector if \a size == 0.
-
- All \a size positions in the vector are initialized to 0.
-
- \sa size(), resize(), isNull()
-*/
-
-/*!
- \fn QVector::QVector( const QVector<type> &v )
-
- Constructs a copy of \a v. Only the pointers are copied (i.e. shallow copy).
-*/
-
-/*!
- \fn QVector::~QVector()
-
- Removes all items from the vector, and destroys the vector itself.
-
- \sa clear()
-*/
-
-/*!
- \fn QVector<type> &QVector::operator=( const QVector<type> &v )
-
- Assigns \a v to this vector and returns a reference to this vector.
-
- This vector is first cleared, then all the items from \a v is copied
- into this vector. Only the pointers are copied (i.e. shallow copy).
-
- \sa clear()
-*/
-
-/*!
- \fn type **QVector::data() const
- Returns a pointer to the actual vector data, which is an array of type*.
-
- The vector is a null vector if data() == 0 (null pointer).
-
- \sa isNull()
-*/
-
-/*!
- \fn uint QVector::size() const
-
- Returns the size of the vector, i.e. the number of vector
- positions. This is also the maximum number of items the vector can
- hold.
-
- The vector is a null vector if size() == 0.
-
- \sa isNull(), resize(), count()
-*/
-
-/*!
- \fn uint QVector::count() const
-
- Returns the number of items in the vector. The vector is empty if
- count() == 0.
-
- \sa isEmpty(), size()
-*/
-
-/*!
- \fn bool QVector::isEmpty() const
-
- Returns TRUE if the vector is empty, i.e. count() == 0, otherwise FALSE.
-
- \sa count()
-*/
-
-/*!
- \fn bool QVector::isNull() const
-
- Returns TRUE if the vector is null, otherwise FALSE.
-
- A null vector has size() == 0 and data() == 0.
-
- \sa size()
-*/
-
-/*!
- \fn bool QVector::resize( uint size )
- Resizes (expands or shrinks) the vector to \a size elements. The array
- becomes a null array if \a size == 0.
-
- Any items in position \a size or beyond in the vector are removed.
- New positions are initialized 0.
-
- Returns TRUE if successful, or FALSE if the memory cannot be allocated.
-
- \sa size(), isNull()
-*/
-
-/*!
- \fn bool QVector::insert( uint i, const type *d )
-
- Sets position \a i in the vector to contain the item \a d. \a i must
- be less than size(). Any previous element in position \a i is removed.
-
- \sa at()
-*/
-
-/*!
- \fn bool QVector::remove( uint i )
-
- Removes the item at position \a i in the vector, if there is one.
- \a i must be less than size().
-
- Returns TRUE unless \a i is out of range.
-
- \sa take(), at()
-*/
-
-/*!
- \fn type* QVector::take( uint i )
-
- Returns the item at position \a i in the vector, and removes that
- item from the vector. \a i must be less than size(). If there is no
- item at position \a i, 0 is returned.
-
- In contrast to remove(), this function does \e not call deleteItem()
- for the removed item.
-
- \sa remove(), at()
-*/
-
-/*!
- \fn void QVector::clear()
-
- Removes all items from the vector, and destroys the vector
- itself.
-
- The vector becomes a null vector.
-
- \sa isNull()
-*/
-
-/*!
- \fn bool QVector::fill( const type *d, int size )
-
- Inserts item \a d in all positions in the vector. Any existing items
- are removed. If \a d is 0, the vector becomes empty.
-
- If \a size >= 0, the vector is first resized to \a size. By default,
- \a size is -1.
-
- Returns TRUE if successful, or FALSE if the memory cannot be allocated
- (only if a resize has been requested).
-
- \sa resize(), insert(), isEmpty()
-*/
-
-/*!
- \fn void QVector::sort()
-
- Sorts the items in ascending order. Any empty positions will be put
- last.
-
- Compares items using the virtual function compareItems().
-
- \sa bsearch()
-*/
-
-/*!
- \fn int QVector::bsearch( const type* d ) const
-
- In a sorted array, finds the first occurrence of \a d using binary
- search. For a sorted array, this is generally much faster than
- find(), which does a linear search.
-
- Returns the position of \a d, or -1 if \a d could not be found. \a d
- may not be 0.
-
- Compares items using the virtual function compareItems().
-
- \sa sort(), find()
-*/
-
-
-/*!
- \fn int QVector::findRef( const type *d, uint i ) const
-
- Finds the first occurrence of the item pointer \a d in the vector,
- using linear search. The search starts at position \a i, which must
- be less than size(). \a i is by default 0; i.e. the search starts at
- the start of the vector.
-
- Returns the position of \a d, or -1 if \a d could not be found.
-
- This function does \e not use compareItems() to compare items.
-
- \sa find(), bsearch()
-*/
-
-/*!
- \fn int QVector::find( const type *d, uint i ) const
-
- Finds the first occurrence of item \a d in the vector, using linear
- search. The search starts at position \a i, which must be less than
- size(). \a i is by default 0; i.e. the search starts at the start of
- the vector.
-
- Returns the position of \e v, or -1 if \e v could not be found.
-
- Compares items using the virtual function compareItems().
-
- \sa findRef(), bsearch()
-*/
-
-
-/*!
- \fn uint QVector::containsRef( const type *d ) const
-
- Returns the number of occurrences of the item pointer \a d in the
- vector.
-
- This function does \e not use compareItems() to compare items.
-
- \sa findRef()
-*/
-
-/*!
- \fn uint QVector::contains( const type *d ) const
-
- Returns the number of occurrences of item \a d in the vector.
-
- Compares items using the virtual function compareItems().
-
- \sa containsRef()
-*/
-
-/*!
- \fn type *QVector::operator[]( int i ) const
-
- Returns the item at position \a i, or 0 if there is no item at
- that position. \a i must be less than size().
-
- Equivalent to at( \a i ).
-
- \sa at()
-*/
-
-/*!
- \fn type *QVector::at( uint i ) const
-
- Returns the item at position \a i, or 0 if there is no item at
- that position. \a i must be less than size().
-*/
-
-
-/*!
- \fn void QVector::toList( QGList *list ) const
-
- Copies all items in this vector to the list \a list. First, \a list
- is cleared, then all items are appended to \a list.
-
- \sa QList, QStack, QQueue
-*/
-
diff --git a/qtools/qvector.h b/qtools/qvector.h
deleted file mode 100644
index 36f0be7..0000000
--- a/qtools/qvector.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QVector template/macro class
-**
-** Created : 930907
-**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
-**
-** This file is part of the tools module of the Qt GUI Toolkit.
-**
-** This file may be distributed under the terms of the Q Public License
-** as defined by Trolltech AS of Norway and appearing in the file
-** LICENSE.QPL included in the packaging of this file.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
-** licenses may use this file in accordance with the Qt Commercial License
-** Agreement provided with the Software.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
-** information about Qt Commercial License Agreements.
-** See http://www.trolltech.com/qpl/ for QPL licensing information.
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
-
-#ifndef QVECTOR_H
-#define QVECTOR_H
-
-#ifndef QT_H
-#include "qgvector.h"
-#endif // QT_H
-
-
-template<class type> class QVector : public QGVector
-{
-public:
- QVector() {}
- QVector( uint size ) : QGVector(size) {}
- QVector( const QVector<type> &v ) : QGVector(v) {}
- ~QVector() { clear(); }
- QVector<type> &operator=(const QVector<type> &v)
- { return (QVector<type>&)QGVector::operator=(v); }
- type **data() const { return (type **)QGVector::data(); }
- uint size() const { return QGVector::size(); }
- uint count() const { return QGVector::count(); }
- bool isEmpty() const { return QGVector::count() == 0; }
- bool isNull() const { return QGVector::size() == 0; }
- bool resize( uint size ) { return QGVector::resize(size); }
- bool insert( uint i, const type *d){ return QGVector::insert(i,(Item)d); }
- bool remove( uint i ) { return QGVector::remove(i); }
- type *take( uint i ) { return (type *)QGVector::take(i); }
- void clear() { QGVector::clear(); }
- bool fill( const type *d, int size=-1 )
- { return QGVector::fill((Item)d,size);}
- void sort() { QGVector::sort(); }
- int bsearch( const type *d ) const{ return QGVector::bsearch((Item)d); }
- int findRef( const type *d, uint i=0 ) const
- { return QGVector::findRef((Item)d,i);}
- int find( const type *d, uint i= 0 ) const
- { return QGVector::find((Item)d,i); }
- uint containsRef( const type *d ) const
- { return QGVector::containsRef((Item)d); }
- uint contains( const type *d ) const
- { return QGVector::contains((Item)d); }
- type *operator[]( int i ) const { return (type *)QGVector::at(i); }
- type *at( uint i ) const { return (type *)QGVector::at(i); }
- void toList( QGList *list ) const { QGVector::toList(list); }
-private:
- void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
-};
-
-
-#endif // QVECTOR_H
diff --git a/qtools/qwaitcondition.h b/qtools/qwaitcondition.h
deleted file mode 100644
index 4d5b3bd..0000000
--- a/qtools/qwaitcondition.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWAITCONDITION_H
-#define QWAITCONDITION_H
-
-#include "qglobal.h"
-
-class QWaitConditionPrivate;
-class QMutex;
-
-class QWaitCondition
-{
-public:
- QWaitCondition();
- ~QWaitCondition();
-
- void wait(QMutex *mutex);
-
- void wakeOne();
- void wakeAll();
-
-private:
- QWaitCondition(const QWaitCondition &);
- QWaitCondition &operator=(const QWaitCondition &);
-
- QWaitConditionPrivate * d;
-};
-
-#endif // QWAITCONDITION_H
diff --git a/qtools/qwaitcondition_unix.cpp b/qtools/qwaitcondition_unix.cpp
deleted file mode 100644
index 0a6a09b..0000000
--- a/qtools/qwaitcondition_unix.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwaitcondition.h"
-#include "qmutex.h"
-#include <pthread.h>
-
-#define MIN(a,b) ((a)<(b)?(a):(b))
-
-static void report_error(int code, const char *where, const char *what)
-{
- if (code != 0)
- qWarning("%s: %s failure: %d", where, what, code);
-}
-
-class QWaitConditionPrivate
-{
- public:
- pthread_mutex_t mutex;
- pthread_cond_t cond;
- int waiters;
- int wakeups;
-
- void wait()
- {
- int code;
- for (;;)
- {
- code = pthread_cond_wait(&cond, &mutex);
- if (code == 0 && wakeups == 0)
- {
- // many vendors warn of spurious wakeups from
- // pthread_cond_wait(), especially after signal delivery,
- // even though POSIX doesn't allow for it... sigh
- continue;
- }
- break;
- }
-
- --waiters;
- if (code == 0)
- {
- --wakeups;
- }
- else
- {
- report_error(code, "QWaitCondition::wait()", "cv wait");
- }
- report_error(pthread_mutex_unlock(&mutex), "QWaitCondition::wait()", "mutex unlock");
- }
-};
-
-
-QWaitCondition::QWaitCondition()
-{
- d = new QWaitConditionPrivate;
- report_error(pthread_mutex_init(&d->mutex, NULL), "QWaitCondition", "mutex init");
- report_error(pthread_cond_init(&d->cond, NULL), "QWaitCondition", "cv init");
- d->waiters = d->wakeups = 0;
-}
-
-
-QWaitCondition::~QWaitCondition()
-{
- report_error(pthread_cond_destroy(&d->cond), "QWaitCondition", "cv destroy");
- report_error(pthread_mutex_destroy(&d->mutex), "QWaitCondition", "mutex destroy");
- delete d;
-}
-
-void QWaitCondition::wakeOne()
-{
- report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeOne()", "mutex lock");
- d->wakeups = MIN(d->wakeups + 1, d->waiters);
- report_error(pthread_cond_signal(&d->cond), "QWaitCondition::wakeOne()", "cv signal");
- report_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeOne()", "mutex unlock");
-}
-
-void QWaitCondition::wakeAll()
-{
- report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeAll()", "mutex lock");
- d->wakeups = d->waiters;
- report_error(pthread_cond_broadcast(&d->cond), "QWaitCondition::wakeAll()", "cv broadcast");
- report_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeAll()", "mutex unlock");
-}
-
-void QWaitCondition::wait(QMutex *mutex)
-{
- if (!mutex) return;
-
- report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wait()", "mutex lock");
- ++d->waiters;
- mutex->unlock();
- d->wait();
- mutex->lock();
-}
-
diff --git a/qtools/qwaitcondition_win32.cpp b/qtools/qwaitcondition_win32.cpp
deleted file mode 100644
index 80b7b67..0000000
--- a/qtools/qwaitcondition_win32.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://www.qtsoftware.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <windows.h>
-#include "qwaitcondition.h"
-#include "qmutex.h"
-#include "qinternallist.h"
-
-//***********************************************************************
-// QWaitConditionPrivate
-// **********************************************************************
-
-class QWaitConditionEvent
-{
-public:
- QWaitConditionEvent() : priority(0), wokenUp(false)
- {
- event = CreateEvent(NULL, TRUE, FALSE, NULL);
- }
- ~QWaitConditionEvent() { CloseHandle(event); }
- int priority;
- bool wokenUp;
- HANDLE event;
-};
-
-class EventQueue : public QInternalList<QWaitConditionEvent>
-{
- public:
- EventQueue() { setAutoDelete(TRUE); }
- ~EventQueue() {}
-};
-
-class QWaitConditionPrivate
-{
-public:
- QMutex mtx;
- EventQueue queue;
- EventQueue freeQueue;
-
- QWaitConditionEvent *pre();
- void wait(QWaitConditionEvent *wce);
- void post(QWaitConditionEvent *wce);
-};
-
-QWaitConditionEvent *QWaitConditionPrivate::pre()
-{
- mtx.lock();
- QWaitConditionEvent *wce =
- freeQueue.isEmpty() ? new QWaitConditionEvent : freeQueue.take(0);
- wce->priority = GetThreadPriority(GetCurrentThread());
- wce->wokenUp = FALSE;
-
- // insert 'wce' into the queue (sorted by priority)
- uint index = 0;
- for (; index < queue.count(); ++index)
- {
- QWaitConditionEvent *current = queue.at(index);
- if (current->priority < wce->priority)
- break;
- }
- queue.insert(index, wce);
- mtx.unlock();
-
- return wce;
-}
-
-void QWaitConditionPrivate::wait(QWaitConditionEvent *wce)
-{
- WaitForSingleObject(wce->event, INFINITE);
-}
-
-void QWaitConditionPrivate::post(QWaitConditionEvent *wce)
-{
- mtx.lock();
-
- // remove 'wce' from the queue
- int idx = queue.find(wce);
- ASSERT(idx!=-1);
- queue.take(idx);
- ResetEvent(wce->event);
- freeQueue.append(wce);
-
- // wakeups delivered after the timeout should be forwarded to the next waiter
- if (wce->wokenUp && !queue.isEmpty())
- {
- QWaitConditionEvent *other = queue.getFirst();
- SetEvent(other->event);
- other->wokenUp = TRUE;
- }
-
- mtx.unlock();
-}
-
-//***********************************************************************
-// QWaitCondition implementation
-//***********************************************************************
-
-QWaitCondition::QWaitCondition()
-{
- d = new QWaitConditionPrivate;
-}
-
-QWaitCondition::~QWaitCondition()
-{
- if (!d->queue.isEmpty())
- {
- qWarning("QWaitCondition: Destroyed while threads are still waiting");
- }
- delete d;
-}
-
-void QWaitCondition::wait(QMutex *mutex)
-{
- if (!mutex) return;
-
- QWaitConditionEvent *wce = d->pre();
- mutex->unlock();
- d->wait(wce);
- mutex->lock();
- d->post(wce);
-}
-
-void QWaitCondition::wakeOne()
-{
- // wake up the first waiting thread in the queue
- QMutexLocker locker(&d->mtx);
- for (uint i = 0; i < d->queue.count(); ++i)
- {
- QWaitConditionEvent *current = d->queue.at(i);
- if (current->wokenUp) continue;
- SetEvent(current->event);
- current->wokenUp = TRUE;
- break;
- }
-}
-
-void QWaitCondition::wakeAll()
-{
- // wake up the all threads in the queue
- QMutexLocker locker(&d->mtx);
- for (uint i = 0; i < d->queue.count(); ++i)
- {
- QWaitConditionEvent *current = d->queue.at(i);
- SetEvent(current->event);
- current->wokenUp = TRUE;
- }
-}
-
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 23460d0..5004a95 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,20 +1,24 @@
# vim:ts=4:sw=4:expandtab:autoindent:
include_directories(
- ${CMAKE_SOURCE_DIR}/qtools
- ${CMAKE_SOURCE_DIR}/libmd5
- ${CMAKE_SOURCE_DIR}/liblodepng
- ${CMAKE_SOURCE_DIR}/libmscgen
- ${CMAKE_SOURCE_DIR}/libversion
- ${CMAKE_SOURCE_DIR}/vhdlparser
- ${CMAKE_SOURCE_DIR}/src
+ ${PROJECT_SOURCE_DIR}/qtools
+ ${PROJECT_SOURCE_DIR}/libmd5
+ ${PROJECT_SOURCE_DIR}/liblodepng
+ ${PROJECT_SOURCE_DIR}/libmscgen
+ ${PROJECT_SOURCE_DIR}/libversion
+ ${PROJECT_SOURCE_DIR}/vhdlparser
+ ${PROJECT_SOURCE_DIR}/src
${CLANG_INCLUDEDIR}
${GENERATED_SRC}
)
file(MAKE_DIRECTORY ${GENERATED_SRC})
-file(GLOB LANGUAGE_FILES "${CMAKE_SOURCE_DIR}/src/translator_??.h")
+if (${CMAKE_VERSION} VERSION_EQUAL "3.11.0" OR ${CMAKE_VERSION} VERSION_GREATER "3.11.0")
+ file(GLOB LANGUAGE_FILES CONFIGURE_DEPENDS "${CMAKE_CURRENT_LIST_DIR}/translator_??.h")
+else()
+ file(GLOB LANGUAGE_FILES "${CMAKE_CURRENT_LIST_DIR}/translator_??.h")
+endif()
# instead of increasebuffer.py
add_definitions(-DYY_BUF_SIZE=${enlarge_lex_buffers} -DYY_READ_BUF_SIZE=${enlarge_lex_buffers})
@@ -35,8 +39,8 @@ set_source_files_properties(${GENERATED_SRC}/settings.h PROPERTIES GENERATED 1)
# configvalues.h
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/configgen.py -maph ${CMAKE_SOURCE_DIR}/src/config.xml > ${GENERATED_SRC}/configvalues.h
- DEPENDS ${CMAKE_SOURCE_DIR}/src/config.xml ${CMAKE_SOURCE_DIR}/src/configgen.py
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/configgen.py -maph ${CMAKE_CURRENT_LIST_DIR}/config.xml > ${GENERATED_SRC}/configvalues.h
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/config.xml ${CMAKE_CURRENT_LIST_DIR}/configgen.py
OUTPUT ${GENERATED_SRC}/configvalues.h
)
set_source_files_properties(${GENERATED_SRC}/configvalues.h PROPERTIES GENERATED 1)
@@ -47,16 +51,16 @@ add_custom_target(
# configvalues.cpp
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/configgen.py -maps ${CMAKE_SOURCE_DIR}/src/config.xml > ${GENERATED_SRC}/configvalues.cpp
- DEPENDS ${CMAKE_SOURCE_DIR}/src/config.xml ${CMAKE_SOURCE_DIR}/src/configgen.py
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/configgen.py -maps ${CMAKE_CURRENT_LIST_DIR}/config.xml > ${GENERATED_SRC}/configvalues.cpp
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/config.xml ${CMAKE_CURRENT_LIST_DIR}/configgen.py
OUTPUT ${GENERATED_SRC}/configvalues.cpp
)
set_source_files_properties(${GENERATED_SRC}/configvalues.cpp PROPERTIES GENERATED 1)
# configoptions.cpp
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/configgen.py -cpp ${CMAKE_SOURCE_DIR}/src/config.xml > ${GENERATED_SRC}/configoptions.cpp
- DEPENDS ${CMAKE_SOURCE_DIR}/src/config.xml ${CMAKE_SOURCE_DIR}/src/configgen.py
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/configgen.py -cpp ${CMAKE_CURRENT_LIST_DIR}/config.xml > ${GENERATED_SRC}/configoptions.cpp
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/config.xml ${CMAKE_CURRENT_LIST_DIR}/configgen.py
OUTPUT ${GENERATED_SRC}/configoptions.cpp
)
set_source_files_properties(${GENERATED_SRC}/configoptions.cpp PROPERTIES GENERATED 1)
@@ -64,8 +68,8 @@ set_source_files_properties(${GENERATED_SRC}/configoptions.cpp PROPERTIES GENERA
# ce_parse.h
add_custom_command(
- COMMAND ${BISON_EXECUTABLE} -l -d -p ce_parsexpYY ${CMAKE_SOURCE_DIR}/src/constexp.y -o ce_parse.c
- DEPENDS ${CMAKE_SOURCE_DIR}/src/constexp.y
+ COMMAND ${BISON_EXECUTABLE} -l -d -p ce_parsexpYY ${CMAKE_CURRENT_LIST_DIR}/constexp.y -o ce_parse.c
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/constexp.y
OUTPUT ${GENERATED_SRC}/ce_parse.h
WORKING_DIRECTORY ${GENERATED_SRC}
)
@@ -74,32 +78,28 @@ set_source_files_properties(${GENERATED_SRC}/ce_parse.h PROPERTIES GENERATED 1)
# lang_cfg.h
add_custom_command(
COMMENT "Generating ${GENERATED_SRC}/lang_cfg.h"
- COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/lang_cfg.cmake ${GENERATED_SRC}/lang_cfg.h ${LANG_CODES}
+ COMMAND ${CMAKE_COMMAND} -P ${PROJECT_SOURCE_DIR}/cmake/lang_cfg.cmake ${GENERATED_SRC}/lang_cfg.h ${LANG_CODES}
DEPENDS ${LANGUAGE_FILES}
OUTPUT ${GENERATED_SRC}/lang_cfg.h
)
set_source_files_properties(${GENERATED_SRC}/lang_cfg.h PROPERTIES GENERATED 1)
# all resource files
-file(GLOB RESOURCES ${CMAKE_SOURCE_DIR}/templates/*/*)
+if (${CMAKE_VERSION} VERSION_EQUAL "3.11.0" OR ${CMAKE_VERSION} VERSION_GREATER "3.11.0")
+ file(GLOB RESOURCES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/templates/*/*)
+else()
+ file(GLOB RESOURCES ${PROJECT_SOURCE_DIR}/templates/*/*)
+endif()
# resources.cpp
add_custom_command(
COMMENT "Generating ${GENERATED_SRC}/resources.cpp"
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/res2cc_cmd.py ${CMAKE_SOURCE_DIR}/templates ${GENERATED_SRC}/resources.cpp
- DEPENDS ${RESOURCES}
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/res2cc_cmd.py ${PROJECT_SOURCE_DIR}/templates ${GENERATED_SRC}/resources.cpp
+ DEPENDS ${RESOURCES} ${CMAKE_CURRENT_LIST_DIR}/res2cc_cmd.py
OUTPUT ${GENERATED_SRC}/resources.cpp
)
set_source_files_properties(${GENERATED_SRC}/resources.cpp PROPERTIES GENERATED 1)
-# layout_default.xml
-add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/to_c_cmd.py < ${CMAKE_SOURCE_DIR}/src/layout_default.xml > ${GENERATED_SRC}/layout_default.xml.h
- DEPENDS ${CMAKE_SOURCE_DIR}/src/layout_default.xml
- OUTPUT ${GENERATED_SRC}/layout_default.xml.h
-)
-set_source_files_properties(${GENERATED_SRC}/layout_default.xml.h PROPERTIES GENERATED 1)
-
set(LEX_FILES scanner
code
pyscanner
@@ -107,7 +107,6 @@ set(LEX_FILES scanner
fortranscanner
fortrancode
vhdlcode
- tclscanner
pre
declinfo
defargs
@@ -115,6 +114,7 @@ set(LEX_FILES scanner
commentcnv
commentscan
constexp
+ xml
xmlcode
sqlcode
configimpl)
@@ -124,17 +124,35 @@ foreach(lex_file ${LEX_FILES})
set(LEX_FILES_H ${LEX_FILES_H} " " ${GENERATED_SRC}/${lex_file}.l.h CACHE INTERNAL "Stores generated files")
set(LEX_FILES_CPP ${LEX_FILES_CPP} " " ${GENERATED_SRC}/${lex_file}.cpp CACHE INTERNAL "Stores generated files")
add_custom_command(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/scan_states.py ${CMAKE_SOURCE_DIR}/src/${lex_file}.l > ${GENERATED_SRC}/${lex_file}.l.h
- DEPENDS ${CMAKE_SOURCE_DIR}/src/scan_states.py ${CMAKE_SOURCE_DIR}/src/${lex_file}.l
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l > ${GENERATED_SRC}/${lex_file}.l.h
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/scan_states.py ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
OUTPUT ${GENERATED_SRC}/${lex_file}.l.h
)
set_source_files_properties(${GENERATED_SRC}/${lex_file}.l.h PROPERTIES GENERATED 1)
+ # for code coverage we need the flex sources in the build src directory
+ add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/src/${lex_file}.l ${PROJECT_BINARY_DIR}/src/${lex_file}.l
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/${lex_file}.l
+ OUTPUT ${PROJECT_BINARY_DIR}/src/${lex_file}.l
+ )
- FLEX_TARGET(${lex_file} ${lex_file}.l ${GENERATED_SRC}/${lex_file}.cpp COMPILE_FLAGS "${LEX_FLAGS}")
+ FLEX_TARGET(${lex_file}
+ ${CMAKE_CURRENT_LIST_DIR}/${lex_file}.l
+ ${GENERATED_SRC}/${lex_file}.cpp
+ COMPILE_FLAGS "${LEX_FLAGS}")
endforeach()
-BISON_TARGET(constexp constexp.y ${GENERATED_SRC}/ce_parse.cpp COMPILE_FLAGS "${YACC_FLAGS}")
+BISON_TARGET(constexp
+ ${CMAKE_CURRENT_LIST_DIR}/constexp.y
+ ${GENERATED_SRC}/ce_parse.cpp
+ COMPILE_FLAGS "${YACC_FLAGS}")
+
+add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/src/constexp.y ${PROJECT_BINARY_DIR}/src
+ DEPENDS ${PROJECT_SOURCE_DIR}/src/constexp.y
+ OUTPUT ${PROJECT_BINARY_DIR}/src/constexp.y
+)
add_library(doxycfg STATIC
${GENERATED_SRC}/lang_cfg.h
@@ -143,25 +161,23 @@ add_library(doxycfg STATIC
${GENERATED_SRC}/configimpl.l.h
${GENERATED_SRC}/configoptions.cpp
${GENERATED_SRC}/configvalues.cpp
+ ${GENERATED_SRC}/settings.h
portable.cpp
portable_c.c
+ ftextstream.cpp
+ message.cpp
+ debug.cpp
)
+add_sanitizers(doxycfg)
-add_library(_doxygen STATIC
- # custom generated files
- ${GENERATED_SRC}/lang_cfg.h
- ${GENERATED_SRC}/settings.h
- ${GENERATED_SRC}/layout_default.xml.h
- ${GENERATED_SRC}/ce_parse.h
- ${GENERATED_SRC}/configvalues.h
- ${GENERATED_SRC}/resources.cpp
+add_library(doxymain STATIC
# generated for/by flex/bison
#${LEX_FILES_H} #unfortunately doesn't work in older versions of CMake (like 3.6.2)
#${LEX_FILES_CPP} #unfortunately doesn't work in older versions of CMake (like 3.6.2)
${GENERATED_SRC}/code.l.h
${GENERATED_SRC}/commentcnv.l.h
${GENERATED_SRC}/commentscan.l.h
- ${GENERATED_SRC}/configimpl.l.h
+ ${GENERATED_SRC}/constexp.cpp
${GENERATED_SRC}/constexp.l.h
${GENERATED_SRC}/declinfo.l.h
${GENERATED_SRC}/defargs.l.h
@@ -173,14 +189,12 @@ add_library(_doxygen STATIC
${GENERATED_SRC}/pyscanner.l.h
${GENERATED_SRC}/scanner.l.h
${GENERATED_SRC}/sqlcode.l.h
- ${GENERATED_SRC}/tclscanner.l.h
${GENERATED_SRC}/vhdlcode.l.h
+ ${GENERATED_SRC}/xml.l.h
${GENERATED_SRC}/xmlcode.l.h
${GENERATED_SRC}/code.cpp
${GENERATED_SRC}/commentcnv.cpp
${GENERATED_SRC}/commentscan.cpp
- ${GENERATED_SRC}/configimpl.cpp
- ${GENERATED_SRC}/constexp.cpp
${GENERATED_SRC}/declinfo.cpp
${GENERATED_SRC}/defargs.cpp
${GENERATED_SRC}/doctokenizer.cpp
@@ -191,11 +205,15 @@ add_library(_doxygen STATIC
${GENERATED_SRC}/pyscanner.cpp
${GENERATED_SRC}/scanner.cpp
${GENERATED_SRC}/sqlcode.cpp
- ${GENERATED_SRC}/tclscanner.cpp
${GENERATED_SRC}/vhdlcode.cpp
+ ${GENERATED_SRC}/xml.cpp
${GENERATED_SRC}/xmlcode.cpp
#
${GENERATED_SRC}/ce_parse.cpp
+ # custom generated files
+ ${GENERATED_SRC}/lang_cfg.h
+ ${GENERATED_SRC}/ce_parse.h
+ ${GENERATED_SRC}/resources.cpp
#
arguments.cpp
cite.cpp
@@ -206,9 +224,7 @@ add_library(_doxygen STATIC
condparser.cpp
context.cpp
cppvalue.cpp
- debug.cpp
defgen.cpp
- define.cpp
definition.cpp
dia.cpp
diagram.cpp
@@ -218,6 +234,7 @@ add_library(_doxygen STATIC
docgroup.cpp
docparser.cpp
docsets.cpp
+ docvisitor.cpp
dot.cpp
dotcallgraph.cpp
dotclassgraph.cpp
@@ -235,10 +252,8 @@ add_library(_doxygen STATIC
emoji.cpp
entry.cpp
filedef.cpp
- filename.cpp
fileparser.cpp
formula.cpp
- ftextstream.cpp
ftvhelp.cpp
groupdef.cpp
htags.cpp
@@ -258,11 +273,8 @@ add_library(_doxygen STATIC
memberdef.cpp
membergroup.cpp
memberlist.cpp
- membername.cpp
- message.cpp
msc.cpp
namespacedef.cpp
- objcache.cpp
outputgen.cpp
outputlist.cpp
pagedef.cpp
@@ -278,6 +290,7 @@ add_library(_doxygen STATIC
searchindex.cpp
sqlite3gen.cpp
stlsupport.cpp
+ symbolresolver.cpp
tagreader.cpp
template.cpp
textdocvisitor.cpp
@@ -288,35 +301,48 @@ add_library(_doxygen STATIC
xmldocvisitor.cpp
xmlgen.cpp
)
+add_sanitizers(doxymain)
+
+# LLVM/clang headers give a lot of warnings with -Wshadow and -Wcast-align so we disable them for
+# the one file that includes them
+
+if (NOT MSVC)
+set_source_files_properties(clangparser.cpp PROPERTIES COMPILE_FLAGS "-Wno-shadow -Wno-cast-align")
+endif()
##foreach(lex_file ${LEX_FILES})
-##add_library(_doxygen STATIC ${GENERATED_SRC}/${lex_file}.l.h)
+##add_library(doxymain STATIC ${GENERATED_SRC}/${lex_file}.l.h)
##endforeach()
-add_executable(doxygen main.cpp)
+add_executable(doxygen
+ main.cpp
+)
+add_sanitizers(doxygen)
if (use_libclang)
find_package(LLVM REQUIRED CONFIG)
find_package(Clang REQUIRED CONFIG)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
- cmake_minimum_required(VERSION 3.1)
- target_compile_features(_doxygen PRIVATE cxx_alignof)
+ target_compile_features(doxymain PRIVATE cxx_alignof)
target_compile_features(doxygen PRIVATE cxx_alignof)
- target_compile_options(_doxygen PRIVATE -stdlib=libc++)
- target_compile_options(doxygen PRIVATE -stdlib=libc++)
- elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
- target_compile_options(_doxygen PRIVATE -std=c++11)
- target_compile_options(doxygen PRIVATE -std=c++11)
+ if (use_libc++)
+ target_compile_options(doxymain PRIVATE -stdlib=libc++)
+ target_compile_options(doxygen PRIVATE -stdlib=libc++)
+ endif()
endif()
include_directories(${LLVM_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})
- llvm_map_components_to_libnames(llvm_libs support core option)
+ if (static_libclang)
+ set(CLANG_LIBS libclang clangTooling)
+ else() # dynamically linked version of clang
+ llvm_config(doxymain USE_SHARED support)
+ set(CLANG_LIBS libclang clang-cpp)
+ endif()
target_compile_definitions(doxygen PRIVATE ${LLVM_DEFINITIONS})
- set(CLANG_LIBS libclang clangTooling ${llvm_libs})
endif()
-target_link_libraries(doxygen
- _doxygen
+target_link_libraries(doxygen PRIVATE
+ doxymain
doxycfg
qtools
md5
@@ -329,6 +355,19 @@ target_link_libraries(doxygen
${CMAKE_THREAD_LIBS_INIT}
${EXTRA_LIBS}
${CLANG_LIBS}
+ ${COVERAGE_LINKER_FLAGS}
+ ${DOXYGEN_EXTRA_LINK_OPTIONS}
)
+set_project_warnings(doxycfg)
+set_project_warnings(doxymain)
+set_project_warnings(doxygen)
+
+set_project_coverage(qtools)
+set_project_coverage(doxycfg)
+set_project_coverage(doxymain)
+set_project_coverage(doxygen)
+
+
install(TARGETS doxygen DESTINATION bin)
+
diff --git a/src/arguments.h b/src/arguments.h
index 3464def..181a8d3 100644
--- a/src/arguments.h
+++ b/src/arguments.h
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -50,48 +50,91 @@ enum RefQualifierType
RefQualifierRValue
};
-/*! \brief This class represents an function or template argument list.
+/*! \brief This class represents an function or template argument list.
*
* This class also stores some information about member that is typically
- * put after the argument list, such as whether the member is const,
+ * put after the argument list, such as whether the member is const,
* volatile or pure virtual.
*/
-class ArgumentList : public std::vector<Argument>
+class ArgumentList
{
public:
+ using Vec = std::vector<Argument>;
+ using iterator = typename Vec::iterator;
+ using const_iterator = typename Vec::const_iterator;
+
/*! Does any argument of this list have documentation? */
bool hasDocumentation() const;
/*! Does this list have zero or more parameters */
bool hasParameters() const
{
- return !empty() || noParameters;
+ return !empty() || m_noParameters;
}
void reset()
{
clear();
- constSpecifier = FALSE;
- volatileSpecifier = FALSE;
- pureSpecifier = FALSE;
- trailingReturnType.resize(0);
- isDeleted = FALSE;
- refQualifier = RefQualifierNone;
- noParameters = FALSE;
+ m_constSpecifier = FALSE;
+ m_volatileSpecifier = FALSE;
+ m_pureSpecifier = FALSE;
+ m_trailingReturnType.resize(0);
+ m_isDeleted = FALSE;
+ m_refQualifier = RefQualifierNone;
+ m_noParameters = FALSE;
}
+ // make vector accessible
+ iterator begin() { return m_args.begin(); }
+ iterator end() { return m_args.end(); }
+ const_iterator begin() const { return m_args.cbegin(); }
+ const_iterator end() const { return m_args.cend(); }
+ const_iterator cbegin() const { return m_args.cbegin(); }
+ const_iterator cend() const { return m_args.cend(); }
+ bool empty() const { return m_args.empty(); }
+ size_t size() const { return m_args.size(); }
+ void clear() { m_args.clear(); }
+ void push_back(const Argument &a) { m_args.push_back(a); }
+ Argument &back() { return m_args.back(); }
+ const Argument &back() const { return m_args.back(); }
+ Argument &front() { return m_args.front(); }
+ const Argument &front() const { return m_args.front(); }
+ Argument &at(size_t i) { return m_args.at(i); }
+ const Argument &at(size_t i) const { return m_args.at(i); }
+
+ // getters for list wide attributes
+ bool constSpecifier() const { return m_constSpecifier; }
+ bool volatileSpecifier() const { return m_volatileSpecifier; }
+ bool pureSpecifier() const { return m_pureSpecifier; }
+ QCString trailingReturnType() const { return m_trailingReturnType; }
+ bool isDeleted() const { return m_isDeleted; }
+ RefQualifierType refQualifier() const { return m_refQualifier; }
+ bool noParameters() const { return m_noParameters; }
+
+ void setConstSpecifier(bool b) { m_constSpecifier = b; }
+ void setVolatileSpecifier(bool b) { m_volatileSpecifier = b; }
+ void setPureSpecifier(bool b) { m_pureSpecifier = b; }
+ void setTrailingReturnType(const QCString &s) { m_trailingReturnType = s; }
+ void setIsDeleted(bool b) { m_isDeleted = b; }
+ void setRefQualifier(RefQualifierType t) { m_refQualifier = t; }
+ void setNoParameters(bool b) { m_noParameters = b; }
+
+ private:
+ std::vector<Argument> m_args;
/*! Does the member modify the state of the class? */
- bool constSpecifier = FALSE;
+ bool m_constSpecifier = FALSE;
/*! Is the member volatile? */
- bool volatileSpecifier = FALSE;
+ bool m_volatileSpecifier = FALSE;
/*! Is this a pure virtual member? */
- bool pureSpecifier = FALSE;
+ bool m_pureSpecifier = FALSE;
/*! C++11 style Trailing return type? */
- QCString trailingReturnType;
+ QCString m_trailingReturnType;
/*! method with =delete */
- bool isDeleted = FALSE;
+ bool m_isDeleted = FALSE;
/*! C++11 ref qualifier */
- RefQualifierType refQualifier = RefQualifierNone;
+ RefQualifierType m_refQualifier = RefQualifierNone;
/*! is it an explicit empty list */
- bool noParameters = FALSE;
+ bool m_noParameters = FALSE;
};
+using ArgumentLists = std::vector<ArgumentList>;
+
#endif
diff --git a/src/bufstr.h b/src/bufstr.h
index 331def2..e64a049 100644
--- a/src/bufstr.h
+++ b/src/bufstr.h
@@ -30,7 +30,7 @@
class BufStr
{
public:
- BufStr(int size)
+ BufStr(uint size)
: m_size(size), m_writeOffset(0), m_spareRoom(10240), m_buf(0)
{
m_buf = (char *)calloc(size,1);
@@ -44,7 +44,7 @@ class BufStr
makeRoomFor(1);
m_buf[m_writeOffset++]=c;
}
- void addArray(const char *a,int len)
+ void addArray(const char *a,uint len)
{
makeRoomFor(len);
memcpy(m_buf+m_writeOffset,a,len);
@@ -74,7 +74,7 @@ class BufStr
memset(m_buf+oldsize,0,m_size-oldsize);
}
}
- int size() const
+ uint size() const
{
return m_size;
}
@@ -115,7 +115,7 @@ class BufStr
}
uint m_size;
uint m_writeOffset;
- const int m_spareRoom; // 10Kb extra room to avoid frequent resizing
+ const uint m_spareRoom; // 10Kb extra room to avoid frequent resizing
char *m_buf;
};
diff --git a/src/cache.h b/src/cache.h
new file mode 100644
index 0000000..5f7c834
--- /dev/null
+++ b/src/cache.h
@@ -0,0 +1,162 @@
+/*****************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef CACHE_H
+#define CACHE_H
+
+#include <list>
+#include <unordered_map>
+#include <mutex>
+#include <ctype.h>
+
+/*! Fixed size cache for value type V using keys of type K.
+ *
+ * When the maximum capacity has reached, the least recently used value is removed from the cache
+ * (LRU strategy).
+ */
+template<typename K,typename V>
+class Cache
+{
+ public:
+ using kv_pair = std::pair<K,V>;
+ using iterator = typename std::list<kv_pair>::iterator;
+ using const_iterator = typename std::list<kv_pair>::const_iterator;
+
+ //! creates a cache that can hold \a capacity elements
+ Cache(size_t capacity) : m_capacity(capacity)
+ {
+ }
+
+ //! Inserts \a value under \a key in the cache
+ V *insert(const K &key,V &&value)
+ {
+ // remove item if it already exists
+ remove(key);
+ // store new item
+ m_cacheItemList.push_front(kv_pair(key,std::move(value)));
+ V *result = &m_cacheItemList.front().second;
+ m_cacheItemMap[key] = m_cacheItemList.begin();
+ // remove least recently used item if cache is full
+ resize();
+ return result;
+ }
+
+ //! Inserts \a value under \a key in the cache
+ V *insert(const K &key,const V &value)
+ {
+ // remove item if it already exists
+ remove(key);
+ // store new item
+ m_cacheItemList.push_front(kv_pair(key,value));
+ V *result = &m_cacheItemList.front().second;
+ m_cacheItemMap[key] = m_cacheItemList.begin();
+ // remove least recently used item if cache is full
+ resize();
+ return result;
+ }
+
+ //! Removes entry \a key from the cache.
+ //! \note this invalidates any iterators
+ void remove(const K &key)
+ {
+ // remove item if it already exists
+ auto it = m_cacheItemMap.find(key);
+ if (it != m_cacheItemMap.end())
+ {
+ m_cacheItemList.erase(it->second);
+ m_cacheItemMap.erase(it);
+ }
+ }
+
+ //! Finds a value in the cache given the corresponding \a key.
+ //! @returns a pointer to the value or nullptr if the key is not found in the cache
+ //! @note The hit and miss counters are updated, see hits() and misses().
+ V *find(const K &key)
+ {
+ auto it = m_cacheItemMap.find(key);
+ if (it != m_cacheItemMap.end())
+ {
+ // move the item to the front of the list
+ m_cacheItemList.splice(m_cacheItemList.begin(),
+ m_cacheItemList,
+ it->second);
+ m_hits++;
+ // return the value
+ return &it->second->second;
+ }
+ else
+ {
+ m_misses++;
+ }
+ return nullptr;
+ }
+
+ //! Returns the number of values stored in the cache.
+ size_t size() const
+ {
+ return m_cacheItemMap.size();
+ }
+
+ //! Returns the maximum number of values that can be stored in the cache.
+ size_t capacity() const
+ {
+ return m_capacity;
+ }
+
+ //! Returns how many of the find() calls did find a value in the cache.
+ uint64_t hits() const
+ {
+ return m_hits;
+ }
+
+ //! Returns how many of the find() calls did not found a value in the cache.
+ uint64_t misses() const
+ {
+ return m_misses;
+ }
+
+ //! Clears all values in the cache.
+ void clear()
+ {
+ m_cacheItemMap.clear();
+ m_cacheItemList.clear();
+ }
+
+ iterator begin() { return m_cacheItemList.begin(); }
+ iterator end() { return m_cacheItemList.end(); }
+ const_iterator begin() const { return m_cacheItemList.cbegin(); }
+ const_iterator end() const { return m_cacheItemList.cend(); }
+
+ private:
+ void resize()
+ {
+ if (m_cacheItemMap.size() > m_capacity)
+ {
+ auto last_it = m_cacheItemList.end();
+ --last_it;
+ m_cacheItemMap.erase(last_it->first);
+ m_cacheItemList.pop_back();
+ }
+ }
+ size_t m_capacity;
+ // list of items in the cache, sorted by most to least recently used.
+ std::list<kv_pair> m_cacheItemList;
+ // mapping for each key to a place in the list where item is found
+ std::unordered_map<K,iterator> m_cacheItemMap;
+ uint64_t m_hits=0;
+ uint64_t m_misses=0;
+};
+
+#endif
diff --git a/src/cite.cpp b/src/cite.cpp
index 797881f..e02641a 100644
--- a/src/cite.cpp
+++ b/src/cite.cpp
@@ -1,11 +1,11 @@
/******************************************************************************
*
- * Copyright (C) 2011 by Dimitri van Heesch
+ * Copyright (C) 2020 by Dimitri van Heesch
* Based on a patch by David Munger
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -15,178 +15,246 @@
*/
#include "cite.h"
-#include "portable.h"
#include "config.h"
-#include "message.h"
-#include "util.h"
-#include "language.h"
#include "ftextstream.h"
+#include "language.h"
+#include "message.h"
+#include "portable.h"
#include "resourcemgr.h"
-#include "doxygen.h"
+#include "util.h"
+#include "debug.h"
+
+#include <qfile.h>
+#include <qfileinfo.h>
#include <qdir.h>
-//--------------------------------------------------------------------------
+#include <map>
+#include <string>
+
+const char *bibTmpFile = "bibTmpFile_";
+const char *bibTmpDir = "bibTmpDir/";
+
+class CiteInfoImpl : public CiteInfo
+{
+ public:
+ CiteInfoImpl(const char *label, const char *text=0)
+ : m_label(label), m_text(text) { }
-const QCString CiteConsts::fileName("citelist");
-/* when changing this also take doxygen.bst into account */
-const QCString CiteConsts::anchorPrefix("CITEREF_");
-const QCString bibTmpFile("bibTmpFile_");
-const QCString bibTmpDir("bibTmpDir/");
+ virtual QCString label() const { return m_label; }
+ virtual QCString text() const { return m_text; }
-//--------------------------------------------------------------------------
+ void setText(const char *s) { m_text = s; }
-CiteDict::CiteDict(int size) : m_entries(size, FALSE)
-{
- m_entries.setAutoDelete(TRUE);
+ private:
+ QCString m_label;
+ QCString m_text;
+};
+
+struct CitationManager::Private
+{
+ std::map< std::string,std::unique_ptr<CiteInfoImpl> > entries;
+};
+
+CitationManager &CitationManager::instance()
+{
+ static CitationManager ct;
+ return ct;
}
-void CiteDict::writeLatexBibliography(FTextStream &t)
+CitationManager::CitationManager() : p(new Private)
{
- if (m_entries.isEmpty())
- return;
+}
- QCString style = Config_getString(LATEX_BIB_STYLE);
- if (style.isEmpty())
- style="plain";
- QCString unit;
- if (Config_getBool(COMPACT_LATEX))
- unit = "section";
- else
- unit = "chapter";
- t << "% Bibliography\n"
- "\\newpage\n"
- "\\phantomsection\n";
- bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
- if (!pdfHyperlinks)
- {
- t << "\\clearemptydoublepage\n";
- t << "\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trCiteReferences() << "}\n";
- }
- t << "\\bibliographystyle{" << style << "}\n"
- "\\bibliography{";
- QStrList &citeDataList = Config_getList(CITE_BIB_FILES);
- int i = 0;
- const char *bibdata = citeDataList.first();
- while (bibdata)
- {
- QCString bibFile = bibdata;
- // Note: file can now have multiple dots
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
- QFileInfo fi(bibFile);
- if (fi.exists())
- {
- if (!bibFile.isEmpty())
- {
- if (i) t << ",";
- i++;
- t << bibTmpFile << QCString().setNum(i);
- }
- }
- bibdata = citeDataList.next();
- }
- t << "}\n";
- if (pdfHyperlinks)
+void CitationManager::insert(const char *label)
+{
+ p->entries.insert(
+ std::make_pair(
+ std::string(label),
+ std::make_unique<CiteInfoImpl>(label)
+ ));
+}
+
+const CiteInfo *CitationManager::find(const char *label) const
+{
+ auto it = p->entries.find(label);
+ if (it!=p->entries.end())
{
- t << "\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trCiteReferences() << "}\n";
+ return it->second.get();
}
- t << "\n";
+ return 0;
}
-void CiteDict::insert(const char *label)
+void CitationManager::clear()
{
- m_entries.insert(label,new CiteInfo(label));
+ p->entries.clear();
}
-CiteInfo *CiteDict::find(const char *label) const
+bool CitationManager::isEmpty() const
{
- return label ? m_entries.find(label) : 0;
+ size_t numFiles = Config_getList(CITE_BIB_FILES).size();
+ return (numFiles==0 || p->entries.empty());
}
-void CiteDict::clear()
+const char *CitationManager::fileName() const
{
- m_entries.clear();
+ return "citelist";
}
-bool CiteDict::isEmpty() const
+const char *CitationManager::anchorPrefix() const
{
- QStrList &citeBibFiles = Config_getList(CITE_BIB_FILES);
- return (citeBibFiles.count()==0 || m_entries.isEmpty());
+ return "CITEREF_";
}
-void CiteDict::generatePage() const
+void CitationManager::insertCrossReferencesForBibFile(const QCString &bibFile)
{
- //printf("** CiteDict::generatePage() count=%d\n",m_ordering.count());
+ // sanity checks
+ if (bibFile.isEmpty())
+ {
+ return;
+ }
+ QFileInfo fi(bibFile);
+ if (!fi.exists())
+ {
+ err("bib file %s not found!\n",bibFile.data());
+ return;
+ }
+ QFile f(bibFile);
+ if (!f.open(IO_ReadOnly))
+ {
+ err("could not open file %s for reading\n",bibFile.data());
+ return;
+ }
- // do not generate an empty citations page
- if (isEmpty()) return; // nothing to cite
+ // convert file to string
+ QCString doc;
+ QCString input(fi.size()+1);
+ f.readBlock(input.rawData(),fi.size());
+ f.close();
+ input.at(fi.size())='\0';
- // 0. add cross references from the bib files to the cite dictionary
- QFile f;
- QStrList &citeDataList = Config_getList(CITE_BIB_FILES);
- const char *bibdata = citeDataList.first();
- while (bibdata)
+ int pos=0;
+ int s;
+
+ // helper lambda function to get the next line of input and update pos accordingly
+ auto get_next_line = [&input,&pos,&s]()
{
- QCString bibFile = bibdata;
- if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
- QFileInfo fi(bibFile);
- if (fi.exists())
+ uint prevPos = (uint)pos;
+ pos=s+1;
+ return input.mid(prevPos,(uint)(s-prevPos));
+ };
+
+ // helper lambda function to return if the end of the input has reached
+ auto end_of_input = [&s]()
+ {
+ return s==-1;
+ };
+
+ // helper lambda function to proceed to the next line in the input, and update s
+ // to point to the start of the line. Return true as long as there is a new line.
+ auto has_next_line = [&input,&pos,&s]()
+ {
+ s=input.find('\n',pos);
+ return s!=-1;
+ };
+
+ // search for citation cross references
+ QCString citeName;
+ while (has_next_line())
+ {
+ QCString line = get_next_line();
+
+ int i;
+ if (line.stripWhiteSpace().startsWith("@"))
{
- if (!bibFile.isEmpty())
+ // assumption entry like: "@book { name," or "@book { name" (spaces optional)
+ int j = line.find('{');
+ // when no {, go hunting for it
+ while (j==-1 && has_next_line())
{
- f.setName(bibFile);
- if (!f.open(IO_ReadOnly))
- {
- err("could not open file %s for reading\n",bibFile.data());
- }
- QCString doc;
- QFileInfo fi(bibFile);
- QCString input(fi.size()+1);
- f.readBlock(input.rawData(),fi.size());
- f.close();
- input.at(fi.size())='\0';
- int p=0,s;
- while ((s=input.find('\n',p))!=-1)
+ line = get_next_line();
+ j = line.find('{');
+ }
+ // search for the name
+ citeName = "";
+ if (!end_of_input() && j!=-1) // to prevent something like "@manual ," and no { found
+ {
+ int k = line.find(',',j);
+ j++;
+ // found a line "@....{.....,...." or "@.....{....."
+ // ^=j ^=k ^=j k=-1
+ while (!end_of_input() && citeName.isEmpty())
{
- QCString line = input.mid(p,s-p);
- p=s+1;
-
- int i;
- if ((i = line.find("crossref")) != -1) /* assumption cross reference is on one line and the only item */
+ if (k!=-1)
+ {
+ citeName = line.mid((uint)(j),(uint)(k-j));
+ }
+ else
+ {
+ citeName = line.mid((uint)(j));
+ }
+ citeName = citeName.stripWhiteSpace();
+ j = 0;
+ if (citeName.isEmpty() && has_next_line())
{
- int j=line.find("{",i);
- int k=line.find("}",i);
- if (j!=-1 && k!=-1)
- {
- QCString label = line.mid(j+1,k-j-1);
- if (!m_entries.find(label)) Doxygen::citeDict->insert(label.data());
- }
+ line = get_next_line();
+ k = line.find(',');
}
}
}
+ //printf("citeName = #%s#\n",citeName.data());
}
- else if (!fi.exists())
+ else if ((i=line.find("crossref"))!=-1 && !citeName.isEmpty()) /* assumption cross reference is on one line and the only item */
{
- err("bib file %s not found!\n",bibFile.data());
+ int j = line.find('{',i);
+ int k = line.find('}',i);
+ if (j>i && k>j)
+ {
+ QCString crossrefName = line.mid((uint)(j+1),(uint)(k-j-1));
+ // check if the reference with the cross reference is used
+ // insert cross reference when cross reference has not yet been added.
+ if ((p->entries.find(citeName.data())!=p->entries.end()) &&
+ (p->entries.find(crossrefName.data())==p->entries.end())) // not found yet
+ {
+ insert(crossrefName);
+ }
+ }
}
- bibdata = citeDataList.next();
+ }
+}
+
+void CitationManager::generatePage()
+{
+ //printf("** CitationManager::generatePage() count=%d\n",m_ordering.count());
+
+ // do not generate an empty citations page
+ if (isEmpty()) return; // nothing to cite
+
+ bool citeDebug = Debug::isFlagSet(Debug::Cite);
+
+ // 0. add cross references from the bib files to the cite dictionary
+ QFile f;
+ const StringVector &citeDataList = Config_getList(CITE_BIB_FILES);
+ for (const auto &bibdata : citeDataList)
+ {
+ QCString bibFile = bibdata.c_str();
+ if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ insertCrossReferencesForBibFile(bibFile);
}
// 1. generate file with markers and citations to OUTPUT_DIRECTORY
QCString outputDir = Config_getString(OUTPUT_DIRECTORY);
QCString citeListFile = outputDir+"/citelist.doc";
f.setName(citeListFile);
- if (!f.open(IO_WriteOnly))
+ if (!f.open(IO_WriteOnly))
{
err("could not open file %s for writing\n",citeListFile.data());
}
FTextStream t(&f);
t << "<!-- BEGIN CITATIONS -->" << endl;
t << "<!--" << endl;
- QDictIterator<CiteInfo> it(m_entries);
- CiteInfo *ci;
- for (it.toFirst();(ci=it.current());++it)
+ for (const auto &it : p->entries)
{
- t << "\\citation{" << ci->label << "}" << endl;
+ t << "\\citation{" << it.second->label() << "}" << endl;
}
t << "-->" << endl;
t << "<!-- END CITATIONS -->" << endl;
@@ -209,12 +277,15 @@ void CiteDict::generatePage() const
QCString bibOutputDir = outputDir+"/"+bibTmpDir;
QCString bibOutputFiles = "";
QDir thisDir;
- thisDir.mkdir(bibOutputDir);
- bibdata = citeDataList.first();
+ if (!thisDir.exists(bibOutputDir) && !thisDir.mkdir(bibOutputDir))
+ {
+ err("Failed to create temporary output directory '%s', skipping citations\n",bibOutputDir.data());
+ return;
+ }
int i = 0;
- while (bibdata)
+ for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata;
+ QCString bibFile = bibdata.c_str();
if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
QFileInfo fi(bibFile);
if (fi.exists())
@@ -226,7 +297,6 @@ void CiteDict::generatePage() const
bibOutputFiles = bibOutputFiles + " " + bibTmpDir + bibTmpFile + QCString().setNum(i) + ".bib";
}
}
- bibdata = citeDataList.next();
}
QString oldDir = QDir::currentDirPath();
@@ -237,7 +307,7 @@ void CiteDict::generatePage() const
int exitCode;
Portable::sysTimerStop();
if ((exitCode=Portable::system("perl","\""+bib2xhtmlFile+"\" "+bibOutputFiles+" \""+
- citeListFile+"\"")) != 0)
+ citeListFile+"\"" + (citeDebug ? " -d" : ""))) != 0)
{
err("Problems running bibtex. Verify that the command 'perl --version' works from the command line. Exit code: %d\n",
exitCode);
@@ -248,29 +318,29 @@ void CiteDict::generatePage() const
// 6. read back the file
f.setName(citeListFile);
- if (!f.open(IO_ReadOnly))
+ if (!f.open(IO_ReadOnly))
{
err("could not open file %s for reading\n",citeListFile.data());
}
- bool insideBib=FALSE;
-
+
QCString doc;
QFileInfo fi(citeListFile);
QCString input(fi.size()+1);
f.readBlock(input.rawData(),fi.size());
f.close();
input.at(fi.size())='\0';
- int p=0,s;
+
+ bool insideBib=FALSE;
+ int pos=0,s;
//printf("input=[%s]\n",input.data());
- while ((s=input.find('\n',p))!=-1)
+ while ((s=input.find('\n',pos))!=-1)
{
- QCString line = input.mid(p,s-p);
- //printf("p=%d s=%d line=[%s]\n",p,s,line.data());
- p=s+1;
+ QCString line = input.mid((uint)pos,(uint)(s-pos));
+ //printf("pos=%d s=%d line=[%s]\n",pos,s,line.data());
+ pos=s+1;
if (line.find("<!-- BEGIN BIBLIOGRAPHY")!=-1) insideBib=TRUE;
else if (line.find("<!-- END BIBLIOGRAPH")!=-1) insideBib=FALSE;
- int i;
// determine text to use at the location of the @cite command
if (insideBib && (i=line.find("name=\"CITEREF_"))!=-1)
{
@@ -278,15 +348,18 @@ void CiteDict::generatePage() const
int k=line.find("]</a>");
if (j!=-1 && k!=-1)
{
- QCString label = line.mid(i+14,j-i-14);
- QCString number = line.mid(j+2,k-j-1);
+ uint ui=(uint)i;
+ uint uj=(uint)j;
+ uint uk=(uint)k;
+ QCString label = line.mid(ui+14,uj-ui-14);
+ QCString number = line.mid(uj+2,uk-uj-1);
label = substitute(substitute(label,"&ndash;","--"),"&mdash;","---");
- CiteInfo *ci = m_entries.find(label);
- //printf("label='%s' number='%s' => %p\n",label.data(),number.data(),ci);
- line = line.left(i+14) + label + line.right(line.length()-j);
- if (ci)
+ line = line.left(ui+14) + label + line.right(line.length()-uj);
+ auto it = p->entries.find(label.data());
+ //printf("label='%s' number='%s' => %p\n",label.data(),number.data(),it->second.get());
+ if (it!=p->entries.end())
{
- ci->text = number;
+ it->second->setText(number);
}
}
}
@@ -295,24 +368,21 @@ void CiteDict::generatePage() const
//printf("doc=[%s]\n",doc.data());
// 7. add it as a page
- addRelatedPage(CiteConsts::fileName,
- theTranslator->trCiteReferences(),doc,CiteConsts::fileName,1);
+ addRelatedPage(fileName(),theTranslator->trCiteReferences(),doc,fileName(),1,1);
- // 8. for latex we just copy the bib files to the output and let
+ // 8. for latex we just copy the bib files to the output and let
// latex do this work.
if (Config_getBool(GENERATE_LATEX))
{
// copy bib files to the latex output dir
- QStrList &citeDataList = Config_getList(CITE_BIB_FILES);
QCString latexOutputDir = Config_getString(LATEX_OUTPUT)+"/";
- int i = 0;
- const char *bibdata = citeDataList.first();
- while (bibdata)
+ i = 0;
+ for (const auto &bibdata : citeDataList)
{
- QCString bibFile = bibdata;
+ QCString bibFile = bibdata.c_str();
// Note: file can now have multiple dots
if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
- QFileInfo fi(bibFile);
+ fi.setFile(bibFile);
if (fi.exists())
{
if (!bibFile.isEmpty())
@@ -327,21 +397,78 @@ void CiteDict::generatePage() const
{
err("bib file %s not found!\n",bibFile.data());
}
- bibdata = citeDataList.next();
}
}
// 9. Remove temporary files
- thisDir.remove(citeListFile);
- thisDir.remove(doxygenBstFile);
- thisDir.remove(bib2xhtmlFile);
- // we might try to remove too many files as empty files didn't get a corresponding new file
- // but the remove function does not emit an error for it and we don't catch the error return
- // so no problem.
- for (unsigned int j = 1; j <= citeDataList.count(); j++)
+ if (!citeDebug)
+ {
+ thisDir.remove(citeListFile);
+ thisDir.remove(doxygenBstFile);
+ thisDir.remove(bib2xhtmlFile);
+ // we might try to remove too many files as empty files didn't get a corresponding new file
+ // but the remove function does not emit an error for it and we don't catch the error return
+ // so no problem.
+ for (size_t j = 1; j <= citeDataList.size(); j++)
+ {
+ thisDir.remove(bibOutputDir + bibTmpFile + QCString().setNum(static_cast<ulong>(j)) + ".bib");
+ }
+ thisDir.rmdir(bibOutputDir);
+ }
+}
+
+void CitationManager::writeLatexBibliography(FTextStream &t) const
+{
+ if (p->entries.empty()) return;
+
+ QCString style = Config_getString(LATEX_BIB_STYLE);
+ if (style.isEmpty())
+ {
+ style="plain";
+ }
+ QCString unit;
+ if (Config_getBool(COMPACT_LATEX))
+ {
+ unit = "section";
+ }
+ else
+ {
+ unit = "chapter";
+ }
+ t << "% Bibliography\n"
+ "\\newpage\n"
+ "\\phantomsection\n";
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ if (!pdfHyperlinks)
+ {
+ t << "\\clearemptydoublepage\n";
+ t << "\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trCiteReferences() << "}\n";
+ }
+ t << "\\bibliographystyle{" << style << "}\n"
+ "\\bibliography{";
+ const StringVector &citeDataList = Config_getList(CITE_BIB_FILES);
+ int i = 0;
+ for (const auto &bibdata : citeDataList)
+ {
+ QCString bibFile = bibdata.c_str();
+ // Note: file can now have multiple dots
+ if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+ QFileInfo fi(bibFile);
+ if (fi.exists())
+ {
+ if (!bibFile.isEmpty())
+ {
+ if (i) t << ",";
+ i++;
+ t << bibTmpFile << QCString().setNum(i);
+ }
+ }
+ }
+ t << "}\n";
+ if (pdfHyperlinks)
{
- thisDir.remove(bibOutputDir + bibTmpFile + QCString().setNum(j) + ".bib");
+ t << "\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trCiteReferences() << "}\n";
}
- thisDir.rmdir(bibOutputDir);
+ t << "\n";
}
diff --git a/src/cite.h b/src/cite.h
index 1c59553..9fea954 100644
--- a/src/cite.h
+++ b/src/cite.h
@@ -1,13 +1,11 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 2011 by Dimitri van Heesch
+ * Copyright (C) 2020 by Dimitri van Heesch
* Based on a patch by David Munger
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,83 +14,65 @@
*
*/
-#ifndef CITEDB_H
-#define CITEDB_H
+#ifndef CITE_H
+#define CITE_H
-#include <qdict.h>
+#include <memory>
-class FTextStream;
+#include <qcstring.h>
-/// String constants for citations
-struct CiteConsts
-{
- static const QCString fileName;
- static const QCString anchorPrefix;
-};
+class FTextStream;
/// Citation-related data.
struct CiteInfo
{
- CiteInfo(const char *label_, const char *text_=0, const char *fullText_=0,
- const char *ref_=0) :
- label(label_), text(text_), fullText(fullText_), ref(ref_)
- { }
-
- CiteInfo(const CiteInfo &o)
- { label=o.label.copy(); text=o.text.copy(); fullText=o.fullText.copy(); ref=o.ref.copy(); }
-
- QCString label;
- QCString text;
- QCString fullText;
- QCString ref;
-
+ virtual ~CiteInfo() {}
+ virtual QCString label() const = 0;
+ virtual QCString text() const = 0;
};
/**
- * @brief Cite database access class.
- * @details This class provides access do the database of bibliographic
+ * @brief Citation manager class.
+ * @details This class provides access do the database of bibliographic
* references through the bibtex backend.
*/
-class CiteDict
+class CitationManager
{
public:
- /** Create the database, with an expected maximum of \a size entries */
- CiteDict(int size);
-
-// /** Resolve references to citations */
-// void resolve();
+ static CitationManager &instance();
/** Insert a citation identified by \a label into the database */
void insert(const char *label);
- /** Return the citation info for a given \a label */
- CiteInfo *find(const char *label) const;
+ /** Return the citation info for a given \a label.
+ * Ownership of the info stays with the manager.
+ */
+ const CiteInfo *find(const char *label) const;
/** Generate the citations page */
- void generatePage() const;
+ void generatePage();
/** clears the database */
void clear();
- /** return TRUE if there are no citations.
- * Only valid after calling resolve()
+ /** return TRUE if there are no citations.
*/
bool isEmpty() const;
- /** writes the latex code for the standard bibliography
- * section to text stream \a t
+ /** writes the latex code for the standard bibliography
+ * section to text stream \a t
*/
- void writeLatexBibliography(FTextStream &t);
+ void writeLatexBibliography(FTextStream &t) const;
+
+ const char *fileName() const;
+ const char *anchorPrefix() const;
private:
-// bool writeAux();
-// bool writeBst();
-// bool execute();
-// void parse();
-// void clean();
- QDict<CiteInfo> m_entries;
-// QList<QCString> m_ordering;
- QCString m_baseFileName;
+ /** Create the database, with an expected maximum of \a size entries */
+ CitationManager();
+ void insertCrossReferencesForBibFile(const QCString &bibFile);
+ struct Private;
+ std::unique_ptr<Private> p;
};
-#endif
+#endif // CITE_H
diff --git a/src/clangparser.cpp b/src/clangparser.cpp
index f6020dd..4129d55 100644
--- a/src/clangparser.cpp
+++ b/src/clangparser.cpp
@@ -1,6 +1,7 @@
#include "clangparser.h"
#include "settings.h"
#include <stdio.h>
+#include <mutex>
#if USE_LIBCLANG
#include <clang-c/Index.h>
@@ -20,17 +21,15 @@
#include "membername.h"
#include "filename.h"
#include "tooltip.h"
-
-static Definition *g_currentDefinition=0;
-static MemberDef *g_currentMemberDef=0;
-static uint g_currentLine=0;
-static bool g_searchForBody=FALSE;
-static bool g_insideBody=FALSE;
-static uint g_bracketCount=0;
#endif
+//--------------------------------------------------------------------------
+
+static std::mutex g_clangMutex;
+
ClangParser *ClangParser::instance()
{
+ std::lock_guard<std::mutex> lock(g_clangMutex);
if (!s_instance) s_instance = new ClangParser;
return s_instance;
}
@@ -40,29 +39,9 @@ ClangParser *ClangParser::s_instance = 0;
//--------------------------------------------------------------------------
#if USE_LIBCLANG
-class ClangParser::Private
-{
- public:
- enum DetectedLang { Detected_Cpp, Detected_ObjC, Detected_ObjCpp };
- Private() : tu(0), tokens(0), numTokens(0), cursors(0),
- ufs(0), sources(0), numFiles(0), fileMapping(257),
- detectedLang(Detected_Cpp)
- { fileMapping.setAutoDelete(TRUE); }
- int getCurrentTokenLine();
- CXIndex index;
- CXTranslationUnit tu;
- QCString fileName;
- CXToken *tokens;
- uint numTokens;
- CXCursor *cursors;
- uint curLine;
- uint curToken;
- CXUnsavedFile *ufs;
- QCString *sources;
- uint numFiles;
- QDict<uint> fileMapping;
- DetectedLang detectedLang;
-};
+static std::mutex g_docCrossReferenceMutex;
+
+enum class DetectedLang { Cpp, ObjC, ObjCpp };
static QCString detab(const QCString &s)
{
@@ -84,7 +63,7 @@ static QCString detab(const QCString &s)
int stop = tabSize - (col%tabSize);
//printf("expand at %d stop=%d\n",col,stop);
col+=stop;
- while (stop--) out.addChar(' ');
+ while (stop--) out.addChar(' ');
}
break;
case '\n': // reset column counter
@@ -118,116 +97,140 @@ static QCString detab(const QCString &s)
return out.get();
}
-/** Callback function called for each include in a translation unit */
-static void inclusionVisitor(CXFile includedFile,
- CXSourceLocation* /*inclusionStack*/,
- unsigned /*includeLen*/,
- CXClientData clientData)
+static QCString keywordToType(const char *keyword)
{
- QDict<void> *fileDict = (QDict<void> *)clientData;
- CXString incFileName = clang_getFileName(includedFile);
- //printf("--- file %s includes %s\n",fileName,clang_getCString(incFileName));
- fileDict->insert(clang_getCString(incFileName),(void*)0x8);
- clang_disposeString(incFileName);
+ static const StringUnorderedSet flowKeywords({
+ "break", "case", "catch", "continue", "default", "do",
+ "else", "finally", "for", "foreach", "for each", "goto",
+ "if", "return", "switch", "throw", "throws", "try",
+ "while", "@try", "@catch", "@finally" });
+ static const StringUnorderedSet typeKeywords({
+ "bool", "char", "double", "float", "int", "long", "object",
+ "short", "signed", "unsigned", "void", "wchar_t", "size_t",
+ "boolean", "id", "SEL", "string", "nullptr" });
+ if (flowKeywords.find(keyword)!=flowKeywords.end()) return "keywordflow";
+ if (typeKeywords.find(keyword)!=typeKeywords.end()) return "keywordtype";
+ return "keyword";
}
-/** filter the \a files and only keep those that are found as include files
- * within the current translation unit.
- * @param[in,out] files The list of files to filter.
- */
-void ClangParser::determineInputFilesInSameTu(QStrList &files)
+
+//--------------------------------------------------------------------------
+
+class ClangTUParser::Private
{
- // put the files in this translation unit in a dictionary
- QDict<void> incFound(257);
- clang_getInclusions(p->tu,
- inclusionVisitor,
- (CXClientData)&incFound
- );
- // create a new filtered file list
- QStrList resultIncludes;
- QStrListIterator it2(files);
- for (it2.toFirst();it2.current();++it2)
- {
- if (incFound.find(it2.current()))
- {
- resultIncludes.append(it2.current());
- }
- }
- // replace the original list
- files=resultIncludes;
+ public:
+ Private(const ClangParser &p,const FileDef *fd)
+ : parser(p), fileDef(fd) {}
+ const ClangParser &parser;
+ const FileDef *fileDef;
+ CXIndex index = 0;
+ uint curToken = 0;
+ DetectedLang detectedLang = DetectedLang::Cpp;
+ uint numFiles = 0;
+ std::vector<QCString> sources;
+ std::vector<CXUnsavedFile> ufs;
+ std::vector<CXCursor> cursors;
+ std::unordered_map<std::string,uint> fileMapping;
+ CXTranslationUnit tu = 0;
+ CXToken *tokens = 0;
+ uint numTokens = 0;
+ StringVector filesInSameTU;
+
+ // state while parsing sources
+ const MemberDef *currentMemberDef=0;
+ uint currentLine=0;
+ bool searchForBody=FALSE;
+ bool insideBody=FALSE;
+ uint bracketCount=0;
+};
+
+ClangTUParser::ClangTUParser(const ClangParser &parser,const FileDef *fd)
+ : p(std::make_unique<Private>(parser,fd))
+{
+ //printf("ClangTUParser::ClangTUParser() this=%p\n",this);
}
-void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit)
+StringVector ClangTUParser::filesInSameTU() const
{
- static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
- static QStrList &includePath = Config_getList(INCLUDE_PATH);
- static QStrList clangOptions = Config_getList(CLANG_OPTIONS);
- static QCString clangCompileDatabase = Config_getString(CLANG_DATABASE_PATH);
+ return p->filesInSameTU;
+}
+
+void ClangTUParser::parse()
+{
+ //printf("ClangTUParser::parse() this=%p\n",this);
+ QCString fileName = p->fileDef->absFilePath();
+ p->fileDef->getAllIncludeFilesRecursively(p->filesInSameTU);
+ //printf("ClangTUParser::ClangTUParser(fileName=%s,#filesInSameTU=%d)\n",
+ // qPrint(fileName),(int)p->filesInSameTU.size());
+ bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
+ bool clangIncludeInputPaths = Config_getBool(CLANG_ADD_INC_PATHS);
+ bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
+ const StringVector &includePath = Config_getList(INCLUDE_PATH);
+ const StringVector &clangOptions = Config_getList(CLANG_OPTIONS);
if (!clangAssistedParsing) return;
//printf("ClangParser::start(%s)\n",fileName);
- p->fileName = fileName;
+ assert(p->index==0);
+ assert(p->tokens==0);
+ assert(p->numTokens==0);
p->index = clang_createIndex(0, 0);
- p->curLine = 1;
p->curToken = 0;
- QDictIterator<void> di(Doxygen::inputPaths);
+ p->cursors.clear();
int argc=0;
- std::string error;
- // load a clang compilation database (https://clang.llvm.org/docs/JSONCompilationDatabase.html)
- // this only needs to be loaded once, and could be refactored to a higher level function
- static std::unique_ptr<clang::tooling::CompilationDatabase> db =
- clang::tooling::CompilationDatabase::loadFromDirectory(clangCompileDatabase.data(), error);
- int clang_option_len = 0;
+ size_t clang_option_len = 0;
std::vector<clang::tooling::CompileCommand> command;
- if (qstrcmp(clangCompileDatabase, "0") != 0)
+ if (p->parser.database()!=nullptr)
{
- if (db == nullptr)
- {
- // user specified a path, but DB file was not found
- err("%s using clang compilation database path of: \"%s\"\n", error.c_str(),
- clangCompileDatabase.data());
- }
- else
- {
- // check if the file we are parsing is in the DB
- command = db->getCompileCommands(fileName);
- if (!command.empty() )
- {
- // it's possible to have multiple entries for the same file, so use the last entry
- clang_option_len = command[command.size()-1].CommandLine.size();
- }
- }
+ // check if the file we are parsing is in the DB
+ command = p->parser.database()->getCompileCommands(fileName.data());
+ if (!command.empty() )
+ {
+ // it's possible to have multiple entries for the same file, so use the last entry
+ clang_option_len = command[command.size()-1].CommandLine.size();
+ }
}
- char **argv = (char**)malloc(sizeof(char*)*(4+Doxygen::inputPaths.count()+includePath.count()+clangOptions.count()+clang_option_len));
+ char **argv = (char**)malloc(sizeof(char*)*
+ (4+Doxygen::inputPaths.size()+
+ includePath.size()+
+ clangOptions.size()+
+ clang_option_len));
if (!command.empty() )
{
- std::vector<std::string> options = command[command.size()-1].CommandLine;
- // copy each compiler option used from the database. Skip the first which is compiler exe.
- for (auto option = options.begin()+1; option != options.end(); option++)
- {
- argv[argc++] = qstrdup(option->c_str());
- }
- // this extra addition to argv is accounted for as we are skipping the first entry in
- argv[argc++]=qstrdup("-w"); // finally, turn off warnings.
+ std::vector<std::string> options = command[command.size()-1].CommandLine;
+ // copy each compiler option used from the database. Skip the first which is compiler exe.
+ for (auto option = options.begin()+1; option != options.end(); option++)
+ {
+ argv[argc++] = qstrdup(option->c_str());
+ }
+ // user specified options
+ for (size_t i=0;i<clangOptions.size();i++)
+ {
+ argv[argc++]=qstrdup(clangOptions[i].c_str());
+ }
+ // this extra addition to argv is accounted for as we are skipping the first entry in
+ argv[argc++]=qstrdup("-w"); // finally, turn off warnings.
}
else
{
// add include paths for input files
- for (di.toFirst();di.current();++di,++argc)
+ if (clangIncludeInputPaths)
{
- QCString inc = QCString("-I")+di.currentKey();
- argv[argc]=qstrdup(inc.data());
- //printf("argv[%d]=%s\n",argc,argv[argc]);
+ for (const std::string &path : Doxygen::inputPaths)
+ {
+ QCString inc = QCString("-I")+path.data();
+ argv[argc++]=qstrdup(inc.data());
+ //printf("argv[%d]=%s\n",argc,argv[argc]);
+ }
}
// add external include paths
- for (uint i=0;i<includePath.count();i++)
+ for (size_t i=0;i<includePath.size();i++)
{
- QCString inc = QCString("-I")+includePath.at(i);
+ QCString inc = QCString("-I")+includePath[i].c_str();
argv[argc++]=qstrdup(inc.data());
}
// user specified options
- for (uint i=0;i<clangOptions.count();i++)
+ for (size_t i=0;i<clangOptions.size();i++)
{
- argv[argc++]=qstrdup(clangOptions.at(i));
+ argv[argc++]=qstrdup(clangOptions[i].c_str());
}
// extra options
argv[argc++]=qstrdup("-ferror-limit=0");
@@ -238,188 +241,148 @@ void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit)
// we use the source file to detected the language. Detection will fail if you
// pass a bunch of .h files containing ObjC code, and no sources :-(
SrcLangExt lang = getLanguageFromFileName(fileName);
- if (lang==SrcLangExt_ObjC || p->detectedLang!=ClangParser::Private::Detected_Cpp)
+ if (lang==SrcLangExt_ObjC || p->detectedLang!=DetectedLang::Cpp)
{
QCString fn = fileName;
- if (p->detectedLang==ClangParser::Private::Detected_Cpp &&
+ if (p->detectedLang!=DetectedLang::Cpp &&
(fn.right(4).lower()==".cpp" || fn.right(4).lower()==".cxx" ||
fn.right(3).lower()==".cc" || fn.right(2).lower()==".c"))
{ // fall back to C/C++ once we see an extension that indicates this
- p->detectedLang = ClangParser::Private::Detected_Cpp;
+ p->detectedLang = DetectedLang::Cpp;
}
else if (fn.right(3).lower()==".mm") // switch to Objective C++
{
- p->detectedLang = ClangParser::Private::Detected_ObjCpp;
+ p->detectedLang = DetectedLang::ObjCpp;
}
else if (fn.right(2).lower()==".m") // switch to Objective C
{
- p->detectedLang = ClangParser::Private::Detected_ObjC;
+ p->detectedLang = DetectedLang::ObjC;
}
}
- switch(p->detectedLang)
+ switch (p->detectedLang)
{
- case ClangParser::Private::Detected_Cpp:
- argv[argc++]=qstrdup("c++");
- break;
- case ClangParser::Private::Detected_ObjC:
- argv[argc++]=qstrdup("objective-c");
- break;
- case ClangParser::Private::Detected_ObjCpp:
- argv[argc++]=qstrdup("objective-c++");
- break;
+ case DetectedLang::Cpp: argv[argc++]=qstrdup("c++"); break;
+ case DetectedLang::ObjC: argv[argc++]=qstrdup("objective-c"); break;
+ case DetectedLang::ObjCpp: argv[argc++]=qstrdup("objective-c++"); break;
}
// provide the input and and its dependencies as unsaved files so we can
// pass the filtered versions
argv[argc++]=qstrdup(fileName);
}
- static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
//printf("source %s ----------\n%s\n-------------\n\n",
// fileName,p->source.data());
- uint numUnsavedFiles = filesInTranslationUnit.count()+1;
+ int numUnsavedFiles = static_cast<int>(p->filesInSameTU.size()+1);
p->numFiles = numUnsavedFiles;
- p->sources = new QCString[numUnsavedFiles];
- p->ufs = new CXUnsavedFile[numUnsavedFiles];
+ p->sources.resize(numUnsavedFiles);
+ p->ufs.resize(numUnsavedFiles);
p->sources[0] = detab(fileToString(fileName,filterSourceFiles,TRUE));
p->ufs[0].Filename = qstrdup(fileName);
p->ufs[0].Contents = p->sources[0].data();
p->ufs[0].Length = p->sources[0].length();
- QStrListIterator it(filesInTranslationUnit);
- uint i=1;
- for (it.toFirst();it.current() && i<numUnsavedFiles;++it,i++)
- {
- p->fileMapping.insert(it.current(),new uint(i));
- p->sources[i] = detab(fileToString(it.current(),filterSourceFiles,TRUE));
- p->ufs[i].Filename = qstrdup(it.current());
+ p->fileMapping.insert({fileName.data(),0});
+ int i=1;
+ for (auto it = p->filesInSameTU.begin();
+ it != p->filesInSameTU.end() && i<numUnsavedFiles;
+ ++it, i++)
+ {
+ p->fileMapping.insert({it->c_str(),static_cast<uint>(i)});
+ p->sources[i] = detab(fileToString(it->c_str(),filterSourceFiles,TRUE));
+ p->ufs[i].Filename = qstrdup(it->c_str());
p->ufs[i].Contents = p->sources[i].data();
p->ufs[i].Length = p->sources[i].length();
}
// let libclang do the actual parsing
p->tu = clang_parseTranslationUnit(p->index, 0,
- argv, argc, p->ufs, numUnsavedFiles,
+ argv, argc, p->ufs.data(), numUnsavedFiles,
CXTranslationUnit_DetailedPreprocessingRecord);
+ //printf(" tu=%p\n",p->tu);
// free arguments
- for (int i=0;i<argc;++i)
+ for (i=0;i<argc;++i)
{
- free(argv[i]);
+ delete[](argv[i]);
}
free(argv);
if (p->tu)
{
- // filter out any includes not found by the clang parser
- determineInputFilesInSameTu(filesInTranslationUnit);
-
// show any warnings that the compiler produced
- for (uint i=0, n=clang_getNumDiagnostics(p->tu); i!=n; ++i)
+ int n=clang_getNumDiagnostics(p->tu);
+ for (i=0; i!=n; ++i)
{
- CXDiagnostic diag = clang_getDiagnostic(p->tu, i);
+ CXDiagnostic diag = clang_getDiagnostic(p->tu, i);
CXString string = clang_formatDiagnostic(diag,
- clang_defaultDiagnosticDisplayOptions());
+ clang_defaultDiagnosticDisplayOptions());
err("%s [clang]\n",clang_getCString(string));
clang_disposeString(string);
clang_disposeDiagnostic(diag);
}
-
- // create a source range for the given file
- QFileInfo fi(fileName);
- CXFile f = clang_getFile(p->tu, fileName);
- CXSourceLocation fileBegin = clang_getLocationForOffset(p->tu, f, 0);
- CXSourceLocation fileEnd = clang_getLocationForOffset(p->tu, f, p->ufs[0].Length);
- CXSourceRange fileRange = clang_getRange(fileBegin, fileEnd);
-
- // produce a token stream for the file
- clang_tokenize(p->tu,fileRange,&p->tokens,&p->numTokens);
-
- // produce cursors for each token in the stream
- p->cursors=new CXCursor[p->numTokens];
- clang_annotateTokens(p->tu,p->tokens,p->numTokens,p->cursors);
}
else
{
+ err("clang: Failed to parse translation unit %s\n",qPrint(fileName));
+ }
+}
+
+ClangTUParser::~ClangTUParser()
+{
+ //printf("ClangTUParser::~ClangTUParser() this=%p\n",this);
+ static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
+ if (!clangAssistedParsing) return;
+ if (p->tu)
+ {
+ p->cursors.clear();
+ clang_disposeTokens(p->tu,p->tokens,p->numTokens);
+ clang_disposeTranslationUnit(p->tu);
+ clang_disposeIndex(p->index);
+ p->fileMapping.clear();
p->tokens = 0;
p->numTokens = 0;
- p->cursors = 0;
- err("clang: Failed to parse translation unit %s\n",fileName);
}
+ for (uint i=0;i<p->numFiles;i++)
+ {
+ delete[] p->ufs[i].Filename;
+ }
+ p->ufs.clear();
+ p->sources.clear();
+ p->numFiles = 0;
+ p->tu = 0;
}
-void ClangParser::switchToFile(const char *fileName)
+void ClangTUParser::switchToFile(const FileDef *fd)
{
+ //printf("ClangTUParser::switchToFile(%s) this=%p\n",qPrint(fd->absFilePath()),this);
if (p->tu)
{
- delete[] p->cursors;
+ p->cursors.clear();
clang_disposeTokens(p->tu,p->tokens,p->numTokens);
p->tokens = 0;
p->numTokens = 0;
- p->cursors = 0;
- QFileInfo fi(fileName);
- CXFile f = clang_getFile(p->tu, fileName);
- uint *pIndex=p->fileMapping.find(fileName);
- if (pIndex && *pIndex<p->numFiles)
+ CXFile f = clang_getFile(p->tu, fd->absFilePath());
+ auto it = p->fileMapping.find(fd->absFilePath().data());
+ if (it!=p->fileMapping.end() && it->second < p->numFiles)
{
- uint i=*pIndex;
+ uint i = it->second;
//printf("switchToFile %s: len=%ld\n",fileName,p->ufs[i].Length);
CXSourceLocation fileBegin = clang_getLocationForOffset(p->tu, f, 0);
CXSourceLocation fileEnd = clang_getLocationForOffset(p->tu, f, p->ufs[i].Length);
CXSourceRange fileRange = clang_getRange(fileBegin, fileEnd);
clang_tokenize(p->tu,fileRange,&p->tokens,&p->numTokens);
- p->cursors=new CXCursor[p->numTokens];
- clang_annotateTokens(p->tu,p->tokens,p->numTokens,p->cursors);
-
- p->curLine = 1;
+ p->cursors.resize(p->numTokens);
+ clang_annotateTokens(p->tu,p->tokens,p->numTokens,p->cursors.data());
p->curToken = 0;
}
else
{
- err("clang: Failed to find input file %s in mapping\n",fileName);
+ err("clang: Failed to find input file %s in mapping\n",qPrint(fd->absFilePath()));
}
}
}
-void ClangParser::finish()
-{
- static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
- if (!clangAssistedParsing) return;
- if (p->tu)
- {
- //printf("ClangParser::finish()\n");
- delete[] p->cursors;
- clang_disposeTokens(p->tu,p->tokens,p->numTokens);
- clang_disposeTranslationUnit(p->tu);
- clang_disposeIndex(p->index);
- p->fileMapping.clear();
- p->tokens = 0;
- p->numTokens = 0;
- p->cursors = 0;
- }
- for (uint i=0;i<p->numFiles;i++)
- {
- free((void *)p->ufs[i].Filename);
- }
- delete[] p->ufs;
- delete[] p->sources;
- p->ufs = 0;
- p->sources = 0;
- p->numFiles = 0;
- p->tu = 0;
-}
-
-int ClangParser::Private::getCurrentTokenLine()
-{
- uint l, c;
- if (numTokens==0) return 1;
- // guard against filters that reduce the number of lines
- if (curToken>=numTokens) curToken=numTokens-1;
- CXSourceLocation start = clang_getTokenLocation(tu,tokens[curToken]);
- clang_getSpellingLocation(start, 0, &l, &c, 0);
- return l;
-}
-
-QCString ClangParser::lookup(uint line,const char *symbol)
+QCString ClangTUParser::lookup(uint line,const char *symbol)
{
//printf("ClangParser::lookup(%d,%s)\n",line,symbol);
QCString result;
@@ -427,19 +390,30 @@ QCString ClangParser::lookup(uint line,const char *symbol)
static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
if (!clangAssistedParsing) return result;
+ auto getCurrentTokenLine = [=]() -> uint
+ {
+ uint l, c;
+ if (p->numTokens==0) return 1;
+ // guard against filters that reduce the number of lines
+ if (p->curToken>=p->numTokens) p->curToken=p->numTokens-1;
+ CXSourceLocation start = clang_getTokenLocation(p->tu,p->tokens[p->curToken]);
+ clang_getSpellingLocation(start, 0, &l, &c, 0);
+ return l;
+ };
+
int sl = strlen(symbol);
- uint l = p->getCurrentTokenLine();
+ uint l = getCurrentTokenLine();
while (l>=line && p->curToken>0)
{
if (l==line) // already at the right line
{
p->curToken--; // linear search to start of the line
- l = p->getCurrentTokenLine();
+ l = getCurrentTokenLine();
}
- else
+ else
{
p->curToken/=2; // binary search backward
- l = p->getCurrentTokenLine();
+ l = getCurrentTokenLine();
}
}
bool found=FALSE;
@@ -464,7 +438,7 @@ QCString ClangParser::lookup(uint line,const char *symbol)
{
break; // end of token stream
}
- l = p->getCurrentTokenLine();
+ l = getCurrentTokenLine();
clang_disposeString(tokenString);
tokenString = clang_getTokenSpelling(p->tu, p->tokens[p->curToken]);
ts = clang_getCString(tokenString);
@@ -501,7 +475,7 @@ QCString ClangParser::lookup(uint line,const char *symbol)
p->curToken++;
if (p->curToken<p->numTokens)
{
- l = p->getCurrentTokenLine();
+ l = getCurrentTokenLine();
}
}
//if (!found)
@@ -515,78 +489,23 @@ QCString ClangParser::lookup(uint line,const char *symbol)
return result;
}
-static QCString keywordToType(const char *keyword)
-{
- static bool init=TRUE;
- static QDict<void> flowKeywords(47);
- static QDict<void> typeKeywords(47);
- if (init)
- {
- flowKeywords.insert("break",(void*)0x8);
- flowKeywords.insert("case",(void*)0x8);
- flowKeywords.insert("catch",(void*)0x8);
- flowKeywords.insert("continue",(void*)0x8);
- flowKeywords.insert("default",(void*)0x8);
- flowKeywords.insert("do",(void*)0x8);
- flowKeywords.insert("else",(void*)0x8);
- flowKeywords.insert("finally",(void*)0x8);
- flowKeywords.insert("for",(void*)0x8);
- flowKeywords.insert("foreach",(void*)0x8);
- flowKeywords.insert("for each",(void*)0x8);
- flowKeywords.insert("goto",(void*)0x8);
- flowKeywords.insert("if",(void*)0x8);
- flowKeywords.insert("return",(void*)0x8);
- flowKeywords.insert("switch",(void*)0x8);
- flowKeywords.insert("throw",(void*)0x8);
- flowKeywords.insert("throws",(void*)0x8);
- flowKeywords.insert("try",(void*)0x8);
- flowKeywords.insert("while",(void*)0x8);
- flowKeywords.insert("@try",(void*)0x8);
- flowKeywords.insert("@catch",(void*)0x8);
- flowKeywords.insert("@finally",(void*)0x8);
-
- typeKeywords.insert("bool",(void*)0x8);
- typeKeywords.insert("char",(void*)0x8);
- typeKeywords.insert("double",(void*)0x8);
- typeKeywords.insert("float",(void*)0x8);
- typeKeywords.insert("int",(void*)0x8);
- typeKeywords.insert("long",(void*)0x8);
- typeKeywords.insert("object",(void*)0x8);
- typeKeywords.insert("short",(void*)0x8);
- typeKeywords.insert("signed",(void*)0x8);
- typeKeywords.insert("unsigned",(void*)0x8);
- typeKeywords.insert("void",(void*)0x8);
- typeKeywords.insert("wchar_t",(void*)0x8);
- typeKeywords.insert("size_t",(void*)0x8);
- typeKeywords.insert("boolean",(void*)0x8);
- typeKeywords.insert("id",(void*)0x8);
- typeKeywords.insert("SEL",(void*)0x8);
- typeKeywords.insert("string",(void*)0x8);
- typeKeywords.insert("nullptr",(void*)0x8);
- init=FALSE;
- }
- if (flowKeywords[keyword]) return "keywordflow";
- if (typeKeywords[keyword]) return "keywordtype";
- return "keyword";
-}
-static void writeLineNumber(CodeOutputInterface &ol,FileDef *fd,uint line)
+void ClangTUParser::writeLineNumber(CodeOutputInterface &ol,const FileDef *fd,uint line)
{
- Definition *d = fd ? fd->getSourceDefinition(line) : 0;
+ const Definition *d = fd ? fd->getSourceDefinition(line) : 0;
if (d && d->isLinkable())
{
- g_currentDefinition=d;
- g_currentLine=line;
- MemberDef *md = fd->getSourceMember(line);
+ p->currentLine=line;
+ const MemberDef *md = fd->getSourceMember(line);
if (md && md->isLinkable()) // link to member
{
- if (g_currentMemberDef!=md) // new member, start search for body
+ if (p->currentMemberDef!=md) // new member, start search for body
{
- g_searchForBody=TRUE;
- g_insideBody=FALSE;
- g_bracketCount=0;
+ p->searchForBody=TRUE;
+ p->insideBody=FALSE;
+ p->bracketCount=0;
}
- g_currentMemberDef=md;
+ p->currentMemberDef=md;
ol.writeLineNumber(md->getReference(),
md->getOutputFileBase(),
md->anchor(),
@@ -594,7 +513,7 @@ static void writeLineNumber(CodeOutputInterface &ol,FileDef *fd,uint line)
}
else // link to compound
{
- g_currentMemberDef=0;
+ p->currentMemberDef=0;
ol.writeLineNumber(d->getReference(),
d->getOutputFileBase(),
d->anchor(),
@@ -617,8 +536,8 @@ static void writeLineNumber(CodeOutputInterface &ol,FileDef *fd,uint line)
//printf("writeLineNumber(%d) g_searchForBody=%d\n",line,g_searchForBody);
}
-static void codifyLines(CodeOutputInterface &ol,FileDef *fd,const char *text,
- uint &line,uint &column,const char *fontClass=0)
+void ClangTUParser::codifyLines(CodeOutputInterface &ol,const FileDef *fd,const char *text,
+ uint &line,uint &column,const char *fontClass)
{
if (fontClass) ol.startFontClass(fontClass);
const char *p=text,*sp=p;
@@ -653,13 +572,13 @@ static void codifyLines(CodeOutputInterface &ol,FileDef *fd,const char *text,
if (fontClass) ol.endFontClass();
}
-static void writeMultiLineCodeLink(CodeOutputInterface &ol,
- FileDef *fd,uint &line,uint &column,
- Definition *d,
+void ClangTUParser::writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const FileDef *fd,uint &line,uint &column,
+ const Definition *d,
const char *text)
{
static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
- TooltipManager::instance()->addTooltip(d);
+ TooltipManager::instance().addTooltip(ol,d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
@@ -694,7 +613,7 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
}
}
-void ClangParser::linkInclude(CodeOutputInterface &ol,FileDef *fd,
+void ClangTUParser::linkInclude(CodeOutputInterface &ol,const FileDef *fd,
uint &line,uint &column,const char *text)
{
QCString incName = text;
@@ -702,17 +621,19 @@ void ClangParser::linkInclude(CodeOutputInterface &ol,FileDef *fd,
FileDef *ifd=0;
if (!incName.isEmpty())
{
- FileName *fn = Doxygen::inputNameDict->find(incName);
+ FileName *fn = Doxygen::inputNameLinkedMap->find(incName);
if (fn)
{
- bool found=false;
- FileNameIterator fni(*fn);
- // for each include name
- for (fni.toFirst();!found && (ifd=fni.current());++fni)
+ // see if this source file actually includes the file
+ auto it = std::find_if(fn->begin(),
+ fn->end(),
+ [&fd](const auto &ifd)
+ { return fd->isIncluded(ifd->absFilePath()); });
+ bool found = it!=fn->end();
+ if (found)
{
- // see if this source file actually includes the file
- found = fd->isIncluded(ifd->absFilePath());
- //printf(" include file %s found=%d\n",ifd->absFilePath().data(),found);
+ //printf(" include file %s found=%d\n",(*it)->absFilePath().data(),found);
+ ifd = it->get();
}
}
}
@@ -726,19 +647,17 @@ void ClangParser::linkInclude(CodeOutputInterface &ol,FileDef *fd,
}
}
-void ClangParser::linkMacro(CodeOutputInterface &ol,FileDef *fd,
+void ClangTUParser::linkMacro(CodeOutputInterface &ol,const FileDef *fd,
uint &line,uint &column,const char *text)
{
- MemberName *mn=Doxygen::functionNameSDict->find(text);
+ MemberName *mn=Doxygen::functionNameLinkedMap->find(text);
if (mn)
{
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
if (md->isDefine())
{
- writeMultiLineCodeLink(ol,fd,line,column,md,text);
+ writeMultiLineCodeLink(ol,fd,line,column,md.get(),text);
return;
}
}
@@ -747,7 +666,7 @@ void ClangParser::linkMacro(CodeOutputInterface &ol,FileDef *fd,
}
-void ClangParser::linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
+void ClangTUParser::linkIdentifier(CodeOutputInterface &ol,const FileDef *fd,
uint &line,uint &column,const char *text,int tokenIndex)
{
CXCursor c = p->cursors[tokenIndex];
@@ -759,12 +678,17 @@ void ClangParser::linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
CXCursor t = clang_getSpecializedCursorTemplate(c);
if (!clang_Cursor_isNull(t) && !clang_equalCursors(t,c))
{
- c=t; // link to template
+ c=t; // link to template
}
CXString usr = clang_getCursorUSR(c);
const char *usrStr = clang_getCString(usr);
- Definition *d = usrStr ? Doxygen::clangUsrMap->find(usrStr) : 0;
+ const Definition *d = 0;
+ auto kv = Doxygen::clangUsrMap->find(usrStr);
+ if (kv!=Doxygen::clangUsrMap->end())
+ {
+ d = kv->second;
+ }
//CXCursorKind kind = clang_getCursorKind(c);
//if (d==0)
//{
@@ -778,11 +702,12 @@ void ClangParser::linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
//}
if (d && d->isLinkable())
{
- if (g_insideBody &&
- g_currentMemberDef && d->definitionType()==Definition::TypeMember &&
- (g_currentMemberDef!=d || g_currentLine<line)) // avoid self-reference
+ if (p->insideBody &&
+ p->currentMemberDef && d->definitionType()==Definition::TypeMember &&
+ (p->currentMemberDef!=d || p->currentLine<line)) // avoid self-reference
{
- addDocCrossReference(g_currentMemberDef,dynamic_cast<MemberDef *>(d));
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(p->currentMemberDef),toMemberDefMutable(d));
}
writeMultiLineCodeLink(ol,fd,line,column,d,text);
}
@@ -793,45 +718,44 @@ void ClangParser::linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
clang_disposeString(usr);
}
-static void detectFunctionBody(const char *s)
+void ClangTUParser::detectFunctionBody(const char *s)
{
//printf("punct=%s g_searchForBody=%d g_insideBody=%d g_bracketCount=%d\n",
// s,g_searchForBody,g_insideBody,g_bracketCount);
- if (g_searchForBody && (qstrcmp(s,":")==0 || qstrcmp(s,"{")==0)) // start of 'body' (: is for constructor)
+ if (p->searchForBody && (qstrcmp(s,":")==0 || qstrcmp(s,"{")==0)) // start of 'body' (: is for constructor)
{
- g_searchForBody=FALSE;
- g_insideBody=TRUE;
+ p->searchForBody=FALSE;
+ p->insideBody=TRUE;
}
- else if (g_searchForBody && qstrcmp(s,";")==0) // declaration only
+ else if (p->searchForBody && qstrcmp(s,";")==0) // declaration only
{
- g_searchForBody=FALSE;
- g_insideBody=FALSE;
+ p->searchForBody=FALSE;
+ p->insideBody=FALSE;
}
- if (g_insideBody && qstrcmp(s,"{")==0) // increase scoping level
+ if (p->insideBody && qstrcmp(s,"{")==0) // increase scoping level
{
- g_bracketCount++;
+ p->bracketCount++;
}
- if (g_insideBody && qstrcmp(s,"}")==0) // decrease scoping level
+ if (p->insideBody && qstrcmp(s,"}")==0) // decrease scoping level
{
- g_bracketCount--;
- if (g_bracketCount<=0) // got outside of function body
+ p->bracketCount--;
+ if (p->bracketCount<=0) // got outside of function body
{
- g_insideBody=FALSE;
- g_bracketCount=0;
+ p->insideBody=FALSE;
+ p->bracketCount=0;
}
}
}
-void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd)
+void ClangTUParser::writeSources(CodeOutputInterface &ol,const FileDef *fd)
{
// (re)set global parser state
- g_currentDefinition=0;
- g_currentMemberDef=0;
- g_currentLine=0;
- g_searchForBody=FALSE;
- g_insideBody=FALSE;
- g_bracketCount=0;
+ p->currentMemberDef=0;
+ p->currentLine=0;
+ p->searchForBody=FALSE;
+ p->insideBody=FALSE;
+ p->bracketCount=0;
unsigned int line=1,column=1;
QCString lineNumber,lineAnchor;
@@ -843,13 +767,13 @@ void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd)
unsigned int l, c;
clang_getSpellingLocation(start, 0, &l, &c, 0);
if (l > line) column = 1;
- while (line<l)
- {
- line++;
+ while (line<l)
+ {
+ line++;
ol.endCodeLine();
ol.startCodeLine(TRUE);
writeLineNumber(ol,fd,line);
- }
+ }
while (column<c) { ol.codify(" "); column++; }
CXString tokenString = clang_getTokenSpelling(p->tu, p->tokens[i]);
char const *s = clang_getCString(tokenString);
@@ -858,7 +782,7 @@ void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd)
//printf("%d:%d %s cursorKind=%d tokenKind=%d\n",line,column,s,cursorKind,tokenKind);
switch (tokenKind)
{
- case CXToken_Keyword:
+ case CXToken_Keyword:
if (strcmp(s,"operator")==0)
{
linkIdentifier(ol,fd,line,column,s,i);
@@ -870,21 +794,21 @@ void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd)
keywordToType(s));
}
break;
- case CXToken_Literal:
+ case CXToken_Literal:
if (cursorKind==CXCursor_InclusionDirective)
{
linkInclude(ol,fd,line,column,s);
}
- else if (s[0]=='"' || s[0]=='\'')
+ else if (s[0]=='"' || s[0]=='\'')
{
codifyLines(ol,fd,s,line,column,"stringliteral");
}
- else
+ else
{
codifyLines(ol,fd,s,line,column);
}
break;
- case CXToken_Comment:
+ case CXToken_Comment:
codifyLines(ol,fd,s,line,column,"comment");
break;
default: // CXToken_Punctuation or CXToken_Identifier
@@ -935,49 +859,80 @@ void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd)
ol.endCodeLine();
}
-ClangParser::ClangParser()
+//--------------------------------------------------------------------------
+
+class ClangParser::Private
+{
+ public:
+ Private()
+ {
+ std::string error;
+ QCString clangCompileDatabase = Config_getString(CLANG_DATABASE_PATH);
+ // load a clang compilation database (https://clang.llvm.org/docs/JSONCompilationDatabase.html)
+ db = clang::tooling::CompilationDatabase::loadFromDirectory(clangCompileDatabase.data(), error);
+ if (!clangCompileDatabase.isEmpty() && clangCompileDatabase!="0" && db==nullptr)
+ {
+ // user specified a path, but DB file was not found
+ err("%s using clang compilation database path of: \"%s\"\n", error.c_str(),
+ clangCompileDatabase.data());
+ }
+ }
+
+ std::unique_ptr<clang::tooling::CompilationDatabase> db;
+};
+
+const clang::tooling::CompilationDatabase *ClangParser::database() const
+{
+ return p->db.get();
+}
+
+ClangParser::ClangParser() : p(std::make_unique<Private>())
{
- p = new Private;
}
ClangParser::~ClangParser()
{
- delete p;
}
-//--------------------------------------------------------------------------
-#else // use stubbed functionality in case libclang support is disabled.
-
-void ClangParser::start(const char *,QStrList &)
+std::unique_ptr<ClangTUParser> ClangParser::createTUParser(const FileDef *fd) const
{
+ //printf("ClangParser::createTUParser()\n");
+ return std::make_unique<ClangTUParser>(*this,fd);
}
-void ClangParser::switchToFile(const char *)
+
+//--------------------------------------------------------------------------
+#else // use stubbed functionality in case libclang support is disabled.
+
+void ClangTUParser::switchToFile(const FileDef *fd)
{
}
-void ClangParser::finish()
+void ClangTUParser::parse()
{
}
-QCString ClangParser::lookup(uint,const char *)
+QCString ClangTUParser::lookup(uint,const char *)
{
return "";
}
-void ClangParser::writeSources(CodeOutputInterface &,FileDef *)
+class ClangParser::Private
{
-}
+};
-ClangParser::ClangParser()
+ClangParser::ClangParser() : p(std::make_unique<Private>())
{
- p = NULL;
}
ClangParser::~ClangParser()
{
}
+std::unique_ptr<ClangTUParser> ClangParser::createTUParser(const FileDef *) const
+{
+ return nullptr;
+}
#endif
//--------------------------------------------------------------------------
diff --git a/src/clangparser.h b/src/clangparser.h
index 8bb9aba..83aafdd 100644
--- a/src/clangparser.h
+++ b/src/clangparser.h
@@ -3,39 +3,41 @@
#include <qcstring.h>
#include <qstrlist.h>
+#include "containers.h"
+#include <memory>
class CodeOutputInterface;
class FileDef;
+class ClangParser;
+class Definition;
-/** @brief Wrapper for to let libclang assisted parsing. */
-class ClangParser
+namespace clang { namespace tooling {
+ class CompilationDatabase;
+} }
+
+/** @brief Clang parser object for a single translation unit, which consists of a source file
+ * and the directly or indirectly included headers
+ */
+class ClangTUParser
{
public:
- /** Returns the one and only instance of the class */
- static ClangParser *instance();
-
- /** Start parsing a file.
- * @param[in] fileName The name of the file to parse.
- * @param[in,out] filesInTranslationUnit Other files that are
- * part of the input and included by the file.
- * The function will return a subset of the files,
- * only including the ones that were actually found
- * during parsing.
- */
- void start(const char *fileName,QStrList &filesInTranslationUnit);
+ ClangTUParser(const ClangParser &parser,const FileDef *fd);
+ virtual ~ClangTUParser();
- /** Switches to another file within the translation unit started
- * with start().
- * @param[in] fileName The name of the file to switch to.
+ /** Parse the file given at construction time as a translation unit
+ * This file should already be preprocessed by doxygen preprocessor at the time of calling.
*/
- void switchToFile(const char *fileName);
+ void parse();
- /** Finishes parsing a translation unit. Free any resources that
- * were needed for parsing.
+ /** Switches to another file within the translation unit started with start().
+ * @param[in] fd The file definition with the name of the file to switch to.
*/
- void finish();
+ void switchToFile(const FileDef *fd);
+
+ /** Returns the list of files for this translation unit */
+ StringVector filesInSameTU() const;
- /** Looks for \a symbol which should be found at \a line and
+ /** Looks for \a symbol which should be found at \a line.
* returns a clang unique reference to the symbol.
*/
QCString lookup(uint line,const char *symbol);
@@ -44,21 +46,44 @@ class ClangParser
* @param[out] ol The output generator list to write to.
* @param[in] fd The file to write sources for.
*/
- void writeSources(CodeOutputInterface &ol,FileDef *fd);
+ void writeSources(CodeOutputInterface &ol,const FileDef *fd);
private:
- void linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
+ void detectFunctionBody(const char *s);
+ void writeLineNumber(CodeOutputInterface &ol,const FileDef *fd,uint line);
+ void codifyLines(CodeOutputInterface &ol,const FileDef *fd,const char *text,
+ uint &line,uint &column,const char *fontClass=0);
+ void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const FileDef *fd,uint &line,uint &column,
+ const Definition *d, const char *text);
+ void linkIdentifier(CodeOutputInterface &ol,const FileDef *fd,
uint &line,uint &column,
const char *text,int tokenIndex);
- void linkMacro(CodeOutputInterface &ol,FileDef *fd,
+ void linkMacro(CodeOutputInterface &ol,const FileDef *fd,
uint &line,uint &column,
const char *text);
- void linkInclude(CodeOutputInterface &ol,FileDef *fd,
+ void linkInclude(CodeOutputInterface &ol,const FileDef *fd,
uint &line,uint &column,
const char *text);
- void determineInputFilesInSameTu(QStrList &filesInTranslationUnit);
+ ClangTUParser(const ClangTUParser &) = delete;
+ ClangTUParser &operator=(const ClangTUParser &) = delete;
+ class Private;
+ std::unique_ptr<Private> p;
+};
+
+/** @brief Wrapper for to let libclang assisted parsing. */
+class ClangParser
+{
+ friend class ClangTUParser;
+ public:
+ /** Returns the one and only instance of the class */
+ static ClangParser *instance();
+ std::unique_ptr<ClangTUParser> createTUParser(const FileDef *fd) const;
+
+ private:
+ const clang::tooling::CompilationDatabase *database() const;
class Private;
- Private *p;
+ std::unique_ptr<Private> p;
ClangParser();
virtual ~ClangParser();
static ClangParser *s_instance;
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 61ae528..88bc44c 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -15,7 +15,9 @@
*
*/
-#include <stdio.h>
+#include <cstdio>
+#include <algorithm>
+
#include <qfile.h>
#include <qfileinfo.h>
#include <qregexp.h>
@@ -48,12 +50,110 @@
#include "namespacedef.h"
#include "membergroup.h"
#include "definitionimpl.h"
+#include "symbolresolver.h"
+
+//-----------------------------------------------------------------------------
+
+static QCString makeQualifiedNameWithTemplateParameters(const ClassDef *cd,
+ const ArgumentLists *actualParams,uint *actualParamIndex)
+{
+ //static bool optimizeOutputJava = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
+ bool hideScopeNames = Config_getBool(HIDE_SCOPE_NAMES);
+ //printf("qualifiedNameWithTemplateParameters() localName=%s\n",localName().data());
+ QCString scName;
+ const Definition *d=cd->getOuterScope();
+ if (d)
+ {
+ if (d->definitionType()==Definition::TypeClass)
+ {
+ const ClassDef *ocd=toClassDef(d);
+ scName = ocd->qualifiedNameWithTemplateParameters(actualParams,actualParamIndex);
+ }
+ else if (!hideScopeNames)
+ {
+ scName = d->qualifiedName();
+ }
+ }
+
+ SrcLangExt lang = cd->getLanguage();
+ QCString scopeSeparator = getLanguageSpecificSeparator(lang);
+ if (!scName.isEmpty()) scName+=scopeSeparator;
+
+ bool isSpecialization = cd->localName().find('<')!=-1;
+
+ QCString clName = cd->className();
+ scName+=clName;
+ if (!cd->templateArguments().empty())
+ {
+ if (actualParams && *actualParamIndex<actualParams->size())
+ {
+ const ArgumentList &al = actualParams->at(*actualParamIndex);
+ if (!isSpecialization)
+ {
+ scName+=tempArgListToString(al,lang);
+ }
+ (*actualParamIndex)++;
+ }
+ else
+ {
+ if (!isSpecialization)
+ {
+ scName+=tempArgListToString(cd->templateArguments(),lang);
+ }
+ }
+ }
+ //printf("qualifiedNameWithTemplateParameters: scope=%s qualifiedName=%s\n",name().data(),scName.data());
+ return scName;
+}
+
+static QCString makeDisplayName(const ClassDef *cd,bool includeScope)
+{
+ //static bool optimizeOutputForJava = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
+ SrcLangExt lang = cd->getLanguage();
+ //static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ QCString n;
+ if (lang==SrcLangExt_VHDL)
+ {
+ n = VhdlDocGen::getClassName(cd);
+ }
+ else
+ {
+ if (includeScope)
+ {
+ n=cd->qualifiedNameWithTemplateParameters();
+ }
+ else
+ {
+ n=cd->className();
+ }
+ }
+ if (cd->isAnonymous())
+ {
+ n = removeAnonymousScopes(n);
+ }
+ QCString sep=getLanguageSpecificSeparator(lang);
+ if (sep!="::")
+ {
+ n=substitute(n,"::",sep);
+ }
+ if (cd->compoundType()==ClassDef::Protocol && n.right(2)=="-p")
+ {
+ n="<"+n.left(n.length()-2)+">";
+ }
+ //else if (n.right(2)=="-g")
+ //{
+ // n = n.left(n.length()-2);
+ //}
+ //printf("ClassDefImpl::displayName()=%s\n",n.data());
+ return n;
+}
+
//-----------------------------------------------------------------------------
/** Implementation of the ClassDef interface */
-class ClassDefImpl : public DefinitionImpl, public ClassDef
+class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
{
public:
ClassDefImpl(const char *fileName,int startLine,int startColumn,
@@ -66,12 +166,12 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
virtual ClassDef *resolveAlias() { return this; }
virtual DefType definitionType() const { return TypeClass; }
virtual QCString getOutputFileBase() const;
- virtual QCString getInstanceOutputFileBase() const;
- virtual QCString getSourceFileBase() const;
+ virtual QCString getInstanceOutputFileBase() const;
+ virtual QCString getSourceFileBase() const;
virtual QCString getReference() const;
virtual bool isReference() const;
virtual bool isLocal() const;
- virtual ClassSDict *getClassSDict() const;
+ virtual ClassLinkedRefMap getClasses() const;
virtual bool hasDocumentation() const;
virtual bool hasDetailedDescription() const;
virtual QCString collaborationGraphFileName() const;
@@ -79,9 +179,11 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
virtual QCString displayName(bool includeScope=TRUE) const;
virtual CompoundType compoundType() const;
virtual QCString compoundTypeString() const;
- virtual BaseClassList *baseClasses() const;
- virtual BaseClassList *subClasses() const;
- virtual MemberNameInfoSDict *memberNameInfoSDict() const;
+ virtual BaseClassList baseClasses() const;
+ virtual void updateBaseClasses(const BaseClassList &bcd);
+ virtual BaseClassList subClasses() const;
+ virtual void updateSubClasses(const BaseClassList &bcd);
+ virtual const MemberNameInfoLinkedMap &memberNameInfoLinkedMap() const;
virtual Protection protection() const;
virtual bool isLinkableInProject() const;
virtual bool isLinkable() const;
@@ -103,10 +205,10 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
virtual UsesClassDict *usedInterfaceClasses() const;
virtual ConstraintClassDict *templateTypeConstraints() const;
virtual bool isTemplateArgument() const;
- virtual Definition *findInnerCompound(const char *name) const;
- virtual std::vector<ArgumentList> getTemplateParameterLists() const;
+ virtual const Definition *findInnerCompound(const char *name) const;
+ virtual ArgumentLists getTemplateParameterLists() const;
virtual QCString qualifiedNameWithTemplateParameters(
- const std::vector<ArgumentList> *actualParams=0,int *actualParamIndex=0) const;
+ const ArgumentLists *actualParams=0,uint *actualParamIndex=0) const;
virtual bool isAbstract() const;
virtual bool isObjectiveC() const;
virtual bool isFortran() const;
@@ -120,25 +222,22 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
virtual ClassDef *categoryOf() const;
virtual QCString className() const;
virtual MemberList *getMemberList(MemberListType lt) const;
- virtual const QList<MemberList> &getMemberLists() const;
- virtual MemberGroupSDict *getMemberGroupSDict() const;
+ virtual const MemberLists &getMemberLists() const;
+ virtual const MemberGroupList &getMemberGroups() const;
virtual QDict<int> *getTemplateBaseClassNames() const;
virtual ClassDef *getVariableInstance(const char *templSpec) const;
virtual bool isUsedOnly() const;
virtual QCString anchor() const;
virtual bool isEmbeddedInOuterScope() const;
virtual bool isSimple() const;
- virtual const ClassList *taggedInnerClasses() const;
- virtual ClassDef *tagLessReference() const;
+ virtual const ClassDef *tagLessReference() const;
virtual MemberDef *isSmartPointer() const;
virtual bool isJavaEnum() const;
- virtual bool isGeneric() const;
- virtual const ClassSDict *innerClasses() const;
virtual QCString title() const;
virtual QCString generatedFromFiles() const;
virtual const FileList &usedFiles() const;
virtual const ArgumentList &typeConstraints() const;
- virtual const ExampleSDict *exampleList() const;
+ virtual const ExampleList &getExamples() const;
virtual bool hasExamples() const;
virtual QCString getMemberListFileName() const;
virtual bool subGrouping() const;
@@ -149,7 +248,7 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
virtual void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0);
virtual void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0);
- virtual void setIncludeFile(FileDef *fd,const char *incName,bool local,bool force);
+ virtual void setIncludeFile(FileDef *fd,const char *incName,bool local,bool force);
virtual void insertMember(MemberDef *);
virtual void insertUsedFile(FileDef *);
virtual bool addExample(const char *anchor,const char *name, const char *file);
@@ -170,12 +269,11 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
virtual void setTemplateBaseClassNames(QDict<int> *templateNames);
virtual void setTemplateMaster(const ClassDef *tm);
virtual void setTypeConstraints(const ArgumentList &al);
- virtual void addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec);
+ virtual void addMembersToTemplateInstance(const ClassDef *cd,const ArgumentList &templateArguments,const char *templSpec);
virtual void makeTemplateArgument(bool b=TRUE);
virtual void setCategoryOf(ClassDef *cd);
virtual void setUsedOnly(bool b);
- virtual void addTaggedInnerClass(ClassDef *cd);
- virtual void setTagLessReference(ClassDef *cd);
+ virtual void setTagLessReference(const ClassDef *cd);
virtual void setName(const char *name);
virtual void setMetaData(const char *md);
virtual void findSectionsInDocumentation();
@@ -194,20 +292,19 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
const ClassDef *inheritedFrom,const char *inheritId) const;
virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *md) const;
virtual void writeSummaryLinks(OutputList &ol) const;
- virtual void reclassifyMember(MemberDef *md,MemberType t);
+ virtual void reclassifyMember(MemberDefMutable *md,MemberType t);
virtual void writeInlineDocumentation(OutputList &ol) const;
virtual void writeDeclarationLink(OutputList &ol,bool &found,
const char *header,bool localNames) const;
virtual void removeMemberFromLists(MemberDef *md);
virtual void setAnonymousEnumType();
virtual void countMembers();
+ virtual void sortAllMembersList();
virtual void addGroupedInheritedMembers(OutputList &ol,MemberListType lt,
const ClassDef *inheritedFrom,const QCString &inheritId) const;
virtual void writeTagFile(FTextStream &);
- virtual void setVisited(bool visited) const { m_visited = visited; }
- virtual bool isVisited() const { return m_visited; }
virtual int countMembersIncludingGrouped(MemberListType lt,const ClassDef *inheritedFrom,bool additional) const;
virtual int countInheritanceNodes() const;
virtual int countMemberDeclarations(MemberListType lt,const ClassDef *inheritedFrom,
@@ -218,14 +315,12 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
QPtrDict<void> *visitedClasses=0) const;
private:
- mutable bool m_visited;
void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
void showUsedFiles(OutputList &ol) const;
void writeDocumentationContents(OutputList &ol,const QCString &pageTitle) const;
void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList);
void addMemberToList(MemberListType lt,MemberDef *md,bool isBrief);
- MemberList *createMemberList(MemberListType lt);
void writeInheritedMemberDeclarations(OutputList &ol,MemberListType lt,int lt2,const QCString &title,
const ClassDef *inheritedFrom,bool invert,
bool showAlways,QPtrDict<void> *visitedClasses) const;
@@ -267,7 +362,7 @@ class ClassDefImpl : public DefinitionImpl, public ClassDef
IMPL *m_impl = 0;
};
-ClassDef *createClassDef(
+ClassDefMutable *createClassDef(
const char *fileName,int startLine,int startColumn,
const char *name,ClassDef::CompoundType ct,
const char *ref,const char *fName,
@@ -277,14 +372,15 @@ ClassDef *createClassDef(
}
//-----------------------------------------------------------------------------
-class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
+class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
{
public:
- ClassDefAliasImpl(const Definition *newScope,const ClassDef *cd) : DefinitionAliasImpl(newScope,cd) {}
- virtual ~ClassDefAliasImpl() {}
+ ClassDefAliasImpl(const Definition *newScope,const ClassDef *cd)
+ : DefinitionAliasMixin(newScope,cd) { init(); }
+ virtual ~ClassDefAliasImpl() { deinit(); }
virtual DefType definitionType() const { return TypeClass; }
- const ClassDef *getCdAlias() const { return dynamic_cast<const ClassDef*>(getAlias()); }
+ const ClassDef *getCdAlias() const { return toClassDef(getAlias()); }
virtual ClassDef *resolveAlias() { return const_cast<ClassDef*>(getCdAlias()); }
virtual QCString getOutputFileBase() const
@@ -299,8 +395,8 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
{ return getCdAlias()->isReference(); }
virtual bool isLocal() const
{ return getCdAlias()->isLocal(); }
- virtual ClassSDict *getClassSDict() const
- { return getCdAlias()->getClassSDict(); }
+ virtual ClassLinkedRefMap getClasses() const
+ { return getCdAlias()->getClasses(); }
virtual bool hasDocumentation() const
{ return getCdAlias()->hasDocumentation(); }
virtual bool hasDetailedDescription() const
@@ -310,17 +406,17 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
virtual QCString inheritanceGraphFileName() const
{ return getCdAlias()->inheritanceGraphFileName(); }
virtual QCString displayName(bool includeScope=TRUE) const
- { return getCdAlias()->displayName(includeScope); }
+ { return makeDisplayName(this,includeScope); }
virtual CompoundType compoundType() const
{ return getCdAlias()->compoundType(); }
virtual QCString compoundTypeString() const
{ return getCdAlias()->compoundTypeString(); }
- virtual BaseClassList *baseClasses() const
+ virtual BaseClassList baseClasses() const
{ return getCdAlias()->baseClasses(); }
- virtual BaseClassList *subClasses() const
+ virtual BaseClassList subClasses() const
{ return getCdAlias()->subClasses(); }
- virtual MemberNameInfoSDict *memberNameInfoSDict() const
- { return getCdAlias()->memberNameInfoSDict(); }
+ virtual const MemberNameInfoLinkedMap &memberNameInfoLinkedMap() const
+ { return getCdAlias()->memberNameInfoLinkedMap(); }
virtual Protection protection() const
{ return getCdAlias()->protection(); }
virtual bool isLinkableInProject() const
@@ -363,13 +459,13 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
{ return getCdAlias()->templateTypeConstraints(); }
virtual bool isTemplateArgument() const
{ return getCdAlias()->isTemplateArgument(); }
- virtual Definition *findInnerCompound(const char *name) const
+ virtual const Definition *findInnerCompound(const char *name) const
{ return getCdAlias()->findInnerCompound(name); }
- virtual std::vector<ArgumentList> getTemplateParameterLists() const
+ virtual ArgumentLists getTemplateParameterLists() const
{ return getCdAlias()->getTemplateParameterLists(); }
virtual QCString qualifiedNameWithTemplateParameters(
- const std::vector<ArgumentList> *actualParams=0,int *actualParamIndex=0) const
- { return getCdAlias()->qualifiedNameWithTemplateParameters(actualParams,actualParamIndex); }
+ const ArgumentLists *actualParams=0,uint *actualParamIndex=0) const
+ { return makeQualifiedNameWithTemplateParameters(this,actualParams,actualParamIndex); }
virtual bool isAbstract() const
{ return getCdAlias()->isAbstract(); }
virtual bool isObjectiveC() const
@@ -396,10 +492,10 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
{ return getCdAlias()->className(); }
virtual MemberList *getMemberList(MemberListType lt) const
{ return getCdAlias()->getMemberList(lt); }
- virtual const QList<MemberList> &getMemberLists() const
+ virtual const MemberLists &getMemberLists() const
{ return getCdAlias()->getMemberLists(); }
- virtual MemberGroupSDict *getMemberGroupSDict() const
- { return getCdAlias()->getMemberGroupSDict(); }
+ virtual const MemberGroupList &getMemberGroups() const
+ { return getCdAlias()->getMemberGroups(); }
virtual QDict<int> *getTemplateBaseClassNames() const
{ return getCdAlias()->getTemplateBaseClassNames(); }
virtual ClassDef *getVariableInstance(const char *templSpec) const
@@ -412,18 +508,12 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
{ return getCdAlias()->isEmbeddedInOuterScope(); }
virtual bool isSimple() const
{ return getCdAlias()->isSimple(); }
- virtual const ClassList *taggedInnerClasses() const
- { return getCdAlias()->taggedInnerClasses(); }
- virtual ClassDef *tagLessReference() const
+ virtual const ClassDef *tagLessReference() const
{ return getCdAlias()->tagLessReference(); }
virtual MemberDef *isSmartPointer() const
{ return getCdAlias()->isSmartPointer(); }
virtual bool isJavaEnum() const
{ return getCdAlias()->isJavaEnum(); }
- virtual bool isGeneric() const
- { return getCdAlias()->isGeneric(); }
- virtual const ClassSDict *innerClasses() const
- { return getCdAlias()->innerClasses(); }
virtual QCString title() const
{ return getCdAlias()->title(); }
virtual QCString generatedFromFiles() const
@@ -432,8 +522,8 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
{ return getCdAlias()->usedFiles(); }
virtual const ArgumentList &typeConstraints() const
{ return getCdAlias()->typeConstraints(); }
- virtual const ExampleSDict *exampleList() const
- { return getCdAlias()->exampleList(); }
+ virtual const ExampleList &getExamples() const
+ { return getCdAlias()->getExamples(); }
virtual bool hasExamples() const
{ return getCdAlias()->hasExamples(); }
virtual QCString getMemberListFileName() const
@@ -444,71 +534,7 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
{ return getCdAlias()->isSliceLocal(); }
virtual bool hasNonReferenceSuperClass() const
{ return getCdAlias()->hasNonReferenceSuperClass(); }
- virtual ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
- const QCString &templSpec,bool &freshInstance) const
- { return getCdAlias()->insertTemplateInstance(fileName,startLine,startColumn,templSpec,freshInstance); }
- virtual void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0) { }
- virtual void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0) { }
- virtual void setIncludeFile(FileDef *fd,const char *incName,bool local,bool force) {}
- virtual void insertMember(MemberDef *) {}
- virtual void insertUsedFile(FileDef *) {}
- virtual bool addExample(const char *anchor,const char *name, const char *file) { return FALSE; }
- virtual void mergeCategory(ClassDef *category) {}
- virtual void setNamespace(NamespaceDef *nd) {}
- virtual void setFileDef(FileDef *fd) {}
- virtual void setSubGrouping(bool enabled) {}
- virtual void setProtection(Protection p) {}
- virtual void setGroupDefForAllMembers(GroupDef *g,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs) {}
- virtual void addInnerCompound(const Definition *d) {}
- virtual void addUsedClass(ClassDef *cd,const char *accessName,Protection prot) {}
- virtual void addUsedByClass(ClassDef *cd,const char *accessName,Protection prot) {}
- virtual void setIsStatic(bool b) {}
- virtual void setCompoundType(CompoundType t) {}
- virtual void setClassName(const char *name) {}
- virtual void setClassSpecifier(uint64 spec) {}
- virtual void setTemplateArguments(const ArgumentList &al) {}
- virtual void setTemplateBaseClassNames(QDict<int> *templateNames) {}
- virtual void setTemplateMaster(const ClassDef *tm) {}
- virtual void setTypeConstraints(const ArgumentList &al) {}
- virtual void addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec) {}
- virtual void makeTemplateArgument(bool b=TRUE) {}
- virtual void setCategoryOf(ClassDef *cd) {}
- virtual void setUsedOnly(bool b) {}
- virtual void addTaggedInnerClass(ClassDef *cd) {}
- virtual void setTagLessReference(ClassDef *cd) {}
- virtual void setName(const char *name) {}
- virtual void setMetaData(const char *md) {}
- virtual void findSectionsInDocumentation() {}
- virtual void addMembersToMemberGroup() {}
- virtual void addListReferences() {}
- virtual void addTypeConstraints() {}
- virtual void computeAnchors() {}
- virtual void mergeMembers() {}
- virtual void sortMemberLists() {}
- virtual void distributeMemberGroupDocumentation() {}
- virtual void writeDocumentation(OutputList &ol) const {}
- virtual void writeDocumentationForInnerClasses(OutputList &ol) const {}
- virtual void writeMemberPages(OutputList &ol) const {}
- virtual void writeMemberList(OutputList &ol) const {}
- virtual void writeDeclaration(OutputList &ol,const MemberDef *md,bool inGroup,
- const ClassDef *inheritedFrom,const char *inheritId) const {}
- virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *md) const {}
- virtual void writeSummaryLinks(OutputList &ol) const {}
- virtual void reclassifyMember(MemberDef *md,MemberType t) {}
- virtual void writeInlineDocumentation(OutputList &ol) const {}
- virtual void writeDeclarationLink(OutputList &ol,bool &found,
- const char *header,bool localNames) const
- { getCdAlias()->writeDeclarationLink(ol,found,header,localNames); }
- virtual void removeMemberFromLists(MemberDef *md) {}
- virtual void setAnonymousEnumType() {}
- virtual void countMembers() {}
- virtual void addGroupedInheritedMembers(OutputList &ol,MemberListType lt,
- const ClassDef *inheritedFrom,const QCString &inheritId) const {}
- virtual void writeTagFile(FTextStream &) {}
-
- virtual void setVisited(bool visited) const { m_visited = visited; }
- virtual bool isVisited() const { return m_visited; }
virtual int countMembersIncludingGrouped(MemberListType lt,const ClassDef *inheritedFrom,bool additional) const
{ return getCdAlias()->countMembersIncludingGrouped(lt,inheritedFrom,additional); }
virtual int countInheritanceNodes() const
@@ -516,19 +542,27 @@ class ClassDefAliasImpl : public DefinitionAliasImpl, public ClassDef
virtual int countMemberDeclarations(MemberListType lt,const ClassDef *inheritedFrom,
int lt2,bool invert,bool showAlways,QPtrDict<void> *visitedClasses) const
{ return getCdAlias()->countMemberDeclarations(lt,inheritedFrom,lt2,invert,showAlways,visitedClasses); }
- virtual void writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCString &title,
- const char *subTitle=0,bool showInline=FALSE,const ClassDef *inheritedFrom=0,
- int lt2=-1,bool invert=FALSE,bool showAlways=FALSE,
- QPtrDict<void> *visitedClasses=0) const {}
- private:
- mutable bool m_visited = false;
+ virtual void writeDeclarationLink(OutputList &ol,bool &found,
+ const char *header,bool localNames) const
+ { getCdAlias()->writeDeclarationLink(ol,found,header,localNames); }
+ virtual ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
+ const QCString &templSpec,bool &freshInstance) const
+ { return getCdAlias()->insertTemplateInstance(fileName,startLine,startColumn,templSpec,freshInstance); }
+
+ virtual void updateBaseClasses(const BaseClassList &) {}
+ virtual void updateSubClasses(const BaseClassList &) {}
};
+
ClassDef *createClassDefAlias(const Definition *newScope,const ClassDef *cd)
{
- return new ClassDefAliasImpl(newScope,cd);
+ ClassDef *acd = new ClassDefAliasImpl(newScope,cd);
+ //printf("cd name=%s localName=%s qualifiedName=%s qualifiedNameWith=%s displayName()=%s\n",
+ // acd->name().data(),acd->localName().data(),acd->qualifiedName().data(),
+ // acd->qualifiedNameWithTemplateParameters().data(),acd->displayName().data());
+ return acd;
}
//-----------------------------------------------------------------------------
@@ -565,11 +599,11 @@ class ClassDefImpl::IMPL
/*! List of base class (or super-classes) from which this class derives
* directly.
*/
- BaseClassList *inherits = 0;
+ BaseClassList inherits;
/*! List of sub-classes that directly derive from this class
*/
- BaseClassList *inheritedBy = 0;
+ BaseClassList inheritedBy;
/*! Namespace this class is part of
* (this is the inner most namespace in case of nested namespaces)
@@ -580,7 +614,7 @@ class ClassDefImpl::IMPL
FileDef *fileDef = 0;
/*! List of all members (including inherited members) */
- MemberNameInfoSDict *allMemberNameInfoSDict = 0;
+ MemberNameInfoLinkedMap allMemberNameInfoLinkedMap;
/*! Template arguments of this class */
ArgumentList tempArgs;
@@ -592,7 +626,7 @@ class ClassDefImpl::IMPL
FileList files;
/*! Examples that use this class */
- ExampleSDict *exampleSDict = 0;
+ ExampleList examples;
/*! Holds the kind of "class" this is. */
ClassDef::CompoundType compType;
@@ -606,7 +640,7 @@ class ClassDefImpl::IMPL
/*! The inner classes contained in this class. Will be 0 if there are
* no inner classes.
*/
- ClassSDict *innerClasses = 0;
+ ClassLinkedRefMap innerClasses;
/* classes for the collaboration diagram */
UsesClassDict *usesImplClassDict = 0;
@@ -639,10 +673,10 @@ class ClassDefImpl::IMPL
*/
ClassDef *categoryOf = 0;
- QList<MemberList> memberLists;
+ MemberLists memberLists;
/* user defined member groups */
- MemberGroupSDict *memberGroupSDict = 0;
+ MemberGroupList memberGroups;
/*! Is this an abstract class? */
bool isAbstract = false;
@@ -668,7 +702,7 @@ class ClassDefImpl::IMPL
bool usedOnly = false;
/** List of titles to use for the summary */
- SDict<QCString> vhdlSummaryTitles;
+ StringSet vhdlSummaryTitles;
/** Is this a simple (non-nested) C structure? */
bool isSimple = false;
@@ -676,14 +710,11 @@ class ClassDefImpl::IMPL
/** Does this class overloaded the -> operator? */
MemberDef *arrowOperator = 0;
- ClassList *taggedInnerClasses = 0;
- ClassDef *tagLessRef = 0;
+ const ClassDef *tagLessRef = 0;
/** Does this class represent a Java style enum? */
bool isJavaEnum = false;
- bool isGeneric = false;
-
uint64 spec = 0;
QCString metaData;
@@ -700,10 +731,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
{
fileName=ctStr+name;
}
- exampleSDict = 0;
- inherits = 0;
- inheritedBy = 0;
- allMemberNameInfoSDict = 0;
incInfo=0;
prot=Public;
nspace=0;
@@ -712,8 +739,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
usedByImplClassDict=0;
usesIntfClassDict=0;
constraintClassDict=0;
- memberGroupSDict = 0;
- innerClasses = 0;
subGrouping=Config_getBool(SUBGROUPING);
templateInstances = 0;
variableInstances = 0;
@@ -727,7 +752,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
usedOnly = FALSE;
isSimple = Config_getBool(INLINE_SIMPLE_STRUCTS);
arrowOperator = 0;
- taggedInnerClasses = 0;
tagLessRef = 0;
spec=0;
//QCString ns;
@@ -745,31 +769,22 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
{
isLocal=FALSE;
}
- isGeneric = (lang==SrcLangExt_CSharp || lang==SrcLangExt_Java) && QCString(name).find('<')!=-1;
}
-ClassDefImpl::IMPL::IMPL() : vhdlSummaryTitles(17)
+ClassDefImpl::IMPL::IMPL()
{
- vhdlSummaryTitles.setAutoDelete(TRUE);
}
ClassDefImpl::IMPL::~IMPL()
{
- delete inherits;
- delete inheritedBy;
- delete allMemberNameInfoSDict;
- delete exampleSDict;
delete usesImplClassDict;
delete usedByImplClassDict;
delete usesIntfClassDict;
delete constraintClassDict;
delete incInfo;
- delete memberGroupSDict;
- delete innerClasses;
delete templateInstances;
delete variableInstances;
delete templBaseClassNames;
- delete taggedInnerClasses;
}
//-------------------------------------------------------------------------------------------
@@ -780,9 +795,8 @@ ClassDefImpl::ClassDefImpl(
const char *nm,CompoundType ct,
const char *lref,const char *fName,
bool isSymbol,bool isJavaEnum)
- : DefinitionImpl(defFileName,defLine,defColumn,removeRedundantWhiteSpace(nm),0,0,isSymbol)
+ : DefinitionMixin(defFileName,defLine,defColumn,removeRedundantWhiteSpace(nm),0,0,isSymbol)
{
- m_visited=FALSE;
setReference(lref);
m_impl = new ClassDefImpl::IMPL;
m_impl->compType = ct;
@@ -810,44 +824,7 @@ QCString ClassDefImpl::getMemberListFileName() const
QCString ClassDefImpl::displayName(bool includeScope) const
{
- //static bool optimizeOutputForJava = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
- SrcLangExt lang = getLanguage();
- //static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
- QCString n;
- if (lang==SrcLangExt_VHDL)
- {
- n = VhdlDocGen::getClassName(this);
- }
- else
- {
- if (includeScope)
- {
- n=qualifiedNameWithTemplateParameters();
- }
- else
- {
- n=className();
- }
- }
- if (isAnonymous())
- {
- n = removeAnonymousScopes(n);
- }
- QCString sep=getLanguageSpecificSeparator(lang);
- if (sep!="::")
- {
- n=substitute(n,"::",sep);
- }
- if (m_impl->compType==ClassDef::Protocol && n.right(2)=="-p")
- {
- n="<"+n.left(n.length()-2)+">";
- }
- //else if (n.right(2)=="-g")
- //{
- // n = n.left(n.length()-2);
- //}
- //printf("ClassDefImpl::displayName()=%s\n",n.data());
- return n;
+ return makeDisplayName(this,includeScope);
}
// inserts a base/super class in the inheritance list
@@ -855,13 +832,7 @@ void ClassDefImpl::insertBaseClass(ClassDef *cd,const char *n,Protection p,
Specifier s,const char *t)
{
//printf("*** insert base class %s into %s\n",cd->name().data(),name().data());
- //inherits->inSort(new BaseClassDef(cd,p,s,t));
- if (m_impl->inherits==0)
- {
- m_impl->inherits = new BaseClassList;
- m_impl->inherits->setAutoDelete(TRUE);
- }
- m_impl->inherits->append(new BaseClassDef(cd,n,p,s,t));
+ m_impl->inherits.push_back(BaseClassDef(cd,n,p,s,t));
m_impl->isSimple = FALSE;
}
@@ -872,39 +843,27 @@ void ClassDefImpl::insertSubClass(ClassDef *cd,Protection p,
//printf("*** insert sub class %s into %s\n",cd->name().data(),name().data());
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
if (!extractPrivate && cd->protection()==Private) return;
- if (m_impl->inheritedBy==0)
- {
- m_impl->inheritedBy = new BaseClassList;
- m_impl->inheritedBy->setAutoDelete(TRUE);
- }
- m_impl->inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t));
+ m_impl->inheritedBy.push_back(BaseClassDef(cd,0,p,s,t));
m_impl->isSimple = FALSE;
}
void ClassDefImpl::addMembersToMemberGroup()
{
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_impl->memberLists)
{
if ((ml->listType()&MemberListType_detailedLists)==0)
{
- ::addMembersToMemberGroup(ml,&m_impl->memberGroupSDict,this);
+ ::addMembersToMemberGroup(ml.get(),&m_impl->memberGroups,this);
}
}
// add members inside sections to their groups
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ if (mg->allMembersInSameSection() && m_impl->subGrouping)
{
- if (mg->allMembersInSameSection() && m_impl->subGrouping)
- {
- //printf("addToDeclarationSection(%s)\n",mg->header().data());
- mg->addToDeclarationSection();
- }
+ //printf("addToDeclarationSection(%s)\n",mg->header().data());
+ mg->addToDeclarationSection();
}
}
}
@@ -921,10 +880,7 @@ void ClassDefImpl::internalInsertMember(MemberDef *md,
if (getLanguage()==SrcLangExt_VHDL)
{
QCString title=theTranslator->trVhdlType(md->getMemberSpecifiers(),FALSE);
- if (!m_impl->vhdlSummaryTitles.find(title))
- {
- m_impl->vhdlSummaryTitles.append(title,new QCString(title));
- }
+ m_impl->vhdlSummaryTitles.insert(title.str());
}
if (1 /*!isReference()*/) // changed to 1 for showing members of external
@@ -1144,8 +1100,7 @@ void ClassDefImpl::internalInsertMember(MemberDef *md,
case MemberType_Function:
if (md->isConstructor() || md->isDestructor())
{
- MemberList *ml = createMemberList(MemberListType_constructors);
- ml->append(md);
+ m_impl->memberLists.get(MemberListType_constructors)->append(md);
}
else
{
@@ -1195,24 +1150,9 @@ void ClassDefImpl::internalInsertMember(MemberDef *md,
QCString(md->typeString())=="friend union")))
{
//printf("=======> adding member %s to class %s\n",md->name().data(),name().data());
- MemberInfo *mi = new MemberInfo((MemberDef *)md,
- prot,md->virtualness(),FALSE);
- MemberNameInfo *mni=0;
- if (m_impl->allMemberNameInfoSDict==0)
- {
- m_impl->allMemberNameInfoSDict = new MemberNameInfoSDict(17);
- m_impl->allMemberNameInfoSDict->setAutoDelete(TRUE);
- }
- if ((mni=m_impl->allMemberNameInfoSDict->find(md->name())))
- {
- mni->append(mi);
- }
- else
- {
- mni = new MemberNameInfo(md->name());
- mni->append(mi);
- m_impl->allMemberNameInfoSDict->append(mni->memberName(),mni);
- }
+
+ MemberNameInfo *mni = m_impl->allMemberNameInfoLinkedMap.add(md->name());
+ mni->push_back(std::make_unique<MemberInfo>(md,prot,md->virtualness(),FALSE));
}
}
@@ -1224,58 +1164,37 @@ void ClassDefImpl::insertMember(MemberDef *md)
// compute the anchors for all members
void ClassDefImpl::computeAnchors()
{
- //ClassDef *context = Config_getBool(INLINE_INHERITED_MEMB) ? this : 0;
- //const char *letters = "abcdefghijklmnopqrstuvwxyz0123456789";
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- //int index = 0;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_impl->memberLists)
{
if ((ml->listType()&MemberListType_detailedLists)==0)
{
- setAnchors(ml);
+ ml->setAnchors();
}
}
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->setAnchors();
- }
+ mg->setAnchors();
}
}
void ClassDefImpl::distributeMemberGroupDocumentation()
{
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->distributeMemberGroupDocumentation();
- }
+ mg->distributeMemberGroupDocumentation();
}
}
void ClassDefImpl::findSectionsInDocumentation()
{
+ docFindSections(briefDescription(),this,docFile());
docFindSections(documentation(),this,docFile());
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->findSectionsInDocumentation(this);
- }
+ mg->findSectionsInDocumentation(this);
}
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_impl->memberLists)
{
if ((ml->listType()&MemberListType_detailedLists)==0)
{
@@ -1296,27 +1215,31 @@ void ClassDefImpl::insertUsedFile(FileDef *fd)
ClassDef *cd;
for (qdi.toFirst();(cd=qdi.current());++qdi)
{
- cd->insertUsedFile(fd);
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm)
+ {
+ cdm->insertUsedFile(fd);
+ }
}
}
}
-static void writeInheritanceSpecifier(OutputList &ol,BaseClassDef *bcd)
+static void writeInheritanceSpecifier(OutputList &ol,const BaseClassDef &bcd)
{
- if (bcd->prot!=Public || bcd->virt!=Normal)
+ if (bcd.prot!=Public || bcd.virt!=Normal)
{
ol.startTypewriter();
ol.docify(" [");
- QStrList sl;
- if (bcd->prot==Protected) sl.append("protected");
- else if (bcd->prot==Private) sl.append("private");
- if (bcd->virt==Virtual) sl.append("virtual");
- const char *s=sl.first();
- while (s)
+ StringVector sl;
+ if (bcd.prot==Protected) sl.push_back("protected");
+ else if (bcd.prot==Private) sl.push_back("private");
+ if (bcd.virt==Virtual) sl.push_back("virtual");
+ bool first=true;
+ for (const auto &s : sl)
{
- ol.docify(s);
- s=sl.next();
- if (s) ol.docify(", ");
+ if (!first) ol.docify(", ");
+ ol.docify(s.c_str());
+ first=false;
}
ol.docify("]");
ol.endTypewriter();
@@ -1363,7 +1286,7 @@ void ClassDefImpl::setIncludeFile(FileDef *fd,
//}
static void searchTemplateSpecs(/*in*/ const Definition *d,
- /*out*/ std::vector<ArgumentList> &result,
+ /*out*/ ArgumentLists &result,
/*out*/ QCString &name,
/*in*/ SrcLangExt lang)
{
@@ -1373,7 +1296,7 @@ static void searchTemplateSpecs(/*in*/ const Definition *d,
{
searchTemplateSpecs(d->getOuterScope(),result,name,lang);
}
- const ClassDef *cd=dynamic_cast<const ClassDef *>(d);
+ const ClassDef *cd=toClassDef(d);
if (!name.isEmpty()) name+="::";
QCString clName = d->localName();
if (/*clName.right(2)=="-g" ||*/ clName.right(2)=="-p")
@@ -1400,7 +1323,7 @@ static void searchTemplateSpecs(/*in*/ const Definition *d,
static void writeTemplateSpec(OutputList &ol,const Definition *d,
const QCString &type,SrcLangExt lang)
{
- std::vector<ArgumentList> specs;
+ ArgumentLists specs;
QCString name;
searchTemplateSpecs(d,specs,name,lang);
if (!specs.empty()) // class has template scope specifiers
@@ -1446,7 +1369,8 @@ void ClassDefImpl::writeBriefDescription(OutputList &ol,bool exampleFlag) const
ol.writeString(" - ");
ol.popGeneratorState();
ol.generateDoc(briefFile(),briefLine(),this,0,
- briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ briefDescription(),TRUE,FALSE,0,
+ TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.pushGeneratorState();
ol.disable(OutputGenerator::RTF);
ol.writeString(" \n");
@@ -1477,7 +1401,8 @@ void ClassDefImpl::writeDetailedDocumentationBody(OutputList &ol) const
// repeat brief description
if (!briefDescription().isEmpty() && repeatBrief)
{
- ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
if (!briefDescription().isEmpty() && repeatBrief &&
!documentation().isEmpty())
@@ -1490,18 +1415,19 @@ void ClassDefImpl::writeDetailedDocumentationBody(OutputList &ol) const
// write documentation
if (!documentation().isEmpty())
{
- ol.generateDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
// write type constraints
writeTypeConstraints(ol,this,m_impl->typeConstraints);
// write examples
- if (hasExamples() && m_impl->exampleSDict)
+ if (hasExamples())
{
ol.startExamples();
ol.startDescForItem();
//ol.startParagraph();
- writeExample(ol,m_impl->exampleSDict);
+ writeExamples(ol,m_impl->examples);
//ol.endParagraph();
ol.endDescForItem();
ol.endExamples();
@@ -1671,24 +1597,15 @@ void ClassDefImpl::showUsedFiles(OutputList &ol) const
int ClassDefImpl::countInheritanceNodes() const
{
int count=0;
- BaseClassDef *ibcd;
- if (m_impl->inheritedBy)
+ for (const auto &ibcd : m_impl->inheritedBy)
{
- BaseClassListIterator it(*m_impl->inheritedBy);
- for (;(ibcd=it.current());++it)
- {
- ClassDef *icd=ibcd->classDef;
- if ( icd->isVisibleInHierarchy()) count++;
- }
+ const ClassDef *icd=ibcd.classDef;
+ if ( icd->isVisibleInHierarchy()) count++;
}
- if (m_impl->inherits)
+ for (const auto &ibcd : m_impl->inherits)
{
- BaseClassListIterator it(*m_impl->inherits);
- for (;(ibcd=it.current());++it)
- {
- ClassDef *icd=ibcd->classDef;
- if ( icd->isVisibleInHierarchy()) count++;
- }
+ const ClassDef *icd=ibcd.classDef;
+ if ( icd->isVisibleInHierarchy()) count++;
}
return count;
}
@@ -1738,12 +1655,12 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const
ol.disableAllBut(OutputGenerator::Man);
}
- if (m_impl->inherits && m_impl->inherits->count()>0)
+ if (!m_impl->inherits.empty())
{
ol.startParagraph();
//parseText(ol,theTranslator->trInherits()+" ");
- QCString inheritLine = theTranslator->trInheritsList(m_impl->inherits->count());
+ QCString inheritLine = theTranslator->trInheritsList((int)m_impl->inherits.size());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
@@ -1752,15 +1669,15 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const
ol.parseText(inheritLine.mid(index,newIndex-index));
bool ok;
uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- BaseClassDef *bcd=m_impl->inherits->at(entryIndex);
- if (ok && bcd)
+ BaseClassDef &bcd=m_impl->inherits.at(entryIndex);
+ if (ok)
{
- ClassDef *cd=bcd->classDef;
+ ClassDef *cd=bcd.classDef;
// use the class name but with the template arguments as given
// in the inheritance relation
QCString displayName = insertTemplateSpecifierInScope(
- cd->displayName(),bcd->templSpecifiers);
+ cd->displayName(),bcd.templSpecifiers);
if (cd->isLinkable())
{
@@ -1780,15 +1697,15 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const
}
index=newIndex+matchLen;
}
- ol.parseText(inheritLine.right(inheritLine.length()-index));
+ ol.parseText(inheritLine.right(inheritLine.length()-(uint)index));
ol.endParagraph();
}
// write subclasses
- if (m_impl->inheritedBy && m_impl->inheritedBy->count()>0)
+ if (!m_impl->inheritedBy.empty())
{
ol.startParagraph();
- QCString inheritLine = theTranslator->trInheritedByList(m_impl->inheritedBy->count());
+ QCString inheritLine = theTranslator->trInheritedByList((int)m_impl->inheritedBy.size());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
@@ -1797,10 +1714,10 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const
ol.parseText(inheritLine.mid(index,newIndex-index));
bool ok;
uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- BaseClassDef *bcd=m_impl->inheritedBy->at(entryIndex);
- if (ok && bcd)
+ BaseClassDef &bcd=m_impl->inheritedBy.at(entryIndex);
+ if (ok)
{
- ClassDef *cd=bcd->classDef;
+ ClassDef *cd=bcd.classDef;
if (cd->isLinkable())
{
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),cd->anchor(),cd->displayName());
@@ -1813,7 +1730,7 @@ void ClassDefImpl::writeInheritanceGraph(OutputList &ol) const
}
index=newIndex+matchLen;
}
- ol.parseText(inheritLine.right(inheritLine.length()-index));
+ ol.parseText(inheritLine.right(inheritLine.length()-(uint)index));
ol.endParagraph();
}
@@ -1863,16 +1780,15 @@ void ClassDefImpl::writeIncludeFilesForSlice(OutputList &ol) const
if (m_impl->incInfo)
{
QCString nm;
- QStrList paths = Config_getList(STRIP_FROM_PATH);
- if (!paths.isEmpty() && m_impl->incInfo->fileDef)
+ const StringVector &paths = Config_getList(STRIP_FROM_PATH);
+ if (!paths.empty() && m_impl->incInfo->fileDef)
{
QCString abs = m_impl->incInfo->fileDef->absFilePath();
- const char *s = paths.first();
QCString potential;
unsigned int length = 0;
- while (s)
+ for (const auto &s : paths)
{
- QFileInfo info(s);
+ QFileInfo info(s.c_str());
if (info.exists())
{
QCString prefix = info.absFilePath().utf8();
@@ -1887,7 +1803,6 @@ void ClassDefImpl::writeIncludeFilesForSlice(OutputList &ol) const
length = prefix.length();
potential = abs.right(abs.length() - prefix.length());
}
- s = paths.next();
}
}
@@ -1948,35 +1863,30 @@ void ClassDefImpl::writeIncludeFilesForSlice(OutputList &ol) const
ol.docify("class ");
}
ol.docify(stripScope(name()));
- if (m_impl->inherits)
+ if (!m_impl->inherits.empty())
{
if (m_impl->spec & (Entry::Interface|Entry::Exception))
{
ol.docify(" extends ");
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (;(ibcd=it.current());++it)
+ bool first=true;
+ for (const auto &ibcd : m_impl->inherits)
{
- ClassDef *icd = ibcd->classDef;
+ if (!first) ol.docify(", ");
+ ClassDef *icd = ibcd.classDef;
ol.docify(icd->name());
- if (!it.atLast())
- {
- ol.docify(", ");
- }
+ first=false;
}
}
else
{
// Must be a class.
- bool implements = FALSE;
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (;(ibcd=it.current());++it)
+ bool implements = false;
+ for (const auto &ibcd : m_impl->inherits)
{
- ClassDef *icd = ibcd->classDef;
+ ClassDef *icd = ibcd.classDef;
if (icd->isInterface())
{
- implements = TRUE;
+ implements = true;
}
else
{
@@ -1987,20 +1897,14 @@ void ClassDefImpl::writeIncludeFilesForSlice(OutputList &ol) const
if (implements)
{
ol.docify(" implements ");
- bool first = TRUE;
- for (ibcd=it.toFirst();(ibcd=it.current());++it)
+ bool first = true;
+ for (const auto &ibcd : m_impl->inherits)
{
- ClassDef *icd = ibcd->classDef;
+ ClassDef *icd = ibcd.classDef;
if (icd->isInterface())
{
- if (!first)
- {
- ol.docify(", ");
- }
- else
- {
- first = FALSE;
- }
+ if (!first) ol.docify(", ");
+ first = false;
ol.docify(icd->name());
}
}
@@ -2058,46 +1962,19 @@ void ClassDefImpl::writeIncludeFiles(OutputList &ol) const
}
}
-#if 0
-void ClassDefImpl::writeAllMembersLink(OutputList &ol)
-{
- // write link to list of all members (HTML only)
- if (m_impl->allMemberNameInfoSDict &&
- !Config_getBool(OPTIMIZE_OUTPUT_FOR_C)
- )
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.startParagraph();
- ol.startTextLink(getMemberListFileName(),0);
- ol.parseText(theTranslator->trListOfAllMembers());
- ol.endTextLink();
- ol.endParagraph();
- ol.enableAll();
- ol.popGeneratorState();
- }
-}
-#endif
-
void ClassDefImpl::writeMemberGroups(OutputList &ol,bool showInline) const
{
// write user defined member groups
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- m_impl->memberGroupSDict->sort();
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ if (!mg->allMembersInSameSection() || !m_impl->subGrouping) // group is in its own section
{
- if (!mg->allMembersInSameSection() || !m_impl->subGrouping) // group is in its own section
- {
- mg->writeDeclarations(ol,this,0,0,0,showInline);
- }
- else // add this group to the corresponding member section
- {
- //printf("addToDeclarationSection(%s)\n",mg->header().data());
- //mg->addToDeclarationSection();
- }
+ mg->writeDeclarations(ol,this,0,0,0,showInline);
+ }
+ else // add this group to the corresponding member section
+ {
+ //printf("addToDeclarationSection(%s)\n",mg->header().data());
+ //mg->addToDeclarationSection();
}
}
}
@@ -2105,18 +1982,12 @@ void ClassDefImpl::writeMemberGroups(OutputList &ol,bool showInline) const
void ClassDefImpl::writeNestedClasses(OutputList &ol,const QCString &title) const
{
// nested classes
- if (m_impl->innerClasses)
- {
- m_impl->innerClasses->writeDeclaration(ol,0,title,TRUE);
- }
+ m_impl->innerClasses.writeDeclaration(ol,0,title,TRUE);
}
void ClassDefImpl::writeInlineClasses(OutputList &ol) const
{
- if (m_impl->innerClasses)
- {
- m_impl->innerClasses->writeDocumentation(ol,this);
- }
+ m_impl->innerClasses.writeDocumentation(ol,this);
}
void ClassDefImpl::startMemberDocumentation(OutputList &ol) const
@@ -2187,8 +2058,7 @@ void ClassDefImpl::writeSummaryLinks(OutputList &ol) const
for (eli.toFirst();(lde=eli.current());++eli)
{
if (lde->kind()==LayoutDocEntry::ClassNestedClasses &&
- m_impl->innerClasses &&
- m_impl->innerClasses->declVisible()
+ m_impl->innerClasses.declVisible()
)
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
@@ -2196,7 +2066,7 @@ void ClassDefImpl::writeSummaryLinks(OutputList &ol) const
first=FALSE;
}
else if (lde->kind()==LayoutDocEntry::ClassAllMembersLink &&
- m_impl->allMemberNameInfoSDict &&
+ !m_impl->allMemberNameInfoLinkedMap.empty() &&
!Config_getBool(OPTIMIZE_OUTPUT_FOR_C)
)
{
@@ -2217,10 +2087,9 @@ void ClassDefImpl::writeSummaryLinks(OutputList &ol) const
}
else // VDHL only
{
- SDict<QCString>::Iterator li(m_impl->vhdlSummaryTitles);
- for (li.toFirst();li.current();++li)
+ for (const auto &s : m_impl->vhdlSummaryTitles)
{
- ol.writeSummaryLink(0,convertToId(li.current()->data()),li.current()->data(),first);
+ ol.writeSummaryLink(0,convertToId(s.c_str()),s.c_str(),first);
first=FALSE;
}
}
@@ -2235,7 +2104,7 @@ void ClassDefImpl::writeTagFile(FTextStream &tagFile)
{
if (!isLinkableInProject()) return;
tagFile << " <compound kind=\"";
- if (isFortran() && (compoundTypeString() == "type"))
+ if (isFortran() && (compoundTypeString() == "type"))
tagFile << "struct";
else
tagFile << compoundTypeString();
@@ -2257,32 +2126,27 @@ void ClassDefImpl::writeTagFile(FTextStream &tagFile)
{
tagFile << " <templarg>" << convertToXML(a.name) << "</templarg>" << endl;
}
- if (m_impl->inherits)
+ for (const auto &ibcd : m_impl->inherits)
{
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (it.toFirst();(ibcd=it.current());++it)
+ ClassDef *cd=ibcd.classDef;
+ if (cd && cd->isLinkable())
{
- ClassDef *cd=ibcd->classDef;
- if (cd && cd->isLinkable())
+ if (!Config_getString(GENERATE_TAGFILE).isEmpty())
{
- if (!Config_getString(GENERATE_TAGFILE).isEmpty())
+ tagFile << " <base";
+ if (ibcd.prot==Protected)
{
- tagFile << " <base";
- if (ibcd->prot==Protected)
- {
- tagFile << " protection=\"protected\"";
- }
- else if (ibcd->prot==Private)
- {
- tagFile << " protection=\"private\"";
- }
- if (ibcd->virt==Virtual)
- {
- tagFile << " virtualness=\"virtual\"";
- }
- tagFile << ">" << convertToXML(cd->name()) << "</base>" << endl;
+ tagFile << " protection=\"protected\"";
+ }
+ else if (ibcd.prot==Private)
+ {
+ tagFile << " protection=\"private\"";
+ }
+ if (ibcd.virt==Virtual)
+ {
+ tagFile << " virtualness=\"virtual\"";
}
+ tagFile << ">" << convertToXML(cd->name()) << "</base>" << endl;
}
}
}
@@ -2295,20 +2159,15 @@ void ClassDefImpl::writeTagFile(FTextStream &tagFile)
{
case LayoutDocEntry::ClassNestedClasses:
{
- if (m_impl->innerClasses)
+ for (const auto &innerCd : m_impl->innerClasses)
{
- ClassSDict::Iterator cli(*m_impl->innerClasses);
- ClassDef *innerCd;
- for (cli.toFirst();(innerCd=cli.current());++cli)
+ if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
+ protectionLevelVisible(innerCd->protection()) &&
+ !innerCd->isEmbeddedInOuterScope()
+ )
{
- if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
- protectionLevelVisible(innerCd->protection()) &&
- !innerCd->isEmbeddedInOuterScope()
- )
- {
- tagFile << " <class kind=\"" << innerCd->compoundTypeString() <<
- "\">" << convertToXML(innerCd->name()) << "</class>" << endl;
- }
+ tagFile << " <class kind=\"" << innerCd->compoundTypeString() <<
+ "\">" << convertToXML(innerCd->name()) << "</class>" << endl;
}
}
}
@@ -2325,14 +2184,9 @@ void ClassDefImpl::writeTagFile(FTextStream &tagFile)
break;
case LayoutDocEntry::MemberGroups:
{
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeTagFile(tagFile);
- }
+ mg->writeTagFile(tagFile);
}
}
break;
@@ -2610,7 +2464,8 @@ void ClassDefImpl::writeDeclarationLink(OutputList &ol,bool &found,const char *h
if (!briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
{
DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
- briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+ briefDescription(),FALSE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
if (rootNode && !rootNode->isEmpty())
{
ol.startMemberDescription(anchor());
@@ -2904,9 +2759,7 @@ void ClassDefImpl::writeMemberPages(OutputList &ol) const
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : m_impl->memberLists)
{
if (ml->numDocMembers()>ml->numDocEnumValues() && (ml->listType()&MemberListType_detailedLists))
{
@@ -2924,37 +2777,30 @@ void ClassDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *current
ol.writeString(" <div class=\"navtab\">\n");
ol.writeString(" <table>\n");
- if (m_impl->allMemberNameInfoSDict)
+ for (auto &mni : m_impl->allMemberNameInfoLinkedMap)
{
- MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoSDict);
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
+ for (auto &mi : *mni)
{
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
+ const MemberDef *md=mi->memberDef();
+ if (md->getClassDef()==this && md->isLinkable() && !md->isEnumValue())
{
- MemberDef *md=mi->memberDef;
- if (md->getClassDef()==this && md->isLinkable() && !md->isEnumValue())
+ if (md->isLinkableInProject())
{
- ol.writeString(" <tr><td class=\"navtab\">");
- if (md->isLinkableInProject())
+ if (md==currentMd) // selected item => highlight
{
- if (md==currentMd) // selected item => highlight
- {
- ol.writeString("<a class=\"qindexHL\" ");
- }
- else
- {
- ol.writeString("<a class=\"qindex\" ");
- }
- ol.writeString("href=\"");
- if (createSubDirs) ol.writeString("../../");
- ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
- ol.writeString("\">");
- ol.writeString(convertToHtml(md->name()));
- ol.writeString("</a>");
+ ol.writeString(" <tr><td class=\"navtabHL\">");
+ }
+ else
+ {
+ ol.writeString(" <tr><td class=\"navtab\">");
}
+ ol.writeString("<a class=\"navtab\" ");
+ ol.writeString("href=\"");
+ if (createSubDirs) ol.writeString("../../");
+ ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
+ ol.writeString("\">");
+ ol.writeString(convertToHtml(md->name()));
+ ol.writeString("</a>");
ol.writeString("</td></tr>\n");
}
}
@@ -2971,22 +2817,22 @@ void ClassDefImpl::writeDocumentationForInnerClasses(OutputList &ol) const
{
// write inner classes after the parent, so the tag files contain
// the definition in proper order!
- if (m_impl->innerClasses)
+ for (const auto &innerCd : m_impl->innerClasses)
{
- ClassSDict::Iterator cli(*m_impl->innerClasses);
- ClassDef *innerCd;
- for (cli.toFirst();(innerCd=cli.current());++cli)
+ ClassDefMutable *innerCdm = toClassDefMutable(innerCd);
+ if (innerCdm)
{
- if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
+ if (
+ innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
protectionLevelVisible(innerCd->protection()) &&
- !innerCd->isEmbeddedInOuterScope()
+ !innerCd->isEmbeddedInOuterScope()
)
{
msg("Generating docs for nested compound %s...\n",qPrint(innerCd->name()));
- innerCd->writeDocumentation(ol);
- innerCd->writeMemberList(ol);
+ innerCdm->writeDocumentation(ol);
+ innerCdm->writeMemberList(ol);
}
- innerCd->writeDocumentationForInnerClasses(ol);
+ innerCdm->writeDocumentationForInnerClasses(ol);
}
}
}
@@ -2998,7 +2844,7 @@ void ClassDefImpl::writeMemberList(OutputList &ol) const
//static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
- if (m_impl->allMemberNameInfoSDict==0 || cOpt) return;
+ if (m_impl->allMemberNameInfoLinkedMap.empty() || cOpt) return;
// only for HTML
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
@@ -3052,18 +2898,13 @@ void ClassDefImpl::writeMemberList(OutputList &ol) const
bool first = true; // to prevent empty table
int idx=0;
- //MemberNameInfo *mni=m_impl->allMemberNameInfoList->first();
- MemberNameInfoSDict::Iterator mnii(*m_impl->allMemberNameInfoSDict);
- MemberNameInfo *mni;
- for (mnii.toFirst();(mni=mnii.current());++mnii)
- {
- MemberNameInfoIterator it(*mni);
- MemberInfo *mi;
- for (;(mi=it.current());++it)
+ for (auto &mni : m_impl->allMemberNameInfoLinkedMap)
+ {
+ for (auto &mi : *mni)
{
- MemberDef *md=mi->memberDef;
+ const MemberDef *md=mi->memberDef();
const ClassDef *cd=md->getClassDef();
- Protection prot = mi->prot;
+ Protection prot = mi->prot();
Specifier virt=md->virtualness();
//printf("%s: Member %s of class %s md->protection()=%d mi->prot=%d prot=%d inherited=%d\n",
@@ -3075,7 +2916,7 @@ void ClassDefImpl::writeMemberList(OutputList &ol) const
if (cd->isLinkable() && md->isLinkable())
// create a link to the documentation
{
- QCString name=mi->ambiguityResolutionScope+md->name();
+ QCString name=mi->ambiguityResolutionScope()+md->name();
//ol.writeListItem();
if (first)
{
@@ -3276,33 +3117,15 @@ void ClassDefImpl::writeMemberList(OutputList &ol) const
}
// add a reference to an example
-bool ClassDefImpl::addExample(const char *anchor,const char *nameStr,
- const char *file)
+bool ClassDefImpl::addExample(const char *anchor,const char *nameStr, const char *file)
{
- if (m_impl->exampleSDict==0)
- {
- m_impl->exampleSDict = new ExampleSDict;
- m_impl->exampleSDict->setAutoDelete(TRUE);
- }
- if (!m_impl->exampleSDict->find(nameStr))
- {
- Example *e=new Example;
- e->anchor=anchor;
- e->name=nameStr;
- e->file=file;
- m_impl->exampleSDict->inSort(nameStr,e);
- return TRUE;
- }
- return FALSE;
+ return m_impl->examples.inSort(Example(anchor,nameStr,file));
}
// returns TRUE if this class is used in an example
bool ClassDefImpl::hasExamples() const
{
- bool result=FALSE;
- if (m_impl->exampleSDict)
- result = m_impl->exampleSDict->count()>0;
- return result;
+ return !m_impl->examples.empty();
}
void ClassDefImpl::addTypeConstraint(const QCString &typeConstraint,const QCString &type)
@@ -3310,15 +3133,25 @@ void ClassDefImpl::addTypeConstraint(const QCString &typeConstraint,const QCStri
//printf("addTypeConstraint(%s,%s)\n",type.data(),typeConstraint.data());
static bool hideUndocRelation = Config_getBool(HIDE_UNDOC_RELATIONS);
if (typeConstraint.isEmpty() || type.isEmpty()) return;
- ClassDef *cd = const_cast<ClassDef*>(getResolvedClass(this,getFileDef(),typeConstraint));
+ SymbolResolver resolver(getFileDef());
+ ClassDefMutable *cd = resolver.resolveClassMutable(this,typeConstraint);
if (cd==0 && !hideUndocRelation)
{
- cd = new ClassDefImpl(getDefFileName(),getDefLine(),getDefColumn(),typeConstraint,ClassDef::Class);
- cd->setUsedOnly(TRUE);
- cd->setLanguage(getLanguage());
- Doxygen::hiddenClasses->append(typeConstraint,cd);
- //printf("Adding undocumented constraint '%s' to class %s on type %s\n",
- // typeConstraint.data(),name().data(),type.data());
+ cd = toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(typeConstraint,
+ std::unique_ptr<ClassDef>(
+ new ClassDefImpl(
+ getDefFileName(),getDefLine(),
+ getDefColumn(),
+ typeConstraint,
+ ClassDef::Class))));
+ if (cd)
+ {
+ cd->setUsedOnly(TRUE);
+ cd->setLanguage(getLanguage());
+ //printf("Adding undocumented constraint '%s' to class %s on type %s\n",
+ // typeConstraint.data(),name().data(),type.data());
+ }
}
if (cd)
{
@@ -3354,7 +3187,7 @@ void ClassDefImpl::addTypeConstraints()
addTypeConstraint(typeConstraint,a.type);
p=i+1;
}
- typeConstraint = a.typeConstraint.right(a.typeConstraint.length()-p).stripWhiteSpace();
+ typeConstraint = a.typeConstraint.right(a.typeConstraint.length()-(uint)p).stripWhiteSpace();
addTypeConstraint(typeConstraint,a.type);
}
}
@@ -3381,29 +3214,29 @@ bool ClassDefImpl::hasNonReferenceSuperClass() const
{
return TRUE; // we're done if this class is not a reference
}
- if (m_impl->inheritedBy)
+ for (const auto &ibcd : m_impl->inheritedBy)
{
- BaseClassListIterator bcli(*m_impl->inheritedBy);
- for ( ; bcli.current() && !found ; ++bcli ) // for each super class
+ ClassDef *bcd=ibcd.classDef;
+ // recurse into the super class branch
+ found = found || bcd->hasNonReferenceSuperClass();
+ if (!found)
{
- ClassDef *bcd=bcli.current()->classDef;
- // recurse into the super class branch
- found = found || bcd->hasNonReferenceSuperClass();
- if (!found)
+ // look for template instances that might have non-reference super classes
+ QDict<ClassDef> *cil = bcd->getTemplateInstances();
+ if (cil)
{
- // look for template instances that might have non-reference super classes
- QDict<ClassDef> *cil = bcd->getTemplateInstances();
- if (cil)
+ QDictIterator<ClassDef> tidi(*cil);
+ for ( ; tidi.current() && !found ; ++tidi) // for each template instance
{
- QDictIterator<ClassDef> tidi(*cil);
- for ( ; tidi.current() && !found ; ++tidi) // for each template instance
- {
- // recurse into the template instance branch
- found = found || tidi.current()->hasNonReferenceSuperClass();
- }
+ // recurse into the template instance branch
+ found = found || tidi.current()->hasNonReferenceSuperClass();
}
}
}
+ else
+ {
+ break;
+ }
}
return found;
}
@@ -3436,15 +3269,10 @@ void ClassDefImpl::writeDeclaration(OutputList &ol,const MemberDef *md,bool inGr
ol.endMemberItem();
// write user defined member groups
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->setInGroup(inGroup);
- mg->writePlainDeclarations(ol,this,0,0,0,inheritedFrom,inheritId);
- }
+ mg->setInGroup(inGroup);
+ mg->writePlainDeclarations(ol,this,0,0,0,inheritedFrom,inheritId);
}
QListIterator<LayoutDocEntry> eli(
@@ -3499,16 +3327,14 @@ bool ClassDefImpl::isLinkable() const
/*! the class is visible in a class diagram, or class hierarchy */
bool ClassDefImpl::isVisibleInHierarchy() const
{
- static bool allExternals = Config_getBool(ALLEXTERNALS);
- static bool hideUndocClasses = Config_getBool(HIDE_UNDOC_CLASSES);
- static bool extractStatic = Config_getBool(EXTRACT_STATIC);
+ bool allExternals = Config_getBool(ALLEXTERNALS);
+ bool hideUndocClasses = Config_getBool(HIDE_UNDOC_CLASSES);
+ bool extractStatic = Config_getBool(EXTRACT_STATIC);
return // show all classes or a subclass is visible
- (allExternals || hasNonReferenceSuperClass()) &&
+ ((allExternals && !isArtificial()) || hasNonReferenceSuperClass()) &&
// and not an anonymous compound
!isAnonymous() &&
- // not an artificially introduced class
- /*!isArtificial() &&*/ // 1.8.2: allowed these to appear
// and not privately inherited
protectionLevelVisible(m_impl->prot) &&
// documented or shown anyway or documentation is external
@@ -3523,7 +3349,7 @@ bool ClassDefImpl::isVisibleInHierarchy() const
bool ClassDefImpl::hasDocumentation() const
{
- return DefinitionImpl::hasDocumentation();
+ return DefinitionMixin::hasDocumentation();
}
//----------------------------------------------------------------------
@@ -3540,21 +3366,12 @@ bool ClassDefImpl::isBaseClass(const ClassDef *bcd, bool followInstances,int lev
err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(name()),qPrint(bcd->name()));
return FALSE;
}
- if (baseClasses())
+ for (const auto &bclass : baseClasses())
{
- // Beware: trying to optimise the iterator away using ->first() & ->next()
- // causes bug 625531
- BaseClassListIterator bcli(*baseClasses());
- for ( ; bcli.current() && !found ; ++bcli)
- {
- const ClassDef *ccd=bcli.current()->classDef;
- if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
- //printf("isBaseClass() baseclass %s\n",ccd->name().data());
- if (ccd==bcd)
- found=TRUE;
- else
- found=ccd->isBaseClass(bcd,followInstances,level+1);
- }
+ const ClassDef *ccd = bclass.classDef;
+ if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
+ found = (ccd==bcd) || ccd->isBaseClass(bcd,followInstances,level+1);
+ if (found) break;
}
return found;
}
@@ -3569,17 +3386,11 @@ bool ClassDefImpl::isSubClass(ClassDef *cd,int level) const
err("Possible recursive class relation while inside %s and looking for derived class %s\n",qPrint(name()),qPrint(cd->name()));
return FALSE;
}
- if (subClasses())
+ for (const auto &iscd : subClasses())
{
- BaseClassListIterator bcli(*subClasses());
- for ( ; bcli.current() && !found ; ++bcli)
- {
- ClassDef *ccd=bcli.current()->classDef;
- if (ccd==cd)
- found=TRUE;
- else
- found=ccd->isSubClass(cd,level+1);
- }
+ ClassDef *ccd=iscd.classDef;
+ found = (ccd==cd) || ccd->isSubClass(cd,level+1);
+ if (found) break;
}
return found;
}
@@ -3606,238 +3417,215 @@ void ClassDefImpl::mergeMembers()
//static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
SrcLangExt lang = getLanguage();
QCString sep=getLanguageSpecificSeparator(lang,TRUE);
- int sepLen = sep.length();
+ uint sepLen = sep.length();
m_impl->membersMerged=TRUE;
//printf(" mergeMembers for %s\n",name().data());
static bool inlineInheritedMembers = Config_getBool(INLINE_INHERITED_MEMB);
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
- if (baseClasses())
+ for (const auto &bcd : baseClasses())
{
- //printf(" => has base classes!\n");
- BaseClassListIterator bcli(*baseClasses());
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
+ ClassDefMutable *bClass=toClassDefMutable(bcd.classDef);
+ if (bClass)
{
- ClassDef *bClass=bcd->classDef;
-
// merge the members in the base class of this inheritance branch first
bClass->mergeMembers();
- MemberNameInfoSDict *srcMnd = bClass->memberNameInfoSDict();
- MemberNameInfoSDict *dstMnd = m_impl->allMemberNameInfoSDict;
+ const MemberNameInfoLinkedMap &srcMnd = bClass->memberNameInfoLinkedMap();
+ MemberNameInfoLinkedMap &dstMnd = m_impl->allMemberNameInfoLinkedMap;
- if (srcMnd)
+ for (auto &srcMni : srcMnd)
{
- MemberNameInfoSDict::Iterator srcMnili(*srcMnd);
- MemberNameInfo *srcMni;
- for ( ; (srcMni=srcMnili.current()) ; ++srcMnili)
+ //printf(" Base member name %s\n",srcMni->memberName());
+ MemberNameInfo *dstMni;
+ if ((dstMni=dstMnd.find(srcMni->memberName())))
+ // a member with that name is already in the class.
+ // the member may hide or reimplement the one in the sub class
+ // or there may be another path to the base class that is already
+ // visited via another branch in the class hierarchy.
{
- //printf(" Base member name %s\n",srcMni->memberName());
- MemberNameInfo *dstMni;
- if (dstMnd!=0 && (dstMni=dstMnd->find(srcMni->memberName())))
- // a member with that name is already in the class.
- // the member may hide or reimplement the one in the sub class
- // or there may be another path to the base class that is already
- // visited via another branch in the class hierarchy.
+ for (auto &srcMi : *srcMni)
{
- MemberNameInfoIterator srcMnii(*srcMni);
- MemberInfo *srcMi;
- for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
+ MemberDef *srcMd = srcMi->memberDef();
+ bool found=FALSE;
+ bool ambiguous=FALSE;
+ bool hidden=FALSE;
+ const ClassDef *srcCd = srcMd->getClassDef();
+ for (auto &dstMi : *dstMni)
{
- MemberDef *srcMd = srcMi->memberDef;
- bool found=FALSE;
- bool ambiguous=FALSE;
- bool hidden=FALSE;
- MemberNameInfoIterator dstMnii(*dstMni);
- MemberInfo *dstMi;
- const ClassDef *srcCd = srcMd->getClassDef();
- for ( ; (dstMi=dstMnii.current()) && !found; ++dstMnii )
+ MemberDef *dstMd = dstMi->memberDef();
+ if (srcMd!=dstMd) // different members
{
- MemberDef *dstMd = dstMi->memberDef;
- if (srcMd!=dstMd) // different members
+ const ClassDef *dstCd = dstMd->getClassDef();
+ //printf(" Is %s a base class of %s?\n",srcCd->name().data(),dstCd->name().data());
+ if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE))
+ // member is in the same or a base class
{
- const ClassDef *dstCd = dstMd->getClassDef();
- //printf(" Is %s a base class of %s?\n",srcCd->name().data(),dstCd->name().data());
- if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE))
- // member is in the same or a base class
- {
- ArgumentList &srcAl = srcMd->argumentList();
- ArgumentList &dstAl = dstMd->argumentList();
- found=matchArguments2(
- srcMd->getOuterScope(),srcMd->getFileDef(),srcAl,
- dstMd->getOuterScope(),dstMd->getFileDef(),dstAl,
- TRUE
- );
- //printf(" Yes, matching (%s<->%s): %d\n",
- // argListToString(srcMd->argumentList()).data(),
- // argListToString(dstMd->argumentList()).data(),
- // found);
- hidden = hidden || !found;
- }
- else // member is in a non base class => multiple inheritance
- // using the same base class.
- {
- //printf("$$ Existing member %s %s add scope %s\n",
- // dstMi->ambiguityResolutionScope.data(),
- // dstMd->name().data(),
- // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
-
- QCString scope=dstMi->scopePath.left(dstMi->scopePath.find(sep)+sepLen);
- if (scope!=dstMi->ambiguityResolutionScope.left(scope.length()))
- dstMi->ambiguityResolutionScope.prepend(scope);
- ambiguous=TRUE;
- }
+ ArgumentList &srcAl = const_cast<ArgumentList&>(srcMd->argumentList());
+ ArgumentList &dstAl = const_cast<ArgumentList&>(dstMd->argumentList());
+ found=matchArguments2(
+ srcMd->getOuterScope(),srcMd->getFileDef(),&srcAl,
+ dstMd->getOuterScope(),dstMd->getFileDef(),&dstAl,
+ TRUE
+ );
+ //printf(" Yes, matching (%s<->%s): %d\n",
+ // argListToString(srcMd->argumentList()).data(),
+ // argListToString(dstMd->argumentList()).data(),
+ // found);
+ hidden = hidden || !found;
}
- else // same members
+ else // member is in a non base class => multiple inheritance
+ // using the same base class.
{
- // do not add if base class is virtual or
- // if scope paths are equal or
- // if base class is an interface (and thus implicitly virtual).
- //printf("same member found srcMi->virt=%d dstMi->virt=%d\n",srcMi->virt,dstMi->virt);
- if ((srcMi->virt!=Normal && dstMi->virt!=Normal) ||
- bClass->name()+sep+srcMi->scopePath == dstMi->scopePath ||
- dstMd->getClassDef()->compoundType()==Interface
- )
- {
- found=TRUE;
- }
- else // member can be reached via multiple paths in the
- // inheritance tree
+ //printf("$$ Existing member %s %s add scope %s\n",
+ // dstMi->ambiguityResolutionScope.data(),
+ // dstMd->name().data(),
+ // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
+
+ QCString scope=dstMi->scopePath().left((uint)dstMi->scopePath().find(sep)+sepLen);
+ if (scope!=dstMi->ambiguityResolutionScope().left(scope.length()))
{
- //printf("$$ Existing member %s %s add scope %s\n",
- // dstMi->ambiguityResolutionScope.data(),
- // dstMd->name().data(),
- // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
-
- QCString scope=dstMi->scopePath.left(dstMi->scopePath.find(sep)+sepLen);
- if (scope!=dstMi->ambiguityResolutionScope.left(scope.length()))
- {
- dstMi->ambiguityResolutionScope.prepend(scope);
- }
- ambiguous=TRUE;
+ dstMi->setAmbiguityResolutionScope(scope+dstMi->ambiguityResolutionScope());
}
+ ambiguous=TRUE;
}
}
- //printf("member %s::%s hidden %d ambiguous %d srcMi->ambigClass=%p\n",
- // srcCd->name().data(),srcMd->name().data(),hidden,ambiguous,srcMi->ambigClass);
-
- // TODO: fix the case where a member is hidden by inheritance
- // of a member with the same name but with another prototype,
- // while there is more than one path to the member in the
- // base class due to multiple inheritance. In this case
- // it seems that the member is not reachable by prefixing a
- // scope name either (according to my compiler). Currently,
- // this case is shown anyway.
- if (!found && srcMd->protection()!=Private && !srcMd->isFriend())
+ else // same members
{
- Protection prot=srcMd->protection();
- if (bcd->prot==Protected && prot==Public) prot=bcd->prot;
- else if (bcd->prot==Private) prot=bcd->prot;
-
- if (inlineInheritedMembers)
+ // do not add if base class is virtual or
+ // if scope paths are equal or
+ // if base class is an interface (and thus implicitly virtual).
+ //printf("same member found srcMi->virt=%d dstMi->virt=%d\n",srcMi->virt,dstMi->virt);
+ if ((srcMi->virt()!=Normal && dstMi->virt()!=Normal) ||
+ bClass->name()+sep+srcMi->scopePath() == dstMi->scopePath() ||
+ dstMd->getClassDef()->compoundType()==Interface
+ )
+ {
+ found=TRUE;
+ }
+ else // member can be reached via multiple paths in the
+ // inheritance tree
{
- if (!isStandardFunc(srcMd))
+ //printf("$$ Existing member %s %s add scope %s\n",
+ // dstMi->ambiguityResolutionScope.data(),
+ // dstMd->name().data(),
+ // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
+
+ QCString scope=dstMi->scopePath().left((uint)dstMi->scopePath().find(sep)+sepLen);
+ if (scope!=dstMi->ambiguityResolutionScope().left(scope.length()))
{
- //printf(" insertMember '%s'\n",srcMd->name().data());
- internalInsertMember(srcMd,prot,FALSE);
+ dstMi->setAmbiguityResolutionScope(dstMi->ambiguityResolutionScope()+scope);
}
+ ambiguous=TRUE;
}
+ }
+ if (found) break;
+ }
+ //printf("member %s::%s hidden %d ambiguous %d srcMi->ambigClass=%p\n",
+ // srcCd->name().data(),srcMd->name().data(),hidden,ambiguous,srcMi->ambigClass);
+
+ // TODO: fix the case where a member is hidden by inheritance
+ // of a member with the same name but with another prototype,
+ // while there is more than one path to the member in the
+ // base class due to multiple inheritance. In this case
+ // it seems that the member is not reachable by prefixing a
+ // scope name either (according to my compiler). Currently,
+ // this case is shown anyway.
+ if (!found && srcMd->protection()!=Private && !srcMd->isFriend())
+ {
+ Protection prot=srcMd->protection();
+ if (bcd.prot==Protected && prot==Public) prot=bcd.prot;
+ else if (bcd.prot==Private) prot=bcd.prot;
- Specifier virt=srcMi->virt;
- if (srcMi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
-
- MemberInfo *newMi = new MemberInfo(srcMd,prot,virt,TRUE);
- newMi->scopePath=bClass->name()+sep+srcMi->scopePath;
- if (ambiguous)
+ if (inlineInheritedMembers)
+ {
+ if (!isStandardFunc(srcMd))
{
- //printf("$$ New member %s %s add scope %s::\n",
- // srcMi->ambiguityResolutionScope.data(),
- // srcMd->name().data(),
- // bClass->name().data());
+ //printf(" insertMember '%s'\n",srcMd->name().data());
+ internalInsertMember(srcMd,prot,FALSE);
+ }
+ }
- QCString scope=bClass->name()+sep;
- if (scope!=srcMi->ambiguityResolutionScope.left(scope.length()))
- {
- newMi->ambiguityResolutionScope=
- scope+srcMi->ambiguityResolutionScope.copy();
- }
+ Specifier virt=srcMi->virt();
+ if (virt==Normal && bcd.virt!=Normal) virt=bcd.virt;
+
+ std::unique_ptr<MemberInfo> newMi = std::make_unique<MemberInfo>(srcMd,prot,virt,TRUE);
+ newMi->setScopePath(bClass->name()+sep+srcMi->scopePath());
+ if (ambiguous)
+ {
+ //printf("$$ New member %s %s add scope %s::\n",
+ // srcMi->ambiguityResolutionScope.data(),
+ // srcMd->name().data(),
+ // bClass->name().data());
+
+ QCString scope=bClass->name()+sep;
+ if (scope!=srcMi->ambiguityResolutionScope().left(scope.length()))
+ {
+ newMi->setAmbiguityResolutionScope(scope+srcMi->ambiguityResolutionScope());
}
- if (hidden)
+ }
+ if (hidden)
+ {
+ if (srcMi->ambigClass()==0)
{
- if (srcMi->ambigClass==0)
- {
- newMi->ambigClass=bClass;
- newMi->ambiguityResolutionScope=bClass->name()+sep;
- }
- else
- {
- newMi->ambigClass=srcMi->ambigClass;
- newMi->ambiguityResolutionScope=srcMi->ambigClass->name()+sep;
- }
+ newMi->setAmbigClass(bClass);
+ newMi->setAmbiguityResolutionScope(bClass->name()+sep);
+ }
+ else
+ {
+ newMi->setAmbigClass(srcMi->ambigClass());
+ newMi->setAmbiguityResolutionScope(srcMi->ambigClass()->name()+sep);
}
- dstMni->append(newMi);
}
+ dstMni->push_back(std::move(newMi));
}
}
- else // base class has a member that is not in the sub class => copy
+ }
+ else // base class has a member that is not in the sub class => copy
+ {
+ // create a deep copy of the list (only the MemberInfo's will be
+ // copied, not the actual MemberDef's)
+ MemberNameInfo *newMni = dstMnd.add(srcMni->memberName());
+
+ // copy the member(s) from the base to the sub class
+ for (auto &mi : *srcMni)
{
- // create a deep copy of the list (only the MemberInfo's will be
- // copied, not the actual MemberDef's)
- MemberNameInfo *newMni = 0;
- newMni = new MemberNameInfo(srcMni->memberName());
-
- // copy the member(s) from the base to the sub class
- MemberNameInfoIterator mnii(*srcMni);
- MemberInfo *mi;
- for (;(mi=mnii.current());++mnii)
+ if (!mi->memberDef()->isFriend()) // don't inherit friends
{
- if (!mi->memberDef->isFriend()) // don't inherit friends
+ Protection prot = mi->prot();
+ if (bcd.prot==Protected)
{
- Protection prot = mi->prot;
- if (bcd->prot==Protected)
- {
- if (prot==Public) prot=Protected;
- }
- else if (bcd->prot==Private)
- {
- prot=Private;
- }
- //printf("%s::%s: prot=%d bcd->prot=%d result=%d\n",
- // name().data(),mi->memberDef->name().data(),mi->prot,
- // bcd->prot,prot);
+ if (prot==Public) prot=Protected;
+ }
+ else if (bcd.prot==Private)
+ {
+ prot=Private;
+ }
+ //printf("%s::%s: prot=%d bcd.prot=%d result=%d\n",
+ // name().data(),mi->memberDef->name().data(),mi->prot,
+ // bcd.prot,prot);
- if (prot!=Private || extractPrivate)
- {
- Specifier virt=mi->virt;
- if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
+ if (prot!=Private || extractPrivate)
+ {
+ Specifier virt=mi->virt();
+ if (virt==Normal && bcd.virt!=Normal) virt=bcd.virt;
- if (inlineInheritedMembers)
+ if (inlineInheritedMembers)
+ {
+ if (!isStandardFunc(mi->memberDef()))
{
- if (!isStandardFunc(mi->memberDef))
- {
- //printf(" insertMember '%s'\n",mi->memberDef->name().data());
- internalInsertMember(mi->memberDef,prot,FALSE);
- }
+ //printf(" insertMember '%s'\n",mi->memberDef->name().data());
+ internalInsertMember(mi->memberDef(),prot,FALSE);
}
- //printf("Adding!\n");
- MemberInfo *newMi=new MemberInfo(mi->memberDef,prot,virt,TRUE);
- newMi->scopePath=bClass->name()+sep+mi->scopePath;
- newMi->ambigClass=mi->ambigClass;
- newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope.copy();
- newMni->append(newMi);
}
+ //printf("Adding!\n");
+ std::unique_ptr<MemberInfo> newMi = std::make_unique<MemberInfo>(mi->memberDef(),prot,virt,TRUE);
+ newMi->setScopePath(bClass->name()+sep+mi->scopePath());
+ newMi->setAmbigClass(mi->ambigClass());
+ newMi->setAmbiguityResolutionScope(mi->ambiguityResolutionScope());
+ newMni->push_back(std::move(newMi));
}
}
-
- if (dstMnd==0)
- {
- m_impl->allMemberNameInfoSDict = new MemberNameInfoSDict(17);
- m_impl->allMemberNameInfoSDict->setAutoDelete(TRUE);
- dstMnd = m_impl->allMemberNameInfoSDict;
- }
- // add it to the dictionary
- dstMnd->append(newMni->memberName(),newMni);
}
}
}
@@ -3850,137 +3638,114 @@ void ClassDefImpl::mergeMembers()
/*! Merges the members of a Objective-C category into this class.
*/
-void ClassDefImpl::mergeCategory(ClassDef *category)
+void ClassDefImpl::mergeCategory(ClassDef *cat)
{
- static bool extractLocalMethods = Config_getBool(EXTRACT_LOCAL_METHODS);
- bool makePrivate = category->isLocal();
- // in case extract local methods is not enabled we don't add the methods
- // of the category in case it is defined in the .m file.
- if (makePrivate && !extractLocalMethods) return;
- bool isExtension = category->isExtension();
-
- category->setCategoryOf(this);
- if (isExtension)
+ ClassDefMutable *category = toClassDefMutable(cat);
+ if (category)
{
- category->setArtificial(TRUE);
+ static bool extractLocalMethods = Config_getBool(EXTRACT_LOCAL_METHODS);
+ bool makePrivate = category->isLocal();
+ // in case extract local methods is not enabled we don't add the methods
+ // of the category in case it is defined in the .m file.
+ if (makePrivate && !extractLocalMethods) return;
+ bool isExtension = category->isExtension();
- // copy base classes/protocols from extension
- if (category->baseClasses())
+ category->setCategoryOf(this);
+ if (isExtension)
{
- BaseClassListIterator bcli(*category->baseClasses());
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
+ category->setArtificial(TRUE);
+
+ // copy base classes/protocols from extension
+ for (const auto &bcd : category->baseClasses())
{
- insertBaseClass(bcd->classDef,bcd->usedName,bcd->prot,bcd->virt,bcd->templSpecifiers);
- // correct bcd->classDef so that they do no longer derive from
+ insertBaseClass(bcd.classDef,bcd.usedName,bcd.prot,bcd.virt,bcd.templSpecifiers);
+ // correct bcd.classDef so that they do no longer derive from
// category, but from this class!
- if (bcd->classDef->subClasses())
+ BaseClassList scl = bcd.classDef->subClasses();
+ for (auto &scd : scl)
{
- BaseClassListIterator scli(*bcd->classDef->subClasses());
- BaseClassDef *scd;
- for ( ; (scd=scli.current()) ; ++scli )
+ if (scd.classDef==category)
{
- if (scd->classDef==category)
- {
- scd->classDef=this;
- }
+ scd.classDef=this;
}
}
+ bcd.classDef->updateSubClasses(scl);
}
}
+ // make methods private for categories defined in the .m file
+ //printf("%s::mergeCategory makePrivate=%d\n",name().data(),makePrivate);
- }
- // make methods private for categories defined in the .m file
- //printf("%s::mergeCategory makePrivate=%d\n",name().data(),makePrivate);
-
- MemberNameInfoSDict *srcMnd = category->memberNameInfoSDict();
- MemberNameInfoSDict *dstMnd = m_impl->allMemberNameInfoSDict;
+ const MemberNameInfoLinkedMap &srcMnd = category->memberNameInfoLinkedMap();
+ MemberNameInfoLinkedMap &dstMnd = m_impl->allMemberNameInfoLinkedMap;
- if (srcMnd && dstMnd)
- {
- MemberNameInfoSDict::Iterator srcMnili(*srcMnd);
- MemberNameInfo *srcMni;
- for ( ; (srcMni=srcMnili.current()) ; ++srcMnili)
+ for (auto &srcMni : srcMnd)
{
- MemberNameInfo *dstMni=dstMnd->find(srcMni->memberName());
+ MemberNameInfo *dstMni=dstMnd.find(srcMni->memberName());
if (dstMni) // method is already defined in the class
{
//printf("Existing member %s\n",srcMni->memberName());
- MemberInfo *dstMi = dstMni->getFirst();
- MemberInfo *srcMi = srcMni->getFirst();
- //if (dstMi)
- //{
- // Protection prot = dstMi->prot;
- // if (makePrivate || isExtension)
- // {
- // prot = Private;
- // removeMemberFromLists(dstMi->memberDef);
- // internalInsertMember(dstMi->memberDef,prot,FALSE);
- // }
- //}
+ auto &dstMi = dstMni->front();
+ auto &srcMi = srcMni->front();
if (srcMi && dstMi)
{
- combineDeclarationAndDefinition(srcMi->memberDef,dstMi->memberDef);
- dstMi->memberDef->setCategory(category);
- dstMi->memberDef->setCategoryRelation(srcMi->memberDef);
- srcMi->memberDef->setCategoryRelation(dstMi->memberDef);
+ MemberDefMutable *smdm = toMemberDefMutable(srcMi->memberDef());
+ MemberDefMutable *dmdm = toMemberDefMutable(dstMi->memberDef());
+ if (smdm && dmdm)
+ {
+ combineDeclarationAndDefinition(smdm,dmdm);
+ dmdm->setCategory(category);
+ dmdm->setCategoryRelation(smdm);
+ smdm->setCategoryRelation(dmdm);
+ }
}
}
else // new method name
{
//printf("New member %s\n",srcMni->memberName());
// create a deep copy of the list
- MemberNameInfo *newMni = 0;
- newMni = new MemberNameInfo(srcMni->memberName());
+ MemberNameInfo *newMni = dstMnd.add(srcMni->memberName());
// copy the member(s) from the category to this class
- MemberNameInfoIterator mnii(*srcMni);
- MemberInfo *mi;
- for (;(mi=mnii.current());++mnii)
+ for (auto &mi : *srcMni)
{
//printf("Adding '%s'\n",mi->memberDef->name().data());
- Protection prot = mi->prot;
+ Protection prot = mi->prot();
//if (makePrivate) prot = Private;
- MemberDef *newMd = mi->memberDef->deepCopy();
+ std::unique_ptr<MemberDefMutable> newMd { toMemberDefMutable(mi->memberDef()->deepCopy()) };
if (newMd)
{
//printf("Copying member %s\n",mi->memberDef->name().data());
newMd->moveTo(this);
- MemberInfo *newMi=new MemberInfo(newMd,prot,mi->virt,mi->inherited);
- newMi->scopePath=mi->scopePath;
- newMi->ambigClass=mi->ambigClass;
- newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope;
- newMni->append(newMi);
+ std::unique_ptr<MemberInfo> newMi=std::make_unique<MemberInfo>(newMd.get(),prot,mi->virt(),mi->inherited());
+ newMi->setScopePath(mi->scopePath());
+ newMi->setAmbigClass(mi->ambigClass());
+ newMi->setAmbiguityResolutionScope(mi->ambiguityResolutionScope());
+ newMni->push_back(std::move(newMi));
// also add the newly created member to the global members list
- MemberName *mn;
QCString name = newMd->name();
- if ((mn=Doxygen::memberNameSDict->find(name)))
+ MemberName *mn = Doxygen::memberNameLinkedMap->add(name);
+
+ if (newMd)
{
- mn->append(newMd);
+ newMd->setCategory(category);
+ newMd->setCategoryRelation(mi->memberDef());
}
- else
+ MemberDefMutable *mdm = toMemberDefMutable(mi->memberDef());
+ if (mdm)
{
- mn = new MemberName(newMd->name());
- mn->append(newMd);
- Doxygen::memberNameSDict->append(name,mn);
+ mdm->setCategoryRelation(newMd.get());
}
-
- newMd->setCategory(category);
- newMd->setCategoryRelation(mi->memberDef);
- mi->memberDef->setCategoryRelation(newMd);
- if (makePrivate || isExtension)
+ if (newMd && (makePrivate || isExtension))
{
- newMd->makeImplementationDetail();
+ newMd->makeImplementationDetail();
}
- internalInsertMember(newMd,prot,FALSE);
+ internalInsertMember(newMd.get(),prot,FALSE);
+ mn->push_back(std::move(newMd));
}
- }
-
- // add it to the dictionary
- dstMnd->append(newMni->memberName(),newMni);
+ }
}
}
}
@@ -4098,15 +3863,15 @@ QCString ClassDefImpl::getOutputFileBase() const
if (!Doxygen::generatingXmlOutput)
{
Definition *scope=0;
- if (inlineGroupedClasses && partOfGroups()!=0)
+ if (inlineGroupedClasses && !partOfGroups().empty())
{
// point to the group that embeds this class
- return partOfGroups()->at(0)->getOutputFileBase();
+ return partOfGroups().front()->getOutputFileBase();
}
- else if (inlineSimpleClasses && m_impl->isSimple && partOfGroups()!=0)
+ else if (inlineSimpleClasses && m_impl->isSimple && !partOfGroups().empty())
{
// point to simple struct inside a group
- return partOfGroups()->at(0)->getOutputFileBase();
+ return partOfGroups().front()->getOutputFileBase();
}
else if (inlineSimpleClasses && m_impl->isSimple && (scope=getOuterScope()))
{
@@ -4141,7 +3906,7 @@ QCString ClassDefImpl::getSourceFileBase() const
}
else
{
- return DefinitionImpl::getSourceFileBase();
+ return DefinitionMixin::getSourceFileBase();
}
}
@@ -4149,20 +3914,18 @@ void ClassDefImpl::setGroupDefForAllMembers(GroupDef *gd,Grouping::GroupPri_t pr
{
gd->addClass(this);
//printf("ClassDefImpl::setGroupDefForAllMembers(%s)\n",gd->name().data());
- if (m_impl->allMemberNameInfoSDict==0) return;
- MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoSDict);
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
- {
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
+ for (auto &mni : m_impl->allMemberNameInfoLinkedMap)
+ {
+ for (auto &mi : *mni)
{
- MemberDef *md=mi->memberDef;
- md->setGroupDef(gd,pri,fileName,startLine,hasDocs);
- gd->insertMember(md,TRUE);
- ClassDef *innerClass = md->getClassDefOfAnonymousType();
- if (innerClass) innerClass->setGroupDefForAllMembers(gd,pri,fileName,startLine,hasDocs);
+ MemberDefMutable *md = toMemberDefMutable(mi->memberDef());
+ if (md)
+ {
+ md->setGroupDef(gd,pri,fileName,startLine,hasDocs);
+ gd->insertMember(md,TRUE);
+ ClassDefMutable *innerClass = toClassDefMutable(md->getClassDefOfAnonymousType());
+ if (innerClass) innerClass->setGroupDefForAllMembers(gd,pri,fileName,startLine,hasDocs);
+ }
}
}
}
@@ -4173,23 +3936,13 @@ void ClassDefImpl::addInnerCompound(const Definition *d)
if (d->definitionType()==Definition::TypeClass) // only classes can be
// nested in classes.
{
- if (m_impl->innerClasses==0)
- {
- m_impl->innerClasses = new ClassSDict(17);
- }
- m_impl->innerClasses->inSort(d->localName(),dynamic_cast<const ClassDef *>(d));
+ m_impl->innerClasses.add(d->localName(),toClassDef(d));
}
}
-Definition *ClassDefImpl::findInnerCompound(const char *name) const
+const Definition *ClassDefImpl::findInnerCompound(const char *name) const
{
- Definition *result=0;
- if (name==0) return 0;
- if (m_impl->innerClasses)
- {
- result = m_impl->innerClasses->find(name);
- }
- return result;
+ return m_impl->innerClasses.find(name);
}
ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
@@ -4200,18 +3953,49 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
{
m_impl->templateInstances = new QDict<ClassDef>(17);
}
- ClassDef *templateClass=m_impl->templateInstances->find(templSpec);
+ ClassDefMutable *templateClass=toClassDefMutable(m_impl->templateInstances->find(templSpec));
if (templateClass==0)
{
- Debug::print(Debug::Classes,0," New template instance class '%s''%s'\n",qPrint(name()),qPrint(templSpec));
QCString tcname = removeRedundantWhiteSpace(localName()+templSpec);
- templateClass = new ClassDefImpl(
- fileName,startLine,startColumn,tcname,ClassDef::Class);
- templateClass->setTemplateMaster(this);
- templateClass->setOuterScope(getOuterScope());
- templateClass->setHidden(isHidden());
- m_impl->templateInstances->insert(templSpec,templateClass);
- freshInstance=TRUE;
+ Debug::print(Debug::Classes,0," New template instance class '%s''%s' inside '%s' hidden=%d\n",qPrint(name()),qPrint(templSpec),qPrint(name()),isHidden());
+
+ ClassDef *foundCd = Doxygen::classLinkedMap->find(tcname);
+ if (foundCd)
+ {
+ return foundCd;
+ }
+ templateClass =
+ toClassDefMutable(
+ Doxygen::classLinkedMap->add(tcname,
+ std::unique_ptr<ClassDef>(
+ new ClassDefImpl(fileName,startLine,startColumn,tcname,ClassDef::Class))));
+ if (templateClass)
+ {
+ templateClass->setTemplateMaster(this);
+ templateClass->setOuterScope(getOuterScope());
+ templateClass->setHidden(isHidden());
+ templateClass->setArtificial(isArtificial());
+ m_impl->templateInstances->insert(templSpec,templateClass);
+
+ // also add nested classes
+ for (const auto &innerCd : m_impl->innerClasses)
+ {
+ QCString innerName = tcname+"::"+innerCd->localName();
+ ClassDefMutable *innerClass =
+ toClassDefMutable(
+ Doxygen::classLinkedMap->add(innerName,
+ std::unique_ptr<ClassDef>(
+ new ClassDefImpl(fileName,startLine,startColumn,innerName,ClassDef::Class))));
+ if (innerClass)
+ {
+ templateClass->addInnerCompound(innerClass);
+ innerClass->setOuterScope(templateClass);
+ innerClass->setHidden(isHidden());
+ innerClass->setArtificial(TRUE);
+ freshInstance=TRUE;
+ }
+ }
+ }
}
return templateClass;
}
@@ -4223,14 +4007,14 @@ ClassDef *ClassDefImpl::getVariableInstance(const char *templSpec) const
m_impl->variableInstances = new QDict<ClassDef>(17);
m_impl->variableInstances->setAutoDelete(TRUE);
}
- ClassDef *templateClass=m_impl->variableInstances->find(templSpec);
+ ClassDefMutable *templateClass=toClassDefMutable(m_impl->variableInstances->find(templSpec));
if (templateClass==0)
{
Debug::print(Debug::Classes,0," New template variable instance class '%s' '%s'\n",qPrint(name()),qPrint(templSpec));
QCString tcname = removeRedundantWhiteSpace(name()+templSpec);
templateClass = new ClassDefImpl("<code>",1,1,tcname,
ClassDef::Class,0,0,FALSE);
- templateClass->addMembersToTemplateInstance( this, templSpec );
+ templateClass->addMembersToTemplateInstance( this, templateArguments(), templSpec );
templateClass->setTemplateMaster(this);
m_impl->variableInstances->insert(templSpec,templateClass);
}
@@ -4261,23 +4045,17 @@ QDict<int> *ClassDefImpl::getTemplateBaseClassNames() const
return m_impl->templBaseClassNames;
}
-void ClassDefImpl::addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec)
+void ClassDefImpl::addMembersToTemplateInstance(const ClassDef *cd,const ArgumentList &templateArguments,const char *templSpec)
{
//printf("%s::addMembersToTemplateInstance(%s,%s)\n",name().data(),cd->name().data(),templSpec);
- if (cd->memberNameInfoSDict()==0) return;
- MemberNameInfoSDict::Iterator mnili(*cd->memberNameInfoSDict());
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
- {
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
+ for (const auto &mni : cd->memberNameInfoLinkedMap())
+ {
+ for (const auto &mi : *mni)
{
- ArgumentList actualArguments;
- stringToArgumentList(getLanguage(),templSpec,actualArguments);
- MemberDef *md = mi->memberDef;
- MemberDef *imd = md->createTemplateInstanceMember(
- cd->templateArguments(),actualArguments);
+ auto actualArguments_p = stringToArgumentList(getLanguage(),templSpec);
+ MemberDef *md = mi->memberDef();
+ std::unique_ptr<MemberDefMutable> imd { md->createTemplateInstanceMember(
+ templateArguments,actualArguments_p) };
//printf("%s->setMemberClass(%p)\n",imd->name().data(),this);
imd->setMemberClass(this);
imd->setTemplateMaster(md);
@@ -4286,19 +4064,23 @@ void ClassDefImpl::addMembersToTemplateInstance(const ClassDef *cd,const char *t
imd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
imd->setMemberSpecifiers(md->getMemberSpecifiers());
imd->setMemberGroupId(md->getMemberGroupId());
- insertMember(imd);
+ insertMember(imd.get());
//printf("Adding member=%s %s%s to class %s templSpec %s\n",
// imd->typeString(),imd->name().data(),imd->argsString(),
// imd->getClassDef()->name().data(),templSpec);
// insert imd in the list of all members
//printf("Adding member=%s class=%s\n",imd->name().data(),name().data());
- MemberName *mn = Doxygen::memberNameSDict->find(imd->name());
- if (mn==0)
- {
- mn = new MemberName(imd->name());
- Doxygen::memberNameSDict->append(imd->name(),mn);
- }
- mn->append(imd);
+ MemberName *mn = Doxygen::memberNameLinkedMap->add(imd->name());
+ mn->push_back(std::move(imd));
+ }
+ }
+ // also instantatie members for nested classes
+ for (const auto &innerCd : cd->getClasses())
+ {
+ ClassDefMutable *ncd = toClassDefMutable(m_impl->innerClasses.find(innerCd->localName()));
+ if (ncd)
+ {
+ ncd->addMembersToTemplateInstance(innerCd,cd->templateArguments(),templSpec);
}
}
}
@@ -4311,7 +4093,7 @@ QCString ClassDefImpl::getReference() const
}
else
{
- return DefinitionImpl::getReference();
+ return DefinitionMixin::getReference();
}
}
@@ -4323,17 +4105,17 @@ bool ClassDefImpl::isReference() const
}
else
{
- return DefinitionImpl::isReference();
+ return DefinitionMixin::isReference();
}
}
-std::vector<ArgumentList> ClassDefImpl::getTemplateParameterLists() const
+ArgumentLists ClassDefImpl::getTemplateParameterLists() const
{
- std::vector<ArgumentList> result;
+ ArgumentLists result;
Definition *d=getOuterScope();
while (d && d->definitionType()==Definition::TypeClass)
{
- result.insert(result.begin(),dynamic_cast<ClassDef*>(d)->templateArguments());
+ result.insert(result.begin(),toClassDef(d)->templateArguments());
d = d->getOuterScope();
}
if (!templateArguments().empty())
@@ -4344,61 +4126,9 @@ std::vector<ArgumentList> ClassDefImpl::getTemplateParameterLists() const
}
QCString ClassDefImpl::qualifiedNameWithTemplateParameters(
- const std::vector<ArgumentList> *actualParams,int *actualParamIndex) const
+ const ArgumentLists *actualParams,uint *actualParamIndex) const
{
- //static bool optimizeOutputJava = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
- static bool hideScopeNames = Config_getBool(HIDE_SCOPE_NAMES);
- //printf("qualifiedNameWithTemplateParameters() localName=%s\n",localName().data());
- QCString scName;
- Definition *d=getOuterScope();
- if (d)
- {
- if (d->definitionType()==Definition::TypeClass)
- {
- ClassDef *cd=dynamic_cast<ClassDef *>(d);
- scName = cd->qualifiedNameWithTemplateParameters(actualParams,actualParamIndex);
- }
- else if (!hideScopeNames)
- {
- scName = d->qualifiedName();
- }
- }
-
- SrcLangExt lang = getLanguage();
- QCString scopeSeparator = getLanguageSpecificSeparator(lang);
- if (!scName.isEmpty()) scName+=scopeSeparator;
-
- bool isSpecialization = localName().find('<')!=-1;
-
- QCString clName = className();
- //bool isGeneric = getLanguage()==SrcLangExt_CSharp;
- //if (isGeneric && clName.right(2)=="-g")
- //{
- // clName = clName.left(clName.length()-2);
- //}
- //printf("m_impl->lang=%d clName=%s isSpecialization=%d\n",getLanguage(),clName.data(),isSpecialization);
- scName+=clName;
- if (!templateArguments().empty())
- {
- if (actualParams && *actualParamIndex<(int)actualParams->size())
- {
- const ArgumentList &al = actualParams->at(*actualParamIndex);
- if (!isSpecialization)
- {
- scName+=tempArgListToString(al,lang);
- }
- (*actualParamIndex)++;
- }
- else
- {
- if (!isSpecialization)
- {
- scName+=tempArgListToString(templateArguments(),lang);
- }
- }
- }
- //printf("qualifiedNameWithTemplateParameters: scope=%s qualifiedName=%s\n",name().data(),scName.data());
- return scName;
+ return makeQualifiedNameWithTemplateParameters(this,actualParams,actualParamIndex);
}
QCString ClassDefImpl::className() const
@@ -4411,7 +4141,7 @@ QCString ClassDefImpl::className() const
{
return m_impl->className;
}
-};
+}
void ClassDefImpl::setClassName(const char *name)
{
@@ -4424,7 +4154,7 @@ void ClassDefImpl::addListReferences()
if (!isLinkableInProject()) return;
//printf("ClassDef(%s)::addListReferences()\n",name().data());
{
- const std::vector<ListItemInfo> &xrefItems = xrefListItems();
+ const RefItemVector &xrefItems = xrefListItems();
addRefItem(xrefItems,
qualifiedName(),
lang==SrcLangExt_Fortran ? theTranslator->trType(TRUE,TRUE)
@@ -4435,18 +4165,11 @@ void ClassDefImpl::addListReferences()
this
);
}
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->addListReferences(this);
- }
+ mg->addListReferences(this);
}
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_impl->memberLists)
{
if (ml->listType()&MemberListType_detailedLists)
{
@@ -4458,26 +4181,21 @@ void ClassDefImpl::addListReferences()
MemberDef *ClassDefImpl::getMemberByName(const QCString &name) const
{
MemberDef *xmd = 0;
- if (m_impl->allMemberNameInfoSDict)
- {
- MemberNameInfo *mni = m_impl->allMemberNameInfoSDict->find(name);
- if (mni)
- {
- const int maxInheritanceDepth = 100000;
- int mdist=maxInheritanceDepth;
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
+ MemberNameInfo *mni = m_impl->allMemberNameInfoLinkedMap.find(name);
+ if (mni)
+ {
+ const int maxInheritanceDepth = 100000;
+ int mdist=maxInheritanceDepth;
+ for (auto &mi : *mni)
+ {
+ const ClassDef *mcd=mi->memberDef()->getClassDef();
+ int m=minClassDistance(this,mcd);
+ //printf("found member in %s linkable=%d m=%d\n",
+ // mcd->name().data(),mcd->isLinkable(),m);
+ if (m<mdist && mcd->isLinkable())
{
- const ClassDef *mcd=mi->memberDef->getClassDef();
- int m=minClassDistance(this,mcd);
- //printf("found member in %s linkable=%d m=%d\n",
- // mcd->name().data(),mcd->isLinkable(),m);
- if (m<mdist && mcd->isLinkable())
- {
- mdist=m;
- xmd=mi->memberDef;
- }
+ mdist=m;
+ xmd=mi->memberDef();
}
}
}
@@ -4490,33 +4208,13 @@ bool ClassDefImpl::isAccessibleMember(const MemberDef *md) const
return md->getClassDef() && isBaseClass(md->getClassDef(),TRUE);
}
-MemberList *ClassDefImpl::createMemberList(MemberListType lt)
-{
- m_impl->memberLists.setAutoDelete(TRUE);
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
- {
- if (ml->listType()==lt)
- {
- return ml;
- }
- }
- // not found, create a new member list
- ml = new MemberList(lt);
- m_impl->memberLists.append(ml);
- return ml;
-}
-
MemberList *ClassDefImpl::getMemberList(MemberListType lt) const
{
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (;(ml=mli.current());++mli)
+ for (auto &ml : m_impl->memberLists)
{
if (ml->listType()==lt)
{
- return ml;
+ return ml.get();
}
}
return 0;
@@ -4526,26 +4224,35 @@ void ClassDefImpl::addMemberToList(MemberListType lt,MemberDef *md,bool isBrief)
{
static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
static bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
- MemberList *ml = createMemberList(lt);
+ const auto &ml = m_impl->memberLists.get(lt);
ml->setNeedsSorting((isBrief && sortBriefDocs) || (!isBrief && sortMemberDocs));
ml->append(md);
// for members in the declaration lists we set the section, needed for member grouping
- if ((ml->listType()&MemberListType_detailedLists)==0) md->setSectionList(ml);
+ if ((ml->listType()&MemberListType_detailedLists)==0)
+ {
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm)
+ {
+ mdm->setSectionList(this,ml.get());
+ }
+ }
}
void ClassDefImpl::sortMemberLists()
{
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (;(ml=mli.current());++mli)
+ for (auto &ml : m_impl->memberLists)
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
}
- if (m_impl->innerClasses)
- {
- m_impl->innerClasses->sort();
- }
+ std::sort(m_impl->innerClasses.begin(),
+ m_impl->innerClasses.end(),
+ [](const auto &c1,const auto &c2)
+ {
+ return Config_getBool(SORT_BY_SCOPE_NAME) ?
+ qstricmp(c1->name(), c2->name() )<0 :
+ qstricmp(c1->className(), c2->className())<0 ;
+ });
}
int ClassDefImpl::countMemberDeclarations(MemberListType lt,const ClassDef *inheritedFrom,
@@ -4568,11 +4275,9 @@ int ClassDefImpl::countMemberDeclarations(MemberListType lt,const ClassDef *inhe
//printf("-> ml2=%d\n",ml2->numDecMembers());
}
// also include grouped members that have their own section in the class (see bug 722759)
- if (inheritedFrom && m_impl->memberGroupSDict)
+ if (inheritedFrom)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ for (const auto &mg : m_impl->memberGroups)
{
count+=mg->countGroupedInheritedMembers(lt);
if (lt2!=1) count+=mg->countGroupedInheritedMembers((MemberListType)lt2);
@@ -4606,14 +4311,9 @@ void ClassDefImpl::setAnonymousEnumType()
}
else if (lde->kind()==LayoutDocEntry::MemberGroups)
{
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->setAnonymousEnumType();
- }
+ mg->setAnonymousEnumType();
}
}
}
@@ -4621,22 +4321,15 @@ void ClassDefImpl::setAnonymousEnumType()
void ClassDefImpl::countMembers()
{
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_impl->memberLists)
{
ml->countDecMembers();
ml->countDocMembers();
}
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->countDecMembers();
- mg->countDocMembers();
- }
+ mg->countDecMembers();
+ mg->countDocMembers();
}
}
@@ -4651,26 +4344,21 @@ int ClassDefImpl::countInheritedDecMembers(MemberListType lt,
// name().data(),lt,process,count,invert);
if ((process^invert) || showAlways)
{
- if (m_impl->inherits)
+ for (const auto &ibcd : m_impl->inherits)
{
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (it.toFirst();(ibcd=it.current());++it)
+ ClassDefMutable *icd=toClassDefMutable(ibcd.classDef);
+ int lt1,lt2;
+ if (icd && icd->isLinkable())
{
- ClassDef *icd=ibcd->classDef;
- int lt1,lt2;
- if (icd->isLinkable())
+ convertProtectionLevel(lt,ibcd.prot,&lt1,&lt2);
+ //printf("%s: convert %d->(%d,%d) prot=%d\n",
+ // icd->name().data(),lt,lt1,lt2,ibcd->prot);
+ if (visitedClasses->find(icd)==0)
{
- convertProtectionLevel(lt,ibcd->prot,&lt1,&lt2);
- //printf("%s: convert %d->(%d,%d) prot=%d\n",
- // icd->name().data(),lt,lt1,lt2,ibcd->prot);
- if (visitedClasses->find(icd)==0)
+ visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
+ if (lt1!=-1)
{
- visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
- if (lt1!=-1)
- {
- inhCount+=icd->countMemberDeclarations((MemberListType)lt1,inheritedFrom,lt2,FALSE,TRUE,visitedClasses);
- }
+ inhCount+=icd->countMemberDeclarations((MemberListType)lt1,inheritedFrom,lt2,FALSE,TRUE,visitedClasses);
}
}
}
@@ -4759,18 +4447,13 @@ int ClassDefImpl::countMembersIncludingGrouped(MemberListType lt,
count=ml->countInheritableMembers(inheritedFrom);
}
//printf("%s:countMembersIncludingGrouped: count=%d\n",name().data(),count);
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ bool hasOwnSection = !mg->allMembersInSameSection() ||
+ !m_impl->subGrouping; // group is in its own section
+ if ((additional && hasOwnSection) || (!additional && !hasOwnSection))
{
- bool hasOwnSection = !mg->allMembersInSameSection() ||
- !m_impl->subGrouping; // group is in its own section
- if ((additional && hasOwnSection) || (!additional && !hasOwnSection))
- {
- count+=mg->countGroupedInheritedMembers(lt);
- }
+ count+=mg->countGroupedInheritedMembers(lt);
}
}
//printf("%s:countMembersIncludingGrouped(lt=%d,%s)=%d\n",
@@ -4792,36 +4475,31 @@ void ClassDefImpl::writeInheritedMemberDeclarations(OutputList &ol,
// name().data(),lt,process,invert,showAlways);
if ((process^invert) || showAlways)
{
- if (m_impl->inherits)
+ for (const auto &ibcd : m_impl->inherits)
{
- BaseClassListIterator it(*m_impl->inherits);
- BaseClassDef *ibcd;
- for (it.toFirst();(ibcd=it.current());++it)
+ ClassDefMutable *icd=toClassDefMutable(ibcd.classDef);
+ if (icd && icd->isLinkable())
{
- ClassDef *icd=ibcd->classDef;
- if (icd->isLinkable())
+ int lt1,lt3;
+ convertProtectionLevel(lt,ibcd.prot,&lt1,&lt3);
+ if (lt2==-1 && lt3!=-1)
{
- int lt1,lt3;
- convertProtectionLevel(lt,ibcd->prot,&lt1,&lt3);
- if (lt2==-1 && lt3!=-1)
- {
- lt2=lt3;
- }
- //printf("%s:convert %d->(%d,%d) prot=%d\n",icd->name().data(),lt,lt1,lt2,ibcd->prot);
- if (visitedClasses->find(icd)==0)
- {
- visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
- if (lt1!=-1)
- {
- icd->writeMemberDeclarations(ol,(MemberListType)lt1,
- title,QCString(),FALSE,inheritedFrom,lt2,FALSE,TRUE,visitedClasses);
- }
- }
- else
+ lt2=lt3;
+ }
+ //printf("%s:convert %d->(%d,%d) prot=%d\n",icd->name().data(),lt,lt1,lt2,ibcd->prot);
+ if (visitedClasses->find(icd)==0)
+ {
+ visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
+ if (lt1!=-1)
{
- //printf("%s: class already visited!\n",icd->name().data());
+ icd->writeMemberDeclarations(ol,(MemberListType)lt1,
+ title,QCString(),FALSE,inheritedFrom,lt2,FALSE,TRUE,visitedClasses);
}
}
+ else
+ {
+ //printf("%s: class already visited!\n",icd->name().data());
+ }
}
}
}
@@ -4836,7 +4514,7 @@ void ClassDefImpl::writeMemberDeclarations(OutputList &ol,MemberListType lt,cons
MemberList * ml = getMemberList(lt);
MemberList * ml2 = getMemberList((MemberListType)lt2);
if (getLanguage()==SrcLangExt_VHDL) // use specific declarations function
- {
+ {
static const ClassDef *cdef;
if (cdef!=this)
{ // only one inline link
@@ -4880,16 +4558,11 @@ void ClassDefImpl::addGroupedInheritedMembers(OutputList &ol,MemberListType lt,
const ClassDef *inheritedFrom,const QCString &inheritId) const
{
//printf("** %s::addGroupedInheritedMembers(%p) inheritId=%s\n",name().data(),m_impl->memberGroupSDict,inheritId.data());
- if (m_impl->memberGroupSDict)
+ for (const auto &mg : m_impl->memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ if (!mg->allMembersInSameSection() || !m_impl->subGrouping) // group is in its own section
{
- if (!mg->allMembersInSameSection() || !m_impl->subGrouping) // group is in its own section
- {
- mg->addGroupedInheritedMembers(ol,this,lt,inheritedFrom,inheritId);
- }
+ mg->addGroupedInheritedMembers(ol,this,lt,inheritedFrom,inheritId);
}
}
}
@@ -4926,7 +4599,7 @@ bool ClassDefImpl::isLocal() const
return m_impl->isLocal;
}
-ClassSDict *ClassDefImpl::getClassSDict() const
+ClassLinkedRefMap ClassDefImpl::getClasses() const
{
return m_impl->innerClasses;
}
@@ -4936,19 +4609,39 @@ ClassDefImpl::CompoundType ClassDefImpl::compoundType() const
return m_impl->compType;
}
-BaseClassList *ClassDefImpl::baseClasses() const
+BaseClassList ClassDefImpl::baseClasses() const
{
return m_impl->inherits;
}
-BaseClassList *ClassDefImpl::subClasses() const
+void ClassDefImpl::updateBaseClasses(const BaseClassList &bcd)
+{
+ m_impl->inherits = bcd;
+}
+
+BaseClassList ClassDefImpl::subClasses() const
{
return m_impl->inheritedBy;
}
-MemberNameInfoSDict *ClassDefImpl::memberNameInfoSDict() const
+void ClassDefImpl::updateSubClasses(const BaseClassList &bcd)
+{
+ m_impl->inheritedBy = bcd;
+}
+
+const MemberNameInfoLinkedMap &ClassDefImpl::memberNameInfoLinkedMap() const
{
- return m_impl->allMemberNameInfoSDict;
+ return m_impl->allMemberNameInfoLinkedMap;
+}
+
+void ClassDefImpl::sortAllMembersList()
+{
+ std::sort(m_impl->allMemberNameInfoLinkedMap.begin(),
+ m_impl->allMemberNameInfoLinkedMap.end(),
+ [](const auto &m1,const auto &m2)
+ {
+ return qstricmp(m1->memberName(),m2->memberName())<0;
+ });
}
Protection ClassDefImpl::protection() const
@@ -5066,14 +4759,14 @@ ClassDef *ClassDefImpl::categoryOf() const
return m_impl->categoryOf;
}
-const QList<MemberList> &ClassDefImpl::getMemberLists() const
+const MemberLists &ClassDefImpl::getMemberLists() const
{
return m_impl->memberLists;
}
-MemberGroupSDict *ClassDefImpl::getMemberGroupSDict() const
+const MemberGroupList &ClassDefImpl::getMemberGroups() const
{
- return m_impl->memberGroupSDict;
+ return m_impl->memberGroups;
}
void ClassDefImpl::setNamespace(NamespaceDef *nd)
@@ -5141,12 +4834,10 @@ MemberDef *ClassDefImpl::isSmartPointer() const
return m_impl->arrowOperator;
}
-void ClassDefImpl::reclassifyMember(MemberDef *md,MemberType t)
+void ClassDefImpl::reclassifyMember(MemberDefMutable *md,MemberType t)
{
md->setMemberType(t);
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (;(ml=mli.current());++mli)
+ for (auto &ml : m_impl->memberLists)
{
ml->remove(md);
}
@@ -5186,11 +4877,11 @@ bool ClassDefImpl::isEmbeddedInOuterScope() const
);
// inline because of INLINE_GROUPED_CLASSES=YES ?
- bool b1 = (inlineGroupedClasses && partOfGroups()!=0); // a grouped class
+ bool b1 = (inlineGroupedClasses && !partOfGroups().empty()); // a grouped class
// inline because of INLINE_SIMPLE_STRUCTS=YES ?
bool b2 = (inlineSimpleClasses && m_impl->isSimple && // a simple class
(containerLinkable || // in a documented container
- partOfGroups()!=0 // or part of a group
+ !partOfGroups().empty() // or part of a group
)
);
//printf("%s::isEmbeddedInOuterScope(): inlineGroupedClasses=%d "
@@ -5201,35 +4892,19 @@ bool ClassDefImpl::isEmbeddedInOuterScope() const
return b1 || b2; // either reason will do
}
-const ClassList *ClassDefImpl::taggedInnerClasses() const
-{
- return m_impl->taggedInnerClasses;
-}
-
-void ClassDefImpl::addTaggedInnerClass(ClassDef *cd)
-{
- if (m_impl->taggedInnerClasses==0)
- {
- m_impl->taggedInnerClasses = new ClassList;
- }
- m_impl->taggedInnerClasses->append(cd);
-}
-
-ClassDef *ClassDefImpl::tagLessReference() const
+const ClassDef *ClassDefImpl::tagLessReference() const
{
return m_impl->tagLessRef;
}
-void ClassDefImpl::setTagLessReference(ClassDef *cd)
+void ClassDefImpl::setTagLessReference(const ClassDef *cd)
{
m_impl->tagLessRef = cd;
}
void ClassDefImpl::removeMemberFromLists(MemberDef *md)
{
- QListIterator<MemberList> mli(m_impl->memberLists);
- MemberList *ml;
- for (;(ml=mli.current());++mli)
+ for (auto &ml : m_impl->memberLists)
{
ml->remove(md);
}
@@ -5240,11 +4915,6 @@ bool ClassDefImpl::isJavaEnum() const
return m_impl->isJavaEnum;
}
-bool ClassDefImpl::isGeneric() const
-{
- return m_impl->isGeneric;
-}
-
void ClassDefImpl::setClassSpecifier(uint64 spec)
{
m_impl->spec = spec;
@@ -5259,11 +4929,6 @@ bool ClassDefImpl::isExtension() const
return b;
}
-const ClassSDict *ClassDefImpl::innerClasses() const
-{
- return m_impl->innerClasses;
-}
-
const FileList &ClassDefImpl::usedFiles() const
{
return m_impl->files;
@@ -5274,9 +4939,9 @@ const ArgumentList &ClassDefImpl::typeConstraints() const
return m_impl->typeConstraints;
}
-const ExampleSDict *ClassDefImpl::exampleList() const
+const ExampleList &ClassDefImpl::getExamples() const
{
- return m_impl->exampleSDict;
+ return m_impl->examples;
}
bool ClassDefImpl::subGrouping() const
@@ -5291,7 +4956,7 @@ bool ClassDefImpl::isSliceLocal() const
void ClassDefImpl::setName(const char *name)
{
- DefinitionImpl::setName(name);
+ DefinitionMixin::setName(name);
}
void ClassDefImpl::setMetaData(const char *md)
@@ -5309,3 +4974,67 @@ QCString ClassDefImpl::inheritanceGraphFileName() const
return m_impl->inheritFileName;
}
+// --- Cast functions
+//
+ClassDef *toClassDef(Definition *d)
+{
+ if (d && (typeid(*d)==typeid(ClassDefImpl) || typeid(*d)==typeid(ClassDefAliasImpl)))
+ {
+ return static_cast<ClassDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+ClassDef *toClassDef(DefinitionMutable *md)
+{
+ Definition *d = toDefinition(md);
+ if (d && typeid(*d)==typeid(ClassDefImpl))
+ {
+ return static_cast<ClassDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+const ClassDef *toClassDef(const Definition *d)
+{
+ if (d && (typeid(*d)==typeid(ClassDefImpl) || typeid(*d)==typeid(ClassDefAliasImpl)))
+ {
+ return static_cast<const ClassDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+ClassDefMutable *toClassDefMutable(Definition *d)
+{
+ if (d && typeid(*d)==typeid(ClassDefImpl))
+ {
+ return static_cast<ClassDefMutable*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+ClassDefMutable *toClassDefMutable(const Definition *d)
+{
+ if (d && typeid(*d)==typeid(ClassDefImpl))
+ {
+ return const_cast<ClassDefMutable*>(static_cast<const ClassDefMutable*>(d));
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
diff --git a/src/classdef.h b/src/classdef.h
index 3158c50..46e1f7d 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,50 +19,84 @@
#define CLASSDEF_H
#include <vector>
+#include <set>
#include <qlist.h>
#include <qdict.h>
#include <qptrdict.h>
+#include "containers.h"
#include "definition.h"
+#include "arguments.h"
+#include "membergroup.h"
struct Argument;
class MemberDef;
+class MemberDefMutable;
class MemberList;
-class MemberDict;
-class ClassList;
-class ClassSDict;
+class MemberLists;
+class ClassLinkedRefMap;
class OutputList;
class FileDef;
class FileList;
-class BaseClassList;
class NamespaceDef;
class MemberDef;
-class ExampleSDict;
-class MemberNameInfoSDict;
+class ExampleList;
+class MemberNameInfoLinkedMap;
class UsesClassDict;
class ConstraintClassDict;
-class MemberGroupSDict;
class QTextStream;
class PackageDef;
class GroupDef;
class StringDict;
struct IncludeInfo;
class ClassDefImpl;
-class ArgumentList;
class FTextStream;
+class ClassDef;
+class ClassDefMutable;
+
+/** Class that contains information about an inheritance relation.
+ */
+struct BaseClassDef
+{
+ BaseClassDef(ClassDef *cd,const char *n,Protection p, Specifier v,const char *t) :
+ classDef(cd), usedName(n), prot(p), virt(v), templSpecifiers(t) {}
+
+ /** Class definition that this relation inherits from. */
+ ClassDef *classDef;
+
+ /** name used in the inheritance list
+ * (may be a typedef name instead of the class name)
+ */
+ QCString usedName;
+
+ /** Protection level of the inheritance relation:
+ * Public, Protected, or Private
+ */
+ Protection prot;
+
+ /** Virtualness of the inheritance relation:
+ * Normal, or Virtual
+ */
+ Specifier virt;
+
+ /** Template arguments used for the base class */
+ QCString templSpecifiers;
+};
+
+using BaseClassList = std::vector<BaseClassDef>;
/** A abstract class representing of a compound symbol.
*
* A compound can be a class, struct, union, interface, service, singleton,
* or exception.
*/
-class ClassDef : virtual public Definition
+class ClassDef : public Definition
{
public:
/** The various compound types */
- enum CompoundType { Class, //=Entry::CLASS_SEC,
- Struct, //=Entry::STRUCT_SEC,
+ enum CompoundType { Class, //=Entry::CLASS_SEC,
+ Struct, //=Entry::STRUCT_SEC,
Union, //=Entry::UNION_SEC,
Interface, //=Entry::INTERFACE_SEC,
Protocol, //=Entry::PROTOCOL_SEC,
@@ -74,9 +108,8 @@ class ClassDef : virtual public Definition
virtual ~ClassDef() {}
-
//-----------------------------------------------------------------------------------
- // --- getters
+ // --- getters
//-----------------------------------------------------------------------------------
/** Used for RTTI, this is a class */
@@ -99,7 +132,7 @@ class ClassDef : virtual public Definition
virtual bool isLocal() const = 0;
/** returns the classes nested into this class */
- virtual ClassSDict *getClassSDict() const = 0;
+ virtual ClassLinkedRefMap getClasses() const = 0;
/** returns TRUE if this class has documentation */
virtual bool hasDocumentation() const = 0;
@@ -125,16 +158,22 @@ class ClassDef : virtual public Definition
/** Returns the list of base classes from which this class directly
* inherits.
*/
- virtual BaseClassList *baseClasses() const = 0;
+ virtual BaseClassList baseClasses() const = 0;
+
+ /** Update the list of base classes to the one passed */
+ virtual void updateBaseClasses(const BaseClassList &bcd) = 0;
/** Returns the list of sub classes that directly derive from this class
*/
- virtual BaseClassList *subClasses() const = 0;
+ virtual BaseClassList subClasses() const = 0;
+
+ /** Update the list of sub classes to the one passed */
+ virtual void updateSubClasses(const BaseClassList &bcd) = 0;
/** Returns a dictionary of all members. This includes any inherited
* members. Members are sorted alphabetically.
*/
- virtual MemberNameInfoSDict *memberNameInfoSDict() const = 0;
+ virtual const MemberNameInfoLinkedMap &memberNameInfoLinkedMap() const = 0;
/** Return the protection level (Public,Protected,Private) in which
* this compound was found.
@@ -220,7 +259,7 @@ class ClassDef : virtual public Definition
* available, or 0 otherwise.
* @param name The name of the nested compound
*/
- virtual Definition *findInnerCompound(const char *name) const = 0;
+ virtual const Definition *findInnerCompound(const char *name) const = 0;
/** Returns the template parameter lists that form the template
* declaration of this class.
@@ -229,10 +268,10 @@ class ClassDef : virtual public Definition
* will return a list with one ArgumentList containing one argument
* with type="class" and name="T".
*/
- virtual std::vector<ArgumentList> getTemplateParameterLists() const = 0;
+ virtual ArgumentLists getTemplateParameterLists() const = 0;
virtual QCString qualifiedNameWithTemplateParameters(
- const std::vector<ArgumentList> *actualParams=0,int *actualParamIndex=0) const = 0;
+ const ArgumentLists *actualParams=0,uint *actualParamIndex=0) const = 0;
/** Returns TRUE if there is at least one pure virtual member in this
* class.
@@ -278,10 +317,10 @@ class ClassDef : virtual public Definition
virtual MemberList *getMemberList(MemberListType lt) const = 0;
/** Returns the list containing the list of members sorted per type */
- virtual const QList<MemberList> &getMemberLists() const = 0;
+ virtual const MemberLists &getMemberLists() const = 0;
/** Returns the member groups defined for this class */
- virtual MemberGroupSDict *getMemberGroupSDict() const = 0;
+ virtual const MemberGroupList &getMemberGroups() const = 0;
virtual QDict<int> *getTemplateBaseClassNames() const = 0;
@@ -294,22 +333,19 @@ class ClassDef : virtual public Definition
virtual bool isSimple() const = 0;
- virtual const ClassList *taggedInnerClasses() const = 0;
- virtual ClassDef *tagLessReference() const = 0;
+ virtual const ClassDef *tagLessReference() const = 0;
virtual MemberDef *isSmartPointer() const = 0;
virtual bool isJavaEnum() const = 0;
- virtual bool isGeneric() const = 0;
- virtual const ClassSDict *innerClasses() const = 0;
virtual QCString title() const = 0;
virtual QCString generatedFromFiles() const = 0;
virtual const FileList &usedFiles() const = 0;
virtual const ArgumentList &typeConstraints() const = 0;
- virtual const ExampleSDict *exampleList() const = 0;
+ virtual const ExampleList &getExamples() const = 0;
virtual bool hasExamples() const = 0;
virtual QCString getMemberListFileName() const = 0;
virtual bool subGrouping() const = 0;
@@ -318,6 +354,30 @@ class ClassDef : virtual public Definition
virtual bool hasNonReferenceSuperClass() const = 0;
//-----------------------------------------------------------------------------------
+ // --- count members ----
+ //-----------------------------------------------------------------------------------
+
+ virtual int countMembersIncludingGrouped(MemberListType lt,
+ const ClassDef *inheritedFrom,bool additional) const = 0;
+ virtual int countInheritanceNodes() const = 0;
+ virtual int countMemberDeclarations(MemberListType lt,const ClassDef *inheritedFrom,
+ int lt2,bool invert,bool showAlways,QPtrDict<void> *visitedClasses) const = 0;
+
+ //-----------------------------------------------------------------------------------
+ // --- helpers ----
+ //-----------------------------------------------------------------------------------
+
+ virtual ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
+ const QCString &templSpec,bool &freshInstance) const = 0;
+ virtual void writeDeclarationLink(OutputList &ol,bool &found,
+ const char *header,bool localNames) const = 0;
+
+};
+
+class ClassDefMutable : public DefinitionMutable, public ClassDef
+{
+ public:
+ //-----------------------------------------------------------------------------------
// --- setters ----
//-----------------------------------------------------------------------------------
@@ -337,7 +397,7 @@ class ClassDef : virtual public Definition
virtual void setTypeConstraints(const ArgumentList &al) = 0;
virtual void setCategoryOf(ClassDef *cd) = 0;
virtual void setUsedOnly(bool b) = 0;
- virtual void setTagLessReference(ClassDef *cd) = 0;
+ virtual void setTagLessReference(const ClassDef *cd) = 0;
virtual void setName(const char *name) = 0;
virtual void setMetaData(const char *md) = 0;
@@ -349,12 +409,9 @@ class ClassDef : virtual public Definition
virtual void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0) = 0;
virtual void insertMember(MemberDef *) = 0;
virtual void insertUsedFile(FileDef *) = 0;
- virtual void addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec) = 0;
- virtual void addTaggedInnerClass(ClassDef *cd) = 0;
+ virtual void addMembersToTemplateInstance(const ClassDef *cd,const ArgumentList &templateArguments,const char *templSpec) = 0;
virtual void addInnerCompound(const Definition *d) = 0;
virtual bool addExample(const char *anchor,const char *name, const char *file) = 0;
- virtual ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
- const QCString &templSpec,bool &freshInstance) const = 0;
virtual void addUsedClass(ClassDef *cd,const char *accessName,Protection prot) = 0;
virtual void addUsedByClass(ClassDef *cd,const char *accessName,Protection prot) = 0;
virtual void makeTemplateArgument(bool b=TRUE) = 0;
@@ -367,10 +424,11 @@ class ClassDef : virtual public Definition
virtual void mergeMembers() = 0;
virtual void sortMemberLists() = 0;
virtual void distributeMemberGroupDocumentation() = 0;
- virtual void reclassifyMember(MemberDef *md,MemberType t) = 0;
+ virtual void reclassifyMember(MemberDefMutable *md,MemberType t) = 0;
virtual void removeMemberFromLists(MemberDef *md) = 0;
virtual void setAnonymousEnumType() = 0;
virtual void countMembers() = 0;
+ virtual void sortAllMembersList() = 0;
//-----------------------------------------------------------------------------------
// --- write output ----
@@ -385,8 +443,6 @@ class ClassDef : virtual public Definition
virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *md) const = 0;
virtual void writeSummaryLinks(OutputList &ol) const = 0;
virtual void writeInlineDocumentation(OutputList &ol) const = 0;
- virtual void writeDeclarationLink(OutputList &ol,bool &found,
- const char *header,bool localNames) const = 0;
virtual void writeTagFile(FTextStream &) = 0;
virtual void writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCString &title,
const char *subTitle=0,bool showInline=FALSE,const ClassDef *inheritedFrom=0,
@@ -395,27 +451,11 @@ class ClassDef : virtual public Definition
virtual void addGroupedInheritedMembers(OutputList &ol,MemberListType lt,
const ClassDef *inheritedFrom,const QCString &inheritId) const = 0;
- //-----------------------------------------------------------------------------------
- // --- count members ----
- //-----------------------------------------------------------------------------------
-
- virtual int countMembersIncludingGrouped(MemberListType lt,
- const ClassDef *inheritedFrom,bool additional) const = 0;
- virtual int countInheritanceNodes() const = 0;
- virtual int countMemberDeclarations(MemberListType lt,const ClassDef *inheritedFrom,
- int lt2,bool invert,bool showAlways,QPtrDict<void> *visitedClasses) const = 0;
-
-
- //-----------------------------------------------------------------------------------
- // --- visiting administration ----
- //-----------------------------------------------------------------------------------
- virtual void setVisited(bool visited) const = 0;
- virtual bool isVisited() const = 0;
};
/** Factory method to create a new ClassDef object */
-ClassDef *createClassDef(
+ClassDefMutable *createClassDef(
const char *fileName,int startLine,int startColumn,
const char *name,ClassDef::CompoundType ct,
const char *ref=0,const char *fName=0,
@@ -423,27 +463,35 @@ ClassDef *createClassDef(
ClassDef *createClassDefAlias(const Definition *newScope,const ClassDef *cd);
+// --- Set of classes
+
+using ClassDefSet = std::set<const ClassDef*>;
+
+// --- Cast functions
+
+ClassDef *toClassDef(Definition *d);
+ClassDef *toClassDef(DefinitionMutable *d);
+const ClassDef *toClassDef(const Definition *d);
+ClassDefMutable *toClassDefMutable(Definition *d);
+ClassDefMutable *toClassDefMutable(const Definition *d);
//------------------------------------------------------------------------
-/** Class that contains information about a usage relation.
+/** Class that contains information about a usage relation.
*/
struct UsesClassDef
{
- UsesClassDef(ClassDef *cd) : classDef(cd)
- {
- accessors = new QDict<void>(17);
- containment = TRUE;
+ UsesClassDef(ClassDef *cd) : classDef(cd)
+ {
}
~UsesClassDef()
{
- delete accessors;
}
void addAccessor(const char *s)
{
- if (accessors->find(s)==0)
+ if (accessors.find(s)==accessors.end())
{
- accessors->insert(s,(void *)666);
+ accessors.insert(s);
}
}
/** Class definition that this relation uses. */
@@ -452,95 +500,35 @@ struct UsesClassDef
/** Dictionary of member variable names that form the edge labels of the
* usage relation.
*/
- QDict<void> *accessors;
+ StringSet accessors;
/** Template arguments used for the base class */
QCString templSpecifiers;
- bool containment;
+ bool containment = true;
};
-/** Dictionary of usage relations.
+/** Dictionary of usage relations.
*/
class UsesClassDict : public QDict<UsesClassDef>
{
public:
- UsesClassDict(int size) : QDict<UsesClassDef>(size) {}
+ UsesClassDict(uint size) : QDict<UsesClassDef>(size) {}
~UsesClassDict() {}
};
-/** Iterator class to iterate over a dictionary of usage relations.
+/** Iterator class to iterate over a dictionary of usage relations.
*/
class UsesClassDictIterator : public QDictIterator<UsesClassDef>
{
public:
- UsesClassDictIterator(const QDict<UsesClassDef> &d)
+ UsesClassDictIterator(const QDict<UsesClassDef> &d)
: QDictIterator<UsesClassDef>(d) {}
~UsesClassDictIterator() {}
};
//------------------------------------------------------------------------
-/** Class that contains information about an inheritance relation.
- */
-struct BaseClassDef
-{
- BaseClassDef(ClassDef *cd,const char *n,Protection p,
- Specifier v,const char *t) :
- classDef(cd), usedName(n), prot(p), virt(v), templSpecifiers(t) {}
-
- /** Class definition that this relation inherits from. */
- ClassDef *classDef;
-
- /** name used in the inheritance list
- * (may be a typedef name instead of the class name)
- */
- QCString usedName;
-
- /** Protection level of the inheritance relation:
- * Public, Protected, or Private
- */
- Protection prot;
-
- /** Virtualness of the inheritance relation:
- * Normal, or Virtual
- */
- Specifier virt;
-
- /** Template arguments used for the base class */
- QCString templSpecifiers;
-};
-
-/** List of base classes.
- *
- * The classes are alphabetically sorted on name if inSort() is used.
- */
-class BaseClassList : public QList<BaseClassDef>
-{
- public:
- ~BaseClassList() {}
- int compareValues(const BaseClassDef *item1,const BaseClassDef *item2) const
- {
- const ClassDef *c1=item1->classDef;
- const ClassDef *c2=item2->classDef;
- if (c1==0 || c2==0)
- return FALSE;
- else
- return qstricmp(c1->name(),c2->name());
- }
-};
-
-/** Iterator for a list of base classes.
- */
-class BaseClassListIterator : public QListIterator<BaseClassDef>
-{
- public:
- BaseClassListIterator(const BaseClassList &bcl) :
- QListIterator<BaseClassDef>(bcl) {}
-};
-
-//------------------------------------------------------------------------
-
/** Class that contains information about a type constraint relations.
*/
@@ -548,17 +536,15 @@ struct ConstraintClassDef
{
ConstraintClassDef(ClassDef *cd) : classDef(cd)
{
- accessors = new QDict<void>(17);
}
~ConstraintClassDef()
{
- delete accessors;
}
void addAccessor(const char *s)
{
- if (accessors->find(s)==0)
+ if (accessors.find(s)==accessors.end())
{
- accessors->insert(s,(void *)666);
+ accessors.insert(s);
}
}
/** Class definition that this relation uses. */
@@ -567,7 +553,7 @@ struct ConstraintClassDef
/** Dictionary of member types names that form the edge labels of the
* constraint relation.
*/
- QDict<void> *accessors;
+ StringSet accessors;
};
/** Dictionary of constraint relations.
@@ -575,7 +561,7 @@ struct ConstraintClassDef
class ConstraintClassDict : public QDict<ConstraintClassDef>
{
public:
- ConstraintClassDict(int size) : QDict<ConstraintClassDef>(size) {}
+ ConstraintClassDict(uint size) : QDict<ConstraintClassDef>(size) {}
~ConstraintClassDict() {}
};
diff --git a/src/classlist.cpp b/src/classlist.cpp
index f06f744..af64478 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -26,98 +26,52 @@
#include "arguments.h"
#include "groupdef.h"
-ClassList::ClassList() : QList<ClassDef>()
+bool ClassLinkedRefMap::declVisible(const ClassDef::CompoundType *filter) const
{
-}
-
-ClassList::~ClassList()
-{
-}
-
-static int compItems(const ClassDef *c1,const ClassDef *c2)
-{
- static bool b = Config_getBool(SORT_BY_SCOPE_NAME);
- if (b)
- {
- return qstricmp(c1->name(), c2->name());
- }
- else
- {
- return qstricmp(c1->className(), c2->className());
- }
-}
-
-int ClassList::compareValues(const ClassDef *item1, const ClassDef *item2) const
-{
- return compItems(item1,item2);
-}
-
-int ClassSDict::compareValues(const ClassDef *item1, const ClassDef *item2) const
-{
- return compItems(item1,item2);
-}
-
-ClassListIterator::ClassListIterator(const ClassList &cllist) :
- QListIterator<ClassDef>(cllist)
-{
-}
-
-bool ClassSDict::declVisible(const ClassDef::CompoundType *filter) const
-{
- static bool hideUndocClasses = Config_getBool(HIDE_UNDOC_CLASSES);
- static bool extractLocalClasses = Config_getBool(EXTRACT_LOCAL_CLASSES);
- if (count()>0)
+ bool hideUndocClasses = Config_getBool(HIDE_UNDOC_CLASSES);
+ bool extractLocalClasses = Config_getBool(EXTRACT_LOCAL_CLASSES);
+ for (const auto &cd : *this)
{
- ClassSDict::Iterator sdi(*this);
- ClassDef *cd=0;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ (filter==0 || *filter==cd->compoundType())
+ )
{
- if (!cd->isAnonymous() &&
- (filter==0 || *filter==cd->compoundType())
+ bool isLink = cd->isLinkable();
+ if (isLink ||
+ (!hideUndocClasses &&
+ (!cd->isLocal() || extractLocalClasses)
+ )
)
{
- bool isLink = cd->isLinkable();
- if (isLink ||
- (!hideUndocClasses &&
- (!cd->isLocal() || extractLocalClasses)
- )
- )
- {
- return TRUE;
- }
+ return true;
}
}
}
- return FALSE;
+ return false;
}
-void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,
- const char *header,bool localNames) const
+void ClassLinkedRefMap::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,
+ const char *header,bool localNames) const
{
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
- if (count()>0)
+ bool found=FALSE;
+ for (const auto &cd : *this)
{
- ClassSDict::Iterator sdi(*this);
- ClassDef *cd=0;
- bool found=FALSE;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ //printf(" ClassLinkedRefMap::writeDeclaration for %s\n",cd->name().data());
+ if (!cd->isAnonymous() &&
+ !cd->isExtension() &&
+ (cd->protection()!=Private || extractPrivate) &&
+ (filter==0 || *filter==cd->compoundType())
+ )
{
- //printf(" ClassSDict::writeDeclaration for %s\n",cd->name().data());
- if (!cd->isAnonymous() &&
- !cd->isExtension() &&
- (cd->protection()!=Private || extractPrivate) &&
- (filter==0 || *filter==cd->compoundType())
- )
- {
- //printf("writeDeclarationLink()\n");
- cd->writeDeclarationLink(ol,found,header,localNames);
- }
+ //printf("writeDeclarationLink()\n");
+ cd->writeDeclarationLink(ol,found,header,localNames);
}
- if (found) ol.endMemberList();
}
+ if (found) ol.endMemberList();
}
-void ClassSDict::writeDocumentation(OutputList &ol,const Definition * container) const
+void ClassLinkedRefMap::writeDocumentation(OutputList &ol,const Definition * container) const
{
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
@@ -125,89 +79,38 @@ void ClassSDict::writeDocumentation(OutputList &ol,const Definition * container)
static bool inlineSimpleClasses = Config_getBool(INLINE_SIMPLE_STRUCTS);
if (!inlineGroupedClasses && !inlineSimpleClasses) return;
- if (count()>0)
- {
- bool found=FALSE;
+ bool found=FALSE;
- ClassSDict::Iterator sdi(*this);
- ClassDef *cd=0;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ for (const auto &cd : *this)
+ {
+ //printf("%s:writeDocumentation() %p linkable=%d embedded=%d container=%p partOfGroups=%zu\n",
+ // cd->name().data(),cd->getOuterScope(),cd->isLinkableInProject(),cd->isEmbeddedInOuterScope(),
+ // container,cd->partOfGroups()->size());
+
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ !cd->isAlias() &&
+ (container==0 || cd->partOfGroups().empty()) // if container==0 -> show as part of the group docs, otherwise only show if not part of a group
+ )
{
- //printf("%s:writeDocumentation() %p linkable=%d embedded=%d container=%p partOfGroups=%d\n",
- // cd->name().data(),cd->getOuterScope(),cd->isLinkableInProject(),cd->isEmbeddedInOuterScope(),
- // container,cd->partOfGroups() ? cd->partOfGroups()->count() : 0);
-
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- !cd->isAlias() &&
- (container==0 || cd->partOfGroups()==0) // if container==0 -> show as part of the group docs, otherwise only show if not part of a group
- )
+ //printf(" showing class %s\n",cd->name().data());
+ if (!found)
{
- //printf(" showing class %s\n",cd->name().data());
- if (!found)
- {
- ol.writeRuler();
- ol.startGroupHeader();
- ol.parseText(fortranOpt?theTranslator->trTypeDocumentation():
- theTranslator->trClassDocumentation());
- ol.endGroupHeader();
- found=TRUE;
- }
- cd->writeInlineDocumentation(ol);
+ ol.writeRuler();
+ ol.startGroupHeader();
+ ol.parseText(fortranOpt?theTranslator->trTypeDocumentation():
+ theTranslator->trClassDocumentation());
+ ol.endGroupHeader();
+ found=TRUE;
+ }
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm)
+ {
+ cdm->writeInlineDocumentation(ol);
}
}
}
}
-//-------------------------------------------
-
-void GenericsSDict::insert(const QCString &key,ClassDef *cd)
-{
- int i=key.find('<');
- if (i==-1) return;
- ArgumentList argList;
- stringToArgumentList(SrcLangExt_CSharp, key.mid(i),argList);
- int c = argList.size();
- if (c==0) return;
- GenericsCollection *collection = m_dict.find(key.left(i));
- if (collection==0) // new name
- {
- collection = new GenericsCollection;
- m_dict.append(key.left(i),collection);
- }
- if (collection->find(c)==0) // should always be 0!
- {
- collection->insert(c,cd);
- }
-}
-
-ClassDef *GenericsSDict::find(const QCString &key)
-{
- int i=key.find('<');
- if (i==-1)
- {
- GenericsCollection *collection = m_dict.find(key);
- if (collection && collection->count()==1)
- {
- QIntDictIterator<ClassDef> it(*collection);
- return it.current();
- }
- }
- else
- {
- GenericsCollection *collection = m_dict.find(key.left(i));
- if (collection)
- {
- ArgumentList argList;
- stringToArgumentList(SrcLangExt_CSharp,key.mid(i),argList);
- int c = argList.size();
- return collection->find(c);
- }
- }
- return 0;
-}
-
-
-
diff --git a/src/classlist.h b/src/classlist.h
index 11c8305..709412b 100644
--- a/src/classlist.h
+++ b/src/classlist.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,70 +18,21 @@
#ifndef CLASSLIST_H
#define CLASSLIST_H
-#include <qlist.h>
-#include <qdict.h>
-
+#include "linkedmap.h"
#include "classdef.h"
-#include "sortdict.h"
class Definition;
-/** A list of ClassDef objects. */
-class ClassList : public QList<ClassDef>
-{
- public:
- ClassList();
- ~ClassList();
-
- private:
- int compareValues(const ClassDef *item1,const ClassDef *item2) const;
-};
-
-/** An iterator for ClassDef objects in a ClassList. */
-class ClassListIterator : public QListIterator<ClassDef>
-{
- public:
- ClassListIterator(const ClassList &list);
-};
-
-/** An unsorted dictionary of ClassDef objects. */
-class ClassDict : public QDict<ClassDef>
+class ClassLinkedMap : public LinkedMap<ClassDef>
{
- public:
- ClassDict(int size) : QDict<ClassDef>(size) {}
- ~ClassDict() {}
};
-/** A sorted dictionary of ClassDef objects. */
-class ClassSDict : public SDict<ClassDef>
+class ClassLinkedRefMap : public LinkedRefMap<const ClassDef>
{
public:
- ClassSDict(int size=17) : SDict<ClassDef>(size) {}
- ~ClassSDict() {}
- void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
- const char *header=0,bool localNames=FALSE) const;
- void writeDocumentation(OutputList &ol,const Definition *container=0) const;
bool declVisible(const ClassDef::CompoundType *filter=0) const;
- private:
- int compareValues(const ClassDef *item1,const ClassDef *item2) const;
-};
-
-class GenericsCollection : public QIntDict<ClassDef>
-{
- public:
- GenericsCollection() : QIntDict<ClassDef>(17) {}
- ~GenericsCollection() {}
-};
-
-class GenericsSDict
-{
- public:
- GenericsSDict() : m_dict(17) { m_dict.setAutoDelete(TRUE); }
- ~GenericsSDict() {}
- void insert(const QCString &key,ClassDef *cd);
- ClassDef *find(const QCString &key);
- private:
- SDict<GenericsCollection> m_dict;
+ void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,const char *header,bool localNames) const;
+ void writeDocumentation(OutputList &ol,const Definition * container=0) const;
};
#endif
diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp
index e62aa4f..372ba5b 100644
--- a/src/cmdmapper.cpp
+++ b/src/cmdmapper.cpp
@@ -149,6 +149,10 @@ CommandMap cmdMap[] =
{ "---", CMD_MDASH },
{ "_setscope", CMD_SETSCOPE },
{ "emoji", CMD_EMOJI },
+ { "rtfinclude", CMD_RTFINCLUDE },
+ { "docbookinclude",CMD_DOCBOOKINCLUDE },
+ { "maninclude", CMD_MANINCLUDE },
+ { "xmlinclude", CMD_XMLINCLUDE },
{ 0, 0 },
};
diff --git a/src/cmdmapper.h b/src/cmdmapper.h
index 246be9d..a86c20a 100644
--- a/src/cmdmapper.h
+++ b/src/cmdmapper.h
@@ -138,7 +138,11 @@ enum CommandType
CMD_SNIPPETDOC = 108,
CMD_SNIPWITHLINES= 109,
CMD_EMOJI = 110,
- CMD_EQUAL = 111
+ CMD_EQUAL = 111,
+ CMD_RTFINCLUDE = 112,
+ CMD_DOCBOOKINCLUDE= 113,
+ CMD_MANINCLUDE = 114,
+ CMD_XMLINCLUDE = 115
};
enum HtmlTagType
diff --git a/src/code.l b/src/code.l
index fb609e5..6feda35 100644
--- a/src/code.l
+++ b/src/code.l
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,12 +16,25 @@
%option prefix="codeYY"
%option reentrant
%option extra-type="struct codeYY_state *"
+%top{
+#include <stdint.h>
+}
%{
/*
- * includes
+ * includes
*/
+
+#include <utility>
+#include <memory>
+#include <algorithm>
+#include <unordered_map>
+#include <stack>
+#include <vector>
+#include <string>
+#include <mutex>
+
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
@@ -46,6 +57,8 @@
#include "filename.h"
#include "namespacedef.h"
#include "tooltip.h"
+#include "scopedtypevariant.h"
+#include "symbolresolver.h"
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
@@ -53,14 +66,12 @@
#define YY_NO_UNISTD_H 1
-#define CLASSBLOCK (int *)4
-#define SCOPEBLOCK (int *)8
-#define INNERBLOCK (int *)12
+#define CLASSBLOCK 1
+#define SCOPEBLOCK 2
+#define INNERBLOCK 3
+
+#define USE_STATE2STRING 0
-/* -----------------------------------------------------------------
- * statics
- */
-
// context for an Objective-C method call
struct ObjCCallCtx
{
@@ -76,144 +87,11 @@ struct ObjCCallCtx
int braceCount;
};
-/*! Represents a stack of variable to class mappings as found in the
- * code. Each scope is enclosed in pushScope() and popScope() calls.
- * Variables are added by calling addVariables() and one can search
- * for variable using findVariable().
- */
-class VariableContext
-{
- public:
- static const ClassDef *dummyContext;
-
- class Scope : public SDict<ClassDef>
- {
- public:
- Scope() : SDict<ClassDef>(17) {}
- };
-
- VariableContext()
- {
- m_scopes.setAutoDelete(TRUE);
- }
- virtual ~VariableContext()
- {
- }
-
- void pushScope()
- {
- m_scopes.append(new Scope);
- DBG_CTX((stderr,"** Push var context %d\n",m_scopes.count()));
- }
-
- void popScope()
- {
- if (m_scopes.count()>0)
- {
- DBG_CTX((stderr,"** Pop var context %d\n",m_scopes.count()));
- m_scopes.remove(m_scopes.count()-1);
- }
- else
- {
- DBG_CTX((stderr,"** ILLEGAL: Pop var context\n"));
- }
- }
-
- void clear()
- {
- m_scopes.clear();
- m_globalScope.clear();
- }
-
- void clearExceptGlobal()
- {
- DBG_CTX((stderr,"** Clear var context\n"));
- m_scopes.clear();
- }
-
- void addVariable(yyscan_t yyscanner,const QCString &type,const QCString &name);
- ClassDef *findVariable(const QCString &name);
-
- int count() const { return m_scopes.count(); }
-
- private:
- Scope m_globalScope;
- QList<Scope> m_scopes;
-};
-
-//-------------------------------------------------------------------
-
-class CallContext
-{
- public:
- struct Ctx
- {
- Ctx(QCString _name, QCString _type) : name(_name), type(_type), d(0) {}
- QCString name;
- QCString type;
- const Definition *d;
- };
-
- CallContext()
- {
- m_defList.append(new Ctx("",""));
- m_defList.setAutoDelete(TRUE);
- }
- virtual ~CallContext() {}
- void setScope(const Definition *d)
- {
- Ctx *ctx = m_defList.getLast();
- if (ctx)
- {
- DBG_CTX((stderr,"** Set call context %s (%p)\n",d==0 ? "<null>" : d->name().data(),d));
- ctx->d=d;
- }
- }
- void pushScope(QCString _name, QCString _type)
- {
- m_defList.append(new Ctx(_name,_type));
- DBG_CTX((stderr,"** Push call context %d\n",m_defList.count()));
- }
- void popScope(QCString &_name, QCString &_type)
- {
- if (m_defList.count()>1)
- {
- DBG_CTX((stderr,"** Pop call context %d\n",m_defList.count()));
- Ctx *ctx = m_defList.getLast();
- if (ctx)
- {
- _name = ctx->name;
- _type = ctx->type;
- }
- m_defList.removeLast();
- }
- else
- {
- DBG_CTX((stderr,"** ILLEGAL: Pop call context\n"));
- }
- }
- void clear()
- {
- DBG_CTX((stderr,"** Clear call context\n"));
- m_defList.clear();
- m_defList.append(new Ctx("",""));
- }
- const Definition *getScope() const
- {
- Ctx *ctx = m_defList.getLast();
- if (ctx) return ctx->d; else return 0;
- }
-
- private:
- QList<Ctx> m_defList;
-};
-
-
struct codeYY_state
{
CodeOutputInterface * code = 0;
- ClassSDict *codeClassSDict = 0;
+ std::unordered_map< std::string, ScopedTypeVariant > codeClassMap;
QCString curClassName;
QStrList curClassBases;
@@ -221,10 +99,10 @@ struct codeYY_state
QCString parmName;
const char * inputString = 0; //!< the code fragment as text
- int inputPosition = 0; //!< read offset during parsing
+ yy_size_t inputPosition = 0; //!< read offset during parsing
int inputLines = 0; //!< number of line in the code fragment
- int yyLineNr = 0; //!< current line number
- int yyColNr = 0; //!< current column number
+ int yyLineNr = 0; //!< current line number
+ yy_size_t yyColNr = 0; //!< current column number
bool needsTermination = FALSE;
bool exampleBlock = FALSE;
@@ -237,13 +115,13 @@ struct codeYY_state
QCString args;
QCString classScope;
QCString realScope;
- QStack<int> scopeStack; //!< 1 if bracket starts a scope,
- // 2 for internal blocks
+ std::stack<int> scopeStack; //!< 1 if bracket starts a scope,
+ // 2 for internal blocks
int anchorCount = 0;
FileDef * sourceFileDef = 0;
bool lineNumbers = FALSE;
- Definition * currentDefinition = 0;
- MemberDef * currentMemberDef = 0;
+ const Definition * currentDefinition = 0;
+ const MemberDef * currentMemberDef = 0;
bool includeCodeFragment = FALSE;
const char * currentFontClass = 0;
bool searchingForBody = FALSE;
@@ -253,20 +131,20 @@ struct codeYY_state
QCString saveType;
QCString delimiter;
- int bracketCount = 0;
- int curlyCount = 0;
- int sharpCount = 0;
+ int bracketCount = 0;
+ int curlyCount = 0;
+ int sharpCount = 0;
bool inFunctionTryBlock = FALSE;
bool inForEachExpression = FALSE;
int lastTemplCastContext = 0;
- int lastSpecialCContext = 0;
+ int lastSpecialCContext = 0;
int lastStringContext = 0;
int lastSkipCppContext = 0;
int lastVerbStringContext = 0;
int lastObjCCallContext = 0;
int memCallContext = 0;
- int lastCContext = 0;
+ int lastCContext = 0;
int skipInlineInitContext = 0;
SrcLangExt lang = SrcLangExt_Unknown;
@@ -275,9 +153,9 @@ struct codeYY_state
bool lexInit = FALSE;
- QStack<int> classScopeLengthStack;
+ std::stack<int> classScopeLengthStack;
- int prefixed_with_this_keyword = FALSE;
+ int isPrefixedWithThis = FALSE;
const Definition *searchCtx = 0;
bool collectXRefs = FALSE;
@@ -287,26 +165,28 @@ struct codeYY_state
int currentObjId=0;
int currentWordId=0;
int currentCommentId=0;
- QStack<ObjCCallCtx> contextStack;
- QIntDict<ObjCCallCtx> contextDict;
- QIntDict<QCString> nameDict;
- QIntDict<QCString> objectDict;
- QIntDict<QCString> wordDict;
- QIntDict<QCString> commentDict;
+ std::stack<ObjCCallCtx*> contextStack;
+ std::unordered_map< int,std::unique_ptr<ObjCCallCtx> > contextMap;
+ std::unordered_map< int, QCString> nameMap;
+ std::unordered_map< int, QCString> objectMap;
+ std::unordered_map< int, QCString> wordMap;
+ std::unordered_map< int, QCString> commentMap;
int braceCount=0;
- QCString forceTagReference;
VariableContext theVarContext;
CallContext theCallContext;
+ SymbolResolver symbolResolver;
};
static bool isCastKeyword(const QCString &s);
//-------------------------------------------------------------------
+#if USE_STATE2STRING
+static const char *stateToString(yyscan_t yyscanner,int state);
+#endif
static void saveObjCContext(yyscan_t yyscanner);
static void restoreObjCContext(yyscan_t yyscanner);
-static const char *stateToString(yyscan_t yyscanner,int state);
static void addUsingDirective(yyscan_t yyscanner,const char *name);
static void pushScope(yyscan_t yyscanner,const char *s);
static void popScope(yyscan_t yyscanner);
@@ -319,6 +199,7 @@ static void nextCodeLine(yyscan_t yyscanner);
static void startFontClass(yyscan_t yyscanner,const char *s);
static void endFontClass(yyscan_t yyscanner);
static void codifyLines(yyscan_t yyscanner,const char *text);
+static void incrementFlowKeyWordCount(yyscan_t yyscanner);
static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
const Definition *d,
const char *text);
@@ -326,24 +207,24 @@ static void addType(yyscan_t yyscanner);
static void addParmType(yyscan_t yyscanner);
static void addUsingDirective(yyscan_t yyscanner,const char *name);
static void setParameterList(yyscan_t yyscanner,const MemberDef *md);
-static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,Definition *d);
-static MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString &name);
+static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,const Definition *d);
+static const MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString &name);
static void updateCallContextForSmartPointer(yyscan_t yyscanner);
static bool getLinkInScope(yyscan_t yyscanner,const QCString &c, // scope
const QCString &m, // member
- const char *memberText, // exact text
- CodeOutputInterface &ol,
- const char *text,
- bool varOnly=FALSE
- );
+ const char *memberText, // exact text
+ CodeOutputInterface &ol,
+ const char *text,
+ bool varOnly=FALSE
+ );
static bool getLink(yyscan_t yyscanner,const char *className,
const char *memberName,
- CodeOutputInterface &ol,
- const char *text=0,
- bool varOnly=FALSE);
+ CodeOutputInterface &ol,
+ const char *text=0,
+ bool varOnly=FALSE);
static void generateClassOrGlobalLink(yyscan_t yyscanner,CodeOutputInterface &ol,const char *clName,
bool typeOnly=FALSE,bool varOnly=FALSE);
-static bool generateClassMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,MemberDef *xmd,const char *memName);
+static bool generateClassMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,const MemberDef *xmd,const char *memName);
static bool generateClassMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,const Definition *def,const char *memName);
static void generateMemberLink(yyscan_t yyscanner,CodeOutputInterface &ol,const QCString &varName,
const char *memName);
@@ -356,20 +237,27 @@ static QCString escapeObject(yyscan_t yyscanner,const char *s);
static QCString escapeWord(yyscan_t yyscanner,const char *s);
static QCString escapeComment(yyscan_t yyscanner,const char *s);
static bool skipLanguageSpecificKeyword(yyscan_t yyscanner,const QCString &kw);
-static int yyread(yyscan_t yyscanner,char *buf,int max_size);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+static void addVariable(yyscan_t yyscanner,QCString type,QCString name);
+//-------------------------------------------------------------------
+
+static std::mutex g_searchIndexMutex;
+static std::mutex g_docCrossReferenceMutex;
+static std::mutex g_addExampleMutex;
+static std::mutex g_countFlowKeywordsMutex;
/* -----------------------------------------------------------------
*/
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
%}
B [ \t]
BN [ \t\n\r]
-ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
+ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
SEP ("::"|"\\")
SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID}
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
@@ -385,23 +273,51 @@ CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast")
CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++"
ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
-LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
+LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"|"<=>"
BITOP "&"|"|"|"^"|"<<"|">>"|"~"
OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
RAWBEGIN (u|U|L|u8)?R\"[^ \t\(\)\\]{0,16}"("
RAWEND ")"[^ \t\(\)\\]{0,16}\"
+ //- start: NUMBER -------------------------------------------------------------------------
+ // Note same defines in commentcnv.l: keep in sync
+DECIMAL_INTEGER [1-9][0-9']*[0-9]?[uU]?[lL]?[lL]?
+HEXADECIMAL_INTEGER "0"[xX][0-9a-zA-Z']+[0-9a-zA-Z]?
+OCTAL_INTEGER "0"[0-7][0-7']+[0-7]?
+BINARY_INTEGER "0"[bB][01][01']*[01]?
+INTEGER_NUMBER {DECIMAL_INTEGER}|{HEXADECIMAL_INTEGER}|{OCTAL_INTEGER}|{BINARY_INTEGER}
+
+FP_SUF [fFlL]
+
+DIGIT_SEQ [0-9][0-9']*[0-9]?
+FRAC_CONST {DIGIT_SEQ}"."|{DIGIT_SEQ}?"."{DIGIT_SEQ}
+FP_EXP [eE][+-]?{DIGIT_SEQ}
+DEC_FP1 {FRAC_CONST}{FP_EXP}?{FP_SUF}?
+DEC_FP2 {DIGIT_SEQ}{FP_EXP}{FP_SUF}
+
+HEX_DIGIT_SEQ [0-9a-fA-F][0-9a-fA-F']*[0-9a-fA-F]?
+HEX_FRAC_CONST {HEX_DIGIT_SEQ}"."|{HEX_DIGIT_SEQ}?"."{HEX_DIGIT_SEQ}
+BIN_EXP [pP][+-]?{DIGIT_SEQ}
+HEX_FP1 "0"[xX]{HEX_FRAC_CONST}{BIN_EXP}{FP_SUF}?
+HEX_FP2 "0"[xX]{HEX_DIGIT_SEQ}{BIN_EXP}{FP_SUF}?
+
+FLOAT_DECIMAL {DEC_FP1}|{DEC_FP2}
+FLOAT_HEXADECIMAL {HEX_FP1}|{HEX_FP2}
+FLOAT_NUMBER {FLOAT_DECIMAL}|{FLOAT_HEXADECIMAL}
+NUMBER {INTEGER_NUMBER}|{FLOAT_NUMBER}
+ //- end: NUMBER ---------------------------------------------------------------------------
+
%option noyywrap
%x SkipString
%x SkipStringS
%x SkipVerbString
-%x SkipCPP
-%x SkipComment
-%x SkipCxxComment
-%x RemoveSpecialCComment
-%x StripSpecialCComment
-%x Body
+%x SkipCPP
+%x SkipComment
+%x SkipCxxComment
+%x RemoveSpecialCComment
+%x StripSpecialCComment
+%x Body
%x FuncCall
%x MemberCall
%x MemberCall2
@@ -411,22 +327,22 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
%x AlignAsEnd
%x PackageName
%x ClassVar
-%x CppCliTypeModifierFollowup
+%x CppCliTypeModifierFollowup
%x Bases
%x SkipSharp
%x ReadInclude
%x TemplDecl
%x TemplCast
-%x CallEnd
+%x CallEnd
%x ObjCMethod
-%x ObjCParams
-%x ObjCParamType
+%x ObjCParams
+%x ObjCParamType
%x ObjCCall
%x ObjCMName
%x ObjCSkipStr
%x ObjCCallComment
%x OldStyleArgs
-%x UsingName
+%x UsingName
%x RawString
%x InlineInit
@@ -434,481 +350,492 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<*>\x0d
<Body>^([ \t]*"#"[ \t]*("include"|"import")[ \t]*)("<"|"\"") {
- startFontClass(yyscanner,"preprocessor");
- yyextra->code->codify(yytext);
- BEGIN( ReadInclude );
- }
-<Body>("@interface"|"@implementation"|"@protocol")[ \t\n]+ {
+ startFontClass(yyscanner,"preprocessor");
+ yyextra->code->codify(yytext);
+ BEGIN( ReadInclude );
+ }
+<Body>("@interface"|"@implementation"|"@protocol")[ \t\n]+ {
yyextra->insideObjC=TRUE;
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- if (!yyextra->insideTemplate)
- BEGIN( ClassName );
- }
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ if (!yyextra->insideTemplate)
+ BEGIN( ClassName );
+ }
<Body>(("public"|"private"){B}+)?("ref"|"value"|"interface"|"enum"){B}+("class"|"struct") {
- if (yyextra->insideTemplate) REJECT;
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- BEGIN( ClassName );
- }
-<Body>"property"|"event"/{BN}* {
- if (yyextra->insideTemplate) REJECT;
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
-<Body>(KEYWORD_CPPCLI_DATATYPE|("partial"{B}+)?"class"|"struct"|"union"|"namespace"|"interface"){B}+ {
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- if (!yyextra->insideTemplate)
- BEGIN( ClassName );
- }
-<Body>("package")[ \t\n]+ {
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- BEGIN( PackageName );
- }
-<ClassVar>\n {
- if (!yyextra->insideObjC) REJECT;
- codifyLines(yyscanner,yytext);
- BEGIN(Body);
- }
-<Body,ClassVar,Bases>"-"|"+" {
- if (!yyextra->insideObjC || yyextra->insideBody)
- {
- yyextra->code->codify(yytext);
- }
- else // Start of Objective-C method
- {
- //printf("Method!\n");
- yyextra->code->codify(yytext);
- BEGIN(ObjCMethod);
- }
- }
-<ObjCMethod>":" {
- yyextra->code->codify(yytext);
- BEGIN(ObjCParams);
- }
-<ObjCParams>"(" {
- yyextra->code->codify(yytext);
- BEGIN(ObjCParamType);
- }
-<ObjCParams,ObjCMethod>";"|"{" {
- yyextra->code->codify(yytext);
- if (*yytext=='{')
- {
- if (yyextra->searchingForBody)
- {
- yyextra->searchingForBody=FALSE;
- yyextra->insideBody=TRUE;
- }
- if (yyextra->insideBody) yyextra->bodyCurlyCount++;
- if (!yyextra->curClassName.isEmpty()) // valid class name
- {
- pushScope(yyscanner,yyextra->curClassName);
+ if (yyextra->insideTemplate) REJECT;
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN( ClassName );
+ }
+<Body>"property"|"event"/{BN}* {
+ if (yyextra->insideTemplate) REJECT;
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Body>(KEYWORD_CPPCLI_DATATYPE|("partial"{B}+)?"class"|"struct"|"union"|"namespace"|"interface"){B}+ {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ if (!yyextra->insideTemplate)
+ BEGIN( ClassName );
+ }
+<Body>("package")[ \t\n]+ {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN( PackageName );
+ }
+<ClassVar>\n {
+ if (!yyextra->insideObjC) REJECT;
+ codifyLines(yyscanner,yytext);
+ BEGIN(Body);
+ }
+<Body,ClassVar,Bases>"-"|"+" {
+ if (!yyextra->insideObjC || yyextra->insideBody)
+ {
+ yyextra->code->codify(yytext);
+ }
+ else // Start of Objective-C method
+ {
+ //printf("Method!\n");
+ yyextra->code->codify(yytext);
+ BEGIN(ObjCMethod);
+ }
+ }
+<ObjCMethod>":" {
+ yyextra->code->codify(yytext);
+ BEGIN(ObjCParams);
+ }
+<ObjCParams>"(" {
+ yyextra->code->codify(yytext);
+ BEGIN(ObjCParamType);
+ }
+<ObjCParams,ObjCMethod>";"|"{" {
+ yyextra->code->codify(yytext);
+ if (*yytext=='{')
+ {
+ if (yyextra->searchingForBody)
+ {
+ yyextra->searchingForBody=FALSE;
+ yyextra->insideBody=TRUE;
+ }
+ if (yyextra->insideBody) yyextra->bodyCurlyCount++;
+ if (!yyextra->curClassName.isEmpty()) // valid class name
+ {
+ pushScope(yyscanner,yyextra->curClassName);
DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
- yyextra->scopeStack.push(SCOPEBLOCK);
- }
- }
+ yyextra->scopeStack.push(SCOPEBLOCK);
+ }
+ }
yyextra->type.resize(0);
yyextra->name.resize(0);
- BEGIN(Body);
- }
-<ObjCParams>{ID}{B}*":" {
- yyextra->code->codify(yytext);
- }
-<ObjCParamType>{TYPEKW} {
- startFontClass(yyscanner,"keywordtype");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- yyextra->parmType=yytext;
- }
-<ObjCParamType>{ID} {
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- yyextra->parmType=yytext;
- }
-<ObjCParamType>")" {
- yyextra->code->codify(yytext);
- BEGIN(ObjCParams);
- }
-<ObjCParams>{ID} {
- yyextra->code->codify(yytext);
- yyextra->parmName=yytext;
- yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
- yyextra->parmType.resize(0);yyextra->parmName.resize(0);
- }
+ BEGIN(Body);
+ }
+<ObjCParams>{ID}{B}*":" {
+ yyextra->code->codify(yytext);
+ }
+<ObjCParamType>{TYPEKW} {
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ yyextra->parmType=yytext;
+ }
+<ObjCParamType>{ID} {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ yyextra->parmType=yytext;
+ }
+<ObjCParamType>")" {
+ yyextra->code->codify(yytext);
+ BEGIN(ObjCParams);
+ }
+<ObjCParams>{ID} {
+ yyextra->code->codify(yytext);
+ yyextra->parmName=yytext;
+ addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
+ yyextra->parmType.resize(0);yyextra->parmName.resize(0);
+ }
<ObjCMethod,ObjCParams,ObjCParamType>{ID} {
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- }
-<ObjCMethod,ObjCParams,ObjCParamType>. {
- yyextra->code->codify(yytext);
- }
-<ObjCMethod,ObjCParams,ObjCParamType>\n {
- codifyLines(yyscanner,yytext);
- }
-<ReadInclude>[^\n\"\>]+/(">"|"\"") {
- //FileInfo *f;
- bool ambig;
- bool found=FALSE;
- //QCString absPath = yytext;
- //if (yyextra->sourceFileDef && QDir::isRelativePath(absPath))
- //{
- // absPath = QDir::cleanDirPath(yyextra->sourceFileDef->getPath()+"/"+absPath);
- //}
-
- FileDef *fd=findFileDef(Doxygen::inputNameDict,yytext,ambig);
- //printf("looking for include %s -> %s fd=%p\n",yytext,absPath.data(),fd);
- if (fd && fd->isLinkable())
- {
- if (ambig) // multiple input files match the name
- {
- //printf("===== yes %s is ambiguous\n",yytext);
- QCString name = QDir::cleanDirPath(yytext).utf8();
- if (!name.isEmpty() && yyextra->sourceFileDef)
- {
- FileName *fn = Doxygen::inputNameDict->find(name);
- if (fn)
- {
- FileNameIterator fni(*fn);
- // for each include name
- for (fni.toFirst();!found && (fd=fni.current());++fni)
- {
- // see if this source file actually includes the file
- found = yyextra->sourceFileDef->isIncluded(fd->absFilePath());
- //printf(" include file %s found=%d\n",fd->absFilePath().data(),found);
- }
- }
- }
- }
- else // not ambiguous
- {
- found = TRUE;
- }
- }
- //printf(" include file %s found=%d\n",fd ? fd->absFilePath().data() : "<none>",found);
- if (found)
- {
- writeMultiLineCodeLink(yyscanner,*yyextra->code,fd,yytext);
- }
- else
- {
- yyextra->code->codify(yytext);
- }
- char c=yyinput(yyscanner);
- QCString text;
- text+=c;
- yyextra->code->codify(text);
- endFontClass(yyscanner);
- BEGIN( Body );
- }
-<Body,Bases>^[ \t]*"#" {
- startFontClass(yyscanner,"preprocessor");
- yyextra->lastSkipCppContext = YY_START;
- yyextra->code->codify(yytext);
- BEGIN( SkipCPP ) ;
- }
-<SkipCPP>. {
- yyextra->code->codify(yytext);
- }
-<SkipCPP>[^\n\/\\]+ {
- yyextra->code->codify(yytext);
- }
-<SkipCPP>\\[\r]?\n {
- codifyLines(yyscanner,yytext);
- }
-<SkipCPP>"//" {
- yyextra->code->codify(yytext);
- }
-<Body,FuncCall>"{" {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ }
+<ObjCMethod,ObjCParams,ObjCParamType>. {
+ yyextra->code->codify(yytext);
+ }
+<ObjCMethod,ObjCParams,ObjCParamType>\n {
+ codifyLines(yyscanner,yytext);
+ }
+<ReadInclude>[^\n\"\>]+/(">"|"\"") {
+ //FileInfo *f;
+ bool ambig;
+ bool found=FALSE;
+
+ const FileDef *fd=findFileDef(Doxygen::inputNameLinkedMap,yytext,ambig);
+ //printf("looking for include %s -> %s fd=%p\n",yytext,absPath.data(),fd);
+ if (fd && fd->isLinkable())
+ {
+ if (ambig) // multiple input files match the name
+ {
+ //printf("===== yes %s is ambiguous\n",yytext);
+ QCString name = QDir::cleanDirPath(yytext).utf8();
+ if (!name.isEmpty() && yyextra->sourceFileDef)
+ {
+ const FileName *fn = Doxygen::inputNameLinkedMap->find(name);
+ if (fn)
+ {
+ // see if this source file actually includes the file
+ auto it = std::find_if(fn->begin(),
+ fn->end(),
+ [&sfd=yyextra->sourceFileDef]
+ (const auto &lfd)
+ { return sfd->isIncluded(lfd->absFilePath()); });
+ found = it!=fn->end();
+ }
+ }
+ }
+ else // not ambiguous
+ {
+ found = TRUE;
+ }
+ }
+ //printf(" include file %s found=%d\n",fd ? fd->absFilePath().data() : "<none>",found);
+ if (found)
+ {
+ writeMultiLineCodeLink(yyscanner,*yyextra->code,fd,yytext);
+ }
+ else
+ {
+ yyextra->code->codify(yytext);
+ }
+ char c=(char)yyinput(yyscanner);
+ QCString text;
+ text+=c;
+ yyextra->code->codify(text);
+ endFontClass(yyscanner);
+ BEGIN( Body );
+ }
+<Body,Bases>^[ \t]*"#" {
+ startFontClass(yyscanner,"preprocessor");
+ yyextra->lastSkipCppContext = YY_START;
+ yyextra->code->codify(yytext);
+ BEGIN( SkipCPP ) ;
+ }
+<SkipCPP>\" {
+ yyextra->code->codify(yytext);
+ yyextra->lastStringContext=YY_START;
+ BEGIN( SkipString ) ;
+ }
+<SkipCPP>. {
+ yyextra->code->codify(yytext);
+ }
+<SkipCPP>[^\n\/\\\"]+ {
+ yyextra->code->codify(yytext);
+ }
+<SkipCPP>\\[\r]?\n {
+ codifyLines(yyscanner,yytext);
+ }
+<SkipCPP>"//"/[^/!] {
+ REJECT;
+ }
+<Body,FuncCall>"{" {
yyextra->theVarContext.pushScope();
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
- yyextra->scopeStack.push(INNERBLOCK);
-
- if (yyextra->searchingForBody)
- {
- yyextra->searchingForBody=FALSE;
- yyextra->insideBody=TRUE;
- }
- yyextra->code->codify(yytext);
- if (yyextra->insideBody)
- {
- yyextra->bodyCurlyCount++;
- }
- yyextra->type.resize(0);
- yyextra->name.resize(0);
- BEGIN( Body );
- }
-<Body,FuncCall,MemberCall,MemberCall2>"}" {
+ yyextra->scopeStack.push(INNERBLOCK);
+
+ if (yyextra->searchingForBody)
+ {
+ yyextra->searchingForBody=FALSE;
+ yyextra->insideBody=TRUE;
+ }
+ yyextra->code->codify(yytext);
+ if (yyextra->insideBody)
+ {
+ yyextra->bodyCurlyCount++;
+ }
+ yyextra->type.resize(0);
+ yyextra->name.resize(0);
+ BEGIN( Body );
+ }
+<Body,FuncCall,MemberCall,MemberCall2>"}" {
yyextra->theVarContext.popScope();
- yyextra->type.resize(0);
- yyextra->name.resize(0);
-
- int *scope = yyextra->scopeStack.pop();
- DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
- if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
- {
- popScope(yyscanner);
- }
-
- yyextra->code->codify(yytext);
-
- DBG_CTX((stderr,"yyextra->bodyCurlyCount=%d\n",yyextra->bodyCurlyCount));
- if (--yyextra->bodyCurlyCount<=0)
- {
- yyextra->insideBody=FALSE;
- yyextra->currentMemberDef=0;
- if (yyextra->currentDefinition)
- yyextra->currentDefinition=yyextra->currentDefinition->getOuterScope();
- }
- BEGIN(Body);
- }
-<Body,ClassVar>"@end" {
- //printf("End of objc scope fd=%s\n",yyextra->sourceFileDef->name().data());
+ yyextra->type.resize(0);
+ yyextra->name.resize(0);
+
+ if (!yyextra->scopeStack.empty())
+ {
+ int scope = yyextra->scopeStack.top();
+ yyextra->scopeStack.pop();
+ DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
+ if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
+ {
+ popScope(yyscanner);
+ }
+ }
+
+ yyextra->code->codify(yytext);
+
+ DBG_CTX((stderr,"yyextra->bodyCurlyCount=%d\n",yyextra->bodyCurlyCount));
+ if (--yyextra->bodyCurlyCount<=0)
+ {
+ yyextra->insideBody=FALSE;
+ yyextra->currentMemberDef=0;
+ if (yyextra->currentDefinition)
+ yyextra->currentDefinition=yyextra->currentDefinition->getOuterScope();
+ }
+ BEGIN(Body);
+ }
+<Body,ClassVar>"@end" {
+ //printf("End of objc scope fd=%s\n",yyextra->sourceFileDef->name().data());
if (yyextra->sourceFileDef)
- {
- FileDef *fd=yyextra->sourceFileDef;
- yyextra->insideObjC = fd->name().lower().right(2)==".m" ||
- fd->name().lower().right(3)==".mm";
- //printf("insideObjC=%d\n",yyextra->insideObjC);
- }
- else
- {
- yyextra->insideObjC = FALSE;
- }
- if (yyextra->insideBody)
- {
+ {
+ const FileDef *fd=yyextra->sourceFileDef;
+ yyextra->insideObjC = fd->name().lower().right(2)==".m" ||
+ fd->name().lower().right(3)==".mm";
+ //printf("insideObjC=%d\n",yyextra->insideObjC);
+ }
+ else
+ {
+ yyextra->insideObjC = FALSE;
+ }
+ if (yyextra->insideBody)
+ {
yyextra->theVarContext.popScope();
- int *scope = yyextra->scopeStack.pop();
- DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
- if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
- {
- popScope(yyscanner);
- }
- yyextra->insideBody=FALSE;
- }
-
- startFontClass(yyscanner,"keyword");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
-
- yyextra->currentMemberDef=0;
- if (yyextra->currentDefinition)
- yyextra->currentDefinition=yyextra->currentDefinition->getOuterScope();
- BEGIN(Body);
- }
-<ClassName,ClassVar>";" {
- yyextra->code->codify(yytext);
- yyextra->searchingForBody=FALSE;
- BEGIN( Body );
- }
-<ClassName,ClassVar>[*&^%]+ {
- yyextra->type=yyextra->curClassName.copy();
- yyextra->name.resize(0);
- yyextra->code->codify(yytext);
- BEGIN( Body ); // variable of type struct *
- }
-<ClassName>"__declspec"{B}*"("{B}*{ID}{B}*")" {
- startFontClass(yyscanner,"keyword");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- }
-<ClassName>{ID}("."{ID})* |
-<ClassName>{ID}("::"{ID})* {
+ if (!yyextra->scopeStack.empty())
+ {
+ int scope = yyextra->scopeStack.top();
+ yyextra->scopeStack.pop();
+ DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
+ if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
+ {
+ popScope(yyscanner);
+ }
+ }
+ yyextra->insideBody=FALSE;
+ }
+
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+
+ yyextra->currentMemberDef=0;
+ if (yyextra->currentDefinition)
+ yyextra->currentDefinition=yyextra->currentDefinition->getOuterScope();
+ BEGIN(Body);
+ }
+<ClassName,ClassVar>";" {
+ yyextra->code->codify(yytext);
+ yyextra->searchingForBody=FALSE;
+ BEGIN( Body );
+ }
+<ClassName,ClassVar>[*&^%]+ {
+ yyextra->type=yyextra->curClassName.copy();
+ yyextra->name.resize(0);
+ yyextra->code->codify(yytext);
+ BEGIN( Body ); // variable of type struct *
+ }
+<ClassName>"__declspec"{B}*"("{B}*{ID}{B}*")" {
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+<ClassName>{ID}("."{ID})* |
+<ClassName>{ID}("::"{ID})* {
if (yyextra->lang==SrcLangExt_CSharp)
yyextra->curClassName=substitute(yytext,".","::");
else
yyextra->curClassName=yytext;
- addType(yyscanner);
+ addType(yyscanner);
if (yyextra->curClassName=="alignas")
{
- startFontClass(yyscanner,"keyword");
- yyextra->code->codify(yytext);
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
endFontClass(yyscanner);
BEGIN( AlignAs );
}
else
{
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- BEGIN( ClassVar );
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ BEGIN( ClassVar );
}
- }
-<AlignAs>"(" {
+ }
+<AlignAs>"(" {
yyextra->bracketCount=1;
- yyextra->code->codify(yytext);
+ yyextra->code->codify(yytext);
BEGIN( AlignAsEnd );
}
-<AlignAs>\n { yyextra->yyLineNr++;
+<AlignAs>\n { yyextra->yyLineNr++;
codifyLines(yyscanner,yytext);
}
<AlignAs>. { yyextra->code->codify(yytext); }
<AlignAsEnd>"(" { yyextra->code->codify(yytext);
- yyextra->bracketCount++;
+ yyextra->bracketCount++;
}
-<AlignAsEnd>")" {
+<AlignAsEnd>")" {
yyextra->code->codify(yytext);
if (--yyextra->bracketCount<=0)
{
BEGIN(ClassName);
}
}
-<AlignAsEnd>\n { yyextra->yyLineNr++;
- codifyLines(yyscanner,yytext);
+<AlignAsEnd>\n { yyextra->yyLineNr++;
+ codifyLines(yyscanner,yytext);
}
<AlignAsEnd>. { yyextra->code->codify(yytext); }
-<ClassName>{ID}("\\"{ID})* { // PHP namespace
+<ClassName>{ID}("\\"{ID})* { // PHP namespace
yyextra->curClassName=substitute(yytext,"\\","::");
- yyextra->scopeStack.push(CLASSBLOCK);
- pushScope(yyscanner,yyextra->curClassName);
- addType(yyscanner);
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- BEGIN( ClassVar );
- }
+ yyextra->scopeStack.push(CLASSBLOCK);
+ pushScope(yyscanner,yyextra->curClassName);
+ addType(yyscanner);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ BEGIN( ClassVar );
+ }
<ClassName>{ID}{B}*"("{ID}")" { // Obj-C category
yyextra->curClassName=removeRedundantWhiteSpace(yytext);
- yyextra->scopeStack.push(CLASSBLOCK);
- pushScope(yyscanner,yyextra->curClassName);
- addType(yyscanner);
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- BEGIN( ClassVar );
- }
-<PackageName>{ID}("."{ID})* {
- yyextra->curClassName=substitute(yytext,".","::");
- //printf("found package: %s\n",yyextra->curClassName.data());
- addType(yyscanner);
- codifyLines(yyscanner,yytext);
- }
-<ClassVar>"=" {
- unput(*yytext);
- BEGIN( Body );
- }
-<ClassVar>("extends"|"implements") { // Java, Slice
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- yyextra->curClassBases.clear();
- BEGIN( Bases );
- }
+ yyextra->scopeStack.push(CLASSBLOCK);
+ pushScope(yyscanner,yyextra->curClassName);
+ addType(yyscanner);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ BEGIN( ClassVar );
+ }
+<PackageName>{ID}("."{ID})* {
+ yyextra->curClassName=substitute(yytext,".","::");
+ //printf("found package: %s\n",yyextra->curClassName.data());
+ addType(yyscanner);
+ codifyLines(yyscanner,yytext);
+ }
+<ClassVar>"=" {
+ unput(*yytext);
+ BEGIN( Body );
+ }
+<ClassVar>("extends"|"implements") { // Java, Slice
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yyextra->curClassBases.clear();
+ BEGIN( Bases );
+ }
<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") {
- DBG_CTX((stderr,"***** C++/CLI modifier %s on yyextra->curClassName=%s\n",yytext,yyextra->curClassName.data()));
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- BEGIN( CppCliTypeModifierFollowup );
- }
-<ClassVar>{ID} {
- yyextra->type = yyextra->curClassName.copy();
- yyextra->name = yytext;
- if (yyextra->insideBody)
- {
- yyextra->theVarContext.addVariable(yyscanner,yyextra->type,yyextra->name);
- }
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- }
-<ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*":"{B}* {
- codifyLines(yyscanner,yytext);
- yyextra->curClassBases.clear();
- BEGIN( Bases );
- }
-<PackageName>[ \t]*";" |
+ DBG_CTX((stderr,"***** C++/CLI modifier %s on yyextra->curClassName=%s\n",yytext,yyextra->curClassName.data()));
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN( CppCliTypeModifierFollowup );
+ }
+<ClassVar>{ID} {
+ yyextra->type = yyextra->curClassName.copy();
+ yyextra->name = yytext;
+ if (yyextra->insideBody)
+ {
+ addVariable(yyscanner,yyextra->type,yyextra->name);
+ }
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ }
+<ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*":"{B}* {
+ codifyLines(yyscanner,yytext);
+ yyextra->curClassBases.clear();
+ BEGIN( Bases );
+ }
+<PackageName>[ \t]*";" |
<Bases>^{B}*/"@"{ID} | // Objective-C interface
<Bases,ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*"{"{B}* {
yyextra->theVarContext.pushScope();
- yyextra->code->codify(yytext);
- if (YY_START==ClassVar && yyextra->curClassName.isEmpty())
- {
- yyextra->curClassName = yyextra->name.copy();
- }
- if (yyextra->searchingForBody)
- {
- yyextra->searchingForBody=FALSE;
- yyextra->insideBody=TRUE;
- }
- if (yyextra->insideBody) yyextra->bodyCurlyCount++;
- if (!yyextra->curClassName.isEmpty()) // valid class name
- {
+ yyextra->code->codify(yytext);
+ if (YY_START==ClassVar && yyextra->curClassName.isEmpty())
+ {
+ yyextra->curClassName = yyextra->name.copy();
+ }
+ if (yyextra->searchingForBody)
+ {
+ yyextra->searchingForBody=FALSE;
+ yyextra->insideBody=TRUE;
+ }
+ if (yyextra->insideBody) yyextra->bodyCurlyCount++;
+ if (!yyextra->curClassName.isEmpty()) // valid class name
+ {
DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
- yyextra->scopeStack.push(CLASSBLOCK);
- pushScope(yyscanner,yyextra->curClassName);
- DBG_CTX((stderr,"***** yyextra->curClassName=%s\n",yyextra->curClassName.data()));
- if (getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,yyextra->curClassName)==0)
- {
- DBG_CTX((stderr,"Adding new class %s\n",yyextra->curClassName.data()));
- ClassDef *ncd=createClassDef("<code>",1,1,
- yyextra->curClassName,ClassDef::Class,0,0,FALSE);
- yyextra->codeClassSDict->append(yyextra->curClassName,ncd);
- // insert base classes.
- char *s=yyextra->curClassBases.first();
- while (s)
- {
- const ClassDef *bcd=yyextra->codeClassSDict->find(s);
- if (bcd==0) bcd=getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,s);
- if (bcd && bcd!=ncd)
- {
- ncd->insertBaseClass(const_cast<ClassDef*>(bcd),s,Public,Normal);
- }
- s=yyextra->curClassBases.next();
- }
- }
- //printf("yyextra->codeClassList.count()=%d\n",yyextra->codeClassList.count());
- }
- else // not a class name -> assume inner block
- {
+ yyextra->scopeStack.push(CLASSBLOCK);
+ pushScope(yyscanner,yyextra->curClassName);
+ DBG_CTX((stderr,"***** yyextra->curClassName=%s\n",yyextra->curClassName.data()));
+ if (yyextra->symbolResolver.resolveClass(yyextra->currentDefinition,yyextra->curClassName)==0)
+ {
+ DBG_CTX((stderr,"Adding new class %s\n",yyextra->curClassName.data()));
+ ScopedTypeVariant var(yyextra->curClassName);
+ // insert base classes.
+ char *s=yyextra->curClassBases.first();
+ while (s)
+ {
+ const ClassDef *bcd=0;
+ auto it = yyextra->codeClassMap.find(s);
+ if (it!=yyextra->codeClassMap.end())
+ {
+ bcd = toClassDef(it->second.globalDef());
+ }
+ if (bcd==0) bcd=yyextra->symbolResolver.resolveClass(yyextra->currentDefinition,s);
+ if (bcd && bcd->name()!=yyextra->curClassName)
+ {
+ var.localDef()->insertBaseClass(bcd->name());
+ }
+ s=yyextra->curClassBases.next();
+ }
+ yyextra->codeClassMap.emplace(std::make_pair(yyextra->curClassName.str(),std::move(var)));
+ }
+ //printf("yyextra->codeClassList.count()=%d\n",yyextra->codeClassList.count());
+ }
+ else // not a class name -> assume inner block
+ {
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
- yyextra->scopeStack.push(INNERBLOCK);
- }
- yyextra->curClassName.resize(0);
- yyextra->curClassBases.clear();
- BEGIN( Body );
- }
-<Bases>"virtual"|"public"|"protected"|"private"|"@public"|"@private"|"@protected" {
- startFontClass(yyscanner,"keyword");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- }
-<Bases>{SEP}?({ID}{SEP})*{ID} {
- DBG_CTX((stderr,"%s:addBase(%s)\n",yyextra->curClassName.data(),yytext));
- yyextra->curClassBases.inSort(yytext);
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- }
-<Bases>"<" {
- yyextra->code->codify(yytext);
- if (!yyextra->insideObjC)
- {
- yyextra->sharpCount=1;
- BEGIN ( SkipSharp );
- }
- else
- {
- yyextra->insideProtocolList=TRUE;
- }
- }
-<Bases>">" {
- yyextra->code->codify(yytext);
- yyextra->insideProtocolList=FALSE;
- }
+ yyextra->scopeStack.push(INNERBLOCK);
+ }
+ yyextra->curClassName.resize(0);
+ yyextra->curClassBases.clear();
+ BEGIN( Body );
+ }
+<Bases>"virtual"|"public"|"protected"|"private"|"@public"|"@private"|"@protected" {
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+<Bases>{SEP}?({ID}{SEP})*{ID} {
+ DBG_CTX((stderr,"%s:addBase(%s)\n",yyextra->curClassName.data(),yytext));
+ yyextra->curClassBases.inSort(yytext);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ }
+<Bases>"<" {
+ yyextra->code->codify(yytext);
+ if (!yyextra->insideObjC)
+ {
+ yyextra->sharpCount=1;
+ BEGIN ( SkipSharp );
+ }
+ else
+ {
+ yyextra->insideProtocolList=TRUE;
+ }
+ }
+<Bases>">" {
+ yyextra->code->codify(yytext);
+ yyextra->insideProtocolList=FALSE;
+ }
<SkipSharp>"<" {
- yyextra->code->codify(yytext);
- ++yyextra->sharpCount;
- }
-<SkipSharp>">" {
- yyextra->code->codify(yytext);
- if (--yyextra->sharpCount<=0)
- BEGIN ( Bases );
- }
+ yyextra->code->codify(yytext);
+ ++yyextra->sharpCount;
+ }
+<SkipSharp>">" {
+ yyextra->code->codify(yytext);
+ if (--yyextra->sharpCount<=0)
+ BEGIN ( Bases );
+ }
<SkipSharp>"\"" {
- yyextra->code->codify(yytext);
- yyextra->lastStringContext=YY_START;
+ yyextra->code->codify(yytext);
+ yyextra->lastStringContext=YY_START;
BEGIN(SkipString);
}
<SkipSharp>"\'" {
- yyextra->code->codify(yytext);
- yyextra->lastStringContext=YY_START;
+ yyextra->code->codify(yytext);
+ yyextra->lastStringContext=YY_START;
BEGIN(SkipStringS);
}
<Bases>"(" {
@@ -925,111 +852,108 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
if (--yyextra->sharpCount<=0)
BEGIN ( Bases );
}
-
-
-<Bases>"," {
- yyextra->code->codify(yytext);
- }
-
+
+
+<Bases>"," {
+ yyextra->code->codify(yytext);
+ }
+
<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" {
- addType(yyscanner);
- generateFunctionLink(yyscanner,*yyextra->code,yytext);
- yyextra->bracketCount=0;
- yyextra->args.resize(0);
- yyextra->name+=yytext;
- BEGIN( FuncCall );
- }
+ addType(yyscanner);
+ generateFunctionLink(yyscanner,*yyextra->code,yytext);
+ yyextra->bracketCount=0;
+ yyextra->args.resize(0);
+ yyextra->name+=yytext;
+ BEGIN( FuncCall );
+ }
<Body>{SCOPEPREFIX}?"operator"/"(" {
- addType(yyscanner);
- generateFunctionLink(yyscanner,*yyextra->code,yytext);
- yyextra->bracketCount=0;
- yyextra->args.resize(0);
- yyextra->name+=yytext;
- BEGIN( FuncCall );
+ addType(yyscanner);
+ generateFunctionLink(yyscanner,*yyextra->code,yytext);
+ yyextra->bracketCount=0;
+ yyextra->args.resize(0);
+ yyextra->name+=yytext;
+ BEGIN( FuncCall );
}
<Body>{SCOPEPREFIX}?"operator"[^a-z_A-Z0-9\(\n]+/"(" {
- addType(yyscanner);
- generateFunctionLink(yyscanner,*yyextra->code,yytext);
- yyextra->bracketCount=0;
- yyextra->args.resize(0);
- yyextra->name+=yytext;
- BEGIN( FuncCall );
- }
-<Body,TemplDecl>("template"|"generic")/([^a-zA-Z0-9]) {
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- yyextra->insideTemplate=TRUE;
- yyextra->sharpCount=0;
- }
-<Body>"using"{BN}+"namespace"{BN}+ {
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- BEGIN(UsingName);
- }
-<UsingName>{ID}("::"{ID})* { addUsingDirective(yyscanner,yytext);
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ addType(yyscanner);
+ generateFunctionLink(yyscanner,*yyextra->code,yytext);
+ yyextra->bracketCount=0;
+ yyextra->args.resize(0);
+ yyextra->name+=yytext;
+ BEGIN( FuncCall );
+ }
+<Body,TemplDecl>("template"|"generic")/([^a-zA-Z0-9]) {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yyextra->insideTemplate=TRUE;
+ yyextra->sharpCount=0;
+ }
+<Body>"using"{BN}+"namespace"{BN}+ {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN(UsingName);
+ }
+<UsingName>{ID}("::"{ID})* { addUsingDirective(yyscanner,yytext);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
- yyextra->scopeStack.push(CLASSBLOCK);
- pushScope(yyscanner,yytext);
- BEGIN(Body);
+ yyextra->scopeStack.push(CLASSBLOCK);
+ pushScope(yyscanner,yytext);
+ BEGIN(Body);
}
-<UsingName>\n { codifyLines(yyscanner,yytext); BEGIN(Body); }
-<UsingName>. { codifyLines(yyscanner,yytext); BEGIN(Body); }
-<Body,FuncCall>"$"?"this"("->"|".") { yyextra->code->codify(yytext); // this-> for C++, this. for C#
- yyextra->prefixed_with_this_keyword = TRUE;
+<UsingName>\n { codifyLines(yyscanner,yytext); BEGIN(Body); }
+<UsingName>. { codifyLines(yyscanner,yytext); BEGIN(Body); }
+<Body,FuncCall>"$"?"this"("->"|".") { yyextra->code->codify(yytext); // this-> for C++, this. for C#
+ yyextra->isPrefixedWithThis = TRUE;
}
-<Body>{KEYWORD}/([^a-z_A-Z0-9]) {
+<Body>{KEYWORD}/([^a-z_A-Z0-9]) {
if (yyextra->lang==SrcLangExt_Java && qstrcmp("internal",yytext) ==0) REJECT;
if (skipLanguageSpecificKeyword(yyscanner,yytext)) REJECT;
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- if (QCString(yytext)=="typedef")
- {
- addType(yyscanner);
- yyextra->name+=yytext;
- }
- endFontClass(yyscanner);
- }
-<Body>{KEYWORD}/{B}* {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ if (QCString(yytext)=="typedef")
+ {
+ addType(yyscanner);
+ yyextra->name+=yytext;
+ }
+ endFontClass(yyscanner);
+ }
+<Body>{KEYWORD}/{B}* {
if (skipLanguageSpecificKeyword(yyscanner,yytext)) REJECT;
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
-<Body>{KEYWORD}/{BN}*"(" {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Body>{KEYWORD}/{BN}*"(" {
if (skipLanguageSpecificKeyword(yyscanner,yytext)) REJECT;
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- yyextra->name.resize(0);yyextra->type.resize(0);
- }
-<FuncCall>"in"/{BN}* {
- if (!yyextra->inForEachExpression) REJECT;
- startFontClass(yyscanner,"keywordflow");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- // insert the variable in the parent scope, see bug 546158
- yyextra->theVarContext.popScope();
- yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
- yyextra->theVarContext.pushScope();
- yyextra->name.resize(0);yyextra->type.resize(0);
- }
-<Body>{FLOWKW}/{BN}*"(" {
- startFontClass(yyscanner,"keywordflow");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- yyextra->name.resize(0);yyextra->type.resize(0);
- yyextra->inForEachExpression = (qstrcmp(yytext,"for each")==0 || qstrcmp(yytext, "foreach")==0);
- BEGIN(FuncCall);
- }
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yyextra->name.resize(0);yyextra->type.resize(0);
+ }
+<FuncCall>"in"/{BN}* {
+ if (!yyextra->inForEachExpression) REJECT;
+ startFontClass(yyscanner,"keywordflow");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ // insert the variable in the parent scope, see bug 546158
+ yyextra->theVarContext.popScope();
+ addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
+ yyextra->theVarContext.pushScope();
+ yyextra->name.resize(0);yyextra->type.resize(0);
+ }
+<Body>{FLOWKW}/{BN}*"(" {
+ startFontClass(yyscanner,"keywordflow");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yyextra->name.resize(0);yyextra->type.resize(0);
+ yyextra->inForEachExpression = (qstrcmp(yytext,"for each")==0 || qstrcmp(yytext, "foreach")==0);
+ BEGIN(FuncCall);
+ }
<Body>{FLOWCONDITION}/{BN}*"(" {
- if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction())
- {
- yyextra->currentMemberDef->incrementFlowKeyWordCount();
- }
+ incrementFlowKeyWordCount(yyscanner);
startFontClass(yyscanner,"keywordflow");
codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
@@ -1037,20 +961,17 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
yyextra->inForEachExpression = (strcmp(yytext,"for each")==0 || strcmp(yytext, "foreach")==0);
BEGIN(FuncCall);
}
-<Body>{FLOWKW}/([^a-z_A-Z0-9]) {
- startFontClass(yyscanner,"keywordflow");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- if (yyextra->inFunctionTryBlock && (qstrcmp(yytext,"catch")==0 || qstrcmp(yytext,"finally")==0))
- {
- yyextra->inFunctionTryBlock=FALSE;
- }
- }
-<Body>{FLOWCONDITION}/([^a-z_A-Z0-9]) {
- if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction())
+<Body>{FLOWKW}/([^a-z_A-Z0-9]) {
+ startFontClass(yyscanner,"keywordflow");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ if (yyextra->inFunctionTryBlock && (qstrcmp(yytext,"catch")==0 || qstrcmp(yytext,"finally")==0))
{
- yyextra->currentMemberDef->incrementFlowKeyWordCount();
+ yyextra->inFunctionTryBlock=FALSE;
}
+ }
+<Body>{FLOWCONDITION}/([^a-z_A-Z0-9]) {
+ incrementFlowKeyWordCount(yyscanner);
startFontClass(yyscanner,"keywordflow");
codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
@@ -1059,44 +980,44 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
yyextra->inFunctionTryBlock=FALSE;
}
}
-<Body>{FLOWKW}/{B}* {
- startFontClass(yyscanner,"keywordflow");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
+<Body>{FLOWKW}/{B}* {
+ startFontClass(yyscanner,"keywordflow");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
<Body>{FLOWCONDITION}/{B}* {
- if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction())
- {
- yyextra->currentMemberDef->incrementFlowKeyWordCount();
- }
+ incrementFlowKeyWordCount(yyscanner);
startFontClass(yyscanner,"keywordflow");
codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
}
<Body>"*"{B}*")" { // end of cast?
- yyextra->code->codify(yytext);
- yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
- yyextra->bracketCount--;
+ yyextra->code->codify(yytext);
+ yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
+ yyextra->bracketCount--;
yyextra->parmType = yyextra->name;
- BEGIN(FuncCall);
- }
-<Body>[\\|\)\+\-\/\%\~\!] {
- yyextra->code->codify(yytext);
- yyextra->name.resize(0);yyextra->type.resize(0);
- if (*yytext==')')
- {
- yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
- yyextra->bracketCount--;
- BEGIN(FuncCall);
- }
- }
+ BEGIN(FuncCall);
+ }
+<Body>"\\)"|"\\(" {
+ yyextra->code->codify(yytext);
+ }
+<Body>[\\|\)\+\-\/\%\~\!] {
+ yyextra->code->codify(yytext);
+ yyextra->name.resize(0);yyextra->type.resize(0);
+ if (*yytext==')')
+ {
+ yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
+ yyextra->bracketCount--;
+ BEGIN(FuncCall);
+ }
+ }
<Body,TemplDecl,ObjCMethod>{TYPEKW}/{B}* {
- startFontClass(yyscanner,"keywordtype");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- addType(yyscanner);
- yyextra->name+=yytext;
- }
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ addType(yyscanner);
+ yyextra->name+=yytext;
+ }
<Body,TemplDecl,ObjCMethod>{TYPEKWSL}/{B}* {
if (yyextra->lang!=SrcLangExt_Slice)
{
@@ -1104,390 +1025,395 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
else
{
- startFontClass(yyscanner,"keywordtype");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- addType(yyscanner);
- yyextra->name+=yytext;
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ addType(yyscanner);
+ yyextra->name+=yytext;
}
- }
+ }
<Body>"generic"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* {
- startFontClass(yyscanner,"keyword");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- yyextra->sharpCount=0;
- BEGIN(TemplDecl);
- }
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ yyextra->sharpCount=0;
+ BEGIN(TemplDecl);
+ }
<Body>"template"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { // template<...>
- startFontClass(yyscanner,"keyword");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- yyextra->sharpCount=0;
- BEGIN(TemplDecl);
- }
-<TemplDecl>"class"|"typename" {
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
-<TemplDecl>"<" {
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ yyextra->sharpCount=0;
+ BEGIN(TemplDecl);
+ }
+<TemplDecl>"class"|"typename" {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<TemplDecl>"<" {
yyextra->code->codify(yytext);
yyextra->sharpCount++;
- }
-<TemplDecl>">" {
+ }
+<TemplDecl>">" {
yyextra->code->codify(yytext);
yyextra->sharpCount--;
- if (yyextra->sharpCount<=0)
- {
- BEGIN(Body);
- }
- }
-<TemplCast>">" {
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- BEGIN( yyextra->lastTemplCastContext );
- }
-<TemplCast>{ID}("::"{ID})* {
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- }
-<TemplCast>("const"|"volatile"){B}* {
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
-<TemplCast>[*^]* {
- codifyLines(yyscanner,yytext);
- }
+ if (yyextra->sharpCount<=0)
+ {
+ BEGIN(Body);
+ }
+ }
+<TemplCast>">" {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastTemplCastContext );
+ }
+<TemplCast>{ID}("::"{ID})* {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ }
+<TemplCast>("const"|"volatile"){B}* {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<TemplCast>[*^]* {
+ codifyLines(yyscanner,yytext);
+ }
<Body,MemberCall2,FuncCall>{CASTKW}{B}*"<" { // static_cast<T>(
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
yyextra->lastTemplCastContext = YY_START;
- BEGIN(TemplCast);
- }
+ BEGIN(TemplCast);
+ }
<Body>"$this->"{SCOPENAME}/{BN}*[;,)\]] { // PHP member variable
- addType(yyscanner);
- generatePHPVariableLink(yyscanner,*yyextra->code,yytext);
- yyextra->name+=yytext+7;
+ addType(yyscanner);
+ generatePHPVariableLink(yyscanner,*yyextra->code,yytext);
+ yyextra->name+=yytext+7;
}
<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>\(]*">"("::"{ID})*/{B}* { // A<T> *pt;
- if (isCastKeyword(yytext) && YY_START==Body)
- {
- REJECT;
- }
- addType(yyscanner);
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- yyextra->name+=yytext;
- }
-<Body>{SCOPENAME}/{BN}*[:;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" , or int var : 5;
- addType(yyscanner);
- // changed this to generateFunctionLink, see bug 624514
- //generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,FALSE,TRUE);
- generateFunctionLink(yyscanner,*yyextra->code,yytext);
- yyextra->name+=yytext;
- }
-<Body>{SCOPENAME}/{B}* { // p->func()
- addType(yyscanner);
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- yyextra->name+=yytext;
- }
-<Body>"("{B}*("*"{B}*)+{SCOPENAME}*{B}*")"/{B}* { // (*p)->func() but not "if (p) ..."
- yyextra->code->codify(yytext);
- int s=0;while (s<(int)yyleng && !isId(yytext[s])) s++;
- int e=(int)yyleng-1;while (e>=0 && !isId(yytext[e])) e--;
- QCString varname = ((QCString)yytext).mid(s,e-s+1);
- addType(yyscanner);
- yyextra->name=varname;
- }
+ if (isCastKeyword(yytext) && YY_START==Body)
+ {
+ REJECT;
+ }
+ addType(yyscanner);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ yyextra->name+=yytext;
+ }
+<Body>{SCOPENAME}/{BN}*[:;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" , or int var : 5;
+ addType(yyscanner);
+ // changed this to generateFunctionLink, see bug 624514
+ //generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,FALSE,TRUE);
+ generateFunctionLink(yyscanner,*yyextra->code,yytext);
+ yyextra->name+=yytext;
+ }
+<Body>{SCOPENAME}/{B}* { // p->func()
+ addType(yyscanner);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ yyextra->name+=yytext;
+ }
+<Body>"("{B}*("*"{B}*)+{SCOPENAME}+{B}*")"/{B}* { // (*p)->func() but not "if (p) ..."
+ yyextra->code->codify(yytext);
+ uint s=0;while (s<(uint)yyleng && !isId(yytext[s])) s++;
+ uint e=(uint)yyleng-1;while (e>1 && !isId(yytext[e])) e--;
+ QCString varname = ((QCString)yytext).mid(s,e-s+1);
+ addType(yyscanner);
+ yyextra->name=varname;
+ }
<Body>{SCOPETNAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"/{BN}*"(" |
-<Body>{SCOPETNAME}/{BN}*"(" { // a() or c::a() or t<A,B>::a() or A\B\foo()
- if (isCastKeyword(yytext))
- {
- REJECT;
- }
- addType(yyscanner);
- generateFunctionLink(yyscanner,*yyextra->code,yytext);
- yyextra->bracketCount=0;
- yyextra->args.resize(0);
- yyextra->name+=yytext;
- BEGIN( FuncCall );
- }
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>{RAWBEGIN} {
+<Body>{SCOPETNAME}/{BN}*"(" { // a() or c::a() or t<A,B>::a() or A\B\foo()
+ if (isCastKeyword(yytext))
+ {
+ REJECT;
+ }
+ addType(yyscanner);
+ generateFunctionLink(yyscanner,*yyextra->code,yytext);
+ yyextra->bracketCount=0;
+ yyextra->args.resize(0);
+ yyextra->name+=yytext;
+ BEGIN( FuncCall );
+ }
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>{RAWBEGIN} {
QCString text=yytext;
- int i=text.find('R');
+ uint i=(uint)text.find('R');
yyextra->code->codify(text.left(i+1));
- startFontClass(yyscanner,"stringliteral");
- yyextra->code->codify(yytext+i+1);
- yyextra->lastStringContext=YY_START;
- yyextra->inForEachExpression = FALSE;
+ startFontClass(yyscanner,"stringliteral");
+ yyextra->code->codify(yytext+i+1);
+ yyextra->lastStringContext=YY_START;
+ yyextra->inForEachExpression = FALSE;
yyextra->delimiter = yytext+i+2;
yyextra->delimiter=yyextra->delimiter.left(yyextra->delimiter.length()-1);
- BEGIN( RawString );
- }
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\" {
- startFontClass(yyscanner,"stringliteral");
- yyextra->code->codify(yytext);
- yyextra->lastStringContext=YY_START;
- yyextra->inForEachExpression = FALSE;
- BEGIN( SkipString );
- }
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\' {
- startFontClass(yyscanner,"stringliteral");
- yyextra->code->codify(yytext);
- yyextra->lastStringContext=YY_START;
- yyextra->inForEachExpression = FALSE;
- BEGIN( SkipStringS );
- }
-<SkipString>[^\"\\\r\n]* {
- yyextra->code->codify(yytext);
- }
-<SkipStringS>[^\'\\\r\n]* {
- yyextra->code->codify(yytext);
- }
-<SkipString,SkipStringS>"//"|"/*" {
- yyextra->code->codify(yytext);
- }
-<SkipString>@?\" {
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- BEGIN( yyextra->lastStringContext );
- }
-<SkipStringS>\' {
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- BEGIN( yyextra->lastStringContext );
- }
-<SkipString,SkipStringS>\\. {
- yyextra->code->codify(yytext);
- }
-<RawString>{RAWEND} {
+ BEGIN( RawString );
+ }
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\" {
+ startFontClass(yyscanner,"stringliteral");
+ yyextra->code->codify(yytext);
+ yyextra->lastStringContext=YY_START;
+ yyextra->inForEachExpression = FALSE;
+ BEGIN( SkipString );
+ }
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>{NUMBER} { //Note similar code in commentcnv.l
+ if (yyextra->lang!=SrcLangExt_Cpp) REJECT;
+ yyextra->code->codify(yytext);
+ }
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\' {
+ startFontClass(yyscanner,"stringliteral");
+ yyextra->code->codify(yytext);
+ yyextra->lastStringContext=YY_START;
+ yyextra->inForEachExpression = FALSE;
+ BEGIN( SkipStringS );
+ }
+<SkipString>[^\"\\\r\n]* {
+ yyextra->code->codify(yytext);
+ }
+<SkipStringS>[^\'\\\r\n]* {
+ yyextra->code->codify(yytext);
+ }
+<SkipString,SkipStringS>"//"|"/*" {
+ yyextra->code->codify(yytext);
+ }
+<SkipString>@?\" {
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastStringContext );
+ }
+<SkipStringS>\' {
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastStringContext );
+ }
+<SkipString,SkipStringS>\\. {
+ yyextra->code->codify(yytext);
+ }
+<RawString>{RAWEND} {
yyextra->code->codify(yytext);
QCString delimiter = yytext+1;
delimiter=delimiter.left(delimiter.length()-1);
if (delimiter==yyextra->delimiter)
{
- BEGIN( yyextra->lastStringContext );
+ BEGIN( yyextra->lastStringContext );
}
}
<RawString>[^)\n]+ { yyextra->code->codify(yytext); }
<RawString>. { yyextra->code->codify(yytext); }
<RawString>\n { codifyLines(yyscanner,yytext); }
-<SkipVerbString>[^"\n]+ {
- yyextra->code->codify(yytext);
- }
-<SkipVerbString>\"\" { // escaped quote
- yyextra->code->codify(yytext);
- }
-<SkipVerbString>\" { // end of string
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- BEGIN( yyextra->lastVerbStringContext );
- }
-<SkipVerbString>. {
- yyextra->code->codify(yytext);
- }
-<SkipVerbString>\n {
- codifyLines(yyscanner,yytext);
- }
-<Body>":" {
- yyextra->code->codify(yytext);
- yyextra->name.resize(0);yyextra->type.resize(0);
- }
-<Body>"<" {
- if (yyextra->insideTemplate)
- {
- yyextra->sharpCount++;
- }
- yyextra->code->codify(yytext);
- }
-<Body>">" {
- if (yyextra->insideTemplate)
- {
- if (--yyextra->sharpCount<=0)
- {
- yyextra->insideTemplate=FALSE;
- }
- }
- yyextra->code->codify(yytext);
- }
-<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" {
- startFontClass(yyscanner,"charliteral");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- }
-<Body>"."|"->" {
- if (yytext[0]=='-') // -> could be overloaded
- {
- updateCallContextForSmartPointer(yyscanner);
- }
- yyextra->code->codify(yytext);
- yyextra->memCallContext = YY_START;
- BEGIN( MemberCall );
- }
-<MemberCall>{SCOPETNAME}/{BN}*"(" {
- if (yyextra->theCallContext.getScope())
- {
- if (!generateClassMemberLink(yyscanner,*yyextra->code,yyextra->theCallContext.getScope(),yytext))
- {
- yyextra->code->codify(yytext);
- addToSearchIndex(yyscanner,yytext);
- }
- yyextra->name.resize(0);
- }
- else
- {
- yyextra->code->codify(yytext);
- addToSearchIndex(yyscanner,yytext);
- yyextra->name.resize(0);
- }
- yyextra->type.resize(0);
- if (yyextra->memCallContext==Body)
- {
- BEGIN(FuncCall);
- }
- else
- {
- BEGIN(yyextra->memCallContext);
- }
- }
-<MemberCall>{SCOPENAME}/{B}* {
- if (yyextra->theCallContext.getScope())
- {
- DBG_CTX((stderr,"yyextra->theCallContext.getClass()=%p\n",yyextra->theCallContext.getScope()));
- if (!generateClassMemberLink(yyscanner,*yyextra->code,yyextra->theCallContext.getScope(),yytext))
- {
- yyextra->code->codify(yytext);
- addToSearchIndex(yyscanner,yytext);
- }
- yyextra->name.resize(0);
- }
- else
- {
- DBG_CTX((stderr,"no class context!\n"));
- yyextra->code->codify(yytext);
- addToSearchIndex(yyscanner,yytext);
- yyextra->name.resize(0);
- }
- yyextra->type.resize(0);
- BEGIN(yyextra->memCallContext);
- }
-<Body>[,=;\[] {
- if (yyextra->insideObjC && *yytext=='[')
- {
- //printf("Found start of ObjC call!\n");
- // start of a method call
- yyextra->contextDict.setAutoDelete(TRUE);
- yyextra->nameDict.setAutoDelete(TRUE);
- yyextra->objectDict.setAutoDelete(TRUE);
- yyextra->wordDict.setAutoDelete(TRUE);
- yyextra->commentDict.setAutoDelete(TRUE);
- yyextra->contextDict.clear();
- yyextra->nameDict.clear();
- yyextra->objectDict.clear();
- yyextra->wordDict.clear();
- yyextra->commentDict.clear();
- yyextra->currentCtxId = 0;
- yyextra->currentNameId = 0;
- yyextra->currentObjId = 0;
- yyextra->currentCtx = 0;
- yyextra->braceCount = 0;
- unput('[');
- BEGIN(ObjCCall);
- }
- else
- {
- yyextra->code->codify(yytext);
- yyextra->saveName = yyextra->name.copy();
- yyextra->saveType = yyextra->type.copy();
- if (*yytext!='[' && !yyextra->type.isEmpty())
- {
- //printf("yyextra->scopeStack.bottom()=%p\n",yyextra->scopeStack.bottom());
- //if (yyextra->scopeStack.top()!=CLASSBLOCK) // commented out for bug731363
- {
- //printf("AddVariable: '%s' '%s' context=%d\n",
- // yyextra->type.data(),yyextra->name.data(),yyextra->theVarContext.count());
- yyextra->theVarContext.addVariable(yyscanner,yyextra->type,yyextra->name);
- }
- yyextra->name.resize(0);
- }
- if (*yytext==';' || *yytext=='=')
- {
- yyextra->type.resize(0);
- yyextra->name.resize(0);
- }
- else if (*yytext=='[')
- {
- yyextra->theCallContext.pushScope(yyextra->name, yyextra->type);
- }
- yyextra->args.resize(0);
+<SkipVerbString>[^"\n]+ {
+ yyextra->code->codify(yytext);
+ }
+<SkipVerbString>\"\" { // escaped quote
+ yyextra->code->codify(yytext);
+ }
+<SkipVerbString>\" { // end of string
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastVerbStringContext );
+ }
+<SkipVerbString>. {
+ yyextra->code->codify(yytext);
+ }
+<SkipVerbString>\n {
+ codifyLines(yyscanner,yytext);
+ }
+<Body>":" {
+ yyextra->code->codify(yytext);
+ yyextra->name.resize(0);yyextra->type.resize(0);
+ }
+<Body>"<" {
+ if (yyextra->insideTemplate)
+ {
+ yyextra->sharpCount++;
+ }
+ yyextra->code->codify(yytext);
+ }
+<Body>">" {
+ if (yyextra->insideTemplate)
+ {
+ if (--yyextra->sharpCount<=0)
+ {
+ yyextra->insideTemplate=FALSE;
+ }
+ }
+ yyextra->code->codify(yytext);
+ }
+<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" {
+ startFontClass(yyscanner,"charliteral");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+<Body>"."|"->" {
+ if (yytext[0]=='-') // -> could be overloaded
+ {
+ updateCallContextForSmartPointer(yyscanner);
+ }
+ yyextra->code->codify(yytext);
+ yyextra->memCallContext = YY_START;
+ BEGIN( MemberCall );
+ }
+<MemberCall>{SCOPETNAME}/{BN}*"(" {
+ if (yyextra->theCallContext.getScope().globalDef())
+ {
+ if (!generateClassMemberLink(yyscanner,*yyextra->code,yyextra->theCallContext.getScope().globalDef(),yytext))
+ {
+ yyextra->code->codify(yytext);
+ addToSearchIndex(yyscanner,yytext);
+ }
+ yyextra->name.resize(0);
+ }
+ else
+ {
+ yyextra->code->codify(yytext);
+ addToSearchIndex(yyscanner,yytext);
+ yyextra->name.resize(0);
+ }
+ yyextra->type.resize(0);
+ if (yyextra->memCallContext==Body)
+ {
+ BEGIN(FuncCall);
+ }
+ else
+ {
+ BEGIN(yyextra->memCallContext);
+ }
+ }
+<MemberCall>{SCOPENAME}/{B}* {
+ if (yyextra->theCallContext.getScope().globalDef())
+ {
+ DBG_CTX((stderr,"yyextra->theCallContext.getClass()=%p\n",yyextra->theCallContext.getScope().globalDef()));
+ if (!generateClassMemberLink(yyscanner,*yyextra->code,yyextra->theCallContext.getScope().globalDef(),yytext))
+ {
+ yyextra->code->codify(yytext);
+ addToSearchIndex(yyscanner,yytext);
+ }
+ yyextra->name.resize(0);
+ }
+ else
+ {
+ DBG_CTX((stderr,"no class context!\n"));
+ yyextra->code->codify(yytext);
+ addToSearchIndex(yyscanner,yytext);
+ yyextra->name.resize(0);
+ }
+ yyextra->type.resize(0);
+ BEGIN(yyextra->memCallContext);
+ }
+<Body>[,=;\[] {
+ if (yyextra->insideObjC && *yytext=='[')
+ {
+ //printf("Found start of ObjC call!\n");
+ // start of a method call
+ yyextra->contextMap.clear();
+ yyextra->nameMap.clear();
+ yyextra->objectMap.clear();
+ yyextra->wordMap.clear();
+ yyextra->commentMap.clear();
+ yyextra->currentCtxId = 0;
+ yyextra->currentNameId = 0;
+ yyextra->currentObjId = 0;
+ yyextra->currentCtx = 0;
+ yyextra->braceCount = 0;
+ unput('[');
+ BEGIN(ObjCCall);
+ }
+ else
+ {
+ yyextra->code->codify(yytext);
+ yyextra->saveName = yyextra->name.copy();
+ yyextra->saveType = yyextra->type.copy();
+ if (*yytext!='[' && !yyextra->type.isEmpty())
+ {
+ //printf("yyextra->scopeStack.bottom()=%p\n",yyextra->scopeStack.bottom());
+ //if (yyextra->scopeStack.top()!=CLASSBLOCK) // commented out for bug731363
+ {
+ //printf("AddVariable: '%s' '%s' context=%d\n",
+ // yyextra->type.data(),yyextra->name.data(),yyextra->theVarContext.count());
+ addVariable(yyscanner,yyextra->type,yyextra->name);
+ }
+ yyextra->name.resize(0);
+ }
+ if (*yytext==';' || *yytext=='=')
+ {
+ yyextra->type.resize(0);
+ yyextra->name.resize(0);
+ }
+ else if (*yytext=='[')
+ {
+ yyextra->theCallContext.pushScope(yyextra->name, yyextra->type);
+ }
+ yyextra->args.resize(0);
yyextra->parmType.resize(0);
yyextra->parmName.resize(0);
- }
- }
+ }
+ }
/*
-<ObjCMemberCall>{ID} {
- if (qstrcmp(yytext,"self")==0 || qstrcmp(yytext,"super")==0)
- {
- // TODO: get proper base class for "super"
- yyextra->theCallContext.setClass(getClass(yyextra->curClassName));
- startFontClass(yyscanner,"keyword");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- }
- else
- {
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- }
- yyextra->name.resize(0);
- BEGIN(ObjCMemberCall2);
- }
-<ObjCMemberCall>"[" {
- yyextra->code->codify(yytext);
- yyextra->theCallContext.pushScope(yyscanner,yyextra->name, yyextra->type);
- }
-<ObjCMemberCall2>{ID}":"? {
- yyextra->name+=yytext;
- if (yyextra->theCallContext.getClass())
- {
- //printf("Calling method %s\n",yyextra->name.data());
- if (!generateClassMemberLink(yyscanner,*yyextra->code,yyextra->theCallContext.getClass(),yyextra->name))
- {
- yyextra->code->codify(yytext);
- addToSearchIndex(yyscanner,yyextra->name);
- }
- }
- else
- {
- yyextra->code->codify(yytext);
- addToSearchIndex(yyscanner,yyextra->name);
- }
- yyextra->name.resize(0);
- BEGIN(ObjCMemberCall3);
- }
-<ObjCMemberCall2,ObjCMemberCall3>"]" {
- yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
- yyextra->code->codify(yytext);
- BEGIN(Body);
- }
+<ObjCMemberCall>{ID} {
+ if (qstrcmp(yytext,"self")==0 || qstrcmp(yytext,"super")==0)
+ {
+ // TODO: get proper base class for "super"
+ yyextra->theCallContext.setClass(getClass(yyextra->curClassName));
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+ else
+ {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ }
+ yyextra->name.resize(0);
+ BEGIN(ObjCMemberCall2);
+ }
+<ObjCMemberCall>"[" {
+ yyextra->code->codify(yytext);
+ yyextra->theCallContext.pushScope(yyscanner,yyextra->name, yyextra->type);
+ }
+<ObjCMemberCall2>{ID}":"? {
+ yyextra->name+=yytext;
+ if (yyextra->theCallContext.getClass())
+ {
+ //printf("Calling method %s\n",yyextra->name.data());
+ if (!generateClassMemberLink(yyscanner,*yyextra->code,yyextra->theCallContext.getClass(),yyextra->name))
+ {
+ yyextra->code->codify(yytext);
+ addToSearchIndex(yyscanner,yyextra->name);
+ }
+ }
+ else
+ {
+ yyextra->code->codify(yytext);
+ addToSearchIndex(yyscanner,yyextra->name);
+ }
+ yyextra->name.resize(0);
+ BEGIN(ObjCMemberCall3);
+ }
+<ObjCMemberCall2,ObjCMemberCall3>"]" {
+ yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
+ yyextra->code->codify(yytext);
+ BEGIN(Body);
+ }
*/
<ObjCCall,ObjCMName>"["|"{" {
saveObjCContext(yyscanner);
- yyextra->currentCtx->format+=*yytext;
- BEGIN(ObjCCall);
- //printf("open\n");
+ yyextra->currentCtx->format+=*yytext;
+ BEGIN(ObjCCall);
+ //printf("open\n");
}
<ObjCCall,ObjCMName>"]"|"}" {
- yyextra->currentCtx->format+=*yytext;
+ yyextra->currentCtx->format+=*yytext;
restoreObjCContext(yyscanner);
- BEGIN(ObjCMName);
- if (yyextra->currentCtx==0)
- {
- // end of call
- writeObjCMethodCall(yyscanner,yyextra->contextDict.find(0));
- BEGIN(Body);
- }
- //printf("close\n");
+ BEGIN(ObjCMName);
+ if (yyextra->currentCtx==0)
+ {
+ // end of call
+ ObjCCallCtx *ctx = 0;
+ auto it = yyextra->contextMap.find(0);
+ if (it!=yyextra->contextMap.end())
+ {
+ ctx = it->second.get();
+ }
+ writeObjCMethodCall(yyscanner,ctx);
+ BEGIN(Body);
+ }
+ //printf("close\n");
}
<ObjCCall,ObjCMName>"//".* {
yyextra->currentCtx->format+=escapeComment(yyscanner,yytext);
@@ -1497,92 +1423,92 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
yyextra->currentCtx->comment=yytext;
BEGIN(ObjCCallComment);
}
-<ObjCCallComment>"*/" {
+<ObjCCallComment>"*/" {
yyextra->currentCtx->comment+=yytext;
yyextra->currentCtx->format+=escapeComment(yyscanner,yyextra->currentCtx->comment);
- BEGIN(yyextra->lastObjCCallContext);
- }
+ BEGIN(yyextra->lastObjCCallContext);
+ }
<ObjCCallComment>[^*\n]+ { yyextra->currentCtx->comment+=yytext; }
<ObjCCallComment>"//"|"/*" { yyextra->currentCtx->comment+=yytext; }
<ObjCCallComment>\n { yyextra->currentCtx->comment+=*yytext; }
<ObjCCallComment>. { yyextra->currentCtx->comment+=*yytext; }
-<ObjCCall>{ID} {
+<ObjCCall>{ID} {
yyextra->currentCtx->format+=escapeObject(yyscanner,yytext);
- if (yyextra->braceCount==0)
- {
- yyextra->currentCtx->objectTypeOrName=yytext;
+ if (yyextra->braceCount==0)
+ {
+ yyextra->currentCtx->objectTypeOrName=yytext;
//printf("new type=%s\n",yyextra->currentCtx->objectTypeOrName.data());
- BEGIN(ObjCMName);
- }
- }
-<ObjCMName>{ID}/{BN}*"]" {
- if (yyextra->braceCount==0 &&
- yyextra->currentCtx->methodName.isEmpty())
+ BEGIN(ObjCMName);
+ }
+ }
+<ObjCMName>{ID}/{BN}*"]" {
+ if (yyextra->braceCount==0 &&
+ yyextra->currentCtx->methodName.isEmpty())
{
- yyextra->currentCtx->methodName=yytext;
+ yyextra->currentCtx->methodName=yytext;
yyextra->currentCtx->format+=escapeName(yyscanner,yytext);
- }
- else
- {
+ }
+ else
+ {
yyextra->currentCtx->format+=escapeWord(yyscanner,yytext);
- }
+ }
}
-<ObjCMName>{ID}/{BN}*":" {
+<ObjCMName>{ID}/{BN}*":" {
if (yyextra->braceCount==0)
{
- yyextra->currentCtx->methodName+=yytext;
+ yyextra->currentCtx->methodName+=yytext;
yyextra->currentCtx->methodName+=":";
- }
+ }
yyextra->currentCtx->format+=escapeName(yyscanner,yytext);
}
<ObjCSkipStr>[^\n\"$\\]* { yyextra->currentCtx->format+=yytext; }
-<ObjCSkipStr>\\. { yyextra->currentCtx->format+=yytext; }
-<ObjCSkipStr>"\"" { yyextra->currentCtx->format+=yytext;
- BEGIN(yyextra->lastStringContext);
+<ObjCSkipStr>\\. { yyextra->currentCtx->format+=yytext; }
+<ObjCSkipStr>"\"" { yyextra->currentCtx->format+=yytext;
+ BEGIN(yyextra->lastStringContext);
}
<ObjCCall,ObjCMName>{CHARLIT} { yyextra->currentCtx->format+=yytext; }
-<ObjCCall,ObjCMName>"@"?"\"" { yyextra->currentCtx->format+=yytext;
+<ObjCCall,ObjCMName>"@"?"\"" { yyextra->currentCtx->format+=yytext;
yyextra->lastStringContext=YY_START;
- BEGIN(ObjCSkipStr);
+ BEGIN(ObjCSkipStr);
}
<ObjCCall,ObjCMName,ObjCSkipStr>"$" { yyextra->currentCtx->format+="$$"; }
<ObjCCall,ObjCMName>"(" { yyextra->currentCtx->format+=*yytext; yyextra->braceCount++; }
<ObjCCall,ObjCMName>")" { yyextra->currentCtx->format+=*yytext; yyextra->braceCount--; }
-<ObjCSkipStr>"@"/"\"" { // needed to prevent matching the global rule (for C#)
+<ObjCSkipStr>"@"/"\"" { // needed to prevent matching the global rule (for C#)
yyextra->currentCtx->format+=yytext;
}
<ObjCCall,ObjCMName,ObjCSkipStr>{ID} { yyextra->currentCtx->format+=escapeWord(yyscanner,yytext); }
<ObjCCall,ObjCMName,ObjCSkipStr>. { yyextra->currentCtx->format+=*yytext; }
<ObjCCall,ObjCMName,ObjCSkipStr>\n { yyextra->currentCtx->format+=*yytext; }
-<Body>"]" {
- yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
- yyextra->code->codify(yytext);
- // TODO: nested arrays like: a[b[0]->func()]->func()
- yyextra->name = yyextra->saveName.copy();
- yyextra->type = yyextra->saveType.copy();
- }
-<Body>[0-9]+ {
- yyextra->code->codify(yytext);
- }
-<Body>[0-9]+[xX][0-9A-Fa-f]+ {
- yyextra->code->codify(yytext);
- }
+<Body>"]" {
+ yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
+ yyextra->code->codify(yytext);
+ // TODO: nested arrays like: a[b[0]->func()]->func()
+ yyextra->name = yyextra->saveName.copy();
+ yyextra->type = yyextra->saveType.copy();
+ }
+<Body>[0-9]+ {
+ yyextra->code->codify(yytext);
+ }
+<Body>[0-9]+[xX][0-9A-Fa-f]+ {
+ yyextra->code->codify(yytext);
+ }
<MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) {
- //addParmType(yyscanner);
- //yyextra->parmName=yytext;
+ //addParmType(yyscanner);
+ //yyextra->parmName=yytext;
if (skipLanguageSpecificKeyword(yyscanner,yytext)) REJECT;
- startFontClass(yyscanner,"keyword");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- }
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKW}/([^a-z_A-Z0-9]) {
- addParmType(yyscanner);
- yyextra->parmName=yytext;
- startFontClass(yyscanner,"keywordtype");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- }
+ addParmType(yyscanner);
+ yyextra->parmName=yytext;
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKWSL}/([^a-z_A-Z0-9]) {
if (yyextra->lang!=SrcLangExt_Slice)
{
@@ -1590,25 +1516,22 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
else
{
- addParmType(yyscanner);
- yyextra->parmName=yytext;
- startFontClass(yyscanner,"keywordtype");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
+ addParmType(yyscanner);
+ yyextra->parmName=yytext;
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
}
- }
+ }
<MemberCall2,FuncCall>{FLOWKW}/([^a-z_A-Z0-9]) {
- addParmType(yyscanner);
- yyextra->parmName=yytext;
- startFontClass(yyscanner,"keywordflow");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- }
+ addParmType(yyscanner);
+ yyextra->parmName=yytext;
+ startFontClass(yyscanner,"keywordflow");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
<MemberCall2,FuncCall>{FLOWCONDITION}/([^a-z_A-Z0-9]) {
- if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction())
- {
- yyextra->currentMemberDef->incrementFlowKeyWordCount();
- }
+ incrementFlowKeyWordCount(yyscanner);
addParmType(yyscanner);
yyextra->parmName=yytext;
startFontClass(yyscanner,"keywordflow");
@@ -1616,25 +1539,25 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
endFontClass(yyscanner);
}
<MemberCall2,FuncCall>{ID}(({B}*"<"[^\n\[\](){}<>]*">")?({B}*"::"{B}*{ID})?)* {
- if (isCastKeyword(yytext))
- {
- REJECT;
- }
- addParmType(yyscanner);
- yyextra->parmName=yytext;
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,!yyextra->insideBody);
- }
-<FuncCall>";" { // probably a cast, not a function call
- yyextra->code->codify(yytext);
- yyextra->inForEachExpression = FALSE;
- BEGIN( Body );
- }
-<MemberCall2,FuncCall>, {
- yyextra->code->codify(yytext);
- yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
- yyextra->parmType.resize(0);yyextra->parmName.resize(0);
- }
-<MemberCall2,FuncCall>"{" {
+ if (isCastKeyword(yytext))
+ {
+ REJECT;
+ }
+ addParmType(yyscanner);
+ yyextra->parmName=yytext;
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,!yyextra->insideBody);
+ }
+<FuncCall>";" { // probably a cast, not a function call
+ yyextra->code->codify(yytext);
+ yyextra->inForEachExpression = FALSE;
+ BEGIN( Body );
+ }
+<MemberCall2,FuncCall>, {
+ yyextra->code->codify(yytext);
+ addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
+ yyextra->parmType.resize(0);yyextra->parmName.resize(0);
+ }
+<MemberCall2,FuncCall>"{" {
if (yyextra->bracketCount>0)
{
yyextra->code->codify(yytext);
@@ -1663,28 +1586,28 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<InlineInit>. {
yyextra->code->codify(yytext);
}
-<MemberCall2,FuncCall>"(" {
- yyextra->parmType.resize(0);yyextra->parmName.resize(0);
- yyextra->code->codify(yytext);
- yyextra->bracketCount++;
- yyextra->theCallContext.pushScope(yyextra->name, yyextra->type);
- if (YY_START==FuncCall && !yyextra->insideBody)
- {
- yyextra->theVarContext.pushScope();
- }
- }
+<MemberCall2,FuncCall>"(" {
+ yyextra->parmType.resize(0);yyextra->parmName.resize(0);
+ yyextra->code->codify(yytext);
+ yyextra->bracketCount++;
+ yyextra->theCallContext.pushScope(yyextra->name, yyextra->type);
+ if (YY_START==FuncCall && !yyextra->insideBody)
+ {
+ yyextra->theVarContext.pushScope();
+ }
+ }
<MemberCall2,FuncCall>{OPERATOR} { // operator
- if (qstrcmp(yytext,"*") &&
- qstrcmp(yytext,"&") &&
- qstrcmp(yytext,"^") &&
- qstrcmp(yytext,"%")) // typically a pointer or reference
- {
- // not a * or &, or C++/CLI's ^ or %
- yyextra->parmType.resize(0);yyextra->parmName.resize(0);
- }
- yyextra->code->codify(yytext);
- }
-<MemberCall,MemberCall2,FuncCall>("*"{B}*)?")" {
+ if (qstrcmp(yytext,"*") &&
+ qstrcmp(yytext,"&") &&
+ qstrcmp(yytext,"^") &&
+ qstrcmp(yytext,"%")) // typically a pointer or reference
+ {
+ // not a * or &, or C++/CLI's ^ or %
+ yyextra->parmType.resize(0);yyextra->parmName.resize(0);
+ }
+ yyextra->code->codify(yytext);
+ }
+<MemberCall,MemberCall2,FuncCall>("*"{B}*)?")" {
if (yytext[0]==')') // no a pointer cast
{
//printf("addVariable(%s,%s)\n",yyextra->parmType.data(),yyextra->parmName.data());
@@ -1693,553 +1616,564 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
yyextra->parmType=yyextra->parmName;
yyextra->parmName.resize(0);
}
- yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
+ addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
}
else
{
yyextra->parmType = yyextra->parmName;
yyextra->parmName.resize(0);
- yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
- }
- yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
- yyextra->inForEachExpression = FALSE;
- //yyextra->theCallContext.setClass(0); // commented out, otherwise a()->b() does not work for b().
- yyextra->code->codify(yytext);
- if (--yyextra->bracketCount<=0)
- {
- if (yyextra->name.isEmpty())
- {
- BEGIN( Body );
- }
- else
- {
- BEGIN( CallEnd );
- }
- }
- }
-<CallEnd>[ \t\n]* { codifyLines(yyscanner,yytext); }
+ addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
+ }
+ yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
+ yyextra->inForEachExpression = FALSE;
+ //yyextra->theCallContext.setClass(0); // commented out, otherwise a()->b() does not work for b().
+ yyextra->code->codify(yytext);
+ if (--yyextra->bracketCount<=0)
+ {
+ if (yyextra->name.isEmpty())
+ {
+ BEGIN( Body );
+ }
+ else
+ {
+ BEGIN( CallEnd );
+ }
+ }
+ }
+<CallEnd>[ \t\n]* { codifyLines(yyscanner,yytext); }
/*
-<MemberCall2,FuncCall>")"[ \t\n]*[;:] {
+<MemberCall2,FuncCall>")"[ \t\n]*[;:] {
*/
-<CallEnd>[;:] {
- codifyLines(yyscanner,yytext);
- yyextra->bracketCount=0;
- if (*yytext==';') yyextra->searchingForBody=FALSE;
- if (!yyextra->type.isEmpty())
- {
- DBG_CTX((stderr,"add variable yyextra->type=%s yyextra->name=%s)\n",yyextra->type.data(),yyextra->name.data()));
- yyextra->theVarContext.addVariable(yyscanner,yyextra->type,yyextra->name);
- }
- yyextra->parmType.resize(0);yyextra->parmName.resize(0);
- yyextra->theCallContext.setScope(0);
- if (*yytext==';' || yyextra->insideBody)
- {
- if (!yyextra->insideBody)
- {
+<CallEnd>[;:] {
+ codifyLines(yyscanner,yytext);
+ yyextra->bracketCount=0;
+ if (*yytext==';') yyextra->searchingForBody=FALSE;
+ if (!yyextra->type.isEmpty())
+ {
+ DBG_CTX((stderr,"add variable yyextra->type=%s yyextra->name=%s)\n",yyextra->type.data(),yyextra->name.data()));
+ addVariable(yyscanner,yyextra->type,yyextra->name);
+ }
+ yyextra->parmType.resize(0);yyextra->parmName.resize(0);
+ yyextra->theCallContext.setScope(ScopedTypeVariant());
+ if (*yytext==';' || yyextra->insideBody)
+ {
+ if (!yyextra->insideBody)
+ {
yyextra->theVarContext.popScope();
- }
- yyextra->name.resize(0);yyextra->type.resize(0);
- BEGIN( Body );
- }
- else
- {
- yyextra->bracketCount=0;
- BEGIN( SkipInits );
- }
- }
+ }
+ yyextra->name.resize(0);yyextra->type.resize(0);
+ BEGIN( Body );
+ }
+ else
+ {
+ yyextra->bracketCount=0;
+ BEGIN( SkipInits );
+ }
+ }
<CallEnd>("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"sealed"|"override"))*/{BN}*(";"|"="|"throw"{BN}*"(") {
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
<CallEnd,OldStyleArgs>("const"|"volatile"|"sealed"|"override")*({BN}+("const"|"volatile"|"sealed"|"override"))*{BN}*"{" {
if (yyextra->insideBody)
- {
- yyextra->theVarContext.pushScope();
- }
- yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
- //yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
- yyextra->parmType.resize(0);yyextra->parmName.resize(0);
- int index = yyextra->name.findRev("::");
- DBG_CTX((stderr,"yyextra->name=%s\n",yyextra->name.data()));
- if (index!=-1)
- {
- QCString scope = yyextra->name.left(index);
- if (!yyextra->classScope.isEmpty()) scope.prepend(yyextra->classScope+"::");
- const ClassDef *cd=getResolvedClass(Doxygen::globalScope,yyextra->sourceFileDef,scope);
- if (cd)
- {
- setClassScope(yyscanner,cd->name());
- yyextra->scopeStack.push(SCOPEBLOCK);
+ {
+ yyextra->theVarContext.pushScope();
+ }
+ addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
+ //yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
+ yyextra->parmType.resize(0);yyextra->parmName.resize(0);
+ int index = yyextra->name.findRev("::");
+ DBG_CTX((stderr,"yyextra->name=%s\n",yyextra->name.data()));
+ if (index!=-1)
+ {
+ QCString scope = yyextra->name.left((uint)index);
+ if (!yyextra->classScope.isEmpty()) scope.prepend(yyextra->classScope+"::");
+ const ClassDef *cd=yyextra->symbolResolver.resolveClass(Doxygen::globalScope,scope);
+ if (cd)
+ {
+ setClassScope(yyscanner,cd->name());
+ yyextra->scopeStack.push(SCOPEBLOCK);
DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
- }
- else
- {
- //setClassScope(yyscanner,yyextra->realScope);
- yyextra->scopeStack.push(INNERBLOCK);
+ }
+ else
+ {
+ //setClassScope(yyscanner,yyextra->realScope);
+ yyextra->scopeStack.push(INNERBLOCK);
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
- }
- }
- else
- {
+ }
+ }
+ else
+ {
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
- yyextra->scopeStack.push(INNERBLOCK);
- }
- yytext[yyleng-1]='\0';
- QCString cv(yytext);
- if (!cv.stripWhiteSpace().isEmpty())
- {
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
- else // just whitespace
- {
- codifyLines(yyscanner,yytext);
- }
- yyextra->code->codify("{");
- if (yyextra->searchingForBody)
- {
- yyextra->searchingForBody=FALSE;
- yyextra->insideBody=TRUE;
- }
- if (yyextra->insideBody) yyextra->bodyCurlyCount++;
- yyextra->type.resize(0); yyextra->name.resize(0);
- BEGIN( Body );
- }
-<CallEnd>"try" { // function-try-block
- startFontClass(yyscanner,"keyword");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- yyextra->inFunctionTryBlock=TRUE;
- }
-<CallEnd>{ID} {
- if (yyextra->insideBody || !yyextra->parmType.isEmpty())
- {
- REJECT;
- }
- // could be K&R style definition
- addParmType(yyscanner);
- yyextra->parmName=yytext;
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,!yyextra->insideBody);
- BEGIN(OldStyleArgs);
- }
-<OldStyleArgs>{ID} {
- addParmType(yyscanner);
- yyextra->parmName=yytext;
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,!yyextra->insideBody);
- }
-<OldStyleArgs>[,;] {
- yyextra->code->codify(yytext);
- yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
- if (*yytext==';') yyextra->parmType.resize(0);
- yyextra->parmName.resize(0);
- }
-<CallEnd,OldStyleArgs>"#" {
- startFontClass(yyscanner,"preprocessor");
- yyextra->lastSkipCppContext = Body;
- yyextra->code->codify(yytext);
- BEGIN( SkipCPP );
- }
-<CallEnd>. {
- unput(*yytext);
- if (!yyextra->insideBody)
- {
- yyextra->theVarContext.popScope();
- }
- yyextra->name.resize(0);yyextra->args.resize(0);
- yyextra->parmType.resize(0);yyextra->parmName.resize(0);
- BEGIN( Body );
- }
-<SkipInits>";" {
- yyextra->code->codify(yytext);
- yyextra->type.resize(0); yyextra->name.resize(0);
- BEGIN( Body );
- }
-<SkipInits>"{" {
- yyextra->code->codify(yytext);
- if (yyextra->searchingForBody)
- {
- yyextra->searchingForBody=FALSE;
- yyextra->insideBody=TRUE;
- }
- if (yyextra->insideBody) yyextra->bodyCurlyCount++;
- if (yyextra->name.find("::")!=-1)
- {
+ yyextra->scopeStack.push(INNERBLOCK);
+ }
+ yytext[yyleng-1]='\0';
+ QCString cv(yytext);
+ if (!cv.stripWhiteSpace().isEmpty())
+ {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ else // just whitespace
+ {
+ codifyLines(yyscanner,yytext);
+ }
+ yyextra->code->codify("{");
+ if (yyextra->searchingForBody)
+ {
+ yyextra->searchingForBody=FALSE;
+ yyextra->insideBody=TRUE;
+ }
+ if (yyextra->insideBody) yyextra->bodyCurlyCount++;
+ yyextra->type.resize(0); yyextra->name.resize(0);
+ BEGIN( Body );
+ }
+<CallEnd>"try" { // function-try-block
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ yyextra->inFunctionTryBlock=TRUE;
+ }
+<CallEnd>{ID} {
+ if (yyextra->insideBody || !yyextra->parmType.isEmpty())
+ {
+ REJECT;
+ }
+ // could be K&R style definition
+ addParmType(yyscanner);
+ yyextra->parmName=yytext;
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,!yyextra->insideBody);
+ BEGIN(OldStyleArgs);
+ }
+<OldStyleArgs>{ID} {
+ addParmType(yyscanner);
+ yyextra->parmName=yytext;
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,!yyextra->insideBody);
+ }
+<OldStyleArgs>[,;] {
+ yyextra->code->codify(yytext);
+ addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
+ if (*yytext==';') yyextra->parmType.resize(0);
+ yyextra->parmName.resize(0);
+ }
+<CallEnd,OldStyleArgs>"#" {
+ startFontClass(yyscanner,"preprocessor");
+ yyextra->lastSkipCppContext = Body;
+ yyextra->code->codify(yytext);
+ BEGIN( SkipCPP );
+ }
+<CallEnd>. {
+ unput(*yytext);
+ if (!yyextra->insideBody)
+ {
+ yyextra->theVarContext.popScope();
+ }
+ yyextra->name.resize(0);yyextra->args.resize(0);
+ yyextra->parmType.resize(0);yyextra->parmName.resize(0);
+ BEGIN( Body );
+ }
+<SkipInits>";" {
+ yyextra->code->codify(yytext);
+ yyextra->type.resize(0); yyextra->name.resize(0);
+ BEGIN( Body );
+ }
+<SkipInits>"{" {
+ yyextra->code->codify(yytext);
+ if (yyextra->searchingForBody)
+ {
+ yyextra->searchingForBody=FALSE;
+ yyextra->insideBody=TRUE;
+ }
+ if (yyextra->insideBody) yyextra->bodyCurlyCount++;
+ if (yyextra->name.find("::")!=-1)
+ {
DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
- yyextra->scopeStack.push(SCOPEBLOCK);
- setClassScope(yyscanner,yyextra->realScope);
- }
- else
- {
+ yyextra->scopeStack.push(SCOPEBLOCK);
+ setClassScope(yyscanner,yyextra->realScope);
+ }
+ else
+ {
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
- yyextra->scopeStack.push(INNERBLOCK);
- }
- yyextra->type.resize(0); yyextra->name.resize(0);
- BEGIN( Body );
- }
-<SkipInits>{ID} {
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- }
-<FuncCall>{ID}/"(" {
- generateFunctionLink(yyscanner,*yyextra->code,yytext);
- }
-<FuncCall>{ID}/("."|"->") {
- yyextra->name=yytext;
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- BEGIN( MemberCall2 );
- }
-<FuncCall,MemberCall2>("("{B}*("*"{B}*)+{ID}*{B}*")"{B}*)/("."|"->") {
- yyextra->code->codify(yytext);
- int s=0;while (!isId(yytext[s])) s++;
- int e=(int)yyleng-1;while (!isId(yytext[e])) e--;
- yyextra->name=((QCString)yytext).mid(s,e-s+1);
- BEGIN( MemberCall2 );
- }
-<MemberCall2>{ID}/([ \t\n]*"(") {
- if (!yyextra->args.isEmpty())
- generateMemberLink(yyscanner,*yyextra->code,yyextra->args,yytext);
- else
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- yyextra->args.resize(0);
- BEGIN( FuncCall );
- }
+ yyextra->scopeStack.push(INNERBLOCK);
+ }
+ yyextra->type.resize(0); yyextra->name.resize(0);
+ BEGIN( Body );
+ }
+<SkipInits>{ID}{B}*"{" {
+ QCString text = yytext;
+ int bracketPos = text.find('{');
+ int spacePos = text.find(' ');
+ int len = spacePos==-1 ? bracketPos : spacePos;
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,text.left(len));
+ yyextra->code->codify(yytext+len);
+ }
+<SkipInits>{ID} {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ }
+<FuncCall>{ID}/"(" {
+ generateFunctionLink(yyscanner,*yyextra->code,yytext);
+ }
+<FuncCall>{ID}/("."|"->") {
+ yyextra->name=yytext;
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ BEGIN( MemberCall2 );
+ }
+<FuncCall,MemberCall2>("("{B}*("*"{B}*)+{ID}+{B}*")"{B}*)/("."|"->") {
+ yyextra->code->codify(yytext);
+ uint s=0;while (!isId(yytext[s])) s++;
+ uint e=(uint)yyleng-1;while (e>1 && !isId(yytext[e])) e--;
+ yyextra->name=((QCString)yytext).mid(s,e-s+1);
+ BEGIN( MemberCall2 );
+ }
+<MemberCall2>{ID}/([ \t\n]*"(") {
+ if (!yyextra->args.isEmpty())
+ generateMemberLink(yyscanner,*yyextra->code,yyextra->args,yytext);
+ else
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ yyextra->args.resize(0);
+ BEGIN( FuncCall );
+ }
<MemberCall2>{ID}/([ \t\n]*("."|"->")) {
- //yyextra->code->codify(yytext);
- yyextra->name=yytext;
- generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
- BEGIN( MemberCall2 );
- }
-<MemberCall2>"->"|"." {
- if (yytext[0]=='-') // -> could be overloaded
- {
- updateCallContextForSmartPointer(yyscanner);
- }
- yyextra->code->codify(yytext);
- yyextra->memCallContext = YY_START;
- BEGIN( MemberCall );
- }
-<SkipComment>"/*"("!"?)"*/" {
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- BEGIN( yyextra->lastCContext ) ;
- }
-<SkipComment>"//"|"/*" {
- yyextra->code->codify(yytext);
- }
-<SkipComment>[^*/\n]+ {
- yyextra->code->codify(yytext);
- }
-<SkipComment>[ \t]*"*/" {
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- if (yyextra->lastCContext==SkipCPP)
+ //yyextra->code->codify(yytext);
+ yyextra->name=yytext;
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ BEGIN( MemberCall2 );
+ }
+<MemberCall2>"->"|"." {
+ if (yytext[0]=='-') // -> could be overloaded
+ {
+ updateCallContextForSmartPointer(yyscanner);
+ }
+ yyextra->code->codify(yytext);
+ yyextra->memCallContext = YY_START;
+ BEGIN( MemberCall );
+ }
+<SkipComment>"/*"("!"?)"*/" {
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastCContext ) ;
+ }
+<SkipComment>"//"|"/*" {
+ yyextra->code->codify(yytext);
+ }
+<SkipComment>[^*/\n]+ {
+ yyextra->code->codify(yytext);
+ }
+<SkipComment>[ \t]*"*/" {
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ if (yyextra->lastCContext==SkipCPP)
{
startFontClass(yyscanner,"preprocessor");
}
- BEGIN( yyextra->lastCContext ) ;
- }
-<SkipCxxComment>[^\r\n]*"\\"[\r]?\n { // line continuation
- codifyLines(yyscanner,yytext);
- }
-<SkipCxxComment>[^\r\n]+ {
- yyextra->code->codify(yytext);
- }
-<SkipCxxComment>\r
-<SkipCxxComment>\n {
- unput('\n');
- endFontClass(yyscanner);
- BEGIN( yyextra->lastCContext ) ;
- }
-<SkipCxxComment>. {
- yyextra->code->codify(yytext);
- }
+ BEGIN( yyextra->lastCContext ) ;
+ }
+<SkipCxxComment>[^\r\n]*"\\"[\r]?\n { // line continuation
+ codifyLines(yyscanner,yytext);
+ }
+<SkipCxxComment>[^\r\n]+ {
+ yyextra->code->codify(yytext);
+ }
+<SkipCxxComment>\r
+<SkipCxxComment>\n {
+ unput('\n');
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastCContext ) ;
+ }
+<SkipCxxComment>. {
+ yyextra->code->codify(yytext);
+ }
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)?{B}*"/*"[*!]/[^/*] {
- yyextra->yyLineNr+=QCString(yytext).contains('\n');
- }
+ yyextra->yyLineNr+=QCString(yytext).contains('\n');
+ }
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)? {
- yyextra->yyLineNr+=QCString(yytext).contains('\n');
- nextCodeLine(yyscanner);
- if (yyextra->lastSpecialCContext==SkipCxxComment)
- { // force end of C++ comment here
- endFontClass(yyscanner);
- BEGIN( yyextra->lastCContext ) ;
- }
- else
- {
- BEGIN(yyextra->lastSpecialCContext);
- }
- }
-<RemoveSpecialCComment>"*/" {
- BEGIN(yyextra->lastSpecialCContext);
- }
+ if (yyextra->lastSpecialCContext==SkipCxxComment)
+ { // force end of C++ comment here
+ yyextra->yyLineNr+=QCString(yytext).contains('\n');
+ nextCodeLine(yyscanner);
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastCContext ) ;
+ }
+ else
+ {
+ yyextra->yyLineNr+=QCString(yytext).contains('\n');
+ if (yytext[yyleng-1]=='\n')
+ {
+ yyextra->yyLineNr--;
+ unput('\n');
+ }
+ else
+ {
+ nextCodeLine(yyscanner);
+ }
+ BEGIN(yyextra->lastSpecialCContext);
+ }
+ }
+<RemoveSpecialCComment>"*/" {
+ BEGIN(yyextra->lastSpecialCContext);
+ }
<RemoveSpecialCComment>[^*\n]+
<RemoveSpecialCComment>"//"|"/*"
<RemoveSpecialCComment>\n { yyextra->yyLineNr++; }
<RemoveSpecialCComment>.
-<MemberCall>[^a-z_A-Z0-9(\n] {
- yyextra->code->codify(yytext);
- yyextra->type.resize(0);
- yyextra->name.resize(0);
- BEGIN(yyextra->memCallContext);
- }
-<*>\n({B}*"//"[!/][^\n]*\n)+ { // remove special one-line comment
- if (YY_START==SkipCPP) REJECT;
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- yyextra->yyLineNr+=((QCString)yytext).contains('\n');
- nextCodeLine(yyscanner);
- }
- else
- {
- startFontClass(yyscanner,"comment");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
- if (YY_START==SkipCxxComment)
- {
- endFontClass(yyscanner);
- BEGIN( yyextra->lastCContext ) ;
- }
- }
-<SkipCPP>\n/.*\n {
- endFontClass(yyscanner);
- codifyLines(yyscanner,yytext);
- BEGIN( yyextra->lastSkipCppContext ) ;
- }
-<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- yyextra->yyLineNr+=2;
- nextCodeLine(yyscanner);
- }
- else
- {
- startFontClass(yyscanner,"comment");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
- if (YY_START==SkipCxxComment)
- {
- endFontClass(yyscanner);
- BEGIN( yyextra->lastCContext ) ;
- }
- }
-<*>\n{B}*"/*@"[{}] { // remove one-line group marker
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
- yyextra->yyLineNr++;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipComment && YY_START != SkipCxxComment)
- {
- yyextra->lastCContext = YY_START ;
- }
- startFontClass(yyscanner,"comment");
- codifyLines(yyscanner,yytext);
- BEGIN(SkipComment);
- }
- }
-<*>^{B}*"//@"[{}].*\n { // remove one-line group marker
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- yyextra->yyLineNr++;
- nextCodeLine(yyscanner);
- }
- else
- {
- startFontClass(yyscanner,"comment");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
- }
-<*>^{B}*"/*@"[{}] { // remove multi-line group marker
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipComment && YY_START != SkipCxxComment)
- {
- yyextra->lastCContext = YY_START ;
- }
- startFontClass(yyscanner,"comment");
- yyextra->code->codify(yytext);
- BEGIN(SkipComment);
- }
- }
-<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- yyextra->yyLineNr++;
- //nextCodeLine(yyscanner);
- }
- else
- {
- startFontClass(yyscanner,"comment");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
- }
-<*>"//"[!/][^\n]*\n { // strip special one-line comment
+<MemberCall>[^a-z_A-Z0-9(\n] {
+ yyextra->code->codify(yytext);
+ yyextra->type.resize(0);
+ yyextra->name.resize(0);
+ BEGIN(yyextra->memCallContext);
+ }
+<*>\n({B}*"//"[!/][^\n]*\n)+ { // remove special one-line comment
+ if (YY_START==SkipCPP) REJECT;
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ yyextra->yyLineNr+=QCString(yytext).contains('\n');
+ nextCodeLine(yyscanner);
+ }
+ else
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ if (YY_START==SkipCxxComment)
+ {
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastCContext ) ;
+ }
+ }
+<SkipCPP>\n/.*\n {
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastSkipCppContext ) ;
+ unput('\n');
+ }
+<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ yyextra->yyLineNr+=2;
+ nextCodeLine(yyscanner);
+ }
+ else
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ if (YY_START==SkipCxxComment)
+ {
+ endFontClass(yyscanner);
+ BEGIN( yyextra->lastCContext ) ;
+ }
+ }
+<*>\n{B}*"/*@"[{}] { // remove one-line group marker
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
+ yyextra->yyLineNr++;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipComment && YY_START != SkipCxxComment)
+ {
+ yyextra->lastCContext = YY_START ;
+ }
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>^{B}*"//@"[{}].*\n { // remove one-line group marker
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ yyextra->yyLineNr++;
+ nextCodeLine(yyscanner);
+ }
+ else
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ }
+<*>^{B}*"/*@"[{}] { // remove multi-line group marker
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipComment && YY_START != SkipCxxComment)
+ {
+ yyextra->lastCContext = YY_START ;
+ }
+ startFontClass(yyscanner,"comment");
+ yyextra->code->codify(yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ yyextra->yyLineNr++;
+ //nextCodeLine(yyscanner);
+ }
+ else
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ }
+<*>"//"[!/][^\n]*/\n { // strip special one-line comment
if (YY_START==SkipComment || YY_START==SkipString) REJECT;
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- char c[2]; c[0]='\n'; c[1]=0;
- codifyLines(yyscanner,c);
- }
- else
- {
- startFontClass(yyscanner,"comment");
- codifyLines(yyscanner,yytext);
- endFontClass(yyscanner);
- }
- }
-<*>"/*[tag:"[^\]\n]*"]*/"{B}* { // special pattern /*[tag:filename]*/ to force linking to a tag file
- yyextra->forceTagReference=yytext;
- int s=yyextra->forceTagReference.find(':');
- int e=yyextra->forceTagReference.findRev(']');
- yyextra->forceTagReference = yyextra->forceTagReference.mid(s+1,e-s-1);
- }
-<*>\n{B}*"/*"[!*]/[^/*] {
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
- yyextra->yyLineNr++;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipComment && YY_START != SkipCxxComment)
- {
- yyextra->lastCContext = YY_START ;
- }
- startFontClass(yyscanner,"comment");
- codifyLines(yyscanner,yytext);
- BEGIN(SkipComment);
- }
- }
-<*>^{B}*"/**"[*]+/[^/] { // special C "banner" comment block at a new line
- if (Config_getBool(JAVADOC_BANNER) && Config_getBool(STRIP_CODE_COMMENTS))
- {
- if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipComment && YY_START != SkipCxxComment)
- {
- yyextra->lastCContext = YY_START ;
- }
- startFontClass(yyscanner,"comment");
- yyextra->code->codify(yytext);
- BEGIN(SkipComment);
- }
- }
-<*>^{B}*"/*"[!*]/[^/*] { // special C comment block at a new line
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipComment && YY_START != SkipCxxComment)
- {
- yyextra->lastCContext = YY_START ;
- }
- startFontClass(yyscanner,"comment");
- yyextra->code->codify(yytext);
- BEGIN(SkipComment);
- }
- }
-<*>"/*"[!*]/[^/*] { // special C comment block half way a line
+ if (!Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ }
+<*>\n{B}*"/*"[!*]/[^/*] {
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
+ yyextra->yyLineNr++;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipComment && YY_START != SkipCxxComment)
+ {
+ yyextra->lastCContext = YY_START ;
+ }
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>^{B}*"/**"[*]+/[^/] { // special C "banner" comment block at a new line
+ if (Config_getBool(JAVADOC_BANNER) && Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipComment && YY_START != SkipCxxComment)
+ {
+ yyextra->lastCContext = YY_START ;
+ }
+ startFontClass(yyscanner,"comment");
+ yyextra->code->codify(yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>^{B}*"/*"[!*]/[^/*] { // special C comment block at a new line
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipComment && YY_START != SkipCxxComment)
+ {
+ yyextra->lastCContext = YY_START ;
+ }
+ startFontClass(yyscanner,"comment");
+ yyextra->code->codify(yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>"/*"[!*]/[^/*] { // special C comment block half way a line
if (YY_START==SkipString) REJECT;
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipComment && YY_START != SkipCxxComment)
- {
- yyextra->lastCContext = YY_START ;
- }
- startFontClass(yyscanner,"comment");
- yyextra->code->codify(yytext);
- BEGIN(SkipComment);
- }
- }
-<*>"/*"("!"?)"*/" {
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ if (YY_START != RemoveSpecialCComment) yyextra->lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipComment && YY_START != SkipCxxComment)
+ {
+ yyextra->lastCContext = YY_START ;
+ }
+ startFontClass(yyscanner,"comment");
+ yyextra->code->codify(yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>"/*"("!"?)"*/" {
if (YY_START==SkipString) REJECT;
if (!Config_getBool(STRIP_CODE_COMMENTS))
- {
- startFontClass(yyscanner,"comment");
- yyextra->code->codify(yytext);
- endFontClass(yyscanner);
- }
- }
+ {
+ startFontClass(yyscanner,"comment");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+ }
<SkipComment>[^\*\n]+ {
yyextra->code->codify(yytext);
}
-<*>"/*" {
- startFontClass(yyscanner,"comment");
- yyextra->code->codify(yytext);
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipComment && YY_START != SkipCxxComment)
- {
- yyextra->lastCContext = YY_START ;
- }
- BEGIN( SkipComment ) ;
- }
-<*>@\" { // C# verbatim string
- startFontClass(yyscanner,"stringliteral");
- yyextra->code->codify(yytext);
- yyextra->lastVerbStringContext=YY_START;
- BEGIN(SkipVerbString);
- }
-<*>"//" {
- startFontClass(yyscanner,"comment");
- yyextra->code->codify(yytext);
- yyextra->lastCContext = YY_START ;
- BEGIN( SkipCxxComment ) ;
- }
-<*>"("|"[" {
- yyextra->code->codify(yytext);
- yyextra->theCallContext.pushScope(yyextra->name, yyextra->type);
- }
-<*>")"|"]" {
- yyextra->code->codify(yytext);
- yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
- }
-<*>\n {
- yyextra->yyColNr++;
- codifyLines(yyscanner,yytext);
- }
-<*>. {
- yyextra->yyColNr++;
- yyextra->code->codify(yytext);
- }
+<*>"/*" {
+ startFontClass(yyscanner,"comment");
+ yyextra->code->codify(yytext);
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipComment && YY_START != SkipCxxComment)
+ {
+ yyextra->lastCContext = YY_START ;
+ }
+ BEGIN( SkipComment ) ;
+ }
+<*>@\" { // C# verbatim string
+ startFontClass(yyscanner,"stringliteral");
+ yyextra->code->codify(yytext);
+ yyextra->lastVerbStringContext=YY_START;
+ BEGIN(SkipVerbString);
+ }
+<*>"//" {
+ startFontClass(yyscanner,"comment");
+ yyextra->code->codify(yytext);
+ yyextra->lastCContext = YY_START ;
+ BEGIN( SkipCxxComment ) ;
+ }
+<*>"("|"[" {
+ yyextra->code->codify(yytext);
+ yyextra->theCallContext.pushScope(yyextra->name, yyextra->type);
+ }
+<*>")"|"]" {
+ yyextra->code->codify(yytext);
+ yyextra->theCallContext.popScope(yyextra->name, yyextra->type);
+ }
+<*>\n {
+ yyextra->yyColNr++;
+ codifyLines(yyscanner,yytext);
+ }
+<*>[\x80-\xFF]* { // keep utf8 characters together...
+ yyextra->yyColNr+=yyleng;
+ yyextra->code->codify(yytext);
+ }
+<*>. {
+ yyextra->yyColNr++;
+ yyextra->code->codify(yytext);
+ }
/*
-<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines
- //QCString sepLine=yytext;
- //yyextra->code->codify("\n\n");
- //yyextra->yyLineNr+=sepLine.contains('\n');
- //char sepLine[3]="\n\n";
- codifyLines(yyscanner,yytext);
- }
+<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines
+ //QCString sepLine=yytext;
+ //yyextra->code->codify("\n\n");
+ //yyextra->yyLineNr+=sepLine.contains('\n');
+ //char sepLine[3]="\n\n";
+ codifyLines(yyscanner,yytext);
+ }
*/
%%
@@ -2247,13 +2181,13 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
/*@ ----------------------------------------------------------------------------
*/
-void VariableContext::addVariable(yyscan_t yyscanner,const QCString &type,const QCString &name)
+static void addVariable(yyscan_t yyscanner,QCString type,QCString name)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//printf("VariableContext::addVariable(%s,%s)\n",type.data(),name.data());
QCString ltype = type.simplifyWhiteSpace();
QCString lname = name.simplifyWhiteSpace();
- if (ltype.left(7)=="struct ")
+ if (ltype.left(7)=="struct ")
{
ltype = ltype.right(ltype.length()-7);
}
@@ -2262,94 +2196,53 @@ void VariableContext::addVariable(yyscan_t yyscanner,const QCString &type,const
ltype = ltype.right(ltype.length()-6);
}
if (ltype.isEmpty() || lname.isEmpty()) return;
- DBG_CTX((stderr,"** addVariable trying: type='%s' name='%s' g_currentDefinition=%s\n",
- ltype.data(),lname.data(),g_currentDefinition?g_currentDefinition->name().data():"<none>"));
- Scope *scope = m_scopes.count()==0 ? &m_globalScope : m_scopes.getLast();
- const ClassDef *varType;
- int i=0;
- if (
- (varType=yyextra->codeClassSDict->find(ltype)) || // look for class definitions inside the code block
- (varType=getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,ltype)) // look for global class definitions
- )
+ DBG_CTX((stderr,"** addVariable trying: type='%s' name='%s' currentDefinition=%s\n",
+ ltype.data(),lname.data(),yyextra->currentDefinition?yyextra->currentDefinition->name().data():"<none>"));
+ auto it = yyextra->codeClassMap.find(ltype.str());
+ if (it!=yyextra->codeClassMap.end()) // look for class definitions inside the code block
{
DBG_CTX((stderr,"** addVariable type='%s' name='%s'\n",ltype.data(),lname.data()));
- scope->append(lname,varType); // add it to a list
- }
- else if ((i=ltype.find('<'))!=-1)
- {
- // probably a template class
- QCString typeName(ltype.left(i));
- ClassDef* newDef = 0;
- QCString templateArgs(ltype.right(ltype.length() - i));
- if ( !typeName.isEmpty() &&
- ( // look for class definitions inside the code block
- (varType=yyextra->codeClassSDict->find(typeName)) ||
- // otherwise look for global class definitions
- (varType=getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,typeName,0,0,TRUE,TRUE))
- ) && // and it must be a template
- !varType->templateArguments().empty())
- {
- newDef = varType->getVariableInstance( templateArgs );
- }
- if (newDef)
- {
- DBG_CTX((stderr,"** addVariable type='%s' templ='%s' name='%s'\n",typeName.data(),templateArgs.data(),lname.data()));
- scope->append(lname, newDef);
- }
- else
- {
- // Doesn't seem to be a template. Try just the base name.
- addVariable(yyscanner,typeName,name);
- }
+ yyextra->theVarContext.addVariable(lname,std::move(it->second)); // add it to a list
}
- else
+ else
{
- if (m_scopes.count()>0) // for local variables add a dummy entry so the name
- // is hidden to avoid false links to global variables with the same name
- // TODO: make this work for namespaces as well!
+ const ClassDef *varDef = yyextra->symbolResolver.resolveClass(yyextra->currentDefinition,ltype);
+ int i=0;
+ if (varDef)
{
- DBG_CTX((stderr,"** addVariable: dummy context for '%s'\n",lname.data()));
- scope->append(lname,dummyContext);
+ DBG_CTX((stderr,"** addVariable type='%s' name='%s'\n",ltype.data(),lname.data()));
+ yyextra->theVarContext.addVariable(lname,ScopedTypeVariant(varDef)); // add it to a list
}
- else
+ else if ((i=ltype.find('<'))!=-1)
{
- DBG_CTX((stderr,"** addVariable: not adding variable!\n"));
+ // probably a template class
+ QCString typeName(ltype.left(i));
+ addVariable(yyscanner,typeName,name);
}
- }
-}
-
-ClassDef *VariableContext::findVariable(const QCString &name)
-{
- if (name.isEmpty()) return 0;
- ClassDef *result = 0;
- QListIterator<Scope> sli(m_scopes);
- Scope *scope;
- QCString key = name;
- // search from inner to outer scope
- for (sli.toLast();(scope=sli.current());--sli)
- {
- result = scope->find(key);
- if (result)
+ else
{
- DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
- return result;
+ if (!yyextra->theVarContext.atGlobalScope()) // for local variables add a dummy entry so the name
+ // is hidden to avoid false links to global variables with the same name
+ // TODO: make this work for namespaces as well!
+ {
+ DBG_CTX((stderr,"** addVariable: dummy context for '%s'\n",lname.data()));
+ yyextra->theVarContext.addVariable(lname,ScopedTypeVariant());
+ }
+ else
+ {
+ DBG_CTX((stderr,"** addVariable: not adding variable!\n"));
+ }
}
}
- // nothing found -> also try the global scope
- result=m_globalScope.find(name);
- DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
- return result;
}
-const ClassDef *VariableContext::dummyContext = (ClassDef*)0x8;
-
//-------------------------------------------------------------------
/*! add class/namespace name s to the scope */
static void pushScope(yyscan_t yyscanner,const char *s)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- yyextra->classScopeLengthStack.push(new int(yyextra->classScope.length()));
+ yyextra->classScopeLengthStack.push(int(yyextra->classScope.length()));
if (yyextra->classScope.isEmpty() || leftScopeMatch(s,yyextra->classScope))
{
yyextra->classScope = s;
@@ -2367,11 +2260,11 @@ static void pushScope(yyscan_t yyscanner,const char *s)
static void popScope(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (!yyextra->classScopeLengthStack.isEmpty())
+ if (!yyextra->classScopeLengthStack.empty())
{
- int *pLength = yyextra->classScopeLengthStack.pop();
- yyextra->classScope.truncate(*pLength);
- delete pLength;
+ int length = yyextra->classScopeLengthStack.top();
+ yyextra->classScopeLengthStack.pop();
+ yyextra->classScope.truncate(length);
}
else
{
@@ -2385,6 +2278,7 @@ static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor)
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
+ std::lock_guard<std::mutex> lock(g_searchIndexMutex);
if (yyextra->searchCtx)
{
yyextra->code->setCurrentDoc(yyextra->searchCtx,yyextra->searchCtx->anchor(),FALSE);
@@ -2401,6 +2295,7 @@ static void addToSearchIndex(yyscan_t yyscanner,const char *text)
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
+ std::lock_guard<std::mutex> lock(g_searchIndexMutex);
yyextra->code->addWord(text,FALSE);
}
}
@@ -2419,7 +2314,7 @@ static void setClassScope(yyscan_t yyscanner,const QCString &name)
// remove template from scope
n=n.left(ts)+n.right(n.length()-te-1);
}
- while (!yyextra->classScopeLengthStack.isEmpty())
+ while (!yyextra->classScopeLengthStack.empty())
{
popScope(yyscanner);
}
@@ -2447,8 +2342,8 @@ static void startCodeLine(yyscan_t yyscanner)
//QCString lineNumber,lineAnchor;
//lineNumber.sprintf("%05d",yyextra->yyLineNr);
//lineAnchor.sprintf("l%05d",yyextra->yyLineNr);
-
- Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr);
+
+ const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr);
//printf("%s:startCodeLine(%d)=%p\n",yyextra->sourceFileDef->name().data(),yyextra->yyLineNr,d);
if (!yyextra->includeCodeFragment && d)
{
@@ -2470,15 +2365,15 @@ static void startCodeLine(yyscan_t yyscanner)
if (yyextra->currentMemberDef)
{
yyextra->code->writeLineNumber(yyextra->currentMemberDef->getReference(),
- yyextra->currentMemberDef->getOutputFileBase(),
- yyextra->currentMemberDef->anchor(),yyextra->yyLineNr);
+ yyextra->currentMemberDef->getOutputFileBase(),
+ yyextra->currentMemberDef->anchor(),yyextra->yyLineNr);
setCurrentDoc(yyscanner,lineAnchor);
}
else if (d->isLinkableInProject())
{
yyextra->code->writeLineNumber(d->getReference(),
- d->getOutputFileBase(),
- 0,yyextra->yyLineNr);
+ d->getOutputFileBase(),
+ 0,yyextra->yyLineNr);
setCurrentDoc(yyscanner,lineAnchor);
}
}
@@ -2488,7 +2383,7 @@ static void startCodeLine(yyscan_t yyscanner)
}
}
DBG_CTX((stderr,"startCodeLine(%d)\n",yyextra->yyLineNr));
- yyextra->code->startCodeLine(yyextra->sourceFileDef && yyextra->lineNumbers);
+ yyextra->code->startCodeLine(yyextra->sourceFileDef && yyextra->lineNumbers);
if (yyextra->currentFontClass)
{
yyextra->code->startFontClass(yyextra->currentFontClass);
@@ -2510,7 +2405,7 @@ static void nextCodeLine(yyscan_t yyscanner)
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
const char * fc = yyextra->currentFontClass;
endCodeLine(yyscanner);
- if (yyextra->yyLineNr<yyextra->inputLines)
+ if (yyextra->yyLineNr<yyextra->inputLines)
{
yyextra->currentFontClass = fc;
startCodeLine(yyscanner);
@@ -2535,7 +2430,6 @@ static void codifyLines(yyscan_t yyscanner,const char *text)
{
yyextra->yyLineNr++;
yyextra->yyColNr=1;
- //*(p-1)='\0';
int l = (int)(p-sp-1);
char *tmp = (char*)malloc(l+1);
memcpy(tmp,sp,l);
@@ -2552,8 +2446,22 @@ static void codifyLines(yyscan_t yyscanner,const char *text)
}
}
+static void incrementFlowKeyWordCount(yyscan_t yyscanner)
+{
+ std::lock_guard<std::mutex> lock(g_countFlowKeywordsMutex);
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction())
+ {
+ MemberDefMutable *md = toMemberDefMutable(yyextra->currentMemberDef);
+ if (md)
+ {
+ md->incrementFlowKeyWordCount();
+ }
+ }
+}
+
/*! writes a link to a fragment \a text that may span multiple lines, inserting
- * line numbers for each line. If \a text contains newlines, the link will be
+ * line numbers for each line. If \a text contains newlines, the link will be
* split into multiple links with the same destination, one for each line.
*/
static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
@@ -2561,12 +2469,12 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
const char *text)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
- TooltipManager::instance()->addTooltip(d);
+ bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
+ TooltipManager::instance().addTooltip(ol,d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
- QCString tooltip;
+ QCString tooltip;
if (!sourceTooltips) // fall back to simple "title" tooltips
{
tooltip = d->briefDescriptionAsTooltip();
@@ -2621,7 +2529,7 @@ static void addUsingDirective(yyscan_t yyscanner,const char *name)
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (yyextra->sourceFileDef && name)
{
- NamespaceDef *nd = Doxygen::namespaceSDict->find(name);
+ const NamespaceDef *nd = Doxygen::namespaceLinkedMap->find(name);
if (nd)
{
yyextra->sourceFileDef->addUsingDirective(nd);
@@ -2643,11 +2551,11 @@ static void setParameterList(yyscan_t yyscanner,const MemberDef *md)
if (i!=-1) yyextra->parmType = yyextra->parmType.left(i);
yyextra->parmType.stripPrefix("const ");
yyextra->parmType=yyextra->parmType.stripWhiteSpace();
- yyextra->theVarContext.addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
+ addVariable(yyscanner,yyextra->parmType,yyextra->parmName);
}
}
-static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,Definition *d)
+static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,const Definition *d)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
int pos=0;
@@ -2660,11 +2568,11 @@ static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,Definitio
const ClassDef *cd=0;
if (!yyextra->classScope.isEmpty())
{
- cd=getResolvedClass(d,yyextra->sourceFileDef,yyextra->classScope+"::"+clName);
+ cd=yyextra->symbolResolver.resolveClass(d,yyextra->classScope+"::"+clName);
}
if (cd==0)
{
- cd=getResolvedClass(d,yyextra->sourceFileDef,clName);
+ cd=yyextra->symbolResolver.resolveClass(d,clName);
}
//printf("stripClass trying '%s' = %p\n",clName.data(),cd);
if (cd)
@@ -2676,7 +2584,7 @@ static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,Definitio
return 0;
}
-static MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString &name)
+static const MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString &name)
{
if (name.isEmpty()) return 0;
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
@@ -2688,14 +2596,14 @@ static MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString &name)
QCString scope = name.left(scopeEnd);
QCString locName = name.right(name.length()-scopeEnd-2);
//printf("explicit scope: name=%s scope=%s\n",locName.data(),scope.data());
- ClassDef *mcd = getClass(scope);
+ const ClassDef *mcd = getClass(scope);
if (mcd && !locName.isEmpty())
{
MemberDef *md=mcd->getMemberByName(locName);
if (md)
{
//printf("name=%s scope=%s\n",locName.data(),scope.data());
- yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope()));
+ yyextra->theCallContext.setScope(ScopedTypeVariant(stripClassName(yyscanner,md->typeString(),md->getOuterScope())));
return md;
}
}
@@ -2704,84 +2612,80 @@ static MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString &name)
const NamespaceDef *mnd = getResolvedNamespace(scope);
if (mnd && !locName.isEmpty())
{
- MemberDef *md=mnd->getMemberByName(locName);
- if (md)
- {
- //printf("name=%s scope=%s\n",locName.data(),scope.data());
- yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope()));
- return md;
- }
+ const MemberDef *md=mnd->getMemberByName(locName);
+ if (md)
+ {
+ //printf("name=%s scope=%s\n",locName.data(),scope.data());
+ yyextra->theCallContext.setScope(ScopedTypeVariant(stripClassName(yyscanner,md->typeString(),md->getOuterScope())));
+ return md;
+ }
}
}
}
-
- MemberName *mn;
- ClassDef *mcd = yyextra->theVarContext.findVariable(name);
- if (mcd) // local variable
+
+ const MemberName *mn;
+ const ScopedTypeVariant *mcv = yyextra->theVarContext.findVariable(name);
+ if (mcv)
{
DBG_CTX((stderr,"local variable?\n"));
- if (mcd!=VariableContext::dummyContext)
+ if (mcv->type()!=ScopedTypeVariant::Dummy) // locally found variable
{
- DBG_CTX((stderr,"local var '%s' mcd=%s\n",name.data(),mcd->name().data()));
- yyextra->theCallContext.setScope(mcd);
+ DBG_CTX((stderr,"local var '%s' mcd=%s\n",name.data(),mcv->name().data()));
+ yyextra->theCallContext.setScope(*mcv);
}
}
else
{
DBG_CTX((stderr,"class member? scope=%s\n",yyextra->classScope.data()));
- // look for a class member
- mcd = getClass(yyextra->classScope);
+ // look for a class member
+ const ClassDef *mcd = getClass(yyextra->classScope);
if (mcd)
{
DBG_CTX((stderr,"Inside class %s\n",mcd->name().data()));
- MemberDef *md=mcd->getMemberByName(name);
- if (md)
+ const MemberDef *md=mcd->getMemberByName(name);
+ if (md)
{
DBG_CTX((stderr,"Found member %s\n",md->name().data()));
- if (yyextra->scopeStack.top()!=CLASSBLOCK)
- {
+ if (yyextra->scopeStack.empty() || yyextra->scopeStack.top()!=CLASSBLOCK)
+ {
DBG_CTX((stderr,"class member '%s' mcd=%s\n",name.data(),mcd->name().data()));
- yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope()));
- }
- return md;
+ yyextra->theCallContext.setScope(ScopedTypeVariant(stripClassName(yyscanner,md->typeString(),md->getOuterScope())));
+ }
+ return md;
}
}
}
// look for a global member
- if ((mn=Doxygen::functionNameSDict->find(name)))
+ if ((mn=Doxygen::functionNameLinkedMap->find(name)))
{
//printf("global var '%s'\n",name.data());
- if (mn->count()==1) // global defined only once
+ if (mn->size()==1) // global defined only once
{
- MemberDef *md=mn->getFirst();
+ const std::unique_ptr<MemberDef> &md=mn->front();
if (!md->isStatic() || md->getBodyDef()==yyextra->sourceFileDef)
{
- yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope()));
- return md;
+ yyextra->theCallContext.setScope(ScopedTypeVariant(stripClassName(yyscanner,md->typeString(),md->getOuterScope())));
+ return md.get();
}
return 0;
}
- else if (mn->count()>1) // global defined more than once
+ else if (mn->size()>1) // global defined more than once
{
- MemberNameIterator it(*mn);
- MemberDef *md;
- for (;(md=it.current());++it)
+ for (const auto &md : *mn)
{
- //printf("mn=%p md=%p md->getBodyDef()=%p yyextra->sourceFileDef=%p\n",
- // mn,md,
- // md->getBodyDef(),yyextra->sourceFileDef);
-
- // in case there are multiple members we could link to, we
- // only link to members if defined in the same file or
- // defined as external.
- if ((!md->isStatic() || md->getBodyDef()==yyextra->sourceFileDef) &&
- (yyextra->forceTagReference.isEmpty() || yyextra->forceTagReference==md->getReference())
- )
+ //printf("mn=%p md=%p md->getBodyDef()=%p yyextra->sourceFileDef=%p\n",
+ // mn,md,
+ // md->getBodyDef(),yyextra->sourceFileDef);
+
+ // in case there are multiple members we could link to, we
+ // only link to members if defined in the same file or
+ // defined as external.
+ if (!md->isStatic() || md->getBodyDef()==yyextra->sourceFileDef)
{
- yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope()));
- //printf("returning member %s in source file %s\n",md->name().data(),yyextra->sourceFileDef->name().data());
- return md;
+ yyextra->theCallContext.setScope(ScopedTypeVariant(stripClassName(yyscanner,md->typeString(),md->getOuterScope())));
+ //printf("returning member %s in source file %s\n",md->name().data(),yyextra->sourceFileDef->name().data());
+ return md.get();
}
}
return 0;
@@ -2793,15 +2697,15 @@ static MemberDef *setCallContextForVar(yyscan_t yyscanner,const QCString &name)
static void updateCallContextForSmartPointer(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- const Definition *d = yyextra->theCallContext.getScope();
+ const Definition *d = yyextra->theCallContext.getScope().globalDef();
//printf("updateCallContextForSmartPointer() cd=%s\n",cd ? d->name().data() : "<none>");
- MemberDef *md;
- if (d && d->definitionType()==Definition::TypeClass && (md=(dynamic_cast<const ClassDef*>(d))->isSmartPointer()))
+ const MemberDef *md;
+ if (d && d->definitionType()==Definition::TypeClass && (md=(toClassDef(d))->isSmartPointer()))
{
const ClassDef *ncd = stripClassName(yyscanner,md->typeString(),md->getOuterScope());
if (ncd)
{
- yyextra->theCallContext.setScope(ncd);
+ yyextra->theCallContext.setScope(ScopedTypeVariant(ncd));
//printf("Found smart pointer call %s->%s!\n",cd->name().data(),ncd->name().data());
}
}
@@ -2810,11 +2714,11 @@ static void updateCallContextForSmartPointer(yyscan_t yyscanner)
static bool getLinkInScope(yyscan_t yyscanner,
const QCString &c, // scope
const QCString &m, // member
- const char *memberText, // exact text
- CodeOutputInterface &ol,
- const char *text,
- bool varOnly
- )
+ const char *memberText, // exact text
+ CodeOutputInterface &ol,
+ const char *text,
+ bool varOnly
+ )
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
const MemberDef *md = 0;
@@ -2823,7 +2727,7 @@ static bool getLinkInScope(yyscan_t yyscanner,
const NamespaceDef *nd = 0;
const GroupDef *gd = 0;
DBG_CTX((stderr,"getLinkInScope: trying '%s'::'%s' varOnly=%d\n",c.data(),m.data(),varOnly));
- if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,yyextra->sourceFileDef,FALSE,yyextra->forceTagReference) &&
+ if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,yyextra->sourceFileDef,FALSE) &&
(!varOnly || md->isVariable()))
{
if (md->isLinkable())
@@ -2831,11 +2735,13 @@ static bool getLinkInScope(yyscan_t yyscanner,
//printf("found it %s!\n",md->qualifiedName().data());
if (yyextra->exampleBlock)
{
+ std::lock_guard<std::mutex> lock(g_addExampleMutex);
QCString anchor;
anchor.sprintf("a%d",yyextra->anchorCount);
//printf("addExampleFile(%s,%s,%s)\n",anchor.data(),yyextra->exampleName.data(),
// yyextra->exampleFile.data());
- if (const_cast<MemberDef*>(md)->addExample(anchor,yyextra->exampleName,yyextra->exampleFile))
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm && mdm->addExample(anchor,yyextra->exampleName,yyextra->exampleFile))
{
ol.writeCodeAnchor(anchor);
yyextra->anchorCount++;
@@ -2847,14 +2753,15 @@ static bool getLinkInScope(yyscan_t yyscanner,
if (md->resolveAlias()->getGroupDef()) d = md->resolveAlias()->getGroupDef();
if (d && d->isLinkable())
{
- yyextra->theCallContext.setScope(stripClassName(yyscanner,md->typeString(),md->getOuterScope()));
+ yyextra->theCallContext.setScope(ScopedTypeVariant(stripClassName(yyscanner,md->typeString(),md->getOuterScope())));
//printf("yyextra->currentDefinition=%p yyextra->currentMemberDef=%p yyextra->insideBody=%d\n",
// yyextra->currentDefinition,yyextra->currentMemberDef,yyextra->insideBody);
if (yyextra->currentDefinition && yyextra->currentMemberDef &&
md!=yyextra->currentMemberDef && yyextra->insideBody && yyextra->collectXRefs)
{
- addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(md));
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(md));
}
//printf("d->getReference()='%s' d->getOutputBase()='%s' name='%s' member name='%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
@@ -2876,9 +2783,9 @@ static bool getLinkInScope(yyscan_t yyscanner,
static bool getLink(yyscan_t yyscanner,
const char *className,
const char *memberName,
- CodeOutputInterface &ol,
- const char *text,
- bool varOnly)
+ CodeOutputInterface &ol,
+ const char *text,
+ bool varOnly)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//printf("getLink(%s,%s) yyextra->curClassName=%s\n",className,memberName,yyextra->curClassName.data());
@@ -2924,18 +2831,20 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner,
{
className = substitute(className,".","::"); // for PHP namespaces
}
- const ClassDef *cd=0,*lcd=0;
+ const ScopedTypeVariant *lcd=0;
+ const ClassDef *cd=0;
const MemberDef *md=0;
bool isLocal=FALSE;
//printf("generateClassOrGlobalLink(className=%s)\n",className.data());
- if (!yyextra->prefixed_with_this_keyword || (lcd=yyextra->theVarContext.findVariable(className))==0) // not a local variable
+ if (!yyextra->isPrefixedWithThis || (lcd=yyextra->theVarContext.findVariable(className))==0) // not a local variable
{
- Definition *d = yyextra->currentDefinition;
+ const Definition *d = yyextra->currentDefinition;
//printf("d=%s yyextra->sourceFileDef=%s\n",d?d->name().data():"<none>",yyextra->sourceFileDef?yyextra->sourceFileDef->name().data():"<none>");
- cd = getResolvedClass(d,yyextra->sourceFileDef,className,&md);
- DBG_CTX((stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n",
- className.data(),yyextra->theVarContext.count(),cd?cd->name().data():"<none>",
+ cd = yyextra->symbolResolver.resolveClass(d,className);
+ md = yyextra->symbolResolver.getTypedef();
+ DBG_CTX((stderr,"non-local variable name=%s cd=%s md=%s!\n",
+ className.data(),cd?cd->name().data():"<none>",
md?md->name().data():"<none>"));
if (cd==0 && md==0 && (i=className.find('<'))!=-1)
{
@@ -2943,13 +2852,14 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner,
DBG_CTX((stderr,"bareName=%s\n",bareName.data()));
if (bareName!=className)
{
- cd=getResolvedClass(d,yyextra->sourceFileDef,bareName,&md); // try unspecialized version
+ cd = yyextra->symbolResolver.resolveClass(d,bareName); // try unspecialized version
+ md = yyextra->symbolResolver.getTypedef();
}
}
const NamespaceDef *nd = getResolvedNamespace(className);
if (nd && nd->isLinkable())
{
- yyextra->theCallContext.setScope(nd);
+ yyextra->theCallContext.setScope(ScopedTypeVariant(nd));
addToSearchIndex(yyscanner,className);
writeMultiLineCodeLink(yyscanner,*yyextra->code,nd,clName);
return;
@@ -2962,58 +2872,61 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner,
{
if (getLink(yyscanner,yyextra->classScope,clName,ol,clName,varOnly))
{
- return;
+ return;
}
}
}
else
{
//printf("local variable!\n");
- if (lcd!=VariableContext::dummyContext)
+ if (lcd->type()!=ScopedTypeVariant::Dummy)
{
//printf("non-dummy context lcd=%s!\n",lcd->name().data());
- yyextra->theCallContext.setScope(lcd);
+ yyextra->theCallContext.setScope(*lcd);
// to following is needed for links to a global variable, but is
// no good for a link to a local variable that is also a global symbol.
-
+
//if (getLink(yyscanner,yyextra->classScope,clName,ol,clName))
//{
- //return;
+ //return;
//}
}
isLocal=TRUE;
DBG_CTX((stderr,"is a local variable cd=%p!\n",cd));
}
- yyextra->prefixed_with_this_keyword = FALSE; // discard the "this" prefix for the next calls
+ yyextra->isPrefixedWithThis = FALSE; // discard the "this" prefix for the next calls
if (cd && cd->isLinkable()) // is it a linkable class
{
DBG_CTX((stderr,"is linkable class %s\n",clName));
if (yyextra->exampleBlock)
{
+ std::lock_guard<std::mutex> lock(g_addExampleMutex);
QCString anchor;
anchor.sprintf("_a%d",yyextra->anchorCount);
//printf("addExampleClass(%s,%s,%s)\n",anchor.data(),yyextra->exampleName.data(),
// yyextra->exampleFile.data());
- if (const_cast<ClassDef*>(cd)->addExample(anchor,yyextra->exampleName,yyextra->exampleFile))
+ ClassDefMutable *cdm = toClassDefMutable(const_cast<ClassDef*>(cd));
+ if (cdm && cdm->addExample(anchor,yyextra->exampleName,yyextra->exampleFile))
{
- ol.writeCodeAnchor(anchor);
- yyextra->anchorCount++;
+ ol.writeCodeAnchor(anchor);
+ yyextra->anchorCount++;
}
}
writeMultiLineCodeLink(yyscanner,ol,cd,clName);
addToSearchIndex(yyscanner,className);
- yyextra->theCallContext.setScope(cd);
+ yyextra->theCallContext.setScope(ScopedTypeVariant(cd));
if (md)
{
const Definition *d = md->getOuterScope()==Doxygen::globalScope ?
md->getFileDef() : md->getOuterScope();
if (md->getGroupDef()) d = md->getGroupDef();
- if (d && d->isLinkable() && md->isLinkable() &&
+ if (d && d->isLinkable() && md->isLinkable() &&
yyextra->currentMemberDef && yyextra->collectXRefs)
{
- addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(md));
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(md));
}
}
}
@@ -3024,55 +2937,40 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner,
{
if (md==0) // not found as a typedef
{
- md = setCallContextForVar(yyscanner,clName);
- //printf("setCallContextForVar(%s) md=%p yyextra->currentDefinition=%p\n",clName,md,yyextra->currentDefinition);
- if (md && yyextra->currentDefinition)
- {
- DBG_CTX((stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
- md->name().data(),yyextra->currentDefinition->name().data(),
- isAccessibleFrom(yyextra->currentDefinition,yyextra->sourceFileDef,md),
- md->getOuterScope()->name().data()));
- }
-
- if (md && yyextra->currentDefinition &&
- isAccessibleFrom(yyextra->currentDefinition,yyextra->sourceFileDef,md)==-1)
- {
- md=0; // variable not accessible
- }
+ md = setCallContextForVar(yyscanner,clName);
+ //printf("setCallContextForVar(%s) md=%p yyextra->currentDefinition=%p\n",clName,md,yyextra->currentDefinition);
+ if (md && yyextra->currentDefinition)
+ {
+ DBG_CTX((stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
+ md->name().data(),yyextra->currentDefinition->name().data(),
+ yyextra->symbolResolver.isAccessibleFrom(yyextra->currentDefinition,md),
+ md->getOuterScope()->name().data()));
+ }
+
+ if (md && yyextra->currentDefinition &&
+ yyextra->symbolResolver.isAccessibleFrom(yyextra->currentDefinition,md)==-1)
+ {
+ md=0; // variable not accessible
+ }
}
if (md && (!varOnly || md->isVariable()))
{
DBG_CTX((stderr,"is a global md=%p yyextra->currentDefinition=%s linkable=%d\n",md,yyextra->currentDefinition?yyextra->currentDefinition->name().data():"<none>",md->isLinkable()));
- if (md->isLinkable())
- {
- QCString text;
- if (!yyextra->forceTagReference.isEmpty()) // explicit reference to symbol in tag file
- {
- text=yyextra->forceTagReference;
- if (text.right(4)==".tag") // strip .tag if present
- {
- text=text.left(text.length()-4);
- }
- text+=getLanguageSpecificSeparator(md->getLanguage());
- text+=clName;
- const_cast<MemberDef*>(md)->setName(text);
- const_cast<MemberDef*>(md)->setLocalName(text);
- }
- else // normal reference
- {
- text=clName;
- }
- writeMultiLineCodeLink(yyscanner,ol,md,text);
+ if (md->isLinkable())
+ {
+ QCString text=clName;
+ writeMultiLineCodeLink(yyscanner,ol,md,text);
addToSearchIndex(yyscanner,clName);
- if (yyextra->currentMemberDef && yyextra->collectXRefs)
- {
- addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(md));
- }
- return;
- }
+ if (yyextra->currentMemberDef && yyextra->collectXRefs)
+ {
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(md));
+ }
+ return;
+ }
}
}
-
+
// nothing found, just write out the word
DBG_CTX((stderr,"not found!\n"));
codifyLines(yyscanner,clName);
@@ -3082,7 +2980,7 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner,
static bool generateClassMemberLink(yyscan_t yyscanner,
CodeOutputInterface &ol,
- MemberDef *xmd,
+ const MemberDef *xmd,
const char *memName)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
@@ -3095,11 +2993,13 @@ static bool generateClassMemberLink(yyscan_t yyscanner,
if (yyextra->exampleBlock)
{
+ std::lock_guard<std::mutex> lock(g_addExampleMutex);
QCString anchor;
anchor.sprintf("a%d",yyextra->anchorCount);
//printf("addExampleFile(%s,%s,%s)\n",anchor.data(),yyextra->exampleName.data(),
// yyextra->exampleFile.data());
- if (xmd->addExample(anchor,yyextra->exampleName,yyextra->exampleFile))
+ MemberDefMutable *mdm = toMemberDefMutable(xmd);
+ if (mdm && mdm->addExample(anchor,yyextra->exampleName,yyextra->exampleFile))
{
ol.writeCodeAnchor(anchor);
yyextra->anchorCount++;
@@ -3108,7 +3008,7 @@ static bool generateClassMemberLink(yyscan_t yyscanner,
const ClassDef *typeClass = stripClassName(yyscanner,removeAnonymousScopes(xmd->typeString()),xmd->getOuterScope());
DBG_CTX((stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass));
- yyextra->theCallContext.setScope(typeClass);
+ yyextra->theCallContext.setScope(ScopedTypeVariant(typeClass));
const Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ?
xmd->getFileDef() : xmd->getOuterScope();
@@ -3124,9 +3024,10 @@ static bool generateClassMemberLink(yyscan_t yyscanner,
{
// add usage reference
if (yyextra->currentDefinition && yyextra->currentMemberDef &&
- /*xmd!=yyextra->currentMemberDef &&*/ yyextra->insideBody && yyextra->collectXRefs)
+ /*xmd!=yyextra->currentMemberDef &&*/ yyextra->insideBody && yyextra->collectXRefs)
{
- addDocCrossReference(yyextra->currentMemberDef,xmd);
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(xmd));
}
// write the actual link
@@ -3147,8 +3048,8 @@ static bool generateClassMemberLink(yyscan_t yyscanner,
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (def && def->definitionType()==Definition::TypeClass)
{
- const ClassDef *cd = dynamic_cast<const ClassDef*>(def);
- MemberDef *xmd = cd->getMemberByName(memName);
+ const ClassDef *cd = toClassDef(def);
+ const MemberDef *xmd = cd->getMemberByName(memName);
//printf("generateClassMemberLink(class=%s,member=%s)=%p\n",def->name().data(),memName,xmd);
if (xmd)
{
@@ -3156,10 +3057,10 @@ static bool generateClassMemberLink(yyscan_t yyscanner,
}
else
{
- Definition *innerDef = cd->findInnerCompound(memName);
+ const Definition *innerDef = cd->findInnerCompound(memName);
if (innerDef)
{
- yyextra->theCallContext.setScope(innerDef);
+ yyextra->theCallContext.setScope(ScopedTypeVariant(innerDef));
addToSearchIndex(yyscanner,memName);
writeMultiLineCodeLink(yyscanner,*yyextra->code,innerDef,memName);
return TRUE;
@@ -3168,12 +3069,12 @@ static bool generateClassMemberLink(yyscan_t yyscanner,
}
else if (def && def->definitionType()==Definition::TypeNamespace)
{
- const NamespaceDef *nd = dynamic_cast<const NamespaceDef*>(def);
+ const NamespaceDef *nd = toNamespaceDef(def);
//printf("Looking for %s inside namespace %s\n",memName,nd->name().data());
- Definition *innerDef = nd->findInnerCompound(memName);
+ const Definition *innerDef = nd->findInnerCompound(memName);
if (innerDef)
{
- yyextra->theCallContext.setScope(innerDef);
+ yyextra->theCallContext.setScope(ScopedTypeVariant(innerDef));
addToSearchIndex(yyscanner,memName);
writeMultiLineCodeLink(yyscanner,*yyextra->code,innerDef,memName);
return TRUE;
@@ -3194,86 +3095,79 @@ static void generateMemberLink(yyscan_t yyscanner,
if (varName.isEmpty()) return;
// look for the variable in the current context
- const ClassDef *vcd = yyextra->theVarContext.findVariable(varName);
- if (vcd)
+ const ScopedTypeVariant *stv = yyextra->theVarContext.findVariable(varName);
+ if (stv)
{
- if (vcd!=VariableContext::dummyContext)
+ if (stv->type()!=ScopedTypeVariant::Dummy)
{
//printf("Class found!\n");
- if (getLink(yyscanner,vcd->name(),memName,ol))
+ if (getLink(yyscanner,stv->name(),memName,ol))
{
- //printf("Found result!\n");
- return;
+ //printf("Found result!\n");
+ return;
}
- if (vcd->baseClasses())
+ if (stv->localDef() && !stv->localDef()->baseClasses().empty())
{
- BaseClassListIterator bcli(*vcd->baseClasses());
- for ( ; bcli.current() ; ++bcli)
- {
- if (getLink(yyscanner,bcli.current()->classDef->name(),memName,ol))
- {
- //printf("Found result!\n");
- return;
- }
- }
+ for (const auto &bcName : stv->localDef()->baseClasses())
+ {
+ if (getLink(yyscanner,bcName,memName,ol))
+ {
+ //printf("Found result!\n");
+ return;
+ }
+ }
}
}
}
else // variable not in current context, maybe it is in a parent context
{
- vcd = getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,yyextra->classScope);
+ const ClassDef *vcd = yyextra->symbolResolver.resolveClass(yyextra->currentDefinition,yyextra->classScope);
if (vcd && vcd->isLinkable())
{
//printf("Found class %s for variable '%s'\n",yyextra->classScope.data(),varName.data());
- MemberName *vmn=Doxygen::memberNameSDict->find(varName);
+ MemberName *vmn=Doxygen::memberNameLinkedMap->find(varName);
if (vmn==0)
{
- int vi;
- QCString vn=varName;
- if ((vi=vn.findRev("::"))!=-1 || (vi=vn.findRev('.'))!=-1) // explicit scope A::b(), probably static member
- {
- ClassDef *jcd = getClass(vn.left(vi));
- vn=vn.right(vn.length()-vi-2);
- vmn=Doxygen::memberNameSDict->find(vn);
- //printf("Trying name '%s' scope=%s\n",vn.data(),scope.data());
- if (vmn)
- {
- MemberNameIterator vmni(*vmn);
- const MemberDef *vmd;
- for (;(vmd=vmni.current());++vmni)
- {
- if (/*(vmd->isVariable() || vmd->isFunction()) && */
- vmd->getClassDef()==jcd)
- {
- //printf("Found variable type=%s\n",vmd->typeString());
- const ClassDef *mcd=stripClassName(yyscanner,vmd->typeString(),vmd->getOuterScope());
- if (mcd && mcd->isLinkable())
- {
- if (generateClassMemberLink(yyscanner,ol,mcd,memName)) return;
- }
- }
- }
- }
- }
+ int vi;
+ QCString vn=varName;
+ if ((vi=vn.findRev("::"))!=-1 || (vi=vn.findRev('.'))!=-1) // explicit scope A::b(), probably static member
+ {
+ const ClassDef *jcd = getClass(vn.left(vi));
+ vn=vn.right(vn.length()-vi-2);
+ vmn=Doxygen::memberNameLinkedMap->find(vn);
+ //printf("Trying name '%s' scope=%s\n",vn.data(),scope.data());
+ if (vmn)
+ {
+ for (const auto &vmd : *vmn)
+ {
+ if (vmd->getClassDef()==jcd)
+ {
+ //printf("Found variable type=%s\n",vmd->typeString());
+ const ClassDef *mcd=stripClassName(yyscanner,vmd->typeString(),vmd->getOuterScope());
+ if (mcd && mcd->isLinkable())
+ {
+ if (generateClassMemberLink(yyscanner,ol,mcd,memName)) return;
+ }
+ }
+ }
+ }
+ }
}
if (vmn)
{
- //printf("There is a variable with name '%s'\n",varName);
- MemberNameIterator vmni(*vmn);
- const MemberDef *vmd;
- for (;(vmd=vmni.current());++vmni)
- {
- if (/*(vmd->isVariable() || vmd->isFunction()) && */
- vmd->getClassDef()==vcd)
- {
- //printf("Found variable type=%s\n",vmd->typeString());
- const ClassDef *mcd=stripClassName(yyscanner,vmd->typeString(),vmd->getOuterScope());
- if (mcd && mcd->isLinkable())
- {
- if (generateClassMemberLink(yyscanner,ol,mcd,memName)) return;
- }
- }
- }
+ //printf("There is a variable with name '%s'\n",varName);
+ for (const auto &vmd : *vmn)
+ {
+ if (vmd->getClassDef()==vcd)
+ {
+ //printf("Found variable type=%s\n",vmd->typeString());
+ const ClassDef *mcd=stripClassName(yyscanner,vmd->typeString(),vmd->getOuterScope());
+ if (mcd && mcd->isLinkable())
+ {
+ if (generateClassMemberLink(yyscanner,ol,mcd,memName)) return;
+ }
+ }
+ }
}
}
}
@@ -3299,7 +3193,6 @@ static void generateFunctionLink(yyscan_t yyscanner,CodeOutputInterface &ol,cons
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//CodeClassDef *ccd=0;
- ClassDef *ccd=0;
QCString locScope=yyextra->classScope;
QCString locFunc=removeRedundantWhiteSpace(funcName);
if (yyextra->lang==SrcLangExt_PHP && locFunc.startsWith("self::")) locFunc=locFunc.mid(4);
@@ -3311,13 +3204,13 @@ static void generateFunctionLink(yyscan_t yyscanner,CodeOutputInterface &ol,cons
int len=2;
int i=locFunc.findRev("::");
if (yyextra->currentMemberDef && yyextra->currentMemberDef->resolveAlias()->getClassDef() &&
- funcName==yyextra->currentMemberDef->localName() &&
+ funcName==yyextra->currentMemberDef->localName() &&
yyextra->currentMemberDef->getDefLine()==yyextra->yyLineNr &&
generateClassMemberLink(yyscanner,ol,yyextra->currentMemberDef,funcName)
)
{
// special case where funcName is the name of a method that is also
- // defined on this line. In this case we can directly link to
+ // defined on this line. In this case we can directly link to
// yyextra->currentMemberDef, which is not only faster, but
// in case of overloaded methods, this will make sure that we link to
// the correct method, and thereby get the correct reimplemented relations.
@@ -3359,33 +3252,41 @@ static void generateFunctionLink(yyscan_t yyscanner,CodeOutputInterface &ol,cons
funcWithFullScope = locScope+"::"+funcWithScope;
}
}
- if (!fullScope.isEmpty() && (ccd=yyextra->codeClassSDict->find(fullScope)))
+
+ if (!fullScope.isEmpty())
{
- //printf("using classScope %s\n",yyextra->classScope.data());
- if (ccd->baseClasses())
+ auto it = yyextra->codeClassMap.find(fullScope.str());
+ if (it!=yyextra->codeClassMap.end())
{
- BaseClassListIterator bcli(*ccd->baseClasses());
- for ( ; bcli.current() ; ++bcli)
+ ScopedTypeVariant ccd = it->second;
+ if (ccd.localDef() && !ccd.localDef()->baseClasses().empty())
{
- if (getLink(yyscanner,bcli.current()->classDef->name(),locFunc,ol,funcName))
- {
- goto exit;
- }
+ for (const auto &bcName : ccd.localDef()->baseClasses())
+ {
+ if (getLink(yyscanner,bcName,locFunc,ol,funcName))
+ {
+ goto exit;
+ }
+ }
}
}
}
- if (!locScope.isEmpty() && fullScope!=locScope && (ccd=yyextra->codeClassSDict->find(locScope)))
+
+ if (!locScope.isEmpty() && fullScope!=locScope)
{
- //printf("using classScope %s\n",yyextra->classScope.data());
- if (ccd->baseClasses())
+ auto it = yyextra->codeClassMap.find(locScope.str());
+ if (it!=yyextra->codeClassMap.end())
{
- BaseClassListIterator bcli(*ccd->baseClasses());
- for ( ; bcli.current() ; ++bcli)
+ ScopedTypeVariant ccd = it->second;
+ if (ccd.localDef() && !ccd.localDef()->baseClasses().empty())
{
- if (getLink(yyscanner,bcli.current()->classDef->name(),funcWithScope,ol,funcName))
- {
- goto exit;
- }
+ for (const auto &bcName : ccd.localDef()->baseClasses())
+ {
+ if (getLink(yyscanner,bcName,funcWithScope,ol,funcName))
+ {
+ goto exit;
+ }
+ }
}
}
}
@@ -3393,8 +3294,7 @@ static void generateFunctionLink(yyscan_t yyscanner,CodeOutputInterface &ol,cons
{
generateClassOrGlobalLink(yyscanner,ol,funcName);
}
-exit:
- yyextra->forceTagReference.resize(0);
+exit:
return;
}
@@ -3405,17 +3305,17 @@ static int countLines(yyscan_t yyscanner)
const char *p=yyextra->inputString;
char c;
int count=1;
- while ((c=*p))
- {
- p++ ;
- if (c=='\n') count++;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
}
- if (p>yyextra->inputString && *(p-1)!='\n')
+ if (p>yyextra->inputString && *(p-1)!='\n')
{ // last line does not end with a \n, so we add an extra
// line and explicitly terminate the line after parsing.
- count++,
- yyextra->needsTermination=TRUE;
- }
+ count++,
+ yyextra->needsTermination=TRUE;
+ }
return count;
}
@@ -3453,62 +3353,63 @@ static void writeObjCMethodCall(yyscan_t yyscanner,ObjCCallCtx *ctx)
if (!ctx->objectTypeOrName.isEmpty() && ctx->objectTypeOrName.at(0)!='$')
{
//printf("Looking for object=%s method=%s\n",ctx->objectTypeOrName.data(),
- // ctx->methodName.data());
- ClassDef *cd = yyextra->theVarContext.findVariable(ctx->objectTypeOrName);
- if (cd==0) // not a local variable
+ // ctx->methodName.data());
+ const ScopedTypeVariant *stv = yyextra->theVarContext.findVariable(ctx->objectTypeOrName);
+ if (stv==0) // not a local variable
{
- if (ctx->objectTypeOrName=="self")
- {
- if (yyextra->currentDefinition &&
- yyextra->currentDefinition->definitionType()==Definition::TypeClass)
- {
- ctx->objectType = dynamic_cast<ClassDef *>(yyextra->currentDefinition);
- }
- }
- else
- {
- ctx->objectType = getResolvedClass(
- yyextra->currentDefinition,
- yyextra->sourceFileDef,
- ctx->objectTypeOrName,
- &ctx->method);
- }
- //printf(" object is class? %p\n",ctx->objectType);
- if (ctx->objectType) // found class
- {
- ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
- //printf(" yes->method=%s\n",ctx->method?ctx->method->name().data():"<none>");
- }
- else if (ctx->method==0) // search for class variable with the same name
- {
- //printf(" no\n");
- //printf("yyextra->currentDefinition=%p\n",yyextra->currentDefinition);
- if (yyextra->currentDefinition &&
- yyextra->currentDefinition->definitionType()==Definition::TypeClass)
- {
- ctx->objectVar = (dynamic_cast<ClassDef *>(yyextra->currentDefinition))->getMemberByName(ctx->objectTypeOrName);
- //printf(" ctx->objectVar=%p\n",ctx->objectVar);
- if (ctx->objectVar)
- {
- ctx->objectType = stripClassName(yyscanner,ctx->objectVar->typeString(),yyextra->currentDefinition);
- //printf(" ctx->objectType=%p\n",ctx->objectType);
- if (ctx->objectType && !ctx->methodName.isEmpty())
- {
- ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
- //printf(" ctx->method=%p\n",ctx->method);
- }
- }
- }
- }
+ if (ctx->objectTypeOrName=="self")
+ {
+ if (yyextra->currentDefinition &&
+ yyextra->currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ctx->objectType = toClassDef(yyextra->currentDefinition);
+ }
+ }
+ else
+ {
+ ctx->objectType = yyextra->symbolResolver.resolveClass(yyextra->currentDefinition,ctx->objectTypeOrName);
+ ctx->method = yyextra->symbolResolver.getTypedef();
+ }
+ //printf(" object is class? %p\n",ctx->objectType);
+ if (ctx->objectType) // found class
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ //printf(" yes->method=%s\n",ctx->method?ctx->method->name().data():"<none>");
+ }
+ else if (ctx->method==0) // search for class variable with the same name
+ {
+ //printf(" no\n");
+ //printf("yyextra->currentDefinition=%p\n",yyextra->currentDefinition);
+ if (yyextra->currentDefinition &&
+ yyextra->currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ctx->objectVar = (toClassDef(yyextra->currentDefinition))->getMemberByName(ctx->objectTypeOrName);
+ //printf(" ctx->objectVar=%p\n",ctx->objectVar);
+ if (ctx->objectVar)
+ {
+ ctx->objectType = stripClassName(yyscanner,ctx->objectVar->typeString(),yyextra->currentDefinition);
+ //printf(" ctx->objectType=%p\n",ctx->objectType);
+ if (ctx->objectType && !ctx->methodName.isEmpty())
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ //printf(" ctx->method=%p\n",ctx->method);
+ }
+ }
+ }
+ }
}
else // local variable
{
- //printf(" object is local variable\n");
- if (cd!=VariableContext::dummyContext && !ctx->methodName.isEmpty())
- {
- ctx->method = cd->getMemberByName(ctx->methodName);
- //printf(" class=%p method=%p\n",cd,ctx->method);
- }
+ //printf(" object is local variable\n");
+ if (stv->globalDef() && !ctx->methodName.isEmpty())
+ {
+ const ClassDef *cd = toClassDef(stv->globalDef());
+ if (cd)
+ {
+ ctx->method = cd->getMemberByName(ctx->methodName);
+ }
+ //printf(" class=%p method=%p\n",cd,ctx->method);
+ }
}
}
}
@@ -3521,210 +3422,209 @@ static void writeObjCMethodCall(yyscan_t yyscanner,ObjCCallCtx *ctx)
char nc=*p++;
if (nc=='$') // escaped $
{
- yyextra->code->codify("$");
+ yyextra->code->codify("$");
}
- else // name fragment or reference to a nested call
+ else // name fragment or reference to a nested call
{
- if (nc=='n') // name fragment
- {
+ if (nc=='n') // name fragment
+ {
nc=*p++;
- QCString refIdStr;
- while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
- p--;
- int refId=refIdStr.toInt();
- QCString *pName = yyextra->nameDict.find(refId);
- if (pName)
- {
- if (ctx->method && ctx->method->isLinkable())
- {
- writeMultiLineCodeLink(yyscanner,*yyextra->code,ctx->method,pName->data());
- if (yyextra->currentMemberDef && yyextra->collectXRefs)
- {
- addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(ctx->method));
- }
- }
- else
- {
- codifyLines(yyscanner,pName->data());
- }
- }
- else
- {
- //printf("Invalid name: id=%d\n",refId);
- }
- }
- else if (nc=='o') // reference to potential object name
- {
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ auto it = yyextra->nameMap.find(refId);
+ if (it!=yyextra->nameMap.end())
+ {
+ QCString name = it->second;
+ if (ctx->method && ctx->method->isLinkable())
+ {
+ writeMultiLineCodeLink(yyscanner,*yyextra->code,ctx->method,name);
+ if (yyextra->currentMemberDef && yyextra->collectXRefs)
+ {
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(ctx->method));
+ }
+ }
+ else
+ {
+ codifyLines(yyscanner,name);
+ }
+ }
+ else
+ {
+ //printf("Invalid name: id=%d\n",refId);
+ }
+ }
+ else if (nc=='o') // reference to potential object name
+ {
nc=*p++;
- QCString refIdStr;
- while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
- p--;
- int refId=refIdStr.toInt();
- QCString *pObject = yyextra->objectDict.find(refId);
- if (pObject)
- {
- if (*pObject=="self")
- {
- if (yyextra->currentDefinition &&
- yyextra->currentDefinition->definitionType()==Definition::TypeClass)
- {
- ctx->objectType = dynamic_cast<ClassDef *>(yyextra->currentDefinition);
- if (ctx->objectType->categoryOf())
- {
- ctx->objectType = ctx->objectType->categoryOf();
- }
- if (ctx->objectType && !ctx->methodName.isEmpty())
- {
- ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
- }
- }
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,pObject->data());
- endFontClass(yyscanner);
- }
- else if (*pObject=="super")
- {
- if (yyextra->currentDefinition &&
- yyextra->currentDefinition->definitionType()==Definition::TypeClass)
- {
- ClassDef *cd = dynamic_cast<ClassDef *>(yyextra->currentDefinition);
- if (cd->categoryOf())
- {
- cd = cd->categoryOf();
- }
- BaseClassList *bcd = cd->baseClasses();
- if (bcd) // get direct base class (there should be only one)
- {
- BaseClassListIterator bli(*bcd);
- BaseClassDef *bclass;
- for (bli.toFirst();(bclass=bli.current());++bli)
- {
- if (bclass->classDef->compoundType()!=ClassDef::Protocol)
- {
- ctx->objectType = bclass->classDef;
- if (ctx->objectType && !ctx->methodName.isEmpty())
- {
- ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
- }
- }
- }
- }
- }
- startFontClass(yyscanner,"keyword");
- codifyLines(yyscanner,pObject->data());
- endFontClass(yyscanner);
- }
- else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
- {
- writeMultiLineCodeLink(yyscanner,*yyextra->code,ctx->objectVar,pObject->data());
- if (yyextra->currentMemberDef && yyextra->collectXRefs)
- {
- addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(ctx->objectVar));
- }
- }
- else if (ctx->objectType &&
- ctx->objectType!=VariableContext::dummyContext &&
- ctx->objectType->isLinkable()
- ) // object is class name
- {
- const ClassDef *cd = ctx->objectType;
- writeMultiLineCodeLink(yyscanner,*yyextra->code,cd,pObject->data());
- }
- else // object still needs to be resolved
- {
- const ClassDef *cd = getResolvedClass(yyextra->currentDefinition,
- yyextra->sourceFileDef, *pObject);
- if (cd && cd->isLinkable())
- {
- if (ctx->objectType==0) ctx->objectType=cd;
- writeMultiLineCodeLink(yyscanner,*yyextra->code,cd,pObject->data());
- }
- else
- {
- codifyLines(yyscanner,pObject->data());
- }
- }
- }
- else
- {
- //printf("Invalid object: id=%d\n",refId);
- }
- }
- else if (nc=='c') // reference to nested call
- {
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ auto it = yyextra->objectMap.find(refId);
+ if (it!=yyextra->objectMap.end())
+ {
+ QCString object = it->second;
+ if (object=="self")
+ {
+ if (yyextra->currentDefinition &&
+ yyextra->currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ctx->objectType = toClassDef(yyextra->currentDefinition);
+ if (ctx->objectType->categoryOf())
+ {
+ ctx->objectType = ctx->objectType->categoryOf();
+ }
+ if (ctx->objectType && !ctx->methodName.isEmpty())
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ }
+ }
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,object);
+ endFontClass(yyscanner);
+ }
+ else if (object=="super")
+ {
+ if (yyextra->currentDefinition &&
+ yyextra->currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ const ClassDef *cd = toClassDef(yyextra->currentDefinition);
+ if (cd->categoryOf())
+ {
+ cd = cd->categoryOf();
+ }
+ for (const auto &bclass : cd->baseClasses())
+ {
+ if (bclass.classDef->compoundType()!=ClassDef::Protocol)
+ {
+ ctx->objectType = bclass.classDef;
+ if (ctx->objectType && !ctx->methodName.isEmpty())
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ }
+ }
+ }
+ }
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,object);
+ endFontClass(yyscanner);
+ }
+ else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
+ {
+ writeMultiLineCodeLink(yyscanner,*yyextra->code,ctx->objectVar,object);
+ if (yyextra->currentMemberDef && yyextra->collectXRefs)
+ {
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(ctx->objectVar));
+ }
+ }
+ else if (ctx->objectType &&
+ ctx->objectType->isLinkable()
+ ) // object is class name
+ {
+ const ClassDef *cd = ctx->objectType;
+ writeMultiLineCodeLink(yyscanner,*yyextra->code,cd,object);
+ }
+ else // object still needs to be resolved
+ {
+ const ClassDef *cd = yyextra->symbolResolver.resolveClass(yyextra->currentDefinition, object);
+ if (cd && cd->isLinkable())
+ {
+ if (ctx->objectType==0) ctx->objectType=cd;
+ writeMultiLineCodeLink(yyscanner,*yyextra->code,cd,object);
+ }
+ else
+ {
+ codifyLines(yyscanner,object);
+ }
+ }
+ }
+ else
+ {
+ //printf("Invalid object: id=%d\n",refId);
+ }
+ }
+ else if (nc=='c') // reference to nested call
+ {
nc=*p++;
- QCString refIdStr;
- while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
- p--;
- int refId=refIdStr.toInt();
- ObjCCallCtx *ictx = yyextra->contextDict.find(refId);
- if (ictx) // recurse into nested call
- {
- writeObjCMethodCall(yyscanner,ictx);
- if (ictx->method) // link to nested call successfully
- {
- // get the ClassDef representing the method's return type
- if (QCString(ictx->method->typeString())=="id")
- {
- // see if the method name is unique, if so we link to it
- MemberName *mn=Doxygen::memberNameSDict->find(ctx->methodName);
- //printf("mn->count=%d ictx->method=%s ctx->methodName=%s\n",
- // mn==0?-1:(int)mn->count(),
- // ictx->method->name().data(),
- // ctx->methodName.data());
- if (mn && mn->count()==1) // member name unique
- {
- ctx->method = mn->getFirst();
- }
- }
- else
- {
- ctx->objectType = stripClassName(yyscanner,ictx->method->typeString(),yyextra->currentDefinition);
- if (ctx->objectType && !ctx->methodName.isEmpty())
- {
- ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
- }
- }
- //printf(" ***** method=%s -> object=%p\n",ictx->method->name().data(),ctx->objectType);
- }
- }
- else
- {
- //printf("Invalid context: id=%d\n",refId);
- }
- }
- else if (nc=='w') // some word
- {
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ auto it = yyextra->contextMap.find(refId);
+ if (it!=yyextra->contextMap.end()) // recurse into nested call
+ {
+ ObjCCallCtx *ictx = it->second.get();
+ writeObjCMethodCall(yyscanner,ictx);
+ if (ictx->method) // link to nested call successfully
+ {
+ // get the ClassDef representing the method's return type
+ if (QCString(ictx->method->typeString())=="id")
+ {
+ // see if the method name is unique, if so we link to it
+ MemberName *mn=Doxygen::memberNameLinkedMap->find(ctx->methodName);
+ //printf("mn->count=%d ictx->method=%s ctx->methodName=%s\n",
+ // mn==0?-1:(int)mn->count(),
+ // ictx->method->name().data(),
+ // ctx->methodName.data());
+ if (mn && mn->size()==1) // member name unique
+ {
+ ctx->method = mn->front().get();
+ }
+ }
+ else
+ {
+ ctx->objectType = stripClassName(yyscanner,ictx->method->typeString(),yyextra->currentDefinition);
+ if (ctx->objectType && !ctx->methodName.isEmpty())
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ }
+ }
+ //printf(" ***** method=%s -> object=%p\n",ictx->method->name().data(),ctx->objectType);
+ }
+ }
+ else
+ {
+ //printf("Invalid context: id=%d\n",refId);
+ }
+ }
+ else if (nc=='w') // some word
+ {
nc=*p++;
- QCString refIdStr;
- while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
- p--;
- int refId=refIdStr.toInt();
- QCString *pWord = yyextra->wordDict.find(refId);
- if (pWord)
- {
- codifyLines(yyscanner,pWord->data());
- }
- }
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ auto it = yyextra->wordMap.find(refId);
+ if (it!=yyextra->wordMap.end())
+ {
+ QCString word = it->second;
+ codifyLines(yyscanner,word);
+ }
+ }
else if (nc=='d') // comment block
{
nc=*p++;
- QCString refIdStr;
- while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
- p--;
- int refId=refIdStr.toInt();
- QCString *pComment = yyextra->commentDict.find(refId);
- if (pComment)
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ auto it = yyextra->commentMap.find(refId);
+ if (it!=yyextra->commentMap.end())
{
+ QCString comment = it->second;
startFontClass(yyscanner,"comment");
- codifyLines(yyscanner,pComment->data());
- endFontClass(yyscanner);
+ codifyLines(yyscanner,comment);
+ endFontClass(yyscanner);
}
}
- else // illegal marker
- {
- ASSERT(!"invalid escape sequence");
- }
+ else // illegal marker
+ {
+ ASSERT("invalid escape sequence"==0);
+ }
}
}
else // normal non-marker character
@@ -3741,14 +3641,14 @@ static void writeObjCMethodCall(yyscan_t yyscanner,ObjCCallCtx *ctx)
}
// Replaces an Objective-C method name fragment s by a marker of the form
-// $n12, the number (12) can later be used as a key for obtaining the name
-// fragment, from yyextra->nameDict
+// $n12, the number (12) can later be used as a key for obtaining the name
+// fragment, from yyextra->nameMap
static QCString escapeName(yyscan_t yyscanner,const char *s)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
QCString result;
result.sprintf("$n%d",yyextra->currentNameId);
- yyextra->nameDict.insert(yyextra->currentNameId,new QCString(s));
+ yyextra->nameMap.emplace(std::make_pair(yyextra->currentNameId,s));
yyextra->currentNameId++;
return result;
}
@@ -3758,7 +3658,7 @@ static QCString escapeObject(yyscan_t yyscanner,const char *s)
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
QCString result;
result.sprintf("$o%d",yyextra->currentObjId);
- yyextra->objectDict.insert(yyextra->currentObjId,new QCString(s));
+ yyextra->objectMap.emplace(std::make_pair(yyextra->currentObjId,s));
yyextra->currentObjId++;
return result;
}
@@ -3768,7 +3668,7 @@ static QCString escapeWord(yyscan_t yyscanner,const char *s)
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
QCString result;
result.sprintf("$w%d",yyextra->currentWordId);
- yyextra->wordDict.insert(yyextra->currentWordId,new QCString(s));
+ yyextra->wordMap.emplace(std::make_pair(yyextra->currentWordId,s));
yyextra->currentWordId++;
return result;
}
@@ -3778,7 +3678,7 @@ static QCString escapeComment(yyscan_t yyscanner,const char *s)
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
QCString result;
result.sprintf("$d%d",yyextra->currentCommentId);
- yyextra->commentDict.insert(yyextra->currentCommentId,new QCString(s));
+ yyextra->commentMap.emplace(std::make_pair(yyextra->currentCommentId,s));
yyextra->currentCommentId++;
return result;
}
@@ -3797,12 +3697,12 @@ static bool isCastKeyword(const QCString &s)
return kw=="const_cast" || kw=="static_cast" || kw=="dynamic_cast" || kw=="reinterpret_cast";
}
-static int yyread(yyscan_t yyscanner,char *buf,int max_size)
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- int inputPosition = yyextra->inputPosition;
- const char *s = yyextra->inputString + yyextra->inputPosition;
- int c=0;
+ yy_size_t inputPosition = yyextra->inputPosition;
+ const char *s = yyextra->inputString + inputPosition;
+ yy_size_t c=0;
while( c < max_size && *s )
{
*buf++ = *s++;
@@ -3830,7 +3730,7 @@ static void saveObjCContext(yyscan_t yyscanner)
{
//printf("Trying to save NULL context!\n");
}
- ObjCCallCtx *newCtx = new ObjCCallCtx;
+ auto newCtx = std::make_unique<ObjCCallCtx>();
newCtx->id = yyextra->currentCtxId;
newCtx->lexState = YY_START;
newCtx->braceCount = yyextra->braceCount;
@@ -3838,8 +3738,8 @@ static void saveObjCContext(yyscan_t yyscanner)
newCtx->objectVar = 0;
newCtx->method = 0;
//printf("save state=%d\n",YY_START);
- yyextra->contextDict.insert(yyextra->currentCtxId,newCtx);
- yyextra->currentCtx = newCtx;
+ yyextra->currentCtx = newCtx.get();
+ yyextra->contextMap.emplace(std::make_pair(yyextra->currentCtxId,std::move(newCtx)));
yyextra->braceCount = 0;
yyextra->currentCtxId++;
}
@@ -3850,9 +3750,10 @@ static void restoreObjCContext(yyscan_t yyscanner)
//printf("restore state=%d->%d\n",YY_START,yyextra->currentCtx->lexState);
BEGIN(yyextra->currentCtx->lexState);
yyextra->braceCount = yyextra->currentCtx->braceCount;
- if (!yyextra->contextStack.isEmpty())
+ if (!yyextra->contextStack.empty())
{
- yyextra->currentCtx = yyextra->contextStack.pop();
+ yyextra->currentCtx = yyextra->contextStack.top();
+ yyextra->contextStack.pop();
}
else
{
@@ -3873,14 +3774,11 @@ CCodeParser::CCodeParser() : p(std::make_unique<CCodeParser::Private>())
#ifdef FLEX_DEBUG
codeYYset_debug(1,p->yyscanner);
#endif
+ resetCodeParserState();
}
CCodeParser::~CCodeParser()
{
- struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
- yyextra->classScopeLengthStack.clear();
- delete yyextra->codeClassSDict;
- yyextra->codeClassSDict=0;
codeYYlex_destroy(p->yyscanner);
}
@@ -3888,22 +3786,17 @@ void CCodeParser::resetCodeParserState()
{
struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
//printf("***CodeParser::reset()\n");
- yyextra->forceTagReference.resize(0);
yyextra->theVarContext.clear();
- yyextra->classScopeLengthStack.setAutoDelete(TRUE);
- yyextra->classScopeLengthStack.clear();
- delete yyextra->codeClassSDict;
- yyextra->codeClassSDict = new ClassSDict(17);
- yyextra->codeClassSDict->setAutoDelete(TRUE);
- yyextra->codeClassSDict->clear();
+ while (!yyextra->classScopeLengthStack.empty()) yyextra->classScopeLengthStack.pop();
+ yyextra->codeClassMap.clear();
yyextra->curClassBases.clear();
yyextra->anchorCount = 0;
}
-void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const QCString &s,
+void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const QCString &s,
SrcLangExt lang,bool exBlock, const char *exName,FileDef *fd,
- int startLine,int endLine,bool inlineFragment,
- const MemberDef *memberDef,bool showLineNumbers,const Definition *searchCtx,
+ int startLine,int endLine,bool inlineFragment,
+ const MemberDef *memberDef,bool showLineNumbers,const Definition *searchCtx,
bool collectXRefs)
{
yyscan_t yyscanner = p->yyscanner;
@@ -3915,10 +3808,6 @@ void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const
printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
- if (yyextra->codeClassSDict==0)
- {
- resetCodeParserState();
- }
yyextra->code = &od;
yyextra->inputString = s;
yyextra->inputPosition = 0;
@@ -3928,6 +3817,7 @@ void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const
yyextra->searchCtx = searchCtx;
yyextra->collectXRefs = collectXRefs;
yyextra->inFunctionTryBlock = FALSE;
+ yyextra->symbolResolver.setFileScope(fd);
if (startLine!=-1)
yyextra->yyLineNr = startLine;
@@ -3945,10 +3835,10 @@ void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const
yyextra->sharpCount = 0;
yyextra->insideTemplate = FALSE;
yyextra->theCallContext.clear();
- yyextra->scopeStack.clear();
+ while (!yyextra->scopeStack.empty()) yyextra->scopeStack.pop();
yyextra->classScope = className;
//printf("parseCCode %s\n",className);
- yyextra->exampleBlock = exBlock;
+ yyextra->exampleBlock = exBlock;
yyextra->exampleName = exName;
yyextra->sourceFileDef = fd;
yyextra->lineNumbers = fd!=0 && showLineNumbers;
@@ -3961,7 +3851,7 @@ void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const
}
yyextra->lang = lang;
yyextra->insideObjC = lang==SrcLangExt_ObjC;
- if (yyextra->sourceFileDef)
+ if (yyextra->sourceFileDef)
{
setCurrentDoc(yyscanner,"l00001");
}
@@ -3999,9 +3889,13 @@ void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const
delete yyextra->sourceFileDef;
yyextra->sourceFileDef=0;
}
+ // write the tooltips
+ TooltipManager::instance().writeTooltips(od);
printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
return;
}
+#if USE_STATE2STRING
#include "code.l.h"
+#endif
diff --git a/src/commentcnv.l b/src/commentcnv.l
index f3367a4..b5f8e41 100644
--- a/src/commentcnv.l
+++ b/src/commentcnv.l
@@ -18,6 +18,9 @@
%option prefix="commentcnvYY"
%option reentrant
%option extra-type="struct commentcnvYY_state *"
+%top{
+#include <stdint.h>
+}
%{
@@ -45,6 +48,8 @@
#define ADDCHAR(c) yyextra->outBuf->addChar(c)
#define ADDARRAY(a,s) yyextra->outBuf->addArray(a,s)
+
+#define USE_STATE2STRING 0
struct CondCtx
{
@@ -66,7 +71,7 @@ struct commentcnvYY_state
{
BufStr * inBuf = 0;
BufStr * outBuf = 0;
- int inBufPos = 0;
+ yy_size_t inBufPos = 0;
int col = 0;
int blockHeadCol = 0;
bool mlBrief = FALSE;
@@ -99,7 +104,9 @@ struct commentcnvYY_state
bool isFixedForm = FALSE; // For Fortran
};
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
static inline int computeIndent(const char *s);
static void replaceCommentMarker(yyscan_t yyscanner,const char *s,int len);
@@ -108,7 +115,7 @@ static void startCondSection(yyscan_t yyscanner,const char *sectId);
static void endCondSection(yyscan_t yyscanner);
static void handleCondSectionId(yyscan_t yyscanner,const char *expression);
static void replaceAliases(yyscan_t yyscanner,const char *s);
-static int yyread(yyscan_t yyscanner,char *buf,int max_size);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
static void replaceComment(yyscan_t yyscanner,int offset);
@@ -135,12 +142,44 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
%x CondLine
%x ReadAliasArgs
+ //- start: NUMBER -------------------------------------------------------------------------
+ // Note same defines in code.l: keep in sync
+DECIMAL_INTEGER [1-9][0-9']*[0-9]?[uU]?[lL]?[lL]?
+HEXADECIMAL_INTEGER "0"[xX][0-9a-zA-Z']+[0-9a-zA-Z]?
+OCTAL_INTEGER "0"[0-7][0-7']+[0-7]?
+BINARY_INTEGER "0"[bB][01][01']*[01]?
+INTEGER_NUMBER {DECIMAL_INTEGER}|{HEXADECIMAL_INTEGER}|{OCTAL_INTEGER}|{BINARY_INTEGER}
+
+FP_SUF [fFlL]
+
+DIGIT_SEQ [0-9][0-9']*[0-9]?
+FRAC_CONST {DIGIT_SEQ}"."|{DIGIT_SEQ}?"."{DIGIT_SEQ}
+FP_EXP [eE][+-]?{DIGIT_SEQ}
+DEC_FP1 {FRAC_CONST}{FP_EXP}?{FP_SUF}?
+DEC_FP2 {DIGIT_SEQ}{FP_EXP}{FP_SUF}
+
+HEX_DIGIT_SEQ [0-9a-fA-F][0-9a-fA-F']*[0-9a-fA-F]?
+HEX_FRAC_CONST {HEX_DIGIT_SEQ}"."|{HEX_DIGIT_SEQ}?"."{HEX_DIGIT_SEQ}
+BIN_EXP [pP][+-]?{DIGIT_SEQ}
+HEX_FP1 "0"[xX]{HEX_FRAC_CONST}{BIN_EXP}{FP_SUF}?
+HEX_FP2 "0"[xX]{HEX_DIGIT_SEQ}{BIN_EXP}{FP_SUF}?
+
+FLOAT_DECIMAL {DEC_FP1}|{DEC_FP2}
+FLOAT_HEXADECIMAL {HEX_FP1}|{HEX_FP2}
+FLOAT_NUMBER {FLOAT_DECIMAL}|{FLOAT_HEXADECIMAL}
+NUMBER {INTEGER_NUMBER}|{FLOAT_NUMBER}
+ //- end: NUMBER ---------------------------------------------------------------------------
+
%%
-<Scan>[^"'!\/\n\\#,\-]* { /* eat anything that is not " / , or \n */
+<Scan>{NUMBER} { //Note similar code in code.l
+ if (yyextra->lang!=SrcLangExt_Cpp) REJECT;
+ copyToOutput(yyscanner,yytext,(int)yyleng);
+ }
+<Scan>[^"'!\/\n\\#,\-=; \t]* { /* eat anything that is not " / , or \n */
copyToOutput(yyscanner,yytext,(int)yyleng);
}
-<Scan>[,] { /* eat , so we have a nice separator in long initialization lines */
+<Scan>[,= ;\t] { /* eat , so we have a nice separator in long initialization lines */
copyToOutput(yyscanner,yytext,(int)yyleng);
}
<Scan>"\"\"\""! { /* start of python long comment */
@@ -284,7 +323,7 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
copyToOutput(yyscanner,yytext,(int)yyleng);
}
<Scan>"/*"[*!]? { /* start of a C comment */
- if ((yyextra->lang==SrcLangExt_Python) || (yyextra->lang==SrcLangExt_Tcl))
+ if (yyextra->lang==SrcLangExt_Python)
{
REJECT;
}
@@ -309,6 +348,16 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
yyextra->commentStack.push(new CommentCtx(yyextra->lineNr));
}
}
+<Scan>"--"[^!][^\n]* {
+ if (yyextra->lang!=SrcLangExt_VHDL)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yyscanner,yytext,(int)yyleng);
+ }
+ }
<Scan>"--!" {
if (yyextra->lang!=SrcLangExt_VHDL)
{
@@ -349,6 +398,17 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
yyextra->blockName=&yytext[1];
BEGIN(VerbatimCode);
}
+<CComment,ReadLine>^[ \t]*("```"[`]*|"~~~"[~]*) { /* start of markdown code block */
+ if (!Config_getBool(MARKDOWN_SUPPORT))
+ {
+ REJECT;
+ }
+ copyToOutput(yyscanner,yytext,(int)yyleng);
+ yyextra->lastCommentContext = YY_START;
+ yyextra->javaBlock=0;
+ yyextra->blockName=QCString(yytext).stripWhiteSpace().left(3);
+ BEGIN(VerbatimCode);
+ }
<CComment,ReadLine>[\\@]("dot"|"code"|"msc"|"startuml")/[^a-z_A-Z0-9] { /* start of a verbatim block */
copyToOutput(yyscanner,yytext,(int)yyleng);
yyextra->lastCommentContext = YY_START;
@@ -427,6 +487,13 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
}
}
}
+<VerbatimCode>("```"[`]*|"~~~"[~]*) { /* end of markdown code block */
+ copyToOutput(yyscanner,yytext,(int)yyleng);
+ if (yytext[0]==yyextra->blockName[0])
+ {
+ BEGIN(yyextra->lastCommentContext);
+ }
+ }
<VerbatimCode>[\\@]("enddot"|"endcode"|"endmsc"|"enduml") { /* end of verbatim block */
copyToOutput(yyscanner,yytext,(int)yyleng);
if (&yytext[4]==yyextra->blockName)
@@ -457,13 +524,13 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
}
}
}
-<Verbatim,VerbatimCode>[^@\/\\\n{}]* { /* any character not a backslash or new line or } */
+<Verbatim,VerbatimCode>[^`~@\/\\\n{}]* { /* any character not a backslash or new line or } */
copyToOutput(yyscanner,yytext,(int)yyleng);
}
<Verbatim,VerbatimCode>\n { /* new line in verbatim block */
copyToOutput(yyscanner,yytext,(int)yyleng);
}
-<Verbatim>^[ \t]*"///" {
+<Verbatim>^[ \t]*"//"[/!] {
if (yyextra->blockName=="dot" || yyextra->blockName=="msc" || yyextra->blockName=="uml" || yyextra->blockName.at(0)=='f')
{
// see bug 487871, strip /// from dot images and formulas.
@@ -484,7 +551,7 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
copyToOutput(yyscanner,yytext,(int)yyleng);
}
<SkipString>\\. { /* escaped character in string */
- if (yyextra->lang==SrcLangExt_Fortran)
+ if (yyextra->lang==SrcLangExt_Fortran || yyextra->lang==SrcLangExt_VHDL)
{
unput(yytext[1]);
copyToOutput(yyscanner,yytext,1);
@@ -505,7 +572,7 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
copyToOutput(yyscanner,yytext,(int)yyleng);
}
<SkipChar>\\. { /* escaped character */
- if (yyextra->lang==SrcLangExt_Fortran)
+ if (yyextra->lang==SrcLangExt_Fortran || yyextra->lang==SrcLangExt_VHDL)
{
unput(yytext[1]);
copyToOutput(yyscanner,yytext,1);
@@ -526,7 +593,7 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
copyToOutput(yyscanner,yytext,(int)yyleng);
}
-<CComment>[^ <\\!@*\n{\"\/]* { /* anything that is not a '*' or command */
+<CComment>[^ `~<\\!@*\n{\"\/]* { /* anything that is not a '*' or command */
copyToOutput(yyscanner,yytext,(int)yyleng);
}
<CComment>"*"+[^*/\\@\n{\"]* { /* stars without slashes */
@@ -546,7 +613,7 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
}
}
<CComment>\n { /* new line in comment */
- copyToOutput(yyscanner,yytext,(int)yyleng);
+ copyToOutput(yyscanner,yytext,(int)yyleng);
/* in case of Fortran always end of comment */
if (yyextra->lang==SrcLangExt_Fortran)
{
@@ -554,16 +621,18 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
}
}
<CComment>"/"+"*" { /* nested C comment */
- if ((yyextra->lang==SrcLangExt_Python) || (yyextra->lang==SrcLangExt_Tcl))
+ if (yyextra->lang==SrcLangExt_Python ||
+ yyextra->lang==SrcLangExt_Markdown)
{
REJECT;
}
yyextra->nestingCount++;
yyextra->commentStack.push(new CommentCtx(yyextra->lineNr));
- copyToOutput(yyscanner,yytext,(int)yyleng);
+ copyToOutput(yyscanner,yytext,(int)yyleng);
}
<CComment>"*"+"/" { /* end of C comment */
- if ((yyextra->lang==SrcLangExt_Python) || (yyextra->lang==SrcLangExt_Tcl))
+ if (yyextra->lang==SrcLangExt_Python ||
+ yyextra->lang==SrcLangExt_Markdown)
{
REJECT;
}
@@ -843,6 +912,9 @@ MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z
copyToOutput(yyscanner,yytext,(int)yyleng);
}
+<*>. {
+ copyToOutput(yyscanner,yytext,(int)yyleng);
+ }
%%
static void replaceCommentMarker(yyscan_t yyscanner,const char *s,int len)
@@ -1011,11 +1083,11 @@ static void replaceAliases(yyscan_t yyscanner,const char *s)
}
-static int yyread(yyscan_t yyscanner,char *buf,int max_size)
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- int bytesInBuf = yyextra->inBuf->curPos()-yyextra->inBufPos;
- int bytesToCopy = QMIN(max_size,bytesInBuf);
+ yy_size_t bytesInBuf = yyextra->inBuf->curPos()-yyextra->inBufPos;
+ yy_size_t bytesToCopy = QMIN(max_size,bytesInBuf);
memcpy(buf,yyextra->inBuf->data()+yyextra->inBufPos,bytesToCopy);
yyextra->inBufPos+=bytesToCopy;
return bytesToCopy;
@@ -1039,52 +1111,13 @@ static void replaceComment(yyscan_t yyscanner,int offset)
else
{
copyToOutput(yyscanner," */",3);
- int i;for (i=(int)yyleng-1;i>=0;i--) unput(yytext[i]);
+ for (i=(int)yyleng-1;i>=0;i--) unput(yytext[i]);
yyextra->inSpecialComment=FALSE;
BEGIN(Scan);
}
}
}
-// simplified way to know if this is fixed form
-// duplicate in fortrancode.l
-static bool recognizeFixedForm(const char* contents)
-{
- int column=0;
- bool skipLine=FALSE;
-
- for(int i=0;;i++) {
- column++;
-
- switch(contents[i]) {
- case '\n':
- column=0;
- skipLine=FALSE;
- break;
- case ' ':
- break;
- case '\000':
- return FALSE;
- case 'C':
- case 'c':
- case '*':
- if(column==1) return TRUE;
- if(skipLine) break;
- return FALSE;
- case '!':
- if(column>1 && column<7) return FALSE;
- skipLine=TRUE;
- break;
- default:
- if(skipLine) break;
- if(column==7) return TRUE;
- return FALSE;
- }
- }
- return FALSE;
-}
-
-
/*! This function does three things:
* -# It converts multi-line C++ style comment blocks (that are aligned)
* to C style comment blocks (if MULTILINE_CPP_IS_BRIEF is set to NO).
@@ -1121,7 +1154,8 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
yyextra->isFixedForm = FALSE;
if (yyextra->lang==SrcLangExt_Fortran)
{
- yyextra->isFixedForm = recognizeFixedForm(inBuf->data());
+ FortranFormat fmt = convertFileNameFortranParserCode(fileName);
+ yyextra->isFixedForm = recognizeFixedForm(inBuf->data(),fmt);
}
if (yyextra->lang==SrcLangExt_Markdown)
@@ -1143,7 +1177,7 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
warn(yyextra->fileName,ctx->lineNr,"Conditional section%sdoes not have "
"a corresponding \\endcond command within this file.",sectionInfo.data());
}
- if (yyextra->nestingCount>0 && yyextra->lang!=SrcLangExt_Markdown)
+ if (yyextra->nestingCount>0 && yyextra->lang!=SrcLangExt_Markdown && yyextra->lang!=SrcLangExt_Fortran)
{
QCString tmp= "(probable line reference: ";
bool first = TRUE;
@@ -1175,4 +1209,6 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
//----------------------------------------------------------------------------
+#if USE_STATE2STRING
#include "commentcnv.l.h"
+#endif
diff --git a/src/commentscan.h b/src/commentscan.h
index a0ad6d9..a111352 100644
--- a/src/commentscan.h
+++ b/src/commentscan.h
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -60,6 +60,7 @@ class CommentScanner
* @param[out] newEntryNeeded Boolean that is TRUE if the comment block parser
* finds that a the comment block finishes the entry and a new one
* needs to be started.
+ * @param[in] markdownEnabled Indicates if markdown specific processing should be done.
* @returns TRUE if the comment requires further processing. The
* parameter \a newEntryNeeded will typically be true in this case and
* \a position will indicate the offset inside the \a comment string
@@ -76,8 +77,16 @@ class CommentScanner
bool isInbody,
Protection &prot,
int &position,
- bool &newEntryNeeded
+ bool &newEntryNeeded,
+ bool markdownEnabled
);
+ void initGroupInfo(Entry *entry);
+ void enterFile(const char *fileName,int lineNr);
+ void leaveFile(const char *fileName,int lineNr);
+ void enterCompound(const char *fileName,int line,const char *name);
+ void leaveCompound(const char *fileName,int line,const char *name);
+ void open(Entry *e,const char *fileName,int line,bool implicit=false);
+ void close(Entry *e,const char *fileName,int line,bool foundInline,bool implicit=false);
private:
struct Private;
std::unique_ptr<Private> p;
diff --git a/src/commentscan.l b/src/commentscan.l
index 02117c2..767b964 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -1,10 +1,10 @@
/*****************************************************************************
*
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -17,44 +17,47 @@
%option prefix="commentscanYY"
%option reentrant
%option extra-type="struct commentscanYY_state *"
+%top{
+#include <stdint.h>
+}
%{
/*
- * includes
+ * includes
*/
+
+#include <map>
+#include <stack>
+#include <string>
+#include <mutex>
+
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
-#include <qarray.h>
-#include <qstack.h>
-#include <qregexp.h>
-#include <qfile.h>
+#include <qcstring.h>
#include <qcstringlist.h>
+
+#include "cite.h"
#include "commentscan.h"
-#include "scanner.h"
-#include "entry.h"
+#include "condparser.h"
+#include "config.h"
+#include "debug.h"
+#include "docgroup.h"
#include "doxygen.h"
+#include "entry.h"
+#include "formula.h"
+#include "language.h"
#include "message.h"
-#include "config.h"
+#include "parserintf.h"
+#include "reflist.h"
+#include "section.h"
#include "util.h"
-#include "index.h"
-#include "defargs.h"
-#include "language.h"
-#include "outputlist.h"
-#include "membergroup.h"
#include "reflist.h"
-#include "debug.h"
-#include "parserintf.h"
-#include "cite.h"
-#include "markdown.h"
-#include "condparser.h"
-#include "formula.h"
-#define YY_NO_INPUT 1
-#define YY_NO_UNISTD_H 1
+#define USE_STATE2STRING 0
// forward declarations
static bool handleBrief(yyscan_t yyscanner,const QCString &, const QCStringList &);
@@ -116,7 +119,6 @@ static bool handleHideReferencedByRelation(yyscan_t yyscanner,const QCString &,
static bool handleReferencesRelation(yyscan_t yyscanner,const QCString &, const QCStringList &);
static bool handleHideReferencesRelation(yyscan_t yyscanner,const QCString &, const QCStringList &);
static bool handleInternal(yyscan_t yyscanner,const QCString &, const QCStringList &);
-static bool handleLineBr(yyscan_t yyscanner,const QCString &, const QCStringList &);
static bool handleStatic(yyscan_t yyscanner,const QCString &, const QCStringList &);
static bool handlePure(yyscan_t yyscanner,const QCString &, const QCStringList &);
static bool handlePrivate(yyscan_t yyscanner,const QCString &, const QCStringList &);
@@ -136,223 +138,176 @@ static bool handleEndParBlock(yyscan_t yyscanner,const QCString &, const QCStrin
static bool handleParam(yyscan_t yyscanner,const QCString &, const QCStringList &);
static bool handleRetval(yyscan_t yyscanner,const QCString &, const QCStringList &);
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
typedef bool (*DocCmdFunc)(yyscan_t yyscanner,const QCString &name, const QCStringList &optList);
+enum class CommandSpacing
+{
+ Invisible, // command sets some property but does not appear in the output.
+ Inline, // command appears inline in the output which can be a brief description.
+ Block, // command starts a new paragraphs / ends a brief description.
+ XRef // command is a cross reference (todo, bug, test, xrefitem).
+};
+
struct DocCmdMap
{
- const char *cmdName;
+ DocCmdMap(DocCmdFunc h,CommandSpacing s) : handler(h), spacing(s) {}
DocCmdFunc handler;
- bool endsBrief;
+ CommandSpacing spacing;
};
// map of command to handler function
-static DocCmdMap docCmdMap[] =
-{
- // command name handler function ends brief description
- { "brief", &handleBrief, FALSE },
- { "short", &handleBrief, FALSE },
- { "fn", &handleFn, TRUE },
- { "var", &handleFn, TRUE },
- { "typedef", &handleFn, TRUE },
- { "property", &handleFn, TRUE },
- { "def", &handleDef, TRUE },
- { "overload", &handleOverload, FALSE },
- { "enum", &handleEnum, TRUE },
- { "defgroup", &handleDefGroup, TRUE },
- { "addtogroup", &handleAddToGroup, TRUE },
- { "weakgroup", &handleWeakGroup, TRUE },
- { "namespace", &handleNamespace, TRUE },
- { "package", &handlePackage, TRUE },
- { "class", &handleClass, TRUE },
- { "headerfile", &handleHeaderFile, FALSE },
- { "protocol", &handleProtocol, TRUE },
- { "category", &handleCategory, TRUE },
- { "union", &handleUnion, TRUE },
- { "struct", &handleStruct, TRUE },
- { "interface", &handleInterface, TRUE },
- { "idlexcept", &handleIdlException, TRUE },
- { "page", &handlePage, TRUE },
- { "mainpage", &handleMainpage, TRUE },
- { "file", &handleFile, TRUE },
- { "dir", &handleDir, TRUE },
- { "example", &handleExample, FALSE },
- { "details", &handleDetails, TRUE },
- { "name", &handleName, FALSE },
- { "todo", &handleTodo, FALSE }, // end brief will be done differently
- { "test", &handleTest, FALSE }, // end brief will be done differently
- { "bug", &handleBug, FALSE }, // end brief will be done differently
- { "deprecated", &handleDeprecated, FALSE }, // end brief will be done differently
- { "xrefitem", &handleXRefItem, FALSE }, // end brief will be done differently
- { "related", &handleRelated, TRUE },
- { "relates", &handleRelated, TRUE },
- { "relatedalso", &handleRelatedAlso, TRUE },
- { "relatesalso", &handleRelatedAlso, TRUE },
- { "parblock", &handleParBlock, TRUE },
- { "endparblock", &handleEndParBlock, TRUE },
- { "refitem", &handleRefItem, TRUE },
- { "cite", &handleCite, FALSE },
- { "subpage", &handleSubpage, TRUE },
- { "section", &handleSection, TRUE },
- { "subsection", &handleSection, TRUE },
- { "subsubsection", &handleSection, TRUE },
- { "paragraph", &handleSection, TRUE },
- { "anchor", &handleAnchor, TRUE },
- { "verbatim", &handleFormatBlock, TRUE },
- { "latexonly", &handleFormatBlock, FALSE },
- { "htmlonly", &handleFormatBlock, FALSE },
- { "xmlonly", &handleFormatBlock, FALSE },
- { "docbookonly", &handleFormatBlock, FALSE },
- { "rtfonly", &handleFormatBlock, FALSE },
- { "manonly", &handleFormatBlock, FALSE },
- { "dot", &handleFormatBlock, TRUE },
- { "msc", &handleFormatBlock, TRUE },
- { "startuml", &handleFormatBlock, TRUE },
- { "code", &handleFormatBlock, TRUE },
- { "addindex", &handleAddIndex, FALSE },
- { "if", &handleIf, FALSE },
- { "ifnot", &handleIfNot, FALSE },
- { "elseif", &handleElseIf, FALSE },
- { "else", &handleElse, FALSE },
- { "endif", &handleEndIf, FALSE },
- { "ingroup", &handleIngroup, TRUE },
- { "nosubgrouping", &handleNoSubGrouping, FALSE },
- { "showinitializer", &handleShowInitializer, FALSE },
- { "hideinitializer", &handleHideInitializer, FALSE },
- { "callgraph", &handleCallgraph, FALSE },
- { "hidecallgraph", &handleHideCallgraph, FALSE },
- { "callergraph", &handleCallergraph, FALSE },
- { "hidecallergraph", &handleHideCallergraph, FALSE },
- { "showrefby", &handleReferencedByRelation, FALSE },
- { "hiderefby", &handleHideReferencedByRelation, FALSE },
- { "showrefs", &handleReferencesRelation, FALSE },
- { "hiderefs", &handleHideReferencesRelation, FALSE },
- { "internal", &handleInternal, TRUE },
- { "_linebr", &handleLineBr, FALSE },
- { "static", &handleStatic, FALSE },
- { "pure", &handlePure, FALSE },
- { "private", &handlePrivate, FALSE },
- { "privatesection", &handlePrivateSection, FALSE },
- { "protected", &handleProtected, FALSE },
- { "protectedsection",&handleProtectedSection, FALSE },
- { "public", &handlePublic, FALSE },
- { "publicsection", &handlePublicSection, FALSE },
- { "tableofcontents", &handleToc, FALSE },
- { "inherit", &handleInherit, TRUE },
- { "extends", &handleExtends, TRUE },
- { "implements", &handleExtends, TRUE },
- { "memberof", &handleMemberOf, TRUE },
- { "arg", 0, TRUE },
- { "attention", 0, TRUE },
- { "author", 0, TRUE },
- { "authors", 0, TRUE },
- { "copydoc", &handleCopyDoc, TRUE },
- { "copybrief", &handleCopyBrief, FALSE },
- { "copydetails", &handleCopyDetails, TRUE },
- { "copyright", 0, TRUE },
- { "date", 0, TRUE },
- { "dotfile", 0, TRUE },
- { "htmlinclude", 0, FALSE },
- { "image", 0, TRUE },
- { "include", 0, TRUE },
- { "includelineno", 0, TRUE },
- { "invariant", 0, TRUE },
- { "latexinclude", 0, FALSE },
- { "li", 0, TRUE },
- { "line", 0, TRUE },
- { "note", 0, TRUE },
- { "par", 0, TRUE },
- { "param", &handleParam, TRUE },
- { "tparam", 0, TRUE },
- { "post", 0, TRUE },
- { "pre", 0, TRUE },
- { "remark", 0, TRUE },
- { "remarks", 0, TRUE },
- { "result", 0, TRUE },
- { "return", 0, TRUE },
- { "returns", 0, TRUE },
- { "exception", 0, TRUE },
- { "retval", &handleRetval, TRUE },
- { "sa", 0, TRUE },
- { "see", 0, TRUE },
- { "since", 0, TRUE },
- { "throw", 0, TRUE },
- { "throws", 0, TRUE },
- { "until", 0, TRUE },
- { "verbinclude", 0, FALSE },
- { "version", 0, TRUE },
- { "warning", 0, TRUE },
- { "snippet", 0, TRUE },
- { "snippetlineno", 0, TRUE },
- { "noop", &handleNoop, TRUE },
- { 0, 0, FALSE }
+static const std::map< std::string, DocCmdMap > docCmdMap =
+{
+ // command name handler function command spacing
+ { "addindex", { &handleAddIndex, CommandSpacing::Invisible }},
+ { "addtogroup", { &handleAddToGroup, CommandSpacing::Invisible }},
+ { "anchor", { &handleAnchor, CommandSpacing::Invisible }},
+ { "arg", { 0, CommandSpacing::Block }},
+ { "attention", { 0, CommandSpacing::Block }},
+ { "author", { 0, CommandSpacing::Block }},
+ { "authors", { 0, CommandSpacing::Block }},
+ { "brief", { &handleBrief, CommandSpacing::Invisible }},
+ { "bug", { &handleBug, CommandSpacing::XRef }},
+ { "callergraph", { &handleCallergraph, CommandSpacing::Invisible }},
+ { "callgraph", { &handleCallgraph, CommandSpacing::Invisible }},
+ { "category", { &handleCategory, CommandSpacing::Invisible }},
+ { "cite", { &handleCite, CommandSpacing::Inline }},
+ { "class", { &handleClass, CommandSpacing::Invisible }},
+ { "code", { &handleFormatBlock, CommandSpacing::Block }},
+ { "copybrief", { &handleCopyBrief, CommandSpacing::Invisible }},
+ { "copydetails", { &handleCopyDetails, CommandSpacing::Block }},
+ { "copydoc", { &handleCopyDoc, CommandSpacing::Block }},
+ { "copyright", { 0, CommandSpacing::Block }},
+ { "date", { 0, CommandSpacing::Block }},
+ { "def", { &handleDef, CommandSpacing::Invisible }},
+ { "defgroup", { &handleDefGroup, CommandSpacing::Invisible }},
+ { "deprecated", { &handleDeprecated, CommandSpacing::XRef }},
+ { "details", { &handleDetails, CommandSpacing::Block }},
+ { "dir", { &handleDir, CommandSpacing::Invisible }},
+ { "docbookinclude", { 0, CommandSpacing::Inline }},
+ { "docbookonly", { &handleFormatBlock, CommandSpacing::Invisible }},
+ { "dot", { &handleFormatBlock, CommandSpacing::Block }},
+ { "dotfile", { 0, CommandSpacing::Block }},
+ { "else", { &handleElse, CommandSpacing::Inline }},
+ { "elseif", { &handleElseIf, CommandSpacing::Inline }},
+ { "endif", { &handleEndIf, CommandSpacing::Inline }},
+ { "endparblock", { &handleEndParBlock, CommandSpacing::Block }},
+ { "enum", { &handleEnum, CommandSpacing::Invisible }},
+ { "example", { &handleExample, CommandSpacing::Invisible }},
+ { "exception", { 0, CommandSpacing::Block }},
+ { "extends", { &handleExtends, CommandSpacing::Invisible }},
+ { "file", { &handleFile, CommandSpacing::Invisible }},
+ { "fn", { &handleFn, CommandSpacing::Invisible }},
+ { "headerfile", { &handleHeaderFile, CommandSpacing::Invisible }},
+ { "hidecallergraph", { &handleHideCallergraph, CommandSpacing::Invisible }},
+ { "hidecallgraph", { &handleHideCallgraph, CommandSpacing::Invisible }},
+ { "hideinitializer", { &handleHideInitializer, CommandSpacing::Invisible }},
+ { "hiderefby", { &handleHideReferencedByRelation, CommandSpacing::Invisible }},
+ { "hiderefs", { &handleHideReferencesRelation, CommandSpacing::Invisible }},
+ { "htmlinclude", { 0, CommandSpacing::Inline }},
+ { "htmlonly", { &handleFormatBlock, CommandSpacing::Invisible }},
+ { "idlexcept", { &handleIdlException, CommandSpacing::Invisible }},
+ { "if", { &handleIf, CommandSpacing::Inline }},
+ { "ifnot", { &handleIfNot, CommandSpacing::Inline }},
+ { "image", { 0, CommandSpacing::Block }},
+ { "implements", { &handleExtends, CommandSpacing::Invisible }},
+ { "include", { 0, CommandSpacing::Block }},
+ { "includelineno", { 0, CommandSpacing::Block }},
+ { "ingroup", { &handleIngroup, CommandSpacing::Invisible }},
+ { "inherit", { &handleInherit, CommandSpacing::Invisible }},
+ { "interface", { &handleInterface, CommandSpacing::Invisible }},
+ { "internal", { &handleInternal, CommandSpacing::Block }},
+ { "invariant", { 0, CommandSpacing::Block }},
+ { "latexinclude", { 0, CommandSpacing::Inline }},
+ { "latexonly", { &handleFormatBlock, CommandSpacing::Invisible }},
+ { "li", { 0, CommandSpacing::Block }},
+ { "line", { 0, CommandSpacing::Invisible }},
+ { "mainpage", { &handleMainpage, CommandSpacing::Invisible }},
+ { "maninclude", { 0, CommandSpacing::Inline }},
+ { "manonly", { &handleFormatBlock, CommandSpacing::Invisible }},
+ { "memberof", { &handleMemberOf, CommandSpacing::Invisible }},
+ { "msc", { &handleFormatBlock, CommandSpacing::Block }},
+ { "name", { &handleName, CommandSpacing::Invisible }},
+ { "namespace", { &handleNamespace, CommandSpacing::Invisible }},
+ { "noop", { &handleNoop, CommandSpacing::Invisible }},
+ { "nosubgrouping", { &handleNoSubGrouping, CommandSpacing::Invisible }},
+ { "note", { 0, CommandSpacing::Block }},
+ { "overload", { &handleOverload, CommandSpacing::Invisible }},
+ { "package", { &handlePackage, CommandSpacing::Invisible }},
+ { "page", { &handlePage, CommandSpacing::Invisible }},
+ { "par", { 0, CommandSpacing::Block }},
+ { "paragraph", { &handleSection, CommandSpacing::Block }},
+ { "param", { &handleParam, CommandSpacing::Block }},
+ { "parblock", { &handleParBlock, CommandSpacing::Block }},
+ { "post", { 0, CommandSpacing::Block }},
+ { "pre", { 0, CommandSpacing::Block }},
+ { "private", { &handlePrivate, CommandSpacing::Invisible }},
+ { "privatesection", { &handlePrivateSection, CommandSpacing::Invisible }},
+ { "property", { &handleFn, CommandSpacing::Invisible }},
+ { "protected", { &handleProtected, CommandSpacing::Invisible }},
+ { "protectedsection",{ &handleProtectedSection, CommandSpacing::Invisible }},
+ { "protocol", { &handleProtocol, CommandSpacing::Invisible }},
+ { "public", { &handlePublic, CommandSpacing::Invisible }},
+ { "publicsection", { &handlePublicSection, CommandSpacing::Invisible }},
+ { "pure", { &handlePure, CommandSpacing::Invisible }},
+ { "refitem", { &handleRefItem, CommandSpacing::Inline }},
+ { "related", { &handleRelated, CommandSpacing::Invisible }},
+ { "relatedalso", { &handleRelatedAlso, CommandSpacing::Invisible }},
+ { "relates", { &handleRelated, CommandSpacing::Invisible }},
+ { "relatesalso", { &handleRelatedAlso, CommandSpacing::Invisible }},
+ { "remark", { 0, CommandSpacing::Block }},
+ { "remarks", { 0, CommandSpacing::Block }},
+ { "result", { 0, CommandSpacing::Block }},
+ { "return", { 0, CommandSpacing::Block }},
+ { "returns", { 0, CommandSpacing::Block }},
+ { "retval", { &handleRetval, CommandSpacing::Block }},
+ { "rtfinclude", { 0, CommandSpacing::Inline }},
+ { "rtfonly", { &handleFormatBlock, CommandSpacing::Invisible }},
+ { "sa", { 0, CommandSpacing::Block }},
+ { "section", { &handleSection, CommandSpacing::Block }},
+ { "see", { 0, CommandSpacing::Block }},
+ { "short", { &handleBrief, CommandSpacing::Invisible }},
+ { "showinitializer", { &handleShowInitializer, CommandSpacing::Invisible }},
+ { "showrefby", { &handleReferencedByRelation, CommandSpacing::Invisible }},
+ { "showrefs", { &handleReferencesRelation, CommandSpacing::Invisible }},
+ { "since", { 0, CommandSpacing::Block }},
+ { "snippet", { 0, CommandSpacing::Block }},
+ { "snippetlineno", { 0, CommandSpacing::Block }},
+ { "startuml", { &handleFormatBlock, CommandSpacing::Block }},
+ { "static", { &handleStatic, CommandSpacing::Invisible }},
+ { "struct", { &handleStruct, CommandSpacing::Invisible }},
+ { "subpage", { &handleSubpage, CommandSpacing::Inline }},
+ { "subsection", { &handleSection, CommandSpacing::Block }},
+ { "subsubsection", { &handleSection, CommandSpacing::Block }},
+ { "tableofcontents", { &handleToc, CommandSpacing::Invisible }},
+ { "test", { &handleTest, CommandSpacing::XRef }},
+ { "throw", { 0, CommandSpacing::Block }},
+ { "throws", { 0, CommandSpacing::Block }},
+ { "todo", { &handleTodo, CommandSpacing::XRef }},
+ { "tparam", { 0, CommandSpacing::Block }},
+ { "typedef", { &handleFn, CommandSpacing::Invisible }},
+ { "union", { &handleUnion, CommandSpacing::Invisible }},
+ { "until", { 0, CommandSpacing::Block }},
+ { "var", { &handleFn, CommandSpacing::Invisible }},
+ { "verbatim", { &handleFormatBlock, CommandSpacing::Block }},
+ { "verbinclude", { 0, CommandSpacing::Inline }},
+ { "version", { 0, CommandSpacing::Block }},
+ { "warning", { 0, CommandSpacing::Block }},
+ { "weakgroup", { &handleWeakGroup, CommandSpacing::Invisible }},
+ { "xmlinclude", { 0, CommandSpacing::Inline }},
+ { "xmlonly", { &handleFormatBlock, CommandSpacing::Invisible }},
+ { "xrefitem", { &handleXRefItem, CommandSpacing::XRef }}
};
-/** @brief Command mapper.
- *
- * Maps a command name (as found in a comment block) onto a
- * specific handler function.
- */
-class DocCmdMapper
-{
- public:
- struct Cmd
- {
- DocCmdFunc func;
- bool endsBrief;
- };
-
- /** maps a command name to a handler function */
- static Cmd *map(const char *name)
- {
- return instance()->find(name);
- }
-
- /** release the singleton */
- static void freeInstance()
- {
- delete s_instance; s_instance=0;
- }
-
- private:
- static DocCmdMapper *instance()
- {
- if (s_instance==0) s_instance = new DocCmdMapper;
- return s_instance;
- }
-
- DocCmdMapper() : m_map(113)
- {
- m_map.setAutoDelete(TRUE);
- DocCmdMap *p = docCmdMap;
- while (p->cmdName)
- {
- if (m_map.find(p->cmdName)!=0)
- {
- term("DocCmdMapper: command %s already added\n",p->cmdName);
- }
- Cmd *cmd = new Cmd;
- cmd->func = p->handler;
- cmd->endsBrief = p->endsBrief;
- m_map.insert(p->cmdName,cmd);
- p++;
- }
- }
-
- Cmd *find(const char *name)
- {
- return m_map.find(name);
- }
- QDict<Cmd> m_map;
- static DocCmdMapper *s_instance;
-};
-
-DocCmdMapper *DocCmdMapper::s_instance=0;
-
-
+#define YY_NO_INPUT 1
+#define YY_NO_UNISTD_H 1
#define YY_NEVER_INTERACTIVE 1
+
enum XRefKind
{
XRef_Item,
@@ -381,11 +336,11 @@ enum GuardType
class GuardedSection
{
public:
- GuardedSection(bool enabled,bool parentVisible)
+ GuardedSection(bool enabled,bool parentVisible)
: m_enabled(enabled),m_parentVisible(parentVisible) {}
bool isEnabled() const { return m_enabled; }
bool parentVisible() const { return m_parentVisible; }
-
+
private:
bool m_enabled;
bool m_parentVisible;
@@ -393,13 +348,14 @@ class GuardedSection
/* -----------------------------------------------------------------
*
- * statics
+ * statics
*/
struct commentscanYY_state
{
OutlineParserInterface *langParser = 0; // the language parser that is calling us
QCString inputString; // input string
+ QCString currentCmd; // the command used
int inputPosition = 0; // read pointer
QCString fileName; // file name that is read from
int lineNr = 0; // line number in the input
@@ -417,7 +373,7 @@ struct commentscanYY_state
GuardType guardType = Guard_If; // kind of guards for conditional section
bool enabledSectionFound = FALSE;
QCString functionProto; // function prototype
- QStack<GuardedSection> guards; // tracks nested conditional sections (if,ifnot,..)
+ std::stack<GuardedSection> guards; // tracks nested conditional sections (if,ifnot,..)
Entry *current = 0; // working entry
bool needNewEntry = FALSE;
@@ -449,19 +405,25 @@ struct commentscanYY_state
bool insideParBlock = FALSE;
bool inInternalDocs = FALSE;
int prevPosition = 0;
+ DocGroup docGroup;
+ bool markdownSupport = TRUE;
};
+
+static std::mutex g_sectionMutex;
+static std::mutex g_formulaMutex;
+static std::mutex g_citeMutex;
+
//-----------------------------------------------------------------------------
static QCString stripQuotes(const char *s);
static bool getDocSectionName(int s);
-static SectionInfo::SectionType sectionLevelToType(int level);
+static SectionType sectionLevelToType(int level);
static void stripTrailingWhiteSpace(QCString &s);
static void initParser(yyscan_t yyscanner);
static bool makeStructuralIndicator(yyscan_t yyscanner,Entry::Sections s);
static void lineCount(yyscan_t yyscanner);
-static QCString stripQuotes(yyscan_t yyscanner,const char *s);
static void addXRefItem(yyscan_t yyscanner,
const char *listName,const char *itemTitle,
const char *listTitle,bool append);
@@ -474,38 +436,27 @@ static inline void addOutput(yyscan_t yyscanner,const char *s);
static inline void addOutput(yyscan_t yyscanner,char c);
static void endBrief(yyscan_t yyscanner,bool addToOutput=TRUE);
static void handleGuard(yyscan_t yyscanner,const QCString &expr);
-static int yyread(yyscan_t yyscanner,char *buf,int max_size);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
static void addCite(yyscan_t yyscanner);
-//-----------------------------------------------------------------------------
+#define unput_string(yytext,yyleng) do { for (int i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); } while(0)
+//-----------------------------------------------------------------------------
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
%}
/* start command character */
-CMD ("\\"|"@")
-DCMD1 ("arg"|"attention"|"author"|"cite"|"code")
-DCMD2 ("date"|"dot"|"msc"|"dotfile"|"example"|"startuml")
-DCMD3 ("htmlinclude"|"htmlonly"|"image"|"include")
-DCMD4 ("includelineno"|"internal"|"invariant")
-DCMD5 ("latexinclude"|"latexonly"|"li"|"line"|"manonly"|"name")
-DCMD6 ("note"|"par"|"paragraph"|"param"|"post")
-DCMD7 ("pre"|"remarks"|(("relate"[sd])("also")?))
-DCMD8 ("remarks"|("return"[s]?)|"retval"|"sa"|"section")
-DCMD9 ("see"|"since"|"subsection"|"subsubsection")
-DCMD10 ("throw"|"until"|"verbatim")
-DCMD11 ("verbinclude"|"version"|"warning")
-DETAILEDCMD {CMD}({DCMD1}|{DCMD2}|{DCMD3}|{DCMD4}|{DCMD5}|{DCMD6}|{DCMD7}|{DCMD8}|{DCMD9}|{DCMD10}|{DCMD11})
-XREFCMD {CMD}("bug"|"deprecated"|"test"|"todo"|"xrefitem")
+CMD ("\\"|"@")
+XREFCMD {CMD}("bug"|"deprecated"|"test"|"todo"|"xrefitem")
PRE [pP][rR][eE]
-TABLE [tT][aA][bB][lL][eE]
-P [pP]
+TABLE [tT][aA][bB][lL][eE]
+P [pP]
UL [uU][lL]
-OL [oO][lL]
-DL [dD][lL]
+OL [oO][lL]
+DL [dD][lL]
IMG [iI][mM][gG]
HR [hH][rR]
PARA [pP][aA][rR][aA]
@@ -516,13 +467,13 @@ DIV [dD][iI][vV]
DETAILEDHTML {CENTER}|{DIV}|{PRE}|{UL}|{TABLE}|{OL}|{DL}|{P}|[Hh][1-6]|{IMG}|{HR}|{PARA}
DETAILEDHTMLOPT {CODE}
BN [ \t\n\r]
-BL [ \t\r]*"\n"
+BL [ \t\r]*"\n"
B [ \t]
BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
ATTR ({B}+[^>\n]*)?
-DOCNL "\n"|"\\_linebr"
+DOCNL "\n"|"\\ilinebr"
LC "\\"{B}*"\n"
-NW [^a-z_A-Z0-9]
+NW [^a-z_A-Z0-9]
FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+@&#]
FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#]
FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"")
@@ -534,7 +485,7 @@ CITEID {CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)*|"\""{CITESCHAR}{C
SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME "$"?(({ID}?{BN}*("::"|"."){BN}*)*)((~{BN}*)?{ID})
TMPLSPEC "<"{BN}*[^>]+{BN}*">"
-MAILADDR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
+MAILADDR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
RCSTAG "$"{ID}":"[^\n$]+"$"
%option noyywrap
@@ -553,34 +504,34 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
%x XRefItemParam3
%x FileDocArg1
%x ParamArg1
-%x EnumDocArg1
-%x NameSpaceDocArg1
-%x PackageDocArg1
-%x GroupDocArg1
-%x GroupDocArg2
-%x SectionLabel
-%x SectionTitle
-%x SubpageLabel
-%x SubpageTitle
-%x FormatBlock
-%x LineParam
-%x GuardParam
-%x GuardParamEnd
-%x SkipGuardedSection
-%x SkipInternal
+%x EnumDocArg1
+%x NameSpaceDocArg1
+%x PackageDocArg1
+%x GroupDocArg1
+%x GroupDocArg2
+%x SectionLabel
+%x SectionTitle
+%x SubpageLabel
+%x SubpageTitle
+%x FormatBlock
+%x LineParam
+%x GuardParam
+%x GuardParamEnd
+%x SkipGuardedSection
+%x SkipInternal
%x NameParam
-%x InGroupParam
-%x FnParam
-%x OverloadParam
-%x InheritParam
-%x ExtendsParam
+%x InGroupParam
+%x FnParam
+%x OverloadParam
+%x InheritParam
+%x ExtendsParam
%x ReadFormulaShort
-%x ReadFormulaLong
-%x AnchorLabel
+%x ReadFormulaLong
+%x AnchorLabel
%x HtmlComment
%x SkipLang
-%x CiteLabel
-%x CopyDoc
+%x CiteLabel
+%x CopyDoc
%x GuardExpr
%x CdataSection
%x Noop
@@ -604,52 +555,52 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
* XML commands, <summary></summary><remarks></remarks>
*/
-<Comment>{CMD}{CMD}[a-z_A-Z]+{B}* { // escaped command
- addOutput(yyscanner,yytext);
- }
-<Comment>{CMD}{CMD}"~"[a-z_A-Z]* { // escaped command
- addOutput(yyscanner,yytext);
- }
-<Comment>{MAILADDR} { // mail address
- addOutput(yyscanner,yytext);
- }
-<Comment>"\""[^"\n]*"\"" { // quoted text
+<Comment>{CMD}{CMD}[a-z_A-Z]+{B}* { // escaped command
+ addOutput(yyscanner,yytext);
+ }
+<Comment>{CMD}{CMD}"~"[a-z_A-Z]* { // escaped command
addOutput(yyscanner,yytext);
- }
-<Comment>("\\"[a-z_A-Z]+)+"\\" { // directory (or chain of commands!)
- addOutput(yyscanner,yytext);
- }
-<Comment>"<"{DETAILEDHTML}{ATTR}">" { // HTML command that ends a brief description
- setOutput(yyscanner,OutputDoc);
- // continue with the same input
+ }
+<Comment>{MAILADDR} { // mail address
+ addOutput(yyscanner,yytext);
+ }
+<Comment>"\""[^"\n]*"\"" { // quoted text
+ addOutput(yyscanner,yytext);
+ }
+<Comment>("\\"[a-z_A-Z]+)+"\\" { // directory (or chain of commands!)
+ addOutput(yyscanner,yytext);
+ }
+<Comment>"<"{DETAILEDHTML}{ATTR}">" { // HTML command that ends a brief description
+ setOutput(yyscanner,OutputDoc);
+ // continue with the same input
REJECT;
- }
-<Comment>"<"{DETAILEDHTMLOPT}{ATTR}">" { // HTML command that ends a brief description
- if (yyextra->current->lang==SrcLangExt_CSharp)
+ }
+<Comment>"<"{DETAILEDHTMLOPT}{ATTR}">" { // HTML command that ends a brief description
+ if (yyextra->current->lang==SrcLangExt_CSharp)
{
setOutput(yyscanner,OutputDoc);
}
- // continue with the same input
+ // continue with the same input
REJECT;
- }
-<Comment>"<summary>" { // start of a .NET XML style brief description
- setOutput(yyscanner,OutputBrief);
+ }
+<Comment>"<summary>" { // start of a .NET XML style brief description
+ setOutput(yyscanner,OutputBrief);
addOutput(yyscanner,yytext);
- }
-<Comment>"<remarks>" { // start of a .NET XML style detailed description
- setOutput(yyscanner,OutputDoc);
+ }
+<Comment>"<remarks>" { // start of a .NET XML style detailed description
+ setOutput(yyscanner,OutputDoc);
addOutput(yyscanner,yytext);
- }
-<Comment>"</summary>" { // start of a .NET XML style detailed description
- setOutput(yyscanner,OutputBrief);
+ }
+<Comment>"</summary>" { // start of a .NET XML style detailed description
+ setOutput(yyscanner,OutputBrief);
addOutput(yyscanner,yytext);
- setOutput(yyscanner,OutputDoc);
- }
-<Comment>"</remarks>" { // end of a brief or detailed description
-
- setOutput(yyscanner,OutputDoc);
+ setOutput(yyscanner,OutputDoc);
+ }
+<Comment>"</remarks>" { // end of a brief or detailed description
+
+ setOutput(yyscanner,OutputDoc);
addOutput(yyscanner,yytext);
- }
+ }
<Comment>"<"{CAPTION}{ATTR}">" {
QCString tag=yytext;
int s=tag.find("id=");
@@ -680,22 +631,25 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
setOutput(yyscanner,OutputDoc);
REJECT;
}
-<Comment>"<!--" {
+<Comment>"<!--" {
BEGIN(HtmlComment);
}
<Comment>"<!\[CDATA\[" {
BEGIN(CdataSection);
}
-<Comment>{B}*{CMD}"endinternal"{B}* {
- addOutput(yyscanner," \\endinternal ");
+<Comment>{B}*{CMD}"endinternal"{B}* {
+ addOutput(yyscanner," \\endinternal ");
if (!yyextra->inInternalDocs)
- warn(yyextra->fileName,yyextra->lineNr,
+ warn(yyextra->fileName,yyextra->lineNr,
"found \\endinternal without matching \\internal"
);
yyextra->inInternalDocs = FALSE;
- }
+ }
+<Comment>{B}*"\\ilinebr"{B}* { // preserve spacing around \\ilinebr
+ addOutput(yyscanner,yytext);
+ }
<Comment>{B}*{CMD}[a-z_A-Z]+"{"[a-zA-Z_,:0-9\. ]*"}"{B}* |
-<Comment>{B}*{CMD}[a-z_A-Z]+{B}* { // potentially interesting command
+<Comment>{B}*{CMD}[a-z_A-Z]+{B}* { // potentially interesting command
// the {B}* in the front was added for bug620924
QCString fullMatch = QCString(yytext);
int idx = fullMatch.find('{');
@@ -714,136 +668,137 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
QCString optStr = fullMatch.mid(idx+1,idxEnd-idx-1).stripWhiteSpace();
optList = QCStringList::split(',',optStr);
}
- DocCmdMapper::Cmd *cmdPtr = DocCmdMapper::map(cmdName);
- if (cmdPtr) // special action is required
- {
+ auto it = docCmdMap.find(cmdName.data());
+ //printf("lookup command '%s' found=%d\n",cmdName.data(),it!=docCmdMap.end());
+ if (it!=docCmdMap.end()) // special action is required
+ {
int i=0;
while (yytext[i]==' ' || yytext[i]=='\t') i++;
- yyextra->spaceBeforeCmd = QCString(yytext).left(i);
- if (cmdPtr->endsBrief && !(yyextra->inContext==OutputXRef && cmdName=="parblock"))
- {
- yyextra->briefEndsAtDot=FALSE;
- // this command forces the end of brief description
- setOutput(yyscanner,OutputDoc);
- }
+ yyextra->spaceBeforeCmd = QCString(yytext).left(i);
+ if (it->second.spacing==CommandSpacing::Block && !(yyextra->inContext==OutputXRef && cmdName=="parblock"))
+ {
+ yyextra->briefEndsAtDot=FALSE;
+ // this command forces the end of brief description
+ setOutput(yyscanner,OutputDoc);
+ }
//if (i>0) addOutput(yyscanner,QCString(yytext).left(i)); // removed for bug 689341
- if (cmdPtr->func && cmdPtr->func(yyscanner, cmdName, optList))
- {
- // implicit split of the comment block into two
- // entries. Restart the next block at the start
- // of this command.
- yyextra->parseMore=TRUE;
-
- // yuk, this is probably not very portable across lex implementations,
- // but we need to know the position in the input buffer where this
- // rule matched.
- // for flex 2.5.33+ we should use YY_CURRENT_BUFFER_LVALUE
+ if (it->second.handler && it->second.handler(yyscanner, cmdName, optList))
+ {
+ // implicit split of the comment block into two
+ // entries. Restart the next block at the start
+ // of this command.
+ yyextra->parseMore=TRUE;
+
+ // yuk, this is probably not very portable across lex implementations,
+ // but we need to know the position in the input buffer where this
+ // rule matched.
+ // for flex 2.5.33+ we should use YY_CURRENT_BUFFER_LVALUE
#if YY_FLEX_MAJOR_VERSION>=2 && (YY_FLEX_MINOR_VERSION>5 || (YY_FLEX_MINOR_VERSION==5 && YY_FLEX_SUBMINOR_VERSION>=33))
- yyextra->inputPosition=yyextra->prevPosition + (int)(yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf);
+ yyextra->inputPosition=yyextra->prevPosition + (int)(yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf);
#else
- yyextra->inputPosition=yyextra->prevPosition + (int)(yy_bp - yy_current_buffer->yy_ch_buf);
+ yyextra->inputPosition=yyextra->prevPosition + (int)(yy_bp - yy_current_buffer->yy_ch_buf);
#endif
- yyterminate();
- }
- else if (cmdPtr->func==0)
- {
- // command without handler, to be processed
- // later by parsedoc.cpp
- addOutput(yyscanner,yytext);
- }
- }
- else // command not relevant
- {
- addOutput(yyscanner,yytext);
- }
- }
-<Comment>{B}*({CMD}{CMD})"f"[$\[{] { // escaped formula command
- addOutput(yyscanner,yytext);
- }
-<Comment>{B}*{CMD}"~"[a-z_A-Z-]* { // language switch command
+ yyterminate();
+ }
+ else if (it->second.handler==0)
+ {
+ // command without handler, to be processed
+ // later by parsedoc.cpp
+ addOutput(yyscanner,yytext);
+ }
+ }
+ else // command not relevant
+ {
+ addOutput(yyscanner,yytext);
+ }
+ }
+<Comment>{B}*({CMD}{CMD})"f"[$\[{] { // escaped formula command
+ addOutput(yyscanner,yytext);
+ }
+<Comment>{B}*{CMD}"~"[a-z_A-Z-]* { // language switch command
QCString langId = QCString(yytext).stripWhiteSpace().data()+2;
- if (!langId.isEmpty() &&
- qstricmp(Config_getEnum(OUTPUT_LANGUAGE),langId)!=0)
- { // enable language specific section
- BEGIN(SkipLang);
- }
- }
+ if (!langId.isEmpty() &&
+ qstricmp(Config_getEnum(OUTPUT_LANGUAGE),langId)!=0)
+ { // enable language specific section
+ BEGIN(SkipLang);
+ }
+ }
<Comment>{B}*{CMD}"f{"[^}\n]+"}"("{"?) { // start of a formula with custom environment
- setOutput(yyscanner,OutputDoc);
- yyextra->formulaText="\\begin";
- yyextra->formulaEnv=QCString(yytext).stripWhiteSpace().data()+2;
- if (yyextra->formulaEnv.at(yyextra->formulaEnv.length()-1)=='{')
- {
- // remove trailing open brace
- yyextra->formulaEnv=yyextra->formulaEnv.left(yyextra->formulaEnv.length()-1);
- }
- yyextra->formulaText+=yyextra->formulaEnv;
- yyextra->formulaNewLines=0;
- BEGIN(ReadFormulaLong);
- }
-<Comment>{B}*{CMD}"f$" { // start of a inline formula
- yyextra->formulaText="$";
- yyextra->formulaNewLines=0;
- BEGIN(ReadFormulaShort);
- }
-<Comment>{B}*{CMD}"f[" { // start of a block formula
- setOutput(yyscanner,OutputDoc);
- yyextra->formulaText="\\[";
- yyextra->formulaNewLines=0;
- BEGIN(ReadFormulaLong);
- }
+ setOutput(yyscanner,OutputDoc);
+ yyextra->formulaText="\\begin";
+ yyextra->formulaEnv=QCString(yytext).stripWhiteSpace().data()+2;
+ if (yyextra->formulaEnv.at(yyextra->formulaEnv.length()-1)=='{')
+ {
+ // remove trailing open brace
+ yyextra->formulaEnv=yyextra->formulaEnv.left(yyextra->formulaEnv.length()-1);
+ }
+ yyextra->formulaText+=yyextra->formulaEnv;
+ yyextra->formulaNewLines=0;
+ BEGIN(ReadFormulaLong);
+ }
+<Comment>{B}*{CMD}"f$" { // start of a inline formula
+ yyextra->formulaText="$";
+ yyextra->formulaNewLines=0;
+ BEGIN(ReadFormulaShort);
+ }
+<Comment>{B}*{CMD}"f[" { // start of a block formula
+ setOutput(yyscanner,OutputDoc);
+ yyextra->formulaText="\\[";
+ yyextra->formulaNewLines=0;
+ BEGIN(ReadFormulaLong);
+ }
<Comment>{B}*{CMD}"{" { // begin of a group
//yyextra->langParser->handleGroupStartCommand(yyextra->memberGroupHeader);
- Doxygen::docGroup.open(yyextra->current,yyextra->fileName,yyextra->lineNr);
+ yyextra->docGroup.open(yyextra->current,yyextra->fileName,yyextra->lineNr);
}
<Comment>{B}*{CMD}"}" { // end of a group
//yyextra->langParser->handleGroupEndCommand();
- Doxygen::docGroup.close(yyextra->current,yyextra->fileName,yyextra->lineNr,TRUE);
- Doxygen::docGroup.clearHeader();
- yyextra->parseMore=TRUE;
+ yyextra->docGroup.close(yyextra->current,yyextra->fileName,yyextra->lineNr,TRUE);
+ yyextra->docGroup.clearHeader();
+ yyextra->parseMore=TRUE;
yyextra->needNewEntry = TRUE;
#if YY_FLEX_MAJOR_VERSION>=2 && (YY_FLEX_MINOR_VERSION>5 || (YY_FLEX_MINOR_VERSION==5 && YY_FLEX_SUBMINOR_VERSION>=33))
- yyextra->inputPosition=yyextra->prevPosition + (int)(yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) + strlen(yytext);
+ yyextra->inputPosition=yyextra->prevPosition + (int)(yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) + (int)strlen(yytext);
#else
- yyextra->inputPosition=yyextra->prevPosition + (int)(yy_bp - yy_current_buffer->yy_ch_buf) + strlen(yytext);
+ yyextra->inputPosition=yyextra->prevPosition + (int)(yy_bp - yy_current_buffer->yy_ch_buf) + (int)strlen(yytext);
#endif
- yyterminate();
- }
-<Comment>{B}*{CMD}[$@\\&~<>#%] { // escaped character
- addOutput(yyscanner,yytext);
- }
-<Comment>[a-z_A-Z]+ { // normal word
- addOutput(yyscanner,yytext);
- }
+ yyterminate();
+ }
+<Comment>{B}*{CMD}[$@\\&~<>#%] { // escaped character
+ addOutput(yyscanner,yytext);
+ }
+<Comment>[a-z_A-Z]+ { // normal word
+ addOutput(yyscanner,yytext);
+ }
<Comment>^{B}*"."{B}*/\n { // explicit end autolist: e.g " ."
- addOutput(yyscanner,yytext);
- }
+ addOutput(yyscanner,yytext);
+ }
<Comment>^{B}*[1-9][0-9]*"."{B}+ |
-<Comment>^{B}*[*+]{B}+ { // start of autolist
- if (!Doxygen::markdownSupport)
+<Comment>^{B}*[*+]{B}+ { // start of autolist
+ if (!yyextra->markdownSupport)
{
REJECT;
}
else
{
- if (yyextra->inContext!=OutputXRef)
+ if (yyextra->inContext!=OutputXRef)
{
yyextra->briefEndsAtDot=FALSE;
setOutput(yyscanner,OutputDoc);
}
- addOutput(yyscanner,yytext);
+ addOutput(yyscanner,yytext);
+ }
+ }
+<Comment>^{B}*"-"{B}+ { // start of autolist
+ if (yyextra->inContext!=OutputXRef)
+ {
+ yyextra->briefEndsAtDot=FALSE;
+ setOutput(yyscanner,OutputDoc);
}
- }
-<Comment>^{B}*"-"{B}+ { // start of autolist
- if (yyextra->inContext!=OutputXRef)
- {
- yyextra->briefEndsAtDot=FALSE;
- setOutput(yyscanner,OutputDoc);
- }
- addOutput(yyscanner,yytext);
- }
+ addOutput(yyscanner,yytext);
+ }
<Comment>^{B}*([\-:|]{B}*)*("--"|"---")({B}*[\-:|])*{B}*/\n { // horizontal line (dashed)
- addOutput(yyscanner,yytext);
+ addOutput(yyscanner,yytext);
}
<Comment>{CMD}"---" { // escaped mdash
addOutput(yyscanner,yytext);
@@ -852,10 +807,10 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
addOutput(yyscanner,yytext);
}
<Comment>"---" { // mdash
- addOutput(yyscanner,yyextra->insidePre || Doxygen::markdownSupport ? yytext : "&mdash;");
+ addOutput(yyscanner,yyextra->insidePre || yyextra->markdownSupport ? yytext : "&mdash;");
}
<Comment>"--" { // ndash
- addOutput(yyscanner,yyextra->insidePre || Doxygen::markdownSupport ? yytext : "&ndash;");
+ addOutput(yyscanner,yyextra->insidePre || yyextra->markdownSupport ? yytext : "&ndash;");
}
<Comment>"-#"{B}+ { // numbered item
if (yyextra->inContext!=OutputXRef)
@@ -865,85 +820,89 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
addOutput(yyscanner,yytext);
}
-<Comment>("."+)[a-z_A-Z0-9\)] { // . at start or in the middle of a word, or ellipsis
- addOutput(yyscanner,yytext);
- }
-<Comment>".\\"[ \t] { // . with escaped space.
- addOutput(yyscanner,yytext[0]);
- addOutput(yyscanner,yytext[2]);
- }
-<Comment>".," { // . with comma such as "e.g.,"
- addOutput(yyscanner,yytext);
- }
-<Comment>"...\\"[ \t] { // ellipsis with escaped space.
- addOutput(yyscanner,"... ");
- }
-<Comment>".."[\.]?/[^ \t\n] { // internal ellipsis
- addOutput(yyscanner,yytext);
- }
-<Comment>(\n|\\_linebr)({B}*(\n|\\_linebr))+ { // at least one blank line (or blank line command)
- if (yyextra->inContext==OutputXRef)
- {
- // see bug 613024, we need to put the newlines after ending the XRef section.
- if (!yyextra->insideParBlock) setOutput(yyscanner,OutputDoc);
- int i;
- for (i=0;i<yyleng;)
+<Comment>("."+)[a-z_A-Z0-9\)] { // . at start or in the middle of a word, or ellipsis
+ addOutput(yyscanner,yytext);
+ }
+<Comment>".\\"[ \t] { // . with escaped space.
+ addOutput(yyscanner,yytext[0]);
+ addOutput(yyscanner,yytext[2]);
+ }
+<Comment>".," { // . with comma such as "e.g.,"
+ addOutput(yyscanner,yytext);
+ }
+<Comment>"...\\"[ \t] { // ellipsis with escaped space.
+ addOutput(yyscanner,"... ");
+ }
+<Comment>".."[\.]?/[^ \t\n] { // internal ellipsis
+ addOutput(yyscanner,yytext);
+ }
+<Comment>(\n|\\ilinebr)({B}*(\n|\\ilinebr))+ { // at least one blank line (or blank line command)
+ if (yyextra->inContext==OutputXRef)
+ {
+ // see bug 613024, we need to put the newlines after ending the XRef section.
+ if (!yyextra->insideParBlock) setOutput(yyscanner,OutputDoc);
+ yy_size_t i;
+ for (i=0;i<(yy_size_t)yyleng;)
{
if (yytext[i]=='\n') addOutput(yyscanner,'\n'),i++;
- else if (strcmp(yytext+i,"\\_linebr")==0) addOutput(yyscanner,'\n'),i+=8;
+ else if (strcmp(yytext+i,"\\ilinebr")==0) addOutput(yyscanner,"\\ilinebr"),i+=8;
else i++;
}
- }
- else if (yyextra->inContext!=OutputBrief)
- {
- int i;
- for (i=0;i<yyleng;)
+ }
+ else if (yyextra->inContext!=OutputBrief)
+ {
+ yy_size_t i;
+ for (i=0;i<(yy_size_t)yyleng;)
{
if (yytext[i]=='\n') addOutput(yyscanner,'\n'),i++;
- else if (strcmp(yytext+i,"\\_linebr")==0) addOutput(yyscanner,'\n'),i+=8;
+ else if (strcmp(yytext+i,"\\ilinebr")==0) addOutput(yyscanner,"\\ilinebr"),i+=8;
else i++;
}
- setOutput(yyscanner,OutputDoc);
- }
- else // yyextra->inContext==OutputBrief
- { // only go to the detailed description if we have
- // found some brief description and not just whitespace
- endBrief(yyscanner,FALSE);
- }
- lineCount(yyscanner);
- }
-<Comment>"." { // potential end of a JavaDoc style comment
- addOutput(yyscanner,*yytext);
- if (yyextra->briefEndsAtDot)
- {
- setOutput(yyscanner,OutputDoc);
- yyextra->briefEndsAtDot=FALSE;
- }
- }
-<Comment>\n { // newline
- addOutput(yyscanner,*yytext);
- yyextra->lineNr++;
- }
-<Comment>. { // catch-all for anything else
- addOutput(yyscanner,*yytext);
- }
+ setOutput(yyscanner,OutputDoc);
+ }
+ else // yyextra->inContext==OutputBrief
+ { // only go to the detailed description if we have
+ // found some brief description and not just whitespace
+ endBrief(yyscanner,TRUE);
+ }
+ lineCount(yyscanner);
+ }
+<Comment>"." { // potential end of a JavaDoc style comment
+ addOutput(yyscanner,*yytext);
+ if (yyextra->briefEndsAtDot)
+ {
+ setOutput(yyscanner,OutputDoc);
+ yyextra->briefEndsAtDot=FALSE;
+ }
+ }
+<Comment>{DOCNL} { // newline
+ addOutput(yyscanner,yytext);
+ if (*yytext == '\n') yyextra->lineNr++;
+ }
+<Comment>. { // catch-all for anything else
+ addOutput(yyscanner,*yytext);
+ }
/* -------------- Rules for handling HTML comments ----------- */
-<HtmlComment>"--"[!]?">"{B}* { BEGIN( Comment ); }
-<HtmlComment>{DOCNL} {
- if (*yytext=='\n') yyextra->lineNr++;
- }
-<HtmlComment>[^\\\n\-]+ { // ignore unimportant characters
- }
-<HtmlComment>. { // ignore every else
- }
+<HtmlComment>"--"[!]?">"{B}* { BEGIN( Comment ); }
+<HtmlComment>{DOCNL} {
+ if (*yytext=='\n')
+ {
+ addOutput(yyscanner,*yytext);
+ yyextra->lineNr++;
+ }
+ }
+<HtmlComment>[^\\\n\-]+ { // ignore unimportant characters
+ }
+<HtmlComment>. { // ignore every else
+ }
<CdataSection>"\]\]>" {
BEGIN( Comment );
}
-<CdataSection>{DOCNL} {
+<CdataSection>{DOCNL} {
addOutput(yyscanner,'\n');
if (*yytext=='\n') yyextra->lineNr++;
}
@@ -954,262 +913,272 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
<CdataSection>[^\\\n\]<>&]+ {
addOutput(yyscanner,yytext);
}
-<CdataSection>. {
+<CdataSection>. {
addOutput(yyscanner,*yytext);
}
/* -------------- Rules for handling formulas ---------------- */
-
-<ReadFormulaShort>{CMD}"f$" { // end of inline formula
- yyextra->formulaText+="$";
- addOutput(yyscanner," "+addFormula(yyscanner));
- BEGIN(Comment);
- }
-<ReadFormulaLong>{CMD}"f]" { // end of block formula
- yyextra->formulaText+="\\]";
- addOutput(yyscanner," "+addFormula(yyscanner));
- BEGIN(Comment);
- }
-<ReadFormulaLong>{CMD}"f}" { // end of custom env formula
- yyextra->formulaText+="\\end";
- yyextra->formulaText+=yyextra->formulaEnv;
- addOutput(yyscanner," "+addFormula(yyscanner));
- BEGIN(Comment);
- }
+
+<ReadFormulaShort>{CMD}"f$" { // end of inline formula
+ yyextra->formulaText+="$";
+ addOutput(yyscanner," "+addFormula(yyscanner));
+ BEGIN(Comment);
+ }
+<ReadFormulaLong>{CMD}"f]" { // end of block formula
+ yyextra->formulaText+="\\]";
+ addOutput(yyscanner," "+addFormula(yyscanner));
+ BEGIN(Comment);
+ }
+<ReadFormulaLong>{CMD}"f}" { // end of custom env formula
+ yyextra->formulaText+="\\end";
+ yyextra->formulaText+=yyextra->formulaEnv;
+ addOutput(yyscanner," "+addFormula(yyscanner));
+ BEGIN(Comment);
+ }
<ReadFormulaLong,ReadFormulaShort>[^\\@\n]+ { // any non-special character
- yyextra->formulaText+=yytext;
- }
-<ReadFormulaLong,ReadFormulaShort>\n { // new line
+ yyextra->formulaText+=yytext;
+ }
+<ReadFormulaLong,ReadFormulaShort>\n { // new line
yyextra->formulaNewLines++;
- yyextra->formulaText+=*yytext;
- yyextra->lineNr++;
- }
+ yyextra->formulaText+=*yytext;
+ yyextra->lineNr++;
+ }
<ReadFormulaLong,ReadFormulaShort>. { // any other character
- yyextra->formulaText+=*yytext;
- }
+ yyextra->formulaText+=*yytext;
+ }
/* ------------ handle argument of enum command --------------- */
-<EnumDocArg1>{SCOPEID} { // handle argument
- yyextra->current->name = yytext;
- BEGIN( Comment );
- }
-<EnumDocArg1>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
+<EnumDocArg1>{SCOPEID} { // handle argument
+ yyextra->current->name = yytext;
+ BEGIN( Comment );
+ }
+<EnumDocArg1>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
}
-<EnumDocArg1>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
+<EnumDocArg1>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
"missing argument after \\enum."
);
- addOutput(yyscanner,'\n');
- if (*yytext=='\n') yyextra->lineNr++;
- BEGIN( Comment );
- }
-<EnumDocArg1>. { // ignore other stuff
- }
+ unput_string(yytext,yyleng);
+ //addOutput(yyscanner,'\n');
+ //if (*yytext=='\n') yyextra->lineNr++;
+ BEGIN( Comment );
+ }
+<EnumDocArg1>. { // ignore other stuff
+ }
/* ------------ handle argument of namespace command --------------- */
-<NameSpaceDocArg1>{SCOPENAME} { // handle argument
- yyextra->current->name = substitute(yytext,".","::");
- BEGIN( Comment );
- }
-<NameSpaceDocArg1>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
+<NameSpaceDocArg1>{SCOPENAME} { // handle argument
+ yyextra->current->name = substitute(yytext,".","::");
+ BEGIN( Comment );
}
-<NameSpaceDocArg1>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
+<NameSpaceDocArg1>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<NameSpaceDocArg1>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
"missing argument after "
- "\\namespace."
+ "\\namespace."
);
- addOutput(yyscanner,'\n');
- if (*yytext=='\n') yyextra->lineNr++;
- BEGIN( Comment );
- }
-<NameSpaceDocArg1>. { // ignore other stuff
- }
+ unput_string(yytext,yyleng);
+ //addOutput(yyscanner,'\n');
+ //if (*yytext=='\n') yyextra->lineNr++;
+ BEGIN( Comment );
+ }
+<NameSpaceDocArg1>. { // ignore other stuff
+ }
/* ------------ handle argument of package command --------------- */
-<PackageDocArg1>{ID}("."{ID})* { // handle argument
- yyextra->current->name = yytext;
- BEGIN( Comment );
- }
-<PackageDocArg1>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
+<PackageDocArg1>{ID}("."{ID})* { // handle argument
+ yyextra->current->name = yytext;
+ BEGIN( Comment );
}
-<PackageDocArg1>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
+<PackageDocArg1>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<PackageDocArg1>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
"missing argument after "
- "\\package."
+ "\\package."
);
- addOutput(yyscanner,'\n');
- if (*yytext=='\n') yyextra->lineNr++;
- BEGIN( Comment );
- }
-<PackageDocArg1>. { // ignore other stuff
- }
+ unput_string(yytext,yyleng);
+ //addOutput(yyscanner,'\n');
+ //if (*yytext=='\n') yyextra->lineNr++;
+ BEGIN( Comment );
+ }
+<PackageDocArg1>. { // ignore other stuff
+ }
/* ------ handle argument of class/struct/union command --------------- */
-<ClassDocArg1>{SCOPENAME}{TMPLSPEC} {
- yyextra->current->name = substitute(removeRedundantWhiteSpace(yytext),".","::");
- BEGIN( ClassDocArg2 );
- }
-<ClassDocArg1>{SCOPENAME} { // first argument
- yyextra->current->name = substitute(yytext,".","::");
- if (yyextra->current->section==Entry::PROTOCOLDOC_SEC)
- {
- yyextra->current->name+="-p";
- }
- // prepend outer scope name
- BEGIN( ClassDocArg2 );
- }
+<ClassDocArg1>{SCOPENAME}{TMPLSPEC} {
+ yyextra->current->name = substitute(removeRedundantWhiteSpace(yytext),".","::");
+ BEGIN( ClassDocArg2 );
+ }
+<ClassDocArg1>{SCOPENAME} { // first argument
+ yyextra->current->name = substitute(yytext,".","::");
+ if (yyextra->current->section==Entry::PROTOCOLDOC_SEC)
+ {
+ yyextra->current->name+="-p";
+ }
+ // prepend outer scope name
+ BEGIN( ClassDocArg2 );
+ }
<CategoryDocArg1>{SCOPENAME}{B}*"("[^\)]+")" {
- yyextra->current->name = substitute(yytext,".","::");
- BEGIN( ClassDocArg2 );
- }
+ yyextra->current->name = substitute(yytext,".","::");
+ BEGIN( ClassDocArg2 );
+ }
<ClassDocArg1,CategoryDocArg1>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
}
-<ClassDocArg1,CategoryDocArg1>{DOCNL} {
- warn(yyextra->fileName,yyextra->lineNr,
+<ClassDocArg1,CategoryDocArg1>{DOCNL} {
+ warn(yyextra->fileName,yyextra->lineNr,
"missing argument after "
- "\\%s.",YY_START==ClassDocArg1?"class":"category"
+ "'\\%s'.",yyextra->currentCmd.data()
);
- addOutput(yyscanner,'\n');
- if (*yytext=='\n') yyextra->lineNr++;
- BEGIN( Comment );
- }
-<ClassDocArg1,CategoryDocArg1>. { // ignore other stuff
- }
-
-<ClassDocArg2>{FILE}|"<>" { // second argument; include file
- yyextra->current->includeFile = yytext;
- BEGIN( ClassDocArg3 );
- }
-<ClassDocArg2>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<ClassDocArg2>{DOCNL} {
- addOutput(yyscanner,'\n');
- if (*yytext=='\n') yyextra->lineNr++;
- BEGIN( Comment );
- }
-<ClassDocArg2>. { // ignore other stuff
- }
-
-<ClassDocArg3>[<"]?{FILE}?[">]? { // third argument; include file name
- yyextra->current->includeName = yytext;
- BEGIN( Comment );
- }
-<ClassDocArg3>{LC} { // line continuation
+ //addOutput(yyscanner,'\n');
+ //if (*yytext=='\n') yyextra->lineNr++;
+ unput_string(yytext,yyleng);
+ BEGIN( Comment );
+ }
+<ClassDocArg1,CategoryDocArg1>. { // ignore other stuff
+ }
+
+<ClassDocArg2>{DOCNL} {
+ //addOutput(yyscanner,'\n');
+ //if (*yytext=='\n') yyextra->lineNr++;
+ unput_string(yytext,yyleng);
+ BEGIN( Comment );
+ }
+<ClassDocArg2>{FILE}|"<>" { // second argument; include file
+ yyextra->current->includeFile = yytext;
+ BEGIN( ClassDocArg3 );
+ }
+<ClassDocArg2>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<ClassDocArg2>. { // ignore other stuff
+ }
+
+<ClassDocArg3>[<"]?{FILE}?[">]? { // third argument; include file name
+ yyextra->current->includeName = yytext;
+ BEGIN( Comment );
+ }
+<ClassDocArg3>{LC} { // line continuation
yyextra->lineNr++;
- addOutput(yyscanner,'\n');
+ addOutput(yyscanner,'\n');
+ }
+<ClassDocArg3>{DOCNL} {
+ //if (*yytext=='\n') yyextra->lineNr++;
+ unput_string(yytext,yyleng);
+ BEGIN( Comment );
+ }
+<ClassDocArg3>. { // ignore other stuff
}
-<ClassDocArg3>{DOCNL} {
- if (*yytext=='\n') yyextra->lineNr++;
- BEGIN( Comment );
- }
-<ClassDocArg3>. { // ignore other stuff
- }
/* --------- handle arguments of {def,add,weak}group commands --------- */
-<GroupDocArg1>{LABELID}(".html"?) { // group name
- yyextra->current->name = yytext;
- //lastDefGroup.groupname = yytext;
- //lastDefGroup.pri = yyextra->current->groupingPri();
- // the .html stuff is for Qt compatibility
- if (yyextra->current->name.right(5)==".html")
- {
- yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-5);
- }
- yyextra->current->type.resize(0);
- BEGIN(GroupDocArg2);
- }
-<GroupDocArg1>"\\"{B}*"\n" { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<GroupDocArg1>{DOCNL} { // missing argument!
- warn(yyextra->fileName,yyextra->lineNr,
+<GroupDocArg1>{LABELID}(".html"?) { // group name
+ yyextra->current->name = yytext;
+ //lastDefGroup.groupname = yytext;
+ //lastDefGroup.pri = yyextra->current->groupingPri();
+ // the .html stuff is for Qt compatibility
+ if (yyextra->current->name.right(5)==".html")
+ {
+ yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-5);
+ }
+ yyextra->current->type.resize(0);
+ BEGIN(GroupDocArg2);
+ }
+<GroupDocArg1>"\\"{B}*"\n" { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<GroupDocArg1>{DOCNL} { // missing argument!
+ warn(yyextra->fileName,yyextra->lineNr,
"missing group name after %s",
- yyextra->current->groupDocCmd()
+ yyextra->current->groupDocCmd()
);
- addOutput(yyscanner,'\n');
- if (*yytext=='\n') yyextra->lineNr++;
- BEGIN( Comment );
- }
-<GroupDocArg1>. { // ignore other stuff
- }
-<GroupDocArg2>"\\"{B}*"\n" { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<GroupDocArg2>[^\n\\]+ { // title (stored in type)
- yyextra->current->type += yytext;
- yyextra->current->type = yyextra->current->type.stripWhiteSpace();
- }
-<GroupDocArg2>{DOCNL} {
+ //addOutput(yyscanner,'\n');
+ //if (*yytext=='\n') yyextra->lineNr++;
+ unput_string(yytext,yyleng);
+ BEGIN( Comment );
+ }
+<GroupDocArg1>. { // ignore other stuff
+ }
+<GroupDocArg2>"\\"{B}*"\n" { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<GroupDocArg2>[^\n\\]+ { // title (stored in type)
+ yyextra->current->type += yytext;
+ yyextra->current->type = yyextra->current->type.stripWhiteSpace();
+ }
+<GroupDocArg2>{DOCNL} {
if ( yyextra->current->groupDocType==Entry::GROUPDOC_NORMAL &&
- yyextra->current->type.isEmpty()
- ) // defgroup requires second argument
- {
- warn(yyextra->fileName,yyextra->lineNr,
+ yyextra->current->type.isEmpty()
+ ) // defgroup requires second argument
+ {
+ warn(yyextra->fileName,yyextra->lineNr,
"missing title after "
- "\\defgroup %s", yyextra->current->name.data()
+ "\\defgroup %s", yyextra->current->name.data()
);
- }
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
+ }
+ unput_string(yytext,yyleng);
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
<GroupDocArg2>. { // title (stored in type)
- yyextra->current->type += yytext;
- yyextra->current->type = yyextra->current->type.stripWhiteSpace();
+ yyextra->current->type += yytext;
+ yyextra->current->type = yyextra->current->type.stripWhiteSpace();
}
/* --------- handle arguments of page/mainpage command ------------------- */
-<PageDocArg1>{FILE} { // first argument; page name
- yyextra->current->name = stripQuotes(yytext);
- yyextra->current->args = "";
- BEGIN( PageDocArg2 );
- }
-<PageDocArg1>{LC} { yyextra->lineNr++;
- addOutput(yyscanner,'\n');
+<PageDocArg1>{FILE} { // first argument; page name
+ yyextra->current->name = stripQuotes(yytext);
+ yyextra->current->args = "";
+ BEGIN( PageDocArg2 );
}
-<PageDocArg1>{DOCNL} {
- warn(yyextra->fileName,yyextra->lineNr,
+<PageDocArg1>{LC} { yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<PageDocArg1>{DOCNL} {
+ warn(yyextra->fileName,yyextra->lineNr,
"missing argument after "
- "\\page."
+ "\\page."
);
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<PageDocArg1>. { // ignore other stuff
- }
-<PageDocArg2>{DOCNL} { // second argument; page title
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<PageDocArg2>{CMD}[<>] {
- // bug 748927
- QCString tmp = yytext;
- tmp = substitute(substitute(tmp,"@<","&lt;"),"@>","&gt;");
- tmp = substitute(substitute(tmp,"\\<","&lt;"),"\\>","&gt;");
- yyextra->current->args += tmp;
- }
-<PageDocArg2>. {
- yyextra->current->args += yytext;
+ unput_string(yytext,yyleng);
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<PageDocArg1>. { // ignore other stuff
+ }
+<PageDocArg2>{DOCNL} { // second argument; page title
+ unput_string(yytext,yyleng);
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<PageDocArg2>{CMD}[<>] {
+ // bug 748927
+ QCString tmp = yytext;
+ tmp = substitute(substitute(tmp,"@<","&lt;"),"@>","&gt;");
+ tmp = substitute(substitute(tmp,"\\<","&lt;"),"\\>","&gt;");
+ yyextra->current->args += tmp;
+ }
+<PageDocArg2>. {
+ yyextra->current->args += yytext;
}
/* --------- handle arguments of the param command ------------ */
<ParamArg1>{ID}/{B}*"," {
@@ -1229,288 +1198,291 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
/* --------- handle arguments of the file/dir/example command ------------ */
-<FileDocArg1>{DOCNL} { // no file name specified
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<FileDocArg1>{FILE} { // first argument; name
- yyextra->current->name = stripQuotes(yytext);
- BEGIN( Comment );
- }
-<FileDocArg1>{LC} { yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<FileDocArg1>. { // ignore other stuff
- }
+<FileDocArg1>{DOCNL} { // no file name specified
+ unput_string(yytext,yyleng);
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<FileDocArg1>{FILE} { // first argument; name
+ yyextra->current->name = stripQuotes(yytext);
+ BEGIN( Comment );
+ }
+<FileDocArg1>{LC} { yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<FileDocArg1>. { // ignore other stuff
+ }
/* --------- handle arguments of the xrefitem command ------------ */
-<XRefItemParam1>{LABELID} { // first argument
- yyextra->newXRefItemKey=yytext;
+<XRefItemParam1>{LABELID} { // first argument
+ yyextra->newXRefItemKey=yytext;
setOutput(yyscanner,OutputXRef);
- BEGIN(XRefItemParam2);
- }
-<XRefItemParam1>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<XRefItemParam1>{DOCNL} { // missing arguments
- warn(yyextra->fileName,yyextra->lineNr,
- "Missing first argument of \\xrefitem"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- yyextra->inContext = OutputDoc;
- BEGIN( Comment );
- }
-<XRefItemParam1>. { // ignore other stuff
- }
-
-<XRefItemParam2>"\""[^\n\"]*"\"" { // second argument
- yyextra->xrefItemTitle = stripQuotes(yytext);
- BEGIN(XRefItemParam3);
- }
-<XRefItemParam2>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<XRefItemParam2>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
- "Missing second argument of \\xrefitem"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- yyextra->inContext = OutputDoc;
- BEGIN( Comment );
- }
-<XRefItemParam2>. { // ignore other stuff
- }
-
-<XRefItemParam3>"\""[^\n\"]*"\"" { // third argument
- yyextra->xrefListTitle = stripQuotes(yytext);
+ BEGIN(XRefItemParam2);
+ }
+<XRefItemParam1>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<XRefItemParam1>{DOCNL} { // missing arguments
+ warn(yyextra->fileName,yyextra->lineNr,
+ "Missing first argument of \\xrefitem"
+ );
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ yyextra->inContext = OutputDoc;
+ BEGIN( Comment );
+ }
+<XRefItemParam1>. { // ignore other stuff
+ }
+
+<XRefItemParam2>"\""[^\n\"]*"\"" { // second argument
+ yyextra->xrefItemTitle = stripQuotes(yytext);
+ BEGIN(XRefItemParam3);
+ }
+<XRefItemParam2>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<XRefItemParam2>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
+ "Missing second argument of \\xrefitem"
+ );
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ yyextra->inContext = OutputDoc;
+ BEGIN( Comment );
+ }
+<XRefItemParam2>. { // ignore other stuff
+ }
+
+<XRefItemParam3>"\""[^\n\"]*"\"" { // third argument
+ yyextra->xrefListTitle = stripQuotes(yytext);
yyextra->xrefKind = XRef_Item;
- BEGIN( Comment );
- }
-<XRefItemParam2,XRefItemParam3>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<XRefItemParam3>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
- "Missing third argument of \\xrefitem"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- yyextra->inContext = OutputDoc;
- BEGIN( Comment );
- }
-<XRefItemParam3>. { // ignore other stuff
- }
+ BEGIN( Comment );
+ }
+<XRefItemParam2,XRefItemParam3>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<XRefItemParam3>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
+ "Missing third argument of \\xrefitem"
+ );
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ yyextra->inContext = OutputDoc;
+ BEGIN( Comment );
+ }
+<XRefItemParam3>. { // ignore other stuff
+ }
/* ----- handle arguments of the relates(also)/memberof command ------- */
-<RelatesParam1>({ID}("::"|"."))*{ID} { // argument
- yyextra->current->relates = yytext;
- //if (yyextra->current->mGrpId!=DOX_NOGROUP)
+<RelatesParam1>({ID}("::"|"."))*{ID} { // argument
+ yyextra->current->relates = yytext;
+ //if (yyextra->current->mGrpId!=DOX_NOGROUP)
//{
// memberGroupRelates = yytext;
//}
- BEGIN( Comment );
- }
-<RelatesParam1>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<RelatesParam1>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
- "Missing argument of \\relates or \\memberof command"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<RelatesParam1>. { // ignore other stuff
- }
+ BEGIN( Comment );
+ }
+<RelatesParam1>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<RelatesParam1>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
+ "Missing argument of '\\%s' command",yyextra->currentCmd.data()
+ );
+ unput_string(yytext,yyleng);
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<RelatesParam1>. { // ignore other stuff
+ }
/* ----- handle arguments of the relates(also)/addindex commands ----- */
-<LineParam>{DOCNL} { // end of argument
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<LineParam>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<LineParam>. { // ignore other stuff
- addOutput(yyscanner,*yytext);
- }
+<LineParam>{DOCNL} { // end of argument
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ unput_string(yytext,yyleng);
+ BEGIN( Comment );
+ }
+<LineParam>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<LineParam>. { // ignore other stuff
+ addOutput(yyscanner,*yytext);
+ }
/* ----- handle arguments of the section/subsection/.. commands ------- */
-<SectionLabel>{LABELID} { // first argument
- yyextra->sectionLabel=yytext;
+<SectionLabel>{LABELID} { // first argument
+ yyextra->sectionLabel=yytext;
addOutput(yyscanner,yytext);
- yyextra->sectionTitle.resize(0);
- BEGIN(SectionTitle);
- }
-<SectionLabel>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
- "\\section command has no label"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<SectionLabel>. { // invalid character for section label
- warn(yyextra->fileName,yyextra->lineNr,
- "Invalid or missing section label"
- );
- BEGIN(Comment);
- }
+ yyextra->sectionTitle.resize(0);
+ BEGIN(SectionTitle);
+ }
+<SectionLabel>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
+ "\\section command has no label"
+ );
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<SectionLabel>. { // invalid character for section label
+ warn(yyextra->fileName,yyextra->lineNr,
+ "Invalid or missing section label"
+ );
+ BEGIN(Comment);
+ }
<SectionTitle>[^\n@\\*]*/"\n" { // end of section title
- addSection(yyscanner);
+ addSection(yyscanner);
addOutput(yyscanner,yytext);
- BEGIN( Comment );
- }
-<SectionTitle>[^\n@\\]*/"\\_linebr" { // end of section title
- addSection(yyscanner);
+ BEGIN( Comment );
+ }
+<SectionTitle>[^\n@\\]*/"\\ilinebr" { // end of section title
+ addSection(yyscanner);
addOutput(yyscanner,yytext);
- BEGIN( Comment );
- }
-<SectionTitle>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<SectionTitle>[^\n@\\]* { // any character without special meaning
- yyextra->sectionTitle+=yytext;
- addOutput(yyscanner,yytext);
- }
-<SectionTitle>({CMD}{CMD}){ID} { // unescape escaped command
- yyextra->sectionTitle+=&yytext[1];
- addOutput(yyscanner,yytext);
- }
-<SectionTitle>{CMD}[$@\\&~<>#%] { // unescape escaped character
- yyextra->sectionTitle+=yytext[1];
- addOutput(yyscanner,yytext);
- }
-<SectionTitle>. { // anything else
- yyextra->sectionTitle+=yytext;
- addOutput(yyscanner,*yytext);
- }
+ BEGIN( Comment );
+ }
+<SectionTitle>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<SectionTitle>[^\n@\\]* { // any character without special meaning
+ yyextra->sectionTitle+=yytext;
+ addOutput(yyscanner,yytext);
+ }
+<SectionTitle>({CMD}{CMD}){ID} { // unescape escaped command
+ yyextra->sectionTitle+=&yytext[1];
+ addOutput(yyscanner,yytext);
+ }
+<SectionTitle>{CMD}[$@\\&~<>#%] { // unescape escaped character
+ yyextra->sectionTitle+=yytext[1];
+ addOutput(yyscanner,yytext);
+ }
+<SectionTitle>. { // anything else
+ yyextra->sectionTitle+=yytext;
+ addOutput(yyscanner,*yytext);
+ }
/* ----- handle arguments of the subpage command ------- */
-<SubpageLabel>{LABELID} { // first argument
+<SubpageLabel>{LABELID} { // first argument
addOutput(yyscanner,yytext);
- // we add subpage labels as a kind of "inheritance" relation to prevent
- // needing to add another list to the Entry class.
- yyextra->current->extends.push_back(BaseInfo(yytext,Public,Normal));
- BEGIN(SubpageTitle);
- }
-<SubpageLabel>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
- "\\subpage command has no label"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<SubpageTitle>{DOCNL} { // no title, end command
- addOutput(yyscanner,yytext);
- BEGIN( Comment );
- }
-<SubpageTitle>[ \t]*"\""[^\"\n]*"\"" { // add title, end of command
- addOutput(yyscanner,yytext);
- BEGIN( Comment );
- }
-<SubpageTitle>. { // no title, end of command
- unput(*yytext);
- BEGIN( Comment );
- }
+ // we add subpage labels as a kind of "inheritance" relation to prevent
+ // needing to add another list to the Entry class.
+ yyextra->current->extends.push_back(BaseInfo(yytext,Public,Normal));
+ BEGIN(SubpageTitle);
+ }
+<SubpageLabel>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
+ "\\subpage command has no label"
+ );
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<SubpageTitle>{DOCNL} { // no title, end command
+ addOutput(yyscanner,yytext);
+ BEGIN( Comment );
+ }
+<SubpageTitle>[ \t]*"\""[^\"\n]*"\"" { // add title, end of command
+ addOutput(yyscanner,yytext);
+ BEGIN( Comment );
+ }
+<SubpageTitle>. { // no title, end of command
+ unput(*yytext);
+ BEGIN( Comment );
+ }
/* ----- handle arguments of the anchor command ------- */
-<AnchorLabel>{LABELID} { // found argument
+<AnchorLabel>{LABELID} { // found argument
addAnchor(yyscanner,yytext);
- addOutput(yyscanner,yytext);
- BEGIN( Comment );
- }
-<AnchorLabel>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
- "\\anchor command has no label"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<AnchorLabel>. { // invalid character for anchor label
- warn(yyextra->fileName,yyextra->lineNr,
- "Invalid or missing anchor label"
- );
- BEGIN(Comment);
- }
+ addOutput(yyscanner,yytext);
+ BEGIN( Comment );
+ }
+<AnchorLabel>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
+ "\\anchor command has no label"
+ );
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<AnchorLabel>. { // invalid character for anchor label
+ warn(yyextra->fileName,yyextra->lineNr,
+ "Invalid or missing anchor label"
+ );
+ BEGIN(Comment);
+ }
/* ----- handle arguments of the preformatted block commands ------- */
<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endmsc"|"endvhdlflow")/{NW} { // possible ends
- addOutput(yyscanner,yytext);
- if (&yytext[4]==yyextra->blockName) // found end of the block
- {
- BEGIN(Comment);
- }
- }
+ addOutput(yyscanner,yytext);
+ if (&yytext[4]==yyextra->blockName) // found end of the block
+ {
+ BEGIN(Comment);
+ }
+ }
<FormatBlock>{CMD}"enduml" {
- addOutput(yyscanner,yytext);
- if (yyextra->blockName=="startuml") // found end of the block
- {
- BEGIN(Comment);
- }
- }
-<FormatBlock>[^ \@\*\/\\\n]* { // some word
- addOutput(yyscanner,yytext);
- }
-<FormatBlock>{DOCNL} { // new line
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<FormatBlock>"/*" { // start of a C-comment
- if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim")) yyextra->commentCount++;
- addOutput(yyscanner,yytext);
- }
-<FormatBlock>"*/" { // end of a C-comment
- addOutput(yyscanner,yytext);
- if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim"))
+ addOutput(yyscanner,yytext);
+ if (yyextra->blockName=="startuml") // found end of the block
+ {
+ BEGIN(Comment);
+ }
+ }
+<FormatBlock>[^ \@\*\/\\\n]* { // some word
+ addOutput(yyscanner,yytext);
+ }
+<FormatBlock>{DOCNL} { // new line
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<FormatBlock>"/*" { // start of a C-comment
+ if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim")) yyextra->commentCount++;
+ addOutput(yyscanner,yytext);
+ }
+<FormatBlock>"*/" { // end of a C-comment
+ addOutput(yyscanner,yytext);
+ if (!(yyextra->blockName=="code" || yyextra->blockName=="verbatim"))
{
yyextra->commentCount--;
- if (yyextra->commentCount<0)
- {
- warn(yyextra->fileName,yyextra->lineNr,
- "found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",yyextra->blockName.data(),yyextra->blockName.data());
- }
- }
- }
-<FormatBlock>. {
- addOutput(yyscanner,*yytext);
- }
-<FormatBlock><<EOF>> {
+ if (yyextra->commentCount<0)
+ {
+ warn(yyextra->fileName,yyextra->lineNr,
+ "found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",yyextra->blockName.data(),yyextra->blockName.data());
+ }
+ }
+ }
+<FormatBlock>. {
+ addOutput(yyscanner,*yytext);
+ }
+<FormatBlock><<EOF>> {
QCString endTag = "end"+yyextra->blockName;
if (yyextra->blockName=="startuml") endTag="enduml";
warn(yyextra->fileName,yyextra->lineNr,
- "reached end of comment while inside a \\%s block; check for missing \\%s tag!",
- yyextra->blockName.data(),endTag.data()
- );
- yyterminate();
- }
+ "reached end of comment while inside a \\%s block; check for missing \\%s tag!",
+ yyextra->blockName.data(),endTag.data()
+ );
+ yyterminate();
+ }
/* ----- handle arguments of if/ifnot commands ------- */
-<GuardParam>{B}*"(" {
+<GuardParam>{B}*"(" {
yyextra->guardExpr=yytext;
yyextra->roundCount=1;
BEGIN(GuardExpr);
@@ -1531,383 +1503,388 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
}
<GuardExpr>\n {
- warn(yyextra->fileName,yyextra->lineNr,
- "invalid expression '%s' for yyextra->guards",yyextra->guardExpr.data());
+ warn(yyextra->fileName,yyextra->lineNr,
+ "invalid expression '%s' for yyextra->guards",yyextra->guardExpr.data());
unput(*yytext);
BEGIN(GuardParam);
}
-<GuardParam>{B}*[a-z_A-Z0-9.\-]+ { // parameter of if/ifnot yyextra->guards
+<GuardParam>{B}*[a-z_A-Z0-9.\-]+ { // parameter of if/ifnot yyextra->guards
handleGuard(yyscanner,yytext);
- }
-<GuardParam>{DOCNL} { // end of argument
- if (*yytext=='\n') yyextra->lineNr++;
- //next line is commented out due to bug620924
- //addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<GuardParam>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<GuardParam>. { // ignore other stuff
- addOutput(yyscanner,*yytext);
- }
-<GuardParamEnd>{B}*{DOCNL} {
- lineCount(yyscanner);
- yyextra->spaceBeforeIf.resize(0);
- BEGIN(Comment);
- }
-<GuardParamEnd>{B}* {
- if (!yyextra->spaceBeforeIf.isEmpty()) // needed for 665313 in combination with bug620924
- {
- addOutput(yyscanner,yyextra->spaceBeforeIf);
- }
- yyextra->spaceBeforeIf.resize(0);
- BEGIN(Comment);
- }
-<GuardParamEnd>. {
- unput(*yytext);
- BEGIN(Comment);
- }
+ }
+<GuardParam>{DOCNL} { // end of argument
+ if (*yytext=='\n') yyextra->lineNr++;
+ //next line is commented out due to bug620924
+ //addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<GuardParam>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<GuardParam>. { // ignore other stuff
+ addOutput(yyscanner,*yytext);
+ }
+<GuardParamEnd>{B}*{DOCNL} {
+ lineCount(yyscanner);
+ yyextra->spaceBeforeIf.resize(0);
+ BEGIN(Comment);
+ }
+<GuardParamEnd>{B}* {
+ if (!yyextra->spaceBeforeIf.isEmpty()) // needed for 665313 in combination with bug620924
+ {
+ addOutput(yyscanner,yyextra->spaceBeforeIf);
+ }
+ yyextra->spaceBeforeIf.resize(0);
+ BEGIN(Comment);
+ }
+<GuardParamEnd>. {
+ unput(*yytext);
+ BEGIN(Comment);
+ }
/* ----- handle skipping of conditional sections ------- */
-<SkipGuardedSection>{CMD}"ifnot"/{NW} {
+<SkipGuardedSection>{CMD}"ifnot"/{NW} {
yyextra->guardType = Guard_IfNot;
- BEGIN( GuardParam );
- }
-<SkipGuardedSection>{CMD}"if"/{NW} {
+ BEGIN( GuardParam );
+ }
+<SkipGuardedSection>{CMD}"if"/{NW} {
yyextra->guardType = Guard_If;
- BEGIN( GuardParam );
- }
-<SkipGuardedSection>{CMD}"endif"/{NW} {
- if (yyextra->guards.isEmpty())
- {
- warn(yyextra->fileName,yyextra->lineNr,
- "found \\endif without matching start command");
- }
- else
- {
- GuardedSection *s = yyextra->guards.pop();
- bool parentVisible = s->parentVisible();
- delete s;
+ BEGIN( GuardParam );
+ }
+<SkipGuardedSection>{CMD}"endif"/{NW} {
+ if (yyextra->guards.empty())
+ {
+ warn(yyextra->fileName,yyextra->lineNr,
+ "found \\endif without matching start command");
+ }
+ else
+ {
+ GuardedSection s = yyextra->guards.top();
+ yyextra->guards.pop();
+ bool parentVisible = s.parentVisible();
if (parentVisible)
{
- yyextra->enabledSectionFound=TRUE;
- BEGIN( GuardParamEnd );
+ yyextra->enabledSectionFound=TRUE;
+ BEGIN( GuardParamEnd );
}
- }
- }
-<SkipGuardedSection>{CMD}"else"/{NW} {
- if (yyextra->guards.isEmpty())
- {
- warn(yyextra->fileName,yyextra->lineNr,
- "found \\else without matching start command");
- }
- else
- {
- if (!yyextra->enabledSectionFound && yyextra->guards.top()->parentVisible())
- {
- delete yyextra->guards.pop();
- yyextra->guards.push(new GuardedSection(TRUE,TRUE));
- yyextra->enabledSectionFound=TRUE;
- BEGIN( GuardParamEnd );
- }
- }
- }
+ }
+ }
+<SkipGuardedSection>{CMD}"else"/{NW} {
+ if (yyextra->guards.empty())
+ {
+ warn(yyextra->fileName,yyextra->lineNr,
+ "found \\else without matching start command");
+ }
+ else
+ {
+ if (!yyextra->enabledSectionFound && yyextra->guards.top().parentVisible())
+ {
+ yyextra->guards.pop();
+ yyextra->guards.push(GuardedSection(TRUE,TRUE));
+ yyextra->enabledSectionFound=TRUE;
+ BEGIN( GuardParamEnd );
+ }
+ }
+ }
<SkipGuardedSection>{CMD}"elseif"/{NW} {
- if (yyextra->guards.isEmpty())
- {
- warn(yyextra->fileName,yyextra->lineNr,
- "found \\elseif without matching start command");
- }
- else
- {
- if (!yyextra->enabledSectionFound && yyextra->guards.top()->parentVisible())
- {
+ if (yyextra->guards.empty())
+ {
+ warn(yyextra->fileName,yyextra->lineNr,
+ "found \\elseif without matching start command");
+ }
+ else
+ {
+ if (!yyextra->enabledSectionFound && yyextra->guards.top().parentVisible())
+ {
yyextra->guardType=Guard_If;
- delete yyextra->guards.pop();
- BEGIN( GuardParam );
- }
- }
- }
-<SkipGuardedSection>{DOCNL} { // skip line
- if (*yytext=='\n') yyextra->lineNr++;
- //addOutput(yyscanner,'\n');
- }
-<SkipGuardedSection>[^ \\@\n]+ { // skip non-special characters
- }
-<SkipGuardedSection>. { // any other character
- }
+ yyextra->guards.pop();
+ BEGIN( GuardParam );
+ }
+ }
+ }
+<SkipGuardedSection>{DOCNL} { // skip line
+ if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ }
+<SkipGuardedSection>[^ \\@\n]+ { // skip non-special characters
+ }
+<SkipGuardedSection>. { // any other character
+ }
/* ----- handle skipping of internal section ------- */
-<SkipInternal>{DOCNL} { // skip line
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<SkipInternal>[@\\]"if"/[ \t] {
+<SkipInternal>{DOCNL} { // skip line
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<SkipInternal>[@\\]"if"/[ \t] {
yyextra->condCount++;
- }
-<SkipInternal>[@\\]"ifnot"/[ \t] {
+ }
+<SkipInternal>[@\\]"ifnot"/[ \t] {
yyextra->condCount++;
- }
-<SkipInternal>[@\\]/"endif" {
+ }
+<SkipInternal>[@\\]/"endif" {
yyextra->condCount--;
- if (yyextra->condCount<0) // handle conditional section around of \internal, see bug607743
- {
- unput('\\');
- BEGIN(Comment);
- }
- }
-<SkipInternal>[@\\]/"section"[ \t] {
- if (yyextra->sectionLevel>0)
- {
- unput('\\');
- BEGIN(Comment);
- }
- }
-<SkipInternal>[@\\]/"subsection"[ \t] {
- if (yyextra->sectionLevel>1)
- {
- unput('\\');
- BEGIN(Comment);
- }
- }
-<SkipInternal>[@\\]/"subsubsection"[ \t] {
- if (yyextra->sectionLevel>2)
- {
- unput('\\');
- BEGIN(Comment);
- }
- }
-<SkipInternal>[@\\]/"paragraph"[ \t] {
- if (yyextra->sectionLevel>3)
- {
- unput('\\');
- BEGIN(Comment);
- }
- }
+ if (yyextra->condCount<0) // handle conditional section around of \internal, see bug607743
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+<SkipInternal>[@\\]/"section"[ \t] {
+ if (yyextra->sectionLevel>0)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+<SkipInternal>[@\\]/"subsection"[ \t] {
+ if (yyextra->sectionLevel>1)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+<SkipInternal>[@\\]/"subsubsection"[ \t] {
+ if (yyextra->sectionLevel>2)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+<SkipInternal>[@\\]/"paragraph"[ \t] {
+ if (yyextra->sectionLevel>3)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
<SkipInternal>[@\\]"endinternal"[ \t]* {
- BEGIN(Comment);
- }
-<SkipInternal>[^ \\@\n]+ { // skip non-special characters
- }
-<SkipInternal>. { // any other character
- }
+ BEGIN(Comment);
+ }
+<SkipInternal>[^ \\@\n]+ { // skip non-special characters
+ }
+<SkipInternal>. { // any other character
+ }
/* ----- handle argument of name command ------- */
-<NameParam>{DOCNL} { // end of argument
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<NameParam>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- Doxygen::docGroup.appendHeader(' ');
- }
-<NameParam>. { // ignore other stuff
- Doxygen::docGroup.appendHeader(*yytext);
- yyextra->current->name+=*yytext;
- }
+<NameParam>{DOCNL} { // end of argument
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ unput_string(yytext,yyleng);
+ BEGIN( Comment );
+ }
+<NameParam>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ yyextra->docGroup.appendHeader(' ');
+ }
+<NameParam>. { // ignore other stuff
+ yyextra->docGroup.appendHeader(*yytext);
+ yyextra->current->name+=*yytext;
+ }
/* ----- handle argument of noop command ------- */
-<Noop>{DOCNL} { // end of argument
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<Noop>. { // ignore other stuff
- }
+<Noop>{DOCNL} { // end of argument
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<Noop>. { // ignore other stuff
+ }
/* ----- handle argument of ingroup command ------- */
-<InGroupParam>{LABELID} { // group id
- yyextra->current->groups.push_back(
- Grouping(yytext, Grouping::GROUPING_INGROUP)
- );
- yyextra->inGroupParamFound=TRUE;
- }
-<InGroupParam>{DOCNL} { // missing argument
- if (!yyextra->inGroupParamFound)
- {
- warn(yyextra->fileName,yyextra->lineNr,
- "Missing group name for \\ingroup command"
- );
- }
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<InGroupParam>{LC} { // line continuation
- yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- }
-<InGroupParam>. { // ignore other stuff
- addOutput(yyscanner,*yytext);
- }
+<InGroupParam>{LABELID} { // group id
+ yyextra->current->groups.push_back(
+ Grouping(yytext, Grouping::GROUPING_INGROUP)
+ );
+ yyextra->inGroupParamFound=TRUE;
+ }
+<InGroupParam>{DOCNL} { // missing argument
+ if (!yyextra->inGroupParamFound)
+ {
+ warn(yyextra->fileName,yyextra->lineNr,
+ "Missing group name for \\ingroup command"
+ );
+ }
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ unput_string(yytext,yyleng);
+ BEGIN( Comment );
+ }
+<InGroupParam>{LC} { // line continuation
+ yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ }
+<InGroupParam>. { // ignore other stuff
+ addOutput(yyscanner,*yytext);
+ }
/* ----- handle argument of fn command ------- */
-<FnParam>{DOCNL} { // end of argument
- if (yyextra->braceCount==0)
- {
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- yyextra->langParser->parsePrototype(yyextra->functionProto);
- BEGIN( Comment );
- }
- }
-<FnParam>{LC} { // line continuation
- yyextra->lineNr++;
- yyextra->functionProto+=' ';
- }
-<FnParam>[^@\\\n()]+ { // non-special characters
+<FnParam>{DOCNL} { // end of argument
+ if (yyextra->braceCount==0)
+ {
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ unput_string(yytext,yyleng);
+ yyextra->langParser->parsePrototype(yyextra->functionProto);
+ BEGIN( Comment );
+ }
+ }
+<FnParam>{LC} { // line continuation
+ yyextra->lineNr++;
+ yyextra->functionProto+=' ';
+ }
+<FnParam>[^@\\\n()]+ { // non-special characters
yyextra->functionProto+=yytext;
- }
-<FnParam>"(" {
+ }
+<FnParam>"(" {
yyextra->functionProto+=yytext;
- yyextra->braceCount++;
- }
-<FnParam>")" {
+ yyextra->braceCount++;
+ }
+<FnParam>")" {
yyextra->functionProto+=yytext;
- yyextra->braceCount--;
- }
-<FnParam>. { // add other stuff
+ yyextra->braceCount--;
+ }
+<FnParam>. { // add other stuff
yyextra->functionProto+=*yytext;
- }
+ }
/* ----- handle argument of overload command ------- */
-<OverloadParam>{DOCNL} { // end of argument
- if (*yytext=='\n') yyextra->lineNr++;
- if (yyextra->functionProto.stripWhiteSpace().isEmpty())
- { // plain overload command
- addOutput(yyscanner,getOverloadDocs());
- addOutput(yyscanner,'\n');
- }
- else // overload declaration
- {
+<OverloadParam>{DOCNL} { // end of argument
+ if (*yytext=='\n') yyextra->lineNr++;
+ if (yyextra->functionProto.stripWhiteSpace().isEmpty())
+ { // plain overload command
+ addOutput(yyscanner,getOverloadDocs());
+ addOutput(yyscanner,'\n');
+ }
+ else // overload declaration
+ {
makeStructuralIndicator(yyscanner,Entry::OVERLOADDOC_SEC);
- yyextra->langParser->parsePrototype(yyextra->functionProto);
- }
- BEGIN( Comment );
- }
-<OverloadParam>{LC} { // line continuation
- yyextra->lineNr++;
- yyextra->functionProto+=' ';
- }
-<OverloadParam>. { // add other stuff
+ yyextra->langParser->parsePrototype(yyextra->functionProto);
+ }
+ BEGIN( Comment );
+ }
+<OverloadParam>{LC} { // line continuation
+ yyextra->lineNr++;
+ yyextra->functionProto+=' ';
+ }
+<OverloadParam>. { // add other stuff
yyextra->functionProto+=*yytext;
- }
+ }
/* ----- handle argument of inherit command ------- */
-<InheritParam>({ID}("::"|"."))*{ID} { // found argument
- yyextra->current->extends.push_back(
- BaseInfo(removeRedundantWhiteSpace(yytext),Public,Normal)
- );
- BEGIN( Comment );
- }
-<InheritParam>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
- "\\inherit command has no argument"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<InheritParam>. { // invalid character for anchor label
- warn(yyextra->fileName,yyextra->lineNr,
- "Invalid or missing name for \\inherit command"
- );
- BEGIN(Comment);
- }
+<InheritParam>({ID}("::"|"."))*{ID} { // found argument
+ yyextra->current->extends.push_back(
+ BaseInfo(removeRedundantWhiteSpace(yytext),Public,Normal)
+ );
+ BEGIN( Comment );
+ }
+<InheritParam>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
+ "\\inherit command has no argument"
+ );
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ BEGIN( Comment );
+ }
+<InheritParam>. { // invalid character for anchor label
+ warn(yyextra->fileName,yyextra->lineNr,
+ "Invalid or missing name for \\inherit command"
+ );
+ BEGIN(Comment);
+ }
/* ----- handle argument of extends and implements commands ------- */
-<ExtendsParam>({ID}("::"|"."))*{ID} { // found argument
- yyextra->current->extends.push_back(
- BaseInfo(removeRedundantWhiteSpace(yytext),Public,Normal)
- );
- BEGIN( Comment );
- }
-<ExtendsParam>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
- "\\extends or \\implements command has no argument"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<ExtendsParam>. { // ignore other stuff
- }
+<ExtendsParam>({ID}("::"|"."))*{ID} { // found argument
+ yyextra->current->extends.push_back(
+ BaseInfo(removeRedundantWhiteSpace(yytext),Public,Normal)
+ );
+ BEGIN( Comment );
+ }
+<ExtendsParam>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
+ "'\\%s' command has no argument",yyextra->currentCmd.data()
+ );
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ unput_string(yytext,yyleng);
+ BEGIN( Comment );
+ }
+<ExtendsParam>. { // ignore other stuff
+ }
/* ----- handle language specific sections ------- */
-<SkipLang>[\\@]"~"[a-zA-Z-]* { /* language switch */
- QCString langId = &yytext[2];
- if (langId.isEmpty() ||
- qstricmp(Config_getEnum(OUTPUT_LANGUAGE),langId)==0)
- { // enable language specific section
- BEGIN(Comment);
- }
- }
-<SkipLang>[^*@\\\n]* { /* any character not a *, @, backslash or new line */
- }
-<SkipLang>{DOCNL} { /* new line in verbatim block */
- if (*yytext=='\n') yyextra->lineNr++;
- }
-<SkipLang>. { /* any other character */
- }
+<SkipLang>[\\@]"~"[a-zA-Z-]* { /* language switch */
+ QCString langId = &yytext[2];
+ if (langId.isEmpty() ||
+ qstricmp(Config_getEnum(OUTPUT_LANGUAGE),langId)==0)
+ { // enable language specific section
+ BEGIN(Comment);
+ }
+ }
+<SkipLang>[^*@\\\n]* { /* any character not a *, @, backslash or new line */
+ }
+<SkipLang>{DOCNL} { /* new line in verbatim block */
+ if (*yytext=='\n') yyextra->lineNr++;
+ }
+<SkipLang>. { /* any other character */
+ }
/* ----- handle arguments of the cite command ------- */
-<CiteLabel>{CITEID} { // found argument
- addCite(yyscanner);
+<CiteLabel>{CITEID} { // found argument
+ addCite(yyscanner);
addOutput(yyscanner,yytext);
- BEGIN(Comment);
- }
-<CiteLabel>{DOCNL} { // missing argument
- warn(yyextra->fileName,yyextra->lineNr,
- "\\cite command has no label"
- );
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- BEGIN( Comment );
- }
-<CiteLabel>. { // invalid character for cite label
- warn(yyextra->fileName,yyextra->lineNr,
- "Invalid or missing cite label"
- );
- BEGIN(Comment);
- }
+ BEGIN(Comment);
+ }
+<CiteLabel>{DOCNL} { // missing argument
+ warn(yyextra->fileName,yyextra->lineNr,
+ "\\cite command has no label"
+ );
+ //if (*yytext=='\n') yyextra->lineNr++;
+ //addOutput(yyscanner,'\n');
+ unput_string(yytext,yyleng);
+ BEGIN( Comment );
+ }
+<CiteLabel>. { // invalid character for cite label
+ warn(yyextra->fileName,yyextra->lineNr,
+ "Invalid or missing cite label"
+ );
+ BEGIN(Comment);
+ }
/* ----- handle argument of the copydoc command ------- */
-<CopyDoc><<EOF>> |
-<CopyDoc>{DOCNL} {
- if (*yytext=='\n') yyextra->lineNr++;
- addOutput(yyscanner,'\n');
- setOutput(yyscanner,OutputDoc);
+<CopyDoc><<EOF>> |
+<CopyDoc>{DOCNL} {
+ if (*yytext=='\n') yyextra->lineNr++;
+ addOutput(yyscanner,'\n');
+ setOutput(yyscanner,OutputDoc);
addOutput(yyscanner," \\copydetails ");
- addOutput(yyscanner,yyextra->copyDocArg);
- addOutput(yyscanner,"\n");
- BEGIN(Comment);
- }
-<CopyDoc>[^\n\\]+ {
- yyextra->copyDocArg+=yytext;
- addOutput(yyscanner,yytext);
- }
-<CopyDoc>. {
- yyextra->copyDocArg+=yytext;
- addOutput(yyscanner,yytext);
- }
+ addOutput(yyscanner,yyextra->copyDocArg);
+ addOutput(yyscanner,"\n");
+ BEGIN(Comment);
+ }
+<CopyDoc>[^\n\\]+ {
+ yyextra->copyDocArg+=yytext;
+ addOutput(yyscanner,yytext);
+ }
+<CopyDoc>. {
+ yyextra->copyDocArg+=yytext;
+ addOutput(yyscanner,yytext);
+ }
%%
@@ -1961,7 +1938,6 @@ static bool handleDefGroup(yyscan_t yyscanner,const QCString &, const QCStringLi
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::GROUPDOC_SEC);
yyextra->current->groupDocType = Entry::GROUPDOC_NORMAL;
- setOutput(yyscanner,OutputBrief);
BEGIN( GroupDocArg1 );
return stop;
}
@@ -2000,11 +1976,12 @@ static bool handlePackage(yyscan_t yyscanner,const QCString &, const QCStringLis
return stop;
}
-static bool handleClass(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleClass(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::CLASSDOC_SEC);
- BEGIN( ClassDocArg1 );
+ yyextra->currentCmd = cmd;
+ BEGIN( ClassDocArg1 );
return stop;
}
@@ -2015,51 +1992,57 @@ static bool handleHeaderFile(yyscan_t yyscanner,const QCString &, const QCString
return FALSE;
}
-static bool handleProtocol(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleProtocol(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{ // Obj-C protocol
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::PROTOCOLDOC_SEC);
- BEGIN( ClassDocArg1 );
+ yyextra->currentCmd = cmd;
+ BEGIN( ClassDocArg1 );
return stop;
}
-static bool handleCategory(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleCategory(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{ // Obj-C category
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::CATEGORYDOC_SEC);
- BEGIN( CategoryDocArg1 );
+ yyextra->currentCmd = cmd;
+ BEGIN( CategoryDocArg1 );
return stop;
}
-static bool handleUnion(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleUnion(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::UNIONDOC_SEC);
- BEGIN( ClassDocArg1 );
+ yyextra->currentCmd = cmd;
+ BEGIN( ClassDocArg1 );
return stop;
}
-static bool handleStruct(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleStruct(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::STRUCTDOC_SEC);
- BEGIN( ClassDocArg1 );
+ yyextra->currentCmd = cmd;
+ BEGIN( ClassDocArg1 );
return stop;
}
-static bool handleInterface(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleInterface(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::INTERFACEDOC_SEC);
- BEGIN( ClassDocArg1 );
+ yyextra->currentCmd = cmd;
+ BEGIN( ClassDocArg1 );
return stop;
}
-static bool handleIdlException(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleIdlException(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::EXCEPTIONDOC_SEC);
- BEGIN( ClassDocArg1 );
+ yyextra->currentCmd = cmd;
+ BEGIN( ClassDocArg1 );
return stop;
}
@@ -2076,7 +2059,7 @@ static bool handleMainpage(yyscan_t yyscanner,const QCString &, const QCStringLi
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::MAINPAGEDOC_SEC);
yyextra->current->name = "";
- if (!stop)
+ if (!stop)
{
yyextra->current->name = "mainpage";
}
@@ -2088,7 +2071,7 @@ static bool handleFile(yyscan_t yyscanner,const QCString &, const QCStringList &
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool stop=makeStructuralIndicator(yyscanner,Entry::FILEDOC_SEC);
- if (!stop)
+ if (!stop)
{
yyextra->current->name = yyextra->fileName;
}
@@ -2138,7 +2121,7 @@ static bool handleExample(yyscan_t yyscanner,const QCString &cmd, const QCString
else
{
warn(yyextra->fileName,yyextra->lineNr,
- "unsupported option '%s' for command '\\%s'",qPrint(opt),qPrint(cmd));
+ "unsupported option '%s' for command '\\%s'",qPrint(opt),qPrint(cmd));
}
}
bool stop=makeStructuralIndicator(yyscanner,section);
@@ -2152,8 +2135,8 @@ static bool handleDetails(yyscan_t yyscanner,const QCString &, const QCStringLis
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (yyextra->inContext!=OutputBrief)
{
- addOutput(yyscanner,"\n\n"); // treat @details outside brief description
- // as a new paragraph
+ addOutput(yyscanner,"\\ilinebr\\ilinebr "); // treat @details outside brief description
+ // as a new paragraph
}
setOutput(yyscanner,OutputDoc);
return FALSE;
@@ -2172,11 +2155,11 @@ static bool handleName(yyscan_t yyscanner,const QCString &, const QCStringList &
bool stop=makeStructuralIndicator(yyscanner,Entry::MEMBERGRP_SEC);
if (!stop)
{
- Doxygen::docGroup.clearHeader();
+ yyextra->docGroup.clearHeader();
BEGIN( NameParam );
- if (!Doxygen::docGroup.isEmpty()) // end of previous member group
+ if (!yyextra->docGroup.isEmpty()) // end of previous member group
{
- Doxygen::docGroup.close(yyextra->current,yyextra->fileName,yyextra->lineNr,TRUE,true);
+ yyextra->docGroup.close(yyextra->current,yyextra->fileName,yyextra->lineNr,TRUE,true);
}
}
return stop;
@@ -2232,9 +2215,9 @@ static bool handleParBlock(yyscan_t yyscanner,const QCString &, const QCStringLi
if (yyextra->insideParBlock)
{
warn(yyextra->fileName,yyextra->lineNr,
- "found \\parblock command while already in a parblock!");
+ "found \\parblock command while already in a parblock!");
}
- if (!yyextra->spaceBeforeCmd.isEmpty())
+ if (!yyextra->spaceBeforeCmd.isEmpty())
{
addOutput(yyscanner,yyextra->spaceBeforeCmd);
yyextra->spaceBeforeCmd.resize(0);
@@ -2250,7 +2233,7 @@ static bool handleEndParBlock(yyscan_t yyscanner,const QCString &, const QCStrin
if (!yyextra->insideParBlock)
{
warn(yyextra->fileName,yyextra->lineNr,
- "found \\endparblock command without matching \\parblock!");
+ "found \\endparblock command without matching \\parblock!");
}
addOutput(yyscanner,"@endparblock");
setOutput(yyscanner,OutputDoc); // to end a parblock inside a xrefitem like context
@@ -2258,41 +2241,43 @@ static bool handleEndParBlock(yyscan_t yyscanner,const QCString &, const QCStrin
return FALSE;
}
-static bool handleRelated(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleRelated(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (!yyextra->current->relates.isEmpty())
{
warn(yyextra->fileName,yyextra->lineNr,
- "found multiple \\relates, \\relatesalso or \\memberof commands in a comment block, using last definition");
+ "found multiple \\relates, \\relatesalso or \\memberof commands in a comment block, using last definition");
}
yyextra->current->relatesType = Simple;
BEGIN(RelatesParam1);
return FALSE;
}
-static bool handleRelatedAlso(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleRelatedAlso(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (!yyextra->current->relates.isEmpty())
{
warn(yyextra->fileName,yyextra->lineNr,
- "found multiple \\relates, \\relatesalso or \\memberof commands in a comment block, using last definition");
+ "found multiple \\relates, \\relatesalso or \\memberof commands in a comment block, using last definition");
}
yyextra->current->relatesType = Duplicate;
+ yyextra->currentCmd = cmd;
BEGIN(RelatesParam1);
return FALSE;
}
-static bool handleMemberOf(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleMemberOf(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (!yyextra->current->relates.isEmpty())
{
warn(yyextra->fileName,yyextra->lineNr,
- "found multiple \\relates, \\relatesalso or \\memberof commands in a comment block, using last definition");
+ "found multiple \\relates, \\relatesalso or \\memberof commands in a comment block, using last definition");
}
yyextra->current->relatesType = MemberOf;
+ yyextra->currentCmd = cmd;
BEGIN(RelatesParam1);
return FALSE;
}
@@ -2321,15 +2306,15 @@ static bool handleSection(yyscan_t yyscanner,const QCString &s, const QCStringLi
static bool handleSubpage(yyscan_t yyscanner,const QCString &s, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (yyextra->current->section!=Entry::EMPTY_SEC &&
+ if (yyextra->current->section!=Entry::EMPTY_SEC &&
yyextra->current->section!=Entry::PAGEDOC_SEC &&
yyextra->current->section!=Entry::MAINPAGEDOC_SEC
)
{
warn(yyextra->fileName,yyextra->lineNr,
- "found \\subpage command in a comment block that is not marked as a page!");
+ "found \\subpage command in a comment block that is not marked as a page!");
}
- if (!yyextra->spaceBeforeCmd.isEmpty())
+ if (!yyextra->spaceBeforeCmd.isEmpty())
{
addOutput(yyscanner,yyextra->spaceBeforeCmd);
yyextra->spaceBeforeCmd.resize(0);
@@ -2350,7 +2335,7 @@ static bool handleAnchor(yyscan_t yyscanner,const QCString &s, const QCStringLis
static bool handleCite(yyscan_t yyscanner,const QCString &s, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (!yyextra->spaceBeforeCmd.isEmpty())
+ if (!yyextra->spaceBeforeCmd.isEmpty())
{
addOutput(yyscanner,yyextra->spaceBeforeCmd);
yyextra->spaceBeforeCmd.resize(0);
@@ -2409,14 +2394,15 @@ static bool handleIfNot(yyscan_t yyscanner,const QCString &, const QCStringList
static bool handleElseIf(yyscan_t yyscanner,const QCString &, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (yyextra->guards.isEmpty())
+ if (yyextra->guards.empty())
{
warn(yyextra->fileName,yyextra->lineNr,
- "found \\else without matching start command");
+ "found \\else without matching start command");
}
else
{
yyextra->guardType = yyextra->enabledSectionFound ? Guard_Skip : Guard_If;
+ yyextra->spaceBeforeIf = yyextra->spaceBeforeCmd;
BEGIN(GuardParam);
}
return FALSE;
@@ -2425,13 +2411,14 @@ static bool handleElseIf(yyscan_t yyscanner,const QCString &, const QCStringList
static bool handleElse(yyscan_t yyscanner,const QCString &, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (yyextra->guards.isEmpty())
+ if (yyextra->guards.empty())
{
warn(yyextra->fileName,yyextra->lineNr,
- "found \\else without matching start command");
+ "found \\else without matching start command");
}
else
{
+ yyextra->spaceBeforeIf = yyextra->spaceBeforeCmd;
BEGIN( SkipGuardedSection );
}
return FALSE;
@@ -2440,17 +2427,17 @@ static bool handleElse(yyscan_t yyscanner,const QCString &, const QCStringList &
static bool handleEndIf(yyscan_t yyscanner,const QCString &, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (yyextra->guards.isEmpty())
+ if (yyextra->guards.empty())
{
warn(yyextra->fileName,yyextra->lineNr,
- "found \\endif without matching start command");
+ "found \\endif without matching start command");
}
else
{
- delete yyextra->guards.pop();
+ yyextra->guards.pop();
}
yyextra->enabledSectionFound=FALSE;
- if (!yyextra->spaceBeforeCmd.isEmpty())
+ if (!yyextra->spaceBeforeCmd.isEmpty())
{
addOutput(yyscanner,yyextra->spaceBeforeCmd);
yyextra->spaceBeforeCmd.resize(0);
@@ -2470,7 +2457,7 @@ static bool handleIngroup(yyscan_t yyscanner,const QCString &, const QCStringLis
static bool handleNoSubGrouping(yyscan_t yyscanner,const QCString &, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- yyextra->current->subGrouping = FALSE;
+ yyextra->current->subGrouping = FALSE;
return FALSE;
}
@@ -2552,7 +2539,7 @@ static bool handleInternal(yyscan_t yyscanner,const QCString &, const QCStringLi
// make sure some whitespace before a \internal command
// is not treated as "documentation"
if (yyextra->current->doc.stripWhiteSpace().isEmpty())
- {
+ {
yyextra->current->doc.resize(0);
}
yyextra->condCount=0;
@@ -2561,32 +2548,23 @@ static bool handleInternal(yyscan_t yyscanner,const QCString &, const QCStringLi
else
{
// re-enabled for bug640828
- addOutput(yyscanner," \\internal ");
+ addOutput(yyscanner," \\internal ");
yyextra->inInternalDocs = TRUE;
}
return FALSE;
}
-static bool handleLineBr(yyscan_t yyscanner,const QCString &, const QCStringList &)
-{
- struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- addOutput(yyscanner,'\n');
- return FALSE;
-}
-
static bool handleStatic(yyscan_t yyscanner,const QCString &, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- endBrief(yyscanner);
- yyextra->current->stat = TRUE;
+ yyextra->current->stat = TRUE;
return FALSE;
}
static bool handlePure(yyscan_t yyscanner,const QCString &, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- endBrief(yyscanner);
- yyextra->current->virt = Pure;
+ yyextra->current->virt = Pure;
return FALSE;
}
@@ -2635,7 +2613,7 @@ static bool handlePublicSection(yyscan_t yyscanner,const QCString &, const QCStr
static bool handleToc(yyscan_t yyscanner,const QCString &, const QCStringList &optList)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (yyextra->current->section==Entry::PAGEDOC_SEC ||
+ if (yyextra->current->section==Entry::PAGEDOC_SEC ||
yyextra->current->section==Entry::MAINPAGEDOC_SEC)
{
QCStringList::ConstIterator it;
@@ -2700,9 +2678,10 @@ static bool handleInherit(yyscan_t yyscanner,const QCString &, const QCStringLis
return FALSE;
}
-static bool handleExtends(yyscan_t yyscanner,const QCString &, const QCStringList &)
+static bool handleExtends(yyscan_t yyscanner,const QCString &cmd, const QCStringList &)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yyextra->currentCmd = cmd;
BEGIN(ExtendsParam);
return FALSE;
}
@@ -2716,7 +2695,7 @@ static bool handleCopyBrief(yyscan_t yyscanner,const QCString &, const QCStringL
// otherwise it will be copied inline (see bug691315 & bug700788)
setOutput(yyscanner,OutputBrief);
}
- if (!yyextra->spaceBeforeCmd.isEmpty())
+ if (!yyextra->spaceBeforeCmd.isEmpty())
{
addOutput(yyscanner,yyextra->spaceBeforeCmd);
yyextra->spaceBeforeCmd.resize(0);
@@ -2729,7 +2708,7 @@ static bool handleCopyDetails(yyscan_t yyscanner,const QCString &, const QCStrin
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
setOutput(yyscanner,OutputDoc);
- if (!yyextra->spaceBeforeCmd.isEmpty())
+ if (!yyextra->spaceBeforeCmd.isEmpty())
{
addOutput(yyscanner,yyextra->spaceBeforeCmd);
yyextra->spaceBeforeCmd.resize(0);
@@ -2742,7 +2721,7 @@ static bool handleCopyDoc(yyscan_t yyscanner,const QCString &, const QCStringLis
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
setOutput(yyscanner,OutputBrief);
- if (!yyextra->spaceBeforeCmd.isEmpty())
+ if (!yyextra->spaceBeforeCmd.isEmpty())
{
addOutput(yyscanner,yyextra->spaceBeforeCmd);
yyextra->spaceBeforeCmd.resize(0);
@@ -2760,7 +2739,7 @@ static void initParser(yyscan_t yyscanner)
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
yyextra->sectionLabel.resize(0);
yyextra->sectionTitle.resize(0);
- Doxygen::docGroup.clearHeader();
+ yyextra->docGroup.clearHeader();
yyextra->insideParBlock = FALSE;
}
@@ -2790,7 +2769,7 @@ static bool getDocSectionName(int s)
case Entry::EXAMPLE_SEC:
case Entry::MEMBERGRP_SEC:
return TRUE;
- default:
+ default:
return FALSE;
}
}
@@ -2811,6 +2790,7 @@ static bool makeStructuralIndicator(yyscan_t yyscanner,Entry::Sections s)
yyextra->current->section = s;
yyextra->current->fileName = yyextra->fileName;
yyextra->current->startLine = yyextra->lineNr;
+ yyextra->current->docLine = yyextra->lineNr;
return FALSE;
}
}
@@ -2848,49 +2828,40 @@ static void addXRefItem(yyscan_t yyscanner,
if (listName==0) return;
//printf("addXRefItem(%s,%s,%s,%d)\n",listName,itemTitle,listTitle,append);
- const 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");
- }
- for (const ListItemInfo &item : yyextra->current->sli)
+ std::unique_lock<std::mutex> lock(g_sectionMutex);
+
+ RefList *refList = RefListManager::instance().add(listName,listTitle,itemTitle);
+ RefItem *item = 0;
+ for (auto it = yyextra->current->sli.rbegin(); it != yyextra->current->sli.rend(); ++it)
{
- if (qstrcmp(item.type,listName)==0)
+ RefItem *i = *it;
+ if (i && qstrcmp(i->list()->listName(),listName)==0)
{
- //printf("found %s lii->type=%s\n",listName,lii->type);
- lii = &item;
+ //printf("found %s lii->type=%s\n",listName,i->list()->listName().data());
+ item = i;
break;
}
}
- if (lii && append) // already found item of same type just before this one
+ if (item && append) // already found item of same type just before this one
{
- //printf("listName=%s item id = %d existing\n",listName,lii->itemId);
- RefItem *item = refList->getRefItem(lii->itemId);
- ASSERT(item!=0);
- item->text += " <p>";
- item->text += yyextra->outputXRef;
+ //printf("listName=%s item id = %d existing\n",listName,item->id());
+ item->setText(item->text() + " <p>" + yyextra->outputXRef);
//printf("%s: text +=%s\n",listName,item->text.data());
}
else // new item
{
- int itemId = refList->addRefItem();
- //printf("listName=%s item id = %d new yyextra->current=%p\n",listName,itemId,yyextra->current);
// if we have already an item from the same list type (e.g. a second @todo)
// in the same Entry (i.e. lii!=0) then we reuse its link anchor.
- char anchorLabel[1024];
- //sprintf(anchorLabel,"_%s%06d",listName,lii ? lii->itemId : itemId);
- sprintf(anchorLabel,"_%s%06d",listName,itemId);
- RefItem *item = refList->getRefItem(itemId);
- ASSERT(item!=0);
- item->text = yyextra->outputXRef;
- item->listAnchor = anchorLabel;
- yyextra->current->addSpecialListItem(listName,itemId);
+ item = refList->add();
+ //printf("listName=%s item id = %d new yyextra->current=%p\n",listName,item->id(),yyextra->current);
+ QCString anchorLabel;
+ anchorLabel.sprintf("_%s%06d",listName,item->id());
+ item->setText(yyextra->outputXRef);
+ item->setAnchor(anchorLabel);
+ yyextra->current->sli.push_back(item);
QCString cmdString;
- cmdString.sprintf(" \\xrefitem %s %d.",listName,itemId);
+ cmdString.sprintf(" \\xrefitem %s %d.",listName,item->id());
if (yyextra->inBody)
{
yyextra->current->inbodyDocs += cmdString;
@@ -2899,26 +2870,29 @@ static void addXRefItem(yyscan_t yyscanner,
{
yyextra->current->doc += cmdString;
}
- SectionInfo *si = Doxygen::sectionDict->find(anchorLabel);
- if (si)
+
{
- if (si->lineNr != -1)
+ SectionManager &sm = SectionManager::instance();
+ const SectionInfo *si = sm.find(anchorLabel);
+ if (si)
{
- warn(listName,yyextra->lineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",anchorLabel,si->fileName.data(),si->lineNr);
+ if (si->lineNr() != -1)
+ {
+ warn(listName,yyextra->lineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",anchorLabel.data(),si->fileName().data(),si->lineNr());
+ }
+ else
+ {
+ warn(listName,yyextra->lineNr,"multiple use of section label '%s', (first occurrence: %s)",anchorLabel.data(),si->fileName().data());
+ }
}
else
{
- warn(listName,yyextra->lineNr,"multiple use of section label '%s', (first occurrence: %s)",anchorLabel,si->fileName.data());
+ si = sm.add(anchorLabel,listName,yyextra->lineNr,
+ yyextra->sectionTitle,SectionType::Anchor,
+ yyextra->sectionLevel);
+ yyextra->current->anchors.push_back(si);
}
}
- else
- {
- si=new SectionInfo(listName,yyextra->lineNr,anchorLabel,
- yyextra->sectionTitle,SectionInfo::Anchor,
- yyextra->sectionLevel);
- Doxygen::sectionDict->append(anchorLabel,si);
- yyextra->current->anchors.push_back(si);
- }
}
yyextra->outputXRef.resize(0);
}
@@ -2929,50 +2903,41 @@ static void addXRefItem(yyscan_t yyscanner,
// not already added. Returns the label of the formula.
static QCString addFormula(yyscan_t yyscanner)
{
+ std::unique_lock<std::mutex> lock(g_formulaMutex);
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
QCString formLabel;
QCString fText=yyextra->formulaText.simplifyWhiteSpace();
- Formula *f=0;
- if ((f=Doxygen::formulaDict->find(fText))==0)
- {
- f = new Formula(fText);
- Doxygen::formulaList->append(f);
- Doxygen::formulaDict->insert(fText,f);
- formLabel.sprintf("\\_form#%d",f->getId());
- Doxygen::formulaNameDict->insert(formLabel,f);
- }
- else
- {
- formLabel.sprintf("\\_form#%d",f->getId());
- }
- int i;
- for (i=0;i<yyextra->formulaNewLines;i++) formLabel+="@_fakenl"; // add fake newlines to
- // keep the warnings
+ int id = FormulaManager::instance().addFormula(fText);
+ formLabel.sprintf("\\_form#%d",id);
+ for (int i=0;i<yyextra->formulaNewLines;i++) formLabel+="@_fakenl"; // add fake newlines to
+ // keep the warnings
// correctly aligned.
return formLabel;
}
//-----------------------------------------------------------------------------
-static SectionInfo::SectionType sectionLevelToType(int level)
+static SectionType sectionLevelToType(int level)
{
- if (level>=0 && level<5) return (SectionInfo::SectionType)level;
- return SectionInfo::Anchor;
+ if (level>=0 && level<5) return (SectionType)level;
+ return SectionType::Anchor;
}
static void addSection(yyscan_t yyscanner)
{
+ std::unique_lock<std::mutex> lock(g_sectionMutex);
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- SectionInfo *si = Doxygen::sectionDict->find(yyextra->sectionLabel);
+ SectionManager &sm = SectionManager::instance();
+ const SectionInfo *si = sm.find(yyextra->sectionLabel);
if (si)
{
- if (si->lineNr != -1)
+ if (si->lineNr() != -1)
{
- warn(yyextra->fileName,yyextra->lineNr,"multiple use of section label '%s' while adding section, (first occurrence: %s, line %d)",yyextra->sectionLabel.data(),si->fileName.data(),si->lineNr);
+ warn(yyextra->fileName,yyextra->lineNr,"multiple use of section label '%s' while adding section, (first occurrence: %s, line %d)",yyextra->sectionLabel.data(),si->fileName().data(),si->lineNr());
}
else
{
- warn(yyextra->fileName,yyextra->lineNr,"multiple use of section label '%s' while adding section, (first occurrence: %s)",yyextra->sectionLabel.data(),si->fileName.data());
+ warn(yyextra->fileName,yyextra->lineNr,"multiple use of section label '%s' while adding section, (first occurrence: %s)",yyextra->sectionLabel.data(),si->fileName().data());
}
}
else
@@ -2980,14 +2945,12 @@ static void addSection(yyscan_t yyscanner)
// create a new section element
yyextra->sectionTitle+=yytext;
yyextra->sectionTitle=yyextra->sectionTitle.stripWhiteSpace();
- si = new SectionInfo(yyextra->fileName,yyextra->lineNr,yyextra->sectionLabel,
- yyextra->sectionTitle,sectionLevelToType(yyextra->sectionLevel),yyextra->sectionLevel);
+ si = sm.add(yyextra->sectionLabel,yyextra->fileName,yyextra->lineNr,
+ yyextra->sectionTitle,sectionLevelToType(yyextra->sectionLevel),
+ yyextra->sectionLevel);
// add section to this entry
yyextra->current->anchors.push_back(si);
-
- // add section to the global dictionary
- Doxygen::sectionDict->append(yyextra->sectionLabel,si);
}
}
@@ -2995,14 +2958,15 @@ static void addSection(yyscan_t yyscanner)
static void addCite(yyscan_t yyscanner)
{
+ std::unique_lock<std::mutex> lock(g_citeMutex);
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
QCString name=yytext;
if (yytext[0] =='"')
{
name=yytext+1;
- name=name.left(yyleng-2);
+ name=name.left((int)yyleng-2);
}
- Doxygen::citeDict->insert(name.data());
+ CitationManager::instance().insert(name.data());
}
//-----------------------------------------------------------------------------
@@ -3013,8 +2977,24 @@ static void stripTrailingWhiteSpace(QCString &s)
uint len = s.length();
int i = (int)len-1;
char c;
- while (i>=0 && ((c = s.at(i))==' ' || c=='\t' || c=='\r')) i--;
- if (i!=(int)len-1)
+ while (i>=0)
+ {
+ c = s.at(i);
+ if (c==' ' || c=='\t' || c=='\r') // normal whitespace
+ {
+ i--;
+ }
+ else if (c=='r' && i>=7 && qstrncmp("\\ilinebr",s.data()+i-7,8)==0) // special line break marker
+ {
+ i-=8;
+ }
+ else // non-whitespace
+ {
+ break;
+ }
+ }
+ //printf("stripTrailingWhitespace(%s) i=%d len=%d\n",s.data(),i,len);
+ if (i!=(int)len-1)
{
s.resize(i+2); // string up to and including char at pos i and \0 terminator
}
@@ -3029,8 +3009,8 @@ static inline void setOutput(yyscan_t yyscanner,OutputContext ctx)
yyextra->xrefAppendFlag = !yyextra->inBody &&
yyextra->inContext==OutputXRef && ctx==OutputXRef && // two consecutive xref items
yyextra->newXRefKind==yyextra->xrefKind && // of the same kind
- (yyextra->xrefKind!=XRef_Item ||
- yyextra->newXRefItemKey==yyextra->xrefItemKey); // with the same key if \xrefitem
+ (yyextra->xrefKind!=XRef_Item ||
+ yyextra->newXRefItemKey==yyextra->xrefItemKey); // with the same key if \xrefitem
//printf("%d && %d && %d && (%d || %d)\n",
// yyextra->inContext==OutputXRef,
// ctx==OutputXRef,
@@ -3038,10 +3018,10 @@ static inline void setOutput(yyscan_t yyscanner,OutputContext ctx)
// yyextra->xrefKind!=XRef_Item,
// yyextra->newXRefItemKey==yyextra->xrefItemKey);
//printf("refKind=%d yyextra->newXRefKind=%d xrefAppendToPrev=%d yyextra->xrefAppendFlag=%d\n",
- // yyextra->xrefKind,yyextra->newXRefKind,xrefAppendToPrev,yyextra->xrefAppendFlag);
+ // yyextra->xrefKind,yyextra->newXRefKind,xrefAppendToPrev,yyextra->xrefAppendFlag);
//printf("setOutput(yyscanner,yyextra->inContext=%d ctx=%d)\n",yyextra->inContext,ctx);
- if (yyextra->inContext==OutputXRef) // end of XRef section => add the item
+ if (yyextra->inContext==OutputXRef) // end of XRef section => add the item
{
// See if we can append this new xref item to the previous one.
// We know this at the start of the next item of the same
@@ -3146,23 +3126,24 @@ static inline void setOutput(yyscan_t yyscanner,OutputContext ctx)
static void addAnchor(yyscan_t yyscanner,const char *anchor)
{
+ std::unique_lock<std::mutex> lock(g_sectionMutex);
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- SectionInfo *si = Doxygen::sectionDict->find(anchor);
+ SectionManager &sm = SectionManager::instance();
+ const SectionInfo *si = sm.find(anchor);
if (si)
{
- if (si->lineNr != -1)
+ if (si->lineNr() != -1)
{
- warn(yyextra->fileName,yyextra->lineNr,"multiple use of section label '%s' while adding anchor, (first occurrence: %s, line %d)",anchor,si->fileName.data(),si->lineNr);
+ warn(yyextra->fileName,yyextra->lineNr,"multiple use of section label '%s' while adding anchor, (first occurrence: %s, line %d)",anchor,si->fileName().data(),si->lineNr());
}
else
{
- warn(yyextra->fileName,yyextra->lineNr,"multiple use of section label '%s' while adding anchor, (first occurrence: %s)",anchor,si->fileName.data());
+ warn(yyextra->fileName,yyextra->lineNr,"multiple use of section label '%s' while adding anchor, (first occurrence: %s)",anchor,si->fileName().data());
}
}
else
{
- si = new SectionInfo(yyextra->fileName,yyextra->lineNr,anchor,0,SectionInfo::Anchor,0);
- Doxygen::sectionDict->append(anchor,si);
+ si = sm.add(anchor,yyextra->fileName,yyextra->lineNr,nullptr,SectionType::Anchor,0);
yyextra->current->anchors.push_back(si);
}
}
@@ -3194,18 +3175,18 @@ static void endBrief(yyscan_t yyscanner,bool addToOutput)
}
}
-static int yyread(yyscan_t yyscanner,char *buf,int max_size)
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- yyextra->prevPosition=yyextra->inputPosition;
- int c=0;
- while( c < max_size && yyextra->inputString[yyextra->inputPosition] )
- {
- *buf = yyextra->inputString[yyextra->inputPosition++] ;
- //printf("%d (%c)\n",*buf,*buf);
- c++; buf++;
- }
- return c;
+ yyextra->prevPosition=yyextra->inputPosition;
+ yy_size_t c=0;
+ while( c < max_size && yyextra->inputString[yyextra->inputPosition] )
+ {
+ *buf = yyextra->inputString[yyextra->inputPosition++] ;
+ //printf("%d (%c)\n",*buf,*buf);
+ c++; buf++;
+ }
+ return c;
}
//----------------------------------------------------------------------------
@@ -3243,15 +3224,16 @@ CommentScanner::~CommentScanner()
bool CommentScanner::parseCommentBlock(/* in */ OutlineParserInterface *parser,
/* in */ Entry *curEntry,
/* in */ const QCString &comment,
- /* in */ const QCString &fileName,
- /* in,out */ int &lineNr,
- /* in */ bool isBrief,
- /* in */ bool isAutoBriefOn,
- /* in */ bool isInbody,
- /* in,out */ Protection &prot,
- /* in,out */ int &position,
- /* out */ bool &newEntryNeeded
- )
+ /* in */ const QCString &fileName,
+ /* in,out */ int &lineNr,
+ /* in */ bool isBrief,
+ /* in */ bool isAutoBriefOn,
+ /* in */ bool isInbody,
+ /* in,out */ Protection &prot,
+ /* in,out */ int &position,
+ /* out */ bool &newEntryNeeded,
+ /* in */ bool markdownSupport
+ )
{
yyscan_t yyscanner = p->yyscanner;
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
@@ -3259,16 +3241,16 @@ bool CommentScanner::parseCommentBlock(/* in */ OutlineParserInterface *pars
// isBrief,isAutoBriefOn,lineNr);
initParser(yyscanner);
- yyextra->guards.setAutoDelete(TRUE);
- yyextra->guards.clear();
+ yyextra->guards = std::stack<GuardedSection>();
yyextra->langParser = parser;
yyextra->current = curEntry;
+ yyextra->current->docLine = (lineNr > 1 ? lineNr : 1);
if (comment.isEmpty()) return FALSE; // avoid empty strings
yyextra->inputString = comment;
yyextra->inputString.append(" ");
yyextra->inputPosition = position;
- yyextra->lineNr = lineNr;
- yyextra->fileName = fileName;
+ yyextra->lineNr = lineNr;
+ yyextra->fileName = fileName;
yyextra->protection = prot;
yyextra->needNewEntry = FALSE;
yyextra->xrefKind = XRef_None;
@@ -3276,6 +3258,7 @@ bool CommentScanner::parseCommentBlock(/* in */ OutlineParserInterface *pars
yyextra->insidePre = FALSE;
yyextra->parseMore = FALSE;
yyextra->inBody = isInbody;
+ yyextra->markdownSupport= markdownSupport;
yyextra->outputXRef.resize(0);
if (!isBrief && !isAutoBriefOn && !yyextra->current->doc.isEmpty())
{ // add newline separator between detailed comment blocks
@@ -3297,7 +3280,7 @@ bool CommentScanner::parseCommentBlock(/* in */ OutlineParserInterface *pars
Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\n"
"input=[\n%s]\n",qPrint(fileName),lineNr,qPrint(yyextra->inputString)
);
-
+
commentscanYYrestart( 0, yyscanner );
BEGIN( Comment );
commentscanYYlex(yyscanner);
@@ -3308,7 +3291,7 @@ bool CommentScanner::parseCommentBlock(/* in */ OutlineParserInterface *pars
addOutput(yyscanner,getOverloadDocs());
}
- if (!yyextra->guards.isEmpty())
+ if (!yyextra->guards.empty())
{
warn(yyextra->fileName,yyextra->lineNr,"Documentation block ended in the middle of a conditional section!");
}
@@ -3316,7 +3299,7 @@ bool CommentScanner::parseCommentBlock(/* in */ OutlineParserInterface *pars
if (yyextra->insideParBlock)
{
warn(yyextra->fileName,yyextra->lineNr,
- "Documentation block ended while inside a \\parblock. Missing \\endparblock");
+ "Documentation block ended while inside a \\parblock. Missing \\endparblock");
}
yyextra->current->doc=stripLeadingAndTrailingEmptyLines(yyextra->current->doc,yyextra->current->docLine);
@@ -3328,23 +3311,23 @@ bool CommentScanner::parseCommentBlock(/* in */ OutlineParserInterface *pars
}
if (yyextra->current->section==Entry::MEMBERGRP_SEC &&
- Doxygen::docGroup.isEmpty()) // @name section but no group started yet
+ yyextra->docGroup.isEmpty()) // @name section but no group started yet
{
- Doxygen::docGroup.open(yyextra->current,yyextra->fileName,yyextra->lineNr,true);
+ yyextra->docGroup.open(yyextra->current,yyextra->fileName,yyextra->lineNr,true);
}
Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\noutput=[\n"
"brief=[line=%d\n%s]\ndocs=[line=%d\n%s]\ninbody=[line=%d\n%s]\n]\n===========\n",
qPrint(fileName),lineNr,
- yyextra->current->briefLine,qPrint(yyextra->current->brief),
+ yyextra->current->briefLine,qPrint(yyextra->current->brief),
yyextra->current->docLine,qPrint(yyextra->current->doc),
yyextra->current->inbodyLine,qPrint(yyextra->current->inbodyDocs)
);
-
+
checkFormula(yyscanner);
prot = yyextra->protection;
-
- Doxygen::docGroup.addDocs(curEntry);
+
+ yyextra->docGroup.addDocs(curEntry);
newEntryNeeded = yyextra->needNewEntry;
@@ -3369,15 +3352,15 @@ static void handleGuard(yyscan_t yyscanner,const QCString &expr)
CondParser prs;
bool sectionEnabled=prs.parse(yyextra->fileName,yyextra->lineNr,expr.stripWhiteSpace());
bool parentEnabled = TRUE;
- if (!yyextra->guards.isEmpty()) parentEnabled = yyextra->guards.top()->isEnabled();
+ if (!yyextra->guards.empty()) parentEnabled = yyextra->guards.top().isEnabled();
if (parentEnabled)
{
if (
- (sectionEnabled && yyextra->guardType==Guard_If) ||
+ (sectionEnabled && yyextra->guardType==Guard_If) ||
(!sectionEnabled && yyextra->guardType==Guard_IfNot)
) // section is visible
{
- yyextra->guards.push(new GuardedSection(TRUE,TRUE));
+ yyextra->guards.push(GuardedSection(TRUE,TRUE));
yyextra->enabledSectionFound=TRUE;
BEGIN( GuardParamEnd );
}
@@ -3385,16 +3368,60 @@ static void handleGuard(yyscan_t yyscanner,const QCString &expr)
{
if (yyextra->guardType!=Guard_Skip)
{
- yyextra->guards.push(new GuardedSection(FALSE,TRUE));
+ yyextra->guards.push(GuardedSection(FALSE,TRUE));
}
BEGIN( SkipGuardedSection );
}
}
else // invisible because of parent
{
- yyextra->guards.push(new GuardedSection(FALSE,FALSE));
+ yyextra->guards.push(GuardedSection(FALSE,FALSE));
BEGIN( SkipGuardedSection );
}
}
+void CommentScanner::initGroupInfo(Entry *entry)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->docGroup.initGroupInfo(entry);
+}
+
+void CommentScanner::enterFile(const char *fileName,int lineNr)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->docGroup.enterFile(fileName,lineNr);
+}
+
+void CommentScanner::leaveFile(const char *fileName,int lineNr)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->docGroup.leaveFile(fileName,lineNr);
+}
+
+void CommentScanner::enterCompound(const char *fileName,int lineNr,const char *name)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->docGroup.enterCompound(fileName,lineNr,name);
+}
+
+void CommentScanner::leaveCompound(const char *fileName,int lineNr,const char *name)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->docGroup.leaveCompound(fileName,lineNr,name);
+}
+
+void CommentScanner::open(Entry *e,const char *fileName,int lineNr,bool implicit)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->docGroup.open(e,fileName,lineNr,implicit);
+}
+
+void CommentScanner::close(Entry *e,const char *fileName,int lineNr,bool foundInline,bool implicit)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->docGroup.close(e,fileName,lineNr,foundInline,implicit);
+}
+
+#if USE_STATE2STRING
#include "commentscan.l.h"
+#endif
diff --git a/src/condparser.cpp b/src/condparser.cpp
index 9d7ac45..ac6ff61 100644
--- a/src/condparser.cpp
+++ b/src/condparser.cpp
@@ -2,8 +2,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,6 +19,8 @@
* ! NOT operator
*/
+#include <algorithm>
+
#include "condparser.h"
#include "config.h"
#include "message.h"
@@ -27,7 +29,7 @@
/**
* parses and evaluates the given expression.
- * @returns
+ * @returns
* - On error, an error message is returned.
* - On success, the result of the expression is either "1" or "0".
*/
@@ -102,8 +104,7 @@ static bool isAlpha(const char c)
static bool isAlphaNumSpec(const char c)
{
- return isAlpha(c) || (c>='0' && c<='9') || c=='-' || c=='.' ||
- (((unsigned char)c)>=0x80 && ((unsigned char)c)<=0xFF);
+ return isAlpha(c) || (c>='0' && c<='9') || c=='-' || c=='.' || (((unsigned char)c)>=0x80);
}
/**
@@ -124,13 +125,13 @@ int CondParser::getOperatorId(const QCString &opName)
/**
* Get next token in the current string expr.
- * Uses the data in m_expr pointed to by m_e to
+ * Uses the data in m_expr pointed to by m_e to
* produce m_tokenType and m_token, set m_err in case of an error
*/
void CondParser::getToken()
{
m_tokenType = NOTHING;
- m_token.resize(0);
+ m_token.resize(0);
//printf("\tgetToken e:{%c}, ascii=%i, col=%i\n", *e, *e, e-expr);
@@ -304,7 +305,7 @@ bool CondParser::evalOperator(int opId, bool lhs, bool rhs)
*/
bool CondParser::evalVariable(const char *varName)
{
- if (Config_getList(ENABLED_SECTIONS).find(varName)==-1) return FALSE;
- return TRUE;
+ const StringVector &list = Config_getList(ENABLED_SECTIONS);
+ return std::find(list.begin(),list.end(),varName)!=list.end();
}
diff --git a/src/config.h b/src/config.h
index 1b79b1e..31be3a1 100644
--- a/src/config.h
+++ b/src/config.h
@@ -24,19 +24,24 @@ class FTextStream;
//! @{
//! some convenience macros for accessing the config options
//! mainly done like this for backward compatibility
-#if DYNAMIC_LOOKUP // for debug purposes
-#define Config_getString(val) (ConfigValues::instance().*((ConfigValues::InfoString*)ConfigValues::instance().get(#val))->item)
-#define Config_getBool(val) (ConfigValues::instance().*((ConfigValues::InfoBool*)ConfigValues::instance().get(#val))->item)
-#define Config_getInt(val) (ConfigValues::instance().*((ConfigValues::InfoInt*)ConfigValues::instance().get(#val))->item)
-#define Config_getEnum(val) (ConfigValues::instance().*((ConfigValues::InfoString*)ConfigValues::instance().get(#val))->item)
-#define Config_getList(val) (ConfigValues::instance().*((ConfigValues::InfoList*)ConfigValues::instance().get(#val))->item)
-#else // direct access
-#define Config_getString(val) (ConfigValues::instance().val)
-#define Config_getBool(val) (ConfigValues::instance().val)
-#define Config_getInt(val) (ConfigValues::instance().val)
-#define Config_getEnum(val) (ConfigValues::instance().val)
-#define Config_getList(val) (ConfigValues::instance().val)
-#endif
+//#if DYNAMIC_LOOKUP // for debug purposes
+//#define Config_getString(val) (ConfigValues::instance().*((ConfigValues::InfoString*)ConfigValues::instance().get(#val))->item)
+//#define Config_getBool(val) (ConfigValues::instance().*((ConfigValues::InfoBool*)ConfigValues::instance().get(#val))->item)
+//#define Config_getInt(val) (ConfigValues::instance().*((ConfigValues::InfoInt*)ConfigValues::instance().get(#val))->item)
+//#define Config_getEnum(val) (ConfigValues::instance().*((ConfigValues::InfoString*)ConfigValues::instance().get(#val))->item)
+//#define Config_getList(val) (ConfigValues::instance().*((ConfigValues::InfoList*)ConfigValues::instance().get(#val))->item)
+//#else // direct access
+#define Config_getString(name) (ConfigValues::instance().name())
+#define Config_getBool(name) (ConfigValues::instance().name())
+#define Config_getInt(name) (ConfigValues::instance().name())
+#define Config_getEnum(name) (ConfigValues::instance().name())
+#define Config_getList(name) (ConfigValues::instance().name())
+#define Config_updateString(name,value) (ConfigValues::instance().update_##name(value));
+#define Config_updateBool(name,value) (ConfigValues::instance().update_##name(value));
+#define Config_updateInt(name,value) (ConfigValues::instance().update_##name(value));
+#define Config_updateEnum(name,value) (ConfigValues::instance().update_##name(value));
+#define Config_updateList(name,...) (ConfigValues::instance().update_##name(__VA_ARGS__));
+//#endif
//! @}
/** \brief Public function to deal with the configuration file. */
diff --git a/src/config.xml b/src/config.xml
index f40744d..c0b846a 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -174,7 +174,6 @@ FILE_PATTERNS = *.cpp *.h q*.doc
RECURSIVE = YES
EXCLUDE_PATTERNS = *codec.cpp moc_* */compat/* */3rdparty/*
ALPHABETICAL_INDEX = YES
-COLS_IN_ALPHA_INDEX = 3
IGNORE_PREFIX = Q
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
@@ -513,6 +512,16 @@ Go to the <a href="commands.html">next</a> section or return to the
]]>
</docs>
</option>
+ <option type='bool' id='PYTHON_DOCSTRING' defval='1'>
+ <docs>
+<![CDATA[
+ By default Python docstrings are displayed as preformatted text
+ and doxygen's special commands cannot be used. By setting \c PYTHON_DOCSTRING to
+ \c NO the doxygen's special commands can be used and the contents of the docstring
+ documentation blocks is shown as doxygen documentation.
+]]>
+ </docs>
+ </option>
<option type='bool' id='INHERIT_DOCS' defval='1'>
<docs>
<![CDATA[
@@ -585,16 +594,6 @@ Go to the <a href="commands.html">next</a> section or return to the
]]>
</docs>
</option>
- <option type='list' id='TCL_SUBST' format='string'>
- <docs>
-<![CDATA[
- This tag can be used to specify a number of word-keyword mappings (TCL only).
- A mapping has the form <code>"name=value"</code>. For example adding
- <code>"class=itcl::class"</code> will allow you to use the command class in the
- <code>itcl::class</code> meaning.
-]]>
- </docs>
- </option>
<option type='bool' id='OPTIMIZE_OUTPUT_FOR_C' defval='0'>
<docs>
<![CDATA[
@@ -649,10 +648,10 @@ Go to the <a href="commands.html">next</a> section or return to the
Doxygen has a built-in mapping, but you can override or extend it using this tag.
The format is <code>ext=language</code>, where \c ext is a file extension, and language is one of
the parsers supported by doxygen: IDL, Java, JavaScript, Csharp (C#), C, C++, D, PHP,
- md (Markdown), Objective-C, Python, Slice, Fortran (fixed format Fortran: FortranFixed,
+ md (Markdown), Objective-C, Python, Slice, VHDL, Fortran (fixed format Fortran: FortranFixed,
free formatted Fortran: FortranFree, unknown formatted Fortran: Fortran. In
the later case the parser tries to guess whether the code is fixed or free
- formatted code, this is the default for Fortran type files), VHDL, tcl.
+ formatted code, this is the default for Fortran type files).
For instance to make doxygen treat
<code>.inc</code> files as Fortran files (default is PHP), and <code>.f</code> files as C (default is Fortran),
@@ -660,7 +659,9 @@ Go to the <a href="commands.html">next</a> section or return to the
<br>Note: For files without extension you can use `no_extension` as a placeholder.
<br>Note that for custom extensions you also need to set \ref cfg_file_patterns "FILE_PATTERNS" otherwise the
- files are not read by doxygen.
+ files are not read by doxygen. When specifying `no_extension` you should add `*`
+ to the \ref cfg_file_patterns "FILE_PATTERNS".
+ <br>Note see also the list of \ref default_file_extension_mapping "default file extension mappings".
]]>
</docs>
</option>
@@ -822,6 +823,21 @@ Go to the <a href="commands.html">next</a> section or return to the
]]>
</docs>
</option>
+ <option type='int' id='NUM_PROC_THREADS' defval='1' minval='0' maxval='32'>
+ <docs>
+<![CDATA[
+ The \c NUM_PROC_THREADS specifies the number threads doxygen is allowed to use during
+ processing. When set to \c 0 doxygen will based this on the number of cores
+ available in the system. You can set it explicitly to a value larger than 0
+ to get more control over the balance between CPU load and processing speed.
+ At this moment only the input processing can be done using multiple threads.
+ Since this is still an experimental feature the default is set to 1,
+ which efficively disables parallel processing. Please report any issues you
+ encounter.
+ Generating dot graphs in parallel is controlled by the \c DOT_NUM_THREADS setting.
+]]>
+ </docs>
+ </option>
</group>
<group name='Build' docs='Build related configuration options'>
<option type='bool' id='EXTRACT_ALL' defval='0'>
@@ -901,6 +917,15 @@ Go to the <a href="commands.html">next</a> section or return to the
]]>
</docs>
</option>
+ <option type='bool' id='RESOLVE_UNNAMED_PARAMS' defval='1'>
+ <docs>
+<![CDATA[
+ If this flag is set to \c YES, the name of an unnamed parameter in a declaration will be
+ determined by the corresponding definition. By default unnamed parameters remain unnamed
+ in the output.
+]]>
+ </docs>
+ </option>
<option type='bool' id='HIDE_UNDOC_MEMBERS' defval='0'>
<docs>
<![CDATA[
@@ -956,12 +981,20 @@ Go to the <a href="commands.html">next</a> section or return to the
<option type='bool' id='CASE_SENSE_NAMES' defval='0' altdefval='Portable::fileSystemIsCaseSensitive()'>
<docs>
<![CDATA[
- If the \c CASE_SENSE_NAMES tag is set to \c NO 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
- classes or files whose names only differ in case and if your file system
- supports case sensitive file names. Windows (including Cygwin) ands
- Mac users are advised to set this option to \c NO.
+ With the correct setting of option \c CASE_SENSE_NAMES doxygen will better be able to match the
+ capabilities of the underlying filesystem.
+
+ In case the filesystem is case sensitive (i.e. it supports files in the same directory
+ whose names only differ in casing), the option must be set to \c YES to properly deal with such files
+ in case they appear in the input.
+
+ For filesystems that are not case sensitive the option should be be set to \c NO to properly
+ deal with output files written for symbols that only differ in casing, such as for two classes,
+ one named \c CLASS and the other named \c Class, and to also support references to files without
+ having to specify the exact matching casing.
+
+ On Windows (including Cygwin) and MacOS, users should typically set this option to \c NO,
+ whereas on Linux or other Unix flavors it should typically be set to \c YES.
]]>
</docs>
</option>
@@ -1302,13 +1335,19 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
]]>
</docs>
</option>
- <option type='bool' id='WARN_AS_ERROR' defval='0'>
+ <option type='enum' id='WARN_AS_ERROR' defval='NO'>
<docs>
<![CDATA[
If the \c WARN_AS_ERROR tag is set to \c YES then doxygen will immediately stop
when a warning is encountered.
+ If the \c WARN_AS_ERROR tag is set to \c FAIL_ON_WARNINGS then doxygen will continue
+ running as if \c WARN_AS_ERROR tag is set to \c NO, but at the end of the doxygen
+ process doxygen will return with a non-zero status.
]]>
</docs>
+ <value name="NO"/>
+ <value name="YES" />
+ <value name="FAIL_ON_WARNINGS" />
</option>
<option type='string' id='WARN_FORMAT' format='string' defval='$file:$line: $text'>
<docs>
@@ -1371,6 +1410,8 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
Note that for custom extensions or not directly supported extensions you also
need to set \ref cfg_extension_mapping "EXTENSION_MAPPING" for the extension
otherwise the files are not read by doxygen.<br>
+ Note the list of default checked file patterns might differ from the list of
+ \ref default_file_extension_mapping "default file extension mappings".<br>
If left blank the following patterns are tested:
]]>
</docs>
@@ -1405,17 +1446,15 @@ FILE_VERSION_FILTER = "cleartool desc -fmt \%Vn"
<value name='*.md'/>
<value name='*.mm'/>
<value name='*.dox' desc='(to be provided as doxygen C comment)'/>
- <value name='*.doc' desc='(to be provided as doxygen C comment)'/>
- <value name='*.txt' desc='(to be provided as doxygen C comment)'/>
<value name='*.py'/>
<value name='*.pyw'/>
<value name='*.f90'/>
<value name='*.f95'/>
<value name='*.f03'/>
<value name='*.f08'/>
+ <value name='*.f18'/>
<value name='*.f'/>
<value name='*.for'/>
- <value name='*.tcl'/>
<value name='*.vhd'/>
<value name='*.vhdl'/>
<value name='*.ucf'/>
@@ -1701,6 +1740,15 @@ to disable this feature.
]]>
</docs>
</option>
+ <option type='bool' id='CLANG_ADD_INC_PATHS' setting='USE_LIBCLANG' defval='1'>
+ <docs>
+<![CDATA[
+ If clang assisted parsing is enabled and the \c CLANG_ADD_INC_PATHS tag
+ is set to \c YES then doxygen will add the directory of each input to the
+ include path.
+]]>
+ </docs>
+ </option>
<option type='list' id='CLANG_OPTIONS' format='string' setting='USE_LIBCLANG' depends='CLANG_ASSISTED_PARSING'>
<docs>
<![CDATA[
@@ -1715,10 +1763,12 @@ to disable this feature.
<docs>
<![CDATA[
If clang assisted parsing is enabled you can provide the clang parser with the
- path to the <a href="http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html">
- compilation database</a> used when the files were built. This is equivalent to
- specifying the "-p" option to a clang tool, such as clang-check. These options
- will then be passed to the parser.
+ path to the directory containing a file called `compile_commands.json`.
+ This file is the <a href="http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html">
+ compilation database</a> containing the options used when the source files were built.
+ This is equivalent to specifying the `-p` option to a clang tool, such as `clang-check`.
+ These options will then be passed to the parser. Any options specified with
+ \ref cfg_clang_options "CLANG_OPTIONS" will be added as well.
@note The availability of this option depends on whether or not doxygen
was generated with the `-Duse_libclang=ON` option for CMake.
@@ -1736,14 +1786,6 @@ to disable this feature.
]]>
</docs>
</option>
- <option type='int' id='COLS_IN_ALPHA_INDEX' minval='1' maxval='20' defval='5' depends='ALPHABETICAL_INDEX'>
- <docs>
-<![CDATA[
- The \c COLS_IN_ALPHA_INDEX tag can be
- used to specify the number of columns in which the alphabetical index list will be split.
-]]>
- </docs>
- </option>
<option type='list' id='IGNORE_PREFIX' format='string' depends='ALPHABETICAL_INDEX'>
<docs>
<![CDATA[
@@ -2164,7 +2206,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<![CDATA[
The \c GENERATE_CHI flag
controls if a separate `.chi` index file is generated (\c YES) or that
- it should be included in the master `.chm` file (\c NO).
+ it should be included in the main `.chm` file (\c NO).
]]>
</docs>
</option>
@@ -2262,7 +2304,9 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<option type='string' id='QHG_LOCATION' format='file' defval='' depends='GENERATE_QHP'>
<docs>
<![CDATA[
- The \c QHG_LOCATION tag can be used to specify the location of Qt's qhelpgenerator.
+ The \c QHG_LOCATION tag can
+ be used to specify the location (absolute path including file name) of
+ Qt's qhelpgenerator.
If non-empty doxygen will try to run qhelpgenerator on the generated `.qhp` file.
]]>
</docs>
@@ -2357,6 +2401,18 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
]]>
</docs>
</option>
+ <option type='enum' id='HTML_FORMULA_FORMAT' defval='png' depends='GENERATE_HTML'>
+ <docs>
+<![CDATA[
+ If the \c HTML_FORMULA_FORMAT option is set to \c svg, doxygen will use the pdf2svg
+ tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see https://inkscape.org)
+ to generate formulas as SVG images instead of
+ PNGs for the HTML output. These images will generally look nicer at scaled resolutions.
+]]>
+ </docs>
+ <value name="png" desc="(the default)"/>
+ <value name="svg" desc="(looks nicer but requires the pdf2svg or inkscape tool)"/>
+ </option>
<option type='int' id='FORMULA_FONTSIZE' minval='8' maxval='50' defval='10' depends='GENERATE_HTML'>
<docs>
<![CDATA[
@@ -2382,7 +2438,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<option type='string' id='FORMULA_MACROFILE' format='file' defval=''>
<docs>
<![CDATA[
- The \c FORMULA_MACROFILE can contain \f$\mbox{\LaTeX}\f$ `\newcommand` and
+ The \c FORMULA_MACROFILE can contain \f$\mbox{\LaTeX}\f$ `\newcommand` and
`\renewcommand` commands to create new \f$\mbox{\LaTeX}\f$ commands to be used
in formulas as building blocks.
See the section \ref formulas for details.
@@ -2407,7 +2463,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<![CDATA[
When MathJax is enabled you can set the default output format to be used for
the MathJax output.
- See <a href="http://docs.mathjax.org/en/latest/output.html">the MathJax site</a>
+ See <a href="http://docs.mathjax.org/en/v2.7-latest/output.html">the MathJax site</a>
for more details.
]]>
</docs>
@@ -2415,7 +2471,7 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<value name="NativeMML" desc="(i.e. MathML)"/>
<value name="SVG"/>
</option>
- <option type='string' id='MATHJAX_RELPATH' format='string' defval='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/' depends='USE_MATHJAX'>
+ <option type='string' id='MATHJAX_RELPATH' format='string' defval='https://cdn.jsdelivr.net/npm/mathjax@2' depends='USE_MATHJAX'>
<docs>
<![CDATA[
When MathJax is enabled you need to specify the location relative to the
@@ -2446,7 +2502,7 @@ MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
The \c MATHJAX_CODEFILE tag can be used to specify a file with javascript
pieces of code that will be used on startup of the MathJax code.
See
-<a href="http://docs.mathjax.org/en/latest/output.html">the MathJax site</a>
+<a href="http://docs.mathjax.org/en/v2.7-latest/output.html">the MathJax site</a>
for more details.
]]>
</docs>
@@ -2754,9 +2810,12 @@ or
<option type='bool' id='USE_PDFLATEX' defval='1' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- If the \c USE_PDFLATEX tag is set to \c YES, doxygen will use
- \c pdflatex to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$
+ If the \c USE_PDFLATEX tag is set to \c YES, doxygen will use the engine
+ as specified with \ref cfg_latex_cmd_name "LATEX_CMD_NAME"
+ to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$
files. Set this option to \c YES, to get a higher quality PDF documentation.
+<br>
+ See also section \ref cfg_latex_cmd_name "LATEX_CMD_NAME" for selecting the engine.
]]>
</docs>
</option>
@@ -2813,7 +2872,7 @@ or
<option type='string' id='LATEX_EMOJI_DIRECTORY' format='dir' defval='' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- The \c LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+ The \c LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
path from which the emoji images will be read.
If a relative path is entered, it will be relative to the \ref cfg_latex_output "LATEX_OUTPUT"
directory. If left blank the \ref cfg_latex_output "LATEX_OUTPUT" directory will be used.
@@ -3027,9 +3086,8 @@ front of it.
</docs>
</option>
</group>
-<!--
- <group name='Sqlite3' docs='Configuration options related to Sqlite3 output'>
- <option type='bool' id='GENERATE_SQLITE3' defval='0'>
+ <group name='Sqlite3' setting='USE_SQLITE3' docs='Configuration options related to Sqlite3 output'>
+ <option type='bool' id='GENERATE_SQLITE3' setting='USE_SQLITE3' defval='0'>
<docs>
<![CDATA[
If the \c GENERATE_SQLITE3 tag is set to \c YES doxygen will generate a
@@ -3037,7 +3095,7 @@ If the \c GENERATE_SQLITE3 tag is set to \c YES doxygen will generate a
]]>
</docs>
</option>
- <option type='string' id='SQLITE3_OUTPUT' format='dir' defval='sqlite3' depends='GENERATE_SQLITE3'>
+ <option type='string' id='SQLITE3_OUTPUT' format='dir' defval='sqlite3' setting='USE_SQLITE3' depends='GENERATE_SQLITE3'>
<docs>
<![CDATA[
The \c SQLITE3_OUTPUT tag is used to specify where the \c Sqlite3 database will be put.
@@ -3046,9 +3104,17 @@ put in front of it.
]]>
</docs>
</option>
+ <option type='bool' id='SQLITE3_RECREATE_DB' defval='1' setting='USE_SQLITE3' depends='GENERATE_SQLITE3'>
+ <docs>
+<![CDATA[
+The \c SQLITE3_OVERWRITE_DB tag is set to \c YES, the existing doxygen_sqlite3.db
+database file will be recreated with each doxygen run.
+If set to \c NO, doxygen will warn if an a database file is already found and not modify it.
+]]>
+ </docs>
+ </option>
</group>
--->
<group name='PerlMod' docs='Configuration options related to the Perl module output'>
<option type='bool' id='GENERATE_PERLMOD' defval='0'>
<docs>
@@ -3370,7 +3436,7 @@ to be found in the default search path.
]]>
</docs>
</option>
- <option type='int' id='UML_LIMIT_NUM_FIELDS' defval='10' minval='0' maxval='100' depends='HAVE_DOT'>
+ <option type='int' id='UML_LIMIT_NUM_FIELDS' defval='10' minval='0' maxval='100' depends='UML_LOOK'>
<docs>
<![CDATA[
If the \ref cfg_uml_look "UML_LOOK" tag is enabled, the fields and methods are shown inside
@@ -3384,6 +3450,32 @@ to be found in the default search path.
]]>
</docs>
</option>
+ <option type='enum' id='DOT_UML_DETAILS' defval='NO' depends='UML_LOOK'>
+ <docs>
+<![CDATA[
+If the \c DOT_UML_DETAILS tag is set to \c NO, doxygen will
+show attributes and methods without types and arguments in the UML graphs.
+If the \c DOT_UML_DETAILS tag is set to \c YES, doxygen will
+add type and arguments for attributes and methods in the UML graphs.
+If the \c DOT_UML_DETAILS tag is set to \c NONE, doxygen will not generate
+fields with class member information in the UML graphs.
+The class diagrams will look similar to the default class diagrams but using
+UML notation for the relationships.
+]]>
+ </docs>
+ <value name="NO" />
+ <value name="YES" />
+ <value name="NONE" />
+ </option>
+ <option type='int' id='DOT_WRAP_THRESHOLD' defval='17' minval='0' maxval='1000' depends='HAVE_DOT'>
+ <docs>
+<![CDATA[
+ The \c DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters to display on
+ a single line. If the actual line length exceeds this threshold significantly it will wrapped
+ across multiple lines. Some heuristics are apply to avoid ugly line breaks.
+]]>
+ </docs>
+ </option>
<option type='bool' id='TEMPLATE_RELATIONS' defval='0' depends='HAVE_DOT'>
<docs>
<![CDATA[
@@ -3614,11 +3706,14 @@ to be found in the default search path.
]]>
</docs>
</option>
- <option type='bool' id='DOT_CLEANUP' defval='1' depends='HAVE_DOT'>
+ <option type='bool' id='DOT_CLEANUP' defval='1'>
<docs>
<![CDATA[
If the \c DOT_CLEANUP tag is set to \c YES, doxygen will
-remove the intermediate dot files that are used to generate the various graphs.
+remove the intermediate files that are used to generate the various graphs.
+ <br>Note:
+This setting is not only used for dot files but also for msc and plantuml
+temporary files.
]]>
</docs>
</option>
@@ -3643,5 +3738,7 @@ remove the intermediate dot files that are used to generate the various graphs.
<option type='obsolete' id='XML_DTD'/>
<option type='obsolete' id='PERL_PATH'/>
<option type='obsolete' id='MSCGEN_PATH'/>
+ <option type='obsolete' id='TCL_SUBST'/>
+ <option type='obsolete' id='COLS_IN_ALPHA_INDEX'/>
</group>
</doxygenconfig>
diff --git a/src/configgen.py b/src/configgen.py
index 6720116..063c1f4 100755
--- a/src/configgen.py
+++ b/src/configgen.py
@@ -62,7 +62,7 @@ def transformDocs(doc):
# fallback for not handled
doc = re.sub('\\\\ref', '', doc)
#<a href="address">description</a> -> description (see: address)
- doc = re.sub('<a +href="([^"]*)" *>([^<]*)</a>', '\\2 (see: \\1)', doc)
+ doc = re.sub('<a +href="([^"]*)" *>([^<]*)</a>', '\\2 (see: \n\\1)', doc)
# LaTeX name as formula -> LaTeX
doc = doc.replace("\\f$\\mbox{\\LaTeX}\\f$", "LaTeX")
# Other formula's (now just 2) so explicitly mentioned.
@@ -345,6 +345,9 @@ def parseOption(node):
def parseGroups(node):
name = node.getAttribute('name')
doc = node.getAttribute('docs')
+ setting = node.getAttribute('setting')
+ if len(setting) > 0:
+ print("#if %s" % (setting))
print("%s%s" % (" //-----------------------------------------",
"----------------------------------"))
print(" cfg->addInfo(\"%s\",\"%s\");" % (name, doc))
@@ -354,9 +357,40 @@ def parseGroups(node):
for n in node.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
parseOption(n)
+ if len(setting) > 0:
+ print("#endif")
+
+
+def parseGroupMapGetter(node):
+ map = { 'bool':'bool', 'string':'const QCString &', 'enum':'const QCString &', 'int':'int', 'list':'const StringVector &' }
+ for n in node.childNodes:
+ if n.nodeType == Node.ELEMENT_NODE:
+ setting = n.getAttribute('setting')
+ if len(setting) > 0:
+ print("#if %s" % (setting))
+ type = n.getAttribute('type')
+ name = n.getAttribute('id')
+ if type in map:
+ print(" %-20s %-30s const { return m_%s; }" % (map[type],name+'()',name))
+ if len(setting) > 0:
+ print("#endif")
+
+def parseGroupMapSetter(node):
+ map = { 'bool':'bool', 'string':'const QCString &', 'enum':'const QCString &', 'int':'int', 'list':'const StringVector &' }
+ for n in node.childNodes:
+ if n.nodeType == Node.ELEMENT_NODE:
+ setting = n.getAttribute('setting')
+ if len(setting) > 0:
+ print("#if %s" % (setting))
+ type = n.getAttribute('type')
+ name = n.getAttribute('id')
+ if type in map:
+ print(" %-20s update_%-46s { m_%s = v; return m_%s; }" % (map[type],name+'('+map[type]+' v)',name,name))
+ if len(setting) > 0:
+ print("#endif")
-def parseGroupMap(node):
- map = { 'bool':'bool', 'string':'QCString', 'enum':'QCString', 'int':'int', 'list':'QStrList' }
+def parseGroupMapVar(node):
+ map = { 'bool':'bool', 'string':'QCString', 'enum':'QCString', 'int':'int', 'list':'StringVector' }
for n in node.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
setting = n.getAttribute('setting')
@@ -365,7 +399,7 @@ def parseGroupMap(node):
type = n.getAttribute('type')
name = n.getAttribute('id')
if type in map:
- print(" %-8s %s;" % (map[type],name))
+ print(" %-12s m_%s;" % (map[type],name))
if len(setting) > 0:
print("#endif")
@@ -379,7 +413,7 @@ def parseGroupInit(node):
type = n.getAttribute('type')
name = n.getAttribute('id')
if type in map:
- print(" %-25s = ConfigImpl::instance()->get%s(__FILE__,__LINE__,\"%s\");" % (name,map[type],name))
+ print(" %-25s = ConfigImpl::instance()->get%s(__FILE__,__LINE__,\"%s\");" % ('m_'+name,map[type],name))
if len(setting) > 0:
print("#endif")
@@ -393,7 +427,7 @@ def parseGroupMapInit(node):
type = n.getAttribute('type')
name = n.getAttribute('id')
if type in map:
- print(" m_map.insert(\"%s\",new Info%s(&ConfigValues::%s));" % (name,map[type],name))
+ print(" { %-25s Info{ %-13s &ConfigValues::m_%s }}," % ('\"'+name+'\",','Info::'+map[type]+',',name))
if len(setting) > 0:
print("#endif")
@@ -652,6 +686,7 @@ def main():
print("#include <qdict.h>")
print("#include <qstrlist.h>")
print("#include <qcstring.h>")
+ print("#include \"containers.h\"")
print("#include \"settings.h\"")
print("")
print("class ConfigValues")
@@ -661,42 +696,38 @@ def main():
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "group"):
- parseGroupMap(n)
+ parseGroupMapGetter(n)
+ for n in elem.childNodes:
+ if n.nodeType == Node.ELEMENT_NODE:
+ if (n.nodeName == "group"):
+ parseGroupMapSetter(n)
print(" void init();")
- print(" struct Info")
- print(" {")
- print(" enum Type { Bool, Int, String, List, Unknown };")
- print(" Info(Type t) : type(t) {}")
- print(" virtual ~Info() {}")
- print(" Type type;")
- print(" };")
- print(" struct InfoBool : public Info")
- print(" {")
- print(" InfoBool(bool ConfigValues::*ptm) : Info(Info::Bool), item(ptm) {}")
- print(" bool ConfigValues::*item;")
- print(" };")
- print(" struct InfoInt : public Info")
- print(" {")
- print(" InfoInt(int ConfigValues::*ptm) : Info(Info::Int), item(ptm) {}")
- print(" int ConfigValues::*item;")
- print(" };")
- print(" struct InfoString : public Info")
- print(" {")
- print(" InfoString(QCString ConfigValues::*ptm) : Info(Info::String), item(ptm) {}")
- print(" QCString ConfigValues::*item;")
- print(" };")
- print(" struct InfoList : public Info")
- print(" {")
- print(" InfoList(QStrList ConfigValues::*ptm) : Info(Info::List), item(ptm) {}")
- print(" QStrList ConfigValues::*item;")
- print(" };")
- print(" const Info *get(const char *tag) const")
- print(" {")
- print(" return m_map.find(tag);")
- print(" }")
+ print(" struct Info");
+ print(" {");
+ print(" enum Type { Bool, Int, String, List, Unknown };");
+ print(" Info(Type t,bool ConfigValues::*b) : type(t), value(b) {}");
+ print(" Info(Type t,int ConfigValues::*i) : type(t), value(i) {}");
+ print(" Info(Type t,QCString ConfigValues::*s) : type(t), value(s) {}");
+ print(" Info(Type t,StringVector ConfigValues::*l) : type(t), value(l) {}");
+ print(" Type type;");
+ print(" union Item");
+ print(" {");
+ print(" Item(bool ConfigValues::*v) : b(v) {}");
+ print(" Item(int ConfigValues::*v) : i(v) {}");
+ print(" Item(QCString ConfigValues::*v) : s(v) {}");
+ print(" Item(StringVector ConfigValues::*v) : l(v) {}");
+ print(" bool ConfigValues::*b;");
+ print(" int ConfigValues::*i;");
+ print(" QCString ConfigValues::*s;");
+ print(" StringVector ConfigValues::*l;");
+ print(" } value;");
+ print(" };");
+ print(" const Info *get(const char *tag) const;");
print(" private:")
- print(" ConfigValues();")
- print(" QDict<Info> m_map;")
+ for n in elem.childNodes:
+ if n.nodeType == Node.ELEMENT_NODE:
+ if (n.nodeName == "group"):
+ parseGroupMapVar(n)
print("};")
print("")
print("#endif")
@@ -707,15 +738,20 @@ def main():
print(" */")
print("#include \"configvalues.h\"")
print("#include \"configimpl.h\"")
+ print("#include <unordered_map>")
print("")
- print("ConfigValues::ConfigValues() : m_map(257)")
- print("{")
- print(" m_map.setAutoDelete(TRUE);")
+ print("const ConfigValues::Info *ConfigValues::get(const char *tag) const");
+ print("{");
+ print(" static const std::unordered_map< std::string, Info > configMap =");
+ print(" {");
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "group"):
parseGroupMapInit(n)
- print("}")
+ print(" };");
+ print(" auto it = configMap.find(tag);");
+ print(" return it!=configMap.end() ? &it->second : nullptr;");
+ print("}");
print("")
print("void ConfigValues::init()")
print("{")
diff --git a/src/configimpl.h b/src/configimpl.h
index 6b85d8a..a267cc6 100644
--- a/src/configimpl.h
+++ b/src/configimpl.h
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -24,6 +24,7 @@
#include <qlist.h>
#include <qregexp.h>
#include "ftextstream.h"
+#include "containers.h"
/** Abstract base class for any configuration option.
@@ -35,8 +36,8 @@ class ConfigOption
public:
/*! The type of option */
- enum OptionType
- {
+ enum OptionType
+ {
O_Info, //!< A section header
O_List, //!< A list of items
O_Enum, //!< A fixed set of items
@@ -46,14 +47,14 @@ class ConfigOption
O_Obsolete, //!< An obsolete option
O_Disabled //!< Disabled compile time option
};
- enum
- {
- /*! Maximum length of an option in the config file. Used for
+ enum
+ {
+ /*! Maximum length of an option in the config file. Used for
* alignment purposes.
*/
- MAX_OPTION_LENGTH = 23
+ MAX_OPTION_LENGTH = 23
};
- ConfigOption(OptionType t) : m_kind(t)
+ ConfigOption(OptionType t) : m_kind(t)
{
m_spaces.fill(' ',40);
}
@@ -81,8 +82,8 @@ class ConfigOption
void writeBoolValue(FTextStream &t,bool v);
void writeIntValue(FTextStream &t,int i);
- void writeStringValue(FTextStream &t,QCString &s);
- void writeStringList(FTextStream &t,QStrList &l);
+ void writeStringValue(FTextStream &t,const QCString &s);
+ void writeStringList(FTextStream &t,const StringVector &l);
QCString m_spaces;
QCString m_name;
@@ -98,7 +99,7 @@ class ConfigOption
class ConfigInfo : public ConfigOption
{
public:
- ConfigInfo(const char *name,const char *doc)
+ ConfigInfo(const char *name,const char *doc)
: ConfigOption(O_Info)
{
m_name = name;
@@ -115,25 +116,25 @@ class ConfigList : public ConfigOption
{
public:
enum WidgetType { String, File, Dir, FileAndDir };
- ConfigList(const char *name,const char *doc)
+ ConfigList(const char *name,const char *doc)
: ConfigOption(O_List)
{
m_name = name;
m_doc = doc;
m_widgetType = String;
}
- void addValue(const char *v) { m_defaultValue.append(v); }
+ void addValue(const char *v) { m_defaultValue.push_back(v); }
void setWidgetType(WidgetType w) { m_widgetType = w; }
WidgetType widgetType() const { return m_widgetType; }
- QStrList *valueRef() { return &m_value; }
- QStrList getDefault() { return m_defaultValue; }
+ StringVector *valueRef() { return &m_value; }
+ StringVector getDefault() { return m_defaultValue; }
void writeTemplate(FTextStream &t,bool sl,bool);
void compareDoxyfile(FTextStream &t);
void substEnvVars();
void init() { m_value = m_defaultValue; }
private:
- QStrList m_value;
- QStrList m_defaultValue;
+ StringVector m_value;
+ StringVector m_defaultValue;
WidgetType m_widgetType;
};
@@ -142,7 +143,7 @@ class ConfigList : public ConfigOption
class ConfigEnum : public ConfigOption
{
public:
- ConfigEnum(const char *name,const char *doc,const char *defVal)
+ ConfigEnum(const char *name,const char *doc,const char *defVal)
: ConfigOption(O_Enum)
{
m_name = name;
@@ -151,13 +152,14 @@ class ConfigEnum : public ConfigOption
m_defValue = defVal;
}
void addValue(const char *v) { m_valueRange.append(v); }
- QStrListIterator iterator()
+ QStrListIterator iterator()
{
return QStrListIterator(m_valueRange);
}
QCString *valueRef() { return &m_value; }
void substEnvVars();
void writeTemplate(FTextStream &t,bool sl,bool);
+ void convertStrToVal();
void compareDoxyfile(FTextStream &t);
void init() { m_value = m_defValue.copy(); }
@@ -173,7 +175,7 @@ class ConfigString : public ConfigOption
{
public:
enum WidgetType { String, File, Dir, Image };
- ConfigString(const char *name,const char *doc)
+ ConfigString(const char *name,const char *doc)
: ConfigOption(O_String)
{
m_name = name;
@@ -192,7 +194,7 @@ class ConfigString : public ConfigOption
void substEnvVars();
void init() { m_value = m_defValue.copy(); }
void emptyValueToDefault() { if(m_value.isEmpty()) m_value=m_defValue; };
-
+
private:
QCString m_value;
QCString m_defValue;
@@ -204,7 +206,7 @@ class ConfigString : public ConfigOption
class ConfigInt : public ConfigOption
{
public:
- ConfigInt(const char *name,const char *doc,int minVal,int maxVal,int defVal)
+ ConfigInt(const char *name,const char *doc,int minVal,int maxVal,int defVal)
: ConfigOption(O_Int)
{
m_name = name;
@@ -236,7 +238,7 @@ class ConfigInt : public ConfigOption
class ConfigBool : public ConfigOption
{
public:
- ConfigBool(const char *name,const char *doc,bool defVal)
+ ConfigBool(const char *name,const char *doc,bool defVal)
: ConfigOption(O_Bool)
{
m_name = name;
@@ -263,7 +265,7 @@ class ConfigBool : public ConfigOption
class ConfigObsolete : public ConfigOption
{
public:
- ConfigObsolete(const char *name) : ConfigOption(O_Obsolete)
+ ConfigObsolete(const char *name) : ConfigOption(O_Obsolete)
{ m_name = name; }
void writeTemplate(FTextStream &,bool,bool);
void compareDoxyfile(FTextStream &) {}
@@ -275,7 +277,7 @@ class ConfigObsolete : public ConfigOption
class ConfigDisabled : public ConfigOption
{
public:
- ConfigDisabled(const char *name) : ConfigOption(O_Disabled)
+ ConfigDisabled(const char *name) : ConfigOption(O_Disabled)
{ m_name = name; }
void writeTemplate(FTextStream &,bool,bool);
void compareDoxyfile(FTextStream &) {}
@@ -296,7 +298,7 @@ class ConfigDisabled : public ConfigOption
* read from a user-supplied configuration file.
* The static member instance() can be used to get
* a pointer to the one and only instance.
- *
+ *
* Set all variables to their default values by
* calling Config::instance()->init()
*
@@ -320,8 +322,8 @@ class ConfigImpl
delete m_instance;
m_instance=0;
}
-
- /*! Returns an iterator that can by used to iterate over the
+
+ /*! Returns an iterator that can by used to iterate over the
* configuration options.
*/
QListIterator<ConfigOption> iterator()
@@ -329,36 +331,36 @@ class ConfigImpl
return QListIterator<ConfigOption>(*m_options);
}
- /*!
+ /*!
* @name Getting configuration values.
* @{
*/
- /*! Returns the value of the string option with name \a fileName.
+ /*! Returns the value of the string option with name \a fileName.
* The arguments \a num and \a name are for debugging purposes only.
* There is a convenience function Config_getString() for this.
*/
QCString &getString(const char *fileName,int num,const char *name) const;
- /*! Returns the value of the list option with name \a fileName.
+ /*! Returns the value of the list option with name \a fileName.
* The arguments \a num and \a name are for debugging purposes only.
* There is a convenience function Config_getList() for this.
*/
- QStrList &getList(const char *fileName,int num,const char *name) const;
+ StringVector &getList(const char *fileName,int num,const char *name) const;
- /*! Returns the value of the enum option with name \a fileName.
+ /*! Returns the value of the enum option with name \a fileName.
* The arguments \a num and \a name are for debugging purposes only.
* There is a convenience function Config_getEnum() for this.
*/
QCString &getEnum(const char *fileName,int num,const char *name) const;
- /*! Returns the value of the integer option with name \a fileName.
+ /*! Returns the value of the integer option with name \a fileName.
* The arguments \a num and \a name are for debugging purposes only.
* There is a convenience function Config_getInt() for this.
*/
int &getInt(const char *fileName,int num,const char *name) const;
- /*! Returns the value of the boolean option with name \a fileName.
+ /*! Returns the value of the boolean option with name \a fileName.
* The arguments \a num and \a name are for debugging purposes only.
* There is a convenience function Config_getBool() for this.
*/
@@ -369,12 +371,12 @@ class ConfigImpl
*/
ConfigOption *get(const char *name) const
{
- return m_dict->find(name);
+ return m_dict->find(name);
}
/* @} */
- /*!
- * @name Adding configuration options.
+ /*!
+ * @name Adding configuration options.
* @{
*/
@@ -401,7 +403,7 @@ class ConfigImpl
}
/*! Adds a new enumeration option with \a name and documentation \a doc
- * and initial value \a defVal.
+ * and initial value \a defVal.
* \returns An object representing the option.
*/
ConfigEnum *addEnum(const char *name,
@@ -509,18 +511,18 @@ class ConfigImpl
/*! Parse a configuration data in string \a str.
* \returns TRUE if successful, or FALSE if the string could not be
* parsed.
- */
+ */
//bool parseString(const char *fn,const char *str);
bool parseString(const char *fn,const char *str,bool upd = FALSE);
/*! Parse a configuration file with name \a fn.
- * \returns TRUE if successful, FALSE if the file could not be
+ * \returns TRUE if successful, FALSE if the file could not be
* opened or read.
- */
+ */
bool parse(const char *fn,bool upd = FALSE);
/*! Called from the constructor, will add doxygen's default options
- * to the configuration object
+ * to the configuration object
*/
void create();
diff --git a/src/configimpl.l b/src/configimpl.l
index 840213c..7f73ec0 100644
--- a/src/configimpl.l
+++ b/src/configimpl.l
@@ -1,21 +1,24 @@
/******************************************************************************
*
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
*/
%option never-interactive
%option prefix="configimplYY"
+%top{
+#include <stdint.h>
+}
%{
/*
- * includes
+ * includes
*/
#include <stdio.h>
#include <stdlib.h>
@@ -26,12 +29,13 @@
#include <qfileinfo.h>
#include <qdir.h>
-#include <qtextstream.h>
#include <qregexp.h>
#include <qstack.h>
#include <qglobal.h>
-#include <qthread.h>
-
+
+#include <thread>
+#include <algorithm>
+
#include "configimpl.h"
#include "version.h"
#include "portable.h"
@@ -44,7 +48,11 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
+#define USE_STATE2STRING 0
+
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
static const char *warning_str = "warning: ";
static const char *error_str = "error: ";
@@ -54,7 +62,7 @@ void config_err(const char *fmt, ...)
va_list args;
va_start(args, fmt);
vfprintf(stderr, (QCString(error_str) + fmt).data(), args);
- va_end(args);
+ va_end(args);
}
void config_term(const char *fmt, ...)
{
@@ -93,20 +101,27 @@ static QCString convertToComment(const QCString &s, const QCString &u)
QCString tmp=s.stripWhiteSpace();
const char *p=tmp.data();
char c;
- result+="#";
- if (*p && *p!='\n')
- result+=" ";
- while ((c=*p++))
+ if (p)
{
- if (c=='\n')
+ result+="#";
+ if (*p && *p!='\n')
+ {
+ result+=" ";
+ }
+ while ((c=*p++))
{
- result+="\n#";
- if (*p && *p!='\n')
- result+=" ";
+ if (c=='\n')
+ {
+ result+="\n#";
+ if (*p && *p!='\n')
+ {
+ result+=" ";
+ }
+ }
+ else result+=c;
}
- else result+=c;
+ result+='\n';
}
- result+='\n';
}
if (!u.isEmpty())
{
@@ -127,27 +142,27 @@ void ConfigOption::writeIntValue(FTextStream &t,int i)
t << " " << i;
}
-void ConfigOption::writeStringValue(FTextStream &t,QCString &s)
+void ConfigOption::writeStringValue(FTextStream &t,const QCString &s)
{
char c;
bool needsEscaping=FALSE;
- // convert the string back to it original encoding
+ // convert the string back to it original g_encoding
QCString se = configStringRecode(s,"UTF-8",m_encoding);
const char *p=se.data();
if (p)
{
t << " ";
- while ((c=*p++)!=0 && !needsEscaping)
- needsEscaping = (c==' ' || c=='\n' || c=='\t' || c=='"' || c=='#');
+ while ((c=*p++)!=0 && !needsEscaping)
+ needsEscaping = (c==' ' || c== ',' || c=='\n' || c=='\t' || c=='"' || c=='#');
if (needsEscaping)
- {
+ {
t << "\"";
p=se.data();
while (*p)
{
- if (*p==' ' && *(p+1)=='\0') break; // skip inserted space at the end
- if (*p=='"') t << "\\"; // escape quotes
- t << *p++;
+ if (*p==' ' && *(p+1)=='\0') break; // skip inserted space at the end
+ if (*p=='"') t << "\\"; // escape quotes
+ t << *p++;
}
t << "\"";
}
@@ -158,19 +173,17 @@ void ConfigOption::writeStringValue(FTextStream &t,QCString &s)
}
}
-void ConfigOption::writeStringList(FTextStream &t,QStrList &l)
+void ConfigOption::writeStringList(FTextStream &t,const StringVector &l)
{
- const char *p = l.first();
bool first=TRUE;
- while (p)
+ for (const auto &p : l)
{
- QCString s=p;
+ if (!first) t << " \\" << endl;
+ QCString s=p.c_str();
if (!first)
t << " ";
- first=FALSE;
writeStringValue(t,s);
- p = l.next();
- if (p) t << " \\" << endl;
+ first=FALSE;
}
}
@@ -179,7 +192,7 @@ void ConfigOption::writeStringList(FTextStream &t,QStrList &l)
ConfigImpl *ConfigImpl::m_instance = 0;
-void ConfigInt::convertStrToVal()
+void ConfigInt::convertStrToVal()
{
if (!m_valueString.isEmpty())
{
@@ -202,7 +215,7 @@ void ConfigBool::convertStrToVal()
QCString val = m_valueString.stripWhiteSpace().lower();
if (!val.isEmpty())
{
- if (val=="yes" || val=="true" || val=="1" || val=="all")
+ if (val=="yes" || val=="true" || val=="1" || val=="all")
{
m_value=TRUE;
}
@@ -218,10 +231,34 @@ void ConfigBool::convertStrToVal()
}
}
+void ConfigEnum::convertStrToVal()
+{
+ if (m_value.isEmpty())
+ {
+ m_value = m_defValue;
+ return;
+ }
+ QCString val = m_value.stripWhiteSpace().lower();
+ const char *s=m_valueRange.first();
+ while (s)
+ {
+ if (QCString(s).lower() == val)
+ {
+ m_value = s;
+ return;
+ }
+ s = m_valueRange.next();
+ }
+
+ config_warn("argument '%s' for option %s is not a valid enum value\n"
+ "Using the default: %s!\n",m_value.data(),m_name.data(),m_defValue.data());
+ m_value = m_defValue;
+}
+
QCString &ConfigImpl::getString(const char *fileName,int num,const char *name) const
{
ConfigOption *opt = m_dict->find(name);
- if (opt==0)
+ if (opt==0)
{
config_term("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
}
@@ -232,10 +269,10 @@ QCString &ConfigImpl::getString(const char *fileName,int num,const char *name) c
return *((ConfigString *)opt)->valueRef();
}
-QStrList &ConfigImpl::getList(const char *fileName,int num,const char *name) const
+StringVector &ConfigImpl::getList(const char *fileName,int num,const char *name) const
{
ConfigOption *opt = m_dict->find(name);
- if (opt==0)
+ if (opt==0)
{
config_term("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
}
@@ -249,7 +286,7 @@ QStrList &ConfigImpl::getList(const char *fileName,int num,const char *name) con
QCString &ConfigImpl::getEnum(const char *fileName,int num,const char *name) const
{
ConfigOption *opt = m_dict->find(name);
- if (opt==0)
+ if (opt==0)
{
config_term("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
}
@@ -263,7 +300,7 @@ QCString &ConfigImpl::getEnum(const char *fileName,int num,const char *name) con
int &ConfigImpl::getInt(const char *fileName,int num,const char *name) const
{
ConfigOption *opt = m_dict->find(name);
- if (opt==0)
+ if (opt==0)
{
config_term("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
}
@@ -277,7 +314,7 @@ int &ConfigImpl::getInt(const char *fileName,int num,const char *name) const
bool &ConfigImpl::getBool(const char *fileName,int num,const char *name) const
{
ConfigOption *opt = m_dict->find(name);
- if (opt==0)
+ if (opt==0)
{
config_term("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
}
@@ -320,71 +357,33 @@ void ConfigList::writeTemplate(FTextStream &t,bool sl,bool)
void ConfigList::compareDoxyfile(FTextStream &t)
{
- const char *p = m_value.first();
- const char *q = m_defaultValue.first();
- int defCnt = 0;
- int valCnt = 0;
-
- // count non empty elements
- while (p)
- {
- QCString s=p;
- if (!s.stripWhiteSpace().isEmpty()) valCnt += 1;
- p = m_value.next();
- }
-
- while (q)
- {
- QCString s=q;
- if (!s.stripWhiteSpace().isEmpty()) defCnt += 1;
- q = m_defaultValue.next();
- }
+ auto get_stripped = [](std::string s) { return QCString(s.c_str()).stripWhiteSpace(); };
+ auto is_not_empty = [get_stripped](std::string s) { return !get_stripped(s).isEmpty(); };
+ int defCnt = std::count_if( m_value.begin(), m_value.end(),is_not_empty);
+ int valCnt = std::count_if(m_defaultValue.begin(),m_defaultValue.end(),is_not_empty);
if ( valCnt != defCnt)
{
writeTemplate(t,TRUE,TRUE);
return;
}
-
- // get first non empry element
- q = m_defaultValue.first();
- p = m_value.first();
- QCString sp = p;
- while (p && sp.stripWhiteSpace().isEmpty())
- {
- p = m_value.next();
- sp = p;
- }
- QCString sq = q;
- while (q && sq.stripWhiteSpace().isEmpty())
+ auto it1 = m_value.begin();
+ auto it2 = m_defaultValue.begin();
+ while (it1!=m_value.end() && it2!=m_defaultValue.end())
{
- q = m_value.next();
- sq = q;
- }
- while (p)
- {
- // skip empty elements
- sp = p;
- while (p && sp.stripWhiteSpace().isEmpty())
- {
- p = m_value.next();
- sp = p;
- }
- sq = q;
- while (q && sq.stripWhiteSpace().isEmpty())
+ // skip over empty values
+ while (it1!=m_value.end() && !is_not_empty(*it1))
{
- q = m_value.next();
- sq = q;
+ ++it1;
}
- // be sure we have still an element (p and q have same number of 'filled' elements)
- if (p)
+ if (it1!=m_value.end()) // non-empty value
{
- if (sp.stripWhiteSpace() != sq.stripWhiteSpace())
+ if (get_stripped(*it1) != get_stripped(*it2)) // not the default, write as difference
{
writeTemplate(t,TRUE,TRUE);
return;
}
- p = m_value.next();
- q = m_defaultValue.next();
+ ++it1;
+ ++it2;
}
}
}
@@ -496,7 +495,7 @@ void ConfigDisabled::writeTemplate(FTextStream &,bool,bool) {}
/* -----------------------------------------------------------------
*
- * static variables
+ * static variables
*/
struct ConfigFileState
@@ -506,49 +505,47 @@ struct ConfigFileState
YY_BUFFER_STATE oldState;
YY_BUFFER_STATE newState;
QCString fileName;
-};
-
-static const char *inputString;
-static int inputPosition;
-static int yyLineNr;
-static QCString yyFileName;
-static QCString tmpString;
-static QCString *s=0;
-static bool *b=0;
-static QStrList *l=0;
-static int lastState;
-static QCString elemStr;
-static QStrList includePathList;
-static QStack<ConfigFileState> includeStack;
-static int includeDepth;
-static bool config_upd = FALSE;
-static QCString encoding;
-static ConfigImpl *config;
+};
+
+static const char *g_inputString;
+static int g_inputPosition;
+static int g_yyLineNr;
+static QCString g_yyFileName;
+static QCString g_cmd;
+static QCString *g_string=0;
+static StringVector *g_list=0;
+static QCString g_listStr;
+static StringVector g_includePathList;
+static QStack<ConfigFileState> g_includeStack;
+static int g_includeDepth;
+static bool g_configUpdate = FALSE;
+static QCString g_encoding;
+static ConfigImpl *g_config;
/* -----------------------------------------------------------------
*/
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-static int yyread(char *buf,int max_size)
+static yy_size_t yyread(char *buf,yy_size_t max_size)
{
- // no file included
- if (includeStack.isEmpty())
- {
- int c=0;
- if (inputString==0) return c;
- while( c < max_size && inputString[inputPosition] )
- {
- *buf = inputString[inputPosition++] ;
- c++; buf++;
- }
- return c;
- }
- else
+ // no file included
+ if (g_includeStack.isEmpty())
+ {
+ yy_size_t c=0;
+ if (g_inputString==0) return c;
+ while( c < max_size && g_inputString[g_inputPosition] )
{
- //assert(includeStack.current()->newState==YY_CURRENT_BUFFER);
- return (int)fread(buf,1,max_size,includeStack.current()->filePtr);
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
}
+ return c;
+ }
+ else
+ {
+ //assert(g_includeStack.current()->newState==YY_CURRENT_BUFFER);
+ return (yy_size_t)fread(buf,1,max_size,g_includeStack.current()->filePtr);
+ }
}
@@ -564,7 +561,7 @@ static QCString configStringRecode(
int outputSize=inputSize*4+1;
QCString output(outputSize);
void *cd = portable_iconv_open(outputEncoding,inputEncoding);
- if (cd==(void *)(-1))
+ if (cd==(void *)(-1))
{
config_term("Error: unsupported character conversion: '%s'->'%s'\n",
inputEncoding.data(),outputEncoding.data());
@@ -591,8 +588,185 @@ static QCString configStringRecode(
static void checkEncoding()
{
- ConfigString *option = (ConfigString*)config->get("DOXYFILE_ENCODING");
- encoding = *option->valueRef();
+ ConfigString *option = (ConfigString*)g_config->get("DOXYFILE_ENCODING");
+ g_encoding = *option->valueRef();
+}
+
+static QCString stripComment(const QCString &s)
+{
+ // check if there is a comment at the end of the string
+ bool insideQuote=false;
+ int l = s.length();
+ for (int i=0;i<l;i++)
+ {
+ char c = s.at(i);
+ if (c=='\\') // skip over escaped characters
+ {
+ i++;
+ }
+ else if (c=='"') // toggle inside/outside quotation
+ {
+ insideQuote=!insideQuote;
+ }
+ else if (!insideQuote && c=='#') // found start of a comment
+ {
+ if (i<l-1 && s.at(i+1)=='#') // ## -> user comment
+ {
+ g_config->appendUserComment(s.mid(i)+"\n");
+ }
+ return s.left(i).stripWhiteSpace();
+ }
+ }
+ return s;
+}
+
+static void processString()
+{
+ // strip leading and trailing whitespace
+ QCString s = stripComment(g_string->stripWhiteSpace());
+ int l = s.length();
+
+ // remove surrounding quotes if present (and not escaped)
+ if (l>=2 && s.at(0)=='"' && s.at(l-1)=='"' && // remove quotes
+ (s.at(l-2)!='\\' || (s.at(l-2)=='\\' && s.at(l-3)=='\\')))
+ {
+ s=s.mid(1,s.length()-2);
+ l=s.length();
+ }
+
+ // check for invalid and/or escaped quotes
+ bool warned=false;
+ QCString result;
+ for (int i=0;i<l;i++)
+ {
+ char c = s.at(i);
+ if (c=='\\') // escaped character
+ {
+ if (i<l-1 && s.at(i+1)=='"') // unescape the quote character
+ {
+ result+='"';
+ }
+ else // keep other escaped characters in escaped form
+ {
+ result+=c;
+ if (i<l-1)
+ {
+ result+=s.at(i+1);
+ }
+ }
+ i++; // skip over the escaped character
+ }
+ else if (c=='"') // unescaped quote
+ {
+ if (!warned)
+ {
+ config_warn("Invalid value for '%s' tag at line %d, file %s: Value '%s' is not properly quoted\n",
+ g_cmd.data(),g_yyLineNr,g_yyFileName.data(),g_string->stripWhiteSpace().data());
+ }
+ warned=true;
+ }
+ else // normal character
+ {
+ result+=c;
+ }
+ }
+
+ // recode the string
+ *g_string=configStringRecode(result,g_encoding,"UTF-8");
+
+ // update encoding
+ checkEncoding();
+
+ //printf("Processed string '%s'\n",g_string->data());
+}
+
+static void processList()
+{
+ bool allowCommaAsSeparator = g_cmd!="PREDEFINED";
+
+ const QCString s = stripComment(g_listStr.stripWhiteSpace());
+ int l = s.length();
+
+ QCString elemStr;
+
+ // helper to push elemStr to the list and clear it
+ auto addElem = [&elemStr]()
+ {
+ if (!elemStr.isEmpty())
+ {
+ QCString e = configStringRecode(elemStr,g_encoding,"UTF-8");
+ //printf("Processed list element '%s'\n",e.data());
+ g_list->push_back(e.str());
+ elemStr="";
+ }
+ };
+
+ bool needsSeparator=false;
+ int insideQuote=false;
+ bool warned=false;
+ for (int i=0;i<l;i++)
+ {
+ char c = s.at(i);
+ if (!needsSeparator && c=='\\') // escaped character
+ {
+ if (i<l-1 && s.at(i+1)=='"') // unescape the quote character
+ {
+ elemStr+='"';
+ }
+ else // keep other escaped characters in escaped form
+ {
+ elemStr+=c;
+ if (i<l-1)
+ {
+ elemStr+=s.at(i+1);
+ }
+ }
+ i++; // skip over the escaped character
+ }
+ else if (!needsSeparator && c=='"') // quote character
+ {
+ if (!insideQuote)
+ {
+ insideQuote=true;
+ }
+ else // this quote ends an element
+ {
+ insideQuote=false;
+ needsSeparator=true;
+ }
+ }
+ else if (!insideQuote && ((c==',' && allowCommaAsSeparator) || isspace(c))) // separator
+ {
+ needsSeparator=false;
+ addElem();
+ }
+ else // normal content character
+ {
+ if (needsSeparator)
+ {
+ if (!warned)
+ {
+ config_warn("Invalid value for '%s' tag at line %d, file %s: Values in list '%s' are not properly space %sseparated\n",
+ g_cmd.data(),g_yyLineNr,g_yyFileName.data(),g_listStr.stripWhiteSpace().data(),allowCommaAsSeparator?"or comma ":"");
+ warned=true;
+ }
+ needsSeparator=false;
+ i--; // try the character again as part of a new element
+ addElem();
+ }
+ else
+ {
+ elemStr+=c;
+ }
+ }
+ }
+ // add last part
+ addElem();
+ if (insideQuote)
+ {
+ config_warn("Invalid value for '%s' tag at line %d, file %s: Values in list '%s' are not properly quoted\n",
+ g_cmd.data(),g_yyLineNr,g_yyFileName.data(),g_listStr.stripWhiteSpace().data());
+ }
}
static FILE *tryPath(const char *path,const char *fileName)
@@ -608,7 +782,7 @@ static FILE *tryPath(const char *path,const char *fileName)
return 0;
}
-static void substEnvVarsInStrList(QStrList &sl);
+static void substEnvVarsInStrList(StringVector &sl);
static void substEnvVarsInString(QCString &s);
static FILE *findFile(const char *fileName)
@@ -621,24 +795,22 @@ static FILE *findFile(const char *fileName)
{
return tryPath(NULL, fileName);
}
- substEnvVarsInStrList(includePathList);
- char *s=includePathList.first();
- while (s) // try each of the include paths
+ substEnvVarsInStrList(g_includePathList);
+ for (const auto &s : g_includePathList)
{
- FILE *f = tryPath(s,fileName);
+ FILE *f = tryPath(s.c_str(),fileName);
if (f) return f;
- s=includePathList.next();
- }
- // try cwd if includePathList fails
+ }
+ // try cwd if g_includePathList fails
return tryPath(".",fileName);
}
static void readIncludeFile(const char *incName)
{
- if (includeDepth==MAX_INCLUDE_DEPTH) {
+ if (g_includeDepth==MAX_INCLUDE_DEPTH) {
config_term("maximum include depth (%d) reached, %s is not included. Aborting...\n",
- MAX_INCLUDE_DEPTH,incName);
- }
+ MAX_INCLUDE_DEPTH,incName);
+ }
QCString inc = incName;
substEnvVarsInString(inc);
@@ -655,24 +827,24 @@ static void readIncludeFile(const char *incName)
{
// For debugging
#if SHOW_INCLUDES
- for (i=0;i<includeStack.count();i++) msg(" ");
+ for (i=0;i<g_includeStack.count();i++) msg(" ");
msg("@INCLUDE = %s: parsing...\n",inc.data());
#endif
- // store the state of the old file
+ // store the state of the old file
ConfigFileState *fs=new ConfigFileState;
fs->oldState=YY_CURRENT_BUFFER;
- fs->lineNr=yyLineNr;
- fs->fileName=yyFileName;
+ fs->lineNr=g_yyLineNr;
+ fs->fileName=g_yyFileName;
fs->filePtr=f;
// push the state on the stack
- includeStack.push(fs);
+ g_includeStack.push(fs);
// set the scanner to the include file
yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
fs->newState=YY_CURRENT_BUFFER;
- yyFileName=inc;
- includeDepth++;
- }
+ g_yyFileName=inc;
+ g_includeDepth++;
+ }
else
{
config_term("@INCLUDE = %s: not found!\n",inc.data());
@@ -683,252 +855,235 @@ static void readIncludeFile(const char *incName)
%}
%option noyywrap
+%option nounput
-%x PreStart
%x Start
-%x SkipComment
%x SkipInvalid
%x GetString
-%x GetBool
%x GetStrList
-%x GetQuotedString
-%x GetEnvVar
%x Include
%%
<*>\0x0d
-<PreStart>"##".*"\n" { config->appendStartComment(yytext);yyLineNr++;}
-<PreStart>. {
- BEGIN(Start);
- unput(*yytext);
- }
-<Start,GetString,GetStrList,GetBool,SkipInvalid>"##".*"\n" { config->appendUserComment(yytext);yyLineNr++;}
-<Start,GetString,GetStrList,GetBool,SkipInvalid>"#" { BEGIN(SkipComment); }
-<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { QCString cmd=yytext;
- cmd=cmd.left(cmd.length()-1).stripWhiteSpace();
- ConfigOption *option = config->get(cmd);
- if (option==0) // oops not known
- {
- config_warn("ignoring unsupported tag '%s' at line %d, file %s\n",
- cmd.data(),yyLineNr,yyFileName.data());
- BEGIN(SkipInvalid);
- }
- else // known tag
- {
- option->setUserComment(config->takeUserComment());
- option->setEncoding(encoding);
- switch(option->kind())
- {
- case ConfigOption::O_Info:
- // shouldn't get here!
- BEGIN(SkipInvalid);
- break;
- case ConfigOption::O_List:
- l = ((ConfigList *)option)->valueRef();
- l->clear();
- elemStr="";
- BEGIN(GetStrList);
- break;
- case ConfigOption::O_Enum:
- s = ((ConfigEnum *)option)->valueRef();
- s->resize(0);
- BEGIN(GetString);
- break;
- case ConfigOption::O_String:
- s = ((ConfigString *)option)->valueRef();
- s->resize(0);
- BEGIN(GetString);
- break;
- case ConfigOption::O_Int:
- s = ((ConfigInt *)option)->valueStringRef();
- s->resize(0);
- BEGIN(GetString);
- break;
- case ConfigOption::O_Bool:
- s = ((ConfigBool *)option)->valueStringRef();
- s->resize(0);
- BEGIN(GetString);
- break;
- case ConfigOption::O_Obsolete:
- if (config_upd)
+
+ /*-------------- Comments ---------------*/
+
+<Start>"##".*"\n" {
+ g_config->appendUserComment(yytext);
+ g_yyLineNr++;
+ }
+<Start>"#".*"\n" { /* normal comment */
+ g_yyLineNr++;
+ }
+
+ /*-------------- TAG start ---------------*/
+
+<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { g_cmd=yytext;
+ g_cmd=g_cmd.left(g_cmd.length()-1).stripWhiteSpace();
+ ConfigOption *option = g_config->get(g_cmd);
+ if (option==0) // oops not known
+ {
+ config_warn("ignoring unsupported tag '%s' at line %d, file %s\n",
+ g_cmd.data(),g_yyLineNr,g_yyFileName.data());
+ BEGIN(SkipInvalid);
+ }
+ else // known tag
+ {
+ option->setUserComment(g_config->takeUserComment());
+ option->setEncoding(g_encoding);
+ switch(option->kind())
+ {
+ case ConfigOption::O_Info:
+ // shouldn't get here!
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_List:
+ g_list = ((ConfigList *)option)->valueRef();
+ g_list->clear();
+ g_listStr="";
+ BEGIN(GetStrList);
+ break;
+ case ConfigOption::O_Enum:
+ g_string = ((ConfigEnum *)option)->valueRef();
+ g_string->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_String:
+ g_string = ((ConfigString *)option)->valueRef();
+ g_string->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_Int:
+ g_string = ((ConfigInt *)option)->valueStringRef();
+ g_string->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_Bool:
+ g_string = ((ConfigBool *)option)->valueStringRef();
+ g_string->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_Obsolete:
+ if (g_configUpdate)
{
- config_warn("Tag '%s' at line %d of file '%s' has become obsolete.\n"
- " This tag has been removed.\n", cmd.data(),yyLineNr,yyFileName.data());
+ config_warn("Tag '%s' at line %d of file '%s' has become obsolete.\n"
+ " This tag has been removed.\n", g_cmd.data(),g_yyLineNr,g_yyFileName.data());
}
else
{
- config_warn("Tag '%s' at line %d of file '%s' has become obsolete.\n"
- " To avoid this warning please remove this line from your configuration "
- "file or upgrade it using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
+ config_warn("Tag '%s' at line %d of file '%s' has become obsolete.\n"
+ " To avoid this warning please remove this line from your configuration "
+ "file or upgrade it using \"doxygen -u\"\n", g_cmd.data(),g_yyLineNr,g_yyFileName.data());
}
- BEGIN(SkipInvalid);
- break;
- case ConfigOption::O_Disabled:
- if (config_upd)
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_Disabled:
+ if (g_configUpdate)
{
- config_warn("Tag '%s' at line %d of file '%s' belongs to an option that was not enabled at compile time.\n"
- " This tag has been removed.\n", cmd.data(),yyLineNr,yyFileName.data());
+ config_warn("Tag '%s' at line %d of file '%s' belongs to an option that was not enabled at compile time.\n"
+ " This tag has been removed.\n", g_cmd.data(),g_yyLineNr,g_yyFileName.data());
}
else
{
- config_warn("Tag '%s' at line %d of file '%s' belongs to an option that was not enabled at compile time.\n"
- " To avoid this warning please remove this line from your configuration "
- "file or upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data());
+ config_warn("Tag '%s' at line %d of file '%s' belongs to an option that was not enabled at compile time.\n"
+ " To avoid this warning please remove this line from your configuration "
+ "file or upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", g_cmd.data(),g_yyLineNr,g_yyFileName.data());
}
- BEGIN(SkipInvalid);
- break;
- }
- }
- }
-<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" { QCString cmd=yytext;
- cmd=cmd.left(cmd.length()-2).stripWhiteSpace();
- ConfigOption *option = config->get(cmd);
- if (option==0) // oops not known
- {
- config_warn("ignoring unsupported tag '%s' at line %d, file %s\n",
- cmd.data(),yyLineNr,yyFileName.data());
- BEGIN(SkipInvalid);
- }
- else // known tag
- {
- option->setUserComment(config->takeUserComment());
- switch(option->kind())
- {
- case ConfigOption::O_Info:
- // shouldn't get here!
- BEGIN(SkipInvalid);
- break;
- case ConfigOption::O_List:
- l = ((ConfigList *)option)->valueRef();
- elemStr="";
- BEGIN(GetStrList);
- break;
- case ConfigOption::O_Enum:
- case ConfigOption::O_String:
- case ConfigOption::O_Int:
- case ConfigOption::O_Bool:
- config_warn("operator += not supported for '%s'. Ignoring line at line %d, file %s\n",
- yytext,yyLineNr,yyFileName.data());
- BEGIN(SkipInvalid);
- break;
- case ConfigOption::O_Obsolete:
- config_warn("Tag '%s' at line %d of file %s has become obsolete.\n"
- "To avoid this warning please update your configuration "
- "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
- BEGIN(SkipInvalid);
- break;
- case ConfigOption::O_Disabled:
- config_warn("Tag '%s' at line %d of file %s belongs to an option that was not enabled at compile time.\n"
- "To avoid this warning please remove this line from your configuration "
- "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data());
- BEGIN(SkipInvalid);
- break;
- }
- }
- }
-<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&includePathList; l->clear(); elemStr=""; }
- /* include a config file */
-<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);}
-<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
- readIncludeFile(configStringRecode(yytext,encoding,"UTF-8"));
- BEGIN(Start);
- }
-<<EOF>> {
+ BEGIN(SkipInvalid);
+ break;
+ }
+ }
+ }
+<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" { g_cmd=yytext;
+ g_cmd=g_cmd.left(g_cmd.length()-2).stripWhiteSpace();
+ ConfigOption *option = g_config->get(g_cmd);
+ if (option==0) // oops not known
+ {
+ config_warn("ignoring unsupported tag '%s' at line %d, file %s\n",
+ g_cmd.data(),g_yyLineNr,g_yyFileName.data());
+ BEGIN(SkipInvalid);
+ }
+ else // known tag
+ {
+ option->setUserComment(g_config->takeUserComment());
+ switch(option->kind())
+ {
+ case ConfigOption::O_Info:
+ // shouldn't get here!
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_List:
+ g_list = ((ConfigList *)option)->valueRef();
+ g_listStr="";
+ BEGIN(GetStrList);
+ break;
+ case ConfigOption::O_Enum:
+ case ConfigOption::O_String:
+ case ConfigOption::O_Int:
+ case ConfigOption::O_Bool:
+ config_warn("operator += not supported for '%s'. Ignoring line at line %d, file %s\n",
+ yytext,g_yyLineNr,g_yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_Obsolete:
+ config_warn("Tag '%s' at line %d of file %s has become obsolete.\n"
+ "To avoid this warning please update your configuration "
+ "file using \"doxygen -u\"\n", g_cmd.data(),g_yyLineNr,g_yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_Disabled:
+ config_warn("Tag '%s' at line %d of file %s belongs to an option that was not enabled at compile time.\n"
+ "To avoid this warning please remove this line from your configuration "
+ "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", g_cmd.data(),g_yyLineNr,g_yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
+ }
+ }
+ }
+
+ /*-------------- INCLUDE* ---------------*/
+
+<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); g_list=&g_includePathList; g_list->clear(); g_listStr=""; }
+ /* include a g_config file */
+<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);}
+<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
+ readIncludeFile(configStringRecode(yytext,g_encoding,"UTF-8"));
+ BEGIN(Start);
+ }
+<<EOF>> {
//printf("End of include file\n");
- //printf("Include stack depth=%d\n",g_includeStack.count());
- if (includeStack.isEmpty())
- {
- //printf("Terminating scanner!\n");
- yyterminate();
- }
- else
- {
- ConfigFileState *fs=includeStack.pop();
- fclose(fs->filePtr);
- YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
- yy_switch_to_buffer( fs->oldState );
- yy_delete_buffer( oldBuf );
- yyLineNr=fs->lineNr;
- yyFileName=fs->fileName;
- delete fs; fs=0;
- includeDepth--;
- }
- }
-
-<Start>[a-z_A-Z0-9]+ { config_warn("ignoring unknown tag '%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
-<GetString,GetBool,SkipInvalid>\n { yyLineNr++; BEGIN(Start); }
-<GetStrList>\n {
- yyLineNr++;
- if (!elemStr.isEmpty())
- {
- //printf("elemStr1='%s'\n",elemStr.data());
- l->append(elemStr);
- }
- BEGIN(Start);
- }
-<GetStrList>[ \t,]+ {
- if (!elemStr.isEmpty())
- {
- //printf("elemStr2='%s'\n",elemStr.data());
- l->append(elemStr);
- }
- elemStr.resize(0);
- }
-<GetString>[^ \"\t\r\n]+ { (*s)+=configStringRecode(yytext,encoding,"UTF-8");
- checkEncoding();
+ //printf("Include stack depth=%d\n",g_includeStack.count());
+ if (g_includeStack.isEmpty())
+ {
+ //printf("Terminating scanner!\n");
+ yyterminate();
+ }
+ else
+ {
+ ConfigFileState *fs=g_includeStack.pop();
+ fclose(fs->filePtr);
+ YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer( fs->oldState );
+ yy_delete_buffer( oldBuf );
+ g_yyLineNr=fs->lineNr;
+ g_yyFileName=fs->fileName;
+ delete fs; fs=0;
+ g_includeDepth--;
+ }
+ }
+
+<Start>[a-z_A-Z0-9]+ { config_warn("ignoring unknown tag '%s' at line %d, file %s\n",yytext,g_yyLineNr,g_yyFileName.data()); }
+ /*-------------- GetString ---------------*/
+
+<GetString>\n { processString();
+ g_yyLineNr++; // end of string
+ BEGIN(Start);
+ }
+<GetString>\\[ \r\t]*\n { g_yyLineNr++; // line continuation
+ *g_string+=' ';
+ }
+<GetString>"\\" { // escape character
+ *g_string+=yytext;
+ }
+<GetString>[^\n\\]+ { // string part without escape characters
+ *g_string+=yytext;
}
-<GetString,GetStrList,SkipInvalid>"\"" { lastState=YY_START;
- BEGIN(GetQuotedString);
- tmpString.resize(0);
- }
-<GetQuotedString>"\""|"\n" {
- // we add a bogus space to signal that the string was quoted. This space will be stripped later on.
- tmpString+=" ";
- //printf("Quoted String = '%s'\n",tmpString.data());
- if (lastState==GetString)
- {
- (*s)+=configStringRecode(tmpString,encoding,"UTF-8");
- checkEncoding();
- }
- else
- {
- elemStr+=configStringRecode(tmpString,encoding,"UTF-8");
- }
- if (*yytext=='\n')
- {
- config_warn("Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
- yyLineNr++;
- }
- BEGIN(lastState);
- }
-<GetQuotedString>"\\\"" {
- tmpString+='"';
- }
-<GetQuotedString>. { tmpString+=*yytext; }
-<GetBool>[a-zA-Z]+ {
- QCString bs=yytext;
- bs=bs.upper();
- if (bs=="YES" || bs=="1")
- *b=TRUE;
- else if (bs=="NO" || bs=="0")
- *b=FALSE;
- else
- {
- *b=FALSE;
- config_warn("Invalid value '%s' for "
- "boolean tag in line %d, file %s; use YES or NO\n",
- bs.data(),yyLineNr,yyFileName.data());
- }
- }
-<GetStrList>[^ \#\"\t\r\n,]+ {
- elemStr+=configStringRecode(yytext,encoding,"UTF-8");
- }
-<SkipComment>\n { yyLineNr++; BEGIN(Start); }
-<SkipComment>\\[ \r\t]*\n { yyLineNr++; BEGIN(Start); }
-<*>\\[ \r\t]*\n { yyLineNr++; }
-<*>.
-<*>\n { yyLineNr++ ; }
+
+ /*-------------- GetStrList --------------*/
+
+<GetStrList>\n { processList();
+ g_yyLineNr++; // end of list
+ BEGIN(Start);
+ }
+<GetStrList>\\[ \r\t]*\n { g_yyLineNr++; // line continuation
+ g_listStr+=' ';
+ }
+<GetStrList>"\\" { // escape character
+ g_listStr+=yytext;
+ }
+<GetStrList>[^\n\\]+ { // string part without escape characters
+ g_listStr+=yytext;
+ }
+
+ /*-------------- SkipInvalid --------------*/
+
+<SkipInvalid>\n { g_yyLineNr++; // end of list
+ BEGIN(Start);
+ }
+<SkipInvalid>\\[ \r\t]*\n { g_yyLineNr++; // line continuation
+ }
+<SkipInvalid>"\\" { // escape character
+ }
+<SkipInvalid>[^\n\\]+ { // string part without escape characters
+ }
+
+ /*-------------- fall through -------------*/
+
+<*>\\[ \r\t]*\n { g_yyLineNr++; }
+<*>[ \t\r]
+<*>\n { g_yyLineNr++ ; }
+<*>. { config_warn("ignoring unknown character '%c' at line %d, file %s\n",yytext[0],g_yyLineNr,g_yyFileName.data()); }
%%
@@ -940,9 +1095,9 @@ void ConfigImpl::writeTemplate(FTextStream &t,bool sl,bool upd)
/* print first lines of user comment that were at the beginning of the file, might have special meaning for editors */
if (m_startComment)
{
- t << takeStartComment() << endl;
+ t << takeStartComment() << endl;
}
- t << "# Doxyfile " << getVersion() << endl << endl;
+ t << "# Doxyfile " << getDoxygenVersion() << endl << endl;
if (!sl)
{
t << convertToComment(m_header,"");
@@ -963,11 +1118,7 @@ void ConfigImpl::writeTemplate(FTextStream &t,bool sl,bool upd)
void ConfigImpl::compareDoxyfile(FTextStream &t)
{
- t << "# Difference with default Doxyfile " << getVersion();
- if (strlen(getGitVersion()))
- {
- t << " (" << getGitVersion() << ")";
- }
+ t << "# Difference with default Doxyfile " << getFullVersion();
t << endl;
QListIterator<ConfigOption> it = iterator();
ConfigOption *option;
@@ -1018,12 +1169,12 @@ static void substEnvVarsInString(QCString &s)
//printf("substEnvVarInString(%s) end\n",s.data());
}
-static void substEnvVarsInStrList(QStrList &sl)
+static void substEnvVarsInStrList(StringVector &sl)
{
- char *s = sl.first();
- while (s)
+ StringVector results;
+ for (const auto &s : sl)
{
- QCString result(s);
+ QCString result = s.c_str();
// an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
// here we strip the quote again
@@ -1032,10 +1183,10 @@ static void substEnvVarsInStrList(QStrList &sl)
//printf("Result %s was quoted=%d\n",result.data(),wasQuoted);
if (!wasQuoted) /* as a result of the expansion, a single string
- may have expanded into a list, which we'll
- add to sl. If the original string already
- contained multiple elements no further
- splitting is done to allow quoted items with spaces! */
+ may have expanded into a list, which we'll
+ add to sl. If the original string already
+ contained multiple elements no further
+ splitting is done to allow quoted items with spaces! */
{
int l=result.length();
int i,p=0;
@@ -1043,63 +1194,50 @@ static void substEnvVarsInStrList(QStrList &sl)
// search for a "word"
for (i=0;i<l;i++)
{
- char c=0;
- // skip until start of new word
- while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
- p=i; // p marks the start index of the word
- // skip until end of a word
- while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
- if (i<l) // not at the end of the string
- {
- if (c=='"') // word within quotes
- {
- p=i+1;
- for (i++;i<l;i++)
- {
- c=result.at(i);
- if (c=='"') // end quote
- {
- // replace the string in the list and go to the next item.
- sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
- sl.next(); // current item is now the old item
- p=i+1;
- break;
- }
- else if (c=='\\') // skip escaped stuff
- {
- i++;
- }
- }
- }
- else if (c==' ' || c=='\t') // separator
- {
- // replace the string in the list and go to the next item.
- sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
- sl.next(); // current item is now the old item
- p=i+1;
- }
- }
+ char c=0;
+ // skip until start of new word
+ while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
+ p=i; // p marks the start index of the word
+ // skip until end of a word
+ while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
+ if (i<l) // not at the end of the string
+ {
+ if (c=='"') // word within quotes
+ {
+ p=i+1;
+ for (i++;i<l;i++)
+ {
+ c=result.at(i);
+ if (c=='"') // end quote
+ {
+ results.push_back(result.mid(p,i-p).data());
+ p=i+1;
+ break;
+ }
+ else if (c=='\\') // skip escaped stuff
+ {
+ i++;
+ }
+ }
+ }
+ else if (c==' ' || c=='\t') // separator
+ {
+ if (i>p) results.push_back(result.mid(p,i-p).data());
+ p=i+1;
+ }
+ }
}
if (p!=l) // add the leftover as a string
{
- // replace the string in the list and go to the next item.
- sl.insert(sl.at(),result.right(l-p)); // insert new item before current item.
- sl.next(); // current item is now the old item
+ results.push_back(result.right(l-p).data());
}
}
else // just goto the next element in the list
{
- sl.insert(sl.at(),result);
- sl.next();
+ if (!result.isEmpty()) results.push_back(result.data());
}
- // remove the old unexpanded string from the list
- int i=sl.at();
- sl.remove(); // current item index changes if the last element is removed.
- if (sl.at()==i) // not last item
- s = sl.current();
- else // just removed last item
- s = 0;
}
+ sl = results;
}
void ConfigString::substEnvVars()
@@ -1166,7 +1304,7 @@ void ConfigImpl::init()
void ConfigImpl::create()
{
- if (m_initialized) return;
+ if (m_initialized) return;
m_initialized = TRUE;
addConfigOptions(this);
}
@@ -1183,13 +1321,13 @@ static QCString configFileToString(const char *name)
if (fileOpened)
{
const int bSize=4096;
- QCString contents(bSize);
+ QCString contents(bSize+1);
int totalSize=0;
int size;
while ((size=f.readBlock(contents.rawData()+totalSize,bSize))==bSize)
{
totalSize+=bSize;
- contents.resize(totalSize+bSize);
+ contents.resize(totalSize+bSize+1);
}
totalSize+=size+2;
contents.resize(totalSize);
@@ -1214,15 +1352,15 @@ static QCString configFileToString(const char *name)
QCString contents(fsize+2);
f.readBlock(contents.rawData(),fsize);
f.close();
- if (fsize==0 || contents[fsize-1]=='\n')
- contents[fsize]='\0';
+ if (fsize==0 || contents[fsize-1]=='\n')
+ contents[fsize]='\0';
else
- contents[fsize]='\n'; // to help the scanner
+ contents[fsize]='\n'; // to help the scanner
contents[fsize+1]='\0';
return contents;
}
}
- if (!fileOpened)
+ if (!fileOpened)
{
config_term("cannot open file '%s' for reading\n",name);
}
@@ -1231,81 +1369,64 @@ static QCString configFileToString(const char *name)
bool ConfigImpl::parseString(const char *fn,const char *str,bool update)
{
- config = ConfigImpl::instance();
- inputString = str;
- inputPosition = 0;
- yyFileName = fn;
- yyLineNr = 1;
- includeStack.setAutoDelete(TRUE);
- includeStack.clear();
- includeDepth = 0;
+ g_config = ConfigImpl::instance();
+ g_inputString = str;
+ g_inputPosition = 0;
+ g_yyFileName = fn;
+ g_yyLineNr = 1;
+ g_includeStack.setAutoDelete(TRUE);
+ g_includeStack.clear();
+ g_includeDepth = 0;
configimplYYrestart( configimplYYin );
- BEGIN( PreStart );
- config_upd = update;
+ BEGIN( Start );
+ g_configUpdate = update;
configimplYYlex();
- config_upd = FALSE;
- inputString = 0;
+ g_configUpdate = FALSE;
+ g_inputString = 0;
return TRUE;
}
bool ConfigImpl::parse(const char *fn,bool update)
{
int retval;
- encoding = "UTF-8";
+ g_encoding = "UTF-8";
printlex(yy_flex_debug, TRUE, __FILE__, fn);
- retval = parseString(fn,configFileToString(fn), update);
+ retval = parseString(fn,configFileToString(fn), update);
printlex(yy_flex_debug, FALSE, __FILE__, fn);
return retval;
}
//----------------------------------------------------------------------
-static void cleanUpPaths(QStrList &str)
+static void cleanUpPaths(StringVector &str)
{
- char *sfp = str.first();
- while (sfp)
+ for (size_t i=0;i<str.size();i++)
{
- char *p = sfp;
- if (p)
- {
- char c;
- while ((c=*p))
- {
- if (c=='\\') *p='/';
- p++;
- }
- }
- QCString path = sfp;
- if ((path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':')) ||
- path.at(path.length()-1)!='/'
- )
+ std::string path = str[i];
+ std::replace(path.begin(),path.end(),'\\','/');
+ if ((path[0]!='/' && (path.size()<=2 || path[1]!=':')) || path[path.size()-1]!='/')
{
- QFileInfo fi(path);
+ QFileInfo fi(path.c_str());
if (fi.exists() && fi.isDir())
{
- int i = str.at();
- QCString p = fi.absFilePath().utf8();
- if (p[p.length()-1]!='/') p+='/';
- str.remove();
- if (str.at()==i) // did not remove last item
- str.insert(i,p);
- else
- str.append(p);
+ path = fi.absFilePath().utf8().data();
+ if (path[path.size()-1]!='/') path+='/';
}
}
- sfp = str.next();
+ str[i]=path;
}
}
-static void checkFileName(QCString &s,const char *optionName)
+static bool checkFileName(const QCString &s,const char *optionName)
{
QCString val = s.stripWhiteSpace().lower();
if ((val=="yes" || val=="true" || val=="1" || val=="all") ||
(val=="no" || val=="false" || val=="0" || val=="none"))
{
err("file name expected for option %s, got %s instead. Ignoring...\n",optionName,s.data());
- s=""; // note the use of &s above: this will change the option value!
+ return false;
}
+ return true;
}
#include "config.h"
@@ -1315,12 +1436,11 @@ void Config::init()
ConfigImpl::instance()->init();
}
-static void checkList(QStrList &list,const char *name, bool equalRequired,bool valueRequired)
+static void checkList(const StringVector &list,const char *name, bool equalRequired,bool valueRequired)
{
- const char *s=list.first();
- while (s)
+ for (const auto &s: list)
{
- QCString item=s;
+ QCString item=s.c_str();
item=item.stripWhiteSpace();
int i=item.find('=');
if (i==-1 && equalRequired)
@@ -1343,7 +1463,6 @@ static void checkList(QStrList &list,const char *name, bool equalRequired,bool v
}
}
}
- s=list.next();
}
}
@@ -1351,17 +1470,18 @@ void Config::checkAndCorrect()
{
ConfigValues::instance().init();
- QCString &warnFormat = Config_getString(WARN_FORMAT);
+ //------------------------
+ // check WARN_FORMAT
+ QCString warnFormat = Config_getString(WARN_FORMAT);
if (warnFormat.stripWhiteSpace().isEmpty())
{
- warnFormat="$file:$line $text";
+ Config_updateString(WARN_FORMAT,"$file:$line $text");
}
else
{
if (warnFormat.find("$file")==-1)
{
warn_uncond("warning format does not contain a $file tag!\n");
-
}
if (warnFormat.find("$line")==-1)
{
@@ -1373,15 +1493,17 @@ void Config::checkAndCorrect()
}
}
- QCString &manExtension = Config_getString(MAN_EXTENSION);
-
+ //------------------------
// set default man page extension if non is given by the user
+ QCString manExtension = Config_getString(MAN_EXTENSION);
if (manExtension.isEmpty())
{
- manExtension=".3";
+ Config_updateString(MAN_EXTENSION,".3");
}
- QCString &paperType = Config_getEnum(PAPER_TYPE);
+ //------------------------
+ // check and correct PAPER_TYPE
+ QCString paperType = Config_getEnum(PAPER_TYPE);
paperType=paperType.lower().stripWhiteSpace();
if (paperType.isEmpty() || paperType=="a4wide")
{
@@ -1393,126 +1515,142 @@ void Config::checkAndCorrect()
err("Unknown page type specified\n");
paperType="a4";
}
+ Config_updateEnum(PAPER_TYPE,paperType);
- QCString &outputLanguage=Config_getEnum(OUTPUT_LANGUAGE);
+ //------------------------
+ // check & correct OUTPUT_LANGUAGE
+ QCString outputLanguage=Config_getEnum(OUTPUT_LANGUAGE);
outputLanguage=outputLanguage.stripWhiteSpace();
if (outputLanguage.isEmpty())
{
outputLanguage = "English";
}
+ Config_updateEnum(OUTPUT_LANGUAGE,outputLanguage);
- QCString &htmlFileExtension=Config_getString(HTML_FILE_EXTENSION);
+ //------------------------
+ // check & correct HTML_FILE_EXTENSION
+ QCString htmlFileExtension=Config_getString(HTML_FILE_EXTENSION);
htmlFileExtension=htmlFileExtension.stripWhiteSpace();
if (htmlFileExtension.isEmpty())
{
htmlFileExtension = ".html";
}
+ Config_updateString(HTML_FILE_EXTENSION,htmlFileExtension);
- // expand the relative stripFromPath values
- QStrList &stripFromPath = Config_getList(STRIP_FROM_PATH);
- char *sfp = stripFromPath.first();
- if (sfp==0) // by default use the current path
+ //------------------------
+ // check & correct STRIP_FROM_PATH
+ StringVector stripFromPath = Config_getList(STRIP_FROM_PATH);
+ if (stripFromPath.empty()) // by default use the current path
{
QString p = QDir::currentDirPath();
if (p.at(p.length()-1)!='/')
p.append('/');
- stripFromPath.append(p.utf8());
+ stripFromPath.push_back(p.utf8().data());
}
else
{
cleanUpPaths(stripFromPath);
}
+ Config_updateList(STRIP_FROM_PATH,stripFromPath);
- // expand the relative stripFromPath values
- QStrList &stripFromIncPath = Config_getList(STRIP_FROM_INC_PATH);
+ //------------------------
+ // check & correct STRIP_FROM_INC_PATH
+ StringVector stripFromIncPath = Config_getList(STRIP_FROM_INC_PATH);
cleanUpPaths(stripFromIncPath);
+ Config_updateList(STRIP_FROM_INC_PATH,stripFromIncPath);
+ //------------------------
// Test to see if HTML header is valid
- QCString &headerFile = Config_getString(HTML_HEADER);
+ QCString headerFile = Config_getString(HTML_HEADER);
if (!headerFile.isEmpty())
{
QFileInfo fi(headerFile);
if (!fi.exists())
{
config_term("tag HTML_HEADER: header file '%s' "
- "does not exist\n",headerFile.data());
+ "does not exist\n",headerFile.data());
}
}
+
+ //------------------------
// Test to see if HTML footer is valid
- QCString &footerFile = Config_getString(HTML_FOOTER);
+ QCString footerFile = Config_getString(HTML_FOOTER);
if (!footerFile.isEmpty())
{
QFileInfo fi(footerFile);
if (!fi.exists())
{
config_term("tag HTML_FOOTER: footer file '%s' "
- "does not exist\n",footerFile.data());
+ "does not exist\n",footerFile.data());
}
}
+ //------------------------
// Test to see if MathJax code file is valid
if (Config_getBool(USE_MATHJAX))
{
- QCString &MathJaxCodefile = Config_getString(MATHJAX_CODEFILE);
- if (!MathJaxCodefile.isEmpty())
+ QCString mathJaxCodefile = Config_getString(MATHJAX_CODEFILE);
+ if (!mathJaxCodefile.isEmpty())
{
- QFileInfo fi(MathJaxCodefile);
+ QFileInfo fi(mathJaxCodefile);
if (!fi.exists())
{
config_term("tag MATHJAX_CODEFILE file '%s' "
- "does not exist\n",MathJaxCodefile.data());
+ "does not exist\n",mathJaxCodefile.data());
}
}
- QCString &path = Config_getString(MATHJAX_RELPATH);
+ QCString path = Config_getString(MATHJAX_RELPATH);
if (!path.isEmpty() && path.at(path.length()-1)!='/')
{
path+="/";
}
-
+ Config_updateString(MATHJAX_RELPATH,path);
}
+ //------------------------
// Test to see if LaTeX header is valid
- QCString &latexHeaderFile = Config_getString(LATEX_HEADER);
+ QCString latexHeaderFile = Config_getString(LATEX_HEADER);
if (!latexHeaderFile.isEmpty())
{
QFileInfo fi(latexHeaderFile);
if (!fi.exists())
{
config_term("tag LATEX_HEADER: header file '%s' "
- "does not exist\n",latexHeaderFile.data());
+ "does not exist\n",latexHeaderFile.data());
}
}
+
+ //------------------------
// Test to see if LaTeX footer is valid
- QCString &latexFooterFile = Config_getString(LATEX_FOOTER);
+ QCString latexFooterFile = Config_getString(LATEX_FOOTER);
if (!latexFooterFile.isEmpty())
{
QFileInfo fi(latexFooterFile);
if (!fi.exists())
{
config_term("tag LATEX_FOOTER: footer file '%s' "
- "does not exist\n",latexFooterFile.data());
+ "does not exist\n",latexFooterFile.data());
}
}
+ //------------------------
// check include path
- QStrList &includePath = Config_getList(INCLUDE_PATH);
- char *s=includePath.first();
- while (s)
+ const StringVector &includePath = Config_getList(INCLUDE_PATH);
+ for (const auto &s : includePath)
{
- QFileInfo fi(s);
+ QFileInfo fi(s.c_str());
if (!fi.exists()) warn_uncond("tag INCLUDE_PATH: include path '%s' "
- "does not exist\n",s);
- s=includePath.next();
+ "does not exist\n",s.c_str());
}
+ //------------------------
// check PREDEFINED
if (Config_getBool(ENABLE_PREPROCESSING))
{
- QStrList &predefList = Config_getList(PREDEFINED);
- s=predefList.first();
- while (s)
+ const StringVector &predefList = Config_getList(PREDEFINED);
+ for (const auto &s : predefList)
{
- QCString predef=s;
+ QCString predef=s.c_str();
predef=predef.stripWhiteSpace();
int i_equals=predef.find('=');
int i_obrace=predef.find('(');
@@ -1520,82 +1658,93 @@ void Config::checkAndCorrect()
{
err("Illegal PREDEFINED format '%s', no define name specified\n",predef.data());
}
- s=predefList.next();
}
}
+ //------------------------
// check ALIASES
- QStrList &aliasList = Config_getList(ALIASES);
- s=aliasList.first();
- while (s)
+ const StringVector &aliasList = Config_getList(ALIASES);
+ for (const auto &s : aliasList)
{
QRegExp re1("[a-z_A-Z][a-z_A-Z0-9]*[ \t]*="); // alias without argument
QRegExp re2("[a-z_A-Z][a-z_A-Z0-9]*{[0-9]+}[ \t]*="); // alias with argument
- QCString alias=s;
+ QCString alias=s.c_str();
alias=alias.stripWhiteSpace();
if (alias.find(re1)!=0 && alias.find(re2)!=0)
{
err("Illegal ALIASES format '%s'. Use \"name=value\" or \"name{n}=value\", where n is the number of arguments\n",
- alias.data());
+ alias.data());
}
- s=aliasList.next();
}
+ //------------------------
// check EXTENSION_MAPPING
checkList(Config_getList(EXTENSION_MAPPING),"EXTENSION_MAPPING",TRUE,TRUE);
+ //------------------------
// check FILTER_PATTERNS
checkList(Config_getList(FILTER_PATTERNS),"FILTER_PATTERNS",TRUE,TRUE);
+ //------------------------
// check FILTER_SOURCE_PATTERNS
checkList(Config_getList(FILTER_SOURCE_PATTERNS),"FILTER_SOURCE_PATTERNS",FALSE,FALSE);
+ //------------------------
// check TAGFILES
checkList(Config_getList(TAGFILES),"TAGFILES",FALSE,TRUE);
+ //------------------------
// check EXTRA_SEARCH_MAPPINGS
if (Config_getBool(SEARCHENGINE) && Config_getBool(GENERATE_HTML))
{
checkList(Config_getList(EXTRA_SEARCH_MAPPINGS),"EXTRA_SEARCH_MAPPING",TRUE,TRUE);
}
- // check TCL_SUBST
- checkList(Config_getList(TCL_SUBST),"TCL_SUBST",TRUE,TRUE);
-
+ //------------------------
// check if GENERATE_TREEVIEW and GENERATE_HTMLHELP are both enabled
if (Config_getBool(GENERATE_TREEVIEW) && Config_getBool(GENERATE_HTMLHELP))
{
err("When enabling GENERATE_HTMLHELP the tree view (GENERATE_TREEVIEW) should be disabled. I'll do it for you.\n");
- Config_getBool(GENERATE_TREEVIEW)=FALSE;
+ Config_updateBool(GENERATE_TREEVIEW,FALSE);
}
+
+ //------------------------
+ // check if GENERATE_HTMLHELP and HTML_FILE_EXTENSION is not .html
+ if (Config_getString(HTML_FILE_EXTENSION)!=".html" && Config_getBool(GENERATE_HTMLHELP))
+ {
+ err("When enabling GENERATE_HTMLHELP the HTML_FILE_EXTENSION should be \".html\". I'll do it for you.\n");
+ Config_updateString(HTML_FILE_EXTENSION,".html");
+ }
+
+ //------------------------
+ // check if SEARCHENGINE and GENERATE_HTMLHELP are both enabled
if (Config_getBool(SEARCHENGINE) && Config_getBool(GENERATE_HTMLHELP))
{
err("When enabling GENERATE_HTMLHELP the search engine (SEARCHENGINE) should be disabled. I'll do it for you.\n");
- Config_getBool(SEARCHENGINE)=FALSE;
+ Config_updateBool(SEARCHENGINE,FALSE);
}
+ //------------------------
// check if SEPARATE_MEMBER_PAGES and INLINE_GROUPED_CLASSES are both enabled
if (Config_getBool(SEPARATE_MEMBER_PAGES) && Config_getBool(INLINE_GROUPED_CLASSES))
{
err("When enabling INLINE_GROUPED_CLASSES the SEPARATE_MEMBER_PAGES option should be disabled. I'll do it for you.\n");
- Config_getBool(SEPARATE_MEMBER_PAGES)=FALSE;
+ Config_updateBool(SEPARATE_MEMBER_PAGES,FALSE);
}
- // check dot image format
- QCString &dotImageFormat=Config_getEnum(DOT_IMAGE_FORMAT);
+ //------------------------
+ // check and correct DOT_IMAGE_FORMAT
+ QCString dotImageFormat=Config_getEnum(DOT_IMAGE_FORMAT);
dotImageFormat=dotImageFormat.stripWhiteSpace();
if (dotImageFormat.isEmpty())
{
dotImageFormat = "png";
}
- //else if (dotImageFormat!="gif" && dotImageFormat!="png" && dotImageFormat!="jpg")
- //{
- // err("Invalid value for DOT_IMAGE_FORMAT: '%s'. Using the default.\n",dotImageFormat.data());
- // dotImageFormat = "png";
- //}
+ Config_updateEnum(DOT_IMAGE_FORMAT,dotImageFormat);
+ //------------------------
// correct DOT_FONTNAME if needed
- QCString &dotFontName=Config_getString(DOT_FONTNAME);
+ QCString dotFontName=Config_getString(DOT_FONTNAME);
if (dotFontName=="FreeSans" || dotFontName=="FreeSans.ttf")
{
warn_uncond("doxygen no longer ships with the FreeSans font.\n"
@@ -1606,9 +1755,11 @@ void Config::checkAndCorrect()
{
dotFontName = "Helvetica";
}
+ Config_updateString(DOT_FONTNAME,dotFontName);
+ //------------------------
// clip dotFontSize against the maximum bounds
- int &dotFontSize = Config_getInt(DOT_FONTSIZE);
+ int dotFontSize = Config_getInt(DOT_FONTSIZE);
if (dotFontSize<4)
{
dotFontSize=4;
@@ -1617,20 +1768,24 @@ void Config::checkAndCorrect()
{
dotFontSize=24;
}
+ Config_updateInt(DOT_FONTSIZE,dotFontSize);
+ //------------------------
// clip number of threads
- int &dotNumThreads = Config_getInt(DOT_NUM_THREADS);
+ int dotNumThreads = Config_getInt(DOT_NUM_THREADS);
if (dotNumThreads>32)
{
dotNumThreads=32;
}
else if (dotNumThreads<=0)
{
- dotNumThreads=QMAX(2,QThread::idealThreadCount()+1);
+ dotNumThreads=QMAX(2,std::thread::hardware_concurrency()+1);
}
+ Config_updateInt(DOT_NUM_THREADS,dotNumThreads);
+ //------------------------
// check dot path
- QCString &dotPath = Config_getString(DOT_PATH);
+ QCString dotPath = Config_getString(DOT_PATH);
if (!dotPath.isEmpty())
{
QFileInfo fi(dotPath);
@@ -1643,12 +1798,12 @@ void Config::checkAndCorrect()
QFileInfo dp(dotPath+"/dot"+Portable::commandExtension());
if (!dp.exists() || !dp.isFile())
{
- warn_uncond("the dot tool could not be found at %s\n",dotPath.data());
- dotPath="";
+ warn_uncond("the dot tool could not be found at %s\n",dotPath.data());
+ dotPath="";
}
else
{
- dotPath=dp.dirPath(TRUE).utf8()+"/";
+ dotPath=dp.dirPath(TRUE).utf8()+"/";
}
}
#if defined(_WIN32) // convert slashes
@@ -1660,9 +1815,11 @@ void Config::checkAndCorrect()
{
dotPath="";
}
+ Config_updateString(DOT_PATH,dotPath);
+ //------------------------
// check plantuml path
- QCString &plantumlJarPath = Config_getString(PLANTUML_JAR_PATH);
+ QCString plantumlJarPath = Config_getString(PLANTUML_JAR_PATH);
if (!plantumlJarPath.isEmpty())
{
QFileInfo pu(plantumlJarPath);
@@ -1691,9 +1848,11 @@ void Config::checkAndCorrect()
plantumlJarPath="";
}
}
+ Config_updateString(PLANTUML_JAR_PATH,plantumlJarPath);
+ //------------------------
// check dia path
- QCString &diaPath = Config_getString(DIA_PATH);
+ QCString diaPath = Config_getString(DIA_PATH);
if (!diaPath.isEmpty())
{
QFileInfo dp(diaPath+"/dia"+Portable::commandExtension());
@@ -1715,52 +1874,52 @@ void Config::checkAndCorrect()
{
diaPath="";
}
+ Config_updateString(DIA_PATH,diaPath);
- // check input
- QStrList &inputSources=Config_getList(INPUT);
- if (inputSources.count()==0)
+ //------------------------
+ // check INPUT
+ StringVector inputSources=Config_getList(INPUT);
+ if (inputSources.empty())
{
// use current dir as the default
- inputSources.append(QDir::currentDirPath().utf8());
+ inputSources.push_back(QDir::currentDirPath().utf8().data());
}
else
{
- s=inputSources.first();
- while (s)
+ for (const auto &s : inputSources)
{
- QFileInfo fi(s);
+ QFileInfo fi(s.c_str());
if (!fi.exists())
{
- warn_uncond("tag INPUT: input source '%s' does not exist\n",s);
+ warn_uncond("tag INPUT: input source '%s' does not exist\n",s.c_str());
}
- s=inputSources.next();
}
}
+ Config_updateList(INPUT,inputSources);
+ //------------------------
// add default file patterns if needed
- QStrList &filePatternList = Config_getList(FILE_PATTERNS);
- if (filePatternList.isEmpty())
+ StringVector filePatternList = Config_getList(FILE_PATTERNS);
+ if (filePatternList.empty())
{
ConfigOption * opt = ConfigImpl::instance()->get("FILE_PATTERNS");
if (opt->kind()==ConfigOption::O_List)
{
- QStrList l = ((ConfigList*)opt)->getDefault();
- const char *p = l.first();
- while (p)
- {
- filePatternList.append(p);
- p = l.next();
- }
+ filePatternList = ((ConfigList*)opt)->getDefault();
}
}
+ Config_updateList(FILE_PATTERNS,filePatternList);
+ //------------------------
// add default pattern if needed
- QStrList &examplePatternList = Config_getList(EXAMPLE_PATTERNS);
- if (examplePatternList.isEmpty())
+ StringVector examplePatternList = Config_getList(EXAMPLE_PATTERNS);
+ if (examplePatternList.empty())
{
- examplePatternList.append("*");
+ examplePatternList.push_back("*");
+ Config_updateList(EXAMPLE_PATTERNS,examplePatternList);
}
+ //------------------------
// if no output format is enabled, warn the user
if (!Config_getBool(GENERATE_HTML) &&
!Config_getBool(GENERATE_LATEX) &&
@@ -1777,6 +1936,7 @@ void Config::checkAndCorrect()
warn_uncond("No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
}
+ //------------------------
// check HTMLHELP creation requirements
if (!Config_getBool(GENERATE_HTML) &&
Config_getBool(GENERATE_HTMLHELP))
@@ -1784,36 +1944,40 @@ void Config::checkAndCorrect()
warn_uncond("GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
}
+ //------------------------
// check QHP creation requirements
if (Config_getBool(GENERATE_QHP))
{
if (Config_getString(QHP_NAMESPACE).isEmpty())
{
err("GENERATE_QHP=YES requires QHP_NAMESPACE to be set. Using 'org.doxygen.doc' as default!.\n");
- Config_getString(QHP_NAMESPACE)="org.doxygen.doc";
+ Config_updateString(QHP_NAMESPACE,"org.doxygen.doc");
}
if (Config_getString(QHP_VIRTUAL_FOLDER).isEmpty())
{
err("GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set. Using 'doc' as default!\n");
- Config_getString(QHP_VIRTUAL_FOLDER)="doc";
+ Config_updateString(QHP_VIRTUAL_FOLDER,"doc");
}
}
+ //------------------------
if (Config_getBool(OPTIMIZE_OUTPUT_JAVA) && Config_getBool(INLINE_INFO))
{
// don't show inline info for Java output, since Java has no inline
// concept.
- Config_getBool(INLINE_INFO)=FALSE;
+ Config_updateBool(INLINE_INFO,FALSE);
}
- int &depth = Config_getInt(MAX_DOT_GRAPH_DEPTH);
+ //------------------------
+ int depth = Config_getInt(MAX_DOT_GRAPH_DEPTH);
if (depth==0)
{
- depth=1000;
+ Config_updateInt(MAX_DOT_GRAPH_DEPTH,1000);
}
- int &hue = Config_getInt(HTML_COLORSTYLE_HUE);
+ //------------------------
+ int hue = Config_getInt(HTML_COLORSTYLE_HUE);
if (hue<0)
{
hue=0;
@@ -1822,8 +1986,10 @@ void Config::checkAndCorrect()
{
hue=hue%360;
}
+ Config_updateInt(HTML_COLORSTYLE_HUE,hue);
- int &sat = Config_getInt(HTML_COLORSTYLE_SAT);
+ //------------------------
+ int sat = Config_getInt(HTML_COLORSTYLE_SAT);
if (sat<0)
{
sat=0;
@@ -1832,7 +1998,11 @@ void Config::checkAndCorrect()
{
sat=255;
}
- int &gamma = Config_getInt(HTML_COLORSTYLE_GAMMA);
+ Config_updateInt(HTML_COLORSTYLE_SAT,sat);
+
+
+ //------------------------
+ int gamma = Config_getInt(HTML_COLORSTYLE_GAMMA);
if (gamma<40)
{
gamma=40;
@@ -1841,32 +2011,30 @@ void Config::checkAndCorrect()
{
gamma=240;
}
+ Config_updateInt(HTML_COLORSTYLE_GAMMA,gamma);
+ //------------------------
QCString mathJaxFormat = Config_getEnum(MATHJAX_FORMAT);
if (!mathJaxFormat.isEmpty() && mathJaxFormat!="HTML-CSS" &&
mathJaxFormat!="NativeMML" && mathJaxFormat!="SVG")
{
err("Unsupported value for MATHJAX_FORMAT: Should be one of HTML-CSS, NativeMML, or SVG\n");
- Config_getEnum(MATHJAX_FORMAT)="HTML-CSS";
+ Config_updateEnum(MATHJAX_FORMAT,"HTML-CSS");
}
+ //------------------------
// add default words if needed
- QStrList &annotationFromBrief = Config_getList(ABBREVIATE_BRIEF);
- if (annotationFromBrief.isEmpty())
- {
- annotationFromBrief.append("The $name class");
- annotationFromBrief.append("The $name widget");
- annotationFromBrief.append("The $name file");
- annotationFromBrief.append("is");
- annotationFromBrief.append("provides");
- annotationFromBrief.append("specifies");
- annotationFromBrief.append("contains");
- annotationFromBrief.append("represents");
- annotationFromBrief.append("a");
- annotationFromBrief.append("an");
- annotationFromBrief.append("the");
+ const StringVector &annotationFromBrief = Config_getList(ABBREVIATE_BRIEF);
+ if (annotationFromBrief.empty())
+ {
+ Config_updateList(ABBREVIATE_BRIEF,
+ { "The $name class", "The $name widget",
+ "The $name file", "is", "provides", "specifies",
+ "contains", "represents", "a", "an", "the"
+ });
}
+ //------------------------
// some default settings for vhdl
if (Config_getBool(OPTIMIZE_OUTPUT_VHDL) &&
(Config_getBool(INLINE_INHERITED_MEMB) ||
@@ -1893,18 +2061,21 @@ void Config::checkAndCorrect()
warn_uncond("enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n"
- "%s%s%s%s%s%s",s1,s2,s3,s4,s5,s6
- );
+ "%s%s%s%s%s%s",s1,s2,s3,s4,s5,s6
+ );
- Config_getBool(INLINE_INHERITED_MEMB) = FALSE;
- Config_getBool(INHERIT_DOCS) = FALSE;
- Config_getBool(HIDE_SCOPE_NAMES) = TRUE;
- Config_getBool(EXTRACT_PRIVATE) = TRUE;
- Config_getBool(ENABLE_PREPROCESSING) = FALSE;
- Config_getBool(EXTRACT_PACKAGE) = TRUE;
+ Config_updateBool(INLINE_INHERITED_MEMB, FALSE);
+ Config_updateBool(INHERIT_DOCS, FALSE);
+ Config_updateBool(HIDE_SCOPE_NAMES, TRUE);
+ Config_updateBool(EXTRACT_PRIVATE, TRUE);
+ Config_updateBool(ENABLE_PREPROCESSING, FALSE);
+ Config_updateBool(EXTRACT_PACKAGE, TRUE);
}
- checkFileName(Config_getString(GENERATE_TAGFILE),"GENERATE_TAGFILE");
+ if (!checkFileName(Config_getString(GENERATE_TAGFILE),"GENERATE_TAGFILE"))
+ {
+ Config_updateString(GENERATE_TAGFILE,"");
+ }
#if 0 // TODO: this breaks test 25; SOURCEBROWSER = NO and SOURCE_TOOLTIPS = YES.
// So this and other regressions should be analysed and fixed before this can be enabled
@@ -1955,14 +2126,14 @@ void Config::postProcess(bool clearHeaderAndFooter, bool compare)
if (!compare)ConfigImpl::instance()->emptyValueToDefault();
ConfigImpl::instance()->convertStrToVal();
- // avoid bootstrapping issues when the config file already
+ // avoid bootstrapping issues when the g_config file already
// refers to the files that we are supposed to parse.
if (clearHeaderAndFooter)
{
- Config_getString(HTML_HEADER)="";
- Config_getString(HTML_FOOTER)="";
- Config_getString(LATEX_HEADER)="";
- Config_getString(LATEX_FOOTER)="";
+ Config_updateString(HTML_HEADER ,"");
+ Config_updateString(HTML_FOOTER ,"");
+ Config_updateString(LATEX_HEADER,"");
+ Config_updateString(LATEX_FOOTER,"");
}
}
@@ -1971,4 +2142,6 @@ void Config::deinit()
ConfigImpl::instance()->deleteInstance();
}
+#if USE_STATE2STRING
#include "configimpl.l.h"
+#endif
diff --git a/src/constexp.l b/src/constexp.l
index eae8a3b..0f053bd 100644
--- a/src/constexp.l
+++ b/src/constexp.l
@@ -20,6 +20,9 @@
%option nounput
%option reentrant bison-bridge
%option extra-type="struct constexpYY_state *"
+%top{
+#include <stdint.h>
+}
%{
@@ -32,8 +35,13 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
+#define USE_STATE2STRING 0
+
+#if USE_STATE2STRING
static const char *stateToString(int state);
-static int yyread(char *buf,int max_size,yyscan_t yyscanner);
+#endif
+
+static yy_size_t yyread(char *buf,yy_size_t max_size,yyscan_t yyscanner);
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size,yyscanner);
@@ -93,10 +101,10 @@ CONSTSUFFIX ([uU][lL]?[lL]?)|([lL][lL]?[uU]?)
%%
-static int yyread(char *buf,int max_size,yyscan_t yyscanner)
+static yy_size_t yyread(char *buf,yy_size_t max_size,yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- int c=0;
+ yy_size_t c=0;
while( c < max_size && yyextra->inputString[yyextra->inputPosition] )
{
*buf = yyextra->inputString[yyextra->inputPosition++] ;
@@ -129,7 +137,7 @@ bool ConstExpressionParser::parse(const char *fileName,int lineNr,const QCString
struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
#ifdef FLEX_DEBUG
- yyset_debug(1,yyscanner);
+ constexpYYset_debug(1,p->yyscanner);
#endif
yyextra->constExpFileName = fileName;
@@ -153,4 +161,7 @@ bool ConstExpressionParser::parse(const char *fileName,int lineNr,const QCString
extern "C" {
int constexpYYwrap(yyscan_t yyscanner) { return 1; }
}
+
+#if USE_STATE2STRING
#include "constexp.l.h"
+#endif
diff --git a/src/constexp.y b/src/constexp.y
index 100614a..c4110f9 100644
--- a/src/constexp.y
+++ b/src/constexp.y
@@ -29,7 +29,7 @@ int constexpYYerror(yyscan_t yyscanner, const char *s)
{
struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner);
warn(yyextra->constExpFileName, yyextra->constExpLineNr,
- "preprocessing issue while doing constant expression evaluation: %s",s);
+ "preprocessing issue while doing constant expression evaluation: %s: input='%s'",s,yyextra->inputString);
return 0;
}
diff --git a/src/containers.h b/src/containers.h
new file mode 100644
index 0000000..770f92d
--- /dev/null
+++ b/src/containers.h
@@ -0,0 +1,36 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef CONTAINERS_H
+#define CONTAINERS_H
+
+#include <vector>
+#include <string>
+#include <set>
+#include <map>
+#include <unordered_set>
+#include <unordered_map>
+#include <stack>
+
+using StringUnorderedMap = std::unordered_map<std::string,std::string>;
+using StringUnorderedSet = std::unordered_set<std::string>;
+using StringSet = std::set<std::string>;
+using StringVector = std::vector<std::string>;
+using BoolStack = std::stack<bool>;
+using BoolVector = std::vector<bool>;
+using IntMap = std::map<std::string,int>;
+using IntVector = std::vector<int>;
+
+#endif
diff --git a/src/context.cpp b/src/context.cpp
index 5ee89cd..7f3a33e 100644
--- a/src/context.cpp
+++ b/src/context.cpp
@@ -180,14 +180,14 @@ class GenericNodeListContext : public TemplateListIntf
}
// TemplateListIntf methods
- int count() const
+ uint count() const
{
- return (int)m_children.count();
+ return m_children.count();
}
- TemplateVariant at(int index) const
+ TemplateVariant at(uint index) const
{
TemplateVariant result;
- if (index>=0 && index<count())
+ if (index<count())
{
result = *m_children.at(index);
}
@@ -298,18 +298,16 @@ class ConfigContext::Private
public:
Private() { m_cachedLists.setAutoDelete(TRUE); }
virtual ~Private() { }
- TemplateVariant fetchList(const QCString &name,const QStrList *list)
+ TemplateVariant fetchList(const QCString &name,const StringVector &list)
{
TemplateVariant *v = m_cachedLists.find(name);
if (v==0)
{
TemplateList *tlist = TemplateList::alloc();
m_cachedLists.insert(name,new TemplateVariant(tlist));
- QStrListIterator li(*list);
- char *s;
- for (li.toFirst();(s=li.current());++li)
+ for (const auto &s : list)
{
- tlist->append(s);
+ tlist->append(s.c_str());
}
return tlist;
}
@@ -345,23 +343,23 @@ TemplateVariant ConfigContext::get(const char *name) const
{
case ConfigValues::Info::Bool:
{
- bool b = ConfigValues::instance().*((ConfigValues::InfoBool*)option)->item;
+ bool b = ConfigValues::instance().*(option->value.b);
return TemplateVariant(b);
}
case ConfigValues::Info::Int:
{
- int i = ConfigValues::instance().*((ConfigValues::InfoInt*)option)->item;
+ int i = ConfigValues::instance().*(option->value.i);
return TemplateVariant(i);
}
case ConfigValues::Info::String:
{
- QCString s = ConfigValues::instance().*((ConfigValues::InfoString*)option)->item;
+ QCString s = ConfigValues::instance().*(option->value.s);
return TemplateVariant(s);
}
case ConfigValues::Info::List:
{
- const QStrList &l = ConfigValues::instance().*((ConfigValues::InfoList*)option)->item;
- return p->fetchList(name,&l);
+ const StringVector &l = ConfigValues::instance().*(option->value.l);
+ return p->fetchList(name,l);
}
default:
break;
@@ -380,7 +378,7 @@ class DoxygenContext::Private
public:
TemplateVariant version() const
{
- return getVersion();
+ return getDoxygenVersion();
}
TemplateVariant date() const
{
@@ -445,147 +443,147 @@ class TranslateContext::Private
{
public:
- TemplateVariant handleGeneratedAt(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleGeneratedAt(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==2)
+ if (args.size()==2)
{
return theTranslator->trGeneratedAt(args[0].toString(),args[1].toString());
}
else
{
- err("tr.generateAt should take two arguments, got %d!\n",args.count());
+ err("tr.generateAt should take two arguments, got %zu!\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleInheritanceDiagramFor(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleInheritanceDiagramFor(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trClassDiagram(args[0].toString());
}
else
{
- err("tr.inheritanceDiagramFor should take one argument, got %d!\n",args.count());
+ err("tr.inheritanceDiagramFor should take one argument, got %zu!\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleCollaborationDiagramFor(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleCollaborationDiagramFor(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trCollaborationDiagram(args[0].toString());
}
else
{
- err("tr.collaborationDiagramFor should take one argument, got %d!\n",args.count());
+ err("tr.collaborationDiagramFor should take one argument, got %zu!\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleDirDependencyGraphFor(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleDirDependencyGraphFor(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trDirDepGraph(args[0].toString());
}
else
{
- err("tr.dirDependencyGraphFor should take one argument, got %d!\n",args.count());
+ err("tr.dirDependencyGraphFor should take one argument, got %zu!\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleInheritsList(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleInheritsList(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trInheritsList(args[0].toInt());
}
else
{
- err("tr.inheritsList should take one integer argument, got %d!\n",args.count());
+ err("tr.inheritsList should take one integer argument, got %zu!\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleInheritedByList(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleInheritedByList(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trInheritedByList(args[0].toInt());
}
else
{
- err("tr.inheritedByList should take one integer argument, got %d!\n",args.count());
+ err("tr.inheritedByList should take one integer argument, got %zu!\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleWriteList(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleWriteList(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trWriteList(args[0].toInt());
}
else
{
- err("tr.*List should take one integer argument, got %d!\n",args.count());
+ err("tr.*List should take one integer argument, got %zu!\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleImplementedBy(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleImplementedBy(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trImplementedInList(args[0].toInt());
}
else
{
- err("tr.implementedBy should take one integer argument, got %d!\n",args.count());
+ err("tr.implementedBy should take one integer argument, got %zu!\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleReimplementedBy(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleReimplementedBy(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trReimplementedInList(args[0].toInt());
}
else
{
- err("tr.reimplementedBy should take one integer argument, got %d!\n",args.count());
+ err("tr.reimplementedBy should take one integer argument, got %zu!\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleSourceRefs(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleSourceRefs(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trReferences()+" "+theTranslator->trWriteList(args[0].toInt())+".";
}
else
{
- err("tr.sourceRefs should take one integer argument, got %d\n",args.count());
+ err("tr.sourceRefs should take one integer argument, got %zu\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleSourceRefBys(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleSourceRefBys(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trReferencedBy()+" "+theTranslator->trWriteList(args[0].toInt())+".";
}
else
{
- err("tr.sourceRefBys should take one integer argument, got %d\n",args.count());
+ err("tr.sourceRefBys should take one integer argument, got %zu\n",args.size());
}
return TemplateVariant();
}
- TemplateVariant handleIncludeDependencyGraph(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleIncludeDependencyGraph(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return theTranslator->trInclDepGraph(args[0].toString());
}
else
{
- err("tr.includeDependencyGraph should take one string argument, got %d\n",args.count());
+ err("tr.includeDependencyGraph should take one string argument, got %zu\n",args.size());
}
return TemplateVariant();
}
@@ -1073,7 +1071,7 @@ class TranslateContext::Private
s_inst.addProperty("namespaceList", &Private::namespaceList);
//%% string namespaceMembers
s_inst.addProperty("namespaceMembers", &Private::namespaceMembers);
- //%% srting fileList
+ //%% string fileList
s_inst.addProperty("fileList", &Private::fileList);
//%% string fileMembers
s_inst.addProperty("fileMembers", &Private::fileMembers);
@@ -1264,7 +1262,8 @@ static TemplateVariant parseDoc(const Definition *def,const QCString &file,int l
const QCString &relPath,const QCString &docStr,bool isBrief)
{
TemplateVariant result;
- DocRoot *root = validatingParseDoc(file,line,def,0,docStr,TRUE,FALSE,0,isBrief,FALSE);
+ DocRoot *root = validatingParseDoc(file,line,def,0,docStr,TRUE,FALSE,
+ 0,isBrief,FALSE,Config_getBool(MARKDOWN_SUPPORT));
QGString docs;
{
FTextStream ts(&docs);
@@ -1302,8 +1301,8 @@ static TemplateVariant parseDoc(const Definition *def,const QCString &file,int l
static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const QCString &relPath,
const QCString &code,int startLine=-1,int endLine=-1,bool showLineNumbers=FALSE)
{
- CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(md->getDefFileExtension());
- intf.resetCodeParserState();
+ auto intf = Doxygen::parserManager->getCodeParser(md->getDefFileExtension());
+ intf->resetCodeParserState();
QGString s;
FTextStream t(&s);
switch (g_globals.outputFormat)
@@ -1311,14 +1310,14 @@ static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const Q
case ContextOutputFormat_Html:
{
HtmlCodeGenerator codeGen(t,relPath);
- intf.parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
+ intf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
startLine,endLine,TRUE,md,showLineNumbers,md);
}
break;
case ContextOutputFormat_Latex:
{
LatexCodeGenerator codeGen(t,relPath,md->docFile());
- intf.parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
+ intf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
startLine,endLine,TRUE,md,showLineNumbers,md);
}
break;
@@ -1333,8 +1332,8 @@ static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const Q
static TemplateVariant parseCode(const FileDef *fd,const QCString &relPath)
{
static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
- CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
- intf.resetCodeParserState();
+ auto intf = Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
+ intf->resetCodeParserState();
QGString s;
FTextStream t(&s);
switch (g_globals.outputFormat)
@@ -1342,7 +1341,7 @@ static TemplateVariant parseCode(const FileDef *fd,const QCString &relPath)
case ContextOutputFormat_Html:
{
HtmlCodeGenerator codeGen(t,relPath);
- intf.parseCode(codeGen,0,
+ intf->parseCode(codeGen,0,
fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
fd->getLanguage(), // lang
FALSE, // isExampleBlock
@@ -1361,7 +1360,7 @@ static TemplateVariant parseCode(const FileDef *fd,const QCString &relPath)
case ContextOutputFormat_Latex:
{
LatexCodeGenerator codeGen(t,relPath,fd->docFile());
- intf.parseCode(codeGen,0,
+ intf->parseCode(codeGen,0,
fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
fd->getLanguage(), // lang
FALSE, // isExampleBlock
@@ -1397,6 +1396,7 @@ class DefinitionContext
{
assert(d!=0);
}
+ virtual ~DefinitionContext() {}
void addBaseProperties(PropertyMapper<T> &inst)
{
//%% string name: the name of the symbol
@@ -1544,7 +1544,6 @@ class DefinitionContext
case SrcLangExt_VHDL: result="vhdl"; break;
case SrcLangExt_XML: result="xml"; break;
case SrcLangExt_SQL: result="sql"; break;
- case SrcLangExt_Tcl: result="tcl"; break;
case SrcLangExt_Markdown: result="markdown"; break;
case SrcLangExt_Slice: result="slice"; break;
}
@@ -1555,16 +1554,14 @@ class DefinitionContext
QCString result = "unspecified";
switch (m_def->definitionType())
{
- case DefinitionIntf::TypeClass: result="class"; break;
- case DefinitionIntf::TypeFile: result="file"; break;
- case DefinitionIntf::TypeNamespace: result="namespace"; break;
- case DefinitionIntf::TypeGroup: result="module"; break;
- case DefinitionIntf::TypePackage: result="package"; break;
- case DefinitionIntf::TypePage: result="page"; break;
- case DefinitionIntf::TypeDir: result="dir"; break;
- case DefinitionIntf::TypeMember: // fall through
- case DefinitionIntf::TypeSymbolList:
- break;
+ case Definition::TypeClass: result="class"; break;
+ case Definition::TypeFile: result="file"; break;
+ case Definition::TypeNamespace: result="namespace"; break;
+ case Definition::TypeGroup: result="module"; break;
+ case Definition::TypePackage: result="package"; break;
+ case Definition::TypePage: result="page"; break;
+ case Definition::TypeDir: result="dir"; break;
+ case Definition::TypeMember: break;
}
return result;
}
@@ -1588,9 +1585,9 @@ class DefinitionContext
{
fillPath(outerScope,list);
}
- else if (type==Definition::TypeFile && (dynamic_cast<const FileDef*>(def))->getDirDef())
+ else if (type==Definition::TypeFile && (toFileDef(def))->getDirDef())
{
- fillPath((dynamic_cast<const FileDef*>(def))->getDirDef(),list);
+ fillPath((toFileDef(def))->getDirDef(),list);
}
list->append(NavPathElemContext::alloc(def));
}
@@ -1604,9 +1601,9 @@ class DefinitionContext
{
fillPath(m_def->getOuterScope(),list);
}
- else if (m_def->definitionType()==Definition::TypeFile && (dynamic_cast<const FileDef *>(m_def))->getDirDef())
+ else if (m_def->definitionType()==Definition::TypeFile && (toFileDef(m_def))->getDirDef())
{
- fillPath((dynamic_cast<const FileDef *>(m_def))->getDirDef(),list);
+ fillPath((toFileDef(m_def))->getDirDef(),list);
}
cache.navPath.reset(list);
}
@@ -1673,7 +1670,6 @@ class DefinitionContext
SharedPtr<TemplateStruct> lineLink;
};
-
private:
Cachable &getCache() const
{
@@ -1681,7 +1677,7 @@ class DefinitionContext
assert(c!=0);
return *c;
}
- const Definition *m_def;
+ const Definition *m_def;
};
//%% }
@@ -1775,10 +1771,7 @@ class IncludeInfoListContext::Private : public GenericNodeListContext
IncludeInfo *ii;
for (li.toFirst();(ii=li.current());++li)
{
- if (!ii->indirect)
- {
- append(IncludeInfoContext::alloc(ii,lang));
- }
+ append(IncludeInfoContext::alloc(ii,lang));
}
}
};
@@ -1794,12 +1787,12 @@ IncludeInfoListContext::~IncludeInfoListContext()
}
// TemplateListIntf
-int IncludeInfoListContext::count() const
+uint IncludeInfoListContext::count() const
{
return p->count();
}
-TemplateVariant IncludeInfoListContext::at(int index) const
+TemplateVariant IncludeInfoListContext::at(uint index) const
{
return p->at(index);
}
@@ -2007,7 +2000,6 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
case ContextOutputFormat_Html:
{
- QGString result;
FTextStream tt(&result);
QCString name = convertToHtml(m_classDef->displayName());
@@ -2136,7 +2128,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
return cache.inheritedByList.get();
}
TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
- MemberListType type,const char *title,bool detailed=FALSE) const
+ MemberListType type,const char *title,bool=FALSE) const
{
if (!list)
{
@@ -2325,16 +2317,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
if (!cache.classes)
{
TemplateList *classList = TemplateList::alloc();
- if (m_classDef->getClassSDict())
+ for (const auto &cd : m_classDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (cd->visibleInParentsDeclList())
{
- if (cd->visibleInParentsDeclList())
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.classes.reset(classList);
@@ -2347,20 +2334,15 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
if (!cache.innerClasses)
{
TemplateList *classList = TemplateList::alloc();
- if (m_classDef->getClassSDict())
+ for (const auto &cd : m_classDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ cd->partOfGroups().empty()
+ )
{
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- cd->partOfGroups()==0
- )
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.innerClasses.reset(classList);
@@ -2380,7 +2362,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
addTemplateDecls(parent,tl);
}
- const ClassDef *cd=dynamic_cast<const ClassDef *>(d);
+ const ClassDef *cd=toClassDef(d);
if (!cd->templateArguments().empty())
{
ArgumentListContext *al = ArgumentListContext::alloc(cd->templateArguments(),cd,relPathAsString());
@@ -2394,15 +2376,13 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
if (m_classDef->hasExamples())
{
- ExampleSDict::Iterator it(*m_classDef->exampleList());
- Example *ex;
- for (it.toFirst();(ex=it.current());++it)
+ for (const auto &ex : m_classDef->getExamples())
{
TemplateStruct *s = TemplateStruct::alloc();
- s->set("text",ex->name);
+ s->set("text",ex.name);
s->set("isLinkable",TRUE);
- s->set("anchor",ex->anchor);
- s->set("fileName",ex->file);
+ s->set("anchor",ex.anchor);
+ s->set("fileName",ex.file);
s->set("isReference",FALSE);
s->set("externalReference","");
list->append(s);
@@ -2504,15 +2484,8 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
Cachable &cache = getCache();
if (!cache.allMembersList)
{
- if (m_classDef->memberNameInfoSDict())
- {
- AllMembersListContext *ml = AllMembersListContext::alloc(m_classDef->memberNameInfoSDict());
- cache.allMembersList.reset(ml);
- }
- else
- {
- cache.allMembersList.reset(AllMembersListContext::alloc());
- }
+ AllMembersListContext *ml = AllMembersListContext::alloc(m_classDef->memberNameInfoLinkedMap());
+ cache.allMembersList.reset(ml);
}
return cache.allMembersList.get();
}
@@ -2525,9 +2498,9 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
Cachable &cache = getCache();
if (!cache.memberGroups)
{
- if (m_classDef->getMemberGroupSDict())
+ if (!m_classDef->getMemberGroups().empty())
{
- cache.memberGroups.reset(MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
+ cache.memberGroups.reset(MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroups(),m_classDef->subGrouping()));
}
else
{
@@ -2767,22 +2740,17 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
{
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
TemplateList *classList = TemplateList::alloc();
- if (m_namespaceDef->getClassSDict())
+ for (const auto &cd : m_namespaceDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (sliceOpt && (cd->compoundType()==ClassDef::Struct ||
+ cd->compoundType()==ClassDef::Interface ||
+ cd->compoundType()==ClassDef::Exception))
{
- if (sliceOpt && (cd->compoundType()==ClassDef::Struct ||
- cd->compoundType()==ClassDef::Interface ||
- cd->compoundType()==ClassDef::Exception))
- {
- continue; // These types appear in their own sections.
- }
- if (cd->visibleInParentsDeclList())
- {
- classList->append(ClassContext::alloc(cd));
- }
+ continue; // These types appear in their own sections.
+ }
+ if (cd->visibleInParentsDeclList())
+ {
+ classList->append(ClassContext::alloc(cd));
}
}
cache.classes.reset(classList);
@@ -2795,16 +2763,11 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
if (!cache.namespaces)
{
TemplateList *namespaceList = TemplateList::alloc();
- if (m_namespaceDef->getNamespaceSDict())
+ for (const auto &nd : m_namespaceDef->getNamespaces())
{
- NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict());
- const NamespaceDef *nd;
- for (sdi.toFirst();(nd=sdi.current());++sdi)
+ if (nd->isLinkable() && !nd->isConstantGroup())
{
- if (nd->isLinkable() && !nd->isConstantGroup())
- {
- namespaceList->append(NamespaceContext::alloc(nd));
- }
+ namespaceList->append(NamespaceContext::alloc(nd));
}
}
cache.namespaces.reset(namespaceList);
@@ -2817,16 +2780,11 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
if (!cache.constantgroups)
{
TemplateList *namespaceList = TemplateList::alloc();
- if (m_namespaceDef->getNamespaceSDict())
+ for (const auto &nd : m_namespaceDef->getNamespaces())
{
- NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict());
- const NamespaceDef *nd;
- for (sdi.toFirst();(nd=sdi.current());++sdi)
+ if (nd->isLinkable() && nd->isConstantGroup())
{
- if (nd->isLinkable() && nd->isConstantGroup())
- {
- namespaceList->append(NamespaceContext::alloc(nd));
- }
+ namespaceList->append(NamespaceContext::alloc(nd));
}
}
cache.constantgroups.reset(namespaceList);
@@ -2834,7 +2792,7 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
return cache.constantgroups.get();
}
TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
- MemberListType type,const char *title,bool detailed=FALSE) const
+ MemberListType type,const char *title,bool=FALSE) const
{
if (!list)
{
@@ -2888,9 +2846,9 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
Cachable &cache = getCache();
if (!cache.memberGroups)
{
- if (m_namespaceDef->getMemberGroupSDict())
+ if (!m_namespaceDef->getMemberGroups().empty())
{
- cache.memberGroups.reset(MemberGroupListContext::alloc(m_namespaceDef,relPathAsString(),m_namespaceDef->getMemberGroupSDict(),m_namespaceDef->subGrouping()));
+ cache.memberGroups.reset(MemberGroupListContext::alloc(m_namespaceDef,relPathAsString(),m_namespaceDef->getMemberGroups(),m_namespaceDef->subGrouping()));
}
else
{
@@ -2935,19 +2893,14 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
if (!cache.inlineClasses)
{
TemplateList *classList = TemplateList::alloc();
- if (m_namespaceDef->getClassSDict())
+ for (const auto &cd : m_namespaceDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ cd->partOfGroups().empty())
{
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- cd->partOfGroups()==0)
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.inlineClasses.reset(classList);
@@ -3232,16 +3185,11 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
if (!cache.classes)
{
TemplateList *classList = TemplateList::alloc();
- if (m_fileDef->getClassSDict())
+ for (const auto &cd : m_fileDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (cd->visibleInParentsDeclList())
{
- if (cd->visibleInParentsDeclList())
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.classes.reset(classList);
@@ -3254,16 +3202,11 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
if (!cache.namespaces)
{
TemplateList *namespaceList = TemplateList::alloc();
- if (m_fileDef->getNamespaceSDict())
+ for (const auto &nd : m_fileDef->getNamespaces())
{
- NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
- const NamespaceDef *nd;
- for (sdi.toFirst();(nd=sdi.current());++sdi)
+ if (nd->isLinkable() && !nd->isConstantGroup())
{
- if (nd->isLinkable() && !nd->isConstantGroup())
- {
- namespaceList->append(NamespaceContext::alloc(nd));
- }
+ namespaceList->append(NamespaceContext::alloc(nd));
}
}
cache.namespaces.reset(namespaceList);
@@ -3276,16 +3219,11 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
if (!cache.constantgroups)
{
TemplateList *namespaceList = TemplateList::alloc();
- if (m_fileDef->getNamespaceSDict())
+ for (const auto &nd : m_fileDef->getNamespaces())
{
- NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
- NamespaceDef *nd;
- for (sdi.toFirst();(nd=sdi.current());++sdi)
+ if (nd->isLinkable() && nd->isConstantGroup())
{
- if (nd->isLinkable() && nd->isConstantGroup())
- {
- namespaceList->append(NamespaceContext::alloc(nd));
- }
+ namespaceList->append(NamespaceContext::alloc(nd));
}
}
cache.constantgroups.reset(namespaceList);
@@ -3293,7 +3231,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
return cache.constantgroups.get();
}
TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
- MemberListType type,const char *title,bool detailed=FALSE) const
+ MemberListType type,const char *title,bool=FALSE) const
{
if (!list)
{
@@ -3351,9 +3289,9 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
Cachable &cache = getCache();
if (!cache.memberGroups)
{
- if (m_fileDef->getMemberGroupSDict())
+ if (!m_fileDef->getMemberGroups().empty())
{
- cache.memberGroups.reset(MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroupSDict(),m_fileDef->subGrouping()));
+ cache.memberGroups.reset(MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroups(),m_fileDef->subGrouping()));
}
else
{
@@ -3399,19 +3337,14 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
if (!cache.inlineClasses)
{
TemplateList *classList = TemplateList::alloc();
- if (m_fileDef->getClassSDict())
+ for (const auto &cd : m_fileDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ cd->partOfGroups().empty())
{
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- cd->partOfGroups()==0)
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.inlineClasses.reset(classList);
@@ -3533,10 +3466,7 @@ class DirContext::Private : public DefinitionContext<DirContext::Private>
if (!cache.dirs)
{
cache.dirs.reset(TemplateList::alloc());
- const DirList &subDirs = m_dirDef->subDirs();
- QListIterator<DirDef> it(subDirs);
- const DirDef *dd;
- for (it.toFirst();(dd=it.current());++it)
+ for(const auto dd : m_dirDef->subDirs())
{
DirContext *dc = new DirContext(dd);
cache.dirs->append(dc);
@@ -3820,6 +3750,7 @@ class TextGeneratorHtml : public TextGeneratorIntf
: m_ts(ts), m_relPath(relPath) {}
void writeString(const char *s,bool keepSpaces) const
{
+ static const char *hex="0123456789ABCDEF";
if (s==0) return;
if (keepSpaces)
{
@@ -3835,6 +3766,19 @@ class TextGeneratorHtml : public TextGeneratorIntf
case '"': m_ts << "&quot;"; break;
case '&': m_ts << "&amp;"; break;
case ' ': m_ts << "&#160;"; break;
+ default:
+ {
+ uchar uc = static_cast<uchar>(c);
+ if (uc<32 && !isspace(c)) // non-printable control characters
+ {
+ m_ts << "&#x24" << hex[uc>>4] << hex[uc&0xF] << ";";
+ }
+ else
+ {
+ m_ts << c;
+ }
+ }
+ break;
}
}
}
@@ -3911,13 +3855,25 @@ class TextGeneratorLatex : public TextGeneratorIntf
if (f && anchor) m_ts << "_";
if (anchor) m_ts << anchor;
m_ts << "}{";
- filterLatexString(m_ts,text);
+ filterLatexString(m_ts,text,
+ false, // insideTabbing
+ false, // insidePre
+ false, // insideItem
+ false, // insideTable
+ false // keepSpaces
+ );
m_ts << "}}";
}
else
{
m_ts << "\\textbf{ ";
- filterLatexString(m_ts,text);
+ filterLatexString(m_ts,text,
+ false, // insideTabbing
+ false, // insidePre
+ false, // insideItem
+ false, // insideTable
+ false // keepSpaces
+ );
m_ts << "}";
}
}
@@ -3977,7 +3933,7 @@ TemplateVariant createLinkedText(const Definition *def,const QCString &relPath,c
class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
public:
- Private(MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md)
+ Private(const MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md)
{
static bool init=FALSE;
if (!init)
@@ -4106,7 +4062,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
s_inst.addProperty("nameWithContextFor", &Private::nameWithContextFor);
init=TRUE;
}
- if (!md->cookie()) { md->setCookie(new MemberContext::Private::Cachable(md)); }
+ if (md && !md->cookie()) { md->setCookie(new MemberContext::Private::Cachable(md)); }
Cachable &cache = getCache();
cache.propertyAttrs.reset(TemplateList::alloc());
@@ -4438,8 +4394,9 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
scopeName = m_memberDef->getNamespaceDef()->name();
}
- cache.initializer = parseCode(m_memberDef,scopeName,relPathAsString(),
- m_memberDef->initializer());
+ cache.initializer = parseCode(const_cast<MemberDef*>(m_memberDef),
+ scopeName,relPathAsString(),
+ m_memberDef->initializer());
cache.initializerParsed = TRUE;
}
return cache.initializer;
@@ -4671,27 +4628,27 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
}
TemplateVariant hasConstQualifier() const
{
- return getDefArgList().constSpecifier;
+ return getDefArgList().constSpecifier();
}
TemplateVariant hasVolatileQualifier() const
{
- return getDefArgList().volatileSpecifier;
+ return getDefArgList().volatileSpecifier();
}
TemplateVariant hasRefQualifierLValue() const
{
- return getDefArgList().refQualifier==RefQualifierLValue;
+ return getDefArgList().refQualifier()==RefQualifierLValue;
}
TemplateVariant hasRefQualifierRValue() const
{
- return getDefArgList().refQualifier==RefQualifierRValue;
+ return getDefArgList().refQualifier()==RefQualifierRValue;
}
TemplateVariant trailingReturnType() const
{
const ArgumentList &al = getDefArgList();
- if (!al.trailingReturnType.isEmpty())
+ if (!al.trailingReturnType().isEmpty())
{
return createLinkedText(m_memberDef,relPathAsString(),
- al.trailingReturnType);
+ al.trailingReturnType());
}
else
{
@@ -4776,12 +4733,13 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
if (m_memberDef->argumentList().hasDocumentation())
{
QCString paramDocs;
- for (Argument &a : m_memberDef->argumentList())
+ for (const Argument &a : m_memberDef->argumentList())
{
if (a.hasDocumentation())
{
- QCString direction = extractDirection(a.docs);
- paramDocs+="@param"+direction+" "+a.name+" "+a.docs;
+ QCString docs = a.docs;
+ QCString direction = extractDirection(docs);
+ paramDocs+="@param"+direction+" "+a.name+" "+docs;
}
}
cache.paramDocs.reset(new TemplateVariant(parseDoc(m_memberDef,
@@ -4885,15 +4843,13 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (m_memberDef->hasExamples())
{
- ExampleSDict::Iterator it(*m_memberDef->getExamples());
- Example *ex;
- for (it.toFirst();(ex=it.current());++it)
+ for (const auto &ex : m_memberDef->getExamples())
{
TemplateStruct *s = TemplateStruct::alloc();
- s->set("text",ex->name);
+ s->set("text",ex.name);
s->set("isLinkable",TRUE);
- s->set("anchor",ex->anchor);
- s->set("fileName",ex->file);
+ s->set("anchor",ex.anchor);
+ s->set("fileName",ex.file);
s->set("isReference",FALSE);
s->set("externalReference","");
list->append(s);
@@ -4944,7 +4900,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
Cachable &cache = getCache();
if (!cache.sourceRefs)
{
- cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers(),TRUE));
+ cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers()));
}
return cache.sourceRefs.get();
}
@@ -4953,7 +4909,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
Cachable &cache = getCache();
if (!cache.sourceRefBys)
{
- cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers(),TRUE));
+ cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers()));
}
return cache.sourceRefBys.get();
}
@@ -4983,7 +4939,9 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
scopeName = m_memberDef->getNamespaceDef()->name();
}
- cache.sourceCode = parseCode(m_memberDef,scopeName,relPathAsString(),codeFragment,startLine,endLine,TRUE);
+ cache.sourceCode = parseCode(const_cast<MemberDef*>(m_memberDef),
+ scopeName,relPathAsString(),
+ codeFragment,startLine,endLine,TRUE);
cache.sourceCodeParsed = TRUE;
}
}
@@ -5137,15 +5095,15 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
return m_memberDef->typeString();
}
- TemplateVariant handleDetailsVisibleFor(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleDetailsVisibleFor(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
return m_memberDef->isDetailedSectionVisible(args[0].toString()=="module",args[0].toString()=="file");
}
else
{
- err(".detailsVisibleFor should take one string argument, got %d\n",args.count());
+ err(".detailsVisibleFor should take one string argument, got %zu\n",args.size());
}
return TemplateVariant();
}
@@ -5153,9 +5111,9 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
return TemplateVariant::Delegate::fromMethod<Private,&Private::handleDetailsVisibleFor>(this);
}
- TemplateVariant handleNameWithContextFor(const QValueList<TemplateVariant> &args) const
+ TemplateVariant handleNameWithContextFor(const std::vector<TemplateVariant> &args) const
{
- if (args.count()==1)
+ if (args.size()==1)
{
SrcLangExt lang = m_memberDef->getLanguage();
QCString n = m_memberDef->name();
@@ -5177,7 +5135,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
}
else
{
- err(".nameWithContextFor should take one string argument, got %d\n",args.count());
+ err(".nameWithContextFor should take one string argument, got %zu\n",args.size());
}
return TemplateVariant();
}
@@ -5186,10 +5144,10 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
return TemplateVariant::Delegate::fromMethod<Private,&Private::handleNameWithContextFor>(this);
}
private:
- MemberDef *m_memberDef;
+ const MemberDef *m_memberDef;
struct Cachable : public DefinitionContext<MemberContext::Private>::Cachable
{
- Cachable(MemberDef *md) : DefinitionContext<MemberContext::Private>::Cachable(md),
+ Cachable(const MemberDef *md) : DefinitionContext<MemberContext::Private>::Cachable(md),
initializerParsed(FALSE), sourceCodeParsed(FALSE),
declArgsParsed(FALSE), declTypeParsed(FALSE) { }
SharedPtr<ArgumentListContext> templateArgs;
@@ -5239,7 +5197,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
PropertyMapper<MemberContext::Private> MemberContext::Private::s_inst;
-MemberContext::MemberContext(MemberDef *md) : RefCountedContext("MemberContext")
+MemberContext::MemberContext(const MemberDef *md) : RefCountedContext("MemberContext")
{
p = new Private(md);
}
@@ -5404,16 +5362,11 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.modules)
{
TemplateList *moduleList = TemplateList::alloc();
- if (m_groupDef->getSubGroups())
+ for (const auto &gd : m_groupDef->getSubGroups())
{
- GroupListIterator gli(*m_groupDef->getSubGroups());
- const GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ if (gd->isVisible())
{
- if (gd->isVisible())
- {
- moduleList->append(ModuleContext::alloc(gd));
- }
+ moduleList->append(ModuleContext::alloc(gd));
}
}
cache.modules.reset(moduleList);
@@ -5426,14 +5379,9 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.examples)
{
TemplateList *exampleList = TemplateList::alloc();
- if (m_groupDef->getExamples())
+ for (const auto &ex : m_groupDef->getExamples())
{
- PageSDict::Iterator eli(*m_groupDef->getExamples());
- const PageDef *ex;
- for (eli.toFirst();(ex=eli.current());++eli)
- {
- exampleList->append(PageContext::alloc(ex,FALSE,TRUE));
- }
+ exampleList->append(PageContext::alloc(ex,FALSE,TRUE));
}
cache.examples.reset(exampleList);
}
@@ -5445,14 +5393,9 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.pages)
{
TemplateList *pageList = TemplateList::alloc();
- if (m_groupDef->getExamples())
+ for (const auto &ex : m_groupDef->getPages())
{
- PageSDict::Iterator eli(*m_groupDef->getPages());
- const PageDef *ex;
- for (eli.toFirst();(ex=eli.current());++eli)
- {
- pageList->append(PageContext::alloc(ex,FALSE,TRUE));
- }
+ pageList->append(PageContext::alloc(ex,FALSE,TRUE));
}
cache.pages.reset(pageList);
}
@@ -5464,14 +5407,9 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.dirs)
{
TemplateList *dirList = TemplateList::alloc();
- if (m_groupDef->getDirs())
+ for(const auto dd : m_groupDef->getDirs())
{
- QListIterator<DirDef> it(*m_groupDef->getDirs());
- const DirDef *dd;
- for (it.toFirst();(dd=it.current());++it)
- {
- dirList->append(DirContext::alloc(dd));
- }
+ dirList->append(DirContext::alloc(dd));
}
cache.dirs.reset(dirList);
}
@@ -5502,16 +5440,11 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.classes)
{
TemplateList *classList = TemplateList::alloc();
- if (m_groupDef->getClasses())
+ for (const auto &cd : m_groupDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_groupDef->getClasses());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (cd->visibleInParentsDeclList())
{
- if (cd->visibleInParentsDeclList())
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.classes.reset(classList);
@@ -5524,16 +5457,11 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.namespaces)
{
TemplateList *namespaceList = TemplateList::alloc();
- if (m_groupDef->getNamespaces())
+ for (const auto &nd : m_groupDef->getNamespaces())
{
- NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces());
- const NamespaceDef *nd;
- for (sdi.toFirst();(nd=sdi.current());++sdi)
+ if (nd->isLinkable() && !nd->isConstantGroup())
{
- if (nd->isLinkable() && !nd->isConstantGroup())
- {
- namespaceList->append(NamespaceContext::alloc(nd));
- }
+ namespaceList->append(NamespaceContext::alloc(nd));
}
}
cache.namespaces.reset(namespaceList);
@@ -5546,16 +5474,11 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.constantgroups)
{
TemplateList *namespaceList = TemplateList::alloc();
- if (m_groupDef->getNamespaces())
+ for (const auto &nd : m_groupDef->getNamespaces())
{
- NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces());
- NamespaceDef *nd;
- for (sdi.toFirst();(nd=sdi.current());++sdi)
+ if (nd->isLinkable() && nd->isConstantGroup())
{
- if (nd->isLinkable() && nd->isConstantGroup())
- {
- namespaceList->append(NamespaceContext::alloc(nd));
- }
+ namespaceList->append(NamespaceContext::alloc(nd));
}
}
cache.constantgroups.reset(namespaceList);
@@ -5564,7 +5487,7 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
}
TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
- MemberListType type,const char *title,bool detailed=FALSE) const
+ MemberListType type,const char *title,bool=FALSE) const
{
if (!list)
{
@@ -5646,9 +5569,9 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
Cachable &cache = getCache();
if (!cache.memberGroups)
{
- if (m_groupDef->getMemberGroupSDict())
+ if (!m_groupDef->getMemberGroups().empty())
{
- cache.memberGroups.reset(MemberGroupListContext::alloc(m_groupDef,relPathAsString(),m_groupDef->getMemberGroupSDict(),m_groupDef->subGrouping()));
+ cache.memberGroups.reset(MemberGroupListContext::alloc(m_groupDef,relPathAsString(),m_groupDef->getMemberGroups(),m_groupDef->subGrouping()));
}
else
{
@@ -5718,19 +5641,14 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
if (!cache.inlineClasses)
{
TemplateList *classList = TemplateList::alloc();
- if (m_groupDef->getClasses())
+ for (const auto &cd : m_groupDef->getClasses())
{
- ClassSDict::Iterator sdi(*m_groupDef->getClasses());
- const ClassDef *cd;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
+ if (!cd->isAnonymous() &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ cd->partOfGroups().empty())
{
- if (!cd->isAnonymous() &&
- cd->isLinkableInProject() &&
- cd->isEmbeddedInOuterScope() &&
- cd->partOfGroups()==0)
- {
- classList->append(ClassContext::alloc(cd));
- }
+ classList->append(ClassContext::alloc(cd));
}
}
cache.inlineClasses.reset(classList);
@@ -5817,11 +5735,9 @@ TemplateVariant ModuleContext::get(const char *n) const
class ClassListContext::Private : public GenericNodeListContext
{
public:
- void addClasses(const ClassSDict &classSDict)
+ void addClasses(const ClassLinkedMap &classLinkedMap)
{
- ClassSDict::Iterator cli(classSDict);
- const ClassDef *cd;
- for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : classLinkedMap)
{
if (cd->getLanguage()==SrcLangExt_VHDL &&
((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
@@ -5833,7 +5749,7 @@ class ClassListContext::Private : public GenericNodeListContext
if (cd->isLinkableInProject() && cd->templateMaster()==0 &&
!cd->isHidden() && !cd->isEmbeddedInOuterScope())
{
- append(ClassContext::alloc(cd));
+ append(ClassContext::alloc(cd.get()));
}
}
}
@@ -5842,8 +5758,8 @@ class ClassListContext::Private : public GenericNodeListContext
ClassListContext::ClassListContext() : RefCountedContext("ClassListContext")
{
p = new Private;
- p->addClasses(*Doxygen::classSDict);
- p->addClasses(*Doxygen::hiddenClasses);
+ p->addClasses(*Doxygen::classLinkedMap);
+ p->addClasses(*Doxygen::hiddenClassLinkedMap);
}
ClassListContext::~ClassListContext()
@@ -5852,12 +5768,12 @@ ClassListContext::~ClassListContext()
}
// TemplateListIntf
-int ClassListContext::count() const
+uint ClassListContext::count() const
{
return p->count();
}
-TemplateVariant ClassListContext::at(int index) const
+TemplateVariant ClassListContext::at(uint index) const
{
return p->at(index);
}
@@ -5896,11 +5812,9 @@ class ClassIndexContext::Private
if (!m_cache.classes)
{
TemplateList *classList = TemplateList::alloc();
- if (Doxygen::classSDict)
+ if (Doxygen::classLinkedMap)
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->getLanguage()==SrcLangExt_VHDL &&
((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
@@ -5911,7 +5825,7 @@ class ClassIndexContext::Private
}
if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
- classList->append(ClassContext::alloc(cd));
+ classList->append(ClassContext::alloc(cd.get()));
}
}
}
@@ -6062,10 +5976,9 @@ class ClassHierarchyContext::Private
Private()
{
m_classTree.reset(NestingContext::alloc(0,0));
- initClassHierarchy(Doxygen::classSDict);
- initClassHierarchy(Doxygen::hiddenClasses);
- m_classTree->addClassHierarchy(*Doxygen::classSDict,TRUE);
- m_classTree->addClassHierarchy(*Doxygen::hiddenClasses,TRUE);
+ ClassDefSet visitedClasses;
+ m_classTree->addClassHierarchy(*Doxygen::classLinkedMap,visitedClasses);
+ m_classTree->addClassHierarchy(*Doxygen::hiddenClassLinkedMap,visitedClasses);
//%% ClassInheritance tree
static bool init=FALSE;
if (!init)
@@ -6120,15 +6033,10 @@ class ClassHierarchyContext::Private
{
TemplateList *diagrams = TemplateList::alloc();
DotGfxHierarchyTable *hierarchy = getHierarchy();
- if (hierarchy->subGraphs())
+ int id=0;
+ for (auto n : hierarchy->subGraphs())
{
- int id=0;
- QListIterator<DotNode> li(*hierarchy->subGraphs());
- DotNode *n;
- for (li.toFirst();(n=li.current());++li)
- {
- diagrams->append(InheritanceGraphContext::alloc(hierarchy,n,id++));
- }
+ diagrams->append(InheritanceGraphContext::alloc(hierarchy,n,id++));
}
m_cache.diagrams.reset(diagrams);
}
@@ -6207,7 +6115,8 @@ class NestingNodeContext::Private
{
public:
Private(const NestingNodeContext *parent,const NestingNodeContext *thisNode,
- const Definition *d,int index,int level,bool addCls,bool inherit, bool hideSuper)
+ const Definition *d,int index,int level,bool addCls,bool inherit, bool hideSuper,
+ ClassDefSet &visitedClasses)
: m_parent(parent), m_def(d), m_level(level), m_index(index)
{
m_children.reset(NestingContext::alloc(thisNode,level+1));
@@ -6247,11 +6156,11 @@ class NestingNodeContext::Private
init=TRUE;
}
- addNamespaces(addCls);
- addClasses(inherit,hideSuper);
- addDirFiles();
- addPages();
- addModules();
+ addNamespaces(addCls,visitedClasses);
+ addClasses(inherit,hideSuper,visitedClasses);
+ addDirFiles(visitedClasses);
+ addPages(visitedClasses);
+ addModules(visitedClasses);
}
TemplateVariant get(const char *n) const
{
@@ -6269,7 +6178,7 @@ class NestingNodeContext::Private
{
if (!m_cache.classContext && m_def->definitionType()==Definition::TypeClass)
{
- m_cache.classContext.reset(ClassContext::alloc(dynamic_cast<const ClassDef*>(m_def)));
+ m_cache.classContext.reset(ClassContext::alloc(toClassDef(m_def)));
}
if (m_cache.classContext)
{
@@ -6284,7 +6193,7 @@ class NestingNodeContext::Private
{
if (!m_cache.namespaceContext && m_def->definitionType()==Definition::TypeNamespace)
{
- m_cache.namespaceContext.reset(NamespaceContext::alloc(dynamic_cast<const NamespaceDef*>(m_def)));
+ m_cache.namespaceContext.reset(NamespaceContext::alloc(toNamespaceDef(m_def)));
}
if (m_cache.namespaceContext)
{
@@ -6299,7 +6208,7 @@ class NestingNodeContext::Private
{
if (!m_cache.dirContext && m_def->definitionType()==Definition::TypeDir)
{
- m_cache.dirContext.reset(DirContext::alloc(dynamic_cast<const DirDef*>(m_def)));
+ m_cache.dirContext.reset(DirContext::alloc(toDirDef(m_def)));
}
if (m_cache.dirContext)
{
@@ -6314,7 +6223,7 @@ class NestingNodeContext::Private
{
if (!m_cache.fileContext && m_def->definitionType()==Definition::TypeFile)
{
- m_cache.fileContext.reset(FileContext::alloc(dynamic_cast<const FileDef*>(m_def)));
+ m_cache.fileContext.reset(FileContext::alloc(toFileDef(m_def)));
}
if (m_cache.fileContext)
{
@@ -6329,7 +6238,7 @@ class NestingNodeContext::Private
{
if (!m_cache.pageContext && m_def->definitionType()==Definition::TypePage)
{
- m_cache.pageContext.reset(PageContext::alloc(dynamic_cast<const PageDef*>(m_def),FALSE,FALSE));
+ m_cache.pageContext.reset(PageContext::alloc(toPageDef(m_def),FALSE,FALSE));
}
if (m_cache.pageContext)
{
@@ -6344,7 +6253,7 @@ class NestingNodeContext::Private
{
if (!m_cache.moduleContext && m_def->definitionType()==Definition::TypeGroup)
{
- m_cache.moduleContext.reset(ModuleContext::alloc(dynamic_cast<const GroupDef*>(m_def)));
+ m_cache.moduleContext.reset(ModuleContext::alloc(toGroupDef(m_def)));
}
if (m_cache.moduleContext)
{
@@ -6414,72 +6323,72 @@ class NestingNodeContext::Private
//------------------------------------------------------------------
- void addClasses(bool inherit, bool hideSuper)
+ void addClasses(bool inherit, bool hideSuper,ClassDefSet &visitedClasses)
{
- const ClassDef *cd = dynamic_cast<const ClassDef*>(m_def);
+ const ClassDef *cd = toClassDef(m_def);
if (cd && inherit)
{
- bool hasChildren = !cd->isVisited() && !hideSuper && classHasVisibleChildren(cd);
+ bool hasChildren = visitedClasses.find(cd)==visitedClasses.end() &&
+ !hideSuper && classHasVisibleChildren(cd);
if (hasChildren)
{
- bool wasVisited=cd->isVisited();
- cd->setVisited(TRUE);
+ visitedClasses.insert(cd);
if (cd->getLanguage()==SrcLangExt_VHDL)
{
- m_children->addDerivedClasses(cd->baseClasses(),wasVisited);
+ m_children->addDerivedClasses(cd->baseClasses(),false,visitedClasses);
}
else
{
- m_children->addDerivedClasses(cd->subClasses(),wasVisited);
+ m_children->addDerivedClasses(cd->subClasses(),false,visitedClasses);
}
}
}
else
{
- if (cd && cd->getClassSDict())
+ if (cd)
{
- m_children->addClasses(*cd->getClassSDict(),FALSE);
+ m_children->addClasses(cd->getClasses(),FALSE,visitedClasses);
}
}
}
- void addNamespaces(bool addClasses)
+ void addNamespaces(bool addClasses,ClassDefSet &visitedClasses)
{
- const NamespaceDef *nd = dynamic_cast<const NamespaceDef*>(m_def);
- if (nd && nd->getNamespaceSDict())
+ const NamespaceDef *nd = toNamespaceDef(m_def);
+ if (nd && !nd->getNamespaces().empty())
{
- m_children->addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses);
+ m_children->addNamespaces(nd->getNamespaces(),FALSE,addClasses,visitedClasses);
}
- if (addClasses && nd && nd->getClassSDict())
+ if (addClasses && nd)
{
- m_children->addClasses(*nd->getClassSDict(),FALSE);
+ m_children->addClasses(nd->getClasses(),FALSE,visitedClasses);
}
}
- void addDirFiles()
+ void addDirFiles(ClassDefSet &visitedClasses)
{
- const DirDef *dd = dynamic_cast<const DirDef*>(m_def);
+ const DirDef *dd = toDirDef(m_def);
if (dd)
{
- m_children->addDirs(dd->subDirs());
+ m_children->addDirs(dd->subDirs(),visitedClasses);
if (dd && dd->getFiles())
{
- m_children->addFiles(*dd->getFiles());
+ m_children->addFiles(*dd->getFiles(),visitedClasses);
}
}
}
- void addPages()
+ void addPages(ClassDefSet &visitedClasses)
{
- const PageDef *pd = dynamic_cast<const PageDef*>(m_def);
- if (pd && pd->getSubPages())
+ const PageDef *pd = toPageDef(m_def);
+ if (pd && !pd->getSubPages().empty())
{
- m_children->addPages(*pd->getSubPages(),FALSE);
+ m_children->addPages(pd->getSubPages(),FALSE,visitedClasses);
}
}
- void addModules()
+ void addModules(ClassDefSet &visitedClasses)
{
- const GroupDef *gd = dynamic_cast<const GroupDef*>(m_def);
- if (gd && gd->getSubGroups())
+ const GroupDef *gd = toGroupDef(m_def);
+ if (gd && !gd->getSubGroups().empty())
{
- m_children->addModules(*gd->getSubGroups());
+ m_children->addModules(gd->getSubGroups(),visitedClasses);
}
}
private:
@@ -6506,10 +6415,11 @@ class NestingNodeContext::Private
PropertyMapper<NestingNodeContext::Private> NestingNodeContext::Private::s_inst;
NestingNodeContext::NestingNodeContext(const NestingNodeContext *parent,
- const Definition *d,int index,int level,bool addClass,bool inherit,bool hideSuper)
+ const Definition *d,int index,int level,bool addClass,bool inherit,bool hideSuper,
+ ClassDefSet &visitedClasses)
: RefCountedContext("NestingNodeContext")
{
- p = new Private(parent,this,d,index,level,addClass,inherit,hideSuper);
+ p = new Private(parent,this,d,index,level,addClass,inherit,hideSuper,visitedClasses);
}
NestingNodeContext::~NestingNodeContext()
@@ -6536,158 +6446,170 @@ class NestingContext::Private : public GenericNodeListContext
Private(const NestingNodeContext *parent,int level)
: m_parent(parent), m_level(level), m_index(0) {}
- void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
+ void addNamespace(const NamespaceDef *nd,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses)
{
- NamespaceSDict::Iterator nli(nsDict);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ if (!nd->isAnonymous() &&
+ (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
{
- if (!nd->isAnonymous() &&
- (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
+ bool hasChildren = namespaceHasNestedNamespace(nd);
+ bool isLinkable = nd->isLinkableInProject();
+ if (isLinkable || hasChildren)
{
- bool hasChildren = namespaceHasVisibleChild(nd,addClasses,false,ClassDef::Class);
- bool isLinkable = nd->isLinkableInProject();
- if (isLinkable || hasChildren)
- {
- NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,nd,m_index,m_level,addClasses,FALSE,FALSE);
- append(nnc);
- m_index++;
- }
+ NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,nd,m_index,m_level,addClasses,FALSE,FALSE,visitedClasses);
+ append(nnc);
+ m_index++;
}
}
}
- void addClasses(const ClassSDict &clDict,bool rootOnly)
+ void addNamespaces(const NamespaceLinkedMap &nsLinkedMap,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses)
{
- ClassSDict::Iterator cli(clDict);
- const ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ for (const auto &nd : nsLinkedMap)
{
- if (cd->getLanguage()==SrcLangExt_VHDL)
+ addNamespace(nd.get(),rootOnly,addClasses,visitedClasses);
+ }
+ }
+ void addNamespaces(const NamespaceLinkedRefMap &nsLinkedMap,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses)
+ {
+ for (const auto &nd : nsLinkedMap)
+ {
+ addNamespace(nd,rootOnly,addClasses,visitedClasses);
+ }
+ }
+ void addClass(const ClassDef *cd,bool rootOnly,ClassDefSet &visitedClasses)
+ {
+ if (cd->getLanguage()==SrcLangExt_VHDL)
+ {
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
+ (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
+ )// no architecture
{
- if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
- (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
- )// no architecture
- {
- continue;
- }
+ return;
}
- if (!rootOnly ||
- cd->getOuterScope()==0 ||
- cd->getOuterScope()==Doxygen::globalScope
- )
+ }
+ if (!rootOnly ||
+ cd->getOuterScope()==0 ||
+ cd->getOuterScope()==Doxygen::globalScope
+ )
+ {
+ if (classVisibleInIndex(cd) && cd->templateMaster()==0)
{
- if (classVisibleInIndex(cd) && cd->templateMaster()==0)
- {
- NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,FALSE,FALSE);
- append(nnc);
- m_index++;
- }
+ NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,FALSE,FALSE,visitedClasses);
+ append(nnc);
+ m_index++;
}
}
}
- void addDirs(const DirSDict &dirDict)
+ void addClasses(const ClassLinkedRefMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses)
+ {
+ for (const auto &cd : clLinkedMap)
+ {
+ addClass(cd,rootOnly,visitedClasses);
+ }
+ }
+ void addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses)
+ {
+ for (const auto &cd : clLinkedMap)
+ {
+ addClass(cd.get(),rootOnly,visitedClasses);
+ }
+ }
+ void addDirs(const DirLinkedMap &dirLinkedMap,ClassDefSet &visitedClasses)
{
- SDict<DirDef>::Iterator dli(dirDict);
- const DirDef *dd;
- for (dli.toFirst();(dd=dli.current());++dli)
+ for (const auto &dd : dirLinkedMap)
{
if (dd->getOuterScope()==Doxygen::globalScope)
{
- append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE));
+ append(NestingNodeContext::alloc(m_parent,dd.get(),m_index,m_level,FALSE,FALSE,FALSE,visitedClasses));
m_index++;
}
}
}
- void addDirs(const DirList &dirList)
+ void addDirs(const DirList &dirList,ClassDefSet &visitedClasses)
{
- QListIterator<DirDef> li(dirList);
- const DirDef *dd;
- for (li.toFirst();(dd=li.current());++li)
+ for(const auto dd : dirList)
{
- append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE));
+ append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE,visitedClasses));
m_index++;
}
}
- void addFiles(const FileNameList &fnList)
+ void addFiles(const FileNameLinkedMap &fnList,ClassDefSet &visitedClasses)
{
- FileNameListIterator fnli(fnList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const FileNameLinkedMap::Ptr &fn : fnList)
{
- FileNameIterator fni(*fn);
- const FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
if (fd->getDirDef()==0) // top level file
{
- append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE,FALSE,FALSE));
+ append(NestingNodeContext::alloc(m_parent,fd.get(),m_index,m_level,FALSE,FALSE,FALSE,visitedClasses));
m_index++;
}
}
}
}
- void addFiles(const FileList &fList)
+ void addFiles(const FileList &fList,ClassDefSet &visitedClasses)
{
QListIterator<FileDef> li(fList);
const FileDef *fd;
for (li.toFirst();(fd=li.current());++li)
{
- append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE,FALSE,FALSE));
+ append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE,FALSE,FALSE,visitedClasses));
m_index++;
}
}
- void addPages(const PageSDict &pages,bool rootOnly)
+ void addPage(const PageDef *pd,bool rootOnly,ClassDefSet &visitedClasses)
{
- SDict<PageDef>::Iterator pli(pages);
- const PageDef *pd;
- for (pli.toFirst();(pd=pli.current());++pli)
+ if (!rootOnly ||
+ pd->getOuterScope()==0 ||
+ pd->getOuterScope()->definitionType()!=Definition::TypePage)
{
- if (!rootOnly ||
- pd->getOuterScope()==0 ||
- pd->getOuterScope()->definitionType()!=Definition::TypePage)
- {
- append(NestingNodeContext::alloc(m_parent,pd,m_index,m_level,FALSE,FALSE,FALSE));
- m_index++;
- }
+ append(NestingNodeContext::alloc(m_parent,pd,m_index,m_level,FALSE,FALSE,FALSE,visitedClasses));
+ m_index++;
+ }
+ }
+ void addPages(const PageLinkedMap &pages,bool rootOnly,ClassDefSet &visitedClasses)
+ {
+ for (const auto &pd : pages)
+ {
+ addPage(pd.get(),rootOnly,visitedClasses);
+ }
+ }
+ void addPages(const PageLinkedRefMap &pages,bool rootOnly,ClassDefSet &visitedClasses)
+ {
+ for (const auto &pd : pages)
+ {
+ addPage(pd,rootOnly,visitedClasses);
}
}
- void addModules(const GroupSDict &groups)
+ void addModules(const GroupLinkedMap &groups,ClassDefSet &visitedClasses)
{
- GroupSDict::Iterator gli(groups);
- const GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : groups)
{
- static bool externalGroups = Config_getBool(EXTERNAL_GROUPS);
+ bool externalGroups = Config_getBool(EXTERNAL_GROUPS);
if (!gd->isASubGroup() && gd->isVisible() &&
- (!gd->isReference() || externalGroups)
+ (!gd->isReference() || externalGroups)
)
{
- append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE,FALSE,FALSE));
+ append(NestingNodeContext::alloc(m_parent,gd.get(),m_index,m_level,FALSE,FALSE,FALSE,visitedClasses));
m_index++;
}
}
}
- void addModules(const GroupList &list)
+ void addModules(const GroupList &groups,ClassDefSet &visitedClasses)
{
- GroupListIterator gli(list);
- const GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : groups)
{
if (gd->isVisible())
{
- append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE,FALSE,FALSE));
+ append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE,FALSE,FALSE,visitedClasses));
m_index++;
}
}
}
- void addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
+ void addDerivedClasses(const BaseClassList &bcl,bool hideSuper,ClassDefSet &visitedClasses)
{
- if (bcl==0) return;
- BaseClassListIterator bcli(*bcl);
- BaseClassDef *bcd;
- for (bcli.toFirst() ; (bcd=bcli.current()) ; ++bcli)
+ for (const auto &bcd : bcl)
{
- const ClassDef *cd=bcd->classDef;
+ const ClassDef *cd=bcd.classDef;
if (cd->getLanguage()==SrcLangExt_VHDL && (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
{
continue;
@@ -6705,17 +6627,15 @@ class NestingContext::Private : public GenericNodeListContext
if (cd->isVisibleInHierarchy() && b)
{
- NestingNodeContext *tnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,TRUE,hideSuper);
+ NestingNodeContext *tnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,TRUE,hideSuper,visitedClasses);
append(tnc);
m_index++;
}
}
}
- void addClassHierarchy(const ClassSDict &classSDict,bool)
+ void addClassHierarchy(const ClassLinkedMap &classLinkedMap,ClassDefSet &visitedClasses)
{
- ClassSDict::Iterator cli(classSDict);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : classLinkedMap)
{
bool b;
if (cd->getLanguage()==SrcLangExt_VHDL)
@@ -6735,7 +6655,7 @@ class NestingContext::Private : public GenericNodeListContext
if (cd->isVisibleInHierarchy()) // should it be visible
{
// new root level class
- NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,TRUE,cd->isVisited());
+ NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd.get(),m_index,m_level,TRUE,TRUE,FALSE,visitedClasses);
append(nnc);
m_index++;
}
@@ -6760,12 +6680,12 @@ NestingContext::~NestingContext()
}
// TemplateListIntf
-int NestingContext::count() const
+uint NestingContext::count() const
{
return p->count();
}
-TemplateVariant NestingContext::at(int index) const
+TemplateVariant NestingContext::at(uint index) const
{
return p->at(index);
}
@@ -6775,59 +6695,74 @@ TemplateListIntf::ConstIterator *NestingContext::createIterator() const
return p->createIterator();
}
-void NestingContext::addClasses(const ClassSDict &clDict,bool rootOnly)
+void NestingContext::addClasses(const ClassLinkedRefMap &clLinkedRefMap,bool rootOnly,ClassDefSet &visitedClasses)
{
- p->addClasses(clDict,rootOnly);
+ p->addClasses(clLinkedRefMap,rootOnly,visitedClasses);
}
-void NestingContext::addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
+void NestingContext::addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses)
{
- p->addNamespaces(nsDict,rootOnly,addClasses);
+ p->addClasses(clLinkedMap,rootOnly,visitedClasses);
}
-void NestingContext::addDirs(const DirSDict &dirs)
+void NestingContext::addNamespaces(const NamespaceLinkedMap &nsLinkedMap,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses)
{
- p->addDirs(dirs);
+ p->addNamespaces(nsLinkedMap,rootOnly,addClasses,visitedClasses);
}
-void NestingContext::addDirs(const DirList &dirs)
+void NestingContext::addNamespaces(const NamespaceLinkedRefMap &nsLinkedRefMap,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses)
{
- p->addDirs(dirs);
+ p->addNamespaces(nsLinkedRefMap,rootOnly,addClasses,visitedClasses);
}
-void NestingContext::addFiles(const FileNameList &files)
+void NestingContext::addDirs(const DirLinkedMap &dirs,ClassDefSet &visitedClasses)
{
- p->addFiles(files);
+ p->addDirs(dirs,visitedClasses);
}
-void NestingContext::addFiles(const FileList &files)
+void NestingContext::addDirs(const DirList &dirs,ClassDefSet &visitedClasses)
{
- p->addFiles(files);
+ p->addDirs(dirs,visitedClasses);
}
-void NestingContext::addPages(const PageSDict &pages,bool rootOnly)
+void NestingContext::addFiles(const FileNameLinkedMap &files,ClassDefSet &visitedClasses)
{
- p->addPages(pages,rootOnly);
+ p->addFiles(files,visitedClasses);
}
-void NestingContext::addModules(const GroupSDict &modules)
+void NestingContext::addFiles(const FileList &files,ClassDefSet &visitedClasses)
{
- p->addModules(modules);
+ p->addFiles(files,visitedClasses);
}
-void NestingContext::addModules(const GroupList &modules)
+void NestingContext::addPages(const PageLinkedMap &pages,bool rootOnly,ClassDefSet &visitedClasses)
{
- p->addModules(modules);
+ p->addPages(pages,rootOnly,visitedClasses);
}
-void NestingContext::addClassHierarchy(const ClassSDict &classSDict,bool rootOnly)
+void NestingContext::addPages(const PageLinkedRefMap &pages,bool rootOnly,ClassDefSet &visitedClasses)
{
- p->addClassHierarchy(classSDict,rootOnly);
+ p->addPages(pages,rootOnly,visitedClasses);
}
-void NestingContext::addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
+void NestingContext::addModules(const GroupLinkedMap &modules,ClassDefSet &visitedClasses)
{
- p->addDerivedClasses(bcl,hideSuper);
+ p->addModules(modules,visitedClasses);
+}
+
+void NestingContext::addModules(const GroupList &modules,ClassDefSet &visitedClasses)
+{
+ p->addModules(modules,visitedClasses);
+}
+
+void NestingContext::addClassHierarchy(const ClassLinkedMap &classLinkedMap,ClassDefSet &visitedClasses)
+{
+ p->addClassHierarchy(classLinkedMap,visitedClasses);
+}
+
+void NestingContext::addDerivedClasses(const BaseClassList &bcl,bool hideSuper,ClassDefSet &visitedClasses)
+{
+ p->addDerivedClasses(bcl,hideSuper,visitedClasses);
}
//------------------------------------------------------------------------
@@ -6840,14 +6775,9 @@ class ClassTreeContext::Private
Private()
{
m_classTree.reset(NestingContext::alloc(0,0));
- if (Doxygen::namespaceSDict)
- {
- m_classTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE);
- }
- if (Doxygen::classSDict)
- {
- m_classTree->addClasses(*Doxygen::classSDict,TRUE);
- }
+ ClassDefSet visitedClasses;
+ m_classTree->addNamespaces(*Doxygen::namespaceLinkedMap,TRUE,TRUE,visitedClasses);
+ m_classTree->addClasses(*Doxygen::classLinkedMap,TRUE,visitedClasses);
//%% Nesting tree
static bool init=FALSE;
if (!init)
@@ -6961,15 +6891,13 @@ TemplateVariant ClassTreeContext::get(const char *name) const
class NamespaceListContext::Private : public GenericNodeListContext
{
public:
- void addNamespaces(const NamespaceSDict &nsDict)
+ void addNamespaces(const NamespaceLinkedMap &nsLinkedMap)
{
- NamespaceSDict::Iterator nli(nsDict);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : nsLinkedMap)
{
if (nd->isLinkableInProject())
{
- append(NamespaceContext::alloc(nd));
+ append(NamespaceContext::alloc(nd.get()));
}
}
}
@@ -6978,7 +6906,7 @@ class NamespaceListContext::Private : public GenericNodeListContext
NamespaceListContext::NamespaceListContext() : RefCountedContext("NamespaceListContext")
{
p = new Private;
- p->addNamespaces(*Doxygen::namespaceSDict);
+ p->addNamespaces(*Doxygen::namespaceLinkedMap);
}
NamespaceListContext::~NamespaceListContext()
@@ -6987,12 +6915,12 @@ NamespaceListContext::~NamespaceListContext()
}
// TemplateListIntf
-int NamespaceListContext::count() const
+uint NamespaceListContext::count() const
{
return p->count();
}
-TemplateVariant NamespaceListContext::at(int index) const
+TemplateVariant NamespaceListContext::at(uint index) const
{
return p->at(index);
}
@@ -7012,10 +6940,8 @@ class NamespaceTreeContext::Private
Private()
{
m_namespaceTree.reset(NestingContext::alloc(0,0));
- if (Doxygen::namespaceSDict)
- {
- m_namespaceTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE);
- }
+ ClassDefSet visitedClasses;
+ m_namespaceTree->addNamespaces(*Doxygen::namespaceLinkedMap,TRUE,FALSE,visitedClasses);
//%% Nesting tree
static bool init=FALSE;
if (!init)
@@ -7131,23 +7057,19 @@ TemplateVariant NamespaceTreeContext::get(const char *name) const
class FileListContext::Private : public GenericNodeListContext
{
public:
- void addFiles(const FileNameList &fnList)
+ void addFiles(const FileNameLinkedMap &fnMap)
{
// TODO: if FULL_PATH_NAMES is enabled, the ordering should be dir+file
- FileNameListIterator fnli(fnList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : fnMap)
{
- FileNameIterator fni(*fn);
- const FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
bool doc = fd->isLinkableInProject();
bool src = fd->generateSourceFile();
bool nameOk = !fd->isDocumentationFile();
if (nameOk && (doc || src) && !fd->isReference())
{
- append(FileContext::alloc(fd));
+ append(FileContext::alloc(fd.get()));
}
}
}
@@ -7157,7 +7079,7 @@ class FileListContext::Private : public GenericNodeListContext
FileListContext::FileListContext() : RefCountedContext("FileListContext")
{
p = new Private;
- if (Doxygen::inputNameList) p->addFiles(*Doxygen::inputNameList);
+ if (Doxygen::inputNameLinkedMap) p->addFiles(*Doxygen::inputNameLinkedMap);
}
FileListContext::~FileListContext()
@@ -7166,12 +7088,12 @@ FileListContext::~FileListContext()
}
// TemplateListIntf
-int FileListContext::count() const
+uint FileListContext::count() const
{
return p->count();
}
-TemplateVariant FileListContext::at(int index) const
+TemplateVariant FileListContext::at(uint index) const
{
return p->at(index);
}
@@ -7189,11 +7111,9 @@ class DirListContext::Private : public GenericNodeListContext
public:
Private()
{
- const DirDef *dir;
- DirSDict::Iterator sdi(*Doxygen::directories);
- for (sdi.toFirst();(dir=sdi.current());++sdi)
+ for (const auto &dir : *Doxygen::dirLinkedMap)
{
- append(DirContext::alloc(dir));
+ append(DirContext::alloc(dir.get()));
}
}
};
@@ -7209,12 +7129,12 @@ DirListContext::~DirListContext()
}
// TemplateListIntf
-int DirListContext::count() const
+uint DirListContext::count() const
{
return p->count();
}
-TemplateVariant DirListContext::at(int index) const
+TemplateVariant DirListContext::at(uint index) const
{
return p->at(index);
}
@@ -7257,12 +7177,12 @@ UsedFilesContext::~UsedFilesContext()
}
// TemplateListIntf
-int UsedFilesContext::count() const
+uint UsedFilesContext::count() const
{
return p->count();
}
-TemplateVariant UsedFilesContext::at(int index) const
+TemplateVariant UsedFilesContext::at(uint index) const
{
return p->at(index);
}
@@ -7288,13 +7208,11 @@ class FileTreeContext::Private
{
// Add dirs tree
m_dirFileTree.reset(NestingContext::alloc(0,0));
- if (Doxygen::directories)
- {
- m_dirFileTree->addDirs(*Doxygen::directories);
- }
- if (Doxygen::inputNameList)
+ ClassDefSet visitedClasses;
+ m_dirFileTree->addDirs(*Doxygen::dirLinkedMap,visitedClasses);
+ if (Doxygen::inputNameLinkedMap)
{
- m_dirFileTree->addFiles(*Doxygen::inputNameList);
+ m_dirFileTree->addFiles(*Doxygen::inputNameLinkedMap,visitedClasses);
}
//%% DirFile tree:
static bool init=FALSE;
@@ -7397,14 +7315,12 @@ TemplateVariant FileTreeContext::get(const char *name) const
class PageTreeContext::Private
{
public:
- Private(const PageSDict *pages)
+ Private(const PageLinkedMap &pages)
{
m_pageTree.reset(NestingContext::alloc(0,0));
+ ClassDefSet visitedClasses;
// Add pages
- if (pages)
- {
- m_pageTree->addPages(*pages,TRUE);
- }
+ m_pageTree->addPages(pages,TRUE,visitedClasses);
//%% PageNodeList tree:
static bool init=FALSE;
@@ -7485,7 +7401,7 @@ class PageTreeContext::Private
PropertyMapper<PageTreeContext::Private> PageTreeContext::Private::s_inst;
-PageTreeContext::PageTreeContext(const PageSDict *pages) : RefCountedContext("PageTreeContext")
+PageTreeContext::PageTreeContext(const PageLinkedMap &pages) : RefCountedContext("PageTreeContext")
{
p = new Private(pages);
}
@@ -7506,24 +7422,22 @@ TemplateVariant PageTreeContext::get(const char *name) const
class PageListContext::Private : public GenericNodeListContext
{
public:
- void addPages(const PageSDict &pages)
+ void addPages(const PageLinkedMap &pages)
{
- PageSDict::Iterator pdi(pages);
- const PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : pages)
{
if (!pd->getGroupDef() && !pd->isReference())
{
- append(PageContext::alloc(pd,FALSE,FALSE));
+ append(PageContext::alloc(pd.get(),FALSE,FALSE));
}
}
}
};
-PageListContext::PageListContext(const PageSDict *pages) : RefCountedContext("PageListContext")
+PageListContext::PageListContext(const PageLinkedMap &pages) : RefCountedContext("PageListContext")
{
p = new Private;
- if (pages) p->addPages(*pages);
+ p->addPages(pages);
}
PageListContext::~PageListContext()
@@ -7532,12 +7446,12 @@ PageListContext::~PageListContext()
}
// TemplateListIntf
-int PageListContext::count() const
+uint PageListContext::count() const
{
return p->count();
}
-TemplateVariant PageListContext::at(int index) const
+TemplateVariant PageListContext::at(uint index) const
{
return p->at(index);
}
@@ -7555,16 +7469,11 @@ class ExampleListContext::Private : public GenericNodeListContext
public:
Private()
{
- if (Doxygen::exampleSDict)
+ for (const auto &pd : *Doxygen::exampleLinkedMap)
{
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- const PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ if (!pd->getGroupDef() && !pd->isReference())
{
- if (!pd->getGroupDef() && !pd->isReference())
- {
- append(PageContext::alloc(pd,FALSE,TRUE));
- }
+ append(PageContext::alloc(pd.get(),FALSE,TRUE));
}
}
}
@@ -7581,12 +7490,12 @@ ExampleListContext::~ExampleListContext()
}
// TemplateListIntf
-int ExampleListContext::count() const
+uint ExampleListContext::count() const
{
return p->count();
}
-TemplateVariant ExampleListContext::at(int index) const
+TemplateVariant ExampleListContext::at(uint index) const
{
return p->at(index);
}
@@ -7604,13 +7513,11 @@ class ModuleListContext::Private : public GenericNodeListContext
public:
void addModules()
{
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- const GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (!gd->isReference())
{
- append(ModuleContext::alloc(gd));
+ append(ModuleContext::alloc(gd.get()));
}
}
}
@@ -7628,12 +7535,12 @@ ModuleListContext::~ModuleListContext()
}
// TemplateListIntf
-int ModuleListContext::count() const
+uint ModuleListContext::count() const
{
return p->count();
}
-TemplateVariant ModuleListContext::at(int index) const
+TemplateVariant ModuleListContext::at(uint index) const
{
return p->at(index);
}
@@ -7653,11 +7560,9 @@ class ModuleTreeContext::Private
Private()
{
m_moduleTree.reset(NestingContext::alloc(0,0));
+ ClassDefSet visitedClasses;
// Add modules
- if (Doxygen::groupSDict)
- {
- m_moduleTree->addModules(*Doxygen::groupSDict);
- }
+ m_moduleTree->addModules(*Doxygen::groupLinkedMap,visitedClasses);
//%% ModuleList tree:
static bool init=FALSE;
@@ -7796,11 +7701,11 @@ class NavPathElemContext::Private
QCString text = m_def->localName();
if (type==Definition::TypeGroup)
{
- text = (dynamic_cast<const GroupDef*>(m_def))->groupTitle();
+ text = (toGroupDef(m_def))->groupTitle();
}
- else if (type==Definition::TypePage && ((dynamic_cast<const PageDef*>(m_def))->hasTitle()))
+ else if (type==Definition::TypePage && ((toPageDef(m_def))->hasTitle()))
{
- text = (dynamic_cast<const PageDef*>(m_def))->title();
+ text = (toPageDef(m_def))->title();
}
else if (type==Definition::TypeClass)
{
@@ -7858,11 +7763,9 @@ class ExampleTreeContext::Private
Private()
{
m_exampleTree.reset(NestingContext::alloc(0,0));
+ ClassDefSet visitedClasses;
// Add pages
- if (Doxygen::exampleSDict)
- {
- m_exampleTree->addPages(*Doxygen::exampleSDict,TRUE);
- }
+ m_exampleTree->addPages(*Doxygen::exampleLinkedMap,TRUE,visitedClasses);
static bool init=FALSE;
if (!init)
@@ -7997,21 +7900,17 @@ class GlobalsIndexContext::Private
if (!listRef)
{
TemplateList *list = TemplateList::alloc();
- MemberName *mn;
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
- for (fnli.toFirst();(mn=fnli.current());++fnli)
+ for (const auto &mn : *Doxygen::functionNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
const FileDef *fd=md->getFileDef();
if (fd && fd->isLinkableInProject() &&
!md->name().isEmpty() && !md->getNamespaceDef() && md->isLinkableInProject())
{
- if (filter==0 || (md->*filter)())
+ if (filter==0 || (md.get()->*filter)())
{
- list->append(MemberContext::alloc(md));
+ list->append(MemberContext::alloc(md.get()));
}
}
}
@@ -8154,21 +8053,17 @@ class ClassMembersIndexContext::Private
if (!listRef)
{
TemplateList *list = TemplateList::alloc();
- MemberName *mn;
- MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
- for (mnli.toFirst();(mn=mnli.current());++mnli)
+ for (const auto &mn : *Doxygen::memberNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
const ClassDef *cd = md->getClassDef();
if (cd && cd->isLinkableInProject() && cd->templateMaster()==0 &&
md->isLinkableInProject() && !md->name().isEmpty())
{
- if (filter==0 || (md->*filter)())
+ if (filter==0 || (md.get()->*filter)())
{
- list->append(MemberContext::alloc(md));
+ list->append(MemberContext::alloc(md.get()));
}
}
}
@@ -8313,21 +8208,17 @@ class NamespaceMembersIndexContext::Private
if (!listRef)
{
TemplateList *list = TemplateList::alloc();
- MemberName *mn;
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
- for (fnli.toFirst();(mn=fnli.current());++fnli)
+ for (const auto &mn : *Doxygen::functionNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
const NamespaceDef *nd=md->getNamespaceDef();
if (nd && nd->isLinkableInProject() &&
!md->name().isEmpty() && md->isLinkableInProject())
{
- if (filter==0 || (md->*filter)())
+ if (filter==0 || (md.get()->*filter)())
{
- list->append(MemberContext::alloc(md));
+ list->append(MemberContext::alloc(md.get()));
}
}
}
@@ -8562,29 +8453,24 @@ class InheritanceListContext::Private : public GenericNodeListContext
}
};
-InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses) : RefCountedContext("InheritanceListContext")
+InheritanceListContext::InheritanceListContext(const BaseClassList &list, bool baseClasses) : RefCountedContext("InheritanceListContext")
{
p = new Private;
- if (list)
+ for (const auto &bcd : list)
{
- BaseClassListIterator li(*list);
- BaseClassDef *bcd;
- for (li.toFirst();(bcd=li.current());++li)
+ const ClassDef *cd=bcd.classDef;
+ QCString name;
+ if (baseClasses)
{
- const ClassDef *cd=bcd->classDef;
- QCString name;
- if (baseClasses)
- {
- name = insertTemplateSpecifierInScope(
- cd->displayName(),bcd->templSpecifiers);
- }
- else
- {
- name = cd->displayName();
- }
- //printf("InheritanceListContext: adding %s baseClass=%d\n",name.data(),baseClasses);
- p->addClass(cd,name);
+ name = insertTemplateSpecifierInScope(
+ cd->displayName(),bcd.templSpecifiers);
}
+ else
+ {
+ name = cd->displayName();
+ }
+ //printf("InheritanceListContext: adding %s baseClass=%d\n",name.data(),baseClasses);
+ p->addClass(cd,name);
}
}
@@ -8594,12 +8480,12 @@ InheritanceListContext::~InheritanceListContext()
}
// TemplateListIntf
-int InheritanceListContext::count() const
+uint InheritanceListContext::count() const
{
return p->count();
}
-TemplateVariant InheritanceListContext::at(int index) const
+TemplateVariant InheritanceListContext::at(uint index) const
{
return p->at(index);
}
@@ -8615,7 +8501,7 @@ TemplateListIntf::ConstIterator *InheritanceListContext::createIterator() const
class MemberListContext::Private : public GenericNodeListContext
{
public:
- void addMember(MemberDef *md)
+ void addMember(const MemberDef *md)
{
append(MemberContext::alloc(md));
}
@@ -8646,22 +8532,14 @@ MemberListContext::MemberListContext(const MemberList *list) : RefCountedContext
}
}
-MemberListContext::MemberListContext(MemberSDict *list,bool doSort) : RefCountedContext("MemberListContext")
+MemberListContext::MemberListContext(std::vector<const MemberDef *> &&ml) : RefCountedContext("MemberListContext")
{
p = new Private;
- if (list)
+ for (const auto &md : ml)
{
- if (doSort)
- {
- list->sort();
- }
- MemberSDict::Iterator it(*list);
- MemberDef *md;
- for (it.toFirst();(md=it.current());++it)
- {
- p->addMember(md);
- }
+ p->addMember(md);
}
+ ml.clear();
}
MemberListContext::~MemberListContext()
@@ -8670,12 +8548,12 @@ MemberListContext::~MemberListContext()
}
// TemplateListIntf
-int MemberListContext::count() const
+uint MemberListContext::count() const
{
return p->count();
}
-TemplateVariant MemberListContext::at(int index) const
+TemplateVariant MemberListContext::at(uint index) const
{
return p->at(index);
}
@@ -8714,7 +8592,7 @@ class MemberInfoContext::Private
}
TemplateVariant protection() const
{
- switch (m_memberInfo->prot)
+ switch (m_memberInfo->prot())
{
case ::Public: return "public";
case ::Protected: return "protected";
@@ -8725,7 +8603,7 @@ class MemberInfoContext::Private
}
TemplateVariant virtualness() const
{
- switch (m_memberInfo->virt)
+ switch (m_memberInfo->virt())
{
case ::Normal: return "normal";
case ::Virtual: return "virtual";
@@ -8735,13 +8613,13 @@ class MemberInfoContext::Private
}
TemplateVariant ambiguityScope() const
{
- return m_memberInfo->ambiguityResolutionScope;
+ return m_memberInfo->ambiguityResolutionScope();
}
TemplateVariant member() const
{
- if (!m_member && m_memberInfo->memberDef)
+ if (!m_member && m_memberInfo->memberDef())
{
- m_member.reset(MemberContext::alloc(m_memberInfo->memberDef));
+ m_member.reset(MemberContext::alloc(m_memberInfo->memberDef()));
}
if (m_member)
{
@@ -8783,31 +8661,24 @@ TemplateVariant MemberInfoContext::get(const char *name) const
class AllMembersListContext::Private : public GenericNodeListContext
{
public:
- Private(const MemberNameInfoSDict *ml)
+ Private(const MemberNameInfoLinkedMap &ml)
{
- if (ml)
+ static bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
+ for (auto &mni : ml)
{
- static bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
- MemberNameInfoSDict::Iterator mnii(*ml);
- MemberNameInfo *mni;
- for (mnii.toFirst();(mni=mnii.current());++mnii)
+ for (auto &mi : *mni)
{
- MemberNameInfoIterator mnii2(*mni);
- MemberInfo *mi;
- for (mnii2.toFirst();(mi=mnii2.current());++mnii2)
+ const MemberDef *md=mi->memberDef();
+ const ClassDef *cd=md->getClassDef();
+ if (cd && !md->isAnonymous())
{
- MemberDef *md=mi->memberDef;
- const ClassDef *cd=md->getClassDef();
- if (cd && !md->isAnonymous())
+ if ((cd->isLinkable() && md->isLinkable()) ||
+ (!cd->isArtificial() && !hideUndocMembers &&
+ (protectionLevelVisible(md->protection()) || md->isFriend())
+ )
+ )
{
- if ((cd->isLinkable() && md->isLinkable()) ||
- (!cd->isArtificial() && !hideUndocMembers &&
- (protectionLevelVisible(md->protection()) || md->isFriend())
- )
- )
- {
- append(MemberInfoContext::alloc(mi));
- }
+ append(MemberInfoContext::alloc(mi.get()));
}
}
}
@@ -8815,12 +8686,8 @@ class AllMembersListContext::Private : public GenericNodeListContext
}
};
-AllMembersListContext::AllMembersListContext() : RefCountedContext("AllMembersListContext")
-{
- p = new Private(0);
-}
-
-AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml) : RefCountedContext("AllMembersListContext")
+AllMembersListContext::AllMembersListContext(const MemberNameInfoLinkedMap &ml)
+ : RefCountedContext("AllMembersListContext")
{
p = new Private(ml);
}
@@ -8831,12 +8698,12 @@ AllMembersListContext::~AllMembersListContext()
}
// TemplateListIntf
-int AllMembersListContext::count() const
+uint AllMembersListContext::count() const
{
return p->count();
}
-TemplateVariant AllMembersListContext::at(int index) const
+TemplateVariant AllMembersListContext::at(uint index) const
{
return p->at(index);
}
@@ -8899,7 +8766,7 @@ class MemberGroupInfoContext::Private
{
if (!m_cache.memberGroups)
{
- m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,0));
+ m_cache.memberGroups.reset(MemberGroupListContext::alloc());
}
return m_cache.memberGroups.get();
}
@@ -8976,33 +8843,23 @@ MemberGroupListContext::MemberGroupListContext() : RefCountedContext("MemberGrou
p = new Private;
}
-MemberGroupListContext::MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupList *list) : RefCountedContext("MemberGroupListContext")
+MemberGroupListContext::MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupRefList &list) : RefCountedContext("MemberGroupListContext")
{
p = new Private;
- if (list)
+ for (const auto &mg : list)
{
- MemberGroupListIterator mgli(*list);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- p->addMemberGroup(def,relPath,mg);
- }
+ p->addMemberGroup(def,relPath,mg);
}
}
-MemberGroupListContext::MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping) : RefCountedContext("MemberGroupListContext")
+MemberGroupListContext::MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupList &list,bool subGrouping) : RefCountedContext("MemberGroupListContext")
{
p = new Private;
- if (dict)
+ for (const auto &mg : list)
{
- MemberGroupSDict::Iterator di(*dict);
- const MemberGroup *mg;
- for (di.toFirst();(mg=di.current());++di)
+ if (!mg->allMembersInSameSection() || !subGrouping)
{
- if (!mg->allMembersInSameSection() || !subGrouping)
- {
- p->addMemberGroup(def,relPath,mg);
- }
+ p->addMemberGroup(def,relPath,mg.get());
}
}
}
@@ -9013,12 +8870,12 @@ MemberGroupListContext::~MemberGroupListContext()
}
// TemplateListIntf
-int MemberGroupListContext::count() const
+uint MemberGroupListContext::count() const
{
return p->count();
}
-TemplateVariant MemberGroupListContext::at(int index) const
+TemplateVariant MemberGroupListContext::at(uint index) const
{
return p->at(index);
}
@@ -9093,7 +8950,7 @@ class MemberListInfoContext::Private
m_def->definitionType()==Definition::TypeClass)
{
InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
- ctx->addMemberList(dynamic_cast<const ClassDef*>(m_def),m_memberList->listType(),m_title,FALSE);
+ ctx->addMemberList(toClassDef(m_def),m_memberList->listType(),m_title,FALSE);
m_cache.inherited.reset(ctx);
}
if (m_cache.inherited)
@@ -9261,38 +9118,30 @@ class InheritedMemberInfoListContext::Private : public GenericNodeListContext
if (ml)
{
addMemberList(inheritedFrom,ml,combinedList);
- if (ml->getMemberGroupList())
+ for (const auto *mg : ml->getMemberGroupList())
{
- MemberGroupListIterator mgli(*ml->getMemberGroupList());
- MemberGroup *mg;
- for (mgli.toFirst();(mg=mgli.current());++mgli)
- {
- addMemberList(inheritedFrom,mg->members(),combinedList);
- }
+ addMemberList(inheritedFrom,mg->members(),combinedList);
}
}
}
void addMemberGroupsOfClass(const ClassDef *inheritedFrom,
const ClassDef *cd,MemberListType lt,MemberList *combinedList)
{
- if (cd->getMemberGroupSDict())
+ // TODO: why this there no addMemberGroupsOfNamespace, addMembersGroupsOfFile,
+ // addMemberGroupsOfGroup?
+ for (const auto &mg: cd->getMemberGroups())
{
- MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ if (mg->members() && (!mg->allMembersInSameSection() || !cd->subGrouping())) // group is in its own section
{
- if (mg->members() && (!mg->allMembersInSameSection() || !cd->subGrouping())) // group is in its own section
+ MemberListIterator li(*mg->members());
+ MemberDef *md;
+ for (li.toFirst();(md=li.current());++li)
{
- MemberListIterator li(*mg->members());
- MemberDef *md;
- for (li.toFirst();(md=li.current());++li)
+ if (lt==md->getSectionList(mg->container())->listType() &&
+ !md->isReimplementedBy(inheritedFrom) &&
+ md->isBriefSectionVisible())
{
- if (lt==md->getSectionList()->listType() &&
- !md->isReimplementedBy(inheritedFrom) &&
- md->isBriefSectionVisible())
- {
- combinedList->append(md);
- }
+ combinedList->append(md);
}
}
}
@@ -9319,31 +9168,26 @@ class InheritedMemberInfoListContext::Private : public GenericNodeListContext
int lt2, const QCString &title,bool additionalList,
QPtrDict<void> *visitedClasses)
{
- if (cd->baseClasses())
+ for (const auto &ibcd : cd->baseClasses())
{
- BaseClassListIterator it(*cd->baseClasses());
- BaseClassDef *ibcd;
- for (it.toFirst();(ibcd=it.current());++it)
+ ClassDef *icd=ibcd.classDef;
+ if (icd->isLinkable())
{
- ClassDef *icd=ibcd->classDef;
- if (icd->isLinkable())
+ int lt1,lt3;
+ convertProtectionLevel(lt,ibcd.prot,&lt1,&lt3);
+ if (lt2==-1 && lt3!=-1)
{
- int lt1,lt3;
- convertProtectionLevel(lt,ibcd->prot,&lt1,&lt3);
- if (lt2==-1 && lt3!=-1)
- {
- lt2=lt3;
- }
- if (visitedClasses->find(icd)==0)
+ lt2=lt3;
+ }
+ if (visitedClasses->find(icd)==0)
+ {
+ visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
+ if (lt1!=-1)
{
- visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
- if (lt1!=-1)
- {
- // add member info for members of cd with list type lt
- addInheritedMembers(inheritedFrom,icd,lt,(MemberListType)lt1,lt2,title,additionalList);
- // recurse down the inheritance tree
- findInheritedMembers(inheritedFrom,icd,(MemberListType)lt1,lt2,title,additionalList,visitedClasses);
- }
+ // add member info for members of cd with list type lt
+ addInheritedMembers(inheritedFrom,icd,lt,(MemberListType)lt1,lt2,title,additionalList);
+ // recurse down the inheritance tree
+ findInheritedMembers(inheritedFrom,icd,(MemberListType)lt1,lt2,title,additionalList,visitedClasses);
}
}
}
@@ -9376,12 +9220,12 @@ InheritedMemberInfoListContext::~InheritedMemberInfoListContext()
}
// TemplateListIntf
-int InheritedMemberInfoListContext::count() const
+uint InheritedMemberInfoListContext::count() const
{
return p->count();
}
-TemplateVariant InheritedMemberInfoListContext::at(int index) const
+TemplateVariant InheritedMemberInfoListContext::at(uint index) const
{
return p->at(index);
}
@@ -9458,7 +9302,7 @@ class ArgumentContext::Private
TemplateVariant namePart() const
{
QCString result = m_argument.attrib;
- int l = result.length();
+ uint l = result.length();
if (l>2 && result.at(0)=='[' && result.at(l-1)==']')
{
result = result.mid(1,l-2);
@@ -9467,7 +9311,7 @@ class ArgumentContext::Private
return result;
}
private:
- const Argument &m_argument;
+ Argument m_argument;
const Definition *m_def;
QCString m_relPath;
struct Cachable
@@ -9529,12 +9373,12 @@ ArgumentListContext::~ArgumentListContext()
}
// TemplateListIntf
-int ArgumentListContext::count() const
+uint ArgumentListContext::count() const
{
return p->count();
}
-TemplateVariant ArgumentListContext::at(int index) const
+TemplateVariant ArgumentListContext::at(uint index) const
{
return p->at(index);
}
@@ -9600,7 +9444,7 @@ class SymbolContext::Private
const Definition *prev = m_prevDef;
const Definition *nextScope = next ? next->getOuterScope() : 0;
const Definition *prevScope = prev ? prev->getOuterScope() : 0;
- const MemberDef *md = dynamic_cast<const MemberDef*>(m_def);
+ const MemberDef *md = toMemberDef(m_def);
bool isFunctionLike = md && (md->isFunction() || md->isSlot() || md->isSignal());
bool overloadedFunction = isFunctionLike &&
((prevScope!=0 && scope==prevScope) || (scope && scope==nextScope));
@@ -9696,25 +9540,26 @@ TemplateVariant SymbolContext::get(const char *name) const
class SymbolListContext::Private : public GenericNodeListContext
{
public:
- Private(const SearchDefinitionList *sdl)
+ Private(const SearchIndexList::const_iterator &start,
+ const SearchIndexList::const_iterator &end)
{
- QListIterator<Definition> li(*sdl);
- const Definition *def;
const Definition *prev = 0;
- for (li.toFirst();(def=li.current());)
+ for (auto it = start; it!=end;)
{
- ++li;
- const Definition *next = li.current();
+ const Definition *def = *it;
+ ++it;
+ const Definition *next = it!=end ? *it : 0;
append(SymbolContext::alloc(def,prev,next));
prev = def;
}
}
};
-SymbolListContext::SymbolListContext(const SearchDefinitionList *sdl)
+SymbolListContext::SymbolListContext(const SearchIndexList::const_iterator &start,
+ const SearchIndexList::const_iterator &end)
: RefCountedContext("SymbolListContext")
{
- p = new Private(sdl);
+ p = new Private(start,end);
}
SymbolListContext::~SymbolListContext()
@@ -9723,12 +9568,12 @@ SymbolListContext::~SymbolListContext()
}
// TemplateListIntf
-int SymbolListContext::count() const
+uint SymbolListContext::count() const
{
return p->count();
}
-TemplateVariant SymbolListContext::at(int index) const
+TemplateVariant SymbolListContext::at(uint index) const
{
return p->at(index);
}
@@ -9745,7 +9590,8 @@ TemplateListIntf::ConstIterator *SymbolListContext::createIterator() const
class SymbolGroupContext::Private
{
public:
- Private(const SearchDefinitionList *sdl) : m_sdl(sdl)
+ Private(const SearchIndexList::const_iterator &start,
+ const SearchIndexList::const_iterator &end) : m_start(start), m_end(end)
{
static bool init=FALSE;
if (!init)
@@ -9762,22 +9608,23 @@ class SymbolGroupContext::Private
}
TemplateVariant id() const
{
- return m_sdl->id();
+ return searchId(*m_start);
}
TemplateVariant name() const
{
- return m_sdl->name();
+ return searchName(*m_start);
}
TemplateVariant symbolList() const
{
if (!m_cache.symbolList)
{
- m_cache.symbolList.reset(SymbolListContext::alloc(m_sdl));
+ m_cache.symbolList.reset(SymbolListContext::alloc(m_start,m_end));
}
return m_cache.symbolList.get();
}
private:
- const SearchDefinitionList *m_sdl;
+ SearchIndexList::const_iterator m_start;
+ SearchIndexList::const_iterator m_end;
struct Cachable
{
SharedPtr<SymbolListContext> symbolList;
@@ -9789,10 +9636,11 @@ class SymbolGroupContext::Private
PropertyMapper<SymbolGroupContext::Private> SymbolGroupContext::Private::s_inst;
-SymbolGroupContext::SymbolGroupContext(const SearchDefinitionList *sdl)
+SymbolGroupContext::SymbolGroupContext(const SearchIndexList::const_iterator &start,
+ const SearchIndexList::const_iterator &end)
: RefCountedContext("SymbolGroupContext")
{
- p = new Private(sdl);
+ p = new Private(start,end);
}
SymbolGroupContext::~SymbolGroupContext()
@@ -9811,18 +9659,30 @@ TemplateVariant SymbolGroupContext::get(const char *name) const
class SymbolGroupListContext::Private : public GenericNodeListContext
{
public:
- Private(const SearchIndexList *sil)
+ Private(const SearchIndexList &sil)
{
- SDict<SearchDefinitionList>::Iterator li(*sil);
- SearchDefinitionList *dl;
- for (li.toFirst();(dl=li.current());++li)
+ QCString lastName;
+ auto it = sil.begin();
+ auto it_begin = it;
+ while (it!=sil.end())
{
- append(SymbolGroupContext::alloc(dl));
+ QCString name = searchName(*it);
+ if (name!=lastName)
+ {
+ append(SymbolGroupContext::alloc(it_begin,it));
+ it_begin = it;
+ lastName = name;
+ }
+ ++it;
+ }
+ if (it_begin!=sil.end())
+ {
+ append(SymbolGroupContext::alloc(it_begin,sil.end()));
}
}
};
-SymbolGroupListContext::SymbolGroupListContext(const SearchIndexList *sil)
+SymbolGroupListContext::SymbolGroupListContext(const SearchIndexList &sil)
: RefCountedContext("SymbolGroupListContext")
{
p = new Private(sil);
@@ -9834,12 +9694,12 @@ SymbolGroupListContext::~SymbolGroupListContext()
}
// TemplateListIntf
-int SymbolGroupListContext::count() const
+uint SymbolGroupListContext::count() const
{
return p->count();
}
-TemplateVariant SymbolGroupListContext::at(int index) const
+TemplateVariant SymbolGroupListContext::at(uint index) const
{
return p->at(index);
}
@@ -9856,7 +9716,9 @@ TemplateListIntf::ConstIterator *SymbolGroupListContext::createIterator() const
class SymbolIndexContext::Private
{
public:
- Private(const SearchIndexList *sl,const QCString &name) : m_searchList(sl), m_name(name)
+ Private(const std::string &letter,
+ const SearchIndexList &sl,
+ const QCString &name) : m_letter(letter), m_searchList(sl), m_name(name)
{
static bool init=FALSE;
if (!init)
@@ -9877,7 +9739,7 @@ class SymbolIndexContext::Private
}
TemplateVariant letter() const
{
- return QString(QChar(m_searchList->letter())).utf8();
+ return m_letter;
}
TemplateVariant symbolGroups() const
{
@@ -9888,7 +9750,8 @@ class SymbolIndexContext::Private
return m_cache.symbolGroups.get();
}
private:
- const SearchIndexList *m_searchList;
+ QCString m_letter;
+ const SearchIndexList &m_searchList;
QCString m_name;
struct Cachable
{
@@ -9901,10 +9764,10 @@ class SymbolIndexContext::Private
PropertyMapper<SymbolIndexContext::Private> SymbolIndexContext::Private::s_inst;
-SymbolIndexContext::SymbolIndexContext(const SearchIndexList *sl,const QCString &name)
+SymbolIndexContext::SymbolIndexContext(const std::string &letter,const SearchIndexList &sl,const QCString &name)
: RefCountedContext("SymbolIndexContext")
{
- p = new Private(sl,name);
+ p = new Private(letter,sl,name);
}
SymbolIndexContext::~SymbolIndexContext()
@@ -9923,19 +9786,17 @@ TemplateVariant SymbolIndexContext::get(const char *name) const
class SymbolIndicesContext::Private : public GenericNodeListContext
{
public:
- Private(const SearchIndexInfo *info)
+ Private(const SearchIndexInfo &info)
{
// use info->symbolList to populate the list
- SIntDict<SearchIndexList>::Iterator it(info->symbolList);
- const SearchIndexList *sl;
- for (it.toFirst();(sl=it.current());++it) // for each letter
+ for (const auto &kv : info.symbolMap)
{
- append(SymbolIndexContext::alloc(sl,info->name));
+ append(SymbolIndexContext::alloc(kv.first,kv.second,info.name));
}
}
};
-SymbolIndicesContext::SymbolIndicesContext(const SearchIndexInfo *info) : RefCountedContext("SymbolIndicesContext")
+SymbolIndicesContext::SymbolIndicesContext(const SearchIndexInfo &info) : RefCountedContext("SymbolIndicesContext")
{
p = new Private(info);
}
@@ -9946,12 +9807,12 @@ SymbolIndicesContext::~SymbolIndicesContext()
}
// TemplateListIntf
-int SymbolIndicesContext::count() const
+uint SymbolIndicesContext::count() const
{
return p->count();
}
-TemplateVariant SymbolIndicesContext::at(int index) const
+TemplateVariant SymbolIndicesContext::at(uint index) const
{
return p->at(index);
}
@@ -9968,7 +9829,7 @@ TemplateListIntf::ConstIterator *SymbolIndicesContext::createIterator() const
class SearchIndexContext::Private
{
public:
- Private(const SearchIndexInfo *info) : m_info(info)
+ Private(const SearchIndexInfo &info) : m_info(info)
{
static bool init=FALSE;
if (!init)
@@ -9985,11 +9846,11 @@ class SearchIndexContext::Private
}
TemplateVariant name() const
{
- return m_info->name;
+ return m_info.name;
}
TemplateVariant text() const
{
- return m_info->text;
+ return m_info.getText();
}
TemplateVariant symbolIndices() const
{
@@ -10000,7 +9861,7 @@ class SearchIndexContext::Private
return m_cache.symbolIndices.get();
}
private:
- const SearchIndexInfo *m_info;
+ const SearchIndexInfo &m_info;
struct Cachable
{
SharedPtr<SymbolIndicesContext> symbolIndices;
@@ -10012,7 +9873,7 @@ class SearchIndexContext::Private
PropertyMapper<SearchIndexContext::Private> SearchIndexContext::Private::s_inst;
-SearchIndexContext::SearchIndexContext(const SearchIndexInfo *info)
+SearchIndexContext::SearchIndexContext(const SearchIndexInfo &info)
: RefCountedContext("SearchIndexContext")
{
p = new Private(info);
@@ -10036,10 +9897,9 @@ class SearchIndicesContext::Private : public GenericNodeListContext
public:
Private()
{
- const SearchIndexInfo *indices = getSearchIndices();
- for (int i=0;i<NUM_SEARCH_INDICES;i++)
+ for (const auto &si : getSearchIndices())
{
- append(SearchIndexContext::alloc(&indices[i]));
+ append(SearchIndexContext::alloc(si));
}
}
};
@@ -10055,12 +9915,12 @@ SearchIndicesContext::~SearchIndicesContext()
}
// TemplateListIntf
-int SearchIndicesContext::count() const
+uint SearchIndicesContext::count() const
{
return p->count();
}
-TemplateVariant SearchIndicesContext::at(int index) const
+TemplateVariant SearchIndicesContext::at(uint index) const
{
return p->at(index);
}
@@ -10229,8 +10089,8 @@ void generateOutputViaTemplate()
SharedPtr<DirListContext> dirList (DirListContext::alloc());
SharedPtr<FileListContext> fileList (FileListContext::alloc());
SharedPtr<FileTreeContext> fileTree (FileTreeContext::alloc());
- SharedPtr<PageTreeContext> pageTree (PageTreeContext::alloc(Doxygen::pageSDict));
- SharedPtr<PageListContext> pageList (PageListContext::alloc(Doxygen::pageSDict));
+ SharedPtr<PageTreeContext> pageTree (PageTreeContext::alloc(*Doxygen::pageLinkedMap));
+ SharedPtr<PageListContext> pageList (PageListContext::alloc(*Doxygen::pageLinkedMap));
SharedPtr<ExampleTreeContext> exampleTree (ExampleTreeContext::alloc());
SharedPtr<ExampleListContext> exampleList (ExampleListContext::alloc());
SharedPtr<ModuleTreeContext> moduleTree (ModuleTreeContext::alloc());
@@ -10279,15 +10139,15 @@ void generateOutputViaTemplate()
//%% Page mainPage
if (Doxygen::mainPage)
{
- SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE,FALSE));
+ SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage.get(),TRUE,FALSE));
ctx->set("mainPage",mainPage.get());
}
else
{
// TODO: for LaTeX output index should be main... => solve in template
- Doxygen::mainPage = createPageDef("[generated]",1,"index","",theTranslator->trMainPage());
+ Doxygen::mainPage.reset(createPageDef("[generated]",1,"index","",theTranslator->trMainPage()));
Doxygen::mainPage->setFileName("index");
- SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE,FALSE));
+ SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage.get(),TRUE,FALSE));
ctx->set("mainPage",mainPage.get());
}
//%% GlobalsIndex globalsIndex:
@@ -10349,25 +10209,9 @@ void generateOutputViaTemplate()
}
// clear all cached data in Definition objects.
- QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
- const DefinitionIntf *intf;
- for (;(intf=di.current());++di)
+ for (const auto &kv : Doxygen::symbolMap)
{
- if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
- {
- DefinitionListIterator dli(*dynamic_cast<const DefinitionList*>(intf));
- const Definition *d;
- // for each symbol
- for (dli.toFirst();(d=dli.current());++dli)
- {
- d->setCookie(0);
- }
- }
- else // single symbol
- {
- const Definition *d = dynamic_cast<const Definition *>(intf);
- d->setCookie(0);
- }
+ kv.second->setCookie(0);
}
e.destroyContext(ctx);
@@ -10390,7 +10234,7 @@ void generateTemplateFiles(const char *templateDir)
QCString outDir = QCString(templateDir)+"/html";
if (!thisDir.exists(outDir) && !thisDir.mkdir(outDir))
{
- err("Failed to create output directory '%s'\n",templateDir);
+ err("Failed to create output directory '%s'\n",outDir.data());
return;
}
ResourceMgr::instance().writeCategory("html",outDir);
diff --git a/src/context.h b/src/context.h
index fc1278b..a975d3d 100644
--- a/src/context.h
+++ b/src/context.h
@@ -20,42 +20,42 @@
#include "template.h"
#include <qlist.h>
#include <stdio.h>
+#include "classdef.h"
+#include "searchindex.h"
+#include "membergroup.h"
class Definition;
-class ClassDef;
-class ClassSDict;
-class BaseClassList;
+
class PageDef;
+class PageLinkedMap;
+class PageLinkedRefMap;
+
class GroupDef;
+class GroupLinkedMap;
+class GroupList;
+
class NamespaceDef;
-class BaseClassList;
-class NamespaceSDict;
+class NamespaceLinkedMap;
+class NamespaceLinkedRefMap;
+
+class FileNameLinkedMap;
+class ClassLinkedMap;
+class MemberNameInfoLinkedMap;
+
+class DirDef;
+class DirLinkedMap;
+class DirList;
+
class FileDef;
class FileList;
-class FileNameList;
-class DirSDict;
-class DirList;
-class DirDef;
-class PageSDict;
-class GroupSDict;
-class GroupDef;
-class GroupList;
struct IncludeInfo;
class MemberList;
-class MemberSDict;
class MemberDef;
struct Argument;
class ArgumentList;
-class MemberNameInfoSDict;
-struct MemberInfo;
-class MemberGroup;
-class MemberGroupSDict;
-class MemberGroupList;
+class MemberInfo;
class DotNode;
class DotGfxHierarchyTable;
-struct SearchIndexInfo;
-class SearchIndexList;
-class SearchDefinitionList;
//----------------------------------------------------
@@ -189,8 +189,8 @@ class UsedFilesContext : public RefCountedContext, public TemplateListIntf
static UsedFilesContext *alloc(const ClassDef *cd) { return new UsedFilesContext(cd); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -234,8 +234,8 @@ class IncludeInfoListContext : public RefCountedContext, public TemplateListIntf
{ return new IncludeInfoListContext(list,lang); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -348,7 +348,7 @@ class PageContext : public RefCountedContext, public TemplateStructIntf
class MemberContext : public RefCountedContext, public TemplateStructIntf
{
public:
- static MemberContext *alloc(MemberDef *md) { return new MemberContext(md); }
+ static MemberContext *alloc(const MemberDef *md) { return new MemberContext(md); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
@@ -356,7 +356,7 @@ class MemberContext : public RefCountedContext, public TemplateStructIntf
virtual int release() { return RefCountedContext::release(); }
private:
- MemberContext(MemberDef *);
+ MemberContext(const MemberDef *);
~MemberContext();
class Private;
Private *p;
@@ -390,8 +390,8 @@ class ClassListContext : public RefCountedContext, public TemplateListIntf
static ClassListContext *alloc() { return new ClassListContext; }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -455,7 +455,7 @@ class ClassInheritanceNodeContext : public RefCountedContext, public TemplateStr
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
- void addChildren(const BaseClassList *bcl,bool hideSuper);
+ void addChildren(const BaseClassList &bcl,bool hideSuper);
private:
ClassInheritanceNodeContext(const ClassDef *);
@@ -472,8 +472,8 @@ class ClassInheritanceContext : public RefCountedContext, public TemplateListInt
static ClassInheritanceContext *alloc() { return new ClassInheritanceContext; }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -510,8 +510,9 @@ class NestingNodeContext : public RefCountedContext, public TemplateStructIntf
{
public:
static NestingNodeContext *alloc(const NestingNodeContext *parent,const Definition *def,
- int index,int level,bool addClasses,bool inherit,bool hideSuper)
- { return new NestingNodeContext(parent,def,index,level,addClasses,inherit,hideSuper); }
+ int index,int level,bool addClasses,bool inherit,bool hideSuper,
+ ClassDefSet &visitedClasses)
+ { return new NestingNodeContext(parent,def,index,level,addClasses,inherit,hideSuper,visitedClasses); }
QCString id() const;
@@ -522,7 +523,8 @@ class NestingNodeContext : public RefCountedContext, public TemplateStructIntf
private:
NestingNodeContext(const NestingNodeContext *parent,
- const Definition *,int index,int level,bool addClasses,bool inherit,bool hideSuper);
+ const Definition *,int index,int level,bool addClasses,bool inherit,bool hideSuper,
+ ClassDefSet &visitedClasses);
~NestingNodeContext();
class Private;
Private *p;
@@ -533,27 +535,31 @@ class NestingNodeContext : public RefCountedContext, public TemplateStructIntf
class NestingContext : public RefCountedContext, public TemplateListIntf
{
public:
+
static NestingContext *alloc(const NestingNodeContext *parent,int level)
{ return new NestingContext(parent,level); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
- void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses);
- void addClasses(const ClassSDict &clDict,bool rootOnly);
- void addDirs(const DirSDict &);
- void addDirs(const DirList &);
- void addFiles(const FileNameList &);
- void addFiles(const FileList &);
- void addPages(const PageSDict &pages,bool rootOnly);
- void addModules(const GroupSDict &modules);
- void addModules(const GroupList &modules);
- void addClassHierarchy(const ClassSDict &clDict,bool rootOnly);
- void addDerivedClasses(const BaseClassList *bcl,bool hideSuper);
+ void addNamespaces(const NamespaceLinkedMap &nsLinkedMap,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses);
+ void addNamespaces(const NamespaceLinkedRefMap &nsLinkedMap,bool rootOnly,bool addClasses,ClassDefSet &visitedClasses);
+ void addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses);
+ void addClasses(const ClassLinkedRefMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses);
+ void addDirs(const DirLinkedMap &,ClassDefSet &visitedClasses);
+ void addDirs(const DirList &,ClassDefSet &visitedClasses);
+ void addFiles(const FileNameLinkedMap &,ClassDefSet &visitedClasses);
+ void addFiles(const FileList &,ClassDefSet &visitedClasses);
+ void addPages(const PageLinkedMap &pages,bool rootOnly,ClassDefSet &visitedClasses);
+ void addPages(const PageLinkedRefMap &pages,bool rootOnly,ClassDefSet &visitedClasses);
+ void addModules(const GroupLinkedMap &modules,ClassDefSet &visitedClasses);
+ void addModules(const GroupList &modules,ClassDefSet &visitedClasses);
+ void addClassHierarchy(const ClassLinkedMap &clLinkedMap,ClassDefSet &visitedClasses);
+ void addDerivedClasses(const BaseClassList &bcl,bool hideSuper,ClassDefSet &visitedClasses);
private:
NestingContext(const NestingNodeContext *parent,int level);
@@ -589,8 +595,8 @@ class NamespaceListContext : public RefCountedContext, public TemplateListIntf
static NamespaceListContext *alloc() { return new NamespaceListContext; }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -629,8 +635,8 @@ class DirListContext : public RefCountedContext, public TemplateListIntf
static DirListContext *alloc() { return new DirListContext; }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -650,8 +656,8 @@ class FileListContext : public RefCountedContext, public TemplateListIntf
static FileListContext *alloc() { return new FileListContext; }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -687,19 +693,19 @@ class FileTreeContext : public RefCountedContext, public TemplateStructIntf
class PageListContext : public RefCountedContext, public TemplateListIntf
{
public:
- static PageListContext *alloc(const PageSDict *pages) { return new PageListContext(pages); }
+ static PageListContext *alloc(const PageLinkedMap &pages) { return new PageListContext(pages); }
// TemplateListIntf methods
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
- void addPages(const PageSDict &pages);
+ void addPages(const PageLinkedMap &pages);
private:
- PageListContext(const PageSDict *pages);
+ PageListContext(const PageLinkedMap &pages);
~PageListContext();
class Private;
Private *p;
@@ -710,7 +716,7 @@ class PageListContext : public RefCountedContext, public TemplateListIntf
class PageTreeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- static PageTreeContext *alloc(const PageSDict *pages) { return new PageTreeContext(pages); }
+ static PageTreeContext *alloc(const PageLinkedMap &pages) { return new PageTreeContext(pages); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
@@ -718,7 +724,7 @@ class PageTreeContext : public RefCountedContext, public TemplateStructIntf
virtual int release() { return RefCountedContext::release(); }
private:
- PageTreeContext(const PageSDict *pages);
+ PageTreeContext(const PageLinkedMap &pages);
~PageTreeContext();
class Private;
Private *p;
@@ -751,13 +757,13 @@ class ModuleListContext : public RefCountedContext, public TemplateListIntf
static ModuleListContext *alloc() { return new ModuleListContext(); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
- void addModules(const GroupSDict &);
+ void addModules(const GroupLinkedMap &);
void addModules(const GroupList &);
private:
@@ -794,8 +800,8 @@ class ExampleListContext : public RefCountedContext, public TemplateListIntf
static ExampleListContext *alloc() { return new ExampleListContext; }
// TemplateListIntf methods
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -929,18 +935,18 @@ class InheritanceNodeContext : public RefCountedContext, public TemplateStructIn
class InheritanceListContext : public RefCountedContext, public TemplateListIntf
{
public:
- static InheritanceListContext *alloc(const BaseClassList *list,bool baseClasses)
+ static InheritanceListContext *alloc(const BaseClassList &list,bool baseClasses)
{ return new InheritanceListContext(list,baseClasses); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private:
- InheritanceListContext(const BaseClassList *list,bool baseClasses);
+ InheritanceListContext(const BaseClassList &list,bool baseClasses);
~InheritanceListContext();
class Private;
Private *p;
@@ -955,12 +961,12 @@ class MemberListContext : public RefCountedContext, public TemplateListIntf
{ return new MemberListContext; }
static MemberListContext *alloc(const MemberList *ml)
{ return new MemberListContext(ml); }
- static MemberListContext *alloc(MemberSDict *ml,bool doSort)
- { return new MemberListContext(ml,doSort); }
+ static MemberListContext *alloc(std::vector<const MemberDef *> &&ml)
+ { return new MemberListContext(std::move(ml)); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -968,7 +974,7 @@ class MemberListContext : public RefCountedContext, public TemplateListIntf
private:
MemberListContext();
MemberListContext(const MemberList *ml);
- MemberListContext(MemberSDict *ml,bool doSort);
+ MemberListContext(std::vector<const MemberDef *> &&ml);
~MemberListContext();
class Private;
Private *p;
@@ -1001,22 +1007,22 @@ class MemberGroupListContext : public RefCountedContext, public TemplateListIntf
public:
static MemberGroupListContext *alloc()
{ return new MemberGroupListContext; }
- static MemberGroupListContext *alloc(const Definition *def,const QCString &relPath,const MemberGroupList *list)
+ static MemberGroupListContext *alloc(const Definition *def,const QCString &relPath,const MemberGroupRefList &list)
{ return new MemberGroupListContext(def,relPath,list); }
- static MemberGroupListContext *alloc(const Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping)
- { return new MemberGroupListContext(def,relPath,dict,subGrouping); }
+ static MemberGroupListContext *alloc(const Definition *def,const QCString &relPath,const MemberGroupList &list,bool subGrouping)
+ { return new MemberGroupListContext(def,relPath,list,subGrouping); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private:
MemberGroupListContext();
- MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupList *list);
- MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupSDict *mgDict,bool subGrouping);
+ MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupRefList &list);
+ MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupList &list,bool subGrouping);
~MemberGroupListContext();
class Private;
Private *p;
@@ -1095,8 +1101,8 @@ class InheritedMemberInfoListContext : public RefCountedContext, public Template
void addMemberList(const ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList=TRUE);
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -1113,21 +1119,18 @@ class InheritedMemberInfoListContext : public RefCountedContext, public Template
class AllMembersListContext : public RefCountedContext, public TemplateListIntf
{
public:
- static AllMembersListContext *alloc()
- { return new AllMembersListContext; }
- static AllMembersListContext *alloc(const MemberNameInfoSDict *ml)
+ static AllMembersListContext *alloc(const MemberNameInfoLinkedMap &ml)
{ return new AllMembersListContext(ml); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private:
- AllMembersListContext();
- AllMembersListContext(const MemberNameInfoSDict *ml);
+ AllMembersListContext(const MemberNameInfoLinkedMap &ml);
~AllMembersListContext();
class Private;
Private *p;
@@ -1163,8 +1166,8 @@ class ArgumentListContext : public RefCountedContext, public TemplateListIntf
{ return new ArgumentListContext(al,def,relPath); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
@@ -1202,18 +1205,20 @@ class SymbolContext : public RefCountedContext, public TemplateStructIntf
class SymbolListContext : public RefCountedContext, public TemplateListIntf
{
public:
- static SymbolListContext *alloc(const SearchDefinitionList *sdl)
- { return new SymbolListContext(sdl); }
+ static SymbolListContext *alloc(const SearchIndexList::const_iterator &start,
+ const SearchIndexList::const_iterator &end)
+ { return new SymbolListContext(start,end); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private:
- SymbolListContext(const SearchDefinitionList *sdl);
+ SymbolListContext(const SearchIndexList::const_iterator &start,
+ const SearchIndexList::const_iterator &end);
~SymbolListContext();
class Private;
Private *p;
@@ -1224,8 +1229,9 @@ class SymbolListContext : public RefCountedContext, public TemplateListIntf
class SymbolGroupContext : public RefCountedContext, public TemplateStructIntf
{
public:
- static SymbolGroupContext *alloc(const SearchDefinitionList *sdl)
- { return new SymbolGroupContext(sdl); }
+ static SymbolGroupContext *alloc(const SearchIndexList::const_iterator &start,
+ const SearchIndexList::const_iterator &end)
+ { return new SymbolGroupContext(start,end); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
@@ -1233,7 +1239,8 @@ class SymbolGroupContext : public RefCountedContext, public TemplateStructIntf
virtual int release() { return RefCountedContext::release(); }
private:
- SymbolGroupContext(const SearchDefinitionList *sdl);
+ SymbolGroupContext(const SearchIndexList::const_iterator &start,
+ const SearchIndexList::const_iterator &end);
~SymbolGroupContext();
class Private;
Private *p;
@@ -1244,18 +1251,18 @@ class SymbolGroupContext : public RefCountedContext, public TemplateStructIntf
class SymbolGroupListContext : public RefCountedContext, public TemplateListIntf
{
public:
- static SymbolGroupListContext *alloc(const SearchIndexList *sil)
+ static SymbolGroupListContext *alloc(const SearchIndexList &sil)
{ return new SymbolGroupListContext(sil); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private:
- SymbolGroupListContext(const SearchIndexList *sil);
+ SymbolGroupListContext(const SearchIndexList &sil);
~SymbolGroupListContext();
class Private;
Private *p;
@@ -1266,8 +1273,9 @@ class SymbolGroupListContext : public RefCountedContext, public TemplateListIntf
class SymbolIndexContext : public RefCountedContext, public TemplateStructIntf
{
public:
- static SymbolIndexContext *alloc(const SearchIndexList *sl,const QCString &name)
- { return new SymbolIndexContext(sl,name); }
+ static SymbolIndexContext *alloc(const std::string &letter,
+ const SearchIndexList &sl,const QCString &name)
+ { return new SymbolIndexContext(letter,sl,name); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
@@ -1275,7 +1283,7 @@ class SymbolIndexContext : public RefCountedContext, public TemplateStructIntf
virtual int release() { return RefCountedContext::release(); }
private:
- SymbolIndexContext(const SearchIndexList *sl,const QCString &name);
+ SymbolIndexContext(const std::string &letter,const SearchIndexList &sl,const QCString &name);
~SymbolIndexContext();
class Private;
Private *p;
@@ -1286,18 +1294,18 @@ class SymbolIndexContext : public RefCountedContext, public TemplateStructIntf
class SymbolIndicesContext : public RefCountedContext, public TemplateListIntf
{
public:
- static SymbolIndicesContext *alloc(const SearchIndexInfo *info)
+ static SymbolIndicesContext *alloc(const SearchIndexInfo &info)
{ return new SymbolIndicesContext(info); }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
private:
- SymbolIndicesContext(const SearchIndexInfo *info);
+ SymbolIndicesContext(const SearchIndexInfo &info);
~SymbolIndicesContext();
class Private;
Private *p;
@@ -1308,7 +1316,7 @@ class SymbolIndicesContext : public RefCountedContext, public TemplateListIntf
class SearchIndexContext : public RefCountedContext, public TemplateStructIntf
{
public:
- static SearchIndexContext *alloc(const SearchIndexInfo *info)
+ static SearchIndexContext *alloc(const SearchIndexInfo &info)
{ return new SearchIndexContext(info); }
// TemplateStructIntf methods
@@ -1317,7 +1325,7 @@ class SearchIndexContext : public RefCountedContext, public TemplateStructIntf
virtual int release() { return RefCountedContext::release(); }
private:
- SearchIndexContext(const SearchIndexInfo *info);
+ SearchIndexContext(const SearchIndexInfo &info);
~SearchIndexContext();
class Private;
Private *p;
@@ -1331,8 +1339,8 @@ class SearchIndicesContext : public RefCountedContext, public TemplateListIntf
static SearchIndicesContext *alloc() { return new SearchIndicesContext; }
// TemplateListIntf
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef() { return RefCountedContext::addRef(); }
virtual int release() { return RefCountedContext::release(); }
diff --git a/src/debug.cpp b/src/debug.cpp
index 4c7afb3..f56ef3a 100644
--- a/src/debug.cpp
+++ b/src/debug.cpp
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,68 +14,38 @@
*/
#include <stdarg.h>
+#include <algorithm>
#include <stdio.h>
-
-#include <qdict.h>
+#include <map>
+#include <string>
+#include <chrono>
#include "debug.h"
#include "message.h"
//------------------------------------------------------------------------
-/** Helper struct representing a mapping from debug label to a debug ID */
-struct LabelMap
-{
- const char *name;
- Debug::DebugMask event;
-};
-
-static LabelMap s_labels[] =
+static std::map< std::string, Debug::DebugMask > s_labels =
{
- { "findmembers", Debug::FindMembers },
- { "functions", Debug::Functions },
- { "variables", Debug::Variables },
- { "preprocessor", Debug::Preprocessor },
- { "classes", Debug::Classes },
- { "commentcnv", Debug::CommentCnv },
- { "commentscan", Debug::CommentScan },
- { "validate", Debug::Validate },
- { "printtree", Debug::PrintTree },
- { "time", Debug::Time },
- { "extcmd", Debug::ExtCmd },
- { "markdown", Debug::Markdown },
- { "filteroutput", Debug::FilterOutput },
- { "lex", Debug::Lex },
- { "plantuml", Debug::Plantuml },
+ { "findmembers", Debug::FindMembers },
+ { "functions", Debug::Functions },
+ { "variables", Debug::Variables },
+ { "preprocessor", Debug::Preprocessor },
+ { "classes", Debug::Classes },
+ { "commentcnv", Debug::CommentCnv },
+ { "commentscan", Debug::CommentScan },
+ { "validate", Debug::Validate },
+ { "printtree", Debug::PrintTree },
+ { "time", Debug::Time },
+ { "extcmd", Debug::ExtCmd },
+ { "markdown", Debug::Markdown },
+ { "filteroutput", Debug::FilterOutput },
+ { "lex", Debug::Lex },
+ { "plantuml", Debug::Plantuml },
{ "fortranfixed2free", Debug::FortranFixed2Free },
- { 0, (Debug::DebugMask)0 }
-};
-
-/** Class representing a mapping from debug labels to debug IDs. */
-class LabelMapper
-{
- public:
- LabelMapper() : m_map(17)
- {
- m_map.setAutoDelete(TRUE);
- LabelMap *p = s_labels;
- while (p->name)
- {
- m_map.insert(p->name,new Debug::DebugMask(p->event));
- p++;
- }
- }
- Debug::DebugMask *find(const char *s) const
- {
- if (s==0) return 0;
- return m_map.find(s);
- }
- private:
- QDict<Debug::DebugMask> m_map;
+ { "cite", Debug::Cite }
};
-static LabelMapper g_labelMapper;
-
//------------------------------------------------------------------------
Debug::DebugMask Debug::curMask = Debug::Quiet;
@@ -94,17 +62,24 @@ void Debug::print(DebugMask mask,int prio,const char *fmt,...)
}
}
+static char asciiToLower(char in) {
+ if (in <= 'Z' && in >= 'A')
+ return in - ('Z' - 'z');
+ return in;
+}
+
static int labelToEnumValue(const char *l)
{
- QCString label=l;
- Debug::DebugMask *event = g_labelMapper.find(label.lower());
- if (event) return *event; else return 0;
+ std::string s = l;
+ std::transform(s.begin(),s.end(),s.begin(),asciiToLower);
+ auto it = s_labels.find(s);
+ return (it!=s_labels.end()) ? it->second : 0;
}
int Debug::setFlag(const char *lab)
{
int retVal = labelToEnumValue(lab);
- curMask = (DebugMask)(curMask | labelToEnumValue(lab));
+ curMask = (DebugMask)(curMask | labelToEnumValue(lab));
return retVal;
}
@@ -123,14 +98,42 @@ bool Debug::isFlagSet(DebugMask mask)
return (curMask & mask)!=0;
}
-void Debug::printFlags(void)
+void Debug::printFlags()
{
- int i;
- for (i = 0; i < (int)(sizeof(s_labels)/sizeof(*s_labels)); i++)
+ for (const auto &v : s_labels)
{
- if (s_labels[i].name)
- {
- msg("\t%s\n",s_labels[i].name);
- }
+ msg("\t%s\n",v.first.c_str());
}
}
+
+//------------------------------------------------------------------------
+
+class Timer
+{
+ public:
+ void start()
+ {
+ m_startTime = std::chrono::system_clock::now();
+ }
+ double elapsedTimeS()
+ {
+ return (std::chrono::duration_cast<
+ std::chrono::milliseconds>(
+ std::chrono::system_clock::now() - m_startTime).count()) / 1000.0;
+ }
+ private:
+ std::chrono::time_point<std::chrono::system_clock> m_startTime;
+};
+
+static Timer g_runningTime;
+
+void Debug::startTimer()
+{
+ g_runningTime.start();
+}
+
+double Debug::elapsedTime()
+{
+ return g_runningTime.elapsedTimeS();
+}
+
diff --git a/src/debug.h b/src/debug.h
index 79bc3d8..e71595f 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -24,8 +21,8 @@ class Debug
{
public:
enum DebugMask { Quiet = 0x00000000,
- FindMembers = 0x00000001,
- Functions = 0x00000002,
+ FindMembers = 0x00000001,
+ Functions = 0x00000002,
Variables = 0x00000004,
Preprocessor = 0x00000008,
Classes = 0x00000010,
@@ -39,15 +36,20 @@ class Debug
FilterOutput = 0x00001000,
Lex = 0x00002000,
Plantuml = 0x00004000,
- FortranFixed2Free = 0x00008000
+ FortranFixed2Free = 0x00008000,
+ Cite = 0x00010000
};
static void print(DebugMask mask,int prio,const char *fmt,...);
+
static int setFlag(const char *label);
static void clearFlag(const char *label);
static bool isFlagSet(DebugMask mask);
- static void printFlags(void);
+ static void printFlags();
static void setPriority(int p);
-
+
+ static void startTimer();
+ static double elapsedTime();
+
private:
static DebugMask curMask;
static int curPrio;
diff --git a/src/declinfo.l b/src/declinfo.l
index af94569..014ef75 100644
--- a/src/declinfo.l
+++ b/src/declinfo.l
@@ -20,6 +20,9 @@
%option noyywrap
%option reentrant
%option extra-type="struct declinfoYY_state *"
+%top{
+#include <stdint.h>
+}
%{
@@ -39,7 +42,9 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
#define YY_NEVER_INTERACTIVE 1
-
+
+#define USE_STATE2STRING 0
+
/* -----------------------------------------------------------------
*
* statics
@@ -63,10 +68,13 @@ struct declinfoYY_state
bool insidePHP;
};
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
+
static void addType(yyscan_t yyscanner);
static void addTypeName(yyscan_t yyscanner);
-static int yyread(char *buf,int max_size, yyscan_t yyscanner);
+static yy_size_t yyread(char *buf,yy_size_t max_size, yyscan_t yyscanner);
/* -----------------------------------------------------------------
*/
@@ -141,6 +149,7 @@ ID "$"?([a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*)|(@[0-9]+)
addType(yyscanner);
}
<Start>{B}*"("({ID}"::")*{B}*[&*]({B}*("const"|"volatile"){B}+)? {
+ if (yyextra->insidePHP) REJECT;
addType(yyscanner);
QCString text=yytext;
yyextra->type+=text.stripWhiteSpace();
@@ -234,16 +243,16 @@ static void addTypeName(yyscan_t yyscanner)
yyextra->name.resize(0);
}
-static int yyread(char *buf,int max_size, yyscan_t yyscanner)
+static yy_size_t yyread(char *buf,yy_size_t max_size, yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- int c=0;
- while( c < max_size && yyextra->inputString[yyextra->inputPosition] )
- {
- *buf = yyextra->inputString[yyextra->inputPosition++] ;
- c++; buf++;
- }
- return c;
+ yy_size_t c=0;
+ while( c < max_size && yyextra->inputString[yyextra->inputPosition] )
+ {
+ *buf = yyextra->inputString[yyextra->inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
}
/*@ public interface------------------------------------------------------------
@@ -380,5 +389,6 @@ int main()
}
#endif
-
+#if USE_STATE2STRING
#include "declinfo.l.h"
+#endif
diff --git a/src/defargs.h b/src/defargs.h
index 4a38723..589eb90 100644
--- a/src/defargs.h
+++ b/src/defargs.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,11 +19,13 @@
#define DEFARGS_H
#include "types.h"
+#include <memory>
class ArgumentList;
class QCString;
-extern void stringToArgumentList(SrcLangExt lang, const char *argsString,ArgumentList& argList,
- QCString *extraTypeChars=0);
+std::unique_ptr<ArgumentList> stringToArgumentList(SrcLangExt lang,
+ const char *argsString,
+ QCString *extraTypeChars=0);
#endif
diff --git a/src/defargs.l b/src/defargs.l
index e9dd60e..e25c1fe 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -43,6 +43,9 @@
%option prefix="defargsYY"
%option reentrant
%option extra-type="struct defargsYY_state *"
+%top{
+#include <stdint.h>
+}
%{
@@ -64,16 +67,18 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
+
+#define USE_STATE2STRING 0
/* -----------------------------------------------------------------
* state variables
*/
struct defargsYY_state
{
- defargsYY_state(const char *inStr,ArgumentList &al,SrcLangExt l)
+ defargsYY_state(const char *inStr,std::unique_ptr<ArgumentList> &al,SrcLangExt l)
: inputString(inStr), argList(al), lang(l) {}
const char *inputString;
- ArgumentList &argList;
+ std::unique_ptr<ArgumentList> &argList;
SrcLangExt lang;
int inputPosition = 0;
QCString *copyArgValue = 0;
@@ -95,8 +100,11 @@ struct defargsYY_state
QCString delimiter;
};
+#if USE_STATE2STRING
static const char *stateToString(int state);
-static int yyread(yyscan_t yyscanner,char *buf,int max_size);
+#endif
+
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
static bool nameIsActuallyPartOfType(QCString &name);
/* -----------------------------------------------------------------
@@ -417,7 +425,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
if (alen>2 && a.array.at(0)=='(' &&
a.array.at(alen-1)==')') // fix-up for int *(a[10])
{
- int i=a.array.find('[')-1;
+ i=a.array.find('[')-1;
a.array = a.array.mid(1,alen-2);
if (i>0 && a.name.isEmpty())
{
@@ -429,7 +437,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
//printf("a->type=%s a->name=%s a->defval=\"%s\"\n",a->type.data(),a->name.data(),a->defval.data());
a.docs = yyextra->curArgDocs.stripWhiteSpace();
//printf("Argument '%s' '%s' adding docs='%s'\n",a->type.data(),a->name.data(),a->docs.data());
- yyextra->argList.push_back(a);
+ yyextra->argList->push_back(a);
}
yyextra->curArgAttrib.resize(0);
yyextra->curArgTypeName.resize(0);
@@ -498,23 +506,25 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
yyextra->curTypeConstraint+=' ';
}
<FuncQual>"const" {
- yyextra->argList.constSpecifier=TRUE;
+ yyextra->argList->setConstSpecifier(TRUE);
}
<FuncQual>"volatile" {
- yyextra->argList.volatileSpecifier=TRUE;
+ yyextra->argList->setVolatileSpecifier(TRUE);
}
+<FuncQual>"override" {
+ }
<FuncQual>"&" {
- yyextra->argList.refQualifier=RefQualifierLValue;
+ yyextra->argList->setRefQualifier(RefQualifierLValue);
}
<FuncQual>"&&" {
- yyextra->argList.refQualifier=RefQualifierRValue;
+ yyextra->argList->setRefQualifier(RefQualifierRValue);
}
<FuncQual,TrailingReturn>"="{B}*"0" {
- yyextra->argList.pureSpecifier=TRUE;
+ yyextra->argList->setPureSpecifier(TRUE);
BEGIN(FuncQual);
}
<FuncQual>"->" { // C++11 trailing return type
- yyextra->argList.trailingReturnType=" -> ";
+ yyextra->argList->setTrailingReturnType(" -> ");
BEGIN(TrailingReturn);
}
<TrailingReturn>{B}/("final"|"override"){B}* {
@@ -522,10 +532,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
BEGIN(FuncQual);
}
<TrailingReturn>. {
- yyextra->argList.trailingReturnType+=yytext;
+ yyextra->argList->setTrailingReturnType(yyextra->argList->trailingReturnType()+yytext);
}
<TrailingReturn>\n {
- yyextra->argList.trailingReturnType+=yytext;
+ yyextra->argList->setTrailingReturnType(yyextra->argList->trailingReturnType()+yytext);
}
<FuncQual>")"{B}*"["[^]]*"]" { // for functions returning a pointer to an array,
// i.e. ")[]" in "int (*f(int))[4]" with argsString="(int))[4]"
@@ -569,10 +579,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
/* ----------------------------------------------------------------------------
*/
-static int yyread(yyscan_t yyscanner,char *buf,int max_size)
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- int c=0;
+ yy_size_t c=0;
while( c < max_size && yyextra->inputString[yyextra->inputPosition] )
{
*buf = yyextra->inputString[yyextra->inputPosition++] ;
@@ -634,13 +644,13 @@ void
class KeywordHash
{
private:
- static inline unsigned int hash (const char *str, size_t len);
+ static inline unsigned int hash (const char *str, unsigned int len);
public:
- static const char *find (const char *str, size_t len);
+ static const char *find (const char *str, unsigned int len);
};
inline unsigned int
-KeywordHash::hash (const char *str, size_t len)
+KeywordHash::hash (const char *str, unsigned int len)
{
static const unsigned char asso_values[] =
{
@@ -688,7 +698,7 @@ KeywordHash::hash (const char *str, size_t len)
}
const char *
-KeywordHash::find (const char *str, size_t len)
+KeywordHash::find (const char *str, unsigned int len)
{
static const char * const wordlist[] =
{
@@ -760,9 +770,10 @@ static bool nameIsActuallyPartOfType(QCString &name)
* for complex types are written to
*/
-void stringToArgumentList(SrcLangExt lang, const char *argsString,ArgumentList& al,QCString *extraTypeChars)
+std::unique_ptr<ArgumentList> stringToArgumentList(SrcLangExt lang, const char *argsString,QCString *extraTypeChars)
{
- if (argsString==0) return;
+ std::unique_ptr<ArgumentList> al = std::make_unique<ArgumentList>();
+ if (argsString==0) return al;
yyscan_t yyscanner;
defargsYY_state extra(argsString,al,lang);
@@ -776,14 +787,17 @@ void stringToArgumentList(SrcLangExt lang, const char *argsString,ArgumentList&
defargsYYrestart( 0, yyscanner );
BEGIN( Start );
defargsYYlex(yyscanner);
- if (yyextra->argList.empty())
+ if (yyextra->argList->empty())
{
- yyextra->argList.noParameters = TRUE;
+ yyextra->argList->setNoParameters(TRUE);
}
if (extraTypeChars) *extraTypeChars=yyextra->extraTypeChars;
- //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data());
+ //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(*al).data());
printlex(yy_flex_debug, FALSE, __FILE__, NULL);
defargsYYlex_destroy(yyscanner);
+ return al;
}
+#if USE_STATE2STRING
#include "defargs.l.h"
+#endif
diff --git a/src/defgen.cpp b/src/defgen.cpp
index cc3d5af..89f7568 100644
--- a/src/defgen.cpp
+++ b/src/defgen.cpp
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -71,14 +71,14 @@ void generateDEFForMember(MemberDef *md,
// + source definition
// - source references
// - source referenced by
- // - include code
+ // - include code
if (md->memberType()==MemberType_EnumValue) return;
QCString scopeName;
- if (md->getClassDef())
+ if (md->getClassDef())
scopeName=md->getClassDef()->name();
- else if (md->getNamespaceDef())
+ else if (md->getNamespaceDef())
scopeName=md->getNamespaceDef()->name();
t << " " << Prefix << "-member = {" << endl;
@@ -145,8 +145,7 @@ void generateDEFForMember(MemberDef *md,
if (isFunc) //function
{
const ArgumentList &defAl = md->argumentList();
- ArgumentList declAl;
- stringToArgumentList(md->getLanguage(),md->argsString(),declAl);
+ ArgumentList declAl = *stringToArgumentList(md->getLanguage(),md->argsString());
QCString fcnPrefix = " " + memPrefix + "param-";
auto defIt = defAl.begin();
@@ -185,7 +184,7 @@ void generateDEFForMember(MemberDef *md,
if (!a.array.isEmpty())
{
t << fcnPrefix << "array = ";
- writeDEFString(t,a.array);
+ writeDEFString(t,a.array);
t << ';' << endl;
}
if (!a.defval.isEmpty())
@@ -244,71 +243,58 @@ void generateDEFForMember(MemberDef *md,
//printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
- MemberSDict *mdict = md->getReferencesMembers();
- if (mdict)
+ QCString refPrefix = " " + memPrefix + "ref-";
+ auto refList = md->getReferencesMembers();
+ for (const auto &rmd : refList)
{
- MemberSDict::Iterator mdi(*mdict);
- MemberDef *rmd;
- QCString refPrefix = " " + memPrefix + "ref-";
-
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
{
- if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
+ t << memPrefix << "referenceto = {" << endl;
+ t << refPrefix << "id = '"
+ << rmd->getBodyDef()->getOutputFileBase()
+ << "_1" // encoded ':' character (see util.cpp:convertNameToFile)
+ << rmd->anchor() << "';" << endl;
+
+ t << refPrefix << "line = '"
+ << rmd->getStartBodyLine() << "';" << endl;
+
+ QCString scope = rmd->getScopeString();
+ QCString name = rmd->name();
+ if (!scope.isEmpty() && scope!=def->name())
{
- t << memPrefix << "referenceto = {" << endl;
- t << refPrefix << "id = '"
- << rmd->getBodyDef()->getOutputFileBase()
- << "_1" // encoded ':' character (see util.cpp:convertNameToFile)
- << rmd->anchor() << "';" << endl;
-
- t << refPrefix << "line = '"
- << rmd->getStartBodyLine() << "';" << endl;
-
- QCString scope = rmd->getScopeString();
- QCString name = rmd->name();
- if (!scope.isEmpty() && scope!=def->name())
- {
- name.prepend(scope+"::");
- }
-
- t << refPrefix << "name = ";
- writeDEFString(t,name);
- t << ';' << endl << " };" << endl;
+ name.prepend(scope+"::");
}
- } /* for (mdi.toFirst...) */
+
+ t << refPrefix << "name = ";
+ writeDEFString(t,name);
+ t << ';' << endl << " };" << endl;
+ }
}
- mdict = md->getReferencedByMembers();
- if (mdict)
+ auto refByList = md->getReferencedByMembers();
+ for (const auto &rmd : refByList)
{
- MemberSDict::Iterator mdi(*mdict);
- MemberDef *rmd;
- QCString refPrefix = " " + memPrefix + "ref-";
-
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
{
- if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
+ t << memPrefix << "referencedby = {" << endl;
+ t << refPrefix << "id = '"
+ << rmd->getBodyDef()->getOutputFileBase()
+ << "_1" // encoded ':' character (see util.cpp:convertNameToFile)
+ << rmd->anchor() << "';" << endl;
+
+ t << refPrefix << "line = '"
+ << rmd->getStartBodyLine() << "';" << endl;
+
+ QCString scope = rmd->getScopeString();
+ QCString name = rmd->name();
+ if (!scope.isEmpty() && scope!=def->name())
{
- t << memPrefix << "referencedby = {" << endl;
- t << refPrefix << "id = '"
- << rmd->getBodyDef()->getOutputFileBase()
- << "_1" // encoded ':' character (see util.cpp:convertNameToFile)
- << rmd->anchor() << "';" << endl;
-
- t << refPrefix << "line = '"
- << rmd->getStartBodyLine() << "';" << endl;
-
- QCString scope = rmd->getScopeString();
- QCString name = rmd->name();
- if (!scope.isEmpty() && scope!=def->name())
- {
- name.prepend(scope+"::");
- }
-
- t << refPrefix << "name = ";
- writeDEFString(t,name);
- t << ';' << endl << " };" << endl;
+ name.prepend(scope+"::");
}
- } /* for (mdi.toFirst...) */
+
+ t << refPrefix << "name = ";
+ writeDEFString(t,name);
+ t << ';' << endl << " };" << endl;
+ }
}
t << " }; /* " << Prefix << "-member */" << endl;
@@ -359,66 +345,54 @@ void generateDEFForClass(ClassDef *cd,FTextStream &t)
t << " cp-id = '" << cd->getOutputFileBase() << "';" << endl;
t << " cp-name = '" << cd->name() << "';" << endl;
- if (cd->baseClasses())
+ for (const auto &bcd : cd->baseClasses())
{
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ t << " cp-ref = {" << endl << " ref-type = base;" << endl;
+ t << " ref-id = '"
+ << bcd.classDef->getOutputFileBase() << "';" << endl;
+ t << " ref-prot = ";
+ switch (bcd.prot)
{
- t << " cp-ref = {" << endl << " ref-type = base;" << endl;
- t << " ref-id = '"
- << bcd->classDef->getOutputFileBase() << "';" << endl;
- t << " ref-prot = ";
- switch (bcd->prot)
- {
- case Public: t << "public;" << endl; break;
- case Package: // package scope is not possible
- case Protected: t << "protected;" << endl; break;
- case Private: t << "private;" << endl; break;
- }
- t << " ref-virt = ";
- switch(bcd->virt)
- {
- case Normal: t << "non-virtual;"; break;
- case Virtual: t << "virtual;"; break;
- case Pure: t << "pure-virtual;"; break;
- }
- t << endl << " };" << endl;
+ case Public: t << "public;" << endl; break;
+ case Package: // package scope is not possible
+ case Protected: t << "protected;" << endl; break;
+ case Private: t << "private;" << endl; break;
+ }
+ t << " ref-virt = ";
+ switch(bcd.virt)
+ {
+ case Normal: t << "non-virtual;"; break;
+ case Virtual: t << "virtual;"; break;
+ case Pure: t << "pure-virtual;"; break;
}
+ t << endl << " };" << endl;
}
- if (cd->subClasses())
+ for (const auto &bcd : cd->subClasses())
{
- BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ t << " cp-ref = {" << endl << " ref-type = derived;" << endl;
+ t << " ref-id = '"
+ << bcd.classDef->getOutputFileBase() << "';" << endl;
+ t << " ref-prot = ";
+ switch (bcd.prot)
{
- t << " cp-ref = {" << endl << " ref-type = derived;" << endl;
- t << " ref-id = '"
- << bcd->classDef->getOutputFileBase() << "';" << endl;
- t << " ref-prot = ";
- switch (bcd->prot)
- {
- case Public: t << "public;" << endl; break;
- case Package: // packet scope is not possible!
- case Protected: t << "protected;" << endl; break;
- case Private: t << "private;" << endl; break;
- }
- t << " ref-virt = ";
- switch(bcd->virt)
- {
- case Normal: t << "non-virtual;"; break;
- case Virtual: t << "virtual;"; break;
- case Pure: t << "pure-virtual;"; break;
- }
- t << endl << " };" << endl;
+ case Public: t << "public;" << endl; break;
+ case Package: // packet scope is not possible!
+ case Protected: t << "protected;" << endl; break;
+ case Private: t << "private;" << endl; break;
+ }
+ t << " ref-virt = ";
+ switch (bcd.virt)
+ {
+ case Normal: t << "non-virtual;"; break;
+ case Virtual: t << "virtual;"; break;
+ case Pure: t << "pure-virtual;"; break;
}
+ t << endl << " };" << endl;
}
int numMembers = 0;
- QListIterator<MemberList> mli(cd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : cd->getMemberLists())
{
if ((ml->listType()&MemberListType_detailedLists)==0)
{
@@ -612,23 +586,17 @@ void generateDEF()
FTextStream t(&f);
t << "AutoGen Definitions dummy;" << endl;
- if (Doxygen::classSDict->count()+Doxygen::inputNameList->count()>0)
+ if (Doxygen::classLinkedMap->size()+Doxygen::inputNameLinkedMap->size()>0)
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- generateDEFForClass(cd,t);
+ generateDEFForClass(cd.get(),t);
}
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
- generateDEFForFile(fd,t);
+ generateDEFForFile(fd.get(),t);
}
}
}
diff --git a/src/define.cpp b/src/define.cpp
deleted file mode 100644
index b5d9170..0000000
--- a/src/define.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include "define.h"
-#include "config.h"
-
-Define::Define()
-{
- fileDef=0;
- lineNr=1;
- columnNr=1;
- nargs=-1;
- undef=FALSE;
- varArgs=FALSE;
- isPredefined=FALSE;
- nonRecursive=FALSE;
-}
-
-Define::Define(const Define &d)
- : name(d.name),definition(d.definition),fileName(d.fileName)
-{
- //name=d.name; definition=d.definition; fileName=d.fileName;
- lineNr=d.lineNr;
- columnNr=d.columnNr;
- nargs=d.nargs;
- undef=d.undef;
- varArgs=d.varArgs;
- isPredefined=d.isPredefined;
- nonRecursive=d.nonRecursive;
- fileDef=0;
-}
-
-Define::~Define()
-{
-}
-
-bool Define::hasDocumentation()
-{
- return definition && (doc || Config_getBool(EXTRACT_ALL));
-}
diff --git a/src/define.h b/src/define.h
index cc1e390..23da59d 100644
--- a/src/define.h
+++ b/src/define.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,8 +16,13 @@
#ifndef DEFINE_H
#define DEFINE_H
-#include <qdict.h>
-#include <qlist.h>
+#include <vector>
+#include <memory>
+#include <string>
+#include <unordered_map>
+
+#include <qcstring.h>
+#include "containers.h"
class FileDef;
@@ -27,73 +30,22 @@ class FileDef;
class Define
{
public:
- Define();
- Define(const Define &d);
- ~Define();
- bool hasDocumentation();
QCString name;
QCString definition;
QCString fileName;
- QCString doc;
- QCString brief;
QCString args;
- QCString anchor;
- FileDef *fileDef;
- int lineNr;
- int columnNr;
- int nargs;
- bool undef;
- bool varArgs;
- bool isPredefined;
- bool nonRecursive;
+ FileDef *fileDef = 0;
+ int lineNr = 1;
+ int columnNr = 1;
+ int nargs = -1;
+ bool undef = FALSE;
+ bool varArgs = FALSE;
+ bool isPredefined = FALSE;
+ bool nonRecursive = FALSE;
};
-/** A list of Define objects. */
-class DefineList : public QList<Define>
-{
- public:
- DefineList() : QList<Define>() {}
- ~DefineList() {}
- private:
- int compareValues(const Define *d1,const Define *d2) const
- {
- return qstricmp(d1->name,d2->name);
- }
-};
-
-/** A list of Define objects associated with a specific name. */
-class DefineName : public QList<Define>
-{
- public:
- DefineName(const char *n) : QList<Define>() { name=n; }
- ~DefineName() {}
- const char *nameString() const { return name; }
-
- private:
- int compareValues(const Define *d1,const Define *d2) const
- {
- return qstricmp(d1->name,d2->name);
- }
- QCString name;
-};
-
-/** A list of DefineName objects. */
-class DefineNameList : public QList<DefineName>
-{
- public:
- DefineNameList() : QList<DefineName>() {}
- ~DefineNameList() {}
- private:
- int compareValues(const DefineName *n1,const DefineName *n2) const
- {
- return qstricmp(n1->nameString(),n2->nameString());
- }
-};
-
-/** An unsorted dictionary of Define objects. */
-typedef QDict<Define> DefineDict;
-
-/** A sorted dictionary of DefineName object. */
-typedef QDict<DefineName> DefineNameDict;
+/** List of all macro definitions */
+using DefineList = std::vector<Define>;
+using DefinesPerFileList = std::unordered_map< std::string, DefineList >;
#endif
diff --git a/src/definition.cpp b/src/definition.cpp
index 7540eff..2a03ef9 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,6 +16,10 @@
*/
#include <algorithm>
+#include <iterator>
+#include <unordered_map>
+#include <string>
+
#include <ctype.h>
#include <qregexp.h>
#include "md5.h"
@@ -44,6 +48,8 @@
#include "dirdef.h"
#include "pagedef.h"
#include "bufstr.h"
+#include "reflist.h"
+
//-----------------------------------------------------------------------------------------
@@ -55,12 +61,14 @@ class DefinitionImpl::IMPL
void init(const char *df, const char *n);
void setDefFileName(const QCString &df);
- SectionDict *sectionDict = 0; // dictionary of all sections, not accessible
+ Definition *def = 0;
- MemberSDict *sourceRefByDict = 0;
- MemberSDict *sourceRefsDict = 0;
- std::vector<ListItemInfo> xrefListItems;
- GroupList *partOfGroups = 0;
+ SectionRefs sectionRefs;
+
+ std::unordered_map<std::string,const MemberDef *> sourceRefByDict;
+ std::unordered_map<std::string,const MemberDef *> sourceRefsDict;
+ RefItemVector xrefListItems;
+ GroupList partOfGroups;
DocInfo *details = 0; // not exported
DocInfo *inbodyDocs = 0; // not exported
@@ -93,16 +101,12 @@ class DefinitionImpl::IMPL
QCString symbolName;
int defLine;
int defColumn;
- Cookie *cookie;
+ Definition::Cookie *cookie;
};
DefinitionImpl::IMPL::~IMPL()
{
- delete sectionDict;
- delete sourceRefByDict;
- delete sourceRefsDict;
- delete partOfGroups;
delete brief;
delete details;
delete body;
@@ -122,8 +126,8 @@ void DefinitionImpl::IMPL::setDefFileName(const QCString &df)
void DefinitionImpl::IMPL::init(const char *df, const char *n)
{
setDefFileName(df);
- QCString name = n;
- if (name!="<globalScope>")
+ QCString lname = n;
+ if (lname!="<globalScope>")
{
//extractNamespaceName(m_name,m_localName,ns);
localName=stripScope(n);
@@ -138,11 +142,9 @@ void DefinitionImpl::IMPL::init(const char *df, const char *n)
details = 0;
body = 0;
inbodyDocs = 0;
- sourceRefByDict = 0;
- sourceRefsDict = 0;
- sectionDict = 0,
+ sourceRefByDict.clear();
+ sourceRefsDict.clear();
outerScope = Doxygen::globalScope;
- partOfGroups = 0;
hidden = FALSE;
isArtificial = FALSE;
lang = SrcLangExt_Unknown;
@@ -160,31 +162,31 @@ void DefinitionImpl::setDefFile(const QCString &df,int defLine,int defCol)
static bool matchExcludedSymbols(const char *name)
{
- static QStrList &exclSyms = Config_getList(EXCLUDE_SYMBOLS);
- if (exclSyms.count()==0) return FALSE; // nothing specified
- const char *pat = exclSyms.first();
+ const StringVector &exclSyms = Config_getList(EXCLUDE_SYMBOLS);
+ if (exclSyms.empty()) return FALSE; // nothing specified
QCString symName = name;
- while (pat)
+ for (const auto &pat : exclSyms)
{
- QCString pattern = pat;
+ QCString pattern = pat.c_str();
bool forceStart=FALSE;
bool forceEnd=FALSE;
- if (pattern.at(0)=='^')
+ if (pattern.at(0)=='^')
pattern=pattern.mid(1),forceStart=TRUE;
- if (pattern.at(pattern.length()-1)=='$')
+ if (pattern.at(pattern.length()-1)=='$')
pattern=pattern.left(pattern.length()-1),forceEnd=TRUE;
if (pattern.find('*')!=-1) // wildcard mode
{
QRegExp re(substitute(pattern,"*",".*"),TRUE);
- int i,pl;
- i = re.match(symName,0,&pl);
- //printf(" %d = re.match(%s) pattern=%s\n",i,symName.data(),pattern.data());
+ int pl;
+ int i = re.match(symName,0,&pl);
+ //printf(" %d = re.match(%s) pattern=%s pl=%d len=%d\n",i,symName.data(),pattern.data(),pl,symName.length());
if (i!=-1) // wildcard match
{
- int sl=symName.length();
+ uint ui=(uint)i;
+ uint sl=symName.length();
// check if it is a whole word match
- if ((i==0 || pattern.at(0)=='*' || (!isId(symName.at(i-1)) && !forceStart)) &&
- (i+pl==sl || pattern.at(i+pl)=='*' || (!isId(symName.at(i+pl)) && !forceEnd))
+ if ((ui==0 || pattern.at(0)=='*' || (!isId(symName.at(ui-1)) && !forceStart)) &&
+ (ui+pl==sl || pattern.at(pattern.length()-1)=='*' || (!isId(symName.at(ui+pl)) && !forceEnd))
)
{
//printf("--> name=%s pattern=%s match at %d\n",symName.data(),pattern.data(),i);
@@ -197,19 +199,19 @@ static bool matchExcludedSymbols(const char *name)
int i = symName.find(pattern);
if (i!=-1) // we have a match!
{
- int pl=pattern.length();
- int sl=symName.length();
+ uint ui=(uint)i;
+ uint pl=pattern.length();
+ uint sl=symName.length();
// check if it is a whole word match
- if ((i==0 || (!isId(symName.at(i-1)) && !forceStart)) &&
- (i+pl==sl || (!isId(symName.at(i+pl)) && !forceEnd))
+ if ((ui==0 || (!isId(symName.at(ui-1)) && !forceStart)) &&
+ (ui+pl==sl || (!isId(symName.at(ui+pl)) && !forceEnd))
)
{
//printf("--> name=%s pattern=%s match at %d\n",symName.data(),pattern.data(),i);
- return TRUE;
+ return TRUE;
}
}
}
- pat = exclSyms.next();
}
//printf("--> name=%s: no match\n",name);
return FALSE;
@@ -221,91 +223,35 @@ static void addToMap(const char *name,Definition *d)
QCString symbolName = name;
int index=computeQualifiedIndex(symbolName);
if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
- if (!symbolName.isEmpty())
+ if (!symbolName.isEmpty())
{
- //printf("******* adding symbol '%s' (%p)\n",symbolName.data(),d);
- DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
- //printf(" addToMap(%p): looking for symbol %s: %p\n",d,symbolName.data(),di);
- if (di==0) // new Symbol
- {
- //printf(" new symbol!\n");
- Doxygen::symbolMap->insert(symbolName,d);
- }
- else // existing symbol
- {
- //printf(" existing symbol: ");
- if (di->definitionType()==DefinitionIntf::TypeSymbolList) // already multiple symbols
- {
- //printf("adding to exiting list\n");
- DefinitionList *dl = (DefinitionList*)di;
- dl->append(d);
- }
- else // going from one to two symbols
- {
- Doxygen::symbolMap->take(symbolName);
- DefinitionList *dl = new DefinitionList;
- //printf("replacing symbol by list %p with elements %p and %p\n",dl,di,d);
- dl->append((Definition*)di);
- dl->append(d);
- Doxygen::symbolMap->insert(symbolName,dl);
- }
- }
-
- // auto resize if needed
- static int sizeIndex=9;
- if (Doxygen::symbolMap->size()>SDict_primes[sizeIndex])
- {
- Doxygen::symbolMap->resize(SDict_primes[++sizeIndex]);
- }
+ Doxygen::symbolMap.add(symbolName,d);
d->_setSymbolName(symbolName);
}
}
-static void removeFromMap(Definition *d)
+static void removeFromMap(const char *name,Definition *d)
{
- QCString symbolName = d->_symbolName();
- if (!symbolName.isEmpty())
- {
- //printf("******* removing symbol '%s' (%p)\n",symbolName.data(),d);
- DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
- if (di)
- {
- if (di!=d) // symbolName not unique
- {
- //printf(" removing from list: %p!\n",di);
- DefinitionList *dl = (DefinitionList*)di;
- bool b = dl->removeRef(d);
- ASSERT(b==TRUE);
- if (dl->isEmpty())
- {
- Doxygen::symbolMap->take(symbolName);
- delete dl;
- }
- }
- else // symbolName unique
- {
- //printf(" removing symbol %p\n",di);
- Doxygen::symbolMap->take(symbolName);
- }
- }
- }
+ Doxygen::symbolMap.remove(name,d);
}
-DefinitionImpl::DefinitionImpl(const char *df,int dl,int dc,
+DefinitionImpl::DefinitionImpl(Definition *def,
+ const char *df,int dl,int dc,
const char *name,const char *b,
const char *d,bool isSymbol)
{
m_impl = new DefinitionImpl::IMPL;
setName(name);
+ m_impl->def = def;
m_impl->defLine = dl;
m_impl->defColumn = dc;
m_impl->init(df,name);
m_impl->isSymbol = isSymbol;
- if (isSymbol) addToMap(name,this);
+ if (isSymbol) addToMap(name,def);
_setBriefDescription(b,df,dl);
_setDocumentation(d,df,dl,TRUE,FALSE);
- if (matchExcludedSymbols(name))
+ if (matchExcludedSymbols(name))
{
m_impl->hidden = TRUE;
}
@@ -315,53 +261,10 @@ DefinitionImpl::DefinitionImpl(const DefinitionImpl &d)
{
m_impl = new DefinitionImpl::IMPL;
*m_impl = *d.m_impl;
- m_impl->sectionDict = 0;
- m_impl->sourceRefByDict = 0;
- m_impl->sourceRefsDict = 0;
- m_impl->partOfGroups = 0;
m_impl->brief = 0;
m_impl->details = 0;
m_impl->body = 0;
m_impl->inbodyDocs = 0;
- if (d.m_impl->sectionDict)
- {
- m_impl->sectionDict = new SectionDict(17);
- SDict<SectionInfo>::Iterator it(*d.m_impl->sectionDict);
- SectionInfo *si;
- for (it.toFirst();(si=it.current());++it)
- {
- m_impl->sectionDict->append(si->label,si);
- }
- }
- if (d.m_impl->sourceRefByDict)
- {
- m_impl->sourceRefByDict = new MemberSDict;
- MemberSDict::IteratorDict it(*d.m_impl->sourceRefByDict);
- MemberDef *md;
- for (it.toFirst();(md=it.current());++it)
- {
- m_impl->sourceRefByDict->append(it.currentKey(),md);
- }
- }
- if (d.m_impl->sourceRefsDict)
- {
- m_impl->sourceRefsDict = new MemberSDict;
- MemberSDict::IteratorDict it(*d.m_impl->sourceRefsDict);
- MemberDef *md;
- for (it.toFirst();(md=it.current());++it)
- {
- m_impl->sourceRefsDict->append(it.currentKey(),md);
- }
- }
- if (d.m_impl->partOfGroups)
- {
- GroupListIterator it(*d.m_impl->partOfGroups);
- GroupDef *gd;
- for (it.toFirst();(gd=it.current());++it)
- {
- makePartOfGroup(gd);
- }
- }
if (d.m_impl->brief)
{
m_impl->brief = new BriefInfo(*d.m_impl->brief);
@@ -379,20 +282,17 @@ DefinitionImpl::DefinitionImpl(const DefinitionImpl &d)
m_impl->inbodyDocs = new DocInfo(*d.m_impl->inbodyDocs);
}
- if (m_impl->isSymbol) addToMap(m_impl->name,this);
+ if (m_impl->isSymbol) addToMap(m_impl->name,m_impl->def);
}
DefinitionImpl::~DefinitionImpl()
{
if (m_impl->isSymbol)
{
- removeFromMap(this);
- }
- if (m_impl)
- {
- delete m_impl;
- m_impl=0;
+ removeFromMap(m_impl->symbolName,m_impl->def);
}
+ delete m_impl;
+ m_impl=0;
}
void DefinitionImpl::setName(const char *name)
@@ -408,10 +308,10 @@ void DefinitionImpl::setId(const char *id)
{
if (id==0) return;
m_impl->id = id;
- if (Doxygen::clangUsrMap)
+ if (Doxygen::clangUsrMap)
{
//printf("DefinitionImpl::setId '%s'->'%s'\n",id,m_impl->name.data());
- Doxygen::clangUsrMap->insert(id,this);
+ Doxygen::clangUsrMap->insert(std::make_pair(id,m_impl->def));
}
}
@@ -426,22 +326,18 @@ void DefinitionImpl::addSectionsToDefinition(const std::vector<const SectionInfo
for (const SectionInfo *si : anchorList)
{
//printf("Add section '%s' to definition '%s'\n",
- // si->label.data(),name().data());
- SectionInfo *gsi=Doxygen::sectionDict->find(si->label);
+ // si->label().data(),name().data());
+ SectionManager &sm = SectionManager::instance();
+ SectionInfo *gsi=sm.find(si->label());
//printf("===== label=%s gsi=%p\n",si->label.data(),gsi);
if (gsi==0)
{
- gsi = new SectionInfo(*si);
- Doxygen::sectionDict->append(si->label,gsi);
- }
- if (m_impl->sectionDict==0)
- {
- m_impl->sectionDict = new SectionDict(17);
+ gsi = sm.add(*si);
}
- if (m_impl->sectionDict->find(gsi->label)==0)
+ if (m_impl->sectionRefs.find(gsi->label())==0)
{
- m_impl->sectionDict->append(gsi->label,gsi);
- gsi->definition = this;
+ m_impl->sectionRefs.add(gsi);
+ gsi->setDefinition(m_impl->def);
}
}
}
@@ -449,16 +345,11 @@ void DefinitionImpl::addSectionsToDefinition(const std::vector<const SectionInfo
bool DefinitionImpl::hasSections() const
{
//printf("DefinitionImpl::hasSections(%s) #sections=%d\n",name().data(),
- // m_impl->sectionDict ? m_impl->sectionDict->count() : 0);
- if (m_impl->sectionDict==0) return FALSE;
- SDict<SectionInfo>::Iterator li(*m_impl->sectionDict);
- SectionInfo *si;
- for (li.toFirst();(si=li.current());++li)
+ // m_impl->sectionRefs.size());
+ if (m_impl->sectionRefs.empty()) return FALSE;
+ for (const SectionInfo *si : m_impl->sectionRefs)
{
- if (si->type==SectionInfo::Section ||
- si->type==SectionInfo::Subsection ||
- si->type==SectionInfo::Subsubsection ||
- si->type==SectionInfo::Paragraph)
+ if (isSection(si->type()))
{
return TRUE;
}
@@ -468,20 +359,17 @@ bool DefinitionImpl::hasSections() const
void DefinitionImpl::addSectionsToIndex()
{
- if (m_impl->sectionDict==0) return;
+ if (m_impl->sectionRefs.empty()) return;
//printf("DefinitionImpl::addSectionsToIndex()\n");
- SDict<SectionInfo>::Iterator li(*m_impl->sectionDict);
- SectionInfo *si;
int level=1;
- for (li.toFirst();(si=li.current());++li)
+ for (auto it = m_impl->sectionRefs.begin(); it!=m_impl->sectionRefs.end(); ++it)
{
- if (si->type==SectionInfo::Section ||
- si->type==SectionInfo::Subsection ||
- si->type==SectionInfo::Subsubsection ||
- si->type==SectionInfo::Paragraph)
+ const SectionInfo *si = *it;
+ SectionType type = si->type();
+ if (isSection(type))
{
//printf(" level=%d title=%s\n",level,si->title.data());
- int nextLevel = (int)si->type;
+ int nextLevel = (int)type;
int i;
if (nextLevel>level)
{
@@ -497,16 +385,16 @@ void DefinitionImpl::addSectionsToIndex()
Doxygen::indexList->decContentsDepth();
}
}
- QCString title = si->title;
- if (title.isEmpty()) title = si->label;
+ QCString title = si->title();
+ if (title.isEmpty()) title = si->label();
// determine if there is a next level inside this item
- ++li;
- bool isDir = ((li.current()) ? (int)(li.current()->type > nextLevel):FALSE);
- --li;
+ auto it_next = std::next(it);
+ bool isDir = (it_next!=m_impl->sectionRefs.end()) ?
+ ((int)((*it_next)->type()) > nextLevel) : FALSE;
Doxygen::indexList->addContentsItem(isDir,title,
getReference(),
- getOutputFileBase(),
- si->label,
+ m_impl->def->getOutputFileBase(),
+ si->label(),
FALSE,
TRUE);
level = nextLevel;
@@ -521,23 +409,21 @@ void DefinitionImpl::addSectionsToIndex()
void DefinitionImpl::writeDocAnchorsToTagFile(FTextStream &tagFile) const
{
- if (m_impl->sectionDict)
+ if (!m_impl->sectionRefs.empty())
{
- //printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_impl->sectionDict->count());
- SDict<SectionInfo>::Iterator sdi(*m_impl->sectionDict);
- SectionInfo *si;
- for (;(si=sdi.current());++sdi)
+ //printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_impl->sectionRef.size());
+ for (const SectionInfo *si : m_impl->sectionRefs)
{
- if (!si->generated && si->ref.isEmpty() && !si->label.startsWith("autotoc_md"))
+ if (!si->generated() && si->ref().isEmpty() && !si->label().startsWith("autotoc_md"))
{
//printf("write an entry!\n");
- if (definitionType()==TypeMember) tagFile << " ";
- tagFile << " <docanchor file=\"" << addHtmlExtensionIfMissing(si->fileName) << "\"";
- if (!si->title.isEmpty())
+ if (m_impl->def->definitionType()==Definition::TypeMember) tagFile << " ";
+ tagFile << " <docanchor file=\"" << addHtmlExtensionIfMissing(si->fileName()) << "\"";
+ if (!si->title().isEmpty())
{
- tagFile << " title=\"" << convertToXML(si->title) << "\"";
+ tagFile << " title=\"" << convertToXML(si->title()) << "\"";
}
- tagFile << ">" << si->label << "</docanchor>" << endl;
+ tagFile << ">" << si->label() << "</docanchor>" << endl;
}
}
}
@@ -619,14 +505,14 @@ void DefinitionImpl::setDocumentation(const char *d,const char *docFile,int docL
#define uni_isupper(c) (QChar(c).category()==QChar::Letter_Uppercase)
-// do a UTF-8 aware search for the last real character and return TRUE
+// do a UTF-8 aware search for the last real character and return TRUE
// if that is a multibyte one.
static bool lastCharIsMultibyte(const QCString &s)
{
- int l = s.length();
+ uint l = s.length();
int p = 0;
int pp = -1;
- while ((p=nextUtf8CharPosition(s,l,p))<l) pp=p;
+ while ((p=nextUtf8CharPosition(s,l,(uint)p))<(int)l) pp=p;
if (pp==-1 || ((uchar)s[pp])<0x80) return FALSE;
return TRUE;
}
@@ -634,21 +520,23 @@ static bool lastCharIsMultibyte(const QCString &s)
void DefinitionImpl::_setBriefDescription(const char *b,const char *briefFile,int briefLine)
{
static QCString outputLanguage = Config_getEnum(OUTPUT_LANGUAGE);
- static bool needsDot = outputLanguage!="Japanese" &&
+ static bool needsDot = outputLanguage!="Japanese" &&
outputLanguage!="Chinese" &&
outputLanguage!="Korean";
QCString brief = b;
brief = brief.stripWhiteSpace();
+ brief = stripLeadingAndTrailingEmptyLines(brief,briefLine);
+ brief = brief.stripWhiteSpace();
if (brief.isEmpty()) return;
- int bl = brief.length();
+ uint bl = brief.length();
if (bl>0 && needsDot) // add punctuation if needed
{
int c = brief.at(bl-1);
switch(c)
{
case '.': case '!': case '?': case '>': case ':': case ')': break;
- default:
- if (uni_isupper(brief.at(0)) && !lastCharIsMultibyte(brief)) brief+='.';
+ default:
+ if (uni_isupper(brief.at(0)) && !lastCharIsMultibyte(brief)) brief+='.';
break;
}
}
@@ -686,8 +574,8 @@ void DefinitionImpl::_setBriefDescription(const char *b,const char *briefFile,in
}
}
-void DefinitionImpl::setBriefDescription(const char *b,const char *briefFile,int briefLine)
-{
+void DefinitionImpl::setBriefDescription(const char *b,const char *briefFile,int briefLine)
+{
if (b==0) return;
_setBriefDescription(b,briefFile,briefLine);
}
@@ -721,14 +609,14 @@ void DefinitionImpl::setInbodyDocumentation(const char *d,const char *inbodyFile
struct FilterCacheItem
{
portable_off_t filePos;
- uint fileSize;
+ size_t fileSize;
};
/*! Cache for storing the result of filtering a file */
class FilterCache
{
public:
- FilterCache() : m_endPos(0) { m_cache.setAutoDelete(TRUE); }
+ FilterCache() : m_endPos(0) { }
bool getFileContents(const QCString &fileName,BufStr &str)
{
static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
@@ -737,30 +625,31 @@ class FilterCache
FILE *f=0;
const int blockSize = 4096;
char buf[blockSize];
- FilterCacheItem *item=0;
- if (usePipe && (item = m_cache.find(fileName))) // cache hit: reuse stored result
+ auto it = m_cache.find(fileName.str());
+ if (usePipe && it!=m_cache.end()) // cache hit: reuse stored result
{
+ auto item = it->second;
//printf("getFileContents(%s): cache hit\n",qPrint(fileName));
// file already processed, get the results after filtering from the tmp file
Debug::print(Debug::FilterOutput,0,"Reusing filter result for %s from %s at offset=%d size=%d\n",
- qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item->filePos,(int)item->fileSize);
+ qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item.filePos,(int)item.fileSize);
f = Portable::fopen(Doxygen::filterDBFileName,"rb");
if (f)
{
bool success=TRUE;
- str.resize(item->fileSize+1);
- if (Portable::fseek(f,item->filePos,SEEK_SET)==-1)
+ str.resize(static_cast<uint>(item.fileSize+1));
+ if (Portable::fseek(f,item.filePos,SEEK_SET)==-1)
{
- err("Failed to seek to position %d in filter database file %s\n",(int)item->filePos,qPrint(Doxygen::filterDBFileName));
+ err("Failed to seek to position %d in filter database file %s\n",(int)item.filePos,qPrint(Doxygen::filterDBFileName));
success=FALSE;
}
if (success)
{
- int numBytes = fread(str.data(),1,item->fileSize,f);
- if (numBytes!=item->fileSize)
+ size_t numBytes = fread(str.data(),1,item.fileSize,f);
+ if (numBytes!=item.fileSize)
{
err("Failed to read %d bytes from position %d in filter database file %s: got %d bytes\n",
- (int)item->fileSize,(int)item->filePos,qPrint(Doxygen::filterDBFileName),numBytes);
+ (int)item.fileSize,(int)item.filePos,qPrint(Doxygen::filterDBFileName),(int)numBytes);
success=FALSE;
}
}
@@ -782,43 +671,41 @@ class FilterCache
Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd));
f = Portable::popen(cmd,"r");
FILE *bf = Portable::fopen(Doxygen::filterDBFileName,"a+b");
- FilterCacheItem *item = new FilterCacheItem;
- item->filePos = m_endPos;
+ FilterCacheItem item;
+ item.filePos = m_endPos;
if (bf==0)
{
// handle error
err("Error opening filter database file %s\n",qPrint(Doxygen::filterDBFileName));
str.addChar('\0');
- delete item;
Portable::pclose(f);
return FALSE;
}
// append the filtered output to the database file
- int size=0;
+ size_t size=0;
while (!feof(f))
{
- int bytesRead = fread(buf,1,blockSize,f);
- int bytesWritten = fwrite(buf,1,bytesRead,bf);
+ size_t bytesRead = fread(buf,1,blockSize,f);
+ size_t bytesWritten = fwrite(buf,1,bytesRead,bf);
if (bytesRead!=bytesWritten)
{
// handle error
err("Failed to write to filter database %s. Wrote %d out of %d bytes\n",
- qPrint(Doxygen::filterDBFileName),bytesWritten,bytesRead);
+ qPrint(Doxygen::filterDBFileName),(int)bytesWritten,(int)bytesRead);
str.addChar('\0');
- delete item;
Portable::pclose(f);
fclose(bf);
return FALSE;
}
size+=bytesWritten;
- str.addArray(buf,bytesWritten);
+ str.addArray(buf,static_cast<uint>(bytesWritten));
}
str.addChar('\0');
- item->fileSize = size;
+ item.fileSize = size;
// add location entry to the dictionary
- m_cache.append(fileName,item);
+ m_cache.insert(std::make_pair(fileName.str(),item));
Debug::print(Debug::FilterOutput,0,"Storing new filter result for %s in %s at offset=%d size=%d\n",
- qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item->filePos,(int)item->fileSize);
+ qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item.filePos,(int)item.fileSize);
// update end of file position
m_endPos += size;
Portable::pclose(f);
@@ -831,8 +718,8 @@ class FilterCache
f = Portable::fopen(fileName,"r");
while (!feof(f))
{
- int bytesRead = fread(buf,1,blockSize,f);
- str.addArray(buf,bytesRead);
+ size_t bytesRead = fread(buf,1,blockSize,f);
+ str.addArray(buf,static_cast<uint>(bytesRead));
}
str.addChar('\0');
fclose(f);
@@ -840,7 +727,7 @@ class FilterCache
return TRUE;
}
private:
- SDict<FilterCacheItem> m_cache;
+ std::unordered_map<std::string,FilterCacheItem> m_cache;
portable_off_t m_endPos;
};
@@ -849,7 +736,7 @@ static FilterCache g_filterCache;
//-----------------------------------------
-/*! Reads a fragment of code from file \a fileName starting at
+/*! Reads a fragment of code from file \a fileName starting at
* line \a startLine and ending at line \a endLine (inclusive). The fragment is
* stored in \a result. If FALSE is returned the code fragment could not be
* found.
@@ -874,14 +761,13 @@ bool readCodeFragment(const char *fileName,
g_filterCache.getFileContents(fileName,str);
bool found = lang==SrcLangExt_VHDL ||
- lang==SrcLangExt_Tcl ||
lang==SrcLangExt_Python ||
lang==SrcLangExt_Fortran;
- // for VHDL, TCL, Python, and Fortran no bracket search is possible
+ // for VHDL, Python, and Fortran no bracket search is possible
char *p=str.data();
if (p)
{
- int c=0;
+ char c=0;
int col=0;
int lineNr=1;
// skip until the startLine has reached
@@ -984,7 +870,7 @@ bool readCodeFragment(const char *fileName,
int braceIndex = result.findRev('}');
if (braceIndex > newLineIndex)
{
- result.truncate(braceIndex+1);
+ result.truncate((uint)braceIndex+1);
}
endLine=lineNr-1;
}
@@ -1002,11 +888,11 @@ bool readCodeFragment(const char *fileName,
}
QCString DefinitionImpl::getSourceFileBase() const
-{
- ASSERT(definitionType()!=Definition::TypeFile); // file overloads this method
+{
+ ASSERT(m_impl->def->definitionType()!=Definition::TypeFile); // file overloads this method
QCString fn;
static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
- if (sourceBrowser &&
+ if (sourceBrowser &&
m_impl->body && m_impl->body->startLine!=-1 && m_impl->body->fileDef)
{
fn = m_impl->body->fileDef->getSourceFileBase();
@@ -1023,11 +909,11 @@ QCString DefinitionImpl::getSourceAnchor() const
{
if (Htags::useHtags)
{
- qsnprintf(anchorStr,maxAnchorStrLen,"L%d",m_impl->body->startLine);
+ qsnprintf(anchorStr,maxAnchorStrLen,"L%d",m_impl->body->defLine);
}
else
{
- qsnprintf(anchorStr,maxAnchorStrLen,"l%05d",m_impl->body->startLine);
+ qsnprintf(anchorStr,maxAnchorStrLen,"l%05d",m_impl->body->defLine);
}
}
return anchorStr;
@@ -1050,15 +936,15 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
if (lineMarkerPos!=-1 && fileMarkerPos!=-1) // should always pass this.
{
QCString lineStr;
- lineStr.sprintf("%d",m_impl->body->startLine);
+ lineStr.sprintf("%d",m_impl->body->defLine);
QCString anchorStr = getSourceAnchor();
ol.startParagraph("definition");
if (lineMarkerPos<fileMarkerPos) // line marker before file marker
{
// write text left from linePos marker
- ol.parseText(refText.left(lineMarkerPos));
+ ol.parseText(refText.left(lineMarkerPos));
ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Man);
if (!latexSourceCode)
{
ol.disable(OutputGenerator::Latex);
@@ -1075,7 +961,7 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
ol.writeObjectLink(0,fn,anchorStr,lineStr);
ol.enableAll();
ol.disable(OutputGenerator::Html);
- if (latexSourceCode)
+ if (latexSourceCode)
{
ol.disable(OutputGenerator::Latex);
}
@@ -1090,13 +976,13 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
// write normal text (Man, Latex optionally, RTF optionally)
ol.docify(lineStr);
ol.popGeneratorState();
-
+
// write text between markers
ol.parseText(refText.mid(lineMarkerPos+2,
fileMarkerPos-lineMarkerPos-2));
ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Man);
if (!latexSourceCode)
{
ol.disable(OutputGenerator::Latex);
@@ -1113,7 +999,7 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
ol.writeObjectLink(0,fn,0,m_impl->body->fileDef->name());
ol.enableAll();
ol.disable(OutputGenerator::Html);
- if (latexSourceCode)
+ if (latexSourceCode)
{
ol.disable(OutputGenerator::Latex);
}
@@ -1128,17 +1014,16 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
// write normal text (Man, Latex optionally, RTF optionally)
ol.docify(m_impl->body->fileDef->name());
ol.popGeneratorState();
-
+
// write text right from file marker
- ol.parseText(refText.right(
- refText.length()-fileMarkerPos-2));
+ ol.parseText(refText.right(refText.length()-(uint)fileMarkerPos-2));
}
else // file marker before line marker
{
// write text left from file marker
- ol.parseText(refText.left(fileMarkerPos));
+ ol.parseText(refText.left(fileMarkerPos));
ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Man);
if (!latexSourceCode)
{
ol.disable(OutputGenerator::Latex);
@@ -1155,7 +1040,7 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
ol.writeObjectLink(0,fn,0,m_impl->body->fileDef->name());
ol.enableAll();
ol.disable(OutputGenerator::Html);
- if (latexSourceCode)
+ if (latexSourceCode)
{
ol.disable(OutputGenerator::Latex);
}
@@ -1170,14 +1055,14 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
// write normal text (RTF/Latex/Man only)
ol.docify(m_impl->body->fileDef->name());
ol.popGeneratorState();
-
+
// write text between markers
ol.parseText(refText.mid(fileMarkerPos+2,
- lineMarkerPos-fileMarkerPos-2));
+ lineMarkerPos-fileMarkerPos-2));
ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.disableAllBut(OutputGenerator::Html);
+ ol.disable(OutputGenerator::Man);
+ ol.disableAllBut(OutputGenerator::Html);
if (latexSourceCode)
{
ol.enable(OutputGenerator::Latex);
@@ -1194,7 +1079,7 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
ol.writeObjectLink(0,fn,anchorStr,lineStr);
ol.enableAll();
ol.disable(OutputGenerator::Html);
- if (latexSourceCode)
+ if (latexSourceCode)
{
ol.disable(OutputGenerator::Latex);
}
@@ -1211,8 +1096,7 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
ol.popGeneratorState();
// write text right from linePos marker
- ol.parseText(refText.right(
- refText.length()-lineMarkerPos-2));
+ ol.parseText(refText.right(refText.length()-(uint)lineMarkerPos-2));
}
ol.endParagraph();
}
@@ -1224,18 +1108,19 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const char *) const
ol.popGeneratorState();
}
-void DefinitionImpl::setBodySegment(int bls,int ble)
+void DefinitionImpl::setBodySegment(int defLine, int bls,int ble)
{
//printf("setBodySegment(%d,%d) for %s\n",bls,ble,name().data());
if (m_impl->body==0) m_impl->body = new BodyInfo;
- m_impl->body->startLine=bls;
- m_impl->body->endLine=ble;
+ m_impl->body->defLine = defLine;
+ m_impl->body->startLine = bls;
+ m_impl->body->endLine = ble;
}
-void DefinitionImpl::setBodyDef(FileDef *fd)
+void DefinitionImpl::setBodyDef(FileDef *fd)
{
if (m_impl->body==0) m_impl->body = new BodyInfo;
- m_impl->body->fileDef=fd;
+ m_impl->body->fileDef=fd;
}
bool DefinitionImpl::hasSources() const
@@ -1262,63 +1147,84 @@ void DefinitionImpl::writeInlineCode(OutputList &ol,const char *scopeName) const
{
//printf("Adding code fragment '%s' ext='%s'\n",
// codeFragment.data(),m_impl->defFileExt.data());
- CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(m_impl->defFileExt);
- intf.resetCodeParserState();
+ auto intf = Doxygen::parserManager->getCodeParser(m_impl->defFileExt);
+ intf->resetCodeParserState();
//printf("Read:\n'%s'\n\n",codeFragment.data());
const MemberDef *thisMd = 0;
- if (definitionType()==TypeMember) thisMd = dynamic_cast <const MemberDef*>(this);
-
- ol.startCodeFragment();
- intf.parseCode(ol, // codeOutIntf
- scopeName, // scope
- codeFragment, // input
- m_impl->lang, // lang
- FALSE, // isExample
- 0, // exampleName
- m_impl->body->fileDef, // fileDef
- actualStart, // startLine
- actualEnd, // endLine
- TRUE, // inlineFragment
- thisMd, // memberDef
- TRUE // show line numbers
- );
- ol.endCodeFragment();
+ if (m_impl->def->definitionType()==Definition::TypeMember)
+ {
+ thisMd = toMemberDef(m_impl->def);
+ }
+
+ ol.startCodeFragment("DoxyCode");
+ intf->parseCode(ol, // codeOutIntf
+ scopeName, // scope
+ codeFragment, // input
+ m_impl->lang, // lang
+ FALSE, // isExample
+ 0, // exampleName
+ m_impl->body->fileDef, // fileDef
+ actualStart, // startLine
+ actualEnd, // endLine
+ TRUE, // inlineFragment
+ thisMd, // memberDef
+ TRUE // show line numbers
+ );
+ ol.endCodeFragment("DoxyCode");
}
}
ol.popGeneratorState();
}
-/*! Write a reference to the source code fragments in which this
+static inline std::vector<const MemberDef*> refMapToVector(const std::unordered_map<std::string,const MemberDef *> &map)
+{
+ // convert map to a vector of values
+ std::vector<const MemberDef *> result;
+ std::transform(map.begin(),map.end(), // iterate over map
+ std::back_inserter(result), // add results to vector
+ [](const auto &item)
+ { return item.second; } // extract value to add from map Key,Value pair
+ );
+ // and sort it
+ std::sort(result.begin(),result.end(),
+ [](const auto &m1,const auto &m2) { return genericCompareMembers(m1,m2)<0; });
+ return result;
+}
+
+/*! Write a reference to the source code fragments in which this
* definition is used.
*/
void DefinitionImpl::_writeSourceRefList(OutputList &ol,const char *scopeName,
- const QCString &text,MemberSDict *members,bool /*funcOnly*/) const
+ const QCString &text,const std::unordered_map<std::string,const MemberDef *> &membersMap,
+ bool /*funcOnly*/) const
{
- static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
+ static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
static bool docbookSourceCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE);
static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
static bool refLinkSource = Config_getBool(REFERENCES_LINK_SOURCE);
ol.pushGeneratorState();
- if (members)
+ if (!membersMap.empty())
{
- members->sort();
+ auto members = refMapToVector(membersMap);
ol.startParagraph("reference");
ol.parseText(text);
ol.docify(" ");
- QCString ldefLine=theTranslator->trWriteList(members->count());
+ QCString ldefLine=theTranslator->trWriteList((int)members.size());
QRegExp marker("@[0-9]+");
- int index=0,newIndex,matchLen;
+ uint index=0;
+ int matchLen;
+ int newIndex;
// now replace all markers in inheritLine with links to the classes
while ((newIndex=marker.match(ldefLine,index,&matchLen))!=-1)
{
bool ok;
- ol.parseText(ldefLine.mid(index,newIndex-index));
+ ol.parseText(ldefLine.mid(index,(uint)newIndex-index));
uint entryIndex = ldefLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- MemberDef *md=members->at(entryIndex);
+ const MemberDef *md=members.at(entryIndex);
if (ok && md)
{
QCString scope=md->getScopeString();
@@ -1329,27 +1235,27 @@ void DefinitionImpl::_writeSourceRefList(OutputList &ol,const char *scopeName,
name.prepend(scope+getLanguageSpecificSeparator(m_impl->lang));
}
if (!md->isObjCMethod() &&
- (md->isFunction() || md->isSlot() ||
+ (md->isFunction() || md->isSlot() ||
md->isPrototype() || md->isSignal()
)
- )
+ )
{
name+="()";
}
//DefinitionImpl *d = md->getOutputFileBase();
//if (d==Doxygen::globalScope) d=md->getBodyDef();
if (sourceBrowser &&
- !(md->isLinkable() && !refLinkSource) &&
- md->getStartBodyLine()!=-1 &&
+ !(md->isLinkable() && !refLinkSource) &&
+ md->getStartBodyLine()!=-1 &&
md->getBodyDef()
)
{
- //printf("md->getBodyDef()=%p global=%p\n",md->getBodyDef(),Doxygen::globalScope);
+ //printf("md->getBodyDef()=%p global=%p\n",md->getBodyDef(),Doxygen::globalScope);
// for HTML write a real link
ol.pushGeneratorState();
//ol.disableAllBut(OutputGenerator::Html);
- ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Man);
if (!latexSourceCode)
{
ol.disable(OutputGenerator::Latex);
@@ -1391,8 +1297,8 @@ void DefinitionImpl::_writeSourceRefList(OutputList &ol,const char *scopeName,
{
// for HTML write a real link
ol.pushGeneratorState();
- //ol.disableAllBut(OutputGenerator::Html);
- ol.disable(OutputGenerator::Man);
+ //ol.disableAllBut(OutputGenerator::Html);
+ ol.disable(OutputGenerator::Man);
if (!latexSourceCode)
{
ol.disable(OutputGenerator::Latex);
@@ -1434,8 +1340,8 @@ void DefinitionImpl::_writeSourceRefList(OutputList &ol,const char *scopeName,
ol.docify(name);
}
}
- index=newIndex+matchLen;
- }
+ index=(uint)newIndex+matchLen;
+ }
ol.parseText(ldefLine.right(ldefLine.length()-index));
ol.writeString(".");
ol.endParagraph();
@@ -1454,15 +1360,15 @@ void DefinitionImpl::writeSourceRefs(OutputList &ol,const char *scopeName) const
}
bool DefinitionImpl::hasDocumentation() const
-{
- static bool extractAll = Config_getBool(EXTRACT_ALL);
+{
+ static bool extractAll = Config_getBool(EXTRACT_ALL);
//static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
- bool hasDocs =
+ bool hasDocs =
(m_impl->details && !m_impl->details->doc.isEmpty()) || // has detailed docs
(m_impl->brief && !m_impl->brief->doc.isEmpty()) || // has brief description
(m_impl->inbodyDocs && !m_impl->inbodyDocs->doc.isEmpty()) || // has inbody docs
extractAll //|| // extract everything
- // (sourceBrowser && m_impl->body &&
+ // (sourceBrowser && m_impl->body &&
// m_impl->body->startLine!=-1 && m_impl->body->fileDef)
; // link to definition
return hasDocs;
@@ -1470,7 +1376,7 @@ bool DefinitionImpl::hasDocumentation() const
bool DefinitionImpl::hasUserDocumentation() const
{
- bool hasDocs =
+ bool hasDocs =
(m_impl->details && !m_impl->details->doc.isEmpty()) ||
(m_impl->brief && !m_impl->brief->doc.isEmpty()) ||
(m_impl->inbodyDocs && !m_impl->inbodyDocs->doc.isEmpty());
@@ -1490,14 +1396,7 @@ void DefinitionImpl::addSourceReferencedBy(const MemberDef *md)
name.prepend(scope+"::");
}
- if (m_impl->sourceRefByDict==0)
- {
- m_impl->sourceRefByDict = new MemberSDict;
- }
- if (m_impl->sourceRefByDict->find(name)==0)
- {
- m_impl->sourceRefByDict->append(name,md);
- }
+ m_impl->sourceRefByDict.insert({name.str(),md});
}
}
@@ -1513,18 +1412,11 @@ void DefinitionImpl::addSourceReferences(const MemberDef *md)
name.prepend(scope+"::");
}
- if (m_impl->sourceRefsDict==0)
- {
- m_impl->sourceRefsDict = new MemberSDict;
- }
- if (m_impl->sourceRefsDict->find(name)==0)
- {
- m_impl->sourceRefsDict->append(name,md);
- }
+ m_impl->sourceRefsDict.insert({name.str(),md});
}
}
-Definition *DefinitionImpl::findInnerCompound(const char *) const
+const Definition *DefinitionImpl::findInnerCompound(const char *) const
{
return 0;
}
@@ -1538,24 +1430,24 @@ QCString DefinitionImpl::qualifiedName() const
{
//static int count=0;
//count++;
- if (!m_impl->qualifiedName.isEmpty())
+ if (!m_impl->qualifiedName.isEmpty())
{
//count--;
return m_impl->qualifiedName;
}
-
+
//printf("start %s::qualifiedName() localName=%s\n",name().data(),m_impl->localName.data());
- if (m_impl->outerScope==0)
+ if (m_impl->outerScope==0)
{
- if (m_impl->localName=="<globalScope>")
+ if (m_impl->localName=="<globalScope>")
{
//count--;
return "";
}
- else
+ else
{
//count--;
- return m_impl->localName;
+ return m_impl->localName;
}
}
@@ -1598,13 +1490,12 @@ QCString DefinitionImpl::localName() const
return m_impl->localName;
}
-void DefinitionImpl::makePartOfGroup(GroupDef *gd)
+void DefinitionImpl::makePartOfGroup(const GroupDef *gd)
{
- if (m_impl->partOfGroups==0) m_impl->partOfGroups = new GroupList;
- m_impl->partOfGroups->append(gd);
+ m_impl->partOfGroups.push_back(gd);
}
-void DefinitionImpl::setRefItems(const std::vector<ListItemInfo> &sli)
+void DefinitionImpl::setRefItems(const RefItemVector &sli)
{
m_impl->xrefListItems.insert(m_impl->xrefListItems.end(), sli.cbegin(), sli.cend());
}
@@ -1620,31 +1511,34 @@ void DefinitionImpl::mergeRefItems(Definition *d)
// sort results on itemId
std::sort(m_impl->xrefListItems.begin(),m_impl->xrefListItems.end(),
- [](const ListItemInfo &left,const ListItemInfo &right)
- { return left.itemId<right.itemId ||
- (left.itemId==right.itemId && qstrcmp(left.type,right.type)<0);
+ [](RefItem *left,RefItem *right)
+ { return left->id() <right->id() ||
+ (left->id()==right->id() &&
+ qstrcmp(left->list()->listName(),right->list()->listName())<0);
});
// filter out duplicates
auto last = std::unique(m_impl->xrefListItems.begin(),m_impl->xrefListItems.end(),
- [](const ListItemInfo &left,const ListItemInfo &right)
- { return left.itemId==right.itemId && left.type==right.type; });
+ [](const RefItem *left,const RefItem *right)
+ { return left->id()==right->id() &&
+ left->list()->listName()==right->list()->listName();
+ });
m_impl->xrefListItems.erase(last, m_impl->xrefListItems.end());
}
int DefinitionImpl::_getXRefListId(const char *listName) const
{
- for (const ListItemInfo &lii : m_impl->xrefListItems)
+ for (const RefItem *item : m_impl->xrefListItems)
{
- if (lii.type==listName)
+ if (item->list()->listName()==listName)
{
- return lii.itemId;
+ return item->id();
}
}
return -1;
}
-const std::vector<ListItemInfo> &DefinitionImpl::xrefListItems() const
+const RefItemVector &DefinitionImpl::xrefListItems() const
{
return m_impl->xrefListItems;
}
@@ -1656,16 +1550,18 @@ QCString DefinitionImpl::pathFragment() const
{
result = m_impl->outerScope->pathFragment();
}
- if (isLinkable())
+ if (m_impl->def->isLinkable())
{
if (!result.isEmpty()) result+="/";
- if (definitionType()==Definition::TypeGroup && (dynamic_cast <const GroupDef*>(this))->groupTitle())
+ if (m_impl->def->definitionType()==Definition::TypeGroup &&
+ (toGroupDef(m_impl->def))->groupTitle())
{
- result+=(dynamic_cast <const GroupDef*>(this))->groupTitle();
+ result+=(toGroupDef(m_impl->def))->groupTitle();
}
- else if (definitionType()==Definition::TypePage && (dynamic_cast <const PageDef*>(this))->hasTitle())
+ else if (m_impl->def->definitionType()==Definition::TypePage &&
+ (toPageDef(m_impl->def))->hasTitle())
{
- result+=(dynamic_cast <const PageDef*>(this))->title();
+ result+=(toPageDef(m_impl->def))->title();
}
else
{
@@ -1682,7 +1578,7 @@ QCString DefinitionImpl::pathFragment() const
//----------------------------------------------------------------------------------------
// TODO: move to htmlgen
-/*! Returns the string used in the footer for $navpath when
+/*! Returns the string used in the footer for $navpath when
* GENERATE_TREEVIEW is enabled
*/
QCString DefinitionImpl::navigationPathAsString() const
@@ -1694,37 +1590,37 @@ QCString DefinitionImpl::navigationPathAsString() const
{
result+=outerScope->navigationPathAsString();
}
- else if (definitionType()==Definition::TypeFile && (dynamic_cast<const FileDef*>(this))->getDirDef())
+ else if (m_impl->def->definitionType()==Definition::TypeFile && (toFileDef(m_impl->def))->getDirDef())
{
- result+=(dynamic_cast<const FileDef*>(this))->getDirDef()->navigationPathAsString();
+ result+=(toFileDef(m_impl->def))->getDirDef()->navigationPathAsString();
}
result+="<li class=\"navelem\">";
- if (isLinkable())
+ if (m_impl->def->isLinkable())
{
- if (definitionType()==Definition::TypeGroup && (dynamic_cast<const GroupDef*>(this))->groupTitle())
+ if (m_impl->def->definitionType()==Definition::TypeGroup && (toGroupDef(m_impl->def))->groupTitle())
{
- result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
- convertToHtml((dynamic_cast<const GroupDef*>(this))->groupTitle())+"</a>";
+ result+="<a class=\"el\" href=\"$relpath^"+m_impl->def->getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
+ convertToHtml((toGroupDef(m_impl->def))->groupTitle())+"</a>";
}
- else if (definitionType()==Definition::TypePage && (dynamic_cast<const PageDef*>(this))->hasTitle())
+ else if (m_impl->def->definitionType()==Definition::TypePage && (toPageDef(m_impl->def))->hasTitle())
{
- result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
- convertToHtml((dynamic_cast<const PageDef*>(this))->title())+"</a>";
+ result+="<a class=\"el\" href=\"$relpath^"+m_impl->def->getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
+ convertToHtml((toPageDef(m_impl->def))->title())+"</a>";
}
- else if (definitionType()==Definition::TypeClass)
+ else if (m_impl->def->definitionType()==Definition::TypeClass)
{
QCString name = locName;
if (name.right(2)=="-p" /*|| name.right(2)=="-g"*/)
{
name = name.left(name.length()-2);
}
- result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension;
- if (!anchor().isEmpty()) result+="#"+anchor();
+ result+="<a class=\"el\" href=\"$relpath^"+m_impl->def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ if (!m_impl->def->anchor().isEmpty()) result+="#"+m_impl->def->anchor();
result+="\">"+convertToHtml(name)+"</a>";
}
else
{
- result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
+ result+="<a class=\"el\" href=\"$relpath^"+m_impl->def->getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
convertToHtml(locName)+"</a>";
}
}
@@ -1756,8 +1652,7 @@ void DefinitionImpl::writeNavigationPath(OutputList &ol) const
// TODO: move to htmlgen
void DefinitionImpl::writeToc(OutputList &ol, const LocalToc &localToc) const
{
- SectionDict *sectionDict = m_impl->sectionDict;
- if (sectionDict==0) return;
+ if (m_impl->sectionRefs.empty()) return;
if (localToc.isHtmlEnabled())
{
int maxLevel = localToc.htmlLevel();
@@ -1768,21 +1663,17 @@ void DefinitionImpl::writeToc(OutputList &ol, const LocalToc &localToc) const
ol.writeString(theTranslator->trRTFTableOfContents());
ol.writeString("</h3>\n");
ol.writeString("<ul>");
- SDict<SectionInfo>::Iterator li(*sectionDict);
- SectionInfo *si;
int level=1,l;
char cs[2];
cs[1]='\0';
- bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE };
- for (li.toFirst();(si=li.current());++li)
+ BoolVector inLi(maxLevel+1,false);
+ for (const SectionInfo *si : m_impl->sectionRefs)
{
- if (si->type==SectionInfo::Section ||
- si->type==SectionInfo::Subsection ||
- si->type==SectionInfo::Subsubsection ||
- si->type==SectionInfo::Paragraph)
+ SectionType type = si->type();
+ if (isSection(type))
{
//printf(" level=%d title=%s\n",level,si->title.data());
- int nextLevel = (int)si->type;
+ int nextLevel = (int)type;
if (nextLevel>level)
{
for (l=level;l<nextLevel;l++)
@@ -1795,28 +1686,39 @@ void DefinitionImpl::writeToc(OutputList &ol, const LocalToc &localToc) const
for (l=level;l>nextLevel;l--)
{
if (l <= maxLevel && inLi[l]) ol.writeString("</li>\n");
- inLi[l]=FALSE;
+ inLi[l]=false;
if (l <= maxLevel) ol.writeString("</ul>\n");
}
}
- cs[0]='0'+nextLevel;
- if (nextLevel <= maxLevel && inLi[nextLevel]) ol.writeString("</li>\n");
- QCString titleDoc = convertToHtml(si->title);
- if (nextLevel <= maxLevel) ol.writeString("<li class=\"level"+QCString(cs)+"\"><a href=\"#"+si->label+"\">"+(si->title.isEmpty()?si->label:titleDoc)+"</a>");
- inLi[nextLevel]=TRUE;
+ cs[0]=(char)('0'+nextLevel);
+ if (nextLevel <= maxLevel && inLi[nextLevel])
+ {
+ ol.writeString("</li>\n");
+ }
+ QCString titleDoc = convertToHtml(si->title());
+ if (nextLevel <= maxLevel)
+ {
+ ol.writeString("<li class=\"level"+QCString(cs)+"\">"
+ "<a href=\"#"+si->label()+"\">"+
+ (si->title().isEmpty()?si->label():titleDoc)+"</a>");
+ }
+ inLi[nextLevel]=true;
level = nextLevel;
}
}
if (level > maxLevel) level = maxLevel;
while (level>1 && level <= maxLevel)
{
- if (inLi[level]) ol.writeString("</li>\n");
+ if (inLi[level])
+ {
+ ol.writeString("</li>\n");
+ }
inLi[level]=FALSE;
ol.writeString("</ul>\n");
level--;
}
if (level <= maxLevel && inLi[level]) ol.writeString("</li>\n");
- inLi[level]=FALSE;
+ inLi[level]=false;
ol.writeString("</ul>\n");
ol.writeString("</div>\n");
ol.popGeneratorState();
@@ -1828,21 +1730,16 @@ void DefinitionImpl::writeToc(OutputList &ol, const LocalToc &localToc) const
ol.disableAllBut(OutputGenerator::Docbook);
ol.writeString(" <toc>\n");
ol.writeString(" <title>" + theTranslator->trRTFTableOfContents() + "</title>\n");
- SectionDict *sectionDict = getSectionDict();
- SDict<SectionInfo>::Iterator li(*sectionDict);
- SectionInfo *si;
int level=1,l;
- bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE };
int maxLevel = localToc.docbookLevel();
- for (li.toFirst();(si=li.current());++li)
+ BoolVector inLi(maxLevel+1,false);
+ for (const SectionInfo *si : m_impl->sectionRefs)
{
- if (si->type==SectionInfo::Section ||
- si->type==SectionInfo::Subsection ||
- si->type==SectionInfo::Subsubsection ||
- si->type==SectionInfo::Paragraph)
+ SectionType type = si->type();
+ if (isSection(type))
{
//printf(" level=%d title=%s\n",level,si->title.data());
- int nextLevel = (int)si->type;
+ int nextLevel = (int)type;
if (nextLevel>level)
{
for (l=level;l<nextLevel;l++)
@@ -1860,8 +1757,10 @@ void DefinitionImpl::writeToc(OutputList &ol, const LocalToc &localToc) const
}
if (nextLevel <= maxLevel)
{
- QCString titleDoc = convertToDocBook(si->title);
- ol.writeString(" <tocentry>" + (si->title.isEmpty()?si->label:titleDoc) + "</tocentry>\n");
+ QCString titleDoc = convertToDocBook(si->title());
+ ol.writeString(" <tocentry>" +
+ (si->title().isEmpty()?si->label():titleDoc) +
+ "</tocentry>\n");
}
inLi[nextLevel]=TRUE;
level = nextLevel;
@@ -1894,31 +1793,31 @@ void DefinitionImpl::writeToc(OutputList &ol, const LocalToc &localToc) const
//----------------------------------------------------------------------------------------
-SectionDict * DefinitionImpl::getSectionDict() const
+const SectionRefs &DefinitionImpl::getSectionRefs() const
{
- return m_impl->sectionDict;
+ return m_impl->sectionRefs;
}
-QCString DefinitionImpl::symbolName() const
-{
- return m_impl->symbolName;
+QCString DefinitionImpl::symbolName() const
+{
+ return m_impl->symbolName;
}
//----------------------
-QCString DefinitionImpl::documentation() const
-{
- return m_impl->details ? m_impl->details->doc : QCString("");
+QCString DefinitionImpl::documentation() const
+{
+ return m_impl->details ? m_impl->details->doc : QCString("");
}
-int DefinitionImpl::docLine() const
-{
- return m_impl->details ? m_impl->details->line : 1;
+int DefinitionImpl::docLine() const
+{
+ return m_impl->details ? m_impl->details->line : 1;
}
-QCString DefinitionImpl::docFile() const
-{
- return m_impl->details ? m_impl->details->file : QCString("<"+m_impl->name+">");
+QCString DefinitionImpl::docFile() const
+{
+ return m_impl->details ? m_impl->details->file : QCString("<"+m_impl->name+">");
}
//----------------------------------------------------------------------------
@@ -1926,7 +1825,7 @@ QCString DefinitionImpl::docFile() const
static bool stripWord(QCString &s,QCString w)
{
bool success=FALSE;
- if (s.left(w.length())==w)
+ if (s.left(w.length())==w)
{
success=TRUE;
s=s.right(s.length()-w.length());
@@ -1944,25 +1843,23 @@ QCString abbreviate(const char *s,const char *name)
QCString result=s;
result=result.stripWhiteSpace();
// strip trailing .
- if (!result.isEmpty() && result.at(result.length()-1)=='.')
+ if (!result.isEmpty() && result.at(result.length()-1)=='.')
result=result.left(result.length()-1);
// strip any predefined prefix
- QStrList &briefDescAbbrev = Config_getList(ABBREVIATE_BRIEF);
- const char *p = briefDescAbbrev.first();
- while (p)
+ const StringVector &briefDescAbbrev = Config_getList(ABBREVIATE_BRIEF);
+ for (const auto &p : briefDescAbbrev)
{
- QCString s = p;
- s.replace(QRegExp("\\$name"), scopelessName); // replace $name with entity name
- s += " ";
- stripWord(result,s);
- p = briefDescAbbrev.next();
+ QCString str = p.c_str();
+ str.replace(QRegExp("\\$name"), scopelessName); // replace $name with entity name
+ str += " ";
+ stripWord(result,str);
}
// capitalize first word
if (!result.isEmpty())
{
- int c=result[0];
+ char c=result[0];
if (c>='a' && c<='z') c+='A'-'a';
result[0]=c;
}
@@ -1972,77 +1869,68 @@ QCString abbreviate(const char *s,const char *name)
//----------------------
-QCString DefinitionImpl::briefDescription(bool abbr) const
-{
+QCString DefinitionImpl::briefDescription(bool abbr) const
+{
//printf("%s::briefDescription(%d)='%s'\n",name().data(),abbr,m_impl->brief?m_impl->brief->doc.data():"<none>");
- return m_impl->brief ?
- (abbr ? abbreviate(m_impl->brief->doc,displayName()) : m_impl->brief->doc) :
- QCString("");
+ return m_impl->brief ?
+ (abbr ? abbreviate(m_impl->brief->doc,m_impl->def->displayName()) : m_impl->brief->doc) :
+ QCString("");
}
-QCString DefinitionImpl::briefDescriptionAsTooltip() const
+void DefinitionImpl::computeTooltip()
{
- if (m_impl->brief)
+ if (m_impl->brief && m_impl->brief->tooltip.isEmpty() && !m_impl->brief->doc.isEmpty())
{
- if (m_impl->brief->tooltip.isEmpty() && !m_impl->brief->doc.isEmpty())
- {
- static bool reentering=FALSE;
- if (!reentering)
- {
- const MemberDef *md = definitionType()==TypeMember ? dynamic_cast<const MemberDef*>(this) : 0;
- const Definition *scope = definitionType()==TypeMember ? getOuterScope() : this;
- reentering=TRUE; // prevent requests for tooltips while parsing a tooltip
- m_impl->brief->tooltip = parseCommentAsText(
- scope,md,
- m_impl->brief->doc,
- m_impl->brief->file,
- m_impl->brief->line);
- reentering=FALSE;
- }
- }
- return m_impl->brief->tooltip;
+ const MemberDef *md = m_impl->def->definitionType()==Definition::TypeMember ? toMemberDef(m_impl->def) : 0;
+ const Definition *scope = m_impl->def->definitionType()==Definition::TypeMember ? m_impl->def->getOuterScope() : m_impl->def;
+ m_impl->brief->tooltip = parseCommentAsText(scope,md,
+ m_impl->brief->doc, m_impl->brief->file, m_impl->brief->line);
}
- return QCString("");
}
-int DefinitionImpl::briefLine() const
-{
- return m_impl->brief ? m_impl->brief->line : 1;
+QCString DefinitionImpl::briefDescriptionAsTooltip() const
+{
+ return m_impl->brief ? m_impl->brief->tooltip : QCString();
}
-QCString DefinitionImpl::briefFile() const
-{
- return m_impl->brief ? m_impl->brief->file : QCString("<"+m_impl->name+">");
+int DefinitionImpl::briefLine() const
+{
+ return m_impl->brief ? m_impl->brief->line : 1;
+}
+
+QCString DefinitionImpl::briefFile() const
+{
+ return m_impl->brief ? m_impl->brief->file : QCString("<"+m_impl->name+">");
}
//----------------------
QCString DefinitionImpl::inbodyDocumentation() const
{
- return m_impl->inbodyDocs ? m_impl->inbodyDocs->doc : QCString("");
+ return m_impl->inbodyDocs ? m_impl->inbodyDocs->doc : QCString("");
}
-int DefinitionImpl::inbodyLine() const
-{
- return m_impl->inbodyDocs ? m_impl->inbodyDocs->line : 1;
+int DefinitionImpl::inbodyLine() const
+{
+ return m_impl->inbodyDocs ? m_impl->inbodyDocs->line : 1;
}
-QCString DefinitionImpl::inbodyFile() const
-{
- return m_impl->inbodyDocs ? m_impl->inbodyDocs->file : QCString("<"+m_impl->name+">");
+QCString DefinitionImpl::inbodyFile() const
+{
+ return m_impl->inbodyDocs ? m_impl->inbodyDocs->file : QCString("<"+m_impl->name+">");
}
//----------------------
-QCString DefinitionImpl::getDefFileName() const
-{
- return m_impl->defFileName;
+QCString DefinitionImpl::getDefFileName() const
+{
+ return m_impl->defFileName;
}
-QCString DefinitionImpl::getDefFileExtension() const
-{
- return m_impl->defFileExt;
+QCString DefinitionImpl::getDefFileExtension() const
+{
+ return m_impl->defFileExt;
}
bool DefinitionImpl::isHidden() const
@@ -2050,14 +1938,14 @@ bool DefinitionImpl::isHidden() const
return m_impl->hidden;
}
-bool DefinitionImpl::isVisibleInProject() const
-{
- return isLinkableInProject() && !m_impl->hidden;
+bool DefinitionImpl::isVisibleInProject() const
+{
+ return m_impl->def->isLinkableInProject() && !m_impl->hidden;
}
bool DefinitionImpl::isVisible() const
-{
- return isLinkable() && !m_impl->hidden;
+{
+ return m_impl->def->isLinkable() && !m_impl->hidden;
}
bool DefinitionImpl::isArtificial() const
@@ -2065,69 +1953,101 @@ bool DefinitionImpl::isArtificial() const
return m_impl->isArtificial;
}
-QCString DefinitionImpl::getReference() const
-{
- return m_impl->ref;
+QCString DefinitionImpl::getReference() const
+{
+ return m_impl->ref;
}
-bool DefinitionImpl::isReference() const
-{
- return !m_impl->ref.isEmpty();
+bool DefinitionImpl::isReference() const
+{
+ return !m_impl->ref.isEmpty();
+}
+
+int DefinitionImpl::getStartDefLine() const
+{
+ return m_impl->body ? m_impl->body->defLine : -1;
}
-int DefinitionImpl::getStartBodyLine() const
-{
- return m_impl->body ? m_impl->body->startLine : -1;
+int DefinitionImpl::getStartBodyLine() const
+{
+ return m_impl->body ? m_impl->body->startLine : -1;
}
-int DefinitionImpl::getEndBodyLine() const
-{
- return m_impl->body ? m_impl->body->endLine : -1;
+int DefinitionImpl::getEndBodyLine() const
+{
+ return m_impl->body ? m_impl->body->endLine : -1;
}
FileDef *DefinitionImpl::getBodyDef() const
-{
- return m_impl->body ? m_impl->body->fileDef : 0;
+{
+ return m_impl->body ? m_impl->body->fileDef : 0;
}
-GroupList *DefinitionImpl::partOfGroups() const
-{
- return m_impl->partOfGroups;
+const GroupList &DefinitionImpl::partOfGroups() const
+{
+ return m_impl->partOfGroups;
}
bool DefinitionImpl::isLinkableViaGroup() const
{
- GroupList *gl = partOfGroups();
- if (gl)
+ for (const auto &gd : partOfGroups())
{
- GroupListIterator gli(*gl);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- if (gd->isLinkable()) return TRUE;
- }
+ if (gd->isLinkable()) return true;
}
- return FALSE;
+ return false;
}
-Definition *DefinitionImpl::getOuterScope() const
-{
- return m_impl->outerScope;
+Definition *DefinitionImpl::getOuterScope() const
+{
+ return m_impl->outerScope;
+}
+
+std::vector<const MemberDef*> DefinitionImpl::getReferencesMembers() const
+{
+ return refMapToVector(m_impl->sourceRefsDict);
}
-MemberSDict *DefinitionImpl::getReferencesMembers() const
-{
- return m_impl->sourceRefsDict;
+std::vector<const MemberDef*> DefinitionImpl::getReferencedByMembers() const
+{
+ return refMapToVector(m_impl->sourceRefByDict);
+}
+
+void DefinitionImpl::mergeReferences(const Definition *other)
+{
+ const DefinitionImpl *defImpl = other->toDefinitionImpl_();
+ if (defImpl)
+ {
+ for (const auto &kv : defImpl->m_impl->sourceRefsDict)
+ {
+ auto it = m_impl->sourceRefsDict.find(kv.first);
+ if (it != m_impl->sourceRefsDict.end())
+ {
+ m_impl->sourceRefsDict.insert(kv);
+ }
+ }
+ }
}
-MemberSDict *DefinitionImpl::getReferencedByMembers() const
-{
- return m_impl->sourceRefByDict;
+void DefinitionImpl::mergeReferencedBy(const Definition *other)
+{
+ const DefinitionImpl *defImpl = other->toDefinitionImpl_();
+ if (defImpl)
+ {
+ for (const auto &kv : defImpl->m_impl->sourceRefByDict)
+ {
+ auto it = m_impl->sourceRefByDict.find(kv.first);
+ if (it != m_impl->sourceRefByDict.end())
+ {
+ m_impl->sourceRefByDict.insert({kv.first,kv.second});
+ }
+ }
+ }
}
-void DefinitionImpl::setReference(const char *r)
-{
- m_impl->ref=r;
+
+void DefinitionImpl::setReference(const char *r)
+{
+ m_impl->ref=r;
}
SrcLangExt DefinitionImpl::getLanguage() const
@@ -2135,9 +2055,9 @@ SrcLangExt DefinitionImpl::getLanguage() const
return m_impl->lang;
}
-void DefinitionImpl::setHidden(bool b)
-{
- m_impl->hidden = m_impl->hidden || b;
+void DefinitionImpl::setHidden(bool b)
+{
+ m_impl->hidden = m_impl->hidden || b;
}
void DefinitionImpl::setArtificial(bool b)
@@ -2145,20 +2065,20 @@ void DefinitionImpl::setArtificial(bool b)
m_impl->isArtificial = b;
}
-void DefinitionImpl::setLocalName(const QCString name)
-{
- m_impl->localName=name;
+void DefinitionImpl::setLocalName(const QCString name)
+{
+ m_impl->localName=name;
}
-void DefinitionImpl::setLanguage(SrcLangExt lang)
-{
- m_impl->lang=lang;
+void DefinitionImpl::setLanguage(SrcLangExt lang)
+{
+ m_impl->lang=lang;
}
-void DefinitionImpl::_setSymbolName(const QCString &name)
-{
- m_impl->symbolName=name;
+void DefinitionImpl::_setSymbolName(const QCString &name)
+{
+ m_impl->symbolName=name;
}
QCString DefinitionImpl::_symbolName() const
@@ -2181,7 +2101,7 @@ QCString DefinitionImpl::externalReference(const QCString &relPath) const
if (dest)
{
QCString result = *dest;
- int l = result.length();
+ uint l = result.length();
if (!relPath.isEmpty() && l>0 && result.at(0)=='.')
{ // relative path -> prepend relPath.
result.prepend(relPath);
@@ -2214,7 +2134,7 @@ int DefinitionImpl::getDefColumn() const
return m_impl->defColumn;
}
-void DefinitionImpl::setCookie(Cookie *cookie) const
+void DefinitionImpl::setCookie(Definition::Cookie *cookie) const
{
delete m_impl->cookie;
m_impl->cookie = cookie;
@@ -2235,16 +2155,62 @@ void DefinitionImpl::writeSummaryLinks(OutputList &) const
//---------------------------------------------------------------------------------
-DefinitionAliasImpl::DefinitionAliasImpl(const Definition *scope,const Definition *alias)
- : m_scope(scope), m_def(alias), m_cookie(0)
+DefinitionAliasImpl::DefinitionAliasImpl(Definition *def,const Definition *scope, const Definition *alias)
+ : m_def(def), m_scope(scope), m_symbolName(alias->_symbolName())
+{
+}
+
+DefinitionAliasImpl::~DefinitionAliasImpl()
+{
+}
+
+void DefinitionAliasImpl::init()
{
//printf("%s::addToMap(%s)\n",qPrint(name()),qPrint(alias->name()));
- addToMap(alias->name(),this);
+ addToMap(m_symbolName,m_def);
+}
+
+void DefinitionAliasImpl::deinit()
+{
+ removeFromMap(m_symbolName,m_def);
+}
+
+QCString DefinitionAliasImpl::qualifiedName() const
+{
+ //printf("start %s::qualifiedName() localName=%s\n",name().data(),m_impl->localName.data());
+ if (m_scope==0)
+ {
+ return m_def->localName();
+ }
+ else
+ {
+ return m_scope->qualifiedName()+
+ getLanguageSpecificSeparator(m_scope->getLanguage())+
+ m_def->localName();
+ }
+}
+
+QCString DefinitionAliasImpl::name() const
+{
+ return qualifiedName();
+}
+
+//---------------------------------------------------------------------------------
+
+Definition *toDefinition(DefinitionMutable *dm)
+{
+ if (dm==0) return 0;
+ return dm->toDefinition_();
+}
+
+DefinitionMutable *toDefinitionMutable(Definition *d)
+{
+ if (d==0) return 0;
+ return d->toDefinitionMutable_();
}
-DefinitionAliasImpl::~DefinitionAliasImpl()
+DefinitionMutable *toDefinitionMutable(const Definition *d)
{
- //printf("~DefinitionAliasImpl()\n");
- removeFromMap(this);
+ return toDefinitionMutable(const_cast<Definition*>(d));
}
diff --git a/src/definition.h b/src/definition.h
index b3ece2c..444b188 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -23,6 +23,7 @@
#include <qdict.h>
#include "types.h"
+#include "reflist.h"
#if defined(_WIN32) && !defined(__CYGWIN__)
// To disable 'inherits via dominance' warnings.
@@ -32,20 +33,20 @@
class FileDef;
class OutputList;
-class SectionDict;
-class MemberSDict;
+class SectionRefs;
class MemberDef;
class GroupDef;
class GroupList;
-struct ListItemInfo;
-struct SectionInfo;
+class SectionInfo;
class Definition;
+class DefinitionMutable;
+class DefinitionImpl;
class FTextStream;
-
+
/** Data associated with a detailed description. */
struct DocInfo
{
- QCString doc;
+ QCString doc;
int line;
QCString file;
};
@@ -53,8 +54,8 @@ struct DocInfo
/** Data associated with a brief description. */
struct BriefInfo
{
- QCString doc;
- QCString tooltip;
+ QCString doc;
+ QCString tooltip;
int line;
QCString file;
};
@@ -62,40 +63,18 @@ struct BriefInfo
/** Data associated with description found in the body. */
struct BodyInfo
{
- int startLine; //!< line number of the start of the definition
- int endLine; //!< line number of the end of the definition
+ int defLine; //!< line number of the start of the definition
+ int startLine; //!< line number of the start of the definition's body
+ int endLine; //!< line number of the end of the definition's body
FileDef *fileDef; //!< file definition containing the function body
};
-
-/** Abstract interface for a Definition or DefinitionList */
-class DefinitionIntf
-{
- public:
- DefinitionIntf() {}
- virtual ~DefinitionIntf() {}
- /*! Types of derived classes */
- enum DefType
- {
- TypeClass = 0,
- TypeFile = 1,
- TypeNamespace = 2,
- TypeMember = 3,
- TypeGroup = 4,
- TypePackage = 5,
- TypePage = 6,
- TypeDir = 7,
- TypeSymbolList = 8
- };
- /*! Use this for dynamic inspection of the type of the derived class */
- virtual DefType definitionType() const = 0;
-};
-/** The common base class of all entity definitions found in the sources.
+/** The common base class of all entity definitions found in the sources.
*
* This can be a class or a member function, or a file, or a namespace, etc.
* Use definitionType() to find which type of definition this is.
*/
-class Definition : public DefinitionIntf
+class Definition
{
public:
struct Cookie
@@ -103,9 +82,27 @@ class Definition : public DefinitionIntf
virtual ~Cookie() {}
};
+ /*! Types of derived classes */
+ enum DefType
+ {
+ TypeClass = 0,
+ TypeFile = 1,
+ TypeNamespace = 2,
+ TypeMember = 3,
+ TypeGroup = 4,
+ TypePackage = 5,
+ TypePage = 6,
+ TypeDir = 7
+ };
+
+
//-----------------------------------------------------------------------------------
// ---- getters -----
//-----------------------------------------------------------------------------------
+
+ /*! Use this for dynamic inspection of the type of the derived class */
+ virtual DefType definitionType() const = 0;
+
/*! Returns TRUE if this is an alias of another definition */
virtual bool isAlias() const = 0;
@@ -160,7 +157,7 @@ class Definition : public DefinitionIntf
virtual QCString briefDescription(bool abbreviate=FALSE) const = 0;
/*! Returns a plain text version of the brief description suitable for use
- * as a tool tip.
+ * as a tool tip.
*/
virtual QCString briefDescriptionAsTooltip() const = 0;
@@ -173,11 +170,11 @@ class Definition : public DefinitionIntf
/*! Returns the file in which the in body documentation was found */
virtual QCString inbodyFile() const = 0;
- /*! Returns the line at which the first in body documentation
+ /*! Returns the line at which the first in body documentation
part was found */
virtual int inbodyLine() const = 0;
- /*! Returns the file in which the brief description was found.
+ /*! Returns the file in which the brief description was found.
* This can differ from getDefFileName().
*/
virtual QCString briefFile() const = 0;
@@ -188,14 +185,14 @@ class Definition : public DefinitionIntf
/*! returns the extension of the file in which this definition was found */
virtual QCString getDefFileExtension() const = 0;
- /*! returns the line number at which the definition was found */
+ /*! returns the line number at which the definition was found (can be the declaration) */
virtual int getDefLine() const = 0;
/*! returns the column number at which the definition was found */
virtual int getDefColumn() const = 0;
- /*! Returns TRUE iff the definition is documented
- * (which could be generated documentation)
+ /*! Returns TRUE iff the definition is documented
+ * (which could be generated documentation)
* @see hasUserDocumentation()
*/
virtual bool hasDocumentation() const = 0;
@@ -204,17 +201,17 @@ class Definition : public DefinitionIntf
virtual bool hasUserDocumentation() const = 0;
/*! Returns TRUE iff it is possible to link to this item within this
- * project.
+ * project.
*/
virtual bool isLinkableInProject() const = 0;
/*! Returns TRUE iff it is possible to link to this item. This can
- * be a link to another project imported via a tag file.
+ * be a link to another project imported via a tag file.
*/
virtual bool isLinkable() const = 0;
- /*! Returns TRUE iff the name is part of this project and
- * may appear in the output
+ /*! Returns TRUE iff the name is part of this project and
+ * may appear in the output
*/
virtual bool isVisibleInProject() const = 0;
@@ -224,14 +221,14 @@ class Definition : public DefinitionIntf
/*! Returns TRUE iff this item is supposed to be hidden from the output. */
virtual bool isHidden() const = 0;
- /*! returns TRUE if this entity was artificially introduced, for
- * instance because it is used to show a template instantiation relation.
+ /*! returns TRUE if this entity was artificially introduced, for
+ * instance because it is used to show a template instantiation relation.
*/
virtual bool isArtificial() const = 0;
/*! If this definition was imported via a tag file, this function
* returns the tagfile for the external project. This can be
- * translated into an external link target via
+ * translated into an external link target via
* Doxygen::tagDestinationDict
*/
virtual QCString getReference() const = 0;
@@ -242,12 +239,15 @@ class Definition : public DefinitionIntf
/*! Convenience method to return a resolved external link */
virtual QCString externalReference(const QCString &relPath) const = 0;
- /*! Returns the first line of the body of this item (applicable to classes and
+ /*! Returns the first line of the implementation of this item. See also getDefLine() */
+ virtual int getStartDefLine() const = 0;
+
+ /*! Returns the first line of the body of this item (applicable to classes and
* functions).
*/
virtual int getStartBodyLine() const = 0;
- /*! Returns the last line of the body of this item (applicable to classes and
+ /*! Returns the last line of the body of this item (applicable to classes and
* functions).
*/
virtual int getEndBodyLine() const = 0;
@@ -260,16 +260,16 @@ class Definition : public DefinitionIntf
/** Returns the programming language this definition was written in. */
virtual SrcLangExt getLanguage() const = 0;
- virtual GroupList *partOfGroups() const = 0;
+ virtual const GroupList &partOfGroups() const = 0;
virtual bool isLinkableViaGroup() const = 0;
- virtual const std::vector<ListItemInfo> &xrefListItems() const = 0;
+ virtual const RefItemVector &xrefListItems() const = 0;
- virtual Definition *findInnerCompound(const char *name) const = 0;
+ virtual const Definition *findInnerCompound(const char *name) const = 0;
virtual Definition *getOuterScope() const = 0;
- virtual MemberSDict *getReferencesMembers() const = 0;
- virtual MemberSDict *getReferencedByMembers() const = 0;
+ virtual std::vector<const MemberDef *> getReferencesMembers() const = 0;
+ virtual std::vector<const MemberDef *> getReferencedByMembers() const = 0;
virtual bool hasSections() const = 0;
virtual bool hasSources() const = 0;
@@ -280,12 +280,40 @@ class Definition : public DefinitionIntf
virtual QCString id() const = 0;
/** returns the section dictionary, only of importance for pagedef */
- virtual SectionDict * getSectionDict() const = 0;
+ virtual const SectionRefs &getSectionRefs() const = 0;
virtual QCString navigationPathAsString() const = 0;
virtual QCString pathFragment() const = 0;
//-----------------------------------------------------------------------------------
+ // --- cookie storage ----
+ //-----------------------------------------------------------------------------------
+ virtual void setCookie(Cookie *cookie) const = 0;
+ virtual Cookie *cookie() const = 0;
+
+ //-----------------------------------------------------------------------------------
+ // --- symbol name ----
+ //-----------------------------------------------------------------------------------
+ virtual void _setSymbolName(const QCString &name) = 0;
+ virtual QCString _symbolName() const = 0;
+
+ // ---------------------------------
+ virtual ~Definition() = default;
+
+ private:
+ friend class DefinitionImpl;
+ friend DefinitionMutable* toDefinitionMutable(Definition *);
+ friend DefinitionMutable* toDefinitionMutable(const Definition *);
+ virtual DefinitionMutable *toDefinitionMutable_() = 0;
+ virtual const DefinitionImpl *toDefinitionImpl_() const = 0;
+};
+
+class DefinitionMutable
+{
+ public:
+
+
+ //-----------------------------------------------------------------------------------
// ---- setters -----
//-----------------------------------------------------------------------------------
@@ -316,10 +344,10 @@ class Definition : public DefinitionIntf
virtual void setReference(const char *r) = 0;
// source references
- virtual void setBodySegment(int bls,int ble) = 0;
+ virtual void setBodySegment(int defLine, int bls,int ble) = 0;
virtual void setBodyDef(FileDef *fd) = 0;
- virtual void setRefItems(const std::vector<ListItemInfo> &sli) = 0;
+ virtual void setRefItems(const RefItemVector &sli) = 0;
virtual void setOuterScope(Definition *d) = 0;
virtual void setHidden(bool b) = 0;
@@ -332,9 +360,9 @@ class Definition : public DefinitionIntf
// --- actions ----
//-----------------------------------------------------------------------------------
- virtual void makePartOfGroup(GroupDef *gd) = 0;
+ virtual void makePartOfGroup(const GroupDef *gd) = 0;
- /*! Add the list of anchors that mark the sections that are found in the
+ /*! Add the list of anchors that mark the sections that are found in the
* documentation.
*/
virtual void addSectionsToDefinition(const std::vector<const SectionInfo*> &anchorList) = 0;
@@ -343,6 +371,9 @@ class Definition : public DefinitionIntf
virtual void mergeRefItems(Definition *d) = 0;
virtual void addInnerCompound(const Definition *d) = 0;
virtual void addSectionsToIndex() = 0;
+ virtual void mergeReferences(const Definition *other) = 0;
+ virtual void mergeReferencedBy(const Definition *other) = 0;
+ virtual void computeTooltip() = 0;
//-----------------------------------------------------------------------------------
// --- writing output ----
@@ -357,47 +388,24 @@ class Definition : public DefinitionIntf
virtual void writeDocAnchorsToTagFile(FTextStream &) const = 0;
virtual void writeToc(OutputList &ol, const LocalToc &lt) const = 0;
- //-----------------------------------------------------------------------------------
- // --- cookie storage ----
- //-----------------------------------------------------------------------------------
- virtual void setCookie(Cookie *cookie) const = 0;
- virtual Cookie *cookie() const = 0;
-
- //-----------------------------------------------------------------------------------
- // --- symbol name ----
- //-----------------------------------------------------------------------------------
- virtual void _setSymbolName(const QCString &name) = 0;
- virtual QCString _symbolName() const = 0;
-};
-
-/** A list of Definition objects. */
-class DefinitionList : public QList<Definition>, public DefinitionIntf
-{
- public:
- ~DefinitionList() {}
- DefType definitionType() const { return TypeSymbolList; }
- int compareValues(const Definition *item1,const Definition *item2) const
- {
- return qstricmp(item1->name(),item2->name());
- }
+ // ---------------------------------
+ virtual ~DefinitionMutable() = default;
+ private:
+ friend Definition* toDefinition(DefinitionMutable *);
+ virtual Definition *toDefinition_() = 0;
};
-/** An iterator for Definition objects in a DefinitionList. */
-class DefinitionListIterator : public QListIterator<Definition>
-{
- public:
- DefinitionListIterator(const DefinitionList &l) :
- QListIterator<Definition>(l) {}
- ~DefinitionListIterator() {}
-};
+Definition *toDefinition(DefinitionMutable *dm);
+DefinitionMutable *toDefinitionMutable(Definition *d);
+DefinitionMutable *toDefinitionMutable(const Definition *d);
/** Reads a fragment from file \a fileName starting with line \a startLine
- * and ending with line \a endLine. The result is returned as a string
- * via \a result. The function returns TRUE if successful and FALSE
+ * and ending with line \a endLine. The result is returned as a string
+ * via \a result. The function returns TRUE if successful and FALSE
* in case of an error.
*/
-bool readCodeFragment(const char *fileName,
+bool readCodeFragment(const char *fileName,
int &startLine,int &endLine,
QCString &result);
#endif
diff --git a/src/definitionimpl.h b/src/definitionimpl.h
index 2d8886d..541e346 100644
--- a/src/definitionimpl.h
+++ b/src/definitionimpl.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2019 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,112 +18,116 @@
#ifndef DEFINITIONIMPL_H
#define DEFINITIONIMPL_H
+#include <unordered_map>
+#include <string>
+
#include "definition.h"
-class DefinitionImpl : virtual public Definition
+class DefinitionImpl
{
public:
- /*! Create a new definition */
DefinitionImpl(
+ Definition *def,
const char *defFileName,int defLine,int defColumn,
const char *name,const char *b=0,const char *d=0,
bool isSymbol=TRUE);
virtual ~DefinitionImpl();
- virtual bool isAlias() const { return FALSE; }
- virtual QCString name() const;
- virtual bool isAnonymous() const;
- virtual QCString localName() const;
- virtual QCString qualifiedName() const;
- virtual QCString symbolName() const;
- virtual QCString getSourceFileBase() const;
- virtual QCString getSourceAnchor() const;
- virtual QCString documentation() const;
- virtual int docLine() const;
- virtual QCString docFile() const;
- virtual QCString briefDescription(bool abbreviate=FALSE) const;
- virtual QCString briefDescriptionAsTooltip() const;
- virtual int briefLine() const;
- virtual QCString inbodyDocumentation() const;
- virtual QCString inbodyFile() const;
- virtual int inbodyLine() const;
- virtual QCString briefFile() const;
- virtual QCString getDefFileName() const;
- virtual QCString getDefFileExtension() const;
- virtual int getDefLine() const;
- virtual int getDefColumn() const;
- virtual bool hasDocumentation() const;
- virtual bool hasUserDocumentation() const;
- virtual bool isVisibleInProject() const;
- virtual bool isVisible() const;
- virtual bool isHidden() const;
- virtual bool isArtificial() const;
- virtual QCString getReference() const;
- virtual bool isReference() const;
- virtual QCString externalReference(const QCString &relPath) const;
- virtual int getStartBodyLine() const;
- virtual int getEndBodyLine() const;
- virtual FileDef *getBodyDef() const;
- virtual SrcLangExt getLanguage() const;
- virtual GroupList *partOfGroups() const;
- virtual bool isLinkableViaGroup() const;
- virtual const std::vector<ListItemInfo> &xrefListItems() const;
- virtual Definition *findInnerCompound(const char *name) const;
- virtual Definition *getOuterScope() const;
- virtual MemberSDict *getReferencesMembers() const;
- virtual MemberSDict *getReferencedByMembers() const;
- virtual bool hasSections() const;
- virtual bool hasSources() const;
- virtual bool hasBriefDescription() const;
- virtual QCString id() const;
- virtual SectionDict * getSectionDict() const;
- virtual void setName(const char *name);
- virtual void setId(const char *name);
- virtual void setDefFile(const QCString& df,int defLine,int defColumn);
- virtual void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE);
- virtual void setBriefDescription(const char *b,const char *briefFile,int briefLine);
- virtual void setInbodyDocumentation(const char *d,const char *docFile,int docLine);
- virtual void setReference(const char *r);
- virtual void addSectionsToDefinition(const std::vector<const SectionInfo*> &anchorList);
- virtual void setBodySegment(int bls,int ble);
- virtual void setBodyDef(FileDef *fd);
- virtual void addSourceReferencedBy(const MemberDef *d);
- virtual void addSourceReferences(const MemberDef *d);
- virtual void setRefItems(const std::vector<ListItemInfo> &sli);
- virtual void mergeRefItems(Definition *d);
- virtual void addInnerCompound(const Definition *d);
- virtual void setOuterScope(Definition *d);
- virtual void setHidden(bool b);
- virtual void setArtificial(bool b);
- virtual void setLanguage(SrcLangExt lang);
- virtual void writeSourceDef(OutputList &ol,const char *scopeName) const;
- virtual void writeInlineCode(OutputList &ol,const char *scopeName) const;
- virtual void writeSourceRefs(OutputList &ol,const char *scopeName) const;
- virtual void writeSourceReffedBy(OutputList &ol,const char *scopeName) const;
- virtual void makePartOfGroup(GroupDef *gd);
- virtual void writeNavigationPath(OutputList &ol) const;
- virtual QCString navigationPathAsString() const;
- virtual void writeQuickMemberLinks(OutputList &,const MemberDef *) const;
- virtual void writeSummaryLinks(OutputList &) const;
- virtual QCString pathFragment() const;
- virtual void writeDocAnchorsToTagFile(FTextStream &) const;
- virtual void setLocalName(const QCString name);
- virtual void addSectionsToIndex();
- virtual void writeToc(OutputList &ol, const LocalToc &lt) const;
- virtual void setCookie(Cookie *cookie) const;
- virtual Cookie *cookie() const;
-
- protected:
+ QCString name() const;
+ bool isAnonymous() const;
+ QCString localName() const;
+ QCString qualifiedName() const;
+ QCString symbolName() const;
+ QCString getSourceFileBase() const;
+ QCString getSourceAnchor() const;
+ QCString documentation() const;
+ int docLine() const;
+ QCString docFile() const;
+ QCString briefDescription(bool abbreviate=FALSE) const;
+ QCString briefDescriptionAsTooltip() const;
+ int briefLine() const;
+ QCString inbodyDocumentation() const;
+ QCString inbodyFile() const;
+ int inbodyLine() const;
+ QCString briefFile() const;
+ QCString getDefFileName() const;
+ QCString getDefFileExtension() const;
+ int getDefLine() const;
+ int getDefColumn() const;
+ bool hasDocumentation() const;
+ bool hasUserDocumentation() const;
+ bool isVisibleInProject() const;
+ bool isVisible() const;
+ bool isHidden() const;
+ bool isArtificial() const;
+ QCString getReference() const;
+ bool isReference() const;
+ QCString externalReference(const QCString &relPath) const;
+ int getStartDefLine() const;
+ int getStartBodyLine() const;
+ int getEndBodyLine() const;
+ FileDef *getBodyDef() const;
+ SrcLangExt getLanguage() const;
+ const GroupList &partOfGroups() const;
+ bool isLinkableViaGroup() const;
+ const RefItemVector &xrefListItems() const;
+ const Definition *findInnerCompound(const char *name) const;
+ Definition *getOuterScope() const;
+ std::vector<const MemberDef *> getReferencesMembers() const;
+ std::vector<const MemberDef *> getReferencedByMembers() const;
+ bool hasSections() const;
+ bool hasSources() const;
+ bool hasBriefDescription() const;
+ QCString id() const;
+ const SectionRefs &getSectionRefs() const;
+ void setName(const char *name);
+ void setId(const char *name);
+ void setDefFile(const QCString& df,int defLine,int defColumn);
+ void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE);
+ void setBriefDescription(const char *b,const char *briefFile,int briefLine);
+ void setInbodyDocumentation(const char *d,const char *docFile,int docLine);
+ void setReference(const char *r);
+ void addSectionsToDefinition(const std::vector<const SectionInfo*> &anchorList);
+ void setBodySegment(int defLine,int bls,int ble);
+ void setBodyDef(FileDef *fd);
+ void addSourceReferencedBy(const MemberDef *d);
+ void addSourceReferences(const MemberDef *d);
+ void setRefItems(const RefItemVector &sli);
+ void mergeRefItems(Definition *d);
+ void mergeReferences(const Definition *other);
+ void mergeReferencedBy(const Definition *other);
+ void addInnerCompound(const Definition *d);
+ void setOuterScope(Definition *d);
+ void setHidden(bool b);
+ void setArtificial(bool b);
+ void setLanguage(SrcLangExt lang);
+ void writeSourceDef(OutputList &ol,const char *scopeName) const;
+ void writeInlineCode(OutputList &ol,const char *scopeName) const;
+ void writeSourceRefs(OutputList &ol,const char *scopeName) const;
+ void writeSourceReffedBy(OutputList &ol,const char *scopeName) const;
+ void makePartOfGroup(const GroupDef *gd);
+ void writeNavigationPath(OutputList &ol) const;
+ QCString navigationPathAsString() const;
+ void writeQuickMemberLinks(OutputList &,const MemberDef *) const;
+ void writeSummaryLinks(OutputList &) const;
+ QCString pathFragment() const;
+ void writeDocAnchorsToTagFile(FTextStream &) const;
+ void setLocalName(const QCString name);
+ void addSectionsToIndex();
+ void writeToc(OutputList &ol, const LocalToc &lt) const;
+ void setCookie(Definition::Cookie *cookie) const;
+ Definition::Cookie *cookie() const;
+ void computeTooltip();
+ void _setSymbolName(const QCString &name);
+ QCString _symbolName() const;
DefinitionImpl(const DefinitionImpl &d);
- private:
- virtual void _setSymbolName(const QCString &name);
- virtual QCString _symbolName() const ;
+ private:
int _getXRefListId(const char *listName) const;
- void _writeSourceRefList(OutputList &ol,const char *scopeName,
- const QCString &text,MemberSDict *members,bool) const;
+ void _writeSourceRefList(OutputList &ol,const char *scopeName,const QCString &text,
+ const std::unordered_map<std::string,const MemberDef *> &members,bool) const;
void _setBriefDescription(const char *b,const char *briefFile,int briefLine);
void _setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace,bool atTop);
void _setInbodyDocumentation(const char *d,const char *docFile,int docLine);
@@ -134,154 +138,308 @@ class DefinitionImpl : virtual public Definition
IMPL *m_impl; // internal structure holding all private data
};
-class DefinitionAliasImpl : virtual public Definition
+template<class Base>
+class DefinitionMixin : public Base
{
public:
- DefinitionAliasImpl(const Definition *scope,const Definition *alias);
+ /*! Create a new definition */
+ DefinitionMixin(
+ const char *defFileName,int defLine,int defColumn,
+ const char *name,const char *b=0,const char *d=0,
+ bool isSymbol=TRUE) : m_impl(this,defFileName,defLine,defColumn,name,b,d,isSymbol) {}
+ virtual ~DefinitionMixin() {}
+
+ virtual bool isAlias() const { return FALSE; }
+
+ //======== Definition
+ virtual QCString name() const { return m_impl.name(); }
+ virtual bool isAnonymous() const { return m_impl.isAnonymous(); }
+ virtual QCString localName() const { return m_impl.localName(); }
+ virtual QCString qualifiedName() const { return m_impl.qualifiedName(); }
+ virtual QCString symbolName() const { return m_impl.symbolName(); }
+ virtual QCString getSourceFileBase() const { return m_impl.getSourceFileBase(); }
+ virtual QCString getSourceAnchor() const { return m_impl.getSourceAnchor(); }
+ virtual QCString documentation() const { return m_impl.documentation(); }
+ virtual int docLine() const { return m_impl.docLine(); }
+ virtual QCString docFile() const { return m_impl.docFile(); }
+ virtual QCString briefDescription(bool abbreviate=FALSE) const { return m_impl.briefDescription(abbreviate); }
+ virtual QCString briefDescriptionAsTooltip() const { return m_impl.briefDescriptionAsTooltip(); }
+ virtual int briefLine() const { return m_impl.briefLine(); }
+ virtual QCString inbodyDocumentation() const { return m_impl.inbodyDocumentation(); }
+ virtual QCString inbodyFile() const { return m_impl.inbodyFile(); }
+ virtual int inbodyLine() const { return m_impl.inbodyLine(); }
+ virtual QCString briefFile() const { return m_impl.briefFile(); }
+ virtual QCString getDefFileName() const { return m_impl.getDefFileName(); }
+ virtual QCString getDefFileExtension() const { return m_impl.getDefFileExtension(); }
+ virtual int getDefLine() const { return m_impl.getDefLine(); }
+ virtual int getDefColumn() const { return m_impl.getDefColumn(); }
+ virtual bool hasDocumentation() const { return m_impl.hasDocumentation(); }
+ virtual bool hasUserDocumentation() const { return m_impl.hasUserDocumentation(); }
+ virtual bool isVisibleInProject() const { return m_impl.isVisibleInProject(); }
+ virtual bool isVisible() const { return m_impl.isVisible(); }
+ virtual bool isHidden() const { return m_impl.isHidden(); }
+ virtual bool isArtificial() const { return m_impl.isArtificial(); }
+ virtual QCString getReference() const { return m_impl.getReference(); }
+ virtual bool isReference() const { return m_impl.isReference(); }
+ virtual QCString externalReference(const QCString &relPath) const { return m_impl.externalReference(relPath); }
+ virtual int getStartDefLine() const { return m_impl.getStartDefLine(); }
+ virtual int getStartBodyLine() const { return m_impl.getStartBodyLine(); }
+ virtual int getEndBodyLine() const { return m_impl.getEndBodyLine(); }
+ virtual FileDef *getBodyDef() const { return m_impl.getBodyDef(); }
+ virtual SrcLangExt getLanguage() const { return m_impl.getLanguage(); }
+ virtual const GroupList &partOfGroups() const { return m_impl.partOfGroups(); }
+ virtual bool isLinkableViaGroup() const { return m_impl.isLinkableViaGroup(); }
+ virtual const RefItemVector &xrefListItems() const { return m_impl.xrefListItems(); }
+ virtual const Definition *findInnerCompound(const char *name) const { return m_impl.findInnerCompound(name); }
+ virtual Definition *getOuterScope() const { return m_impl.getOuterScope(); }
+ virtual std::vector<const MemberDef *> getReferencesMembers() const { return m_impl.getReferencesMembers(); }
+ virtual std::vector<const MemberDef *> getReferencedByMembers() const { return m_impl.getReferencedByMembers(); }
+ virtual bool hasSections() const { return m_impl.hasSections(); }
+ virtual bool hasSources() const { return m_impl.hasSources(); }
+ virtual bool hasBriefDescription() const { return m_impl.hasBriefDescription(); }
+ virtual QCString id() const { return m_impl.id(); }
+ virtual const SectionRefs &getSectionRefs() const { return m_impl.getSectionRefs(); }
+
+ //======== DefinitionMutable
+ virtual void setName(const char *name) { m_impl.setName(name); }
+ virtual void setId(const char *name) { m_impl.setId(name); }
+ virtual void setDefFile(const QCString& df,int defLine,int defColumn)
+ { m_impl.setDefFile(df,defLine,defColumn); }
+ virtual void setDocumentation(const char *doc,const char *docFile,int docLine,bool stripWhiteSpace=TRUE)
+ { m_impl.setDocumentation(doc,docFile,docLine,stripWhiteSpace); }
+ virtual void setBriefDescription(const char *brief,const char *briefFile,int briefLine)
+ { m_impl.setBriefDescription(brief,briefFile,briefLine); }
+ virtual void setInbodyDocumentation(const char *doc,const char *docFile,int docLine)
+ { m_impl.setInbodyDocumentation(doc,docFile,docLine); }
+ virtual void setReference(const char *r)
+ { m_impl.setReference(r); }
+ virtual void addSectionsToDefinition(const std::vector<const SectionInfo*> &anchorList)
+ { m_impl.addSectionsToDefinition(anchorList); }
+ virtual void setBodySegment(int defLine,int bls,int ble)
+ { m_impl.setBodySegment(defLine,bls,ble); }
+ virtual void setBodyDef(FileDef *fd)
+ { m_impl.setBodyDef(fd); }
+ virtual void addSourceReferencedBy(const MemberDef *md)
+ { m_impl.addSourceReferencedBy(md); }
+ virtual void addSourceReferences(const MemberDef *md)
+ { m_impl.addSourceReferences(md); }
+ virtual void setRefItems(const RefItemVector &sli)
+ { m_impl.setRefItems(sli); }
+ virtual void mergeRefItems(Definition *def)
+ { m_impl.mergeRefItems(def); }
+ virtual void mergeReferences(const Definition *other)
+ { m_impl.mergeReferences(other); }
+ virtual void mergeReferencedBy(const Definition *other)
+ { m_impl.mergeReferencedBy(other); }
+ virtual void addInnerCompound(const Definition *def)
+ { m_impl.addInnerCompound(def); }
+ virtual void setOuterScope(Definition *def)
+ { m_impl.setOuterScope(def); }
+ virtual void setHidden(bool b)
+ { m_impl.setHidden(b); }
+ virtual void setArtificial(bool b)
+ { m_impl.setArtificial(b); }
+ virtual void setLanguage(SrcLangExt lang)
+ { m_impl.setLanguage(lang); }
+ virtual void writeSourceDef(OutputList &ol,const char *scopeName) const
+ { m_impl.writeSourceDef(ol,scopeName); }
+ virtual void writeInlineCode(OutputList &ol,const char *scopeName) const
+ { m_impl.writeInlineCode(ol,scopeName); }
+ virtual void writeSourceRefs(OutputList &ol,const char *scopeName) const
+ { m_impl.writeSourceRefs(ol,scopeName); }
+ virtual void writeSourceReffedBy(OutputList &ol,const char *scopeName) const
+ { m_impl.writeSourceReffedBy(ol,scopeName); }
+ virtual void makePartOfGroup(const GroupDef *gd)
+ { m_impl.makePartOfGroup(gd); }
+ virtual void writeNavigationPath(OutputList &ol) const
+ { m_impl.writeNavigationPath(ol); }
+ virtual QCString navigationPathAsString() const
+ { return m_impl.navigationPathAsString(); }
+ virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *md) const
+ { m_impl.writeQuickMemberLinks(ol,md); }
+ virtual void writeSummaryLinks(OutputList &ol) const
+ { m_impl.writeSummaryLinks(ol); }
+ virtual QCString pathFragment() const
+ { return m_impl.pathFragment(); }
+ virtual void writeDocAnchorsToTagFile(FTextStream &fs) const
+ { m_impl.writeDocAnchorsToTagFile(fs); }
+ virtual void setLocalName(const QCString name)
+ { m_impl.setLocalName(name); }
+ virtual void addSectionsToIndex()
+ { m_impl.addSectionsToIndex(); }
+ virtual void writeToc(OutputList &ol, const LocalToc &lt) const
+ { m_impl.writeToc(ol,lt); }
+ virtual void setCookie(Definition::Cookie *cookie) const
+ { m_impl.setCookie(cookie); }
+ virtual Definition::Cookie *cookie() const
+ { return m_impl.cookie(); }
+ virtual void computeTooltip()
+ { m_impl.computeTooltip(); }
+ virtual void _setSymbolName(const QCString &name)
+ { m_impl._setSymbolName(name); }
+ virtual QCString _symbolName() const
+ { return m_impl._symbolName(); }
+
+ protected:
+
+ DefinitionMixin(const DefinitionMixin &def) = default;
+
+ private:
+ virtual Definition *toDefinition_() { return this; }
+ virtual DefinitionMutable *toDefinitionMutable_() { return this; }
+ virtual const DefinitionImpl *toDefinitionImpl_() const { return &m_impl; }
+
+ DefinitionImpl m_impl;
+};
+
+class DefinitionAliasImpl
+{
+ public:
+ DefinitionAliasImpl(Definition *def,const Definition *scope,const Definition *alias);
virtual ~DefinitionAliasImpl();
+ void init();
+ void deinit();
+ QCString name() const;
+ QCString qualifiedName() const;
+ private:
+ Definition *m_def;
+ const Definition *m_scope;
+ QCString m_symbolName;
+ QCString m_qualifiedName;
+};
+
+template<class Base>
+class DefinitionAliasMixin : public Base
+{
+ public:
+ DefinitionAliasMixin(const Definition *scope,const Definition *alias)
+ : m_impl(this,scope,alias), m_scope(scope), m_alias(alias), m_cookie(0) {}
+
+ void init() { m_impl.init(); }
+ void deinit() { m_impl.deinit(); }
+
+ virtual ~DefinitionAliasMixin() = default;
virtual bool isAlias() const { return TRUE; }
+
+ //======== Definition
virtual QCString name() const
- { return m_def->name(); }
+ { return m_impl.name(); }
virtual bool isAnonymous() const
- { return m_def->isAnonymous(); }
+ { return m_alias->isAnonymous(); }
virtual QCString localName() const
- { return m_def->localName(); }
+ { return m_alias->localName(); }
virtual QCString qualifiedName() const
- { return m_def->qualifiedName(); }
+ { return m_impl.qualifiedName(); }
virtual QCString symbolName() const
- { return m_def->symbolName(); }
+ { return m_alias->symbolName(); }
virtual QCString getSourceFileBase() const
- { return m_def->getSourceFileBase(); }
+ { return m_alias->getSourceFileBase(); }
virtual QCString getSourceAnchor() const
- { return m_def->getSourceAnchor(); }
+ { return m_alias->getSourceAnchor(); }
virtual QCString documentation() const
- { return m_def->documentation(); }
+ { return m_alias->documentation(); }
virtual int docLine() const
- { return m_def->docLine(); }
+ { return m_alias->docLine(); }
virtual QCString docFile() const
- { return m_def->docFile(); }
+ { return m_alias->docFile(); }
virtual QCString briefDescription(bool abbreviate=FALSE) const
- { return m_def->briefDescription(abbreviate); }
+ { return m_alias->briefDescription(abbreviate); }
virtual QCString briefDescriptionAsTooltip() const
- { return m_def->briefDescriptionAsTooltip(); }
+ { return m_alias->briefDescriptionAsTooltip(); }
virtual int briefLine() const
- { return m_def->briefLine(); }
+ { return m_alias->briefLine(); }
virtual QCString inbodyDocumentation() const
- { return m_def->inbodyDocumentation(); }
+ { return m_alias->inbodyDocumentation(); }
virtual QCString inbodyFile() const
- { return m_def->inbodyFile(); }
+ { return m_alias->inbodyFile(); }
virtual int inbodyLine() const
- { return m_def->inbodyLine(); }
+ { return m_alias->inbodyLine(); }
virtual QCString briefFile() const
- { return m_def->briefFile(); }
+ { return m_alias->briefFile(); }
virtual QCString getDefFileName() const
- { return m_def->getDefFileName(); }
+ { return m_alias->getDefFileName(); }
virtual QCString getDefFileExtension() const
- { return m_def->getDefFileExtension(); }
+ { return m_alias->getDefFileExtension(); }
virtual int getDefLine() const
- { return m_def->getDefLine(); }
+ { return m_alias->getDefLine(); }
virtual int getDefColumn() const
- { return m_def->getDefColumn(); }
+ { return m_alias->getDefColumn(); }
virtual bool hasDocumentation() const
- { return m_def->hasDocumentation(); }
+ { return m_alias->hasDocumentation(); }
virtual bool hasUserDocumentation() const
- { return m_def->hasUserDocumentation(); }
+ { return m_alias->hasUserDocumentation(); }
virtual bool isVisibleInProject() const
- { return m_def->isVisibleInProject(); }
+ { return m_alias->isVisibleInProject(); }
virtual bool isVisible() const
- { return m_def->isVisible(); }
+ { return m_alias->isVisible(); }
virtual bool isHidden() const
- { return m_def->isHidden(); }
+ { return m_alias->isHidden(); }
virtual bool isArtificial() const
- { return m_def->isArtificial(); }
+ { return m_alias->isArtificial(); }
virtual QCString getReference() const
- { return m_def->getReference(); }
+ { return m_alias->getReference(); }
virtual bool isReference() const
- { return m_def->isReference(); }
+ { return m_alias->isReference(); }
virtual QCString externalReference(const QCString &relPath) const
- { return m_def->externalReference(relPath); }
+ { return m_alias->externalReference(relPath); }
+ virtual int getStartDefLine() const
+ { return m_alias->getStartDefLine(); }
virtual int getStartBodyLine() const
- { return m_def->getStartBodyLine(); }
+ { return m_alias->getStartBodyLine(); }
virtual int getEndBodyLine() const
- { return m_def->getEndBodyLine(); }
+ { return m_alias->getEndBodyLine(); }
virtual FileDef *getBodyDef() const
- { return m_def->getBodyDef(); }
+ { return m_alias->getBodyDef(); }
virtual SrcLangExt getLanguage() const
- { return m_def->getLanguage(); }
- virtual GroupList *partOfGroups() const
- { return m_def->partOfGroups(); }
+ { return m_alias->getLanguage(); }
+ virtual const GroupList &partOfGroups() const
+ { return m_alias->partOfGroups(); }
virtual bool isLinkableViaGroup() const
- { return m_def->isLinkableViaGroup(); }
- virtual const std::vector<ListItemInfo> &xrefListItems() const
- { return m_def->xrefListItems(); }
- virtual Definition *findInnerCompound(const char *name) const
- { return m_def->findInnerCompound(name); }
+ { return m_alias->isLinkableViaGroup(); }
+ virtual const RefItemVector &xrefListItems() const
+ { return m_alias->xrefListItems(); }
+ virtual const Definition *findInnerCompound(const char *name) const
+ { return m_alias->findInnerCompound(name); }
virtual Definition *getOuterScope() const
{ return const_cast<Definition*>(m_scope); }
- virtual MemberSDict *getReferencesMembers() const
- { return m_def->getReferencesMembers(); }
- virtual MemberSDict *getReferencedByMembers() const
- { return m_def->getReferencedByMembers(); }
+ virtual std::vector<const MemberDef *> getReferencesMembers() const
+ { return m_alias->getReferencesMembers(); }
+ virtual std::vector<const MemberDef *> getReferencedByMembers() const
+ { return m_alias->getReferencedByMembers(); }
virtual bool hasSections() const
- { return m_def->hasSections(); }
+ { return m_alias->hasSections(); }
virtual bool hasSources() const
- { return m_def->hasSources(); }
+ { return m_alias->hasSources(); }
virtual bool hasBriefDescription() const
- { return m_def->hasBriefDescription(); }
+ { return m_alias->hasBriefDescription(); }
virtual QCString id() const
- { return m_def->id(); }
- virtual SectionDict * getSectionDict() const
- { return m_def->getSectionDict(); }
- virtual QCString navigationPathAsString() const
- { return m_def->navigationPathAsString(); }
- virtual QCString pathFragment() const
- { return m_def->pathFragment(); }
- virtual void setName(const char *name) { }
- virtual void setId(const char *name) { }
- virtual void setDefFile(const QCString& df,int defLine,int defColumn) {}
- virtual void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE) {}
- virtual void setBriefDescription(const char *b,const char *briefFile,int briefLine) {}
- virtual void setInbodyDocumentation(const char *d,const char *docFile,int docLine) {}
- virtual void setReference(const char *r) {}
- virtual void addSectionsToDefinition(const std::vector<const SectionInfo*> &anchorList) {}
- virtual void setBodySegment(int bls,int ble) {}
- virtual void setBodyDef(FileDef *fd) {}
- virtual void addSourceReferencedBy(const MemberDef *d) {}
- virtual void addSourceReferences(const MemberDef *d) {}
- virtual void setRefItems(const std::vector<ListItemInfo> &sli) {}
- virtual void mergeRefItems(Definition *d) {}
- virtual void addInnerCompound(const Definition *d) {}
- virtual void setOuterScope(Definition *d) {}
- virtual void setHidden(bool b) {}
- virtual void setArtificial(bool b) {}
- virtual void setLanguage(SrcLangExt lang) {}
- virtual void writeSourceDef(OutputList &ol,const char *scopeName) const {}
- virtual void writeInlineCode(OutputList &ol,const char *scopeName) const {}
- virtual void writeSourceRefs(OutputList &ol,const char *scopeName) const {}
- virtual void writeSourceReffedBy(OutputList &ol,const char *scopeName) const {}
- virtual void makePartOfGroup(GroupDef *gd) {}
- virtual void writeNavigationPath(OutputList &ol) const {}
- virtual void writeQuickMemberLinks(OutputList &,const MemberDef *) const {}
- virtual void writeSummaryLinks(OutputList &) const {}
- virtual void writeDocAnchorsToTagFile(FTextStream &) const {}
- virtual void setLocalName(const QCString name) {}
- virtual void addSectionsToIndex() {}
- virtual void writeToc(OutputList &ol, const LocalToc &lt) const {}
- virtual void setCookie(Cookie *cookie) const { delete m_cookie; m_cookie = cookie; }
- virtual Cookie *cookie() const { return m_cookie; }
+ { return m_alias->id(); }
+ virtual const SectionRefs &getSectionRefs() const
+ { return m_alias->getSectionRefs(); }
+ virtual QCString navigationPathAsString() const
+ { return m_alias->navigationPathAsString(); }
+ virtual QCString pathFragment() const
+ { return m_alias->pathFragment(); }
+
protected:
- const Definition *getAlias() const { return m_def; }
+ const Definition *getAlias() const { return m_alias; }
const Definition *getScope() const { return m_scope; }
private:
+ virtual Definition *toDefinition_() { return this; }
+ virtual DefinitionMutable *toDefinitionMutable_() { return 0; }
+ virtual const DefinitionImpl *toDefinitionImpl_() const { return 0; }
+
+ virtual void setCookie(Definition::Cookie *cookie) const { delete m_cookie; m_cookie = cookie; }
+ virtual Definition::Cookie *cookie() const { return m_cookie; }
virtual void _setSymbolName(const QCString &name) { m_symbolName = name; }
virtual QCString _symbolName() const { return m_symbolName; }
+ DefinitionAliasImpl m_impl;
const Definition *m_scope;
- const Definition *m_def;
- mutable Cookie *m_cookie;
+ const Definition *m_alias;
+ mutable Definition::Cookie *m_cookie;
QCString m_symbolName;
};
-
#endif
diff --git a/src/diagram.cpp b/src/diagram.cpp
index 18817e9..80c85c6 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -36,86 +33,80 @@
//-----------------------------------------------------------------------------
-class DiagramItemList;
+class TreeDiagram;
+class DiagramItem;
+using DiagramItemList = std::vector<DiagramItem*>;
/** Class representing a single node in the built-in class diagram */
-class DiagramItem
+class DiagramItem
{
public:
- DiagramItem(DiagramItem *p,int number,const ClassDef *cd,
+ DiagramItem(DiagramItem *p,uint number,const ClassDef *cd,
Protection prot,Specifier virt,const char *ts);
- ~DiagramItem();
QCString label() const;
QCString fileName() const;
- DiagramItem *parentItem() { return parent; }
- DiagramItemList *getChildren() { return children; }
- void move(int dx,int dy) { x+=dx; y+=dy; }
- int xPos() const { return x; }
- int yPos() const { return y; }
- int avgChildPos() const;
- int numChildren() const;
+ DiagramItem *parentItem() { return m_parent; }
+ DiagramItemList getChildren() { return m_children; }
+ void move(int dx,int dy) { m_x+=(uint)dx; m_y+=(uint)dy; }
+ uint xPos() const { return m_x; }
+ uint yPos() const { return m_y; }
+ uint avgChildPos() const;
+ uint numChildren() const;
void addChild(DiagramItem *di);
- int number() const { return num; }
- Protection protection() const { return prot; }
- Specifier virtualness() const { return virt; }
- void putInList() { inList=TRUE; }
- bool isInList() const { return inList; }
- const ClassDef *getClassDef() const { return classDef; }
+ uint number() const { return m_num; }
+ Protection protection() const { return m_prot; }
+ Specifier virtualness() const { return m_virt; }
+ void putInList() { m_inList=TRUE; }
+ bool isInList() const { return m_inList; }
+ const ClassDef *getClassDef() const { return m_classDef; }
private:
- DiagramItemList *children;
- DiagramItem *parent;
- int x,y;
- int num;
- Protection prot;
- Specifier virt;
- QCString templSpec;
- bool inList;
- const ClassDef *classDef;
-};
-
-/** Class representing a list of DiagramItem object. */
-class DiagramItemList : public QList<DiagramItem>
-{
- public:
- DiagramItemList() : QList<DiagramItem>() {}
- ~DiagramItemList() {}
+ DiagramItemList m_children;
+ DiagramItem *m_parent;
+ uint m_x = 0;
+ uint m_y = 0;
+ uint m_num;
+ Protection m_prot;
+ Specifier m_virt;
+ QCString m_templSpec;
+ bool m_inList = false;
+ const ClassDef *m_classDef;
};
/** Class representing a row in the built-in class diagram */
-class DiagramRow : public QList<DiagramItem>
+class DiagramRow
{
public:
- DiagramRow(TreeDiagram *d,int l) : QList<DiagramItem>()
- {
- diagram=d;
- level=l;
- setAutoDelete(TRUE);
- }
+ using Ptr = std::unique_ptr<DiagramItem>;
+ using Vec = std::vector<Ptr>;
+ using iterator = typename Vec::iterator;
+ using reverse_iterator = typename Vec::reverse_iterator;
+ DiagramRow(TreeDiagram *d,uint l) : m_diagram(d), m_level(l) {}
void insertClass(DiagramItem *parent,const ClassDef *cd,bool doBases,
Protection prot,Specifier virt,const char *ts);
- uint number() { return level; }
- private:
- TreeDiagram *diagram;
- uint level;
-};
+ uint number() { return m_level; }
-/** Class representing iterator for the rows in the built-in class diagram. */
-class DiagramRowIterator : public QListIterator<DiagramRow>
-{
- public:
- DiagramRowIterator(const QList<DiagramRow> &d)
- : QListIterator<DiagramRow>(d) {}
+ DiagramItem *item(int index) { return m_items.at(index).get(); }
+ uint numItems() const { return static_cast<uint>(m_items.size()); }
+ iterator begin() { return m_items.begin(); }
+ iterator end() { return m_items.end(); }
+ reverse_iterator rbegin() { return m_items.rbegin(); }
+ reverse_iterator rend() { return m_items.rend(); }
+ private:
+ TreeDiagram *m_diagram;
+ uint m_level;
+ Vec m_items;
};
/** Class representing the tree layout for the built-in class diagram. */
-class TreeDiagram : public QList<DiagramRow>
+class TreeDiagram
{
public:
+ using Ptr = std::unique_ptr<DiagramRow>;
+ using Vec = std::vector<Ptr>;
+ using iterator = typename Vec::iterator;
TreeDiagram(const ClassDef *root,bool doBases);
- ~TreeDiagram();
void computeLayout();
uint computeRows();
- //uint computeCols();
void moveChildren(DiagramItem *root,int dx);
void computeExtremes(uint *labelWidth,uint *xpos);
void drawBoxes(FTextStream &t,Image *image,
@@ -128,10 +119,17 @@ class TreeDiagram : public QList<DiagramRow>
bool doBase,bool bitmap,
uint baseRows,uint superRows,
uint cellWidth,uint cellheight);
+ DiagramRow *row(int index) { return m_rows.at(index).get(); }
+ uint numRows() const { return static_cast<uint>(m_rows.size()); }
+ DiagramRow *addRow(uint l)
+ { m_rows.push_back(std::make_unique<DiagramRow>(this,l)); return m_rows.back().get(); }
+ iterator begin() { return m_rows.begin(); }
+ iterator end() { return m_rows.end(); }
private:
- bool layoutTree(DiagramItem *root,int row);
+ bool layoutTree(DiagramItem *root,uint row);
TreeDiagram &operator=(const TreeDiagram &);
TreeDiagram(const TreeDiagram &);
+ Vec m_rows;
};
@@ -139,26 +137,14 @@ class TreeDiagram : public QList<DiagramRow>
//-----------------------------------------------------------------------------
const uint maxTreeWidth = 8;
-const int gridWidth = 100;
-const int gridHeight = 100;
+const uint gridWidth = 100;
+const uint gridHeight = 100;
const uint labelHorSpacing = 10; // horizontal distance between labels
const uint labelVertSpacing = 32; // vertical distance between labels
const uint labelHorMargin = 6; // horiz. spacing between label and box
const uint fontHeight = 12; // height of a character
-//static QCString escapeLatex(const char *s)
-//{
-// QCString result;
-// char c;
-// while ((c=*s++))
-// {
-// if (c=='_') result+="\\_";
-// else result+=c;
-// }
-// return result;
-//}
-
static uint protToMask(Protection p)
{
switch(p)
@@ -171,7 +157,7 @@ static uint protToMask(Protection p)
return 0;
}
-static uint protToColor(Protection p)
+static uchar protToColor(Protection p)
{
switch(p)
{
@@ -207,39 +193,44 @@ static uint virtToMask(Specifier p)
}
// pre: dil is not empty
-static Protection getMinProtectionLevel(DiagramItemList *dil)
+static Protection getMinProtectionLevel(const DiagramItemList &dil)
{
- QListIterator<DiagramItem> it(*dil);
- DiagramItem *di=it.current();
- Protection result=di->protection();
- for (++it;(di=it.current());++it)
+ auto it = dil.begin();
+ Protection result = Private;
+ if (it!=dil.end())
{
- Protection p=di->protection();
- if (p!=result)
+ result=(*it)->protection();
+ for (++it;it!=dil.end();++it)
{
- if (result==Protected && p==Public) result=p;
- else if (result==Private) result=p;
+ Protection p=(*it)->protection();
+ if (p!=result)
+ {
+ if (result==Protected && p==Public) result=p;
+ else if (result==Private) result=p;
+ }
}
}
return result;
}
static void writeBitmapBox(DiagramItem *di,Image *image,
- int x,int y,int w,int h,bool firstRow,
+ uint x,uint y,uint w,uint h,bool firstRow,
bool hasDocs,bool children=FALSE)
{
- int colFill = hasDocs ? (firstRow ? 0 : 2) : 7;
- int colBorder = (firstRow || !hasDocs) ? 1 : 3;
- int l = Image::stringLength(di->label());
+ uchar colFill = hasDocs ? (firstRow ? 0 : 2) : 7;
+ uchar colBorder = (firstRow || !hasDocs) ? 1 : 3;
+ uint l = Image::stringLength(di->label());
uint mask=virtToMask(di->virtualness());
image->fillRect(x+1,y+1,w-2,h-2,colFill,mask);
image->drawRect(x,y,w,h,colBorder,mask);
image->writeString(x+(w-l)/2, y+(h-fontHeight)/2, di->label(),1);
if (children)
{
- int i;
+ uint i;
for (i=0;i<5;i++)
+ {
image->drawHorzLine(y+h+i-6,x+w-2-i,x+w-2,firstRow?1:3,0xffffffff);
+ }
}
}
@@ -253,15 +244,15 @@ static void writeVectorBox(FTextStream &t,DiagramItem *di,
}
static void writeMapArea(FTextStream &t,const ClassDef *cd,QCString relPath,
- int x,int y,int w,int h)
+ uint x,uint y,uint w,uint h)
{
if (cd->isLinkable())
{
QCString ref=cd->getReference();
t << "<area ";
- if (!ref.isEmpty())
+ if (!ref.isEmpty())
{
- t << externalLinkTarget();
+ t << externalLinkTarget(true);
}
t << "href=\"";
t << externalRef(relPath,ref,TRUE);
@@ -276,50 +267,36 @@ static void writeMapArea(FTextStream &t,const ClassDef *cd,QCString relPath,
{
t << "title=\"" << convertToHtml(tooltip) << "\" ";
}
- t << "alt=\"" << convertToXML(cd->displayName());
+ t << "alt=\"" << convertToXML(cd->displayName());
t << "\" shape=\"rect\" coords=\"" << x << "," << y << ",";
t << (x+w) << "," << (y+h) << "\"/>" << endl;
}
}
//-----------------------------------------------------------------------------
-DiagramItem::DiagramItem(DiagramItem *p,int number,const ClassDef *cd,
- Protection pr,Specifier vi,const char *ts)
-{
- parent=p;
- x=y=0;
- //name=n;
- num=number;
- children = new DiagramItemList;
- prot=pr;
- virt=vi;
- inList=FALSE;
- classDef=cd;
- templSpec=ts;
-}
-
-DiagramItem::~DiagramItem()
-{
- delete children;
+DiagramItem::DiagramItem(DiagramItem *p,uint number,const ClassDef *cd,
+ Protection pr,Specifier vi,const char *ts)
+ : m_parent(p), m_num(number), m_prot(pr), m_virt(vi), m_templSpec(ts), m_classDef(cd)
+{
}
QCString DiagramItem::label() const
{
QCString result;
- if (!templSpec.isEmpty())
+ if (!m_templSpec.isEmpty())
{
// we use classDef->name() here and not displayName() in order
// to get the name used in the inheritance relation.
- QCString n = classDef->name();
+ QCString n = m_classDef->name();
if (/*n.right(2)=="-g" ||*/ n.right(2)=="-p")
{
n = n.left(n.length()-2);
}
- result=insertTemplateSpecifierInScope(n,templSpec);
+ result=insertTemplateSpecifierInScope(n,m_templSpec);
}
else
{
- result=classDef->displayName();
+ result=m_classDef->displayName();
}
if (Config_getBool(HIDE_SCOPE_NAMES)) result=stripScope(result);
return result;
@@ -327,146 +304,129 @@ QCString DiagramItem::label() const
QCString DiagramItem::fileName() const
{
- return classDef->getOutputFileBase();
+ return m_classDef->getOutputFileBase();
}
-int DiagramItem::avgChildPos() const
+uint DiagramItem::avgChildPos() const
{
DiagramItem *di;
- int c=children->count();
+ size_t c=m_children.size();
if (c==0) // no children -> don't move
return xPos();
- if ((di=children->getFirst())->isInList()) // children should be in a list
+ if ((di=m_children.front())->isInList()) // children should be in a list
return di->xPos();
if (c&1) // odd number of children -> get pos of middle child
- return children->at(c/2)->xPos();
+ return m_children.at(c/2)->xPos();
else // even number of children -> get middle of most middle children
- return (children->at(c/2-1)->xPos()+children->at(c/2)->xPos())/2;
+ return (m_children.at(c/2-1)->xPos()+m_children.at(c/2)->xPos())/2;
}
-int DiagramItem::numChildren() const
+uint DiagramItem::numChildren() const
{
- return children->count();
+ return static_cast<uint>(m_children.size());
}
void DiagramItem::addChild(DiagramItem *di)
{
- children->append(di);
+ m_children.push_back(di);
}
+//---------------------------------------------------------------------------
+
void DiagramRow::insertClass(DiagramItem *parent,const ClassDef *cd,bool doBases,
Protection prot,Specifier virt,const char *ts)
{
- //if (cd->visited) return; // the visit check does not work in case of
- // multiple inheritance of the same class!
- DiagramItem *di=new DiagramItem(parent, diagram->at(level)->count(),
- cd,prot,virt,ts);
- //cd->visited=TRUE;
- if (parent) parent->addChild(di);
- di->move(count()*gridWidth,level*gridHeight);
- append(di);
- BaseClassList *bcl=doBases ? cd->baseClasses() : cd->subClasses();
+ auto di = std::make_unique<DiagramItem>(parent, m_diagram->row(m_level)->numItems(),
+ cd,prot,virt,ts);
+ DiagramItem *di_ptr = di.get();
+ if (parent) parent->addChild(di_ptr);
+ di->move((int)(m_items.size()*gridWidth),(int)(m_level*gridHeight));
+ m_items.push_back(std::move(di));
int count=0;
- if (bcl)
+ for (const auto &bcd : doBases ? cd->baseClasses() : cd->subClasses())
{
/* there are base/sub classes */
- BaseClassListIterator it(*bcl);
- BaseClassDef *bcd;
- for (;(bcd=it.current());++it)
- {
- ClassDef *ccd=bcd->classDef;
- if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/) count++;
- }
+ ClassDef *ccd=bcd.classDef;
+ if (ccd && ccd->isVisibleInHierarchy()) count++;
}
if (count>0 && (prot!=Private || !doBases))
{
DiagramRow *row=0;
- if (diagram->count()<=level+1) /* add new row */
+ if (m_diagram->numRows()<=m_level+1) /* add new row */
{
- row = new DiagramRow(diagram,level+1);
- diagram->append(row);
+ row=m_diagram->addRow(m_level+1);
}
else /* get next row */
{
- row=diagram->at(level+1);
+ row=m_diagram->row(m_level+1);
}
- /* insert base classes in the next row */
- BaseClassListIterator it(*bcl);
- BaseClassDef *bcd;
- for (;(bcd=it.current());++it)
+ for (const auto &bcd : doBases ? cd->baseClasses() : cd->subClasses())
{
- ClassDef *ccd=bcd->classDef;
- if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/)
+ ClassDef *ccd=bcd.classDef;
+ if (ccd && ccd->isVisibleInHierarchy())
{
- row->insertClass(di,ccd,doBases,bcd->prot,
- doBases?bcd->virt:Normal,
- doBases?bcd->templSpecifiers.data():"");
+ row->insertClass(di_ptr,ccd,doBases,bcd.prot,
+ doBases?bcd.virt:Normal,
+ doBases?bcd.templSpecifiers.data():"");
}
}
}
}
-TreeDiagram::TreeDiagram(const ClassDef *root,bool doBases)
-{
- setAutoDelete(TRUE);
- DiagramRow *row=new DiagramRow(this,0);
- append(row);
- row->insertClass(0,root,doBases,Public,Normal,0);
-}
+//---------------------------------------------------------------------------
-TreeDiagram::~TreeDiagram()
+TreeDiagram::TreeDiagram(const ClassDef *root,bool doBases)
{
+ auto row = std::make_unique<DiagramRow>(this,0);
+ DiagramRow *row_ptr = row.get();
+ m_rows.push_back(std::move(row));
+ row_ptr->insertClass(0,root,doBases,Public,Normal,0);
}
-
void TreeDiagram::moveChildren(DiagramItem *root,int dx)
{
- DiagramItemList *dil=root->getChildren();
- QListIterator<DiagramItem> it(*dil);
- DiagramItem *di;
- for (;(di=it.current());++it)
+ for (const auto &di : root->getChildren())
{
di->move(dx,0);
moveChildren(di,dx);
}
}
-bool TreeDiagram::layoutTree(DiagramItem *root,int r)
+bool TreeDiagram::layoutTree(DiagramItem *root,uint r)
{
bool moved=FALSE;
//printf("layoutTree(%s,%d)\n",root->label().data(),r);
- DiagramItemList *dil=root->getChildren();
- if (dil->count()>0)
+ if (root->numChildren()>0)
{
+ auto children = root->getChildren();
uint k;
- int pPos=root->xPos();
- int cPos=root->avgChildPos();
+ uint pPos=root->xPos();
+ uint cPos=root->avgChildPos();
if (pPos>cPos) // move children
{
- DiagramRow *row=at(r+1);
+ const auto &row=m_rows.at(r+1);
//printf("Moving children %d-%d in row %d\n",
// dil->getFirst()->number(),row->count()-1,r+1);
- for (k=dil->getFirst()->number();k<row->count();k++)
- row->at(k)->move(pPos-cPos,0);
+ for (k=children.front()->number();k<row->numItems();k++)
+ row->item(k)->move((int)(pPos-cPos),0);
moved=TRUE;
}
else if (pPos<cPos) // move parent
{
- DiagramRow *row=at(r);
+ const auto &row=m_rows.at(r);
//printf("Moving parents %d-%d in row %d\n",
// root->number(),row->count()-1,r);
- for (k=root->number();k<row->count();k++)
- row->at(k)->move(cPos-pPos,0);
+ for (k=root->number();k<row->numItems();k++)
+ row->item(k)->move((int)(cPos-pPos),0);
moved=TRUE;
}
// recurse to children
- QListIterator<DiagramItem> it(*dil);
- DiagramItem *di;
- for (;(di=it.current()) && !moved && !di->isInList();++it)
+ auto it = children.begin();
+ for (;it!=children.end() && !moved && !(*it)->isInList();++it)
{
- moved = layoutTree(di,r+1);
+ moved = layoutTree(*it,r+1);
}
}
return moved;
@@ -474,18 +434,16 @@ bool TreeDiagram::layoutTree(DiagramItem *root,int r)
void TreeDiagram::computeLayout()
{
- QListIterator<DiagramRow> it(*this);
- DiagramRow *row;
- for (;(row=it.current()) && row->count()<maxTreeWidth;++it) {}
- if (row)
+ auto it = m_rows.begin();
+ while (it!=m_rows.end() && (*it)->numItems()<maxTreeWidth) ++it;
+ if (it!=m_rows.end())
{
+ const auto &row = *it;
//printf("computeLayout() list row at %d\n",row->number());
- QListIterator<DiagramItem> rit(*row);
- DiagramItem *di;
DiagramItem *opi=0;
int delta=0;
bool first=TRUE;
- for (;(di=rit.current());++rit)
+ for (const auto &di : *row)
{
DiagramItem *pi=di->parentItem();
if (pi==opi && !first) { delta-=gridWidth; }
@@ -498,21 +456,24 @@ void TreeDiagram::computeLayout()
}
// re-organize the diagram items
- DiagramItem *root=getFirst()->getFirst();
+ DiagramItem *root=m_rows.front()->item(0);
while (layoutTree(root,0)) { }
// move first items of the lists
- if (row)
+ if (it!=m_rows.end())
{
- QListIterator<DiagramItem> rit(*row);
- DiagramItem *di;
- while ((di=rit.current()))
+ const auto &row = *it;
+ auto rit = row->begin();
+ while (rit!=row->end())
{
- DiagramItem *pi=di->parentItem();
- if (pi->getChildren()->count()>1)
+ DiagramItem *pi=(*rit)->parentItem();
+ if (pi->numChildren()>1)
{
- di->move(gridWidth,0);
- while (di && di->parentItem()==pi) { ++rit; di=rit.current(); }
+ (*rit)->move(gridWidth,0);
+ while (rit!=row->end() && (*rit)->parentItem()==pi)
+ {
+ ++rit;
+ }
}
else
{
@@ -525,24 +486,24 @@ void TreeDiagram::computeLayout()
uint TreeDiagram::computeRows()
{
//printf("TreeDiagram::computeRows()=%d\n",count());
- int count=0;
- QListIterator<DiagramRow> it(*this);
- DiagramRow *row;
- for (;(row=it.current()) && !row->getFirst()->isInList();++it)
+ uint count=0;
+ auto it = m_rows.begin();
+ while (it!=m_rows.end() && !(*it)->item(0)->isInList())
{
- count++;
+ ++it;
+ ++count;
}
+
//printf("count=%d row=%p\n",count,row);
- if (row)
+ if (it!=m_rows.end())
{
- int maxListLen=0;
- int curListLen=0;
+ const auto &row = *it;
+ uint maxListLen=0;
+ uint curListLen=0;
DiagramItem *opi=0;
- QListIterator<DiagramItem> rit(*row);
- DiagramItem *di;
- for (;(di=rit.current());++rit)
+ for (const auto &di : *row) // for each item in a row
{
- if (di->parentItem()!=opi) curListLen=1; else curListLen++;
+ if (di->parentItem()!=opi) curListLen=1; else curListLen++;
if (curListLen>maxListLen) maxListLen=curListLen;
opi=di->parentItem();
}
@@ -555,48 +516,80 @@ uint TreeDiagram::computeRows()
void TreeDiagram::computeExtremes(uint *maxLabelLen,uint *maxXPos)
{
uint ml=0,mx=0;
- QListIterator<DiagramRow> it(*this);
- DiagramRow *dr;
- bool done=FALSE;
- for (;(dr=it.current()) && !done;++it)
+ for (const auto &dr : m_rows) // for each row
{
- QListIterator<DiagramItem> rit(*dr);
- DiagramItem *di;
- for (;(di=rit.current());++rit)
+ bool done=FALSE;
+ for (const auto &di : *dr) // for each item in a row
{
if (di->isInList()) done=TRUE;
if (maxXPos) mx=QMAX(mx,(uint)di->xPos());
if (maxLabelLen) ml=QMAX(ml,Image::stringLength(di->label()));
}
+ if (done) break;
}
if (maxLabelLen) *maxLabelLen=ml;
if (maxXPos) *maxXPos=mx;
}
-void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
+//! helper class representing an iterator that can iterate forwards or backwards
+template<class C,class I>
+class DualDirIterator
+{
+ public:
+ DualDirIterator(C &container,bool fwd)
+ : m_container(container), m_forward(fwd)
+ {
+ if (fwd) m_it = container.begin();
+ else m_rit = container.rbegin();
+ }
+ void operator++()
+ {
+ if (m_forward) ++m_it++; else ++m_rit;
+ }
+ I &operator*()
+ {
+ return m_forward ? *m_it : *m_rit;
+ }
+
+ bool atEnd()
+ {
+ if (m_forward)
+ return m_it==m_container.end();
+ else
+ return m_rit==m_container.rend();
+ }
+
+ private:
+ C &m_container;
+ bool m_forward;
+ typename C::iterator m_it;
+ typename C::reverse_iterator m_rit;
+};
+
+void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
bool doBase,bool bitmap,
uint baseRows,uint superRows,
uint cellWidth,uint cellHeight,
QCString relPath,
bool generateMap)
{
- QListIterator<DiagramRow> it(*this);
- DiagramRow *dr;
- if (!doBase) ++it;
- bool done=FALSE;
+ auto it = m_rows.begin();
+ if (it!=m_rows.end() && !doBase) ++it;
bool firstRow = doBase;
- for (;(dr=it.current()) && !done;++it)
+ bool done=FALSE;
+ for (;it!=m_rows.end() && !done;++it) // for each row
{
- int x=0,y=0;
+ const auto &dr = *it;
+ uint x=0,y=0;
float xf=0.0f,yf=0.0f;
- QListIterator<DiagramItem> rit(*dr);
- DiagramItem *di = rit.current();
- if (di->isInList()) // put boxes in a list
+ DiagramItem *firstDi = dr->item(0);
+ if (firstDi->isInList()) // put boxes in a list
{
DiagramItem *opi=0;
- if (doBase) rit.toLast(); else rit.toFirst();
- while ((di=rit.current()))
+ DualDirIterator<DiagramRow,const std::unique_ptr<DiagramItem>&> dit(*dr,!doBase);
+ while (!dit.atEnd())
{
+ DiagramItem *di = (*dit).get();
if (di->parentItem()==opi)
{
if (bitmap)
@@ -617,7 +610,7 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth;
if (doBase)
{
- y = image->getHeight()-
+ y = image->height()-
superRows*cellHeight-
(superRows-1)*labelVertSpacing-
di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
@@ -642,34 +635,34 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
}
}
opi=di->parentItem();
-
+
if (bitmap)
{
bool hasDocs=di->getClassDef()->isLinkable();
writeBitmapBox(di,image,x,y,cellWidth,cellHeight,firstRow,
- hasDocs,di->getChildren()->count()>0);
- if (!firstRow && generateMap)
+ hasDocs,di->numChildren()>0);
+ if (!firstRow && generateMap)
writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
}
else
{
- writeVectorBox(t,di,xf,yf,di->getChildren()->count()>0);
+ writeVectorBox(t,di,xf,yf,di->numChildren()>0);
}
-
- if (doBase) --rit; else ++rit;
+
+ ++dit;
}
done=TRUE;
}
else // draw a tree of boxes
{
- for (rit.toFirst();(di=rit.current());++rit)
+ for (const auto &di : *dr)
{
if (bitmap)
{
x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth;
if (doBase)
{
- y = image->getHeight()-
+ y = image->height()-
superRows*cellHeight-
(superRows-1)*labelVertSpacing-
di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
@@ -680,8 +673,8 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
}
bool hasDocs=di->getClassDef()->isLinkable();
- writeBitmapBox(di,image,x,y,cellWidth,cellHeight,firstRow,hasDocs);
- if (!firstRow && generateMap)
+ writeBitmapBox(di.get(),image,x,y,cellWidth,cellHeight,firstRow,hasDocs);
+ if (!firstRow && generateMap)
writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
}
else
@@ -695,7 +688,7 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
{
yf = superRows-1-di->yPos()/(float)gridHeight;
}
- writeVectorBox(t,di,xf,yf);
+ writeVectorBox(t,di.get(),xf,yf);
}
}
}
@@ -708,22 +701,23 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
uint baseRows,uint superRows,
uint cellWidth,uint cellHeight)
{
- QListIterator<DiagramRow> it(*this);
- DiagramRow *dr;
bool done=FALSE;
- for (;(dr=it.current()) && !done;++it) // for each row
+ auto it = m_rows.begin();
+ for (;it!=m_rows.end() && !done;++it) // for each row
{
- QListIterator<DiagramItem> rit(*dr);
- DiagramItem *di = rit.current();
- if (di->isInList()) // row consists of list connectors
+ const auto &dr = *it;
+ DiagramItem *rootDi = dr->item(0);
+ if (rootDi->isInList()) // row consists of list connectors
{
- int x=0,y=0,ys=0;
+ uint x=0,y=0,ys=0;
float xf=0.0f,yf=0.0f,ysf=0.0f;
- for (;(di=rit.current());++rit)
+ auto rit = dr->begin();
+ while (rit!=dr->end())
{
+ DiagramItem *di=(*rit).get();
DiagramItem *pi=di->parentItem();
- DiagramItemList *dil=pi->getChildren();
- DiagramItem *last=dil->getLast();
+ DiagramItemList dil=pi->getChildren();
+ DiagramItem *last=dil.back();
if (di==last) // single child
{
if (bitmap) // draw pixels
@@ -731,7 +725,7 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
if (doBase) // base classes
{
- y = image->getHeight()-
+ y = image->height()-
(superRows-1)*(cellHeight+labelVertSpacing)-
di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
image->drawVertArrow(x,y,y+labelVertSpacing/2,
@@ -753,13 +747,13 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
t << protToString(di->protection()) << endl;
if (doBase)
{
- t << "1 " << (di->xPos()/(float)gridWidth) << " "
+ t << "1 " << (di->xPos()/(float)gridWidth) << " "
<< (di->yPos()/(float)gridHeight+superRows-1) << " in\n";
}
else
{
- t << "0 " << (di->xPos()/(float)gridWidth) << " "
- << ((float)superRows-0.25-di->yPos()/(float)gridHeight)
+ t << "0 " << (di->xPos()/(float)gridWidth) << " "
+ << ((float)superRows-0.25f-di->yPos()/(float)gridHeight)
<< " in\n";
}
}
@@ -772,7 +766,7 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
(cellWidth+labelHorSpacing)/gridWidth+cellWidth/2;
if (doBase) // base classes
{
- ys = image->getHeight()-
+ ys = image->height()-
(superRows-1)*(cellHeight+labelVertSpacing)-
di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
y = ys - cellHeight/2;
@@ -831,7 +825,8 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
yf -= 1.0f;
}
}
- ++rit; di=rit.current();
+ ++rit;
+ if (rit!=dr->end()) di = (*rit).get(); else di=0;
}
// add last horizontal line and a vertical connection line
if (bitmap)
@@ -873,19 +868,20 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
}
else
{
- t << xf << " " << (ysf + 0.25) << " " << yf << " vedge\n";
+ t << xf << " " << (ysf + 0.25f) << " " << yf << " vedge\n";
}
}
}
+ if (rit!=dr->end()) ++rit;
}
done=TRUE; // the tree is drawn now
}
else // normal tree connector
{
- for (;(di=rit.current());++rit)
+ for (const auto &di : *dr)
{
- int x=0,y=0;
- DiagramItemList *dil = di->getChildren();
+ uint x=0,y=0;
+ DiagramItemList dil = di->getChildren();
DiagramItem *parent = di->parentItem();
if (parent) // item has a parent -> connect to it
{
@@ -894,7 +890,7 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
if (doBase) // base classes
{
- y = image->getHeight()-
+ y = image->height()-
(superRows-1)*(cellHeight+labelVertSpacing)-
di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
/* write input line */
@@ -918,28 +914,28 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
t << protToString(di->protection()) << endl;
if (doBase)
{
- t << "1 " << di->xPos()/(float)gridWidth << " "
+ t << "1 " << di->xPos()/(float)gridWidth << " "
<< (di->yPos()/(float)gridHeight+superRows-1) << " in\n";
}
else
{
- t << "0 " << di->xPos()/(float)gridWidth << " "
- << ((float)superRows-0.25-di->yPos()/(float)gridHeight)
+ t << "0 " << di->xPos()/(float)gridWidth << " "
+ << ((float)superRows-0.25f-di->yPos()/(float)gridHeight)
<< " in\n";
}
}
}
- if (dil->count()>0)
+ if (!dil.empty())
{
Protection p=getMinProtectionLevel(dil);
uint mask=protToMask(p);
- uint col=protToColor(p);
+ uchar col=protToColor(p);
if (bitmap)
{
x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
if (doBase) // base classes
{
- y = image->getHeight()-
+ y = image->height()-
(superRows-1)*(cellHeight+labelVertSpacing)-
cellHeight-labelVertSpacing/2-
di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
@@ -958,34 +954,34 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
t << protToString(p) << endl;
if (doBase)
{
- t << "0 " << di->xPos()/(float)gridWidth << " "
+ t << "0 " << di->xPos()/(float)gridWidth << " "
<< (di->yPos()/(float)gridHeight+superRows-1) << " out\n";
}
else
{
- t << "1 " << di->xPos()/(float)gridWidth << " "
- << ((float)superRows-1.75-di->yPos()/(float)gridHeight)
+ t << "1 " << di->xPos()/(float)gridWidth << " "
+ << ((float)superRows-1.75f-di->yPos()/(float)gridHeight)
<< " out\n";
}
}
/* write input line */
- DiagramItem *first = dil->getFirst();
- DiagramItem *last = dil->getLast();
+ DiagramItem *first = dil.front();
+ DiagramItem *last = dil.back();
if (first!=last && !first->isInList()) /* connect with all base classes */
{
if (bitmap)
{
- int xs = first->xPos()*(cellWidth+labelHorSpacing)/gridWidth
+ uint xs = first->xPos()*(cellWidth+labelHorSpacing)/gridWidth
+ + cellWidth/2;
+ uint xe = last->xPos()*(cellWidth+labelHorSpacing)/gridWidth
+ cellWidth/2;
- int xe = last->xPos()*(cellWidth+labelHorSpacing)/gridWidth
- + cellWidth/2;
if (doBase) // base classes
{
- image->drawHorzLine(y,xs,xe,col,mask);
+ image->drawHorzLine(y,xs,xe,col,mask);
}
else // super classes
{
- image->drawHorzLine(y+labelVertSpacing/2,xs,xe,col,mask);
+ image->drawHorzLine(y+labelVertSpacing/2,xs,xe,col,mask);
}
}
else
@@ -993,14 +989,14 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
t << protToString(p) << endl;
if (doBase)
{
- t << first->xPos()/(float)gridWidth << " "
+ t << first->xPos()/(float)gridWidth << " "
<< last->xPos()/(float)gridWidth << " "
- << (first->yPos()/(float)gridHeight+superRows-1)
+ << (first->yPos()/(float)gridHeight+superRows-1)
<< " conn\n";
}
else
{
- t << first->xPos()/(float)gridWidth << " "
+ t << first->xPos()/(float)gridWidth << " "
<< last->xPos()/(float)gridWidth << " "
<< ((float)superRows-first->yPos()/(float)gridHeight)
<< " conn\n";
@@ -1013,74 +1009,69 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
}
}
+//-----------------------------------------------------------------
-void clearVisitFlags()
+struct ClassDiagram::Private
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
- {
- cd->setVisited(FALSE);
- }
-}
+ Private(const ClassDef *root) : base(root,true), super(root,false) {}
+ TreeDiagram base;
+ TreeDiagram super;
+};
+
+//-----------------------------------------------------------------
+
-ClassDiagram::ClassDiagram(const ClassDef *root)
+ClassDiagram::ClassDiagram(const ClassDef *root) : p(std::make_unique<Private>(root))
{
- clearVisitFlags();
- base = new TreeDiagram(root,TRUE);
- base->computeLayout();
- clearVisitFlags();
- super = new TreeDiagram(root,FALSE);
- super->computeLayout();
- DiagramItem *baseItem = base->getFirst()->getFirst();
- DiagramItem *superItem = super->getFirst()->getFirst();
- int xbase = baseItem->xPos();
- int xsuper = superItem->xPos();
+ p->base.computeLayout();
+ p->super.computeLayout();
+ DiagramItem *baseItem = p->base.row(0)->item(0);
+ DiagramItem *superItem = p->super.row(0)->item(0);
+ uint xbase = baseItem->xPos();
+ uint xsuper = superItem->xPos();
if (xbase>xsuper)
{
- superItem->move(xbase-xsuper,0);
- super->moveChildren(superItem,xbase-xsuper);
+ superItem->move((int)(xbase-xsuper),0);
+ p->super.moveChildren(superItem,(int)(xbase-xsuper));
}
else if (xbase<xsuper)
{
- baseItem->move(xsuper-xbase,0);
- base->moveChildren(baseItem,xsuper-xbase);
+ baseItem->move((int)(xsuper-xbase),0);
+ p->base.moveChildren(baseItem,(int)(xsuper-xbase));
}
}
ClassDiagram::~ClassDiagram()
{
- delete base;
- delete super;
}
void ClassDiagram::writeFigure(FTextStream &output,const char *path,
const char *fileName) const
{
- uint baseRows=base->computeRows();
- uint superRows=super->computeRows();
+ uint baseRows=p->base.computeRows();
+ uint superRows=p->super.computeRows();
uint baseMaxX, baseMaxLabelWidth, superMaxX, superMaxLabelWidth;
- base->computeExtremes(&baseMaxLabelWidth,&baseMaxX);
- super->computeExtremes(&superMaxLabelWidth,&superMaxX);
+ p->base.computeExtremes(&baseMaxLabelWidth,&baseMaxX);
+ p->super.computeExtremes(&superMaxLabelWidth,&superMaxX);
- uint rows=baseRows+superRows-1;
+ uint rows=QMAX(1,baseRows+superRows-1);
uint cols=(QMAX(baseMaxX,superMaxX)+gridWidth*2-1)/gridWidth;
-
+
// Estimate the image aspect width and height in pixels.
uint estHeight = rows*40;
uint estWidth = cols*(20+QMAX(baseMaxLabelWidth,superMaxLabelWidth));
//printf("Estimated size %d x %d\n",estWidth,estHeight);
-
+
const float pageWidth = 14.0f; // estimated page width in cm.
// Somewhat lower to deal with estimation
- // errors.
-
+ // errors.
+
// compute the image height in centimeters based on the estimates
float realHeight = QMIN(rows,12); // real height in cm
float realWidth = realHeight * estWidth/(float)estHeight;
if (realWidth>pageWidth) // assume that the page width is about 15 cm
{
- realHeight*=pageWidth/realWidth;
+ realHeight*=pageWidth/realWidth;
realWidth=pageWidth;
}
@@ -1088,11 +1079,11 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
output << "\\begin{figure}[H]\n"
"\\begin{center}\n"
"\\leavevmode\n";
- output << "\\includegraphics[height=" << realHeight << "cm]{"
+ output << "\\includegraphics[height=" << realHeight << "cm]{"
<< fileName << "}" << endl;
output << "\\end{center}\n"
"\\end{figure}\n";
-
+
//printf("writeFigure rows=%d cols=%d\n",rows,cols);
QCString epsBaseName=(QCString)path+"/"+fileName;
@@ -1104,11 +1095,11 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
term("Could not open file %s for writing\n",f1.name().data());
}
FTextStream t(&f1);
-
+
//printf("writeEPS() rows=%d cols=%d\n",rows,cols);
-
+
// generate EPS header and postscript variables and procedures
-
+
t << "%!PS-Adobe-2.0 EPSF-2.0\n";
t << "%%Title: ClassName\n";
t << "%%Creator: Doxygen\n";
@@ -1116,7 +1107,7 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
t << "%%For: \n";
t << "%Magnification: 1.00\n";
t << "%%Orientation: Portrait\n";
- t << "%%BoundingBox: 0 0 500 " << estHeight*500.0/(float)estWidth << "\n";
+ t << "%%BoundingBox: 0 0 500 " << estHeight*500.0f/(float)estWidth << "\n";
t << "%%Pages: 0\n";
t << "%%BeginSetup\n";
t << "%%EndSetup\n";
@@ -1286,31 +1277,29 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
t << "1 boundaspect scale\n";
- bool done=FALSE;
- QListIterator<DiagramRow> bit(*base);
- DiagramRow *dr;
- for (;(dr=bit.current()) && !done;++bit)
+ for (const auto &dr : p->base)
{
- QListIterator<DiagramItem> rit(*dr);
- DiagramItem *di;
- for (;(di=rit.current());++rit)
+ bool done=FALSE;
+ for (const auto &di : *dr)
{
done=di->isInList();
t << "(" << convertToPSString(di->label()) << ") cw\n";
}
+ if (done) break;
}
- QListIterator<DiagramRow> sit(*super);
- ++sit;
- done=FALSE;
- for (;(dr=sit.current()) && !done;++sit)
+
+ auto it = p->super.begin();
+ if (it!=p->super.end()) ++it;
+ for (;it!=p->super.end();++it)
{
- QListIterator<DiagramItem> rit(*dr);
- DiagramItem *di;
- for (;(di=rit.current());++rit)
+ const auto &dr = *it;
+ bool done=FALSE;
+ for (const auto &di : *dr)
{
done=di->isInList();
t << "(" << convertToPSString(di->label()) << ") cw\n";
}
+ if (done) break;
}
t << "/boxwidth boxwidth marginwidth 2 mul add def\n"
@@ -1321,14 +1310,14 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
<< " boxheight rows mul disty rows 1 sub mul add boundaspect mul \n"
<< " max def\n"
<< "boundx scalefactor div boundy scalefactor div scale\n";
-
+
t << "\n% ----- classes -----\n\n";
- base->drawBoxes(t,0,TRUE,FALSE,baseRows,superRows,0,0);
- super->drawBoxes(t,0,FALSE,FALSE,baseRows,superRows,0,0);
-
+ p->base.drawBoxes(t,0,TRUE,FALSE,baseRows,superRows,0,0);
+ p->super.drawBoxes(t,0,FALSE,FALSE,baseRows,superRows,0,0);
+
t << "\n% ----- relations -----\n\n";
- base->drawConnectors(t,0,TRUE,FALSE,baseRows,superRows,0,0);
- super->drawConnectors(t,0,FALSE,FALSE,baseRows,superRows,0,0);
+ p->base.drawConnectors(t,0,TRUE,FALSE,baseRows,superRows,0,0);
+ p->super.drawConnectors(t,0,FALSE,FALSE,baseRows,superRows,0,0);
f1.close();
if (Config_getBool(USE_PDFLATEX))
@@ -1350,17 +1339,17 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
void ClassDiagram::writeImage(FTextStream &t,const char *path,
- const char *relPath,const char *fileName,
+ const char *relPath,const char *fileName,
bool generateMap) const
{
- uint baseRows=base->computeRows();
- uint superRows=super->computeRows();
+ uint baseRows=p->base.computeRows();
+ uint superRows=p->super.computeRows();
uint rows=baseRows+superRows-1;
uint lb,ls,xb,xs;
- base->computeExtremes(&lb,&xb);
- super->computeExtremes(&ls,&xs);
-
+ p->base.computeExtremes(&lb,&xb);
+ p->super.computeExtremes(&ls,&xs);
+
uint cellWidth = QMAX(lb,ls)+labelHorMargin*2;
uint maxXPos = QMAX(xb,xs);
uint labelVertMargin = 6; //QMAX(6,(cellWidth-fontHeight)/6); // aspect at least 1:3
@@ -1371,10 +1360,10 @@ void ClassDiagram::writeImage(FTextStream &t,const char *path,
Image image(imageWidth,imageHeight);
- base->drawBoxes(t,&image,TRUE,TRUE,baseRows,superRows,cellWidth,cellHeight,relPath,generateMap);
- super->drawBoxes(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight,relPath,generateMap);
- base->drawConnectors(t,&image,TRUE,TRUE,baseRows,superRows,cellWidth,cellHeight);
- super->drawConnectors(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight);
+ p->base.drawBoxes(t,&image,TRUE,TRUE,baseRows,superRows,cellWidth,cellHeight,relPath,generateMap);
+ p->super.drawBoxes(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight,relPath,generateMap);
+ p->base.drawConnectors(t,&image,TRUE,TRUE,baseRows,superRows,cellWidth,cellHeight);
+ p->super.drawConnectors(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight);
#define IMAGE_EXT ".png"
image.save((QCString)path+"/"+fileName+IMAGE_EXT);
diff --git a/src/diagram.h b/src/diagram.h
index 05af28e..d8e7612 100644
--- a/src/diagram.h
+++ b/src/diagram.h
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,10 +19,9 @@
#ifndef DIAGRAM_H
#define DIAGRAM_H
-#include <qglobal.h>
+#include <memory>
class ClassDef;
-class TreeDiagram;
class FTextStream;
/** Class representing a built-in class diagram. */
@@ -36,8 +35,8 @@ class ClassDiagram
void writeImage(FTextStream &t,const char *path,const char *relPath,
const char *file,bool generateMap=TRUE) const;
private:
- TreeDiagram *base;
- TreeDiagram *super;
+ struct Private;
+ std::unique_ptr<Private> p;
};
#endif
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
index ba792e1..6f23251 100644
--- a/src/dirdef.cpp
+++ b/src/dirdef.cpp
@@ -1,6 +1,22 @@
-#include "md5.h"
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <algorithm>
#include "dirdef.h"
+#include "md5.h"
#include "filename.h"
#include "doxygen.h"
#include "util.h"
@@ -14,10 +30,12 @@
#include "config.h"
#include "docparser.h"
#include "definitionimpl.h"
+#include "filedef.h"
+
//----------------------------------------------------------------------
-class DirDefImpl : public DefinitionImpl, public DirDef
+class DirDefImpl : public DefinitionMixin<DirDef>
{
public:
DirDefImpl(const char *path);
@@ -34,11 +52,11 @@ class DirDefImpl : public DefinitionImpl, public DirDef
virtual FileList * getFiles() const { return m_fileList; }
virtual void addFile(FileDef *fd);
virtual const DirList &subDirs() const { return m_subdirs; }
- virtual bool isCluster() const { return m_subdirs.count()>0; }
+ virtual bool isCluster() const { return m_subdirs.size()>0; }
virtual int level() const { return m_level; }
virtual DirDef *parent() const { return m_parent; }
virtual int dirCount() const { return m_dirCount; }
- virtual const QDict<UsedDir> *usedDirs() const { return m_usedDirs; }
+ virtual const UsedDirLinkedMap &usedDirs() const { return m_usedDirs; }
virtual bool isParentOf(const DirDef *dir) const;
virtual bool depGraphIsTrivial() const;
virtual QCString shortTitle() const;
@@ -67,7 +85,7 @@ class DirDefImpl : public DefinitionImpl, public DirDef
void endMemberDeclarations(OutputList &ol);
static DirDef *createNewDir(const char *path);
- static bool matchPath(const QCString &path,QStrList &l);
+ static bool matchPath(const QCString &path,const StringVector &l);
DirList m_subdirs;
QCString m_dispName;
@@ -77,7 +95,7 @@ class DirDefImpl : public DefinitionImpl, public DirDef
int m_dirCount;
int m_level;
DirDef *m_parent;
- QDict<UsedDir> *m_usedDirs;
+ UsedDirLinkedMap m_usedDirs;
};
DirDef *createDirDef(const char *path)
@@ -91,7 +109,7 @@ DirDef *createDirDef(const char *path)
static int g_dirCount=0;
-DirDefImpl::DirDefImpl(const char *path) : DefinitionImpl(path,1,1,path)
+DirDefImpl::DirDefImpl(const char *path) : DefinitionMixin(path,1,1,path)
{
bool fullPathNames = Config_getBool(FULL_PATH_NAMES);
// get display name (stripping the paths mentioned in STRIP_FROM_PATH)
@@ -103,7 +121,7 @@ DirDefImpl::DirDefImpl(const char *path) : DefinitionImpl(path,1,1,path)
m_shortName = m_shortName.left(m_shortName.length()-1);
}
int pi=m_shortName.findRev('/');
- if (pi!=-1)
+ if (pi!=-1)
{ // remove everything till the last /
m_shortName = m_shortName.mid(pi+1);
}
@@ -113,10 +131,8 @@ DirDefImpl::DirDefImpl(const char *path) : DefinitionImpl(path,1,1,path)
{ // strip trailing /
m_dispName = m_dispName.left(m_dispName.length()-1);
}
-
+
m_fileList = new FileList;
- m_usedDirs = new QDict<UsedDir>(257);
- m_usedDirs->setAutoDelete(TRUE);
m_dirCount = g_dirCount++;
m_level=-1;
m_parent=0;
@@ -125,22 +141,21 @@ DirDefImpl::DirDefImpl(const char *path) : DefinitionImpl(path,1,1,path)
DirDefImpl::~DirDefImpl()
{
delete m_fileList;
- delete m_usedDirs;
}
-bool DirDefImpl::isLinkableInProject() const
-{
- return !isReference();
+bool DirDefImpl::isLinkableInProject() const
+{
+ return !isReference();
}
-bool DirDefImpl::isLinkable() const
-{
- return isReference() || isLinkableInProject();
+bool DirDefImpl::isLinkable() const
+{
+ return isReference() || isLinkableInProject();
}
void DirDefImpl::addSubDir(DirDef *subdir)
{
- m_subdirs.append(subdir);
+ m_subdirs.push_back(subdir);
subdir->setOuterScope(this);
subdir->setParent(this);
}
@@ -158,7 +173,7 @@ void DirDefImpl::addFile(FileDef *fd)
void DirDefImpl::sort()
{
- m_subdirs.sort();
+ std::sort(m_subdirs.begin(), m_subdirs.end(), compareDirDefs);
m_fileList->sort();
}
@@ -203,7 +218,7 @@ QCString DirDefImpl::getOutputFileBase() const
void DirDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title)
{
- if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF)) ||
+ if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF)) ||
!documentation().isEmpty())
{
ol.pushGeneratorState();
@@ -221,10 +236,11 @@ void DirDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title)
// repeat brief description
if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
{
- ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
// separator between brief and details
- if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
+ if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
!documentation().isEmpty())
{
ol.pushGeneratorState();
@@ -241,7 +257,8 @@ void DirDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title)
// write documentation
if (!documentation().isEmpty())
{
- ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
}
}
@@ -251,7 +268,8 @@ void DirDefImpl::writeBriefDescription(OutputList &ol)
if (hasBriefDescription())
{
DocRoot *rootNode = validatingParseDoc(
- briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+ briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
if (rootNode && !rootNode->isEmpty())
{
ol.startParagraph();
@@ -306,9 +324,7 @@ void DirDefImpl::writeDirectoryGraph(OutputList &ol)
void DirDefImpl::writeSubDirList(OutputList &ol)
{
int numSubdirs = 0;
- QListIterator<DirDef> it(m_subdirs);
- DirDef *dd;
- for (it.toFirst();(dd=it.current());++it)
+ for(const auto dd : m_subdirs)
{
if (dd->hasDocumentation() || dd->getFiles()->count()>0)
{
@@ -323,7 +339,7 @@ void DirDefImpl::writeSubDirList(OutputList &ol)
ol.parseText(theTranslator->trDir(TRUE,FALSE));
ol.endMemberHeader();
ol.startMemberList();
- for (it.toFirst();(dd=it.current());++it)
+ for(const auto dd : m_subdirs)
{
if (dd->hasDocumentation() || dd->getFiles()->count()==0)
{
@@ -341,7 +357,8 @@ void DirDefImpl::writeSubDirList(OutputList &ol)
FALSE, // isExample
0, // exampleName
TRUE, // single line
- TRUE // link from index
+ TRUE, // link from index
+ Config_getBool(MARKDOWN_SUPPORT)
);
ol.endMemberDescription();
}
@@ -373,9 +390,7 @@ void DirDefImpl::writeFileList(OutputList &ol)
ol.parseText(theTranslator->trFile(TRUE,FALSE));
ol.endMemberHeader();
ol.startMemberList();
- QListIterator<FileDef> it(*m_fileList);
- FileDef *fd;
- for (;(fd=it.current());++it)
+ for (it.toFirst();(fd=it.current());++it)
{
if (fd->hasDocumentation())
{
@@ -414,7 +429,8 @@ void DirDefImpl::writeFileList(OutputList &ol)
FALSE, // isExample
0, // exampleName
TRUE, // single line
- TRUE // link from index
+ TRUE, // link from index
+ Config_getBool(MARKDOWN_SUPPORT)
);
ol.endMemberDescription();
}
@@ -461,11 +477,9 @@ void DirDefImpl::writeTagFile(FTextStream &tagFile)
{
case LayoutDocEntry::DirSubDirs:
{
- if (m_subdirs.count()>0)
+ if (m_subdirs.size()>0)
{
- DirDef *dd;
- QListIterator<DirDef> it(m_subdirs);
- for (;(dd=it.current());++it)
+ for(const auto dd : m_subdirs)
{
tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
}
@@ -497,7 +511,7 @@ void DirDefImpl::writeDocumentation(OutputList &ol)
{
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
ol.pushGeneratorState();
-
+
QCString title=theTranslator->trDirReference(m_dispName);
startFile(ol,getOutputFileBase(),name(),title,HLI_Files,!generateTreeView);
@@ -529,25 +543,25 @@ void DirDefImpl::writeDocumentation(OutputList &ol)
{
switch (lde->kind())
{
- case LayoutDocEntry::BriefDesc:
+ case LayoutDocEntry::BriefDesc:
writeBriefDescription(ol);
- break;
- case LayoutDocEntry::DirGraph:
+ break;
+ case LayoutDocEntry::DirGraph:
writeDirectoryGraph(ol);
- break;
- case LayoutDocEntry::MemberDeclStart:
+ break;
+ case LayoutDocEntry::MemberDeclStart:
startMemberDeclarations(ol);
- break;
- case LayoutDocEntry::DirSubDirs:
+ break;
+ case LayoutDocEntry::DirSubDirs:
writeSubDirList(ol);
- break;
- case LayoutDocEntry::DirFiles:
+ break;
+ case LayoutDocEntry::DirFiles:
writeFileList(ol);
- break;
- case LayoutDocEntry::MemberDeclEnd:
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
endMemberDeclarations(ol);
break;
- case LayoutDocEntry::DetailedDesc:
+ case LayoutDocEntry::DetailedDesc:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeDetailedDescription(ol,ls->title(lang));
@@ -575,16 +589,16 @@ void DirDefImpl::writeDocumentation(OutputList &ol)
case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
case LayoutDocEntry::FileIncludeGraph:
- case LayoutDocEntry::FileIncludedByGraph:
+ case LayoutDocEntry::FileIncludedByGraph:
case LayoutDocEntry::FileSourceLink:
case LayoutDocEntry::FileInlineClasses:
- case LayoutDocEntry::GroupClasses:
- case LayoutDocEntry::GroupInlineClasses:
+ case LayoutDocEntry::GroupClasses:
+ case LayoutDocEntry::GroupInlineClasses:
case LayoutDocEntry::GroupNamespaces:
- case LayoutDocEntry::GroupDirs:
- case LayoutDocEntry::GroupNestedGroups:
+ case LayoutDocEntry::GroupDirs:
+ case LayoutDocEntry::GroupNestedGroups:
case LayoutDocEntry::GroupFiles:
- case LayoutDocEntry::GroupGraph:
+ case LayoutDocEntry::GroupGraph:
case LayoutDocEntry::GroupPageDocs:
case LayoutDocEntry::AuthorSection:
case LayoutDocEntry::MemberGroups:
@@ -626,7 +640,7 @@ void DirDefImpl::setLevel()
/** Add as "uses" dependency between \a this dir and \a dir,
* that was caused by a dependency on file \a fd.
- */
+ */
void DirDefImpl::addUsesDependency(DirDef *dir,FileDef *srcFd,
FileDef *dstFd,bool inherited)
{
@@ -640,15 +654,15 @@ void DirDefImpl::addUsesDependency(DirDef *dir,FileDef *srcFd,
// levels match => add direct dependency
bool added=FALSE;
- UsedDir *usedDir = m_usedDirs->find(dir->getOutputFileBase());
+ UsedDir *usedDir = m_usedDirs.find(dir->getOutputFileBase());
if (usedDir) // dir dependency already present
{
- FilePair *usedPair = usedDir->findFilePair(
+ const FilePair *usedPair = usedDir->findFilePair(
srcFd->getOutputFileBase()+dstFd->getOutputFileBase());
if (usedPair==0) // new file dependency
{
//printf(" => new file\n");
- usedDir->addFileDep(srcFd,dstFd);
+ usedDir->addFileDep(srcFd,dstFd);
added=TRUE;
}
else
@@ -659,9 +673,9 @@ void DirDefImpl::addUsesDependency(DirDef *dir,FileDef *srcFd,
else // new directory dependency
{
//printf(" => new file\n");
- usedDir = new UsedDir(dir,inherited);
- usedDir->addFileDep(srcFd,dstFd);
- m_usedDirs->insert(dir->getOutputFileBase(),usedDir);
+ auto newUsedDir = std::make_unique<UsedDir>(dir,inherited);
+ newUsedDir->addFileDep(srcFd,dstFd);
+ usedDir = m_usedDirs.add(dir->getOutputFileBase(),std::move(newUsedDir));
added=TRUE;
}
if (added)
@@ -684,7 +698,7 @@ void DirDefImpl::addUsesDependency(DirDef *dir,FileDef *srcFd,
void DirDefImpl::computeDependencies()
{
FileList *fl = m_fileList;
- if (fl)
+ if (fl)
{
QListIterator<FileDef> fli(*fl);
FileDef *fd;
@@ -695,7 +709,7 @@ void DirDefImpl::computeDependencies()
QList<IncludeInfo> *ifl = fd->includeFileList();
if (ifl)
{
- QListIterator<IncludeInfo> ifli(*ifl);
+ QListIterator<IncludeInfo> ifli(*ifl);
IncludeInfo *ii;
for (ifli.toFirst();(ii=ifli.current());++ifli) // foreach include file
{
@@ -716,30 +730,30 @@ void DirDefImpl::computeDependencies()
}
}
}
- if (m_usedDirs)
+
+ std::sort(m_usedDirs.begin(),m_usedDirs.end(),
+ [](const auto &u1,const auto &u2)
+ { return qstricmp(u1->dir()->getOutputFileBase(),u2->dir()->getOutputFileBase())<0; });
+
+ for (const auto& usedDirectory : m_usedDirs)
{
- QDictIterator<UsedDir> udi(*m_usedDirs);
- UsedDir *udir;
- for (udi.toFirst();(udir=udi.current());++udi)
- {
- udir->sort();
- }
+ usedDirectory->sort();
}
}
bool DirDefImpl::isParentOf(const DirDef *dir) const
{
- if (dir->parent()==this) // this is a parent of dir
+ if (dir->parent()==this) // this is a parent of dir
return TRUE;
else if (dir->parent()) // repeat for the parent of dir
- return isParentOf(dir->parent());
+ return isParentOf(dir->parent());
else
return FALSE;
}
bool DirDefImpl::depGraphIsTrivial() const
{
- return m_usedDirs->count()==0;
+ return m_usedDirs.empty();
}
//----------------------------------------------------------------------
@@ -754,7 +768,7 @@ int FilePairDict::compareValues(const FilePair *left,const FilePair *right) cons
//----------------------------------------------------------------------
-UsedDir::UsedDir(DirDef *dir,bool inherited) :
+UsedDir::UsedDir(const DirDef *dir,bool inherited) :
m_dir(dir), m_filePairs(7), m_inherited(inherited)
{
m_filePairs.setAutoDelete(TRUE);
@@ -785,28 +799,27 @@ FilePair *UsedDir::findFilePair(const char *name)
DirDef *DirDefImpl::createNewDir(const char *path)
{
ASSERT(path!=0);
- DirDef *dir = Doxygen::directories->find(path);
+ DirDef *dir = Doxygen::dirLinkedMap->find(path);
if (dir==0) // new dir
{
+ dir = Doxygen::dirLinkedMap->add(path,
+ std::unique_ptr<DirDef>(
+ createDirDef(path)));
//printf("Adding new dir %s\n",path);
- dir = createDirDef(path);
//printf("createNewDir %s short=%s\n",path,dir->shortName().data());
- Doxygen::directories->append(path,dir);
}
return dir;
}
-bool DirDefImpl::matchPath(const QCString &path,QStrList &l)
+bool DirDefImpl::matchPath(const QCString &path,const StringVector &l)
{
- const char *s=l.first();
- while (s)
+ for (const auto &s : l)
{
- QCString prefix = s;
- if (qstricmp(prefix.left(path.length()),path)==0) // case insensitive compare
+ std::string prefix = s.substr(0,path.length());
+ if (qstricmp(prefix.c_str(),path)==0) // case insensitive compare
{
return TRUE;
}
- s = l.next();
}
return FALSE;
}
@@ -824,7 +837,7 @@ DirDef *DirDefImpl::mergeDirectoryInTree(const QCString &path)
QCString part=path.left(i+1);
if (!matchPath(part,Config_getList(STRIP_FROM_PATH)) && (part!="/" && part!="//"))
{
- dir=createNewDir(part);
+ dir=createNewDir(part);
}
p=i+1;
}
@@ -835,7 +848,7 @@ DirDef *DirDefImpl::mergeDirectoryInTree(const QCString &path)
static void writePartialDirPath(OutputList &ol,const DirDef *root,const DirDef *target)
{
- if (target->parent()!=root)
+ if (target->parent()!=root)
{
writePartialDirPath(ol,root,target->parent());
ol.writeString("&#160;/&#160;");
@@ -912,7 +925,7 @@ void DirRelation::writeDocumentation(OutputList &ol)
ol.writeString("</table>");
ol.endContents();
-
+
endFileWithNavPath(m_src,ol);
ol.popGeneratorState();
@@ -927,18 +940,15 @@ void DirRelation::writeDocumentation(OutputList &ol)
static void computeCommonDirPrefix()
{
QCString path;
- DirDef *dir;
- DirSDict::Iterator sdi(*Doxygen::directories);
- if (Doxygen::directories->count()>0) // we have at least one dir
+ auto it = Doxygen::dirLinkedMap->begin();
+ if (!Doxygen::dirLinkedMap->empty()) // we have at least one dir
{
// start will full path of first dir
- sdi.toFirst();
- dir=sdi.current();
- path=dir->name();
- int i=path.findRev('/',path.length()-2);
+ path=(*it)->name();
+ int i=path.findRev('/',(int)path.length()-2);
path=path.left(i+1);
bool done=FALSE;
- if (i==-1)
+ if (i==-1)
{
path="";
}
@@ -946,16 +956,16 @@ static void computeCommonDirPrefix()
{
while (!done)
{
- int l = path.length();
- int count=0;
- for (sdi.toFirst();(dir=sdi.current());++sdi)
+ uint l = path.length();
+ size_t count=0;
+ for (const auto &dir : *Doxygen::dirLinkedMap)
{
QCString dirName = dir->name();
if (dirName.length()>path.length())
{
if (qstrncmp(dirName,path,l)!=0) // dirName does not start with path
{
- int i=path.findRev('/',l-2);
+ i=path.findRev('/',(int)l-2);
if (i==-1) // no unique prefix -> stop
{
path="";
@@ -972,7 +982,7 @@ static void computeCommonDirPrefix()
{
path=dir->name();
l=path.length();
- int i=path.findRev('/',l-2);
+ i=path.findRev('/',(int)l-2);
if (i==-1) // no unique prefix -> stop
{
path="";
@@ -986,7 +996,7 @@ static void computeCommonDirPrefix()
}
count++;
}
- if (count==Doxygen::directories->count())
+ if (count==Doxygen::dirLinkedMap->size())
// path matches for all directories -> found the common prefix
{
done=TRUE;
@@ -994,7 +1004,7 @@ static void computeCommonDirPrefix()
}
}
}
- for (sdi.toFirst();(dir=sdi.current());++sdi)
+ for (const auto &dir : *Doxygen::dirLinkedMap)
{
QCString diskName = dir->name().right(dir->name().length()-path.length());
dir->setDiskName(diskName);
@@ -1005,23 +1015,19 @@ static void computeCommonDirPrefix()
void buildDirectories()
{
// for each input file
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
//printf("buildDirectories %s\n",fd->name().data());
if (fd->getReference().isEmpty())
{
DirDef *dir;
- if ((dir=Doxygen::directories->find(fd->getPath()))==0) // new directory
+ if ((dir=Doxygen::dirLinkedMap->find(fd->getPath()))==0) // new directory
{
dir = DirDefImpl::mergeDirectoryInTree(fd->getPath());
}
- if (dir && !fd->isDocumentationFile()) dir->addFile(fd);
+ if (dir && !fd->isDocumentationFile()) dir->addFile(fd.get());
}
else
{
@@ -1030,45 +1036,48 @@ void buildDirectories()
}
}
- //DirDef *root = new DirDef("root:");
// compute relations between directories => introduce container dirs.
- DirDef *dir;
- DirSDict::Iterator sdi(*Doxygen::directories);
- for (sdi.toFirst();(dir=sdi.current());++sdi)
+ for (const auto &dir : *Doxygen::dirLinkedMap)
{
QCString name = dir->name();
- int i=name.findRev('/',name.length()-2);
+ int i=name.findRev('/',(int)name.length()-2);
if (i>0)
{
- DirDef *parent = Doxygen::directories->find(name.left(i+1));
+ DirDef *parent = Doxygen::dirLinkedMap->find(name.left(i+1));
//if (parent==0) parent=root;
- if (parent)
+ if (parent)
{
- parent->addSubDir(dir);
+ parent->addSubDir(dir.get());
//printf("DirDefImpl::addSubdir(): Adding subdir\n%s to\n%s\n",
// dir->displayName().data(), parent->displayName().data());
}
}
}
- for (sdi.toFirst();(dir=sdi.current());++sdi)
+
+ // sort the directory contents
+ for (const auto &dir : *Doxygen::dirLinkedMap)
{
dir->sort();
}
- Doxygen::directories->sort();
+
+ // short the directories themselves
+ std::sort(Doxygen::dirLinkedMap->begin(),
+ Doxygen::dirLinkedMap->end(),
+ [](const auto &d1,const auto &d2)
+ { return qstricmp(d1->shortName(),d2->shortName()) < 0; });
+
computeCommonDirPrefix();
}
void computeDirDependencies()
{
- DirDef *dir;
- DirSDict::Iterator sdi(*Doxygen::directories);
// compute nesting level for each directory
- for (sdi.toFirst();(dir=sdi.current());++sdi)
+ for (const auto &dir : *Doxygen::dirLinkedMap)
{
dir->setLevel();
}
// compute uses dependencies between directories
- for (sdi.toFirst();(dir=sdi.current());++sdi)
+ for (const auto &dir : *Doxygen::dirLinkedMap)
{
//printf("computeDependencies for %s: #dirs=%d\n",dir->name().data(),Doxygen::directories.count());
dir->computeDependencies();
@@ -1078,9 +1087,7 @@ void computeDirDependencies()
void generateDirDocs(OutputList &ol)
{
- DirDef *dir;
- DirSDict::Iterator sdi(*Doxygen::directories);
- for (sdi.toFirst();(dir=sdi.current());++sdi)
+ for (const auto &dir : *Doxygen::dirLinkedMap)
{
ol.pushGeneratorState();
if (!dir->hasDocumentation())
@@ -1092,12 +1099,43 @@ void generateDirDocs(OutputList &ol)
}
if (Config_getBool(DIRECTORY_GRAPH))
{
- SDict<DirRelation>::Iterator rdi(Doxygen::dirRelations);
- DirRelation *dr;
- for (rdi.toFirst();(dr=rdi.current());++rdi)
+ for (const auto &dr : Doxygen::dirRelations)
{
dr->writeDocumentation(ol);
}
}
}
+bool compareDirDefs(const DirDef *item1, const DirDef *item2)
+{
+ return qstricmp(item1->shortName(),item2->shortName()) < 0;
+}
+
+// --- Cast functions
+
+DirDef *toDirDef(Definition *d)
+{
+ if (d==0) return 0;
+ if (d && typeid(*d)==typeid(DirDefImpl))
+ {
+ return static_cast<DirDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+const DirDef *toDirDef(const Definition *d)
+{
+ if (d==0) return 0;
+ if (d && typeid(*d)==typeid(DirDefImpl))
+ {
+ return static_cast<const DirDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
diff --git a/src/dirdef.h b/src/dirdef.h
index 2ea54af..b3f2a30 100644
--- a/src/dirdef.h
+++ b/src/dirdef.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,34 +16,85 @@
#ifndef DIRDEF_H
#define DIRDEF_H
+#include "linkedmap.h"
#include "sortdict.h"
#include "definition.h"
-#include <qlist.h>
+#include <vector>
+#include <map>
+#include <qglobal.h>
+#include <qcstring.h>
+
class FileList;
-class ClassSDict;
class QStrList;
class FileDef;
class OutputList;
class UsedDir;
class FTextStream;
-
+class FilePair;
+class FilePairDict;
class DirDef;
+class DirList;
-/** A list of directories. */
-class DirList : public QList<DirDef>
+bool compareDirDefs(const DirDef *item1, const DirDef *item2);
+
+// ------------------
+
+/** Class representing a pair of FileDef objects */
+class FilePair
{
public:
- int compareValues(const DirDef *item1,const DirDef *item2) const;
+ FilePair(FileDef *src,FileDef *dst) : m_src(src), m_dst(dst) {}
+ const FileDef *source() const { return m_src; }
+ const FileDef *destination() const { return m_dst; }
+ private:
+ FileDef *m_src;
+ FileDef *m_dst;
};
+// ------------------
+
+/** A sorted dictionary of FilePair objects. */
+class FilePairDict : public SDict<FilePair>
+{
+ public:
+ FilePairDict(uint size) : SDict<FilePair>(size) {}
+ private:
+ int compareValues(const FilePair *item1,const FilePair *item2) const;
+};
+
+// ------------------
+
+/** Usage information of a directory. */
+class UsedDir
+{
+ public:
+ UsedDir(const DirDef *dir,bool inherited);
+ virtual ~UsedDir();
+ void addFileDep(FileDef *srcFd,FileDef *dstFd);
+ FilePair *findFilePair(const char *name);
+ const FilePairDict &filePairs() const { return m_filePairs; }
+ const DirDef *dir() const { return m_dir; }
+ bool inherited() const { return m_inherited; }
+ void sort();
+
+ private:
+ const DirDef *m_dir;
+ FilePairDict m_filePairs;
+ bool m_inherited;
+};
+
+// ------------------
+
/** A model of a directory symbol. */
-class DirDef : virtual public Definition
+class DirDef : public DefinitionMutable, public Definition
{
public:
virtual ~DirDef() {}
+ class UsedDirLinkedMap : public LinkedMap<UsedDir> {};
+
// accessors
virtual DefType definitionType() const = 0;
virtual QCString getOutputFileBase() const = 0;
@@ -62,7 +111,7 @@ class DirDef : virtual public Definition
virtual int level() const = 0;
virtual DirDef *parent() const = 0;
virtual int dirCount() const = 0;
- virtual const QDict<UsedDir> *usedDirs() const = 0;
+ virtual const UsedDirLinkedMap &usedDirs() const = 0;
virtual bool isParentOf(const DirDef *dir) const = 0;
virtual bool depGraphIsTrivial() const = 0;
virtual QCString shortTitle() const = 0;
@@ -81,51 +130,16 @@ class DirDef : virtual public Definition
virtual void computeDependencies() = 0;
};
-/** Class representing a pair of FileDef objects */
-class FilePair
-{
- public:
- FilePair(FileDef *src,FileDef *dst) : m_src(src), m_dst(dst) {}
- const FileDef *source() const { return m_src; }
- const FileDef *destination() const { return m_dst; }
- private:
- FileDef *m_src;
- FileDef *m_dst;
-};
+// --- Cast functions
-/** A sorted dictionary of FilePair objects. */
-class FilePairDict : public SDict<FilePair>
-{
- public:
- FilePairDict(int size) : SDict<FilePair>(size) {}
- private:
- int compareValues(const FilePair *item1,const FilePair *item2) const;
-};
-
-/** Usage information of a directory. */
-class UsedDir
-{
- public:
- UsedDir(DirDef *dir,bool inherited);
- virtual ~UsedDir();
- void addFileDep(FileDef *srcFd,FileDef *dstFd);
- FilePair *findFilePair(const char *name);
- const FilePairDict &filePairs() const { return m_filePairs; }
- const DirDef *dir() const { return m_dir; }
- bool inherited() const { return m_inherited; }
- void sort();
-
- private:
- DirDef *m_dir;
- FilePairDict m_filePairs;
- bool m_inherited;
-};
+DirDef *toDirDef(Definition *d);
+const DirDef *toDirDef(const Definition *d);
/** A usage relation between two directories. */
class DirRelation
{
public:
- DirRelation(const QCString &name,const DirDef *src,UsedDir *dst)
+ DirRelation(const QCString &name,const DirDef *src,UsedDir *dst)
: m_name(name), m_src(src), m_dst(dst) {}
const DirDef *source() const { return m_src; }
UsedDir *destination() const { return m_dst; }
@@ -138,22 +152,21 @@ class DirRelation
UsedDir *m_dst;
};
-inline int DirList::compareValues(const DirDef *item1,const DirDef *item2) const
+/** A linked map of directories */
+class DirLinkedMap : public LinkedMap<DirDef>
+{
+};
+
+/** A list of directories. */
+class DirList : public std::vector<const DirDef*>
{
- return qstricmp(item1->shortName(),item2->shortName());
-}
+};
-/** A sorted dictionary of DirDef objects. */
-class DirSDict : public SDict<DirDef>
+class DirRelationLinkedMap : public LinkedMap<DirRelation>
{
- public:
- DirSDict(int size) : SDict<DirDef>(size) {}
- int compareValues(const DirDef *item1,const DirDef *item2) const
- {
- return qstricmp(item1->shortName(),item2->shortName());
- }
};
+// ------------------
void buildDirectories();
void generateDirDocs(OutputList &ol);
diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp
index fff9728..05e9347 100644
--- a/src/docbookgen.cpp
+++ b/src/docbookgen.cpp
@@ -89,7 +89,7 @@ inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col)
{
case '\t':
{
- static int tabSize = Config_getInt(TAB_SIZE);
+ int tabSize = Config_getInt(TAB_SIZE);
int spacesToNextTabStop = tabSize - (col%tabSize);
col+=spacesToNextTabStop;
while (spacesToNextTabStop--) t << "&#32;";
@@ -101,9 +101,21 @@ inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col)
case '&': t << "&amp;"; col++; break;
case '\'': t << "&apos;"; col++; break;
case '"': t << "&quot;"; col++; break;
- case '\007': t << "^G"; col++; break; // bell
- case '\014': t << "^L"; col++; break; // form feed
- default: t << c; col++; break;
+ default:
+ {
+ uchar uc = static_cast<uchar>(c);
+ static const char *hex="0123456789ABCDEF";
+ if (uc<32)
+ {
+ t << "&#x24" << hex[uc>>4] << hex[uc&0xF] << ";";
+ }
+ else
+ {
+ t << c;
+ }
+ col++;
+ }
+ break;
}
}
}
@@ -132,17 +144,14 @@ void writeDocbookLink(FTextStream &t,const char * /*extRef*/,const char *compoun
t << "</link>";
}
-DocbookCodeGenerator::DocbookCodeGenerator(FTextStream &t) : m_lineNumber(-1), m_col(0),
- m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE)
+DocbookCodeGenerator::DocbookCodeGenerator(FTextStream &t)
{
m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING);
setTextStream(t);
}
-DocbookCodeGenerator::DocbookCodeGenerator() : m_lineNumber(-1), m_col(0),
- m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE), m_streamSet(FALSE)
+DocbookCodeGenerator::DocbookCodeGenerator()
{
- m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING);
}
DocbookCodeGenerator::~DocbookCodeGenerator() {}
@@ -160,9 +169,9 @@ void DocbookCodeGenerator::writeCodeLink(const char *ref,const char *file,
writeDocbookLink(m_t,ref,file,anchor,name,tooltip);
m_col+=(int)strlen(name);
}
-void DocbookCodeGenerator::writeCodeLinkLine(const char *ref,const char *file,
- const char *anchor,const char *name,
- const char *tooltip)
+void DocbookCodeGenerator::writeCodeLinkLine(const char *,const char *file,
+ const char *,const char *name,
+ const char *)
{
Docbook_DB(("(writeCodeLinkLine)\n"));
m_t << "<anchor xml:id=\"_" << stripExtensionGeneral(stripPath(file),".xml");
@@ -245,37 +254,41 @@ void DocbookCodeGenerator::finish()
{
endCodeLine();
}
-void DocbookCodeGenerator::startCodeFragment()
+void DocbookCodeGenerator::startCodeFragment(const char *)
{
- m_t << "<literallayout><computeroutput>" << endl;
+DB_GEN_C
+ m_t << "<programlisting>";
}
-void DocbookCodeGenerator::endCodeFragment()
+
+void DocbookCodeGenerator::endCodeFragment(const char *)
{
+DB_GEN_C
//endCodeLine checks is there is still an open code line, if so closes it.
endCodeLine();
- m_t << "</computeroutput></literallayout>" << endl;
+ m_t << "</programlisting>";
}
-DocbookGenerator::DocbookGenerator() : OutputGenerator()
+//-------------------------------------------------------------------------------
+
+DocbookGenerator::DocbookGenerator() : OutputGenerator(Config_getString(DOCBOOK_OUTPUT))
{
DB_GEN_C
- m_dir=Config_getString(DOCBOOK_OUTPUT);
- //insideTabbing=FALSE;
- //firstDescItem=TRUE;
- //disableLinks=FALSE;
- //m_indent=0;
- //templateMemberItem = FALSE;
- m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING);
- m_denseText = FALSE;
- m_inGroup = FALSE;
- m_inDetail = FALSE;
- m_levelListItem = 0;
- m_descTable = FALSE;
- m_inLevel = -1;
- m_firstMember = FALSE;
- for (int i = 0 ; i < sizeof(m_inListItem) / sizeof(*m_inListItem) ; i++) m_inListItem[i] = FALSE;
- for (int i = 0 ; i < sizeof(m_inSimpleSect) / sizeof(*m_inSimpleSect) ; i++) m_inSimpleSect[i] = FALSE;
+}
+
+DocbookGenerator::DocbookGenerator(const DocbookGenerator &og) : OutputGenerator(og)
+{
+}
+
+DocbookGenerator &DocbookGenerator::operator=(const DocbookGenerator &og)
+{
+ OutputGenerator::operator=(og);
+ return *this;
+}
+
+std::unique_ptr<OutputGenerator> DocbookGenerator::clone() const
+{
+ return std::make_unique<DocbookGenerator>(*this);
}
DocbookGenerator::~DocbookGenerator()
@@ -295,7 +308,7 @@ void DocbookGenerator::init()
createSubDirs(d);
}
-void DocbookGenerator::startFile(const char *name,const char *,const char *)
+void DocbookGenerator::startFile(const char *name,const char *,const char *,int)
{
DB_GEN_C
QCString fileName=name;
@@ -322,6 +335,7 @@ DB_GEN_C
t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
t << "<" << fileType << " xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
if (!pageName.isEmpty()) t << " xml:id=\"_" << stripPath(pageName) << "\"";
+ t << " xml:lang=\"" << theTranslator->trISOLang() << "\"";
t << ">" << endl;
}
@@ -429,7 +443,7 @@ DB_GEN_C2("IndexSections " << is)
void DocbookGenerator::endIndexSection(IndexSections is)
{
DB_GEN_C2("IndexSections " << is)
- static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
+ bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
switch (is)
{
case isTitlePageStart:
@@ -470,18 +484,7 @@ DB_GEN_C2("IndexSections " << is)
case isModuleDocumentation:
{
t << "</title>" << endl;
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- bool found=FALSE;
- for (gli.toFirst();(gd=gli.current()) && !found;++gli)
- {
- if (!gd->isReference())
- {
- t << " <xi:include href=\"" << gd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- found=TRUE;
- }
- }
- for (;(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (!gd->isReference())
{
@@ -494,22 +497,11 @@ DB_GEN_C2("IndexSections " << is)
case isDirDocumentation:
{
t << "</title>" << endl;
- SDict<DirDef>::Iterator dli(*Doxygen::directories);
- DirDef *dd;
- bool found=FALSE;
- for (dli.toFirst();(dd=dli.current()) && !found;++dli)
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
if (dd->isLinkableInProject())
{
t << "< xi:include href=\"" << dd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- found=TRUE;
- }
- }
- for (;(dd=dli.current());++dli)
- {
- if (dd->isLinkableInProject())
- {
- t << " <xi:include href=\"" << dd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
}
}
}
@@ -518,24 +510,12 @@ DB_GEN_C2("IndexSections " << is)
case isNamespaceDocumentation:
{
t << "</title>" << endl;
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- bool found=FALSE;
- for (nli.toFirst();(nd=nli.current()) && !found;++nli)
- {
- if (nd->isLinkableInProject())
- {
- t << "<xi:include href=\"" << nd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- found=TRUE;
- }
- }
- while ((nd=nli.current()))
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- if (nd->isLinkableInProject())
+ if (nd->isLinkableInProject() && !nd->isAlias())
{
t << "<xi:include href=\"" << nd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
}
- ++nli;
}
}
t << "</chapter>\n";
@@ -543,25 +523,12 @@ DB_GEN_C2("IndexSections " << is)
case isClassDocumentation:
{
t << "</title>" << endl;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd=0;
- bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
- {
- if (cd->isLinkableInProject() &&
- cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope()
- )
- {
- t << " <xi:include href=\"" << cd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- found=TRUE;
- }
- }
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope()
+ !cd->isEmbeddedInOuterScope() &&
+ !cd->isAlias()
)
{
t << " <xi:include href=\"" << cd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
@@ -574,13 +541,9 @@ DB_GEN_C2("IndexSections " << is)
{
t << "</title>" << endl;
bool isFirst=TRUE;
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- const FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
if (fd->isLinkableInProject())
{
@@ -610,13 +573,7 @@ DB_GEN_C2("IndexSections " << is)
case isExampleDocumentation:
{
t << "</title>" << endl;
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=pdi.toFirst();
- if (pd)
- {
- t << " <xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
- }
- for (++pdi;(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::exampleLinkedMap)
{
t << " <xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
}
@@ -635,9 +592,7 @@ DB_GEN_C2("IndexSections " << is)
void DocbookGenerator::writePageLink(const char *name, bool /*first*/)
{
DB_GEN_C
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd = pdi.toFirst();
- for (pd = pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
if (!pd->getGroupDef() && !pd->isReference() && pd->name() == stripPath(name))
{
@@ -655,7 +610,8 @@ DB_GEN_C
}
}
}
-void DocbookGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *)
+
+void DocbookGenerator::writeDoc(DocNode *n,const Definition *,const MemberDef *,int)
{
DB_GEN_C
DocbookDocVisitor *visitor =
@@ -680,7 +636,7 @@ void DocbookGenerator::writeString(const char *text)
DB_GEN_C
t << text;
}
-void DocbookGenerator::startMemberHeader(const char *name,int)
+void DocbookGenerator::startMemberHeader(const char *,int)
{
DB_GEN_C
t << "<simplesect>" << endl;
@@ -698,7 +654,7 @@ void DocbookGenerator::docify(const char *str)
DB_GEN_C
t << convertToDocBook(str);
}
-void DocbookGenerator::writeObjectLink(const char *ref, const char *f,
+void DocbookGenerator::writeObjectLink(const char *, const char *f,
const char *anchor, const char *text)
{
DB_GEN_C
@@ -738,12 +694,12 @@ void DocbookGenerator::endMemberItem()
DB_GEN_C
t << "</para>" << endl;
}
-void DocbookGenerator::startBold(void)
+void DocbookGenerator::startBold()
{
DB_GEN_C
t << "<emphasis role=\"strong\">";
}
-void DocbookGenerator::endBold(void)
+void DocbookGenerator::endBold()
{
DB_GEN_C
t << "</emphasis>";
@@ -761,7 +717,7 @@ DB_GEN_C2("extraIndentLevel " << extraIndentLevel)
t << "<section>" << endl;
t << "<title>";
}
-void DocbookGenerator::writeRuler(void)
+void DocbookGenerator::writeRuler()
{
DB_GEN_C2("m_inLevel " << m_inLevel)
DB_GEN_C2("m_inGroup " << m_inGroup)
@@ -813,7 +769,7 @@ DB_GEN_C
t << "<programlisting>";
}
}
-void DocbookGenerator::endTextBlock(bool dense)
+void DocbookGenerator::endTextBlock(bool)
{
DB_GEN_C
if (m_denseText)
@@ -822,8 +778,8 @@ DB_GEN_C
t << "</programlisting>";
}
}
-void DocbookGenerator::startMemberDoc(const char *clname, const char *memname, const char *anchor, const char *title,
- int memCount, int memTotal, bool showInline)
+void DocbookGenerator::startMemberDoc(const char *clname, const char *memname, const char *, const char *title,
+ int memCount, int memTotal, bool)
{
DB_GEN_C2("m_inLevel " << m_inLevel)
t << " <section>" << endl;
@@ -849,15 +805,15 @@ void DocbookGenerator::startTitleHead(const char *)
DB_GEN_C
t << "<title>";
}
-void DocbookGenerator::endTitleHead(const char *fileName,const char *name)
+void DocbookGenerator::endTitleHead(const char *,const char *name)
{
DB_GEN_C
t << "</title>" << endl;
if (name) addIndexTerm(t, name);
}
-void DocbookGenerator::startDoxyAnchor(const char *fName,const char *manName,
- const char *anchor,const char *name,
- const char *args)
+void DocbookGenerator::startDoxyAnchor(const char *fName,const char *,
+ const char *anchor,const char *,
+ const char *)
{
DB_GEN_C
if (!m_inListItem[m_levelListItem] && !m_descTable)
@@ -870,7 +826,7 @@ DB_GEN_C
t << "<anchor xml:id=\"_" << stripPath(fName) << "_1" << anchor << "\"/>";
}
}
-void DocbookGenerator::endDoxyAnchor(const char *fileName,const char *anchor)
+void DocbookGenerator::endDoxyAnchor(const char *,const char *)
{
DB_GEN_C
}
@@ -883,7 +839,7 @@ void DocbookGenerator::endMemberDocName()
{
DB_GEN_C
}
-void DocbookGenerator::startMemberGroupHeader(bool hasHeader)
+void DocbookGenerator::startMemberGroupHeader(bool)
{
DB_GEN_C
t << "<simplesect><title>";
@@ -914,10 +870,10 @@ DB_GEN_C
t << " <informalfigure>" << endl;
t << " <mediaobject>" << endl;
t << " <imageobject>" << endl;
- t << " <imagedata width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\""
+ t << " <imagedata width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\""
<< relPath << fileName << ".png\">" << "</imagedata>" << endl;
t << " </imageobject>" << endl;
- d.writeImage(t,m_dir,relPath,fileName,FALSE);
+ d.writeImage(t,dir(),relPath,fileName,FALSE);
t << " </mediaobject>" << endl;
t << " </informalfigure>" << endl;
t << "</para>" << endl;
@@ -951,12 +907,12 @@ void DocbookGenerator::endExamples()
DB_GEN_C
t << "</simplesect>" << endl;
}
-void DocbookGenerator::startSubsubsection(void)
+void DocbookGenerator::startSubsubsection()
{
DB_GEN_C
t << "<simplesect><title>";
}
-void DocbookGenerator::endSubsubsection(void)
+void DocbookGenerator::endSubsubsection()
{
DB_GEN_C
t << "</title></simplesect>" << endl;
@@ -1001,19 +957,6 @@ DB_GEN_C
if (closeBracket) t << ")";
}
}
-void DocbookGenerator::startCodeFragment()
-{
-DB_GEN_C
- t << "<programlisting>";
-}
-void DocbookGenerator::endCodeFragment()
-{
-DB_GEN_C
- //endCodeLine checks is there is still an open code line, if so closes it.
- endCodeLine();
-
- t << "</programlisting>";
-}
void DocbookGenerator::startMemberTemplateParams()
{
DB_GEN_C
@@ -1025,13 +968,13 @@ DB_GEN_C
t << "</para>";
t << "<para>";
}
-void DocbookGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type)
+void DocbookGenerator::startSection(const char *lab,const char *,SectionType)
{
DB_GEN_C
t << " <section xml:id=\"_" << stripPath(lab) << "\">";
t << "<title>";
}
-void DocbookGenerator::endSection(const char *lab,SectionInfo::SectionType)
+void DocbookGenerator::endSection(const char *,SectionType)
{
DB_GEN_C
t << "</title>";
@@ -1108,7 +1051,7 @@ DB_GEN_C
void DocbookGenerator::endGroupCollaboration(DotGroupCollaboration &g)
{
DB_GEN_C
- g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),m_fileName,relPath,FALSE);
+ g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,FALSE);
}
void DocbookGenerator::startDotGraph()
{
@@ -1117,7 +1060,7 @@ DB_GEN_C
void DocbookGenerator::endDotGraph(DotClassGraph &g)
{
DB_GEN_C
- g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),m_fileName,relPath,TRUE,FALSE);
+ g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,TRUE,FALSE);
}
void DocbookGenerator::startInclDepGraph()
{
@@ -1126,7 +1069,7 @@ DB_GEN_C
void DocbookGenerator::endInclDepGraph(DotInclDepGraph &g)
{
DB_GEN_C
- QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT), m_fileName,relPath,FALSE);
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,FALSE);
}
void DocbookGenerator::startCallGraph()
{
@@ -1135,7 +1078,7 @@ DB_GEN_C
void DocbookGenerator::endCallGraph(DotCallGraph &g)
{
DB_GEN_C
- QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT), m_fileName,relPath,FALSE);
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,FALSE);
}
void DocbookGenerator::startDirDepGraph()
{
@@ -1144,7 +1087,7 @@ DB_GEN_C
void DocbookGenerator::endDirDepGraph(DotDirDeps &g)
{
DB_GEN_C
- QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT), m_fileName,relPath,FALSE);
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,FALSE);
}
void DocbookGenerator::startMemberDocList()
{
diff --git a/src/docbookgen.h b/src/docbookgen.h
index 64e9e67..214ec97 100644
--- a/src/docbookgen.h
+++ b/src/docbookgen.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
-*
+*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
@@ -15,6 +15,7 @@
#ifndef DOCBOOKGEN_H
#define DOCBOOKGEN_H
+#include "config.h"
#include "outputgen.h"
class DocbookCodeGenerator : public CodeOutputInterface
@@ -52,21 +53,21 @@ class DocbookCodeGenerator : public CodeOutputInterface
void setCurrentDoc(const Definition *,const char *,bool);
void addWord(const char *,bool);
void finish();
- void startCodeFragment();
- void endCodeFragment();
+ void startCodeFragment(const char *style);
+ void endCodeFragment(const char *style);
private:
FTextStream m_t;
- bool m_streamSet;
+ bool m_streamSet = false;
QCString m_refId;
QCString m_external;
- int m_lineNumber;
- int m_col;
- bool m_insideCodeLine;
- bool m_insideSpecialHL;
+ int m_lineNumber = -1;
+ int m_col = 0;
+ bool m_insideCodeLine = false;
+ bool m_insideSpecialHL = false;
QCString m_relPath;
QCString m_sourceFileName;
- bool m_prettyCode;
+ bool m_prettyCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
};
@@ -97,20 +98,14 @@ class DocbookGenerator : public OutputGenerator
{
public:
DocbookGenerator();
- ~DocbookGenerator();
+ DocbookGenerator(const DocbookGenerator &o);
+ DocbookGenerator &operator=(const DocbookGenerator &o);
+ virtual ~DocbookGenerator();
+ virtual std::unique_ptr<OutputGenerator> clone() const;
+
static void init();
- ///////////////////////////////////////////////////////////////
- // generic generator methods
- ///////////////////////////////////////////////////////////////
- void enable()
- { if (m_genStack->top()) m_active=*m_genStack->top(); else m_active=TRUE; }
- void disable() { m_active=FALSE; }
- void enableIf(OutputType o) { if (o==Docbook) enable(); }
- void disableIf(OutputType o) { if (o==Docbook) disable(); }
- void disableIfNot(OutputType o) { if (o!=Docbook) disable(); }
- bool isEnabled(OutputType o) { return (o==Docbook && m_active); }
- OutputGenerator *get(OutputType o) { return (o==Docbook) ? this : 0; }
+ OutputType type() const { return Docbook; }
// --- CodeOutputInterface
void codify(const char *text)
@@ -135,24 +130,28 @@ class DocbookGenerator : public OutputGenerator
{ m_codeGen.endFontClass(); }
void writeCodeAnchor(const char *anchor)
{ m_codeGen.writeCodeAnchor(anchor); }
+ void startCodeFragment(const char *style)
+ { m_codeGen.startCodeFragment(style); }
+ void endCodeFragment(const char *style)
+ { m_codeGen.endCodeFragment(style); }
// ---------------------------
- void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md);
+ void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md,int id);
///////////////////////////////////////////////////////////////
// structural output interface
///////////////////////////////////////////////////////////////
void startFile(const char *name,const char *manName,
- const char *title);
+ const char *title,int id);
void writeSearchInfo(){DB_GEN_EMPTY};
- void writeFooter(const char *navPath){DB_GEN_NEW};
+ void writeFooter(const char *){DB_GEN_NEW};
void endFile();
void startIndexSection(IndexSections);
void endIndexSection(IndexSections);
void writePageLink(const char *,bool);
void startProjectNumber(){DB_GEN_NEW};
void endProjectNumber(){DB_GEN_NEW};
- void writeStyleInfo(int part){DB_GEN_EMPTY};
+ void writeStyleInfo(int){DB_GEN_EMPTY};
void startTitleHead(const char *);
void endTitleHead(const char *fileName,const char *name);
void startIndexListItem(){DB_GEN_NEW};
@@ -166,65 +165,63 @@ class DocbookGenerator : public OutputGenerator
void startItemList() {DB_GEN_EMPTY};
void endItemList() {DB_GEN_EMPTY};
- void startIndexItem(const char *ref,const char *file){DB_GEN_NEW};
- void endIndexItem(const char *ref,const char *file){DB_GEN_NEW};
+ void startIndexItem(const char *,const char *){DB_GEN_NEW};
+ void endIndexItem(const char *,const char *){DB_GEN_NEW};
void startItemListItem() {DB_GEN_EMPTY};
void endItemListItem() {DB_GEN_EMPTY};
void docify(const char *text);
void writeChar(char);
void writeString(const char *);
void startParagraph(const char *);
- void endParagraph(void);
+ void endParagraph();
void writeObjectLink(const char *,const char *,const char *,const char *);
void startHtmlLink(const char *){DB_GEN_NEW};
- void endHtmlLink(void){DB_GEN_NEW};
- void startBold(void);
- void endBold(void);
- void startTypewriter(void);
- void endTypewriter(void);
- void startEmphasis(void){DB_GEN_NEW};
- void endEmphasis(void){DB_GEN_NEW};
- void startCodeFragment(void);
- void endCodeFragment(void);
- void writeRuler(void);
- void startDescription(void){DB_GEN_NEW};
- void endDescription(void){DB_GEN_NEW};
- void startDescItem(void){DB_GEN_NEW};
- void startDescForItem(void){DB_GEN_EMPTY};
- void endDescForItem(void){DB_GEN_EMPTY};
- void endDescItem(void){DB_GEN_NEW};
- void startCenter(void){DB_GEN_NEW};
- void endCenter(void){DB_GEN_NEW};
- void startSmall(void){DB_GEN_NEW};
- void endSmall(void){DB_GEN_NEW};
- void startExamples(void);
- void endExamples(void);
+ void endHtmlLink(){DB_GEN_NEW};
+ void startBold();
+ void endBold();
+ void startTypewriter();
+ void endTypewriter();
+ void startEmphasis(){DB_GEN_NEW};
+ void endEmphasis(){DB_GEN_NEW};
+ void writeRuler();
+ void startDescription(){DB_GEN_NEW};
+ void endDescription(){DB_GEN_NEW};
+ void startDescItem(){DB_GEN_NEW};
+ void startDescForItem(){DB_GEN_EMPTY};
+ void endDescForItem(){DB_GEN_EMPTY};
+ void endDescItem(){DB_GEN_NEW};
+ void startCenter(){DB_GEN_NEW};
+ void endCenter(){DB_GEN_NEW};
+ void startSmall(){DB_GEN_NEW};
+ void endSmall(){DB_GEN_NEW};
+ void startExamples();
+ void endExamples();
void startParamList(BaseOutputDocInterface::ParamListTypes,const char *){DB_GEN_NEW};
- void endParamList(void){DB_GEN_NEW};
- void startTitle(void){DB_GEN_NEW};
- void endTitle(void){DB_GEN_NEW};
+ void endParamList(){DB_GEN_NEW};
+ void startTitle(){DB_GEN_NEW};
+ void endTitle(){DB_GEN_NEW};
void writeAnchor(const char *,const char *){DB_GEN_EMPTY};
- void startSection(const char *,const char *,SectionInfo::SectionType);
- void endSection(const char *,SectionInfo::SectionType);
+ void startSection(const char *,const char *,SectionType);
+ void endSection(const char *,SectionType);
void lineBreak(const char *);
void addIndexItem(const char *,const char *);
void writeNonBreakableSpace(int);
void startDescTable(const char *);
- void endDescTable(void);
- void startDescTableRow(void);
- void endDescTableRow(void);
- void startDescTableTitle(void);
- void endDescTableTitle(void);
- void startDescTableData(void);
- void endDescTableData(void);
+ void endDescTable();
+ void startDescTableRow();
+ void endDescTableRow();
+ void startDescTableTitle();
+ void endDescTableTitle();
+ void startDescTableData();
+ void endDescTableData();
void startTextLink(const char *,const char *){DB_GEN_NEW};
- void endTextLink(void){DB_GEN_NEW};
- void startPageRef(void){DB_GEN_NEW};
+ void endTextLink(){DB_GEN_NEW};
+ void startPageRef(){DB_GEN_NEW};
void endPageRef(const char *,const char *){DB_GEN_NEW};
- void startSubsection(void){DB_GEN_NEW};
- void endSubsection(void){DB_GEN_NEW};
- void startSubsubsection(void);
- void endSubsubsection(void);
+ void startSubsection(){DB_GEN_NEW};
+ void endSubsection(){DB_GEN_NEW};
+ void startSubsubsection();
+ void endSubsubsection();
void startGroupHeader(int);
@@ -258,23 +255,23 @@ class DocbookGenerator : public OutputGenerator
void insertMemberAlign(bool){DB_GEN_EMPTY};
void insertMemberAlignLeft(int,bool){DB_GEN_EMPTY};
void startMemberDoc(const char *,const char *,
- const char *,const char *,int,int,bool);
+ const char *,const char *,int,int,bool);
void endMemberDoc(bool);
void startDoxyAnchor(const char *fName,const char *manName,
- const char *anchor,const char *name,
- const char *args);
+ const char *anchor,const char *name,
+ const char *args);
void endDoxyAnchor(const char *fileName,const char *anchor);
void writeLatexSpacing(){DB_GEN_EMPTY}
- void writeStartAnnoItem(const char *type,const char *file,
- const char *path,const char *name){DB_GEN_NEW};
- void writeEndAnnoItem(const char *name){DB_GEN_NEW};
- void startMemberDescription(const char *anchor,const char *inheritId, bool typ){DB_GEN_EMPTY};
+ void writeStartAnnoItem(const char *,const char *,
+ const char *,const char *){DB_GEN_NEW};
+ void writeEndAnnoItem(const char *){DB_GEN_NEW};
+ void startMemberDescription(const char *,const char *,bool){DB_GEN_EMPTY};
void endMemberDescription(){DB_GEN_EMPTY};
void startMemberDeclaration(){DB_GEN_EMPTY};
- void endMemberDeclaration(const char *anchor,const char *inheritId){DB_GEN_EMPTY};
- void writeInheritedSectionTitle(const char *id,const char *ref,
- const char *file,const char *anchor,
- const char *title,const char *name){DB_GEN_NEW};
+ void endMemberDeclaration(const char *,const char *){DB_GEN_EMPTY};
+ void writeInheritedSectionTitle(const char *,const char *,
+ const char *,const char *,
+ const char *,const char *){DB_GEN_NEW};
void startIndent(){DB_GEN_EMPTY};
void endIndent(){DB_GEN_EMPTY};
void writeSynopsis(){DB_GEN_EMPTY};
@@ -290,17 +287,17 @@ class DocbookGenerator : public OutputGenerator
void endCallGraph(DotCallGraph &g);
void startDirDepGraph();
void endDirDepGraph(DotDirDeps &g);
- void writeGraphicalHierarchy(DotGfxHierarchyTable &g){DB_GEN_NEW};
+ void writeGraphicalHierarchy(DotGfxHierarchyTable &){DB_GEN_NEW};
void startQuickIndices(){DB_GEN_EMPTY};
void endQuickIndices(){DB_GEN_EMPTY};
void writeSplitBar(const char *){DB_GEN_EMPTY};
void writeNavigationPath(const char *){DB_GEN_NEW};
void writeLogo(){DB_GEN_NEW};
- void writeQuickLinks(bool compact,HighlightedItem hli,const char *file){DB_GEN_EMPTY};
- void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first){DB_GEN_EMPTY};
+ void writeQuickLinks(bool,HighlightedItem,const char *){DB_GEN_EMPTY};
+ void writeSummaryLink(const char *,const char *,const char *,bool){DB_GEN_EMPTY};
void startContents(){DB_GEN_EMPTY};
void endContents(){DB_GEN_EMPTY};
- void startPageDoc(const char *pageTitle){DB_GEN_EMPTY}
+ void startPageDoc(const char *){DB_GEN_EMPTY}
void endPageDoc() {DB_GEN_EMPTY}
void startTextBlock(bool);
void endTextBlock(bool);
@@ -309,7 +306,7 @@ class DocbookGenerator : public OutputGenerator
void endMemberDocPrefixItem();
void startMemberDocName(bool);
void endMemberDocName();
- void startParameterType(bool,const char *key){DB_GEN_EMPTY};
+ void startParameterType(bool,const char *){DB_GEN_EMPTY};
void endParameterType(){DB_GEN_EMPTY};
void startParameterName(bool);
void endParameterName(bool,bool,bool);
@@ -343,21 +340,19 @@ class DocbookGenerator : public OutputGenerator
void addWord(const char *,bool) {DB_GEN_EMPTY}
private:
- DocbookGenerator(const DocbookGenerator &o);
- DocbookGenerator &operator=(const DocbookGenerator &o);
-
+
QCString relPath;
DocbookCodeGenerator m_codeGen;
- bool m_prettyCode;
- bool m_denseText;
- bool m_inGroup;
- bool m_inDetail;
- int m_levelListItem;
- bool m_inListItem[20];
- bool m_inSimpleSect[20];
- bool m_descTable;
- int m_inLevel;
- bool m_firstMember;
+ bool m_prettyCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
+ bool m_denseText = false;
+ bool m_inGroup = false;
+ bool m_inDetail = false;
+ int m_levelListItem = 0;
+ bool m_inListItem[20] = { false, };
+ bool m_inSimpleSect[20] = { false, };
+ bool m_descTable = false;
+ int m_inLevel = -1;
+ bool m_firstMember = false;
};
#endif
diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp
index 9de0a16..d444b7b 100644
--- a/src/docbookvisitor.cpp
+++ b/src/docbookvisitor.cpp
@@ -1,9 +1,6 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -16,6 +13,7 @@
*
*/
+
#include <qfileinfo.h>
#include "docbookvisitor.h"
@@ -55,7 +53,7 @@ static QCString filterId(const char *s)
static GrowBuf growBuf;
growBuf.clear();
if (s==0) return "";
- const unsigned char *p=(const unsigned char *)s;
+ const char *p=s;
char c;
while ((c=*p++))
{
@@ -69,6 +67,23 @@ static QCString filterId(const char *s)
return growBuf.get();
}
+static bool supportedHtmlAttribute(const QCString &name)
+{
+ return (name=="align" ||
+ name=="bgcolor" ||
+ name=="border" ||
+ name=="cellpadding" ||
+ name=="cellspacing" ||
+ name=="class" ||
+ name=="frame" ||
+ name=="label" ||
+ name=="style" ||
+ name=="width" ||
+ name=="tabstyle" ||
+ name=="title");
+}
+
+
void DocbookDocVisitor::visitCaption(const QList<DocNode> &children)
{
QListIterator<DocNode> cli(children);
@@ -138,7 +153,7 @@ void DocbookDocVisitor::visitPostEnd(FTextStream &t, bool hasCaption, bool inlin
}
DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci)
- : DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
+ : DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci)
{
DB_VIS_C
// m_t << "<section>" << endl;
@@ -301,9 +316,11 @@ DB_VIS_C
{
case DocVerbatim::Code: // fall though
m_t << "<literallayout><computeroutput>";
- Doxygen::parserManager->getCodeParser(m_langExt)
- .parseCode(m_ci,s->context(),s->text(),langExt,
- s->isExample(),s->exampleFile());
+ getCodeParser(m_langExt).parseCode(m_ci,s->context(),
+ s->text(),
+ langExt,
+ s->isExample(),
+ s->exampleFile());
m_t << "</computeroutput></literallayout>";
break;
case DocVerbatim::Verbatim:
@@ -311,17 +328,17 @@ DB_VIS_C
filter(s->text());
m_t << "</computeroutput></literallayout>";
break;
- case DocVerbatim::HtmlOnly:
+ case DocVerbatim::HtmlOnly:
break;
- case DocVerbatim::RtfOnly:
+ case DocVerbatim::RtfOnly:
break;
- case DocVerbatim::ManOnly:
+ case DocVerbatim::ManOnly:
break;
- case DocVerbatim::LatexOnly:
+ case DocVerbatim::LatexOnly:
break;
- case DocVerbatim::XmlOnly:
+ case DocVerbatim::XmlOnly:
break;
- case DocVerbatim::DocbookOnly:
+ case DocVerbatim::DocbookOnly:
m_t << s->text();
break;
case DocVerbatim::Dot:
@@ -339,12 +356,13 @@ DB_VIS_C
QFile file(baseName+".dot");
if (!file.open(IO_WriteOnly))
{
- err("Could not open file %s.msc for writing\n",baseName.data());
+ err("Could not open file %s.dot for writing\n",baseName.data());
}
file.writeBlock( stext, stext.length() );
file.close();
writeDotFile(baseName, s);
m_t << "</para>" << endl;
+ if (Config_getBool(DOT_CLEANUP)) file.remove();
}
break;
case DocVerbatim::Msc:
@@ -371,6 +389,7 @@ DB_VIS_C
file.close();
writeMscFile(baseName,s);
m_t << "</para>" << endl;
+ if (Config_getBool(DOT_CLEANUP)) file.remove();
}
break;
case DocVerbatim::PlantUML:
@@ -381,7 +400,7 @@ DB_VIS_C
int i;
if ((i=shortName.findRev('/'))!=-1)
{
- shortName=shortName.right(shortName.length()-i-1);
+ shortName=shortName.right((int)shortName.length()-i-1);
}
m_t << "<para>" << endl;
writePlantUMLFile(baseName,s);
@@ -410,30 +429,34 @@ DB_VIS_C
m_t << "<literallayout><computeroutput>";
QFileInfo cfi( inc->file() );
FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
- inc->text(),
- langExt,
- inc->isExample(),
- inc->exampleFile(), fd);
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
+ inc->text(),
+ langExt,
+ inc->isExample(),
+ inc->exampleFile(), fd);
delete fd;
m_t << "</computeroutput></literallayout>";
}
break;
case DocInclude::Include:
m_t << "<literallayout><computeroutput>";
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
- inc->text(),
- langExt,
- inc->isExample(),
- inc->exampleFile());
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
+ inc->text(),
+ langExt,
+ inc->isExample(),
+ inc->exampleFile());
m_t << "</computeroutput></literallayout>";
break;
case DocInclude::DontInclude:
case DocInclude::DontIncWithLines:
case DocInclude::HtmlInclude:
case DocInclude::LatexInclude:
+ case DocInclude::RtfInclude:
+ case DocInclude::ManInclude:
+ case DocInclude::XmlInclude:
+ break;
+ case DocInclude::DocbookInclude:
+ m_t << inc->text();
break;
case DocInclude::VerbInclude:
m_t << "<literallayout>";
@@ -442,14 +465,13 @@ DB_VIS_C
break;
case DocInclude::Snippet:
m_t << "<literallayout><computeroutput>";
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
- inc->context(),
- extractBlock(inc->text(),inc->blockId()),
- langExt,
- inc->isExample(),
- inc->exampleFile()
- );
+ getCodeParser(inc->extension()).parseCode(m_ci,
+ inc->context(),
+ extractBlock(inc->text(),inc->blockId()),
+ langExt,
+ inc->isExample(),
+ inc->exampleFile()
+ );
m_t << "</computeroutput></literallayout>";
break;
case DocInclude::SnipWithLines:
@@ -457,13 +479,12 @@ DB_VIS_C
QFileInfo cfi( inc->file() );
FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
m_t << "<literallayout><computeroutput>";
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
extractBlock(inc->text(),inc->blockId()),
langExt,
inc->isExample(),
- inc->exampleFile(),
+ inc->exampleFile(),
fd,
lineBlock(inc->text(),inc->blockId()),
-1, // endLine
@@ -475,8 +496,8 @@ DB_VIS_C
m_t << "</computeroutput></literallayout>";
}
break;
- case DocInclude::SnippetDoc:
- case DocInclude::IncludeDoc:
+ case DocInclude::SnippetDoc:
+ case DocInclude::IncludeDoc:
err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
"Please create a bug report\n",__FILE__);
break;
@@ -510,17 +531,16 @@ DB_VIS_C
fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
}
- Doxygen::parserManager->getCodeParser(locLangExt)
- .parseCode(m_ci,op->context(),
- op->text(),langExt,op->isExample(),
- op->exampleFile(),
- fd, // fileDef
- op->line(), // startLine
- -1, // endLine
- FALSE, // inline fragment
- 0, // memberDef
- op->showLineNo() // show line numbers
- );
+ getCodeParser(locLangExt).parseCode(m_ci,op->context(),
+ op->text(),langExt,op->isExample(),
+ op->exampleFile(),
+ fd, // fileDef
+ op->line(), // startLine
+ -1, // endLine
+ FALSE, // inline fragment
+ 0, // memberDef
+ op->showLineNo() // show line numbers
+ );
if (fd) delete fd;
}
pushEnabled();
@@ -657,152 +677,152 @@ DB_VIS_C
switch(s->type())
{
case DocSimpleSect::See:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trSeeAlso() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trSeeAlso()) << "</title>" << endl;
}
break;
case DocSimpleSect::Return:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trReturns()<< "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trReturns()) << "</title>" << endl;
}
break;
case DocSimpleSect::Author:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trAuthor(TRUE, TRUE) << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trAuthor(TRUE, TRUE)) << "</title>" << endl;
}
break;
case DocSimpleSect::Authors:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trAuthor(TRUE, FALSE) << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trAuthor(TRUE, FALSE)) << "</title>" << endl;
}
break;
case DocSimpleSect::Version:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trVersion() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trVersion()) << "</title>" << endl;
}
break;
case DocSimpleSect::Since:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trSince() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trSince()) << "</title>" << endl;
}
break;
case DocSimpleSect::Date:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trDate() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trDate()) << "</title>" << endl;
}
break;
case DocSimpleSect::Note:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<note><title>" << theTranslator->trNote() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<note><title>" << convertToDocBook(theTranslator->trNote()) << "</title>" << endl;
}
break;
case DocSimpleSect::Warning:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<warning><title>" << theTranslator->trWarning() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<warning><title>" << convertToDocBook(theTranslator->trWarning()) << "</title>" << endl;
}
break;
case DocSimpleSect::Pre:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trPrecondition() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trPrecondition()) << "</title>" << endl;
}
break;
case DocSimpleSect::Post:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trPostcondition() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trPostcondition()) << "</title>" << endl;
}
break;
case DocSimpleSect::Copyright:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trCopyright() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trCopyright()) << "</title>" << endl;
}
break;
case DocSimpleSect::Invar:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trInvariant() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trInvariant()) << "</title>" << endl;
}
break;
case DocSimpleSect::Remark:
// <remark> is miising the <title> possibility
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<formalpara><title>" << theTranslator->trRemarks() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trRemarks()) << "</title>" << endl;
}
break;
case DocSimpleSect::Attention:
- if (m_insidePre)
+ if (m_insidePre)
{
m_t << "<caution><title>" << theTranslator->trAttention() << "</title>" << endl;
- }
- else
+ }
+ else
{
m_t << "<caution><title>" << convertToDocBook(theTranslator->trAttention()) << "</title>" << endl;
}
@@ -983,12 +1003,10 @@ DB_VIS_C
m_t << "</listitem></varlistentry>\n";
}
-static int colCnt = 0;
-static bool bodySet = FALSE; // it is possible to have tables without a header
void DocbookDocVisitor::visitPre(DocHtmlTable *t)
{
DB_VIS_C
- bodySet = FALSE;
+ m_bodySet.push(false);
if (m_hide) return;
m_t << "<informaltable frame=\"all\">" << endl;
m_t << " <tgroup cols=\"" << t->numColumns() << "\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
@@ -1003,8 +1021,8 @@ void DocbookDocVisitor::visitPost(DocHtmlTable *)
{
DB_VIS_C
if (m_hide) return;
- if (bodySet) m_t << " </tbody>" << endl;
- bodySet = FALSE;
+ if (m_bodySet.top()) m_t << " </tbody>" << endl;
+ m_bodySet.pop();
m_t << " </tgroup>" << endl;
m_t << "</informaltable>" << endl;
}
@@ -1012,13 +1030,18 @@ DB_VIS_C
void DocbookDocVisitor::visitPre(DocHtmlRow *tr)
{
DB_VIS_C
- colCnt = 0;
+ m_colCnt = 0;
if (m_hide) return;
- if (tr->isHeading()) m_t << "<thead>\n";
- else if (!bodySet)
+ if (tr->isHeading())
+ {
+ if (m_bodySet.top()) m_t << "</tbody>\n";
+ m_bodySet.top() = false;
+ m_t << "<thead>\n";
+ }
+ else if (!m_bodySet.top())
{
- bodySet = TRUE;
+ m_bodySet.top() = true;
m_t << "<tbody>\n";
}
@@ -1028,25 +1051,10 @@ DB_VIS_C
HtmlAttrib *opt;
for (li.toFirst();(opt=li.current());++li)
{
- if (opt->name=="class")
+ if (supportedHtmlAttribute(opt->name))
{
- // just skip it
- }
- else if (opt->name=="style")
- {
- // just skip it
- }
- else if (opt->name=="height")
- {
- // just skip it
- }
- else if (opt->name=="filter")
- {
- // just skip it
- }
- else
- {
- m_t << " " << opt->name << "='" << opt->value << "'";
+ // process supported attributes only
+ m_t << " " << opt->name << "='" << convertToDocBook(opt->value) << "'";
}
}
m_t << ">\n";
@@ -1059,15 +1067,15 @@ DB_VIS_C
m_t << "</row>\n";
if (tr->isHeading())
{
- bodySet = TRUE;
m_t << "</thead><tbody>\n";
+ m_bodySet.top() = true;
}
}
void DocbookDocVisitor::visitPre(DocHtmlCell *c)
{
DB_VIS_C
- colCnt++;
+ m_colCnt++;
if (m_hide) return;
m_t << "<entry";
@@ -1077,10 +1085,10 @@ DB_VIS_C
{
if (opt->name=="colspan")
{
- m_t << " namest='c" << colCnt << "'";
+ m_t << " namest='c" << m_colCnt << "'";
int cols = opt->value.toInt();
- colCnt += (cols - 1);
- m_t << " nameend='c" << colCnt << "'";
+ m_colCnt += (cols - 1);
+ m_t << " nameend='c" << m_colCnt << "'";
}
else if (opt->name=="rowspan")
{
@@ -1089,63 +1097,44 @@ DB_VIS_C
}
else if (opt->name=="class")
{
- if (opt->value == "markdownTableBodyRight")
- {
- m_t << " align='right'";
- }
- else if (opt->value == "markdownTableBodyLeftt")
- {
- m_t << " align='left'";
- }
- else if (opt->value == "markdownTableBodyCenter")
- {
- m_t << " align='center'";
- }
- else if (opt->value == "markdownTableHeadRight")
+ if (opt->value.left(13)=="markdownTable") // handle markdown generated attributes
{
- m_t << " align='right'";
- }
- else if (opt->value == "markdownTableHeadLeftt")
- {
- m_t << " align='left'";
+ if (opt->value.right(5)=="Right")
+ {
+ m_t << " align='right'";
+ }
+ else if (opt->value.right(4)=="Left")
+ {
+ m_t << " align='left'";
+ }
+ else if (opt->value.right(6)=="Center")
+ {
+ m_t << " align='center'";
+ }
+ // skip 'markdownTable*' value ending with "None"
}
- else if (opt->value == "markdownTableHeadCenter")
+ else
{
- m_t << " align='center'";
+ m_t << " class='" << convertToDocBook(opt->value) << "'";
}
}
- else if (opt->name=="style")
+ else if (supportedHtmlAttribute(opt->name))
{
- // just skip it
- }
- else if (opt->name=="width")
- {
- // just skip it
- }
- else if (opt->name=="height")
- {
- // just skip it
- }
- else if (opt->name=="nowrap" && opt->value.isEmpty())
- {
- m_t << " " << opt->name << "='nowrap'";
- }
- else
- {
- m_t << " " << opt->name << "='" << opt->value << "'";
+ // process supported attributes only
+ m_t << " " << opt->name << "='" << convertToDocBook(opt->value) << "'";
}
}
m_t << ">";
}
-void DocbookDocVisitor::visitPost(DocHtmlCell *c)
+void DocbookDocVisitor::visitPost(DocHtmlCell *)
{
DB_VIS_C
if (m_hide) return;
m_t << "</entry>";
}
-void DocbookDocVisitor::visitPre(DocHtmlCaption *c)
+void DocbookDocVisitor::visitPre(DocHtmlCaption *)
{
DB_VIS_C
if (m_hide) return;
@@ -1212,7 +1201,7 @@ DB_VIS_C
int i;
if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
{
- baseName=baseName.right(baseName.length()-i-1);
+ baseName=baseName.right((int)baseName.length()-i-1);
}
visitPreStart(m_t, img->children(), img->hasCaption(), img->relPath() + baseName, img->width(), img->height(), img->isInlineImage());
}
@@ -1235,12 +1224,12 @@ DB_VIS_C
int i;
if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
{
- baseName=baseName.right(baseName.length()-i-1);
+ baseName=baseName.right((int)baseName.length()-i-1);
}
QCString m_file;
bool ambig;
- FileDef *fd=findFileDef(Doxygen::imageNameDict, baseName, ambig);
- if (fd)
+ FileDef *fd=findFileDef(Doxygen::imageNameLinkedMap, baseName, ambig);
+ if (fd)
{
m_file=fd->absFilePath();
}
@@ -1257,8 +1246,8 @@ DB_VIS_C
delete[] buffer;
}
}
- }
- else
+ }
+ else
{
popEnabled();
}
@@ -1342,7 +1331,7 @@ DB_VIS_C
if (!ref->file().isEmpty()) endLink();
}
-void DocbookDocVisitor::visitPre(DocSecRefItem *ref)
+void DocbookDocVisitor::visitPre(DocSecRefItem *)
{
DB_VIS_C
if (m_hide) return;
@@ -1425,11 +1414,9 @@ DB_VIS_C
if (m_hide) return;
m_t << " <row>" << endl;
- DocParamSect::Type parentType = DocParamSect::Unknown;
DocParamSect *sect = 0;
if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect)
{
- parentType = ((DocParamSect*)pl->parent())->type();
sect=(DocParamSect*)pl->parent();
}
@@ -1632,16 +1619,14 @@ DB_VIS_C
void DocbookDocVisitor::pushEnabled()
{
DB_VIS_C
- m_enabled.push(new bool(m_hide));
+ m_enabled.push(m_hide);
}
void DocbookDocVisitor::popEnabled()
{
DB_VIS_C
- bool *v=m_enabled.pop();
- ASSERT(v!=0);
- m_hide = *v;
- delete v;
+ m_hide=m_enabled.top();
+ m_enabled.pop();
}
void DocbookDocVisitor::writeMscFile(const QCString &baseName, DocVerbatim *s)
@@ -1651,7 +1636,7 @@ DB_VIS_C
int i;
if ((i=shortName.findRev('/'))!=-1)
{
- shortName=shortName.right(shortName.length()-i-1);
+ shortName=shortName.right((int)shortName.length()-i-1);
}
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP);
@@ -1667,7 +1652,7 @@ DB_VIS_C
int i;
if ((i=shortName.findRev('/'))!=-1)
{
- shortName=shortName.right(shortName.length()-i-1);
+ shortName=shortName.right((int)shortName.length()-i-1);
}
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
PlantumlManager::instance()->generatePlantUMLOutput(baseName,outDir,PlantumlManager::PUML_BITMAP);
@@ -1688,7 +1673,7 @@ DB_VIS_C
int i;
if ((i=baseName.findRev('/'))!=-1)
{
- baseName=baseName.right(baseName.length()-i-1);
+ baseName=baseName.right((int)baseName.length()-i-1);
}
if ((i=baseName.find('.'))!=-1)
{
@@ -1716,7 +1701,7 @@ DB_VIS_C
int i;
if ((i=shortName.findRev('/'))!=-1)
{
- shortName=shortName.right(shortName.length()-i-1);
+ shortName=shortName.right((int)shortName.length()-i-1);
}
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
writeDiaGraphFromFile(baseName+".dia",outDir,shortName,DIA_BITMAP);
@@ -1737,7 +1722,7 @@ DB_VIS_C
int i;
if ((i=baseName.findRev('/'))!=-1)
{
- baseName=baseName.right(baseName.length()-i-1);
+ baseName=baseName.right((int)baseName.length()-i-1);
}
if ((i=baseName.find('.'))!=-1)
{
@@ -1765,7 +1750,7 @@ DB_VIS_C
int i;
if ((i=shortName.findRev('/'))!=-1)
{
- shortName=shortName.right(shortName.length()-i-1);
+ shortName=shortName.right((int)shortName.length()-i-1);
}
QCString outDir = Config_getString(DOCBOOK_OUTPUT);
writeDotGraphFromFile(baseName+".dot",outDir,shortName,GOF_BITMAP);
@@ -1786,7 +1771,7 @@ DB_VIS_C
int i;
if ((i=baseName.findRev('/'))!=-1)
{
- baseName=baseName.right(baseName.length()-i-1);
+ baseName=baseName.right((int)baseName.length()-i-1);
}
if ((i=baseName.find('.'))!=-1)
{
diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h
index 47275f7..ee07df5 100644
--- a/src/docbookvisitor.h
+++ b/src/docbookvisitor.h
@@ -1,8 +1,6 @@
/******************************************************************************
*
-*
-*
-* Copyright (C) 1997-2015 by Dimitri van Heesch.
+* Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -18,6 +16,7 @@
#ifndef _DOCBOOKDOCVISITOR_H
#define _DOCBOOKDOCVISITOR_H
+#include "containers.h"
#include "docvisitor.h"
#include <qstack.h>
#include <qlist.h>
@@ -173,10 +172,12 @@ class DocbookDocVisitor : public DocVisitor
//--------------------------------------
FTextStream &m_t;
CodeOutputInterface &m_ci;
- bool m_insidePre;
- bool m_hide;
- QStack<bool> m_enabled;
+ bool m_insidePre = false;
+ bool m_hide = false;
+ BoolStack m_enabled;
QCString m_langExt;
+ int m_colCnt = 0;
+ BoolStack m_bodySet; // it is possible to have tables without a header, needs to be an array as we can have tables in tables
};
#endif
diff --git a/src/docgroup.cpp b/src/docgroup.cpp
index fbdb842..49fb9dc 100644
--- a/src/docgroup.cpp
+++ b/src/docgroup.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2019 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -13,12 +13,14 @@
*
*/
+#include <atomic>
#include "doxygen.h"
#include "util.h"
#include "entry.h"
#include "message.h"
#include "docgroup.h"
+static std::atomic_int g_groupId;
void DocGroup::enterFile(const char *fileName,int)
{
@@ -60,7 +62,7 @@ void DocGroup::enterCompound(const char *fileName,int line,const char *name)
m_memberGroupDocs.resize(0);
m_compoundName = name;
int i = m_compoundName.find('(');
- if (i!=-1)
+ if (i!=-1)
{
m_compoundName=m_compoundName.left(i); // strip category (Obj-C)
}
@@ -84,24 +86,21 @@ void DocGroup::leaveCompound(const char *,int,const char * /*name*/)
m_compoundName.resize(0);
}
-int DocGroup::findExistingGroup(int &groupId,const MemberGroupInfo *info)
+int DocGroup::findExistingGroup(const MemberGroupInfo *info)
{
//printf("findExistingGroup %s:%s\n",info->header.data(),info->compoundName.data());
- QIntDictIterator<MemberGroupInfo> di(Doxygen::memGrpInfoDict);
- MemberGroupInfo *mi;
- for (di.toFirst();(mi=di.current());++di)
+ for (const auto &kv : Doxygen::memberGroupInfoMap)
{
- if (m_compoundName==mi->compoundName && // same file or scope
- !mi->header.isEmpty() && // not a nameless group
- qstricmp(mi->header,info->header)==0 // same header name
+ if (m_compoundName==kv.second->compoundName && // same file or scope
+ !kv.second->header.isEmpty() && // not a nameless group
+ qstricmp(kv.second->header,info->header)==0 // same header name
)
{
//printf("Found it!\n");
- return (int)di.currentKey(); // put the item in this group
+ return kv.first; // put the item in this group
}
}
- groupId++; // start new group
- return groupId;
+ return ++g_groupId; // start new group
}
void DocGroup::open(Entry *e,const char *,int, bool implicit)
@@ -118,15 +117,16 @@ void DocGroup::open(Entry *e,const char *,int, bool implicit)
//printf(" membergroup id=%d %s\n",m_memberGroupId,m_memberGroupHeader.data());
if (m_memberGroupId==DOX_NOGROUP) // no group started yet
{
- static int curGroupId=0;
-
- MemberGroupInfo *info = new MemberGroupInfo;
+ auto info = std::make_unique<MemberGroupInfo>();
info->header = m_memberGroupHeader.stripWhiteSpace();
info->compoundName = m_compoundName;
- m_memberGroupId = findExistingGroup(curGroupId,info);
- //printf(" use membergroup %d\n",m_memberGroupId);
- Doxygen::memGrpInfoDict.insert(m_memberGroupId,info);
-
+ m_memberGroupId = findExistingGroup(info.get());
+ auto it = Doxygen::memberGroupInfoMap.find(m_memberGroupId);
+ if (it==Doxygen::memberGroupInfoMap.end())
+ {
+ //printf(" use membergroup %d\n",m_memberGroupId);
+ Doxygen::memberGroupInfoMap.insert(std::make_pair(m_memberGroupId,std::move(info)));
+ }
m_memberGroupRelates = e->relates;
e->mGrpId = m_memberGroupId;
}
@@ -150,9 +150,10 @@ void DocGroup::close(Entry *e,const char *fileName,int line,bool foundInline,boo
// e->name.data(),e->section,fileName,line,m_autoGroupStack.size());
if (m_memberGroupId!=DOX_NOGROUP) // end of member group
{
- MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(m_memberGroupId);
- if (info) // known group
+ auto it = Doxygen::memberGroupInfoMap.find(m_memberGroupId);
+ if (it!=Doxygen::memberGroupInfoMap.end()) // known group
{
+ auto &info = it->second;
info->doc = m_memberGroupDocs;
info->docFile = fileName;
info->docLine = line;
@@ -200,9 +201,10 @@ void DocGroup::addDocs(Entry *e)
m_memberGroupDocs+="\n\n";
}
m_memberGroupDocs+=e->doc;
- MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(m_memberGroupId);
- if (info)
+ auto it =Doxygen::memberGroupInfoMap.find(m_memberGroupId);
+ if (it!=Doxygen::memberGroupInfoMap.end())
{
+ auto &info = it->second;
info->doc = m_memberGroupDocs;
info->docFile = e->docFile;
info->docLine = e->docLine;
diff --git a/src/docgroup.h b/src/docgroup.h
index 3ccef0d..c724348 100644
--- a/src/docgroup.h
+++ b/src/docgroup.h
@@ -41,7 +41,7 @@ class DocGroup
void addDocs(Entry *e);
private:
- int findExistingGroup(int &groupId,const MemberGroupInfo *info);
+ int findExistingGroup(const MemberGroupInfo *info);
int m_openCount = 0;
QCString m_memberGroupHeader;
int m_memberGroupId = 0;
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 5498adb..33faf54 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -70,11 +70,11 @@
//#define DBG(x) myprintf x
#define INTERNAL_ASSERT(x) do {} while(0)
-//#define INTERNAL_ASSERT(x) if (!(x)) DBG(("INTERNAL_ASSERT(%s) failed retval=0x%x: file=%s line=%d\n",#x,retval,__FILE__,__LINE__));
+//#define INTERNAL_ASSERT(x) if (!(x)) DBG(("INTERNAL_ASSERT(%s) failed retval=0x%x: file=%s line=%d\n",#x,retval,__FILE__,__LINE__));
//---------------------------------------------------------------------------
-static const char *sectionLevelToName[] =
+static const char *sectionLevelToName[] =
{
"page",
"section",
@@ -106,18 +106,18 @@ static QDict<void> g_paramsFound;
static const MemberDef * g_memberDef;
static bool g_isExample;
static QCString g_exampleName;
-static SectionDict * g_sectionDict;
static QCString g_searchUrl;
static QCString g_includeFileName;
static QCString g_includeFileText;
static uint g_includeFileOffset;
static uint g_includeFileLength;
-static uint g_includeFileLine;
+static int g_includeFileLine;
static bool g_includeFileShowLineNo;
+static bool g_markdownSupport;
-/** Parser's context to store all global variables.
+/** Parser's context to store all global variables.
*/
struct DocParserContext
{
@@ -141,13 +141,12 @@ struct DocParserContext
QDict<void> paramsFound;
bool isExample;
QCString exampleName;
- SectionDict *sectionDict;
QCString searchUrl;
QCString includeFileText;
uint includeFileOffset;
uint includeFileLength;
- uint includeFileLine;
+ int includeFileLine;
bool includeFileLineNo;
TokenInfo *token;
@@ -177,7 +176,7 @@ static void docParserPushContext(bool saveParamInfo=TRUE)
ctx->initialStyleStack = g_initialStyleStack;
ctx->copyStack = g_copyStack;
ctx->fileName = g_fileName;
- ctx->lineNo = doctokenizerYYlineno;
+ ctx->lineNo = getDoctokinizerLineNr();
ctx->relPath = g_relPath;
if (saveParamInfo)
@@ -191,7 +190,6 @@ static void docParserPushContext(bool saveParamInfo=TRUE)
ctx->memberDef = g_memberDef;
ctx->isExample = g_isExample;
ctx->exampleName = g_exampleName;
- ctx->sectionDict = g_sectionDict;
ctx->searchUrl = g_searchUrl;
ctx->includeFileText = g_includeFileText;
@@ -199,7 +197,7 @@ static void docParserPushContext(bool saveParamInfo=TRUE)
ctx->includeFileLength = g_includeFileLength;
ctx->includeFileLine = g_includeFileLine;
ctx->includeFileLineNo = g_includeFileShowLineNo;
-
+
ctx->token = g_token;
g_token = new TokenInfo;
@@ -219,7 +217,7 @@ static void docParserPopContext(bool keepParamInfo=FALSE)
g_initialStyleStack = ctx->initialStyleStack;
g_copyStack = ctx->copyStack;
g_fileName = ctx->fileName;
- doctokenizerYYlineno = ctx->lineNo;
+ setDoctokinizerLineNr(ctx->lineNo);
g_relPath = ctx->relPath;
if (!keepParamInfo)
@@ -232,7 +230,6 @@ static void docParserPopContext(bool keepParamInfo=FALSE)
g_memberDef = ctx->memberDef;
g_isExample = ctx->isExample;
g_exampleName = ctx->exampleName;
- g_sectionDict = ctx->sectionDict;
g_searchUrl = ctx->searchUrl;
g_includeFileText = ctx->includeFileText;
@@ -285,7 +282,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool
{
QCString result;
bool ambig;
- FileDef *fd = findFileDef(Doxygen::imageNameDict,fileName,ambig);
+ FileDef *fd = findFileDef(Doxygen::imageNameLinkedMap,fileName,ambig);
//printf("Search for %s\n",fileName);
if (fd)
{
@@ -294,8 +291,8 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool
QCString text;
text.sprintf("image file name %s is ambiguous.\n",qPrint(fileName));
text+="Possible candidates:\n";
- text+=showFileDefMatches(Doxygen::imageNameDict,fileName);
- warn_doc_error(g_fileName,doctokenizerYYlineno,text);
+ text+=showFileDefMatches(Doxygen::imageNameLinkedMap,fileName);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"%s", text.data());
}
QCString inputFile = fd->absFilePath();
@@ -306,7 +303,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool
int i;
if ((i=result.findRev('/'))!=-1 || (i=result.findRev('\\'))!=-1)
{
- result = result.right(result.length()-i-1);
+ result = result.right((int)result.length()-i-1);
}
//printf("fileName=%s result=%s\n",fileName,result.data());
QCString outputDir;
@@ -334,7 +331,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool
if (outfi.isSymLink())
{
QFile::remove(outputFile);
- warn_doc_error(g_fileName,doctokenizerYYlineno,
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),
"destination of image %s is a symlink, replacing with image",
qPrint(outputFile));
}
@@ -352,23 +349,23 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),
"could not write output image %s",qPrint(outputFile));
}
}
//else
//{
- // warn(g_fileName,doctokenizerYYlineno,
+ // warn(g_fileName,getDoctokinizerLineNr(),
// "Prevented to copy file %s onto itself!\n",qPrint(inputFile));
//}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),
"could not open image %s",qPrint(fileName));
}
- if (type==DocImage::Latex && Config_getBool(USE_PDFLATEX) &&
+ if (type==DocImage::Latex && Config_getBool(USE_PDFLATEX) &&
fd->name().right(4)==".eps"
)
{ // we have an .eps image in pdflatex mode => convert it to a pdf.
@@ -392,8 +389,8 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool
result=fileName;
if (result.left(5)!="http:" && result.left(6)!="https:" && dowarn)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,
- "image file %s is not found in IMAGE_PATH: "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),
+ "image file %s is not found in IMAGE_PATH: "
"assuming external image.",qPrint(fileName)
);
}
@@ -408,7 +405,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool
* are disabled altogether).
*/
static void checkArgumentName(const QCString &name)
-{
+{
if (!Config_getBool(WARN_IF_DOC_ERROR)) return;
if (g_memberDef==0) return; // not a member
const ArgumentList &al=g_memberDef->isDocsForDefinition() ?
@@ -478,9 +475,10 @@ static void checkRetvalName(const QCString &name)
{
warn_doc_error(g_memberDef->getDefFileName(),
g_memberDef->getDefLine(),
- "return value '" + name + "' of " +
+ "%s",
+ ("return value '" + name + "' of " +
QCString(g_memberDef->qualifiedName()) +
- " has multiple documentation sections");
+ " has multiple documentation sections").data());
}
g_retvalsFound.insert(name,(void *)(0x8));
}
@@ -514,7 +512,7 @@ static void checkUnOrMultipleDocumentedParams()
{
// allow undocumented self / cls parameter for Python
}
- else if (!argName.isEmpty() && g_paramsFound.find(argName)==0 && a.docs.isEmpty())
+ else if (!argName.isEmpty() && g_paramsFound.find(argName)==0 && a.docs.isEmpty())
{
notArgCnt++;
}
@@ -531,10 +529,11 @@ static void checkUnOrMultipleDocumentedParams()
{
warn_doc_error(g_memberDef->getDefFileName(),
g_memberDef->getDefLine(),
- "argument '" + aName +
+ "%s",
+ ("argument '" + aName +
"' from the argument list of " +
QCString(g_memberDef->qualifiedName()) +
- " has multiple @param documentation sections");
+ " has multiple @param documentation sections").data());
}
}
if (notArgCnt>0)
@@ -544,7 +543,7 @@ static void checkUnOrMultipleDocumentedParams()
"The following parameter";
errMsg+= (notArgCnt>1 ? "s" : "");
errMsg+=" of "+
- QCString(g_memberDef->qualifiedName()) +
+ QCString(g_memberDef->qualifiedName()) +
QCString(argListToString(al)) +
(notArgCnt>1 ? " are" : " is") + " not documented:\n";
for (const Argument &a : al)
@@ -571,7 +570,8 @@ static void checkUnOrMultipleDocumentedParams()
}
warn_doc_error(g_memberDef->getDefFileName(),
g_memberDef->getDefLine(),
- substitute(errMsg,"%","%%"));
+ "%s",
+ substitute(errMsg,"%","%%").data());
}
}
}
@@ -588,7 +588,7 @@ static QCString stripKnownExtensions(const char *text)
result=result.left(result.length()-4);
}
else if (result.right(Doxygen::htmlFileExtension.length())==
- QCString(Doxygen::htmlFileExtension))
+ QCString(Doxygen::htmlFileExtension))
{
result=result.left(result.length()-Doxygen::htmlFileExtension.length());
}
@@ -629,7 +629,7 @@ static bool insideUL(DocNode *n)
{
while (n)
{
- if (n->kind()==DocNode::Kind_HtmlList &&
+ if (n->kind()==DocNode::Kind_HtmlList &&
((DocHtmlList *)n)->type()==DocHtmlList::Unordered) return TRUE;
n=n->parent();
}
@@ -643,7 +643,7 @@ static bool insideOL(DocNode *n)
{
while (n)
{
- if (n->kind()==DocNode::Kind_HtmlList &&
+ if (n->kind()==DocNode::Kind_HtmlList &&
((DocHtmlList *)n)->type()==DocHtmlList::Ordered) return TRUE;
n=n->parent();
}
@@ -663,7 +663,6 @@ static bool insideTable(DocNode *n)
}
//---------------------------------------------------------------------------
-
/*! Looks for a documentation block with name commandName in the current
* context (g_context). The resulting documentation string is
* put in pDoc, the definition in which the documentation was found is
@@ -680,14 +679,47 @@ static bool findDocsForMemberOrCompound(const char *commandName,
*pDoc="";
*pBrief="";
*pDef=0;
- QCString cmdArg=substitute(commandName,"#","::");
- cmdArg = replaceScopeSeparator(cmdArg);
+ QCString cmdArg=commandName;
+ if (cmdArg.isEmpty()) return FALSE;
+
+ const FileDef *fd=0;
+ const GroupDef *gd=0;
+ const PageDef *pd=0;
+ gd = Doxygen::groupLinkedMap->find(cmdArg);
+ if (gd) // group
+ {
+ *pDoc=gd->documentation();
+ *pBrief=gd->briefDescription();
+ *pDef=gd;
+ return TRUE;
+ }
+ pd = Doxygen::pageLinkedMap->find(cmdArg);
+ if (pd) // page
+ {
+ *pDoc=pd->documentation();
+ *pBrief=pd->briefDescription();
+ *pDef=pd;
+ return TRUE;
+ }
+ bool ambig;
+ fd = findFileDef(Doxygen::inputNameLinkedMap,cmdArg,ambig);
+ if (fd && !ambig) // file
+ {
+ *pDoc=fd->documentation();
+ *pBrief=fd->briefDescription();
+ *pDef=fd;
+ return TRUE;
+ }
+
+ // for symbols we need to normalize the separator, so A#B, or A\B, or A.B becomes A::B
+ cmdArg = substitute(cmdArg,"#","::");
+ cmdArg = substitute(cmdArg,"\\","::");
+ cmdArg = substitute(cmdArg,".","::");
- int l=cmdArg.length();
- if (l==0) return FALSE;
+ int l=(int)cmdArg.length();
int funcStart=cmdArg.find('(');
- if (funcStart==-1)
+ if (funcStart==-1)
{
funcStart=l;
}
@@ -697,9 +729,9 @@ static bool findDocsForMemberOrCompound(const char *commandName,
// beware of scenarios like operator()((foo)bar)
int secondParen = cmdArg.find('(', funcStart+1);
int leftParen = cmdArg.find(')', funcStart+1);
- if (leftParen!=-1 && secondParen!=-1)
+ if (leftParen!=-1 && secondParen!=-1)
{
- if (leftParen<secondParen)
+ if (leftParen<secondParen)
{
funcStart=secondParen;
}
@@ -711,10 +743,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
// try if the link is to a member
const MemberDef *md=0;
const ClassDef *cd=0;
- const FileDef *fd=0;
const NamespaceDef *nd=0;
- const GroupDef *gd=0;
- const PageDef *pd=0;
bool found = getDefs(
g_context.find('.')==-1?g_context.data():"", // find('.') is a hack to detect files
name,
@@ -730,7 +759,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
}
- int scopeOffset=g_context.length();
+ int scopeOffset=(int)g_context.length();
do // for each scope
{
QCString fullName=cmdArg;
@@ -741,15 +770,15 @@ static bool findDocsForMemberOrCompound(const char *commandName,
//printf("Trying fullName='%s'\n",fullName.data());
// try class, namespace, group, page, file reference
- cd = Doxygen::classSDict->find(fullName);
- if (cd) // class
+ cd = Doxygen::classLinkedMap->find(fullName);
+ if (cd) // class
{
*pDoc=cd->documentation();
*pBrief=cd->briefDescription();
*pDef=cd;
return TRUE;
}
- nd = Doxygen::namespaceSDict->find(fullName);
+ nd = Doxygen::namespaceLinkedMap->find(fullName);
if (nd) // namespace
{
*pDoc=nd->documentation();
@@ -757,32 +786,6 @@ static bool findDocsForMemberOrCompound(const char *commandName,
*pDef=nd;
return TRUE;
}
- gd = Doxygen::groupSDict->find(cmdArg);
- if (gd) // group
- {
- *pDoc=gd->documentation();
- *pBrief=gd->briefDescription();
- *pDef=gd;
- return TRUE;
- }
- pd = Doxygen::pageSDict->find(cmdArg);
- if (pd) // page
- {
- *pDoc=pd->documentation();
- *pBrief=pd->briefDescription();
- *pDef=pd;
- return TRUE;
- }
- bool ambig;
- fd = findFileDef(Doxygen::inputNameDict,cmdArg,ambig);
- if (fd && !ambig) // file
- {
- *pDoc=fd->documentation();
- *pBrief=fd->briefDescription();
- *pDef=fd;
- return TRUE;
- }
-
if (scopeOffset==0)
{
scopeOffset=-1;
@@ -794,9 +797,10 @@ static bool findDocsForMemberOrCompound(const char *commandName,
}
} while (scopeOffset>=0);
-
+
return FALSE;
}
+
//---------------------------------------------------------------------------
inline void errorHandleDefaultToken(DocNode *parent,int tok,
QList<DocNode> &children,const char *txt)
@@ -808,16 +812,16 @@ inline void errorHandleDefaultToken(DocNode *parent,int tok,
cmd_start = "@";
case TK_COMMAND_BS:
children.append(new DocWord(parent,TK_COMMAND_CHAR(tok) + g_token->name));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Illegal command %s as part of a %s",
qPrint(cmd_start + g_token->name),txt);
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found found as part of a %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unsupported symbol %s found found as part of a %s",
qPrint(g_token->name), txt);
break;
default:
children.append(new DocWord(parent,g_token->name));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s found as part of a %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected token %s found as part of a %s",
tokToString(tok), txt);
break;
}
@@ -825,7 +829,7 @@ inline void errorHandleDefaultToken(DocNode *parent,int tok,
//---------------------------------------------------------------------------
// forward declaration
-static bool defaultHandleToken(DocNode *parent,int tok,
+static bool defaultHandleToken(DocNode *parent,int tok,
QList<DocNode> &children,bool
handleWord=TRUE);
@@ -837,19 +841,19 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
return tok;
}
- while ((tok=doctokenizerYYlex()) &&
- tok!=TK_WHITESPACE &&
+ while ((tok=doctokenizerYYlex()) &&
+ tok!=TK_WHITESPACE &&
tok!=TK_NEWPARA &&
- tok!=TK_LISTITEM &&
+ tok!=TK_LISTITEM &&
tok!=TK_ENDLIST
)
{
static QRegExp specialChar("[.,|()\\[\\]:;\\?]");
- if (tok==TK_WORD && g_token->name.length()==1 &&
+ if (tok==TK_WORD && g_token->name.length()==1 &&
g_token->name.find(specialChar)!=-1)
{
// special character that ends the markup command
@@ -862,7 +866,7 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
case TK_HTMLTAG:
if (insideLI(parent) && Mappers::htmlTagMapper->map(g_token->name) && g_token->endTag)
{ // ignore </li> as the end of a style command
- continue;
+ continue;
}
return tok;
break;
@@ -875,7 +879,7 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
}
DBG(("handleStyleArgument(%s) end tok=%x\n",qPrint(saveCmdName),tok));
return (tok==TK_NEWPARA || tok==TK_LISTITEM || tok==TK_ENDLIST
- ) ? tok : RetVal_OK;
+ ) ? tok : RetVal_OK;
}
/*! Called when a style change starts. For instance a \<b\> command is
@@ -906,22 +910,22 @@ static void handleStyleLeave(DocNode *parent,QList<DocNode> &children,
{
if (g_styleStack.isEmpty())
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> tag without matching <%s>",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found </%s> tag without matching <%s>",
qPrint(tagName),qPrint(tagName));
}
else if (g_styleStack.top()->tagName()!=tagNameLower)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> tag while expecting </%s>",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found </%s> tag while expecting </%s>",
qPrint(tagName),qPrint(g_styleStack.top()->tagName()));
}
else if (g_styleStack.top()->style()!=s)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> tag while expecting </%s>",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found </%s> tag while expecting </%s>",
qPrint(tagName),qPrint(g_styleStack.top()->tagName()));
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> at different nesting level (%d) than expected (%d)",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found </%s> at different nesting level (%d) than expected (%d)",
qPrint(tagName),g_nodeStack.count(),g_styleStack.top()->position());
}
}
@@ -942,7 +946,7 @@ static void handlePendingStyleCommands(DocNode *parent,QList<DocNode> &children)
if (!g_styleStack.isEmpty())
{
DocStyleChange *sc = g_styleStack.top();
- while (sc && sc->position()>=g_nodeStack.count())
+ while (sc && sc->position()>=g_nodeStack.count())
{ // there are unclosed style modifiers in the paragraph
children.append(new DocStyleChange(parent,g_nodeStack.count(),sc->style(),sc->tagName(),FALSE));
g_initialStyleStack.push(sc);
@@ -965,7 +969,7 @@ static int handleAHref(DocNode *parent,QList<DocNode> &children,const HtmlAttrib
{
HtmlAttribListIterator li(tagHtmlAttribs);
HtmlAttrib *opt;
- int index=0;
+ uint index=0;
int retval = RetVal_OK;
for (li.toFirst();(opt=li.current());++li,++index)
{
@@ -984,7 +988,7 @@ static int handleAHref(DocNode *parent,QList<DocNode> &children,const HtmlAttrib
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found <a> tag with name option but without value!");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found <a> tag with name option but without value!");
}
}
else if (opt->name=="href") // <a href=url>..</a> tag
@@ -1038,7 +1042,7 @@ static void handleUnclosedStyleCommands()
DocStyleChange *sc = g_initialStyleStack.top();
g_initialStyleStack.pop();
handleUnclosedStyleCommands();
- warn_doc_error(g_fileName,doctokenizerYYlineno,
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),
"end of comment block while expecting "
"command </%s>",qPrint(sc->tagName()));
}
@@ -1058,12 +1062,12 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children,bool ignor
const Definition *compound=0;
const MemberDef *member=0;
- int len = g_token->name.length();
+ uint len = g_token->name.length();
ClassDef *cd=0;
bool ambig;
- FileDef *fd = findFileDef(Doxygen::inputNameDict,g_fileName,ambig);
+ FileDef *fd = findFileDef(Doxygen::inputNameLinkedMap,g_fileName,ambig);
//printf("handleLinkedWord(%s) g_context=%s\n",g_token->name.data(),g_context.data());
- if (!g_insideHtmlLink &&
+ if (!g_insideHtmlLink &&
(resolveRef(g_context,g_token->name,g_inSeeBlock,&compound,&member,TRUE,fd,TRUE)
|| (!g_context.isEmpty() && // also try with global scope
resolveRef("",g_token->name,g_inSeeBlock,&compound,&member,FALSE,0,TRUE))
@@ -1073,12 +1077,12 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children,bool ignor
//printf("resolveRef %s = %p (linkable?=%d)\n",qPrint(g_token->name),member,member ? member->isLinkable() : FALSE);
if (member && member->isLinkable()) // member link
{
- if (member->isObjCMethod())
+ if (member->isObjCMethod())
{
bool localLink = g_memberDef ? member->getClassDef()==g_memberDef->getClassDef() : FALSE;
name = member->objCMethodName(localLink,g_inSeeBlock);
}
- children.append(new
+ children.append(new
DocLinkedWord(parent,name,
member->getReference(),
member->getOutputFileBase(),
@@ -1096,9 +1100,9 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children,bool ignor
}
else if (compound->definitionType()==Definition::TypeGroup)
{
- name=(dynamic_cast<const GroupDef*>(compound))->groupTitle();
+ name=(toGroupDef(compound))->groupTitle();
}
- children.append(new
+ children.append(new
DocLinkedWord(parent,name,
compound->getReference(),
compound->getOutputFileBase(),
@@ -1108,10 +1112,10 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children,bool ignor
);
}
else if (compound->definitionType()==Definition::TypeFile &&
- (dynamic_cast<const FileDef*>(compound))->generateSourceFile()
+ (toFileDef(compound))->generateSourceFile()
) // undocumented file that has source code we can link to
{
- children.append(new
+ children.append(new
DocLinkedWord(parent,g_token->name,
compound->getReference(),
compound->getSourceFileBase(),
@@ -1127,7 +1131,7 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children,bool ignor
}
else if (!g_insideHtmlLink && len>1 && g_token->name.at(len-1)==':')
{
- // special case, where matching Foo: fails to be an Obj-C reference,
+ // special case, where matching Foo: fails to be an Obj-C reference,
// but Foo itself might be linkable.
g_token->name=g_token->name.left(len-1);
handleLinkedWord(parent,children,ignoreAutoLinkFlag);
@@ -1137,7 +1141,7 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children,bool ignor
{
// special case 2, where the token name is not a class, but could
// be a Obj-C protocol
- children.append(new
+ children.append(new
DocLinkedWord(parent,name,
cd->getReference(),
cd->getOutputFileBase(),
@@ -1149,7 +1153,7 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children,bool ignor
// {
// // special case 3, where the token name is not a class, but could
// // be a C# generic
-// children.append(new
+// children.append(new
// DocLinkedWord(parent,name,
// cd->getReference(),
// cd->getOutputFileBase(),
@@ -1161,7 +1165,7 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children,bool ignor
{
if (g_token->name.left(1)=="#" || g_token->name.left(2)=="::")
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"explicit link request to '%s' could not be resolved",qPrint(name));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"explicit link request to '%s' could not be resolved",qPrint(name));
children.append(new DocWord(parent,g_token->name));
}
else
@@ -1201,7 +1205,7 @@ static DocInternalRef *handleInternalRef(DocNode *parent)
QCString tokenName = g_token->name;
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(tokenName));
return 0;
}
@@ -1209,7 +1213,7 @@ static DocInternalRef *handleInternalRef(DocNode *parent)
tok=doctokenizerYYlex(); // get the reference id
if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(tokenName));
return 0;
}
@@ -1221,7 +1225,7 @@ static DocAnchor *handleAnchor(DocNode *parent)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(g_token->name));
return 0;
}
@@ -1229,13 +1233,13 @@ static DocAnchor *handleAnchor(DocNode *parent)
tok=doctokenizerYYlex();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment block while parsing the "
"argument of command %s",qPrint(g_token->name));
return 0;
}
else if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(g_token->name));
return 0;
}
@@ -1297,7 +1301,7 @@ static void defaultHandleTitleAndSize(const int cmd, DocNode *parent, QList<DocN
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option '%s' after \\%s command, expected 'width' or 'height'",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unknown option '%s' after \\%s command, expected 'width' or 'height'",
qPrint(g_token->name), Mappers::cmdMapper->find(cmd).data());
break;
}
@@ -1326,7 +1330,7 @@ static void defaultHandleTitleAndSize(const int cmd, DocNode *parent, QList<DocN
static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children,bool
handleWord)
{
- DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno));
+ DBG(("token %s at %d",tokToString(tok),getDoctokinizerLineNr()));
if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
tok==TK_COMMAND_AT || tok==TK_COMMAND_BS || tok==TK_HTMLTAG
)
@@ -1401,7 +1405,7 @@ reparsetoken:
children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Italic,tokenName,FALSE));
if (tok!=TK_WORD) children.append(new DocWhiteSpace(parent," "));
if (tok==TK_NEWPARA) goto handlepara;
- else if (tok==TK_WORD || tok==TK_HTMLTAG)
+ else if (tok==TK_WORD || tok==TK_HTMLTAG)
{
DBG(("CMD_EMPHASIS: reparsing command %s\n",qPrint(g_token->name)));
goto reparsetoken;
@@ -1415,7 +1419,7 @@ reparsetoken:
children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Bold,tokenName,FALSE));
if (tok!=TK_WORD) children.append(new DocWhiteSpace(parent," "));
if (tok==TK_NEWPARA) goto handlepara;
- else if (tok==TK_WORD || tok==TK_HTMLTAG)
+ else if (tok==TK_WORD || tok==TK_HTMLTAG)
{
DBG(("CMD_BOLD: reparsing command %s\n",qPrint(g_token->name)));
goto reparsetoken;
@@ -1429,7 +1433,7 @@ reparsetoken:
children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Code,tokenName,FALSE));
if (tok!=TK_WORD) children.append(new DocWhiteSpace(parent," "));
if (tok==TK_NEWPARA) goto handlepara;
- else if (tok==TK_WORD || tok==TK_HTMLTAG)
+ else if (tok==TK_WORD || tok==TK_HTMLTAG)
{
DBG(("CMD_CODE: reparsing command %s\n",qPrint(g_token->name)));
goto reparsetoken;
@@ -1441,7 +1445,7 @@ reparsetoken:
doctokenizerYYsetStateHtmlOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName,g_token->name=="block"));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
+ if (tok==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"htmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -1450,7 +1454,7 @@ reparsetoken:
doctokenizerYYsetStateManOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::ManOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"manonly section ended without end marker");
+ if (tok==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"manonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -1459,7 +1463,7 @@ reparsetoken:
doctokenizerYYsetStateRtfOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::RtfOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"rtfonly section ended without end marker");
+ if (tok==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"rtfonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -1468,7 +1472,7 @@ reparsetoken:
doctokenizerYYsetStateLatexOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::LatexOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"latexonly section ended without end marker",doctokenizerYYlineno);
+ if (tok==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"latexonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -1477,7 +1481,7 @@ reparsetoken:
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,"xmlonly section ended without end marker",doctokenizerYYlineno);
+ if (tok==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"xmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -1486,7 +1490,7 @@ reparsetoken:
doctokenizerYYsetStateDbOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::DocbookOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"docbookonly section ended without end marker",doctokenizerYYlineno);
+ if (tok==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"docbookonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -1539,10 +1543,10 @@ reparsetoken:
switch (Mappers::htmlTagMapper->map(tokenName))
{
case HTML_DIV:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found <div> tag in heading\n");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found <div> tag in heading\n");
break;
case HTML_PRE:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found <pre> tag in heading\n");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found <pre> tag in heading\n");
break;
case HTML_BOLD:
if (!g_token->endTag)
@@ -1563,6 +1567,7 @@ reparsetoken:
{
handleStyleLeave(parent,children,DocStyleChange::S,tokenName);
}
+ break;
case HTML_STRIKE:
if (!g_token->endTag)
{
@@ -1674,7 +1679,7 @@ reparsetoken:
}
}
break;
- case TK_SYMBOL:
+ case TK_SYMBOL:
{
DocSymbol::SymType s = DocSymbol::decodeSymbol(tokenName);
if (s!=DocSymbol::Sym_Unknown)
@@ -1687,15 +1692,15 @@ reparsetoken:
}
}
break;
- case TK_WHITESPACE:
- case TK_NEWPARA:
+ case TK_WHITESPACE:
+ case TK_NEWPARA:
handlepara:
if (insidePRE(parent) || !children.isEmpty())
{
children.append(new DocWhiteSpace(parent,g_token->chars));
}
break;
- case TK_LNKWORD:
+ case TK_LNKWORD:
if (handleWord)
{
handleLinkedWord(parent,children);
@@ -1703,7 +1708,7 @@ handlepara:
else
return FALSE;
break;
- case TK_WORD:
+ case TK_WORD:
if (handleWord)
{
children.append(new DocWord(parent,g_token->name));
@@ -1734,7 +1739,7 @@ static void handleImg(DocNode *parent,QList<DocNode> &children,const HtmlAttribL
HtmlAttribListIterator li(tagHtmlAttribs);
HtmlAttrib *opt;
bool found=FALSE;
- int index=0;
+ uint index=0;
for (li.toFirst();(opt=li.current());++li,++index)
{
//printf("option name=%s value=%s\n",opt->name.data(),opt->value.data());
@@ -1753,7 +1758,7 @@ static void handleImg(DocNode *parent,QList<DocNode> &children,const HtmlAttribL
}
if (!found)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"IMG tag does not have a SRC attribute!\n");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"IMG tag does not have a SRC attribute!\n");
}
}
@@ -1772,7 +1777,7 @@ DocEmoji::DocEmoji(DocNode *parent,const QCString &symName) :
{
m_parent = parent;
QCString locSymName = symName;
- int len=locSymName.length();
+ uint len=locSymName.length();
if (len>0)
{
if (locSymName.at(len-1)!=':') locSymName.append(":");
@@ -1782,7 +1787,7 @@ DocEmoji::DocEmoji(DocNode *parent,const QCString &symName) :
m_index = EmojiEntityMapper::instance()->symbol2index(m_symName);
if (m_index==-1)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Found unsupported emoji symbol '%s'\n",qPrint(m_symName));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Found unsupported emoji symbol '%s'\n",qPrint(m_symName));
}
}
@@ -1795,7 +1800,7 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
if (doc.isEmpty()) return retval;
- doctokenizerYYinit(doc,g_fileName);
+ doctokenizerYYinit(doc,g_fileName,g_markdownSupport);
// first parse any number of paragraphs
bool isFirst=TRUE;
@@ -1810,7 +1815,7 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
DocPara *par = new DocPara(parent);
if (isFirst) { par->markFirst(); isFirst=FALSE; }
retval=par->parse();
- if (!par->isEmpty())
+ if (!par->isEmpty())
{
children.append(par);
if (lastPar) lastPar->markLast(FALSE);
@@ -1842,47 +1847,45 @@ static void readTextFileByName(const QCString &file,QCString &text)
return;
}
}
- QStrList &examplePathList = Config_getList(EXAMPLE_PATH);
- char *s=examplePathList.first();
- while (s)
+ const StringVector &examplePathList = Config_getList(EXAMPLE_PATH);
+ for (const auto &s : examplePathList)
{
- QCString absFileName = QCString(s)+Portable::pathSeparator()+file;
+ QCString absFileName = QCString(s.c_str())+Portable::pathSeparator()+file;
QFileInfo fi(absFileName);
if (fi.exists())
{
text = fileToString(absFileName,Config_getBool(FILTER_SOURCE_FILES));
return;
}
- s=examplePathList.next();
}
// as a fallback we also look in the exampleNameDict
bool ambig;
- FileDef *fd = findFileDef(Doxygen::exampleNameDict,file,ambig);
+ FileDef *fd = findFileDef(Doxygen::exampleNameLinkedMap,file,ambig);
if (fd)
{
text = fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES));
if (ambig)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"included file name %s is ambiguous"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"included file name %s is ambiguous"
"Possible candidates:\n%s",qPrint(file),
- qPrint(showFileDefMatches(Doxygen::exampleNameDict,file))
+ qPrint(showFileDefMatches(Doxygen::exampleNameLinkedMap,file))
);
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"included file %s is not found. "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"included file %s is not found. "
"Check your EXAMPLE_PATH",qPrint(file));
}
}
//---------------------------------------------------------------------------
-DocWord::DocWord(DocNode *parent,const QCString &word) :
- m_word(word)
+DocWord::DocWord(DocNode *parent,const QCString &word) :
+ m_word(word)
{
- m_parent = parent;
+ m_parent = parent;
//printf("new word %s url=%s\n",word.data(),g_searchUrl.data());
if (Doxygen::searchIndex && !g_searchUrl.isEmpty())
{
@@ -1894,12 +1897,12 @@ DocWord::DocWord(DocNode *parent,const QCString &word) :
DocLinkedWord::DocLinkedWord(DocNode *parent,const QCString &word,
const QCString &ref,const QCString &file,
- const QCString &anchor,const QCString &tooltip) :
- m_word(word), m_ref(ref),
+ const QCString &anchor,const QCString &tooltip) :
+ m_word(word), m_ref(ref),
m_file(file), m_relPath(g_relPath), m_anchor(anchor),
m_tooltip(tooltip)
{
- m_parent = parent;
+ m_parent = parent;
//printf("DocLinkedWord: new word %s url=%s tooltip='%s'\n",
// word.data(),g_searchUrl.data(),tooltip.data());
if (Doxygen::searchIndex && !g_searchUrl.isEmpty())
@@ -1912,24 +1915,26 @@ DocLinkedWord::DocLinkedWord(DocNode *parent,const QCString &word,
DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
{
- m_parent = parent;
+ m_parent = parent;
if (id.isEmpty())
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Empty anchor label");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Empty anchor label");
return;
}
- if (id.left(CiteConsts::anchorPrefix.length()) == CiteConsts::anchorPrefix)
+ const CitationManager &ct = CitationManager::instance();
+ QCString anchorPrefix = ct.anchorPrefix();
+ if (id.left(anchorPrefix.length()) == anchorPrefix)
{
- CiteInfo *cite = Doxygen::citeDict->find(id.mid(CiteConsts::anchorPrefix.length()));
- if (cite)
+ const CiteInfo *cite = ct.find(id.mid(anchorPrefix.length()));
+ if (cite)
{
- m_file = convertNameToFile(CiteConsts::fileName,FALSE,TRUE);
+ m_file = convertNameToFile(ct.fileName(),FALSE,TRUE);
m_anchor = id;
}
- else
+ else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid cite anchor id '%s'",qPrint(id));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid cite anchor id '%s'",qPrint(id));
m_anchor = "invalid";
m_file = "invalid";
}
@@ -1940,21 +1945,16 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
}
else // found \anchor label
{
- SectionInfo *sec = Doxygen::sectionDict->find(id);
+ const SectionInfo *sec = SectionManager::instance().find(id);
if (sec)
{
//printf("Found anchor %s\n",id.data());
- m_file = sec->fileName;
- m_anchor = sec->label;
- if (g_sectionDict && g_sectionDict->find(id)==0)
- {
- //printf("Inserting in dictionary!\n");
- g_sectionDict->append(id,sec);
- }
+ m_file = sec->fileName();
+ m_anchor = sec->label();
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid anchor id '%s'",qPrint(id));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid anchor id '%s'",qPrint(id));
m_anchor = "invalid";
m_file = "invalid";
}
@@ -1997,12 +1997,14 @@ void DocInclude::parse()
g_includeFileShowLineNo = (m_type == DontIncWithLines || m_type == IncWithLines);
//printf("g_includeFile=<<%s>>\n",g_includeFileText.data());
break;
- case VerbInclude:
+ case VerbInclude:
// fall through
case HtmlInclude:
- readTextFileByName(m_file,m_text);
- break;
case LatexInclude:
+ case DocInclude::RtfInclude:
+ case DocInclude::ManInclude:
+ case DocInclude::XmlInclude:
+ case DocInclude::DocbookInclude:
readTextFileByName(m_file,m_text);
break;
case Snippet:
@@ -2013,12 +2015,12 @@ void DocInclude::parse()
int count;
if (!m_blockId.isEmpty() && (count=m_text.contains(m_blockId.data()))!=2)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"block marked with %s for \\snippet should appear twice in file %s, found it %d times\n",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"block marked with %s for \\snippet should appear twice in file %s, found it %d times\n",
m_blockId.data(),m_file.data(),count);
}
break;
- case DocInclude::SnippetDoc:
- case DocInclude::IncludeDoc:
+ case DocInclude::SnippetDoc:
+ case DocInclude::IncludeDoc:
err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
"Please create a bug report\n",__FILE__);
break;
@@ -2031,7 +2033,7 @@ void DocIncOperator::parse()
{
if (g_includeFileName.isEmpty())
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),
"No previous '\\include' or '\\dontinclude' command for '\\%s' present",
typeAsString());
}
@@ -2040,7 +2042,7 @@ void DocIncOperator::parse()
const char *p = g_includeFileText;
uint l = g_includeFileLength;
uint o = g_includeFileOffset;
- uint il = g_includeFileLine;
+ int il = g_includeFileLine;
DBG(("DocIncOperator::parse() text=%s off=%d len=%d\n",qPrint(p),o,l));
uint so = o,bo;
bool nonEmpty = FALSE;
@@ -2050,7 +2052,7 @@ void DocIncOperator::parse()
while (o<l)
{
char c = p[o];
- if (c=='\n')
+ if (c=='\n')
{
g_includeFileLine++;
if (nonEmpty) break; // we have a pattern to match
@@ -2167,26 +2169,18 @@ void DocIncOperator::parse()
//---------------------------------------------------------------------------
-DocXRefItem::DocXRefItem(DocNode *parent,int id,const char *key) :
+DocXRefItem::DocXRefItem(DocNode *parent,int id,const char *key) :
m_id(id), m_key(key), m_relPath(g_relPath)
{
- m_parent = parent;
+ m_parent = parent;
}
bool DocXRefItem::parse()
{
- RefList *refList = Doxygen::xrefLists->find(m_key);
- if (refList &&
- (
- // either not a built-in list or the list is enabled
- (m_key!="todo" || Config_getBool(GENERATE_TODOLIST)) &&
- (m_key!="test" || Config_getBool(GENERATE_TESTLIST)) &&
- (m_key!="bug" || Config_getBool(GENERATE_BUGLIST)) &&
- (m_key!="deprecated" || Config_getBool(GENERATE_DEPRECATEDLIST))
- )
- )
+ RefList *refList = RefListManager::instance().find(m_key);
+ if (refList && refList->isEnabled())
{
- RefItem *item = refList->getRefItem(m_id);
+ RefItem *item = refList->find(m_id);
ASSERT(item!=0);
if (item)
{
@@ -2198,16 +2192,16 @@ bool DocXRefItem::parse()
else
{
m_file = refList->fileName();
- m_anchor = item->listAnchor;
+ m_anchor = item->anchor();
}
m_title = refList->sectionTitle();
//printf("DocXRefItem: file=%s anchor=%s title=%s\n",
// m_file.data(),m_anchor.data(),m_title.data());
- if (!item->text.isEmpty())
+ if (!item->text().isEmpty())
{
docParserPushContext();
- internalValidatingParseDoc(this,m_children,item->text);
+ internalValidatingParseDoc(this,m_children,item->text());
docParserPopContext();
}
}
@@ -2221,19 +2215,17 @@ bool DocXRefItem::parse()
DocFormula::DocFormula(DocNode *parent,int id) :
m_relPath(g_relPath)
{
- m_parent = parent;
- QCString formCmd;
- formCmd.sprintf("\\_form#%d",id);
- Formula *formula=Doxygen::formulaNameDict->find(formCmd);
- if (formula)
+ m_parent = parent;
+ QCString text = FormulaManager::instance().findFormula(id);
+ if (!text.isEmpty())
{
- m_id = formula->getId();
+ m_id = id;
m_name.sprintf("form_%d",m_id);
- m_text = formula->getFormulaText();
+ m_text = text;
}
else // wrong \_form#<n> command
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Wrong formula id %d",id);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Wrong formula id %d",id);
m_id = -1;
}
}
@@ -2284,30 +2276,26 @@ void DocSecRefItem::parse()
doctokenizerYYsetStatePara();
handlePendingStyleCommands(this,m_children);
- SectionInfo *sec=0;
+ const SectionInfo *sec=0;
if (!m_target.isEmpty())
{
- sec=Doxygen::sectionDict->find(m_target);
+ sec = SectionManager::instance().find(m_target);
if (sec)
{
- m_file = sec->fileName;
- m_anchor = sec->label;
- if (g_sectionDict && g_sectionDict->find(m_target)==0)
- {
- g_sectionDict->append(m_target,sec);
- }
+ m_file = sec->fileName();
+ m_anchor = sec->label();
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"reference to unknown section %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"reference to unknown section %s",
qPrint(m_target));
}
- }
+ }
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"reference to empty target");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"reference to empty target");
}
-
+
DBG(("DocSecRefItem::parse() end\n"));
DocNode *n = g_nodeStack.pop();
ASSERT(n==this);
@@ -2333,16 +2321,16 @@ void DocSecRefList::parse()
{
case CMD_SECREFITEM:
{
- int tok=doctokenizerYYlex();
+ tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\refitem command");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\refitem command");
break;
}
tok=doctokenizerYYlex();
if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of \\refitem",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of \\refitem",
tokToString(tok));
break;
}
@@ -2355,7 +2343,7 @@ void DocSecRefList::parse()
case CMD_ENDSECREFLIST:
goto endsecreflist;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\secreflist",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Illegal command %s as part of a \\secreflist",
qPrint(cmd_start + g_token->name));
goto endsecreflist;
}
@@ -2366,7 +2354,7 @@ void DocSecRefList::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s inside section reference list",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected token %s inside section reference list",
tokToString(tok));
goto endsecreflist;
}
@@ -2381,14 +2369,14 @@ endsecreflist:
//---------------------------------------------------------------------------
-DocInternalRef::DocInternalRef(DocNode *parent,const QCString &ref)
+DocInternalRef::DocInternalRef(DocNode *parent,const QCString &ref)
: m_relPath(g_relPath)
{
- m_parent = parent;
+ m_parent = parent;
int i=ref.find('#');
if (i!=-1)
{
- m_anchor = ref.right(ref.length()-i-1);
+ m_anchor = ref.right((int)ref.length()-i-1);
m_file = ref.left(i);
}
else
@@ -2419,38 +2407,38 @@ void DocInternalRef::parse()
//---------------------------------------------------------------------------
-DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
+DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
m_refType(Unknown), m_isSubPage(FALSE)
{
- m_parent = parent;
+ m_parent = parent;
const Definition *compound = 0;
QCString anchor;
//printf("DocRef::DocRef(target=%s,context=%s)\n",target.data(),context.data());
ASSERT(!target.isEmpty());
SrcLangExt lang = getLanguageFromFileName(target);
m_relPath = g_relPath;
- SectionInfo *sec = Doxygen::sectionDict->find(target);
+ const SectionInfo *sec = SectionManager::instance().find(target);
if (sec==0 && lang==SrcLangExt_Markdown) // lookup as markdown file
{
- sec = Doxygen::sectionDict->find(markdownFileNameToId(target));
+ sec = SectionManager::instance().find(markdownFileNameToId(target));
}
if (sec) // ref to section or anchor
{
PageDef *pd = 0;
- if (sec->type==SectionInfo::Page)
+ if (sec->type()==SectionType::Page)
{
- pd = Doxygen::pageSDict->find(target);
+ pd = Doxygen::pageLinkedMap->find(target);
}
- m_text = sec->title;
- if (m_text.isEmpty()) m_text = sec->label;
+ m_text = sec->title();
+ if (m_text.isEmpty()) m_text = sec->label();
- m_ref = sec->ref;
- m_file = stripKnownExtensions(sec->fileName);
- if (sec->type==SectionInfo::Anchor)
+ m_ref = sec->ref();
+ m_file = stripKnownExtensions(sec->fileName());
+ if (sec->type()==SectionType::Anchor)
{
m_refType = Anchor;
}
- else if (sec->type==SectionInfo::Table)
+ else if (sec->type()==SectionType::Table)
{
m_refType = Table;
}
@@ -2459,16 +2447,16 @@ DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
m_refType = Section;
}
m_isSubPage = pd && pd->hasParentPage();
- if (sec->type!=SectionInfo::Page || m_isSubPage) m_anchor = sec->label;
- //printf("m_text=%s,m_ref=%s,m_file=%s,m_refToAnchor=%d type=%d\n",
- // m_text.data(),m_ref.data(),m_file.data(),m_refToAnchor,sec->type);
+ if (sec->type()!=SectionType::Page || m_isSubPage) m_anchor = sec->label();
+ //printf("m_text=%s,m_ref=%s,m_file=%s,type=%d\n",
+ // m_text.data(),m_ref.data(),m_file.data(),m_refType);
return;
}
else if (resolveLink(context,target,TRUE,&compound,anchor))
{
- bool isFile = compound ?
+ bool isFile = compound ?
(compound->definitionType()==Definition::TypeFile ||
- compound->definitionType()==Definition::TypePage ? TRUE : FALSE) :
+ compound->definitionType()==Definition::TypePage ? TRUE : FALSE) :
FALSE;
m_text = linkToText(compound?compound->getLanguage():SrcLangExt_Unknown,target,isFile);
m_anchor = anchor;
@@ -2476,16 +2464,16 @@ DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
{
if (anchor.isEmpty() && /* compound link */
compound->definitionType()==Definition::TypeGroup && /* is group */
- (dynamic_cast<const GroupDef *>(compound))->groupTitle() /* with title */
+ (toGroupDef(compound))->groupTitle() /* with title */
)
{
- m_text=(dynamic_cast<const GroupDef *>(compound))->groupTitle(); // use group's title as link
+ m_text=(toGroupDef(compound))->groupTitle(); // use group's title as link
}
else if (compound->definitionType()==Definition::TypeMember &&
- (dynamic_cast<const MemberDef*>(compound))->isObjCMethod())
+ (toMemberDef(compound))->isObjCMethod())
{
// Objective C Method
- const MemberDef *member = dynamic_cast<const MemberDef*>(compound);
+ const MemberDef *member = toMemberDef(compound);
bool localLink = g_memberDef ? member->getClassDef()==g_memberDef->getClassDef() : FALSE;
m_text = member->objCMethodName(localLink,g_inSeeBlock);
}
@@ -2497,7 +2485,7 @@ DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
return;
}
else if (compound && compound->definitionType()==Definition::TypeFile &&
- (dynamic_cast<const FileDef*>(compound))->generateSourceFile()
+ (toFileDef(compound))->generateSourceFile()
) // undocumented file that has source code we can link to
{
m_file = compound->getSourceFileBase();
@@ -2506,8 +2494,8 @@ DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
}
}
m_text = target;
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve reference to '%s' for \\ref command",
- qPrint(target));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unable to resolve reference to '%s' for \\ref command",
+ qPrint(target));
}
static void flattenParagraphs(DocNode *root,QList<DocNode> &children)
@@ -2571,7 +2559,7 @@ void DocRef::parse()
}
handlePendingStyleCommands(this,m_children);
-
+
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
}
@@ -2580,19 +2568,20 @@ void DocRef::parse()
DocCite::DocCite(DocNode *parent,const QCString &target,const QCString &) //context)
{
- static uint numBibFiles = Config_getList(CITE_BIB_FILES).count();
+ size_t numBibFiles = Config_getList(CITE_BIB_FILES).size();
m_parent = parent;
//printf("DocCite::DocCite(target=%s)\n",target.data());
ASSERT(!target.isEmpty());
m_relPath = g_relPath;
- CiteInfo *cite = Doxygen::citeDict->find(target);
+ const CitationManager &ct = CitationManager::instance();
+ const CiteInfo *cite = ct.find(target);
//printf("cite=%p text='%s' numBibFiles=%d\n",cite,cite?cite->text.data():"<null>",numBibFiles);
- if (numBibFiles>0 && cite && !cite->text.isEmpty()) // ref to citation
+ if (numBibFiles>0 && cite && !cite->text().isEmpty()) // ref to citation
{
- m_text = cite->text;
- m_ref = cite->ref;
- m_anchor = CiteConsts::anchorPrefix+cite->label;
- m_file = convertNameToFile(CiteConsts::fileName,FALSE,TRUE);
+ m_text = cite->text();
+ m_ref = "";
+ m_anchor = ct.anchorPrefix()+cite->label();
+ m_file = convertNameToFile(ct.fileName(),FALSE,TRUE);
//printf("CITE ==> m_text=%s,m_ref=%s,m_file=%s,m_anchor=%s\n",
// m_text.data(),m_ref.data(),m_file.data(),m_anchor.data());
return;
@@ -2600,23 +2589,23 @@ DocCite::DocCite(DocNode *parent,const QCString &target,const QCString &) //cont
m_text = target;
if (numBibFiles==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"\\cite command found but no bib files specified via CITE_BIB_FILES!");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"\\cite command found but no bib files specified via CITE_BIB_FILES!");
}
else if (cite==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve reference to '%s' for \\cite command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unable to resolve reference to '%s' for \\cite command",
qPrint(target));
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"\\cite command to '%s' does not have an associated number",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"\\cite command to '%s' does not have an associated number",
qPrint(target));
}
}
//---------------------------------------------------------------------------
-DocLink::DocLink(DocNode *parent,const QCString &target)
+DocLink::DocLink(DocNode *parent,const QCString &target)
{
m_parent = parent;
const Definition *compound = 0;
@@ -2637,7 +2626,7 @@ DocLink::DocLink(DocNode *parent,const QCString &target)
m_ref = compound->getReference();
}
else if (compound && compound->definitionType()==Definition::TypeFile &&
- (dynamic_cast<const FileDef*>(compound))->generateSourceFile()
+ (toFileDef(compound))->generateSourceFile()
) // undocumented file that has source code we can link to
{
m_file = compound->getSourceFileBase();
@@ -2647,8 +2636,8 @@ DocLink::DocLink(DocNode *parent,const QCString &target)
}
// bogus link target
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve link to '%s' for \\link command",
- qPrint(target));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unable to resolve link to '%s' for \\link command",
+ qPrint(target));
}
@@ -2675,28 +2664,28 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
case CMD_ENDLINK:
if (isJavaLink)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"{@link.. ended with @endlink command");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"{@link.. ended with @endlink command");
}
goto endlink;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\link",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Illegal command %s as part of a \\link",
qPrint(cmd_start + g_token->name));
break;
}
break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found as part of a \\link",
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unsupported symbol %s found as part of a \\link",
qPrint(g_token->name));
break;
case TK_HTMLTAG:
if (g_token->name!="see" || !isXmlLink)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected xml/html command %s found as part of a \\link",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected xml/html command %s found as part of a \\link",
qPrint(g_token->name));
}
goto endlink;
- case TK_LNKWORD:
- case TK_WORD:
+ case TK_LNKWORD:
+ case TK_WORD:
if (isJavaLink) // special case to detect closing }
{
QCString w = g_token->name;
@@ -2711,7 +2700,7 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
m_children.append(new DocWord(this,w.left(p)));
if ((uint)p<l-1) // something left after the } (for instance a .)
{
- result=w.right(l-p-1);
+ result=w.right((int)l-p-1);
}
goto endlink;
}
@@ -2719,7 +2708,7 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
m_children.append(new DocWord(this,g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected token %s",
tokToString(tok));
break;
}
@@ -2727,8 +2716,8 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
- " link command\n");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected end of comment while inside"
+ " link command\n");
}
endlink:
@@ -2747,10 +2736,10 @@ endlink:
//---------------------------------------------------------------------------
-DocDotFile::DocDotFile(DocNode *parent,const QCString &name,const QCString &context) :
+DocDotFile::DocDotFile(DocNode *parent,const QCString &name,const QCString &context) :
m_name(name), m_relPath(g_relPath), m_context(context)
{
- m_parent = parent;
+ m_parent = parent;
}
bool DocDotFile::parse()
@@ -2759,10 +2748,10 @@ bool DocDotFile::parse()
defaultHandleTitleAndSize(CMD_DOTFILE,this,m_children,m_width,m_height);
bool ambig;
- FileDef *fd = findFileDef(Doxygen::dotFileNameDict,m_name,ambig);
+ FileDef *fd = findFileDef(Doxygen::dotFileNameLinkedMap,m_name,ambig);
if (fd==0 && m_name.right(4)!=".dot") // try with .dot extension as well
{
- fd = findFileDef(Doxygen::dotFileNameDict,m_name+".dot",ambig);
+ fd = findFileDef(Doxygen::dotFileNameLinkedMap,m_name+".dot",ambig);
}
if (fd)
{
@@ -2770,24 +2759,24 @@ bool DocDotFile::parse()
ok = true;
if (ambig)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"included dot file name %s is ambiguous.\n"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"included dot file name %s is ambiguous.\n"
"Possible candidates:\n%s",qPrint(m_name),
- qPrint(showFileDefMatches(Doxygen::dotFileNameDict,m_name))
+ qPrint(showFileDefMatches(Doxygen::dotFileNameLinkedMap,m_name))
);
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"included dot file %s is not found "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"included dot file %s is not found "
"in any of the paths specified via DOTFILE_DIRS!",qPrint(m_name));
}
return ok;
}
-DocMscFile::DocMscFile(DocNode *parent,const QCString &name,const QCString &context) :
+DocMscFile::DocMscFile(DocNode *parent,const QCString &name,const QCString &context) :
m_name(name), m_relPath(g_relPath), m_context(context)
{
- m_parent = parent;
+ m_parent = parent;
}
bool DocMscFile::parse()
@@ -2796,10 +2785,10 @@ bool DocMscFile::parse()
defaultHandleTitleAndSize(CMD_MSCFILE,this,m_children,m_width,m_height);
bool ambig;
- FileDef *fd = findFileDef(Doxygen::mscFileNameDict,m_name,ambig);
+ FileDef *fd = findFileDef(Doxygen::mscFileNameLinkedMap,m_name,ambig);
if (fd==0 && m_name.right(4)!=".msc") // try with .msc extension as well
{
- fd = findFileDef(Doxygen::mscFileNameDict,m_name+".msc",ambig);
+ fd = findFileDef(Doxygen::mscFileNameLinkedMap,m_name+".msc",ambig);
}
if (fd)
{
@@ -2807,15 +2796,15 @@ bool DocMscFile::parse()
ok = true;
if (ambig)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"included msc file name %s is ambiguous.\n"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"included msc file name %s is ambiguous.\n"
"Possible candidates:\n%s",qPrint(m_name),
- qPrint(showFileDefMatches(Doxygen::mscFileNameDict,m_name))
+ qPrint(showFileDefMatches(Doxygen::mscFileNameLinkedMap,m_name))
);
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"included msc file %s is not found "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"included msc file %s is not found "
"in any of the paths specified via MSCFILE_DIRS!",qPrint(m_name));
}
return ok;
@@ -2835,10 +2824,10 @@ bool DocDiaFile::parse()
defaultHandleTitleAndSize(CMD_DIAFILE,this,m_children,m_width,m_height);
bool ambig;
- FileDef *fd = findFileDef(Doxygen::diaFileNameDict,m_name,ambig);
+ FileDef *fd = findFileDef(Doxygen::diaFileNameLinkedMap,m_name,ambig);
if (fd==0 && m_name.right(4)!=".dia") // try with .dia extension as well
{
- fd = findFileDef(Doxygen::diaFileNameDict,m_name+".dia",ambig);
+ fd = findFileDef(Doxygen::diaFileNameLinkedMap,m_name+".dia",ambig);
}
if (fd)
{
@@ -2846,15 +2835,15 @@ bool DocDiaFile::parse()
ok = true;
if (ambig)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"included dia file name %s is ambiguous.\n"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"included dia file name %s is ambiguous.\n"
"Possible candidates:\n%s",qPrint(m_name),
- qPrint(showFileDefMatches(Doxygen::diaFileNameDict,m_name))
+ qPrint(showFileDefMatches(Doxygen::diaFileNameLinkedMap,m_name))
);
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"included dia file %s is not found "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"included dia file %s is not found "
"in any of the paths specified via DIAFILE_DIRS!",qPrint(m_name));
}
return ok;
@@ -2907,7 +2896,7 @@ DocImage::DocImage(DocNode *parent,const HtmlAttribList &attribs,const QCString
bool DocImage::isSVG() const
{
QCString locName = m_url.isEmpty() ? m_name : m_url;
- int len = locName.length();
+ int len = (int)locName.length();
int fnd = locName.find('?'); // ignore part from ? until end
if (fnd==-1) fnd=len;
return fnd>=4 && locName.mid(fnd-4,4)==".svg";
@@ -2941,8 +2930,8 @@ int DocHtmlHeader::parse()
{
if (m_level!=1)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h1>",
- m_level);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"<h%d> ended with </h1>",
+ m_level);
}
goto endheader;
}
@@ -2950,8 +2939,8 @@ int DocHtmlHeader::parse()
{
if (m_level!=2)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h2>",
- m_level);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"<h%d> ended with </h2>",
+ m_level);
}
goto endheader;
}
@@ -2959,8 +2948,8 @@ int DocHtmlHeader::parse()
{
if (m_level!=3)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h3>",
- m_level);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"<h%d> ended with </h3>",
+ m_level);
}
goto endheader;
}
@@ -2968,8 +2957,8 @@ int DocHtmlHeader::parse()
{
if (m_level!=4)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h4>",
- m_level);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"<h%d> ended with </h4>",
+ m_level);
}
goto endheader;
}
@@ -2977,8 +2966,8 @@ int DocHtmlHeader::parse()
{
if (m_level!=5)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h5>",
- m_level);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"<h%d> ended with </h5>",
+ m_level);
}
goto endheader;
}
@@ -2986,8 +2975,8 @@ int DocHtmlHeader::parse()
{
if (m_level!=6)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h6>",
- m_level);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"<h%d> ended with </h6>",
+ m_level);
}
goto endheader;
}
@@ -3005,7 +2994,7 @@ int DocHtmlHeader::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <h%d> context",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected html tag <%s%s> found within <h%d> context",
g_token->endTag?"/":"",qPrint(g_token->name),m_level);
}
}
@@ -3019,8 +3008,8 @@ int DocHtmlHeader::parse()
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
- " <h%d> tag\n",m_level);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected end of comment while inside"
+ " <h%d> tag\n",m_level);
}
endheader:
handlePendingStyleCommands(this,m_children);
@@ -3054,8 +3043,8 @@ int DocHRef::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <a href=...> context",
- g_token->endTag?"/":"",qPrint(g_token->name),doctokenizerYYlineno);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected html tag <%s%s> found within <a href=...> context",
+ g_token->endTag?"/":"",qPrint(g_token->name));
}
}
break;
@@ -3067,8 +3056,8 @@ int DocHRef::parse()
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
- " <a href=...> tag",doctokenizerYYlineno);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected end of comment while inside"
+ " <a href=...> tag");
}
endhref:
handlePendingStyleCommands(this,m_children);
@@ -3094,7 +3083,7 @@ int DocInternal::parse(int level)
DocPara *par = new DocPara(this);
if (isFirst) { par->markFirst(); isFirst=FALSE; }
retval=par->parse();
- if (!par->isEmpty())
+ if (!par->isEmpty())
{
m_children.append(par);
lastPar=par;
@@ -3105,9 +3094,9 @@ int DocInternal::parse(int level)
}
if (retval==TK_LISTITEM)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid list item found",doctokenizerYYlineno);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid list item found");
}
- } while (retval!=0 &&
+ } while (retval!=0 &&
retval!=RetVal_Section &&
retval!=RetVal_Subsection &&
retval!=RetVal_Subsubsection &&
@@ -3117,7 +3106,7 @@ int DocInternal::parse(int level)
if (lastPar) lastPar->markLast();
// then parse any number of level-n sections
- while ((level==1 && retval==RetVal_Section) ||
+ while ((level==1 && retval==RetVal_Section) ||
(level==2 && retval==RetVal_Subsection) ||
(level==3 && retval==RetVal_Subsubsection) ||
(level==4 && retval==RetVal_Paragraph)
@@ -3131,7 +3120,7 @@ int DocInternal::parse(int level)
if (retval==RetVal_Internal)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"\\internal command found inside internal section");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"\\internal command found inside internal section");
}
DBG(("DocInternal::parse() end: retval=%x\n",retval));
@@ -3150,7 +3139,7 @@ int DocIndexEntry::parse()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\addindex command");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\addindex command");
goto endindexentry;
}
doctokenizerYYsetStateTitle();
@@ -3162,8 +3151,8 @@ int DocIndexEntry::parse()
case TK_WHITESPACE:
m_entry+=" ";
break;
- case TK_WORD:
- case TK_LNKWORD:
+ case TK_WORD:
+ case TK_LNKWORD:
m_entry+=g_token->name;
break;
case TK_SYMBOL:
@@ -3188,7 +3177,7 @@ int DocIndexEntry::parse()
case DocSymbol::Sym_ndash: m_entry+="--"; break;
case DocSymbol::Sym_mdash: m_entry+="---"; break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected symbol found as argument of \\addindex");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected symbol found as argument of \\addindex");
break;
}
}
@@ -3215,13 +3204,13 @@ int DocIndexEntry::parse()
case CMD_MINUS: m_entry+='-'; break;
case CMD_EQUAL: m_entry+='='; break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command %s found as argument of \\addindex",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected command %s found as argument of \\addindex",
qPrint(g_token->name));
break;
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected token %s",
tokToString(tok));
break;
}
@@ -3246,22 +3235,17 @@ DocHtmlCaption::DocHtmlCaption(DocNode *parent,const HtmlAttribList &attribs)
{
if (opt->name=="id" && !opt->value.isEmpty()) // interpret id attribute as an anchor
{
- SectionInfo *sec = Doxygen::sectionDict->find(opt->value);
+ const SectionInfo *sec = SectionManager::instance().find(opt->value);
if (sec)
{
//printf("Found anchor %s\n",id.data());
- m_file = sec->fileName;
- m_anchor = sec->label;
+ m_file = sec->fileName();
+ m_anchor = sec->label();
m_hasCaptionId = TRUE;
- if (g_sectionDict && g_sectionDict->find(opt->value)==0)
- {
- //printf("Inserting in dictionary!\n");
- g_sectionDict->append(opt->value,sec);
- }
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid caption id '%s'",qPrint(opt->value));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid caption id '%s'",qPrint(opt->value));
}
}
else // copy attribute
@@ -3294,7 +3278,7 @@ int DocHtmlCaption::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <caption> context",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected html tag <%s%s> found within <caption> context",
g_token->endTag?"/":"",qPrint(g_token->name));
}
}
@@ -3307,8 +3291,8 @@ int DocHtmlCaption::parse()
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
- " <caption> tag",doctokenizerYYlineno);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected end of comment while inside"
+ " <caption> tag");
}
endcaption:
handlePendingStyleCommands(this,m_children);
@@ -3394,32 +3378,32 @@ int DocHtmlCell::parseXml()
return retval;
}
-int DocHtmlCell::rowSpan() const
+uint DocHtmlCell::rowSpan() const
{
- int retval = 0;
+ uint retval = 0;
HtmlAttribList attrs = attribs();
uint i;
- for (i=0; i<attrs.count(); ++i)
+ for (i=0; i<attrs.count(); ++i)
{
if (attrs.at(i)->name.lower()=="rowspan")
{
- retval = attrs.at(i)->value.toInt();
+ retval = attrs.at(i)->value.toUInt();
break;
}
}
return retval;
}
-int DocHtmlCell::colSpan() const
+uint DocHtmlCell::colSpan() const
{
- int retval = 1;
+ uint retval = 1;
HtmlAttribList attrs = attribs();
uint i;
- for (i=0; i<attrs.count(); ++i)
+ for (i=0; i<attrs.count(); ++i)
{
if (attrs.at(i)->name.lower()=="colspan")
{
- retval = QMAX(1,attrs.at(i)->value.toInt());
+ retval = QMAX(1,attrs.at(i)->value.toUInt());
break;
}
}
@@ -3494,7 +3478,7 @@ int DocHtmlRow::parse()
}
else // found some other tag
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <td> or <th> tag but "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <td> or <th> tag but "
"found <%s> instead!",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto endrow;
@@ -3502,13 +3486,13 @@ int DocHtmlRow::parse()
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment while looking"
" for a html description title");
goto endrow;
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <td> or <th> tag but found %s token instead!",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <td> or <th> tag but found %s token instead!",
tokToString(tok));
goto endrow;
}
@@ -3558,7 +3542,7 @@ int DocHtmlRow::parseXml(bool isHeading)
}
else // found some other tag
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <term> or <description> tag but "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <term> or <description> tag but "
"found <%s> instead!",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto endrow;
@@ -3566,13 +3550,13 @@ int DocHtmlRow::parseXml(bool isHeading)
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment while looking"
" for a html description title");
goto endrow;
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <td> or <th> tag but found %s token instead!",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <td> or <th> tag but found %s token instead!",
tokToString(tok));
goto endrow;
}
@@ -3602,7 +3586,7 @@ int DocHtmlTable::parse()
int retval=RetVal_OK;
g_nodeStack.push(this);
DBG(("DocHtmlTable::parse() start\n"));
-
+
getrow:
// get next token
int tok=doctokenizerYYlex();
@@ -3621,7 +3605,7 @@ getrow:
{
if (m_caption)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"table already has a caption, found another one");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"table already has a caption, found another one");
}
else
{
@@ -3636,28 +3620,28 @@ getrow:
}
else // found wrong token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <tr> or <caption> tag but "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <tr> or <caption> tag but "
"found <%s%s> instead!", g_token->endTag ? "/" : "", qPrint(g_token->name));
}
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment while looking"
" for a <tr> or <caption> tag");
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <tr> tag but found %s token instead!",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <tr> tag but found %s token instead!",
tokToString(tok));
}
-
+
// parse one or more rows
while (retval==RetVal_TableRow)
{
DocHtmlRow *tr=new DocHtmlRow(this,g_token->attribs);
m_children.append(tr);
retval=tr->parse();
- }
+ }
computeTableGrid();
@@ -3672,7 +3656,7 @@ int DocHtmlTable::parseXml()
int retval=RetVal_OK;
g_nodeStack.push(this);
DBG(("DocHtmlTable::parseXml() start\n"));
-
+
// get next token
int tok=doctokenizerYYlex();
// skip whitespace
@@ -3701,7 +3685,7 @@ int DocHtmlTable::parseXml()
m_children.append(tr);
retval=tr->parseXml(isHeader);
isHeader=FALSE;
- }
+ }
computeTableGrid();
@@ -3715,9 +3699,9 @@ int DocHtmlTable::parseXml()
/** Helper class to compute the grid for an HTML style table */
struct ActiveRowSpan
{
- ActiveRowSpan(int rows,int col) : rowsLeft(rows), column(col) {}
- int rowsLeft;
- int column;
+ ActiveRowSpan(uint rows,uint col) : rowsLeft(rows), column(col) {}
+ uint rowsLeft;
+ uint column;
};
/** List of ActiveRowSpan classes. */
@@ -3732,14 +3716,14 @@ void DocHtmlTable::computeTableGrid()
//printf("computeTableGrid()\n");
RowSpanList rowSpans;
rowSpans.setAutoDelete(TRUE);
- int maxCols=0;
- int rowIdx=1;
+ uint maxCols=0;
+ uint rowIdx=1;
QListIterator<DocNode> li(children());
DocNode *rowNode;
for (li.toFirst();(rowNode=li.current());++li)
{
- int colIdx=1;
- int cells=0;
+ uint colIdx=1;
+ uint cells=0;
if (rowNode->kind()==DocNode::Kind_HtmlRow)
{
uint i;
@@ -3751,13 +3735,13 @@ void DocHtmlTable::computeTableGrid()
if (cellNode->kind()==DocNode::Kind_HtmlCell)
{
DocHtmlCell *cell = (DocHtmlCell*)cellNode;
- int rs = cell->rowSpan();
- int cs = cell->colSpan();
+ uint rs = cell->rowSpan();
+ uint cs = cell->colSpan();
for (i=0;i<rowSpans.count();i++)
{
- if (rowSpans.at(i)->rowsLeft>0 &&
- rowSpans.at(i)->column==colIdx)
+ if (rowSpans.at(i)->rowsLeft>0 &&
+ rowSpans.at(i)->column==colIdx)
{
colIdx=rowSpans.at(i)->column+1;
cells++;
@@ -3767,7 +3751,7 @@ void DocHtmlTable::computeTableGrid()
//printf("found cell at (%d,%d)\n",rowIdx,colIdx);
cell->setRowIndex(rowIdx);
cell->setColumnIndex(colIdx);
- colIdx+=cs;
+ colIdx+=cs;
cells++;
}
}
@@ -3784,9 +3768,9 @@ void DocHtmlTable::computeTableGrid()
m_numCols = maxCols;
}
-void DocHtmlTable::accept(DocVisitor *v)
-{
- v->visitPre(this);
+void DocHtmlTable::accept(DocVisitor *v)
+{
+ v->visitPre(this);
// for HTML output we put the caption first
//if (m_caption && v->id()==DocVisitor_Html) m_caption->accept(v);
// doxygen 1.8.11: always put the caption first
@@ -3796,7 +3780,7 @@ void DocHtmlTable::accept(DocVisitor *v)
for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
// for other output formats we put the caption last
//if (m_caption && v->id()!=DocVisitor_Html) m_caption->accept(v);
- v->visitPost(this);
+ v->visitPost(this);
}
//---------------------------------------------------------------------------
@@ -3826,10 +3810,10 @@ int DocHtmlDescTitle::parse()
{
case CMD_REF:
{
- int tok=doctokenizerYYlex();
+ tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(g_token->name));
}
else
@@ -3838,7 +3822,7 @@ int DocHtmlDescTitle::parse()
tok=doctokenizerYYlex(); // get the reference id
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of \\%s command",
tokToString(tok),qPrint(cmdName));
}
else
@@ -3856,10 +3840,10 @@ int DocHtmlDescTitle::parse()
// fall through
case CMD_LINK:
{
- int tok=doctokenizerYYlex();
+ tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(cmdName));
}
else
@@ -3868,7 +3852,7 @@ int DocHtmlDescTitle::parse()
tok=doctokenizerYYlex();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of \\%s command",
tokToString(tok),qPrint(cmdName));
}
else
@@ -3887,13 +3871,13 @@ int DocHtmlDescTitle::parse()
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s found as part of a <dt> tag",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Illegal command %s found as part of a <dt> tag",
qPrint(cmd_start + g_token->name));
}
}
break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol \\%s found as part of a <dt> tag",
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unsupported symbol \\%s found as part of a <dt> tag",
qPrint(g_token->name));
break;
case TK_HTMLTAG:
@@ -3928,13 +3912,13 @@ int DocHtmlDescTitle::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <dt> context",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected html tag <%s%s> found within <dt> context",
g_token->endTag?"/":"",qPrint(g_token->name));
}
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s found as part of a <dt> tag",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected token %s found as part of a <dt> tag",
tokToString(tok));
break;
}
@@ -3942,8 +3926,8 @@ int DocHtmlDescTitle::parse()
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
- " <dt> tag");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected end of comment while inside"
+ " <dt> tag");
}
endtitle:
handlePendingStyleCommands(this,m_children);
@@ -3973,7 +3957,7 @@ int DocHtmlDescData::parse()
}
while (retval==TK_NEWPARA);
if (par) par->markLast();
-
+
DBG(("DocHtmlDescData::parse() end\n"));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
@@ -4002,7 +3986,7 @@ int DocHtmlDescList::parse()
}
else // found some other tag
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <dt> tag but "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <dt> tag but "
"found <%s> instead!",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto enddesclist;
@@ -4010,13 +3994,13 @@ int DocHtmlDescList::parse()
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment while looking"
" for a html description title");
goto enddesclist;
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <dt> tag but found %s token instead!",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <dt> tag but found %s token instead!",
tokToString(tok));
goto enddesclist;
}
@@ -4041,7 +4025,7 @@ int DocHtmlDescList::parse()
if (retval==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while inside <dl> block");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment while inside <dl> block");
}
enddesclist:
@@ -4141,7 +4125,7 @@ int DocHtmlList::parse()
{
// add dummy item to obtain valid HTML
m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"empty list!");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"empty list!");
retval = RetVal_EndList;
goto endlist;
}
@@ -4149,7 +4133,7 @@ int DocHtmlList::parse()
{
// add dummy item to obtain valid HTML
m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <li> tag but "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <li> tag but "
"found <%s%s> instead!",g_token->endTag?"/":"",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto endlist;
@@ -4159,7 +4143,7 @@ int DocHtmlList::parse()
{
// add dummy item to obtain valid HTML
m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment while looking"
" for a html list item");
goto endlist;
}
@@ -4167,7 +4151,7 @@ int DocHtmlList::parse()
{
// add dummy item to obtain valid HTML
m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <li> tag but found %s token instead!",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <li> tag but found %s token instead!",
tokToString(tok));
goto endlist;
}
@@ -4178,10 +4162,10 @@ int DocHtmlList::parse()
m_children.append(li);
retval=li->parse();
} while (retval==RetVal_ListItem);
-
+
if (retval==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while inside <%cl> block",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment while inside <%cl> block",
m_type==Unordered ? 'u' : 'o');
}
@@ -4214,7 +4198,7 @@ int DocHtmlList::parseXml()
}
else // found some other tag
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <item> tag but "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <item> tag but "
"found <%s> instead!",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto endlist;
@@ -4222,13 +4206,13 @@ int DocHtmlList::parseXml()
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment while looking"
" for a html list item");
goto endlist;
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <item> tag but found %s token instead!",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected <item> tag but found %s token instead!",
tokToString(tok));
goto endlist;
}
@@ -4241,10 +4225,10 @@ int DocHtmlList::parseXml()
if (retval==0) break;
//printf("retval=%x g_token->name=%s\n",retval,qPrint(g_token->name));
} while (retval==RetVal_ListItem);
-
+
if (retval==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while inside <list type=\"%s\"> block",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment while inside <list type=\"%s\"> block",
m_type==Unordered ? "bullet" : "number");
}
@@ -4252,8 +4236,8 @@ endlist:
DBG(("DocHtmlList::parseXml() end retval=%x\n",retval));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
- return retval==RetVal_EndList ||
- (retval==RetVal_CloseXml || g_token->name=="list") ?
+ return retval==RetVal_EndList ||
+ (retval==RetVal_CloseXml || g_token->name=="list") ?
RetVal_OK : retval;
}
@@ -4265,7 +4249,7 @@ int DocHtmlBlockQuote::parse()
int retval=0;
g_nodeStack.push(this);
- // parse one or more paragraphs
+ // parse one or more paragraphs
bool isFirst=TRUE;
DocPara *par=0;
do
@@ -4292,7 +4276,7 @@ int DocParBlock::parse()
int retval=0;
g_nodeStack.push(this);
- // parse one or more paragraphs
+ // parse one or more paragraphs
bool isFirst=TRUE;
DocPara *par=0;
do
@@ -4343,17 +4327,17 @@ int DocSimpleList::parse()
//--------------------------------------------------------------------------
-DocAutoListItem::DocAutoListItem(DocNode *parent,int indent,int num)
+DocAutoListItem::DocAutoListItem(DocNode *parent,int indent,int num)
: m_indent(indent), m_itemNum(num)
-{
- m_parent = parent;
+{
+ m_parent = parent;
}
int DocAutoListItem::parse()
{
int retval = RetVal_OK;
g_nodeStack.push(this);
-
+
// first parse any number of paragraphs
bool isFirst=TRUE;
DocPara *lastPar=0;
@@ -4362,7 +4346,7 @@ int DocAutoListItem::parse()
DocPara *par = new DocPara(this);
if (isFirst) { par->markFirst(); isFirst=FALSE; }
retval=par->parse();
- if (!par->isEmpty())
+ if (!par->isEmpty())
{
m_children.append(par);
if (lastPar) lastPar->markLast(FALSE);
@@ -4386,11 +4370,11 @@ int DocAutoListItem::parse()
//--------------------------------------------------------------------------
DocAutoList::DocAutoList(DocNode *parent,int indent,bool isEnumList,
- int depth) :
+ int depth) :
m_indent(indent), m_isEnumList(isEnumList),
m_depth(depth)
-{
- m_parent = parent;
+{
+ m_parent = parent;
}
int DocAutoList::parse()
@@ -4410,11 +4394,11 @@ int DocAutoList::parse()
m_children.append(li);
retval=li->parse();
//printf("DocAutoList::parse(): retval=0x%x g_token->indent=%d m_indent=%d "
- // "m_isEnumList=%d g_token->isEnumList=%d g_token->name=%s\n",
+ // "m_isEnumList=%d g_token->isEnumList=%d g_token->name=%s\n",
// retval,g_token->indent,m_indent,m_isEnumList,g_token->isEnumList,
// g_token->name.data());
//printf("num=%d g_token->id=%d\n",num,g_token->id);
- }
+ }
while (retval==TK_LISTITEM && // new list item
m_indent==g_token->indent && // at same indent level
m_isEnumList==g_token->isEnumList && // of the same kind
@@ -4456,16 +4440,16 @@ void DocTitle::parseFromString(const QCString &text)
//--------------------------------------------------------------------------
-DocSimpleSect::DocSimpleSect(DocNode *parent,Type t) :
+DocSimpleSect::DocSimpleSect(DocNode *parent,Type t) :
m_type(t)
-{
- m_parent = parent;
- m_title=0;
+{
+ m_parent = parent;
+ m_title=0;
}
DocSimpleSect::~DocSimpleSect()
-{
- delete m_title;
+{
+ delete m_title;
}
void DocSimpleSect::accept(DocVisitor *v)
@@ -4489,10 +4473,10 @@ int DocSimpleSect::parse(bool userTitle,bool needsSeparator)
m_title = new DocTitle(this);
m_title->parse();
}
-
+
// add new paragraph as child
DocPara *par = new DocPara(this);
- if (m_children.isEmpty())
+ if (m_children.isEmpty())
{
par->markFirst();
}
@@ -4504,7 +4488,7 @@ int DocSimpleSect::parse(bool userTitle,bool needsSeparator)
par->markLast();
if (needsSeparator) m_children.append(new DocSimpleSectSep(this));
m_children.append(par);
-
+
// parse the contents of the paragraph
int retval = par->parse();
@@ -4530,7 +4514,7 @@ int DocSimpleSect::parseRcs()
DBG(("DocSimpleSect::parseRcs()\n"));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
- return RetVal_OK;
+ return RetVal_OK;
}
int DocSimpleSect::parseXml()
@@ -4539,11 +4523,11 @@ int DocSimpleSect::parseXml()
g_nodeStack.push(this);
int retval = RetVal_OK;
- for (;;)
+ for (;;)
{
// add new paragraph as child
DocPara *par = new DocPara(this);
- if (m_children.isEmpty())
+ if (m_children.isEmpty())
{
par->markFirst();
}
@@ -4558,17 +4542,17 @@ int DocSimpleSect::parseXml()
// parse the contents of the paragraph
retval = par->parse();
if (retval == 0) break;
- if (retval == RetVal_CloseXml)
+ if (retval == RetVal_CloseXml)
{
retval = RetVal_OK;
break;
}
}
-
+
DBG(("DocSimpleSect::parseXml() end retval=%d\n",retval));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
- return retval;
+ return retval;
}
void DocSimpleSect::appendLinkWord(const QCString &word)
@@ -4582,12 +4566,12 @@ void DocSimpleSect::appendLinkWord(const QCString &word)
else
{
p = (DocPara *)m_children.getLast();
-
+
// Comma-separate <seealso> links.
p->injectToken(TK_WORD,",");
p->injectToken(TK_WHITESPACE," ");
}
-
+
g_inSeeBlock=TRUE;
p->injectToken(TK_LNKWORD,word);
g_inSeeBlock=FALSE;
@@ -4632,7 +4616,7 @@ int DocParamList::parse(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
retval=0;
goto endparamlist;
@@ -4670,14 +4654,14 @@ int DocParamList::parse(const QCString &cmdName)
doctokenizerYYsetStatePara();
if (tok==0) /* premature end of comment block */
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment block while parsing the "
"argument of command %s",qPrint(saveCmdName));
retval=0;
goto endparamlist;
}
if (tok!=TK_WHITESPACE) /* premature end of comment block */
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token in comment block while parsing the "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token in comment block while parsing the "
"argument of command %s",qPrint(saveCmdName));
retval=0;
goto endparamlist;
@@ -4713,7 +4697,7 @@ int DocParamList::parseXml(const QCString &paramName)
g_hasReturnCommand=TRUE;
checkRetvalName(g_token->name);
}
-
+
handleLinkedWord(this,m_params);
do
@@ -4742,15 +4726,15 @@ int DocParamList::parseXml(const QCString &paramName)
if (retval == 0) break;
- } while (retval==RetVal_CloseXml &&
+ } while (retval==RetVal_CloseXml &&
Mappers::htmlTagMapper->map(g_token->name)!=XML_PARAM &&
Mappers::htmlTagMapper->map(g_token->name)!=XML_TYPEPARAM &&
Mappers::htmlTagMapper->map(g_token->name)!=XML_EXCEPTION);
-
+
if (retval==0) /* premature end of comment block */
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unterminated param or exception tag");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unterminated param or exception tag");
}
else
{
@@ -4802,7 +4786,7 @@ int DocParamSect::parse(const QCString &cmdName,bool xmlContext, Direction d)
{
retval = RetVal_OK;
}
-
+
DBG(("DocParamSect::parse() end retval=%d\n",retval));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
@@ -4869,7 +4853,7 @@ void DocPara::handleCite()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint("cite"));
return;
}
@@ -4877,13 +4861,13 @@ void DocPara::handleCite()
tok=doctokenizerYYlex();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment block while parsing the "
"argument of command %s\n", qPrint("cite"));
return;
}
else if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint("cite"));
return;
}
@@ -4901,7 +4885,7 @@ void DocPara::handleEmoji()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint("emoji"));
return;
}
@@ -4909,13 +4893,13 @@ void DocPara::handleEmoji()
tok=doctokenizerYYlex();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment block while parsing the "
"argument of command %s\n", qPrint("emoji"));
return;
}
else if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint("emoji"));
return;
}
@@ -4937,7 +4921,7 @@ int DocPara::handleXRefItem()
{
m_children.append(ref);
}
- else
+ else
{
delete ref;
}
@@ -4953,7 +4937,7 @@ void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
return;
}
@@ -4962,13 +4946,13 @@ void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type
doctokenizerYYsetStatePara();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment block while parsing the "
"argument of command %s", qPrint(saveCmdName));
return;
}
else if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(saveCmdName));
return;
}
@@ -5017,7 +5001,7 @@ void DocPara::handleImage(const QCString &cmdName)
{
if (g_token->name.lower() != "inline")
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"currently only 'inline' supported as option of %s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"currently only 'inline' supported as option of %s command",
qPrint(saveCmdName));
}
else
@@ -5028,14 +5012,14 @@ void DocPara::handleImage(const QCString &cmdName)
}
if (!((tok==TK_WORD) && (g_token->name == "}")))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected closing '}' at option of %s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected closing '}' at option of %s command",
qPrint(saveCmdName));
return;
}
tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command with option",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command with option",
qPrint(saveCmdName));
return;
}
@@ -5043,7 +5027,7 @@ void DocPara::handleImage(const QCString &cmdName)
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
return;
}
@@ -5051,14 +5035,14 @@ void DocPara::handleImage(const QCString &cmdName)
tok=doctokenizerYYlex();
if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(saveCmdName));
return;
}
tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
return;
}
@@ -5070,7 +5054,7 @@ void DocPara::handleImage(const QCString &cmdName)
else if (imgType=="rtf") t=DocImage::Rtf;
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"output format %s specified as the first argument of "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"output format %s specified as the first argument of "
"%s command is not valid",
qPrint(imgType),qPrint(saveCmdName));
return;
@@ -5080,7 +5064,7 @@ void DocPara::handleImage(const QCString &cmdName)
doctokenizerYYsetStatePara();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(saveCmdName));
return;
}
@@ -5097,7 +5081,7 @@ void DocPara::handleFile(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
return;
}
@@ -5106,7 +5090,7 @@ void DocPara::handleFile(const QCString &cmdName)
doctokenizerYYsetStatePara();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(saveCmdName));
return;
}
@@ -5135,7 +5119,7 @@ void DocPara::handleLink(const QCString &cmdName,bool isJavaLink)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
return;
}
@@ -5143,7 +5127,7 @@ void DocPara::handleLink(const QCString &cmdName,bool isJavaLink)
tok=doctokenizerYYlex();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"%s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"%s as the argument of %s",
tokToString(tok),qPrint(saveCmdName));
return;
}
@@ -5164,7 +5148,7 @@ void DocPara::handleRef(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
return;
}
@@ -5173,7 +5157,7 @@ void DocPara::handleRef(const QCString &cmdName)
DocRef *ref=0;
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(saveCmdName));
goto endref;
}
@@ -5228,7 +5212,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
}
else if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
return;
}
@@ -5237,13 +5221,13 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
doctokenizerYYsetStatePara();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment block while parsing the "
"argument of command %s",qPrint(saveCmdName));
return;
}
else if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(saveCmdName));
return;
}
@@ -5257,7 +5241,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
doctokenizerYYsetStatePara();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected block identifier, but found token %s instead while parsing the %s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected block identifier, but found token %s instead while parsing the %s command",
tokToString(tok),qPrint(saveCmdName));
return;
}
@@ -5278,7 +5262,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
}
docParserPushContext();
g_fileName = fileName;
- doctokenizerYYlineno=inc_line;
+ setDoctokinizerLineNr(inc_line);
internalValidatingParseDoc(this,m_children,inc_text);
docParserPopContext();
}
@@ -5297,20 +5281,20 @@ void DocPara::handleSection(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\%s command",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"expected whitespace after \\%s command",
qPrint(saveCmdName));
return;
}
tok=doctokenizerYYlex();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected end of comment block while parsing the "
"argument of command %s\n", qPrint(saveCmdName));
return;
}
else if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(saveCmdName));
return;
}
@@ -5331,7 +5315,7 @@ int DocPara::handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level)
// For XML tags whose content is stored in attributes rather than
// contained within the element, we need a way to inject the attribute
// text into the current paragraph.
-bool DocPara::injectToken(int tok,const QCString &tokText)
+bool DocPara::injectToken(int tok,const QCString &tokText)
{
g_token->name = tokText;
return defaultHandleToken(this,tok,m_children);
@@ -5357,7 +5341,7 @@ int DocPara::handleStartCode()
i++;
}
m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,FALSE,lang));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"code section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"code section ended without end marker");
doctokenizerYYsetStatePara();
return retval;
}
@@ -5400,23 +5384,23 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
{
case CMD_UNKNOWN:
m_children.append(new DocWord(this,TK_COMMAND_CHAR(tok) + cmdName));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Found unknown command '\\%s'",qPrint(cmdName));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Found unknown command '%c%s'",TK_COMMAND_CHAR(tok),qPrint(cmdName));
break;
case CMD_EMPHASIS:
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,cmdName,TRUE));
- retval=handleStyleArgument(this,m_children,cmdName);
+ retval=handleStyleArgument(this,m_children,cmdName);
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,cmdName,FALSE));
if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
break;
case CMD_BOLD:
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,cmdName,TRUE));
- retval=handleStyleArgument(this,m_children,cmdName);
+ retval=handleStyleArgument(this,m_children,cmdName);
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,cmdName,FALSE));
if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
break;
case CMD_CODE:
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Code,cmdName,TRUE));
- retval=handleStyleArgument(this,m_children,cmdName);
+ retval=handleStyleArgument(this,m_children,cmdName);
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Code,cmdName,FALSE));
if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
break;
@@ -5567,7 +5551,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
doctokenizerYYsetStateHtmlOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName,g_token->name=="block"));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"htmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5576,7 +5560,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
doctokenizerYYsetStateManOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::ManOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"manonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"manonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5585,7 +5569,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
doctokenizerYYsetStateRtfOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::RtfOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"rtfonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"rtfonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5594,7 +5578,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
doctokenizerYYsetStateLatexOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::LatexOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"latexonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"latexonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5603,7 +5587,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
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,"xmlonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"xmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5612,7 +5596,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
doctokenizerYYsetStateDbOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::DocbookOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"docbookonly section ended without end marker",doctokenizerYYlineno);
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"docbookonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5621,7 +5605,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
doctokenizerYYsetStateVerbatim();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Verbatim,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"verbatim section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"verbatim section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5637,7 +5621,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
dv->setWidth(width);
dv->setHeight(height);
m_children.append(dv);
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"dot section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"dot section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5653,7 +5637,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
dv->setWidth(width);
dv->setHeight(height);
m_children.append(dv);
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"msc section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"msc section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5675,14 +5659,14 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
dv->setHeight(height);
if (jarPath.isEmpty())
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"ignoring \\startuml command because PLANTUML_JAR_PATH is not set");
delete dv;
}
else
{
m_children.append(dv);
}
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"startuml section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,getDoctokinizerLineNr(),"startuml section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5701,8 +5685,8 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
case CMD_ENDDOT:
case CMD_ENDMSC:
case CMD_ENDUML:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
- break;
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected command %s",qPrint(g_token->name));
+ break;
case CMD_PARAM:
retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,g_token->paramDir);
break;
@@ -5776,6 +5760,18 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
case CMD_LATEXINCLUDE:
handleInclude(cmdName,DocInclude::LatexInclude);
break;
+ case CMD_RTFINCLUDE:
+ handleInclude(cmdName,DocInclude::RtfInclude);
+ break;
+ case CMD_MANINCLUDE:
+ handleInclude(cmdName,DocInclude::ManInclude);
+ break;
+ case CMD_XMLINCLUDE:
+ handleInclude(cmdName,DocInclude::XmlInclude);
+ break;
+ case CMD_DOCBOOKINCLUDE:
+ handleInclude(cmdName,DocInclude::DocbookInclude);
+ break;
case CMD_VERBINCLUDE:
handleInclude(cmdName,DocInclude::VerbInclude);
break;
@@ -5842,10 +5838,10 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
}
break;
case CMD_SECREFITEM:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected command %s",qPrint(g_token->name));
break;
case CMD_ENDSECREFLIST:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected command %s",qPrint(g_token->name));
break;
case CMD_FORMULA:
{
@@ -5857,7 +5853,7 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
// retval = handleLanguageSwitch();
// break;
case CMD_INTERNALREF:
- //warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
+ //warn_doc_error(g_fileName,getDoctokinizerLineNr(),"unexpected command %s",qPrint(g_token->name));
{
DocInternalRef *ref = handleInternalRef(this);
if (ref)
@@ -5876,26 +5872,26 @@ int DocPara::handleCommand(const QCString &cmdName, const int tok)
ASSERT(0);
break;
}
- INTERNAL_ASSERT(retval==0 || retval==RetVal_OK || retval==RetVal_SimpleSec ||
+ INTERNAL_ASSERT(retval==0 || retval==RetVal_OK || retval==RetVal_SimpleSec ||
retval==TK_LISTITEM || retval==TK_ENDLIST || retval==TK_NEWPARA ||
- retval==RetVal_Section || retval==RetVal_EndList ||
- retval==RetVal_Internal || retval==RetVal_SwitchLang ||
+ retval==RetVal_Section || retval==RetVal_EndList ||
+ retval==RetVal_Internal || retval==RetVal_SwitchLang ||
retval==RetVal_EndInternal
);
DBG(("handleCommand(%s) end retval=%x\n",qPrint(cmdName),retval));
return retval;
}
-static bool findAttribute(const HtmlAttribList &tagHtmlAttribs,
- const char *attrName,
- QCString *result)
+static bool findAttribute(const HtmlAttribList &tagHtmlAttribs,
+ const char *attrName,
+ QCString *result)
{
HtmlAttribListIterator li(tagHtmlAttribs);
HtmlAttrib *opt;
for (li.toFirst();(opt=li.current());++li)
{
- if (opt->name==attrName)
+ if (opt->name==attrName)
{
*result = opt->value;
return TRUE;
@@ -5909,15 +5905,15 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
DBG(("handleHtmlStartTag(%s,%d)\n",qPrint(tagName),tagHtmlAttribs.count()));
int retval=RetVal_OK;
int tagId = Mappers::htmlTagMapper->map(tagName);
- if (g_token->emptyTag && !(tagId&XML_CmdMask) &&
+ if (g_token->emptyTag && !(tagId&XML_CmdMask) &&
tagId!=HTML_UNKNOWN && tagId!=HTML_IMG && tagId!=HTML_BR && tagId!=HTML_HR && tagId!=HTML_P)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"HTML tag ('<%s/>') may not use the 'empty tag' XHTML syntax.",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"HTML tag ('<%s/>') may not use the 'empty tag' XHTML syntax.",
tagName.data());
}
switch (tagId)
{
- case HTML_UL:
+ case HTML_UL:
if (!g_token->emptyTag)
{
DocHtmlList *list = new DocHtmlList(this,tagHtmlAttribs,DocHtmlList::Unordered);
@@ -5925,7 +5921,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
retval=list->parse();
}
break;
- case HTML_OL:
+ case HTML_OL:
if (!g_token->emptyTag)
{
DocHtmlList *list = new DocHtmlList(this,tagHtmlAttribs,DocHtmlList::Ordered);
@@ -5937,7 +5933,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
if (g_token->emptyTag) break;
if (!insideUL(this) && !insideOL(this))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"lonely <li> tag found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"lonely <li> tag found");
}
else
{
@@ -5964,8 +5960,8 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
break;
case HTML_CODE:
if (g_token->emptyTag) break;
- if (/*getLanguageFromFileName(g_fileName)==SrcLangExt_CSharp ||*/ g_xmlComment)
- // for C# source or inside a <summary> or <remark> section we
+ if (/*getLanguageFromFileName(g_fileName)==SrcLangExt_CSharp ||*/ g_xmlComment)
+ // for C# source or inside a <summary> or <remark> section we
// treat <code> as an XML tag (so similar to @code)
{
doctokenizerYYsetStateXmlCode();
@@ -6018,7 +6014,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
retval = RetVal_DescTitle;
break;
case HTML_DD:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag <dd> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag <dd> found");
break;
case HTML_TABLE:
if (!g_token->emptyTag)
@@ -6038,7 +6034,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
retval = RetVal_TableHCell;
break;
case HTML_CAPTION:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag <caption> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag <caption> found");
break;
case HTML_BR:
{
@@ -6119,7 +6115,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
{
if (Config_getBool(WARN_NO_PARAMDOC))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"empty 'name' attribute for <param%s> tag.",tagId==XML_PARAM?"":"type");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"empty 'name' attribute for <param%s> tag.",tagId==XML_PARAM?"":"type");
}
}
else
@@ -6131,7 +6127,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <param%s> tag.",tagId==XML_PARAM?"":"type");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Missing 'name' attribute from <param%s> tag.",tagId==XML_PARAM?"":"type");
}
}
break;
@@ -6143,13 +6139,13 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
{
//printf("paramName=%s\n",paramName.data());
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,tagName,TRUE));
- m_children.append(new DocWord(this,paramName));
+ m_children.append(new DocWord(this,paramName));
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,tagName,FALSE));
if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <param%sref> tag.",tagId==XML_PARAMREF?"":"type");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Missing 'name' attribute from <param%sref> tag.",tagId==XML_PARAMREF?"":"type");
}
}
break;
@@ -6164,7 +6160,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'cref' attribute from <exception> tag.");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Missing 'cref' attribute from <exception> tag.");
}
}
break;
@@ -6180,7 +6176,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"lonely <item> tag found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"lonely <item> tag found");
}
break;
case XML_RETURNS:
@@ -6198,7 +6194,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
case XML_SEE:
// I'm not sure if <see> is the same as <seealso> or if it
// should you link a member without producing a section. The
- // C# specification is extremely vague about this (but what else
+ // C# specification is extremely vague about this (but what else
// can we expect from Microsoft...)
{
QCString cref;
@@ -6241,7 +6237,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'cref' or 'langword' attribute from <see> tag.");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Missing 'cref' or 'langword' attribute from <see> tag.");
}
}
break;
@@ -6275,7 +6271,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'cref' attribute from <seealso> tag.");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Missing 'cref' attribute from <seealso> tag.");
}
}
break;
@@ -6309,7 +6305,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
g_xmlComment=TRUE;
break;
case HTML_UNKNOWN:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported xml/html tag <%s> found", qPrint(tagName));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unsupported xml/html tag <%s> found", qPrint(tagName));
m_children.append(new DocWord(this, "<"+tagName+g_token->attribsStr+">"));
break;
case XML_INHERITDOC:
@@ -6330,20 +6326,20 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
int retval=RetVal_OK;
switch (tagId)
{
- case HTML_UL:
+ case HTML_UL:
if (!insideUL(this))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found </ul> tag without matching <ul>");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found </ul> tag without matching <ul>");
}
else
{
retval=RetVal_EndList;
}
break;
- case HTML_OL:
+ case HTML_OL:
if (!insideOL(this))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found </ol> tag without matching <ol>");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found </ol> tag without matching <ol>");
}
else
{
@@ -6353,7 +6349,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
case HTML_LI:
if (!insideLI(this))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found </li> tag without matching <li>");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found </li> tag without matching <li>");
}
else
{
@@ -6366,7 +6362,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
//case HTML_PRE:
// if (!insidePRE(this))
// {
- // warn_doc_error(g_fileName,doctokenizerYYlineno,"found </pre> tag without matching <pre>");
+ // warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found </pre> tag without matching <pre>");
// }
// else
// {
@@ -6445,37 +6441,37 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
// ignore </th> tag
break;
case HTML_CAPTION:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </caption> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag </caption> found");
break;
case HTML_BR:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal </br> tag found\n");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Illegal </br> tag found\n");
break;
case HTML_H1:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h1> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag </h1> found");
break;
case HTML_H2:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h2> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag </h2> found");
break;
case HTML_H3:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h3> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag </h3> found");
break;
case HTML_H4:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h4> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag </h4> found");
break;
case HTML_H5:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h5> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag </h5> found");
break;
case HTML_H6:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h6> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag </h6> found");
break;
case HTML_IMG:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </img> found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag </img> found");
break;
case HTML_HR:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal </hr> tag found\n");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Illegal </hr> tag found\n");
break;
case HTML_A:
- //warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </a> found");
+ //warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected tag </a> found");
// ignore </a> tag (can be part of <a name=...></a>
break;
@@ -6510,12 +6506,12 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
// These tags are defined in .Net but are currently unsupported
break;
case HTML_UNKNOWN:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported xml/html tag </%s> found", qPrint(tagName));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unsupported xml/html tag </%s> found", qPrint(tagName));
m_children.append(new DocWord(this,"</"+tagName+">"));
break;
default:
// we should not get here!
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end tag %s\n",qPrint(tagName));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected end tag %s\n",qPrint(tagName));
ASSERT(0);
break;
}
@@ -6533,7 +6529,7 @@ int DocPara::parse()
while ((tok=doctokenizerYYlex())) // get the next token
{
reparsetoken:
- DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno));
+ DBG(("token %s at %d",tokToString(tok),getDoctokinizerLineNr()));
if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
tok==TK_COMMAND_AT || tok == TK_COMMAND_BS || tok==TK_HTMLTAG
)
@@ -6558,8 +6554,8 @@ reparsetoken:
DocNode::Kind k;
if (insidePRE(this) || // all whitespace is relevant
(
- // remove leading whitespace
- !m_children.isEmpty() &&
+ // remove leading whitespace
+ !m_children.isEmpty() &&
// and whitespace after certain constructs
(k=m_children.getLast()->kind())!=DocNode::Kind_HtmlDescList &&
k!=DocNode::Kind_HtmlTable &&
@@ -6588,7 +6584,7 @@ reparsetoken:
{
DocAutoList *al = (DocAutoList *)n;
DBG(("previous list item at %d\n",al->indent()));
- if (al->indent()>=g_token->indent)
+ if (al->indent()>=g_token->indent)
// new item at the same or lower indent level
{
retval=TK_LISTITEM;
@@ -6599,9 +6595,9 @@ reparsetoken:
// determine list depth
int depth = 0;
n=parent();
- while(n)
+ while(n)
{
- if (n->kind() == DocNode::Kind_AutoList &&
+ if (n->kind() == DocNode::Kind_AutoList &&
((DocAutoList*)n)->isEnumList()) depth++;
n=n->parent();
}
@@ -6654,8 +6650,8 @@ reparsetoken:
}
}
break;
- case TK_ENDLIST:
- DBG(("Found end of list inside of paragraph at line %d\n",doctokenizerYYlineno));
+ case TK_ENDLIST:
+ DBG(("Found end of list inside of paragraph at line %d\n",getDoctokinizerLineNr()));
if (parent()->kind()==DocNode::Kind_AutoListItem)
{
ASSERT(parent()->parent()->kind()==DocNode::Kind_AutoList);
@@ -6668,13 +6664,13 @@ reparsetoken:
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"End of list marker found "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"End of list marker found "
"has invalid indent level");
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"End of list marker found without any preceding "
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"End of list marker found without any preceding "
"list items");
}
break;
@@ -6685,10 +6681,10 @@ reparsetoken:
// see if we have to start a simple section
int cmd = Mappers::cmdMapper->map(g_token->name);
DocNode *n=parent();
- while (n &&
- n->kind()!=DocNode::Kind_SimpleSect &&
+ while (n &&
+ n->kind()!=DocNode::Kind_SimpleSect &&
n->kind()!=DocNode::Kind_ParamSect
- )
+ )
{
n=n->parent();
}
@@ -6739,25 +6735,25 @@ reparsetoken:
DBG(("reparsing command %s\n",qPrint(g_token->name)));
goto reparsetoken;
}
- else if (retval==RetVal_OK)
+ else if (retval==RetVal_OK)
{
// the command ended normally, keep scanning for new tokens.
retval = 0;
}
else if (retval>0 && retval<RetVal_OK)
- {
+ {
// the command ended with a new command, reparse this token
tok = retval;
goto reparsetoken;
}
- else // end of file, end of paragraph, start or end of section
+ else // end of file, end of paragraph, start or end of section
// or some auto list marker
{
goto endparagraph;
}
}
break;
- case TK_HTMLTAG:
+ case TK_HTMLTAG:
{
if (!g_token->endTag) // found a start tag
{
@@ -6767,7 +6763,7 @@ reparsetoken:
{
retval = handleHtmlEndTag(g_token->name);
}
- if (retval==RetVal_OK)
+ if (retval==RetVal_OK)
{
// the command ended normally, keep scanner for new tokens.
retval = 0;
@@ -6778,7 +6774,7 @@ reparsetoken:
}
}
break;
- case TK_SYMBOL:
+ case TK_SYMBOL:
{
DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name);
if (s!=DocSymbol::Sym_Unknown)
@@ -6787,21 +6783,21 @@ reparsetoken:
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unsupported symbol %s found",
qPrint(g_token->name));
}
break;
}
- case TK_NEWPARA:
+ case TK_NEWPARA:
retval=TK_NEWPARA;
goto endparagraph;
case TK_RCSTAG:
{
DocNode *n=parent();
- while (n &&
- n->kind()!=DocNode::Kind_SimpleSect &&
+ while (n &&
+ n->kind()!=DocNode::Kind_SimpleSect &&
n->kind()!=DocNode::Kind_ParamSect
- )
+ )
{
n=n->parent();
}
@@ -6822,7 +6818,7 @@ reparsetoken:
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),
"Found unexpected token (id=%x)\n",tok);
break;
}
@@ -6838,11 +6834,11 @@ endparagraph:
{
((DocPara *)n)->setAttribs(g_token->attribs);
}
- INTERNAL_ASSERT(retval==0 || retval==TK_NEWPARA || retval==TK_LISTITEM ||
- retval==TK_ENDLIST || retval>RetVal_OK
+ INTERNAL_ASSERT(retval==0 || retval==TK_NEWPARA || retval==TK_LISTITEM ||
+ retval==TK_ENDLIST || retval>RetVal_OK
);
- return retval;
+ return retval;
}
//--------------------------------------------------------------------------
@@ -6853,20 +6849,15 @@ int DocSection::parse()
int retval=RetVal_OK;
g_nodeStack.push(this);
- SectionInfo *sec;
if (!m_id.isEmpty())
{
- sec=Doxygen::sectionDict->find(m_id);
+ const SectionInfo *sec = SectionManager::instance().find(m_id);
if (sec)
{
- m_file = sec->fileName;
- m_anchor = sec->label;
- m_title = sec->title;
- if (m_title.isEmpty()) m_title = sec->label;
- if (g_sectionDict && g_sectionDict->find(m_id)==0)
- {
- g_sectionDict->append(m_id,sec);
- }
+ m_file = sec->fileName();
+ m_anchor = sec->label();
+ m_title = sec->title();
+ if (m_title.isEmpty()) m_title = sec->label();
}
}
@@ -6878,7 +6869,7 @@ int DocSection::parse()
DocPara *par = new DocPara(this);
if (isFirst) { par->markFirst(); isFirst=FALSE; }
retval=par->parse();
- if (!par->isEmpty())
+ if (!par->isEmpty())
{
m_children.append(par);
lastPar=par;
@@ -6889,7 +6880,7 @@ int DocSection::parse()
}
if (retval==TK_LISTITEM)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid list item found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid list item found");
}
if (retval==RetVal_Internal)
{
@@ -6901,7 +6892,7 @@ int DocSection::parse()
retval=RetVal_OK;
}
}
- } while (retval!=0 &&
+ } while (retval!=0 &&
retval!=RetVal_Section &&
retval!=RetVal_Subsection &&
retval!=RetVal_Subsubsection &&
@@ -6920,7 +6911,6 @@ int DocSection::parse()
// then parse any number of nested sections
while (retval==RetVal_Subsection) // more sections follow
{
- //SectionInfo *sec=Doxygen::sectionDict[g_token->sectionId];
DocSection *s=new DocSection(this,
QMIN(2+Doxygen::subpageNestingLevel,5),g_token->sectionId);
m_children.append(s);
@@ -6931,11 +6921,10 @@ int DocSection::parse()
else if (retval==RetVal_Subsubsection && m_level<=Doxygen::subpageNestingLevel+2)
{
if ((m_level<=1+Doxygen::subpageNestingLevel) && !g_token->sectionId.startsWith("autotoc_md"))
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected subsubsection command found inside %s!",sectionLevelToName[m_level]);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected subsubsection command found inside %s!",sectionLevelToName[m_level]);
// then parse any number of nested sections
while (retval==RetVal_Subsubsection) // more sections follow
{
- //SectionInfo *sec=Doxygen::sectionDict[g_token->sectionId];
DocSection *s=new DocSection(this,
QMIN(3+Doxygen::subpageNestingLevel,5),g_token->sectionId);
m_children.append(s);
@@ -6946,17 +6935,16 @@ int DocSection::parse()
else if (retval==RetVal_Paragraph && m_level<=QMIN(5,Doxygen::subpageNestingLevel+3))
{
if ((m_level<=2+Doxygen::subpageNestingLevel) && !g_token->sectionId.startsWith("autotoc_md"))
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected paragraph command found inside %s!",sectionLevelToName[m_level]);
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected paragraph command found inside %s!",sectionLevelToName[m_level]);
// then parse any number of nested sections
while (retval==RetVal_Paragraph) // more sections follow
{
- //SectionInfo *sec=Doxygen::sectionDict[g_token->sectionId];
DocSection *s=new DocSection(this,
QMIN(4+Doxygen::subpageNestingLevel,5),g_token->sectionId);
m_children.append(s);
retval = s->parse();
}
- if (!(m_level<Doxygen::subpageNestingLevel+3 && (retval == RetVal_Subsection || retval == RetVal_Subsubsection))) break;
+ if (!(m_level<Doxygen::subpageNestingLevel+3 && (retval == RetVal_Subsection || retval == RetVal_Subsubsection))) break;
}
else
{
@@ -6964,11 +6952,11 @@ int DocSection::parse()
}
}
- INTERNAL_ASSERT(retval==0 ||
- retval==RetVal_Section ||
- retval==RetVal_Subsection ||
- retval==RetVal_Subsubsection ||
- retval==RetVal_Paragraph ||
+ INTERNAL_ASSERT(retval==0 ||
+ retval==RetVal_Section ||
+ retval==RetVal_Subsection ||
+ retval==RetVal_Subsubsection ||
+ retval==RetVal_Paragraph ||
retval==RetVal_Internal ||
retval==RetVal_EndInternal
);
@@ -6986,19 +6974,19 @@ void DocText::parse()
DBG(("DocText::parse() start\n"));
g_nodeStack.push(this);
doctokenizerYYsetStateText();
-
+
int tok;
while ((tok=doctokenizerYYlex())) // get the next token
{
switch(tok)
{
- case TK_WORD:
+ case TK_WORD:
m_children.append(new DocWord(this,g_token->name));
break;
- case TK_WHITESPACE:
+ case TK_WHITESPACE:
m_children.append(new DocWhiteSpace(this,g_token->chars));
break;
- case TK_SYMBOL:
+ case TK_SYMBOL:
{
DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name);
if (s!=DocSymbol::Sym_Unknown)
@@ -7007,7 +6995,7 @@ void DocText::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unsupported symbol %s found",
qPrint(g_token->name));
}
}
@@ -7069,13 +7057,13 @@ void DocText::parse()
m_children.append(new DocSymbol(this,DocSymbol::Sym_Equal));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command '%s' found",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected command '%s' found",
qPrint(g_token->name));
break;
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Unexpected token %s",
tokToString(tok));
break;
}
@@ -7119,13 +7107,13 @@ void DocRoot::parse()
{
if (!g_token->sectionId.startsWith("autotoc_md"))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found paragraph command outside of subsubsection context!");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found paragraph command (id: '%s') outside of subsubsection context!",qPrint(g_token->sectionId));
}
while (retval==RetVal_Paragraph)
{
if (!g_token->sectionId.isEmpty())
{
- SectionInfo *sec=Doxygen::sectionDict->find(g_token->sectionId);
+ const SectionInfo *sec=SectionManager::instance().find(g_token->sectionId);
if (sec)
{
DocSection *s=new DocSection(this,
@@ -7135,13 +7123,13 @@ void DocRoot::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid paragraph id '%s'; ignoring paragraph",qPrint(g_token->sectionId));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid paragraph id '%s'; ignoring paragraph",qPrint(g_token->sectionId));
retval = 0;
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing id for paragraph; ignoring paragraph");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Missing id for paragraph; ignoring paragraph");
retval = 0;
}
}
@@ -7149,12 +7137,12 @@ void DocRoot::parse()
if (retval==RetVal_Subsubsection)
{
if (!(g_token->sectionId.startsWith("autotoc_md")))
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found subsubsection command outside of subsection context!");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found subsubsection command (id: '%s') outside of subsection context!",qPrint(g_token->sectionId));
while (retval==RetVal_Subsubsection)
{
if (!g_token->sectionId.isEmpty())
{
- SectionInfo *sec=Doxygen::sectionDict->find(g_token->sectionId);
+ const SectionInfo *sec=SectionManager::instance().find(g_token->sectionId);
if (sec)
{
DocSection *s=new DocSection(this,
@@ -7164,13 +7152,13 @@ void DocRoot::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid subsubsection id '%s'; ignoring subsubsection",qPrint(g_token->sectionId));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid subsubsection id '%s'; ignoring subsubsection",qPrint(g_token->sectionId));
retval = 0;
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing id for subsubsection; ignoring subsubsection");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Missing id for subsubsection; ignoring subsubsection");
retval = 0;
}
}
@@ -7179,13 +7167,13 @@ void DocRoot::parse()
{
if (!g_token->sectionId.startsWith("autotoc_md"))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"found subsection command outside of section context!");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"found subsection command (id: '%s') outside of section context!",qPrint(g_token->sectionId));
}
while (retval==RetVal_Subsection)
{
if (!g_token->sectionId.isEmpty())
{
- SectionInfo *sec=Doxygen::sectionDict->find(g_token->sectionId);
+ const SectionInfo *sec=SectionManager::instance().find(g_token->sectionId);
if (sec)
{
DocSection *s=new DocSection(this,
@@ -7195,20 +7183,20 @@ void DocRoot::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid subsection id '%s'; ignoring subsection",qPrint(g_token->sectionId));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid subsection id '%s'; ignoring subsection",qPrint(g_token->sectionId));
retval = 0;
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing id for subsection; ignoring subsection");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Missing id for subsection; ignoring subsection");
retval = 0;
}
}
}
if (retval==TK_LISTITEM)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid list item found");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid list item found");
}
if (retval==RetVal_Internal)
{
@@ -7225,7 +7213,7 @@ void DocRoot::parse()
{
if (!g_token->sectionId.isEmpty())
{
- SectionInfo *sec=Doxygen::sectionDict->find(g_token->sectionId);
+ const SectionInfo *sec=SectionManager::instance().find(g_token->sectionId);
if (sec)
{
DocSection *s=new DocSection(this,
@@ -7235,13 +7223,13 @@ void DocRoot::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid section id '%s'; ignoring section",qPrint(g_token->sectionId));
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Invalid section id '%s'; ignoring section",qPrint(g_token->sectionId));
retval = 0;
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing id for section; ignoring section");
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),"Missing id for section; ignoring section");
retval = 0;
}
}
@@ -7273,7 +7261,7 @@ static QCString extractCopyDocId(const char *data, uint &j, uint len)
case '\'': insideSQuote=TRUE; break;
case ' ': // fall through
case '\t': // fall through
- case '\n':
+ case '\n':
found=(round==0);
break;
}
@@ -7409,14 +7397,14 @@ static QCString processCopyDoc(const char *data,uint &len)
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),
"Found recursive @copy%s or @copydoc relation for argument '%s'.\n",
isBrief?"brief":"details",id.data());
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,
+ warn_doc_error(g_fileName,getDoctokinizerLineNr(),
"@copy%s or @copydoc target '%s' not found", isBrief?"brief":"details",
id.data());
}
@@ -7578,7 +7566,8 @@ DocRoot *validatingParseDoc(const char *fileName,int startLine,
const Definition *ctx,const MemberDef *md,
const char *input,bool indexWords,
bool isExample, const char *exampleName,
- bool singleLine, bool linkFromIndex)
+ bool singleLine, bool linkFromIndex,
+ bool markdownSupport)
{
//printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?ctx->name().data():"<none>",
// md?md->name().data():"<none>",
@@ -7592,21 +7581,21 @@ DocRoot *validatingParseDoc(const char *fileName,int startLine,
docParserPushContext();
if (ctx && ctx!=Doxygen::globalScope &&
- (ctx->definitionType()==Definition::TypeClass ||
+ (ctx->definitionType()==Definition::TypeClass ||
ctx->definitionType()==Definition::TypeNamespace
- )
- )
+ )
+ )
{
g_context = ctx->name();
}
else if (ctx && ctx->definitionType()==Definition::TypePage)
{
- const Definition *scope = (dynamic_cast<const PageDef*>(ctx))->getPageScope();
+ const Definition *scope = (toPageDef(ctx))->getPageScope();
if (scope && scope!=Doxygen::globalScope) g_context = scope->name();
}
else if (ctx && ctx->definitionType()==Definition::TypeGroup)
{
- const Definition *scope = (dynamic_cast<const GroupDef*>(ctx))->getGroupScope();
+ const Definition *scope = (toGroupDef(ctx))->getGroupScope();
if (scope && scope!=Doxygen::globalScope) g_context = scope->name();
}
else
@@ -7633,7 +7622,7 @@ DocRoot *validatingParseDoc(const char *fileName,int startLine,
{
g_searchUrl=md->getOutputFileBase();
Doxygen::searchIndex->setCurrentDoc(
- (md->getLanguage()==SrcLangExt_Fortran ?
+ (md->getLanguage()==SrcLangExt_Fortran ?
theTranslator->trSubprogram(TRUE,TRUE):
theTranslator->trMember(TRUE,TRUE))+" "+md->qualifiedName(),
g_searchUrl,
@@ -7713,8 +7702,8 @@ DocRoot *validatingParseDoc(const char *fileName,int startLine,
}
g_fileName = fileName;
- g_relPath = (!linkFromIndex && ctx) ?
- QCString(relativePathToRoot(ctx->getOutputFileBase())) :
+ g_relPath = (!linkFromIndex && ctx) ?
+ QCString(relativePathToRoot(ctx->getOutputFileBase())) :
QCString("");
//printf("ctx->name=%s relPath=%s\n",ctx->name().data(),g_relPath.data());
g_memberDef = md;
@@ -7735,10 +7724,10 @@ DocRoot *validatingParseDoc(const char *fileName,int startLine,
g_retvalsFound.clear();
g_paramsFound.setAutoDelete(FALSE);
g_paramsFound.clear();
- g_sectionDict = 0; //sections;
-
+ g_markdownSupport = markdownSupport;
+
//printf("Starting comment block at %s:%d\n",g_fileName.data(),startLine);
- doctokenizerYYlineno=startLine;
+ setDoctokinizerLineNr(startLine);
uint inpLen=qstrlen(input);
QCString inpStr = processCopyDoc(input,inpLen);
if (inpStr.isEmpty() || inpStr.at(inpStr.length()-1)!='\n')
@@ -7746,7 +7735,7 @@ DocRoot *validatingParseDoc(const char *fileName,int startLine,
inpStr+='\n';
}
//printf("processCopyDoc(in='%s' out='%s')\n",input,inpStr.data());
- doctokenizerYYinit(inpStr,g_fileName);
+ doctokenizerYYinit(inpStr,g_fileName,markdownSupport);
// build abstract syntax tree
DocRoot *root = new DocRoot(md!=0,singleLine);
@@ -7774,7 +7763,7 @@ DocRoot *validatingParseDoc(const char *fileName,int startLine,
//printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?ctx->name().data():"<none>",
// md?md->name().data():"<none>");
-
+
return root;
}
@@ -7813,8 +7802,8 @@ DocText *validatingParseText(const char *input)
if (input)
{
- doctokenizerYYlineno=1;
- doctokenizerYYinit(input,g_fileName);
+ setDoctokinizerLineNr(1);
+ doctokenizerYYinit(input,g_fileName,Config_getBool(MARKDOWN_SUPPORT));
// build abstract syntax tree
txt->parse();
@@ -7839,4 +7828,3 @@ void docFindSections(const char *input,
{
doctokenizerYYFindSections(input,d,fileName);
}
-
diff --git a/src/docparser.h b/src/docparser.h
index b7164d7..1dc6b3f 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -32,7 +32,6 @@ class DocNode;
class MemberDef;
class Definition;
class MemberGroup;
-class SectionDict;
//---------------------------------------------------------------------------
QString::Direction getTextDirByConfig(const QString &text);
@@ -53,7 +52,7 @@ QCString getJsDirEmbeddingChar(QString::Direction textDir);
* @param md Member definition to which the documentation belongs.
* Can be 0.
* @param input String representation of the documentation block.
- * @param indexWords Indicates whether or not words should be put in the
+ * @param indexWords Indicates whether or not words should be put in the
* search index.
* @param isExample TRUE if the documentation belongs to an example.
* @param exampleName Base name of the example file (0 if isExample is FALSE).
@@ -62,16 +61,19 @@ QCString getJsDirEmbeddingChar(QString::Direction textDir);
* @param linkFromIndex TRUE if the documentation is generated from an
* index page. In this case context is not used to determine
* the relative path when making a link.
+ * @param markdownSupport TRUE if the input needs to take markdown markup into
+ * account.
* @returns Root node of the abstract syntax tree. Ownership of the
* pointer is handed over to the caller.
*/
DocRoot *validatingParseDoc(const char *fileName,int startLine,
const Definition *context, const MemberDef *md,
const char *input,bool indexWords,
- bool isExample,const char *exampleName=0,
- bool singleLine=FALSE,bool linkFromIndex=FALSE);
+ bool isExample,const char *exampleName,
+ bool singleLine,bool linkFromIndex,
+ bool markdownSupport);
-/*! Main entry point for parsing simple text fragments. These
+/*! Main entry point for parsing simple text fragments. These
* fragments are limited to words, whitespace and symbols.
*/
DocText *validatingParseText(const char *input);
@@ -88,11 +90,11 @@ class DocNode
{
public:
/*! Available node types. */
- enum Kind { Kind_Root = 0,
- Kind_Word = 1,
- Kind_WhiteSpace = 2,
- Kind_Para = 3,
- Kind_AutoList = 4,
+ enum Kind { Kind_Root = 0,
+ Kind_Word = 1,
+ Kind_WhiteSpace = 2,
+ Kind_Para = 3,
+ Kind_AutoList = 4,
Kind_AutoListItem = 5,
Kind_Symbol = 6,
Kind_URL = 7,
@@ -159,7 +161,7 @@ class DocNode
/*! Sets a new parent for this node. */
void setParent(DocNode *parent) { m_parent = parent; }
- /*! Acceptor function for node visitors. Part of the visitor pattern.
+ /*! Acceptor function for node visitors. Part of the visitor pattern.
* @param v Abstract visitor.
*/
virtual void accept(DocVisitor *v) = 0;
@@ -186,31 +188,31 @@ template<class T> class CompAccept : public DocNode
{
public:
CompAccept() { m_children.setAutoDelete(TRUE); }
- void accept(DocVisitor *v)
+ void accept(DocVisitor *v)
{
T *obj = dynamic_cast<T *>(this);
- v->visitPre(obj);
+ v->visitPre(obj);
QListIterator<DocNode> cli(m_children);
DocNode *n;
for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
- v->visitPost(obj);
+ v->visitPost(obj);
}
const QList<DocNode> &children() const { return m_children; }
QList<DocNode> &children() { return m_children; }
- QString::Direction getTextDir(int nodeIndex) const
+ QString::Direction getTextDir(uint nodeIndex) const
{
unsigned char resultDir = QString::DirNeutral;
for (uint i = nodeIndex; i < m_children.count(); i++)
{
DocNode* node = m_children.at(i);
QString::Direction nodeDir = node->getTextDir();
- resultDir |= nodeDir;
+ resultDir |= (unsigned char)nodeDir;
if (resultDir == QString::DirMixed)
return QString::DirMixed;
}
return static_cast<QString::Direction>(resultDir);
}
- QString::Direction getTextBasicDir(int nodeIndex) const
+ QString::Direction getTextBasicDir(uint nodeIndex) const
{
for (uint i = nodeIndex; i < m_children.count(); i++)
{
@@ -229,13 +231,13 @@ template<class T> class CompAccept : public DocNode
{
return getTextBasicDir(0);
}
-
+
protected:
QList<DocNode> m_children;
};
-/** Node representing a word
+/** Node representing a word
*/
class DocWord : public DocNode
{
@@ -283,7 +285,7 @@ class DocLinkedWord : public DocNode
class DocURL : public DocNode
{
public:
- DocURL(DocNode *parent,const QCString &url,bool isEmail) :
+ DocURL(DocNode *parent,const QCString &url,bool isEmail) :
m_url(url), m_isEmail(isEmail) { m_parent=parent; }
QCString url() const { return m_url; }
Kind kind() const { return Kind_URL; }
@@ -483,7 +485,7 @@ class DocSymbol : public DocNode
const char *symb;
const PerlType type;
}PerlSymb;
- DocSymbol(DocNode *parent,SymType s) :
+ DocSymbol(DocNode *parent,SymType s) :
m_symbol(s) { m_parent = parent; }
SymType symbol() const { return m_symbol; }
Kind kind() const { return Kind_Symbol; }
@@ -513,7 +515,7 @@ class DocEmoji : public DocNode
class DocWhiteSpace : public DocNode
{
public:
- DocWhiteSpace(DocNode *parent,const QCString &chars) :
+ DocWhiteSpace(DocNode *parent,const QCString &chars) :
m_chars(chars) { m_parent = parent; }
Kind kind() const { return Kind_WhiteSpace; }
QCString chars() const { return m_chars; }
@@ -530,7 +532,7 @@ class DocSeparator : public DocNode
m_chars(chars) { m_parent = parent; }
Kind kind() const { return Kind_Sep; }
QCString chars() const { return m_chars; }
- void accept(DocVisitor *v) { }
+ void accept(DocVisitor *) { }
private:
QCString m_chars;
};
@@ -583,21 +585,21 @@ class DocInclude : public DocNode
public:
enum Type { Include, DontInclude, VerbInclude, HtmlInclude, LatexInclude,
IncWithLines, Snippet , IncludeDoc, SnippetDoc, SnipWithLines,
- DontIncWithLines};
+ DontIncWithLines, RtfInclude, ManInclude, DocbookInclude, XmlInclude};
DocInclude(DocNode *parent,const QCString &file,
const QCString context, Type t,
bool isExample,const QCString exampleFile,
- const QCString blockId, bool isBlock) :
+ const QCString blockId, bool isBlock) :
m_file(file), m_context(context), m_type(t),
- m_isExample(isExample), m_exampleFile(exampleFile),
- m_blockId(blockId), m_isBlock(isBlock) { m_parent = parent; }
+ m_isExample(isExample), m_isBlock(isBlock),
+ m_exampleFile(exampleFile), m_blockId(blockId) { m_parent = parent; }
Kind kind() const { return Kind_Include; }
QCString file() const { return m_file; }
- QCString extension() const { int i=m_file.findRev('.');
- if (i!=-1)
- return m_file.right(m_file.length()-i);
- else
- return "";
+ QCString extension() const { int i=m_file.findRev('.');
+ if (i!=-1)
+ return m_file.right(m_file.length()-(uint)i);
+ else
+ return "";
}
Type type() const { return m_type; }
QCString text() const { return m_text; }
@@ -613,9 +615,9 @@ class DocInclude : public DocNode
QCString m_file;
QCString m_context;
QCString m_text;
- Type m_type = Include;
- bool m_isExample = false;
- bool m_isBlock = false;
+ Type m_type;
+ bool m_isExample;
+ bool m_isBlock;
QCString m_exampleFile;
QCString m_blockId;
};
@@ -626,7 +628,7 @@ class DocIncOperator : public DocNode
public:
enum Type { Line, SkipLine, Skip, Until };
DocIncOperator(DocNode *parent,Type t,const QCString &pat,
- const QCString &context,bool isExample,const QCString &exampleFile) :
+ const QCString &context,bool isExample,const QCString &exampleFile) :
m_type(t), m_pattern(pat), m_context(context),
m_isFirst(FALSE), m_isLast(FALSE),
m_isExample(isExample), m_exampleFile(exampleFile) { m_parent = parent; }
@@ -696,7 +698,7 @@ class DocFormula : public DocNode
class DocIndexEntry : public DocNode
{
public:
- DocIndexEntry(DocNode *parent,const Definition *scope,const MemberDef *md)
+ DocIndexEntry(DocNode *parent,const Definition *scope,const MemberDef *md)
: m_scope(scope), m_member(md){ m_parent = parent; }
Kind kind() const { return Kind_IndexEntry; }
int parse();
@@ -963,7 +965,7 @@ class DocHRef : public CompAccept<DocHRef>
{
public:
DocHRef(DocNode *parent,const HtmlAttribList &attribs,const QCString &url,
- const QCString &relPath) :
+ const QCString &relPath) :
m_attribs(attribs), m_url(url), m_relPath(relPath) { m_parent = parent; }
int parse();
QCString url() const { return m_url; }
@@ -981,7 +983,7 @@ class DocHRef : public CompAccept<DocHRef>
class DocHtmlHeader : public CompAccept<DocHtmlHeader>
{
public:
- DocHtmlHeader(DocNode *parent,const HtmlAttribList &attribs,int level) :
+ DocHtmlHeader(DocNode *parent,const HtmlAttribList &attribs,int level) :
m_level(level), m_attribs(attribs) { m_parent = parent; }
int level() const { return m_level; }
Kind kind() const { return Kind_HtmlHeader; }
@@ -997,7 +999,7 @@ class DocHtmlHeader : public CompAccept<DocHtmlHeader>
class DocHtmlDescTitle : public CompAccept<DocHtmlDescTitle>
{
public:
- DocHtmlDescTitle(DocNode *parent,const HtmlAttribList &attribs) :
+ DocHtmlDescTitle(DocNode *parent,const HtmlAttribList &attribs) :
m_attribs(attribs) { m_parent = parent; }
Kind kind() const { return Kind_HtmlDescTitle; }
const HtmlAttribList &attribs() const { return m_attribs; }
@@ -1026,7 +1028,7 @@ class DocSection : public CompAccept<DocSection>
{
public:
DocSection(DocNode *parent,int level,const QCString &id) :
- m_level(level), m_id(id) { m_parent = parent; }
+ m_level(level), m_id(id) { m_parent = parent; }
Kind kind() const { return Kind_Section; }
int level() const { return m_level; }
QCString title() const { return m_title; }
@@ -1047,7 +1049,7 @@ class DocSection : public CompAccept<DocSection>
class DocSecRefItem : public CompAccept<DocSecRefItem>
{
public:
- DocSecRefItem(DocNode *parent,const QCString &target) :
+ DocSecRefItem(DocNode *parent,const QCString &target) :
m_target(target) { m_parent = parent; }
Kind kind() const { return Kind_SecRefItem; }
QCString target() const { return m_target; }
@@ -1111,7 +1113,7 @@ class DocHtmlList : public CompAccept<DocHtmlList>
{
public:
enum Type { Unordered, Ordered };
- DocHtmlList(DocNode *parent,const HtmlAttribList &attribs,Type t) :
+ DocHtmlList(DocNode *parent,const HtmlAttribList &attribs,Type t) :
m_type(t), m_attribs(attribs) { m_parent = parent; }
Kind kind() const { return Kind_HtmlList; }
Type type() const { return m_type; }
@@ -1128,8 +1130,8 @@ class DocHtmlList : public CompAccept<DocHtmlList>
class DocSimpleSect : public CompAccept<DocSimpleSect>
{
public:
- enum Type
- {
+ enum Type
+ {
Unknown, See, Return, Author, Authors, Version, Since, Date,
Note, Warning, Copyright, Pre, Post, Invar, Remark, Attention, User, Rcs
};
@@ -1151,7 +1153,7 @@ class DocSimpleSect : public CompAccept<DocSimpleSect>
};
/** Node representing a separator between two simple sections of the
- * same type.
+ * same type.
*/
class DocSimpleSectSep : public DocNode
{
@@ -1168,16 +1170,16 @@ class DocParamSect : public CompAccept<DocParamSect>
{
friend class DocParamList;
public:
- enum Type
- {
+ enum Type
+ {
Unknown, Param, RetVal, Exception, TemplateParam
};
enum Direction
{
In=1, Out=2, InOut=3, Unspecified=0
};
- DocParamSect(DocNode *parent,Type t)
- : m_type(t), m_hasInOutSpecifier(FALSE), m_hasTypeSpecifier(FALSE)
+ DocParamSect(DocNode *parent,Type t)
+ : m_type(t), m_hasInOutSpecifier(FALSE), m_hasTypeSpecifier(FALSE)
{ m_parent = parent; }
int parse(const QCString &cmdName,bool xmlContext,Direction d);
Kind kind() const { return Kind_ParamSect; }
@@ -1195,7 +1197,7 @@ class DocParamSect : public CompAccept<DocParamSect>
class DocPara : public CompAccept<DocPara>
{
public:
- DocPara(DocNode *parent) :
+ DocPara(DocNode *parent) :
m_isFirst(FALSE), m_isLast(FALSE) { m_parent = parent; }
int parse();
Kind kind() const { return Kind_Para; }
@@ -1242,12 +1244,12 @@ class DocPara : public CompAccept<DocPara>
class DocParamList : public DocNode
{
public:
- DocParamList(DocNode *parent,DocParamSect::Type t,DocParamSect::Direction d)
+ DocParamList(DocNode *parent,DocParamSect::Type t,DocParamSect::Direction d)
: m_type(t), m_dir(d), m_isFirst(TRUE), m_isLast(TRUE)
- { m_paragraphs.setAutoDelete(TRUE);
- m_params.setAutoDelete(TRUE);
+ { m_paragraphs.setAutoDelete(TRUE);
+ m_params.setAutoDelete(TRUE);
m_paramTypes.setAutoDelete(TRUE);
- m_parent = parent;
+ m_parent = parent;
}
virtual ~DocParamList() { }
Kind kind() const { return Kind_ParamList; }
@@ -1260,12 +1262,12 @@ class DocParamList : public DocNode
bool isFirst() const { return m_isFirst; }
bool isLast() const { return m_isLast; }
void accept(DocVisitor *v)
- {
- v->visitPre(this);
+ {
+ v->visitPre(this);
QListIterator<DocPara> cli(m_paragraphs);
DocNode *n;
for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
- v->visitPost(this);
+ v->visitPost(this);
}
int parse(const QCString &cmdName);
int parseXml(const QCString &paramName);
@@ -1291,9 +1293,9 @@ class DocSimpleListItem : public DocNode
Kind kind() const { return Kind_SimpleListItem; }
void accept(DocVisitor *v)
{
- v->visitPre(this);
+ v->visitPre(this);
m_paragraph->accept(v);
- v->visitPost(this);
+ v->visitPost(this);
}
private:
@@ -1304,7 +1306,7 @@ class DocSimpleListItem : public DocNode
class DocHtmlListItem : public CompAccept<DocHtmlListItem>
{
public:
- DocHtmlListItem(DocNode *parent,const HtmlAttribList &attribs,int num) :
+ DocHtmlListItem(DocNode *parent,const HtmlAttribList &attribs,int num) :
m_attribs(attribs), m_itemNum(num) { m_parent = parent; }
Kind kind() const { return Kind_HtmlListItem; }
int itemNumber() const { return m_itemNum; }
@@ -1336,10 +1338,8 @@ class DocHtmlCell : public CompAccept<DocHtmlCell>
friend class DocHtmlTable;
public:
enum Alignment { Left, Right, Center };
- DocHtmlCell(DocNode *parent,const HtmlAttribList &attribs,bool isHeading) :
- m_isHeading(isHeading),
- m_isFirst(FALSE), m_isLast(FALSE), m_attribs(attribs),
- m_rowIdx(-1), m_colIdx(-1) { m_parent = parent; }
+ DocHtmlCell(DocNode *parent,const HtmlAttribList &attribs,bool isHeading) :
+ m_isHeading(isHeading), m_attribs(attribs) { m_parent = parent; }
bool isHeading() const { return m_isHeading; }
bool isFirst() const { return m_isFirst; }
bool isLast() const { return m_isLast; }
@@ -1349,21 +1349,21 @@ class DocHtmlCell : public CompAccept<DocHtmlCell>
const HtmlAttribList &attribs() const { return m_attribs; }
int parse();
int parseXml();
- int rowIndex() const { return m_rowIdx; }
- int columnIndex() const { return m_colIdx; }
- int rowSpan() const;
- int colSpan() const;
+ uint rowIndex() const { return m_rowIdx; }
+ uint columnIndex() const { return m_colIdx; }
+ uint rowSpan() const;
+ uint colSpan() const;
Alignment alignment() const;
private:
- void setRowIndex(int idx) { m_rowIdx = idx; }
- void setColumnIndex(int idx) { m_colIdx = idx; }
+ void setRowIndex(uint idx) { m_rowIdx = idx; }
+ void setColumnIndex(uint idx) { m_colIdx = idx; }
bool m_isHeading = false;
bool m_isFirst = false;
bool m_isLast = false;
HtmlAttribList m_attribs;
- int m_rowIdx = -1;
- int m_colIdx = -1;
+ uint m_rowIdx = (uint)-1;
+ uint m_colIdx = (uint)-1;
};
/** Node representing a HTML table caption */
@@ -1390,8 +1390,8 @@ class DocHtmlRow : public CompAccept<DocHtmlRow>
{
friend class DocHtmlTable;
public:
- DocHtmlRow(DocNode *parent,const HtmlAttribList &attribs) :
- m_attribs(attribs), m_visibleCells(-1), m_rowIdx(-1) { m_parent = parent; }
+ DocHtmlRow(DocNode *parent,const HtmlAttribList &attribs) :
+ m_attribs(attribs) { m_parent = parent; }
Kind kind() const { return Kind_HtmlRow; }
uint numCells() const { return m_children.count(); }
const HtmlAttribList &attribs() const { return m_attribs; }
@@ -1410,22 +1410,22 @@ class DocHtmlRow : public CompAccept<DocHtmlRow>
}
return m_children.count()>0 && heading;
}
- void setVisibleCells(int n) { m_visibleCells = n; }
- int visibleCells() const { return m_visibleCells; }
- int rowIndex() const { return m_rowIdx; }
+ void setVisibleCells(uint n) { m_visibleCells = n; }
+ uint visibleCells() const { return m_visibleCells; }
+ uint rowIndex() const { return m_rowIdx; }
private:
- void setRowIndex(int idx) { m_rowIdx = idx; }
+ void setRowIndex(uint idx) { m_rowIdx = idx; }
HtmlAttribList m_attribs;
- int m_visibleCells = -1;
- int m_rowIdx = -1;
+ uint m_visibleCells = 0;
+ uint m_rowIdx = (uint)-1;
};
/** Node representing a HTML table */
class DocHtmlTable : public CompAccept<DocHtmlTable>
{
public:
- DocHtmlTable(DocNode *parent,const HtmlAttribList &attribs)
+ DocHtmlTable(DocNode *parent,const HtmlAttribList &attribs)
: m_attribs(attribs) { m_caption=0; m_numCols=0; m_parent = parent; }
~DocHtmlTable() { delete m_caption; }
Kind kind() const { return Kind_HtmlTable; }
@@ -1447,7 +1447,7 @@ class DocHtmlTable : public CompAccept<DocHtmlTable>
void computeTableGrid();
DocHtmlCaption *m_caption = 0;
HtmlAttribList m_attribs;
- int m_numCols = 0;
+ uint m_numCols = 0;
};
/** Node representing an HTML blockquote */
diff --git a/src/docsets.cpp b/src/docsets.cpp
index a838923..c59ca76 100644
--- a/src/docsets.cpp
+++ b/src/docsets.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -66,7 +66,7 @@ void DocSets::initialize()
}
FTextStream ts(&makefile);
- ts << "DOCSET_NAME=" << bundleId << ".docset\n"
+ ts << "DOCSET_NAME=" << bundleId << ".docset\n"
"DOCSET_CONTENTS=$(DOCSET_NAME)/Contents\n"
"DOCSET_RESOURCES=$(DOCSET_CONTENTS)/Resources\n"
"DOCSET_DOCUMENTS=$(DOCSET_RESOURCES)/Documents\n"
@@ -116,25 +116,25 @@ void DocSets::initialize()
}
FTextStream ts(&plist);
- ts << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\"\n"
- "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
- "<plist version=\"1.0\">\n"
- "<dict>\n"
- " <key>CFBundleName</key>\n"
- " <string>" << projectName << "</string>\n"
+ ts << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\"\n"
+ "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
+ "<plist version=\"1.0\">\n"
+ "<dict>\n"
+ " <key>CFBundleName</key>\n"
+ " <string>" << projectName << "</string>\n"
" <key>CFBundleIdentifier</key>\n"
- " <string>" << bundleId << "</string>\n"
+ " <string>" << bundleId << "</string>\n"
" <key>CFBundleVersion</key>\n"
" <string>" << projectNumber << "</string>\n"
- " <key>DocSetFeedName</key>\n"
+ " <key>DocSetFeedName</key>\n"
" <string>" << feedName << "</string>\n"
" <key>DocSetPublisherIdentifier</key>\n"
" <string>" << publisherId << "</string>\n"
" <key>DocSetPublisherName</key>\n"
" <string>" << publisherName << "</string>\n"
// markers for Dash
- " <key>DashDocSetFamily</key>\n"
+ " <key>DashDocSetFamily</key>\n"
" <string>doxy</string>\n"
" <key>DocSetPlatformFamily</key>\n"
" <string>doxygen</string>\n"
@@ -226,8 +226,8 @@ void DocSets::decContentsDepth()
}
void DocSets::addContentsItem(bool isDir,
- const char *name,
- const char *ref,
+ const char *name,
+ const char *ref,
const char *file,
const char *anchor,
bool /* separateIndex */,
@@ -247,7 +247,7 @@ void DocSets::addContentsItem(bool isDir,
m_nts << indent() << " <Name>" << convertToXML(name) << "</Name>" << endl;
if (file && file[0]=='^') // URL marker
{
- m_nts << indent() << " <URL>" << convertToXML(&file[1])
+ m_nts << indent() << " <URL>" << convertToXML(&file[1])
<< "</URL>" << endl;
}
else // relative file
@@ -294,11 +294,11 @@ void DocSets::addIndexItem(const Definition *context,const MemberDef *md,
// determine language
QCString lang;
SrcLangExt langExt = SrcLangExt_Cpp;
- if (md)
+ if (md)
{
langExt = md->getLanguage();
}
- else if (context)
+ else if (context)
{
langExt = context->getLanguage();
}
@@ -309,7 +309,7 @@ void DocSets::addIndexItem(const Definition *context,const MemberDef *md,
{
if (md && (md->isObjCMethod() || md->isObjCProperty()))
lang="occ"; // Objective C/C++
- else if (fd && fd->name().right(2).lower()==".c")
+ else if (fd && fd->name().right(2).lower()==".c")
lang="c"; // Plain C
else if (cd==0 && nd==0)
lang="c"; // Plain C symbol outside any class or namespace
@@ -328,7 +328,6 @@ void DocSets::addIndexItem(const Definition *context,const MemberDef *md,
case SrcLangExt_VHDL: lang="vhdl"; break; // VHDL
case SrcLangExt_XML: lang="xml"; break; // DBUS XML
case SrcLangExt_SQL: lang="sql"; break; // Sql
- case SrcLangExt_Tcl: lang="tcl"; break; // Tcl
case SrcLangExt_Markdown:lang="markdown"; break; // Markdown
case SrcLangExt_Slice: lang="slice"; break; // Slice
case SrcLangExt_Unknown: lang="unknown"; break; // should not happen!
@@ -387,9 +386,9 @@ void DocSets::addIndexItem(const Definition *context,const MemberDef *md,
case MemberType_DCOP:
type="dcop"; break;
case MemberType_Property:
- if (cd && cd->compoundType()==ClassDef::Protocol)
+ if (cd && cd->compoundType()==ClassDef::Protocol)
type="intfp"; // interface property
- else
+ else
type="instp"; // instance property
break;
case MemberType_Event:
@@ -405,7 +404,7 @@ void DocSets::addIndexItem(const Definition *context,const MemberDef *md,
}
cd = md->getClassDef();
nd = md->getNamespaceDef();
- if (cd)
+ if (cd)
{
scope = cd->qualifiedName();
}
@@ -428,28 +427,28 @@ void DocSets::addIndexItem(const Definition *context,const MemberDef *md,
{
if (fd==0 && context->definitionType()==Definition::TypeFile)
{
- fd = dynamic_cast<const FileDef*>(context);
+ fd = toFileDef(context);
}
if (cd==0 && context->definitionType()==Definition::TypeClass)
{
- cd = dynamic_cast<const ClassDef*>(context);
+ cd = toClassDef(context);
}
if (nd==0 && context->definitionType()==Definition::TypeNamespace)
{
- nd = dynamic_cast<const NamespaceDef*>(context);
+ nd = toNamespaceDef(context);
}
if (fd)
{
type="file";
}
- else if (cd)
+ else if (cd)
{
scope = cd->qualifiedName();
if (cd->isTemplate())
{
type="tmplt";
}
- else if (cd->compoundType()==ClassDef::Protocol)
+ else if (cd->compoundType()==ClassDef::Protocol)
{
type="intf";
if (scope.right(2)=="-p") scope=scope.left(scope.length()-2);
@@ -462,7 +461,7 @@ void DocSets::addIndexItem(const Definition *context,const MemberDef *md,
{
type="cat";
}
- else
+ else
{
type = "cl";
}
@@ -511,7 +510,7 @@ void DocSets::writeToken(FTextStream &t,
t << " <Scope>" << convertToXML(scope) << "</Scope>" << endl;
}
t << " </TokenIdentifier>" << endl;
- t << " <Path>" << d->getOutputFileBase()
+ t << " <Path>" << d->getOutputFileBase()
<< Doxygen::htmlFileExtension << "</Path>" << endl;
if (anchor)
{
diff --git a/src/doctokenizer.h b/src/doctokenizer.h
index e01f045..235b403 100644
--- a/src/doctokenizer.h
+++ b/src/doctokenizer.h
@@ -6,8 +6,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -78,7 +78,7 @@ struct TokenInfo
QCString text;
// comment blocks
-
+
// list token info
bool isEnumList = false;
int indent = 0;
@@ -115,16 +115,18 @@ struct TokenInfo
// globals
extern TokenInfo *g_token;
-extern int doctokenizerYYlineno;
extern FILE *doctokenizerYYin;
// helper functions
const char *tokToString(int token);
+void setDoctokinizerLineNr(int lineno);
+int getDoctokinizerLineNr(void);
+
// operations on the scanner
void doctokenizerYYFindSections(const char *input,const Definition *d,
const char *fileName);
-void doctokenizerYYinit(const char *input,const char *fileName);
+void doctokenizerYYinit(const char *input,const char *fileName,bool markdownSupport);
void doctokenizerYYcleanup();
void doctokenizerYYpushContext();
bool doctokenizerYYpopContext();
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index 4882570..330db00 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -6,8 +6,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,6 +18,9 @@
%option never-interactive
%option prefix="doctokenizerYY"
+%top{
+#include <stdint.h>
+}
%{
@@ -43,24 +46,27 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
+#define USE_STATE2STRING 0
+
#define TK_COMMAND_SEL() (yytext[0] == '@' ? TK_COMMAND_AT : TK_COMMAND_BS)
-
+
//--------------------------------------------------------------------------
// context for tokenizer phase
static int g_commentState;
TokenInfo *g_token = 0;
-static int g_inputPos = 0;
+static yy_size_t g_inputPos = 0;
static const char *g_inputString;
static QCString g_fileName;
static bool g_insidePre;
static int g_sharpCount=0;
+static bool g_markdownSupport=TRUE;
// context for section finding phase
static const Definition *g_definition;
static QCString g_secLabel;
static QCString g_secTitle;
-static SectionInfo::SectionType g_secType;
+static SectionType g_secType;
static QCString g_endMarker;
static int g_autoListLevel;
@@ -69,14 +75,21 @@ struct DocLexerContext
TokenInfo *token;
int rule;
int autoListLevel;
- int inputPos;
+ yy_size_t inputPos;
const char *inputString;
YY_BUFFER_STATE state;
};
static QStack<DocLexerContext> g_lexerStack;
+static int g_yyLineNr = 0;
+
+#define lineCount(s,len) do { for(int i=0;i<(int)len;i++) if (s[i]=='\n') g_yyLineNr++; } while(0)
+
+
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
//--------------------------------------------------------------------------
void doctokenizerYYpushContext()
@@ -106,6 +119,21 @@ bool doctokenizerYYpopContext()
return TRUE;
}
+QCString extractPartAfterNewLine(const QCString &text)
+{
+ int nl1 = text.findRev('\n');
+ if (nl1!=-1)
+ {
+ return text.mid(nl1+1);
+ }
+ int nl2 = text.findRev("\\ilinebr");
+ if (nl2!=-1)
+ {
+ if (text.at(nl2+8)==' ') nl2++; // skip space after \\ilinebr
+ return text.mid(nl2+8);
+ }
+ return text;
+}
//--------------------------------------------------------------------------
@@ -165,13 +193,13 @@ static void processSection()
}
else
{
- warn(g_fileName,yylineno,"Found section/anchor %s without context\n",g_secLabel.data());
+ warn(g_fileName,g_yyLineNr,"Found section/anchor %s without context\n",g_secLabel.data());
}
- SectionInfo *si=0;
- if ((si=Doxygen::sectionDict->find(g_secLabel)))
+ SectionInfo *si = SectionManager::instance().find(g_secLabel);
+ if (si)
{
- si->fileName = file;
- si->type = g_secType;
+ si->setFileName(file);
+ si->setType(g_secType);
}
}
@@ -181,10 +209,10 @@ static void handleHtmlTag()
g_token->attribs.clear();
g_token->endTag = FALSE;
g_token->emptyTag = FALSE;
-
+
// Check for end tag
int startNamePos=1;
- if (tagText.at(1)=='/')
+ if (tagText.at(1)=='/')
{
g_token->endTag = TRUE;
startNamePos++;
@@ -212,7 +240,7 @@ static void handleHtmlTag()
// check for end of the tag
if (c == '>') break;
// Check for XML style "empty" tag.
- if (c == '/')
+ if (c == '/')
{
g_token->emptyTag = TRUE;
break;
@@ -222,42 +250,42 @@ static void handleHtmlTag()
while (i<(int)yyleng && !isspace((uchar)c) && c!='=' && c!= '>') { c=tagText.at(++i); }
endName=i;
HtmlAttrib opt;
- opt.name = tagText.mid(startName,endName-startName).lower();
+ opt.name = tagText.mid(startName,endName-startName).lower();
// skip spaces
- while (i<(int)yyleng && isspace((uchar)c)) { c=tagText.at(++i); }
+ while (i<(int)yyleng && isspace((uchar)c)) { c=tagText.at(++i); }
if (tagText.at(i)=='=') // option has value
{
c=tagText.at(++i);
// skip spaces
- while (i<(int)yyleng && isspace((uchar)c)) { c=tagText.at(++i); }
+ while (i<(int)yyleng && isspace((uchar)c)) { c=tagText.at(++i); }
if (tagText.at(i)=='\'') // option '...'
{
c=tagText.at(++i);
- startAttrib=i;
-
- // search for matching quote
- while (i<(int)yyleng && c!='\'') { c=tagText.at(++i); }
- endAttrib=i;
+ startAttrib=i;
+
+ // search for matching quote
+ while (i<(int)yyleng && c!='\'') { c=tagText.at(++i); }
+ endAttrib=i;
if (i<(int)yyleng) { c=tagText.at(++i);}
}
else if (tagText.at(i)=='"') // option "..."
{
c=tagText.at(++i);
- startAttrib=i;
- // search for matching quote
- while (i<(int)yyleng && c!='"') { c=tagText.at(++i); }
- endAttrib=i;
+ startAttrib=i;
+ // search for matching quote
+ while (i<(int)yyleng && c!='"') { c=tagText.at(++i); }
+ endAttrib=i;
if (i<(int)yyleng) { c=tagText.at(++i);}
}
else // value without any quotes
{
- startAttrib=i;
- // search for separator or end symbol
- while (i<(int)yyleng && !isspace((uchar)c) && c!='>') { c=tagText.at(++i); }
- endAttrib=i;
+ startAttrib=i;
+ // search for separator or end symbol
+ while (i<(int)yyleng && !isspace((uchar)c) && c!='>') { c=tagText.at(++i); }
+ endAttrib=i;
if (i<(int)yyleng) { c=tagText.at(++i);}
}
- opt.value = tagText.mid(startAttrib,endAttrib-startAttrib);
+ opt.value = tagText.mid(startAttrib,endAttrib-startAttrib);
if (opt.name == "align") opt.value = opt.value.lower();
else if (opt.name == "valign")
{
@@ -274,7 +302,7 @@ static void handleHtmlTag()
}
g_token->attribsStr = tagText.mid(startAttribList,i-startAttribList);
}
-
+
static QCString stripEmptyLines(const QCString &s)
{
if (s.isEmpty()) return QCString();
@@ -285,11 +313,11 @@ static QCString stripEmptyLines(const QCString &s)
{
int c;
while ((c=s[p]) && (c==' ' || c=='\t')) p++;
- if (s[p]=='\n')
+ if (s[p]=='\n')
{
- start=++p;
+ start=++p;
}
- else
+ else
{
break;
}
@@ -301,7 +329,7 @@ static QCString stripEmptyLines(const QCString &s)
{
int c;
while ((c=s[p]) && (c==' ' || c=='\t')) p--;
- if (s[p]=='\n')
+ if (s[p]=='\n')
{
end=p;
}
@@ -315,14 +343,15 @@ static QCString stripEmptyLines(const QCString &s)
return s.mid(start,end-start);
}
+#define unput_string(yytext,yyleng) do { for (int i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); } while(0)
//--------------------------------------------------------------------------
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-static int yyread(char *buf,int max_size)
+static yy_size_t yyread(char *buf,yy_size_t max_size)
{
- int c=0;
+ yy_size_t c=0;
const char *src=g_inputString+g_inputPos;
while ( c < max_size && *src ) *buf++ = *src++, c++;
g_inputPos+=c;
@@ -356,21 +385,21 @@ OLISTITEM {BLANK}*[1-9][0-9]*"."{BLANK}
ENDLIST {BLANK}*"."{BLANK}*\n
ATTRNAME [a-z_A-Z\x80-\xFF][:a-z_A-Z0-9\x80-\xFF\-]*
ATTRIB {ATTRNAME}{WS}*("="{WS}*(("\""[^\"]*"\"")|("'"[^\']*"'")|[^ \t\r\n'"><]+))?
-URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=]
+URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=\x80-\xFF]
URLMASK ({URLCHAR}+([({]{URLCHAR}*[)}])?)+
-URLPROTOCOL ("http:"|"https:"|"ftp:"|"file:"|"news:"|"irc")
-FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+&#]
-FILEECHAR [a-z_A-Z0-9\-\+&#]
+URLPROTOCOL ("http:"|"https:"|"ftp:"|"ftps:"|"sftp:"|"file:"|"news:"|"irc:"|"ircs:")
+FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+&#@]
+FILEECHAR [a-z_A-Z0-9\-\+&#@]
HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)+
FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
-LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
+LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
VERBATIM "verbatim"{BLANK}*
SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}|"--"|"---")
SPCMD2 {CMD}[\\@<>&$#%~".+=|-]
SPCMD3 {CMD}_form#[0-9]+
SPCMD4 {CMD}"::"
SPCMD5 {CMD}":"
-INOUT "inout"|"in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in")
+INOUT "in"|"out"|("in"{BLANK}*","?{BLANK}*"out")|("out"{BLANK}*","?{BLANK}*"in")
PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]"
VARARGS "..."
TEMPCHAR [a-z_A-Z0-9.,: \t\*\&\(\)\[\]]
@@ -388,7 +417,7 @@ FUNCARG "("{FUNCPART}")"({BLANK}*("volatile"|"const"){BLANK})?
FUNCARG2 "("{FUNCPART}")"({BLANK}*("volatile"|"const"))?
OPNEW {BLANK}+"new"({BLANK}*"[]")?
OPDEL {BLANK}+"delete"({BLANK}*"[]")?
-OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()"
+OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()"|"<=>"
OPCAST {BLANK}+[^<(\r\n.,][^(\r\n.,]*
OPMASK ({BLANK}*{OPNORM}{FUNCARG})
OPMASKOPT ({BLANK}*{OPNORM}{FUNCARG}?)|({OPCAST}{FUNCARG})
@@ -405,7 +434,7 @@ WORD2 "."|","|"("|")"|"["|"]"|"::"|":"|";"|"\?"|"="|"'"
WORD1NQ {ESCWORD}|{CHARWORDQ}+|"{"|"}"
WORD2NQ "."|","|"("|")"|"["|"]"|"::"|":"|";"|"\?"|"="|"'"
CAPTION [cC][aA][pP][tT][iI][oO][nN]
-HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">"
+HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">"
HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"|"strike"|"u"|"del"|"ins"|"s"
HTMLKEYU "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"SUP"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P"|"STRIKE"|"U"|"DEL"|"INS"|"S"
HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
@@ -417,9 +446,9 @@ REFWORD4_NOCV (({SCOPEPRE}*"operator"{OPMASKOP2})|(("::"|"#"){SCOPEPRE}*"operat
REFWORD4 {REFWORD4_NOCV}{CVSPEC}?
REFWORD {FILEMASK}|{LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
+RCSID "$"("Author"|"Date"|"Header"|"Id"|"Locker"|"Log"|"Name"|"RCSfile"|"Revision"|"Source"|"State")":"[^:\n$][^\n$]*"$"
%option noyywrap
-%option yylineno
%x St_Para
%x St_Comment
@@ -471,21 +500,23 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
%%
<St_Para>\r /* skip carriage return */
-<St_Para>^{LISTITEM} { /* list item */
+<St_Para>^{LISTITEM} { /* list item */
+ lineCount(yytext,yyleng);
QCString text=yytext;
- int dashPos = text.findRev('-');
- g_token->isEnumList = text.at(dashPos+1)=='#';
+ int dashPos = text.findRev('-');
+ g_token->isEnumList = text.at(dashPos+1)=='#';
g_token->id = -1;
- g_token->indent = computeIndent(yytext,dashPos);
+ g_token->indent = computeIndent(yytext,dashPos);
return TK_LISTITEM;
}
-<St_Para>^{MLISTITEM} { /* list item */
- if (!Doxygen::markdownSupport || g_insidePre)
+<St_Para>^{MLISTITEM} { /* list item */
+ if (!g_markdownSupport || g_insidePre)
{
REJECT;
}
else
{
+ lineCount(yytext,yyleng);
QCString text=yytext;
static QRegExp re("[*+]");
int listPos = text.findRev(re);
@@ -495,8 +526,8 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return TK_LISTITEM;
}
}
-<St_Para>^{OLISTITEM} { /* numbered list item */
- if (!Doxygen::markdownSupport || g_insidePre)
+<St_Para>^{OLISTITEM} { /* numbered list item */
+ if (!g_markdownSupport || g_insidePre)
{
REJECT;
}
@@ -512,25 +543,25 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return TK_LISTITEM;
}
}
-<St_Para>{BLANK}*\n{LISTITEM} { /* list item on next line */
- QCString text=yytext;
- text=text.right(text.length()-text.find('\n')-1);
- int dashPos = text.findRev('-');
- g_token->isEnumList = text.at(dashPos+1)=='#';
+<St_Para>{BLANK}*(\n|"\\ilinebr"){LISTITEM} { /* list item on next line */
+ lineCount(yytext,yyleng);
+ QCString text=extractPartAfterNewLine(yytext);
+ int dashPos = text.findRev('-');
+ g_token->isEnumList = text.at(dashPos+1)=='#';
g_token->id = -1;
- g_token->indent = computeIndent(text,dashPos);
+ g_token->indent = computeIndent(text,dashPos);
return TK_LISTITEM;
}
-<St_Para>{BLANK}*\n{MLISTITEM} { /* list item on next line */
- if (!Doxygen::markdownSupport || g_insidePre)
+<St_Para>{BLANK}*(\n|"\\ilinebr"){MLISTITEM} { /* list item on next line */
+ if (!g_markdownSupport || g_insidePre)
{
REJECT;
}
else
{
- QCString text=yytext;
+ lineCount(yytext,yyleng);
+ QCString text=extractPartAfterNewLine(yytext);
static QRegExp re("[*+]");
- text=text.right(text.length()-text.find('\n')-1);
int markPos = text.findRev(re);
g_token->isEnumList = FALSE;
g_token->id = -1;
@@ -538,17 +569,15 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return TK_LISTITEM;
}
}
-<St_Para>{BLANK}*\n{OLISTITEM} { /* list item on next line */
- if (!Doxygen::markdownSupport || g_insidePre)
+<St_Para>{BLANK}*(\n|"\\ilinebr"){OLISTITEM} { /* list item on next line */
+ if (!g_markdownSupport || g_insidePre)
{
REJECT;
}
else
{
- QCString text=yytext;
- int nl=text.findRev('\n');
- int len=text.length();
- text=text.right(len-nl-1);
+ lineCount(yytext,yyleng);
+ QCString text=extractPartAfterNewLine(yytext);
static QRegExp re("[1-9]");
int digitPos = text.find(re);
int dotPos = text.find('.',digitPos);
@@ -558,150 +587,155 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return TK_LISTITEM;
}
}
-<St_Para>^{ENDLIST} { /* end list */
+<St_Para>^{ENDLIST} { /* end list */
+ lineCount(yytext,yyleng);
int dotPos = QCString(yytext).findRev('.');
- g_token->indent = computeIndent(yytext,dotPos);
+ g_token->indent = computeIndent(yytext,dotPos);
return TK_ENDLIST;
}
-<St_Para>{BLANK}*\n{ENDLIST} { /* end list on next line */
- QCString text=yytext;
- text=text.right(text.length()-text.find('\n')-1);
+<St_Para>{BLANK}*(\n|"\\ilinebr"){ENDLIST} { /* end list on next line */
+ lineCount(yytext,yyleng);
+ QCString text=extractPartAfterNewLine(yytext);
int dotPos = text.findRev('.');
- g_token->indent = computeIndent(text,dotPos);
+ g_token->indent = computeIndent(text,dotPos);
return TK_ENDLIST;
}
<St_Para>"{"{BLANK}*"@link"/{BLANK}+ {
- g_token->name = "javalink";
- return TK_COMMAND_AT;
- }
+ g_token->name = "javalink";
+ return TK_COMMAND_AT;
+ }
<St_Para>"{"{BLANK}*"@inheritDoc"{BLANK}*"}" {
- g_token->name = "inheritdoc";
- return TK_COMMAND_AT;
- }
-<St_Para>"@_fakenl" { // artificial new line
- yylineno++;
- }
+ g_token->name = "inheritdoc";
+ return TK_COMMAND_AT;
+ }
+<St_Para>"@_fakenl" { // artificial new line
+ //g_yyLineNr++;
+ }
<St_Para>{SPCMD3} {
- g_token->name = "_form";
- bool ok;
- g_token->id = QCString(yytext).right((int)yyleng-7).toInt(&ok);
- ASSERT(ok);
- return TK_COMMAND_SEL();
- }
+ g_token->name = "_form";
+ bool ok;
+ g_token->id = QCString(yytext).right((int)yyleng-7).toInt(&ok);
+ ASSERT(ok);
+ return TK_COMMAND_SEL();
+ }
<St_Para>{CMD}"n"\n { /* \n followed by real newline */
- yylineno++;
+ lineCount(yytext,yyleng);
+ //g_yyLineNr++;
g_token->name = yytext+1;
- g_token->name = g_token->name.stripWhiteSpace();
- g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND_SEL();
+ g_token->name = g_token->name.stripWhiteSpace();
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND_SEL();
+ }
+<St_Para>"\\ilinebr" {
}
<St_Para>{SPCMD1} |
<St_Para>{SPCMD2} |
<St_Para>{SPCMD5} |
<St_Para>{SPCMD4} { /* special command */
g_token->name = yytext+1;
- g_token->name = g_token->name.stripWhiteSpace();
- g_token->paramDir=TokenInfo::Unspecified;
+ g_token->name = g_token->name.stripWhiteSpace();
+ g_token->paramDir=TokenInfo::Unspecified;
return TK_COMMAND_SEL();
- }
+ }
<St_Para>{PARAMIO} { /* param [in,out] command */
- g_token->name = "param";
- QCString s(yytext);
- bool isIn = s.find("in")!=-1;
- bool isOut = s.find("out")!=-1;
- if (isIn)
- {
- if (isOut)
- {
- g_token->paramDir=TokenInfo::InOut;
- }
- else
- {
- g_token->paramDir=TokenInfo::In;
- }
- }
- else if (isOut)
- {
- g_token->paramDir=TokenInfo::Out;
- }
- else
- {
- g_token->paramDir=TokenInfo::Unspecified;
- }
- return TK_COMMAND_SEL();
- }
-<St_Para>{URLPROTOCOL}{URLMASK}/\. { // URL.
+ g_token->name = "param";
+ QCString s(yytext);
+ bool isIn = s.find("in")!=-1;
+ bool isOut = s.find("out")!=-1;
+ if (isIn)
+ {
+ if (isOut)
+ {
+ g_token->paramDir=TokenInfo::InOut;
+ }
+ else
+ {
+ g_token->paramDir=TokenInfo::In;
+ }
+ }
+ else if (isOut)
+ {
+ g_token->paramDir=TokenInfo::Out;
+ }
+ else
+ {
+ g_token->paramDir=TokenInfo::Unspecified;
+ }
+ return TK_COMMAND_SEL();
+ }
+<St_Para>{URLPROTOCOL}{URLMASK}/[,\.] { // URL, or URL.
g_token->name=yytext;
- g_token->isEMailAddr=FALSE;
- return TK_URL;
+ g_token->isEMailAddr=FALSE;
+ return TK_URL;
}
<St_Para>{URLPROTOCOL}{URLMASK} { // URL
g_token->name=yytext;
- g_token->isEMailAddr=FALSE;
- return TK_URL;
+ g_token->isEMailAddr=FALSE;
+ return TK_URL;
}
<St_Para>"<"{URLPROTOCOL}{URLMASK}">" { // URL
g_token->name=yytext;
g_token->name = g_token->name.mid(1,g_token->name.length()-2);
- g_token->isEMailAddr=FALSE;
- return TK_URL;
+ g_token->isEMailAddr=FALSE;
+ return TK_URL;
}
<St_Para>{MAILADDR} { // Mail address
g_token->name=yytext;
g_token->name.stripPrefix("mailto:");
- g_token->isEMailAddr=TRUE;
- return TK_URL;
+ g_token->isEMailAddr=TRUE;
+ return TK_URL;
}
<St_Para>"<"{MAILADDR}">" { // Mail address
g_token->name=yytext;
g_token->name = g_token->name.mid(1,g_token->name.length()-2);
g_token->name.stripPrefix("mailto:");
- g_token->isEMailAddr=TRUE;
- return TK_URL;
+ g_token->isEMailAddr=TRUE;
+ return TK_URL;
}
<St_Para>"<"{MAILADDR2}">" { // anti spam mail address
g_token->name=yytext;
- return TK_WORD;
+ return TK_WORD;
}
-<St_Para>"$"{ID}":"[^:\n$][^\n$]*"$" { /* RCS tag */
+<St_Para>{RCSID} { /* RCS tag */
QCString tagName(yytext+1);
- int index=tagName.find(':');
- g_token->name = tagName.left(index);
- int text_begin = index+2;
- int text_end = tagName.length()-1;
- if (tagName[text_begin-1]==':') /* check for Subversion fixed-length keyword */
- {
- ++text_begin;
- if (tagName[text_end-1]=='#')
- --text_end;
- }
- g_token->text = tagName.mid(text_begin,text_end-text_begin);
- return TK_RCSTAG;
- }
+ int index=tagName.find(':');
+ g_token->name = tagName.left(index);
+ int text_begin = index+2;
+ int text_end = tagName.length()-1;
+ if (tagName[text_begin-1]==':') /* check for Subversion fixed-length keyword */
+ {
+ ++text_begin;
+ if (tagName[text_end-1]=='#')
+ --text_end;
+ }
+ g_token->text = tagName.mid(text_begin,text_end-text_begin);
+ return TK_RCSTAG;
+ }
<St_Para,St_HtmlOnly,St_ManOnly,St_LatexOnly,St_RtfOnly,St_XmlOnly,St_DbOnly>"$("{ID}")" | /* environment variable */
<St_Para,St_HtmlOnly,St_ManOnly,St_LatexOnly,St_RtfOnly,St_XmlOnly,St_DbOnly>"$("{ID}"("{ID}"))" { /* environment variable */
QCString name = &yytext[2];
- name = name.left(name.length()-1);
- QCString value = Portable::getenv(name);
- for (int i=value.length()-1;i>=0;i--) unput(value.at(i));
+ name = name.left(name.length()-1);
+ QCString value = Portable::getenv(name);
+ for (int i=value.length()-1;i>=0;i--) unput(value.at(i));
}
-<St_Para>{HTMLTAG} { /* html tag */
+<St_Para>{HTMLTAG} { /* html tag */
+ lineCount(yytext,yyleng);
handleHtmlTag();
return TK_HTMLTAG;
}
-<St_Para,St_Text>"&"{ID}";" { /* special symbol */
+<St_Para,St_Text>"&"{ID}";" { /* special symbol */
g_token->name = yytext;
return TK_SYMBOL;
}
/********* patterns for linkable words ******************/
-<St_Para>{ID}/"<"{HTMLKEYW}">" { /* this rule is to prevent opening html
- * tag to be recognized as a templated classes
- */
+<St_Para>{ID}/"<"{HTMLKEYW}">" { /* this rule is to prevent opening html
+ * tag to be recognized as a templated classes
+ */
g_token->name = yytext;
return TK_LNKWORD;
- }
+ }
<St_Para>{LNKWORD1}/"<br>" | // prevent <br> html tag to be parsed as template arguments
<St_Para>{LNKWORD1} |
<St_Para>{LNKWORD1}{FUNCARG} |
@@ -709,34 +743,35 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_Para>{LNKWORD3} {
g_token->name = yytext;
return TK_LNKWORD;
- }
+ }
<St_Para>{LNKWORD1}{FUNCARG}{CVSPEC}[^a-z_A-Z0-9] {
g_token->name = yytext;
g_token->name = g_token->name.left(g_token->name.length()-1);
- unput(yytext[(int)yyleng-1]);
+ unput(yytext[(int)yyleng-1]);
return TK_LNKWORD;
}
/********* patterns for normal words ******************/
<St_Para,St_Text>[\-+0-9] |
<St_Para,St_Text>{WORD1} |
-<St_Para,St_Text>{WORD2} { /* function call */
+<St_Para,St_Text>{WORD2} { /* function call */
+ lineCount(yytext,yyleng);
if (yytext[0]=='%') // strip % if present
- g_token->name = &yytext[1];
- else
+ g_token->name = &yytext[1];
+ else
g_token->name = yytext;
return TK_WORD;
- /* the following is dummy code to please the
- * compiler, removing this results in a warning
- * on my machine
- */
- goto find_rule;
+ /* the following is dummy code to please the
+ * compiler, removing this results in a warning
+ * on my machine
+ */
+ goto find_rule;
}
<St_Text>({ID}".")+{ID} {
g_token->name = yytext;
return TK_WORD;
- }
+ }
<St_Para,St_Text>"operator"/{BLANK}*"<"[a-zA-Z_0-9]+">" { // Special case: word "operator" followed by a HTML command
// avoid interpretation as "operator <"
g_token->name = yytext;
@@ -746,45 +781,58 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
/*******************************************************/
<St_Para,St_Text>{BLANK}+ |
-<St_Para,St_Text>{BLANK}*\n{BLANK}* { /* white space */
+<St_Para,St_Text>{BLANK}*\n{BLANK}* { /* white space */
+ lineCount(yytext,yyleng);
g_token->chars=yytext;
return TK_WHITESPACE;
}
<St_Text>[\\@<>&$#%~] {
g_token->name = yytext;
return TK_COMMAND_SEL();
- }
+ }
<St_Para>({BLANK}*\n)+{BLANK}*\n/{LISTITEM} { /* skip trailing paragraph followed by new list item */
if (g_insidePre || g_autoListLevel==0)
{
REJECT;
}
+ lineCount(yytext,yyleng);
}
<St_Para>({BLANK}*\n)+{BLANK}*\n/{MLISTITEM} { /* skip trailing paragraph followed by new list item */
- if (!Doxygen::markdownSupport || g_insidePre || g_autoListLevel==0)
+ if (!g_markdownSupport || g_insidePre || g_autoListLevel==0)
{
REJECT;
}
+ lineCount(yytext,yyleng);
}
<St_Para>({BLANK}*\n)+{BLANK}*\n/{OLISTITEM} { /* skip trailing paragraph followed by new list item */
- if (!Doxygen::markdownSupport || g_insidePre || g_autoListLevel==0)
+ if (!g_markdownSupport || g_insidePre || g_autoListLevel==0)
{
REJECT;
}
+ lineCount(yytext,yyleng);
}
-<St_Para>({BLANK}*\n)+{BLANK}*\n{BLANK}* {
- g_token->indent=computeIndent(yytext,(int)yyleng);
- int i;
- // put back the indentation (needed for list items)
- for (i=0;i<g_token->indent;i++)
+<St_Para>({BLANK}*(\n|"\\ilinebr"))+{BLANK}*(\n|"\\ilinebr"){BLANK}* {
+ lineCount(yytext,yyleng);
+ if (g_insidePre)
+ {
+ g_token->chars=yytext;
+ return TK_WHITESPACE;
+ }
+ else
{
- unput(' ');
+ g_token->indent=computeIndent(yytext,(int)yyleng);
+ int i;
+ // put back the indentation (needed for list items)
+ for (i=0;i<g_token->indent;i++)
+ {
+ unput(' ');
+ }
+ // tell flex that after putting the last indent
+ // back we are at the beginning of the line
+ YY_CURRENT_BUFFER->yy_at_bol=1;
+ // start of a new paragraph
+ return TK_NEWPARA;
}
- // tell flex that after putting the last indent
- // back we are at the beginning of the line
- YY_CURRENT_BUFFER->yy_at_bol=1;
- // start of a new paragraph
- return TK_NEWPARA;
}
<St_CodeOpt>{BLANK}*"{"(".")?{LABELID}"}" {
g_token->name = yytext;
@@ -792,22 +840,26 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
g_token->name = g_token->name.mid(i+1,g_token->name.length()-i-2);
BEGIN(St_Code);
}
+<St_CodeOpt>"\\ilinebr" |
<St_CodeOpt>\n |
<St_CodeOpt>. {
- unput(*yytext);
+ unput_string(yytext,yyleng);
BEGIN(St_Code);
}
<St_Code>{WS}*{CMD}"endcode" {
+ lineCount(yytext,yyleng);
return RetVal_OK;
}
<St_XmlCode>{WS}*"</code>" {
+ lineCount(yytext,yyleng);
return RetVal_OK;
}
<St_Code,St_XmlCode>[^\\@\n<]+ |
<St_Code,St_XmlCode>\n |
<St_Code,St_XmlCode>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_HtmlOnlyOption>" [block]" { // the space is added in commentscan.l
g_token->name="block";
BEGIN(St_HtmlOnly);
@@ -816,83 +868,96 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
unput(*yytext);
BEGIN(St_HtmlOnly);
}
+<St_HtmlOnlyOption>"\\ilinebr" {
+ unput_string(yytext,yyleng);
+ BEGIN(St_HtmlOnly);
+ }
<St_HtmlOnly>{CMD}"endhtmlonly" {
return RetVal_OK;
}
<St_HtmlOnly>[^\\@\n$]+ |
<St_HtmlOnly>\n |
<St_HtmlOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_ManOnly>{CMD}"endmanonly" {
return RetVal_OK;
}
<St_ManOnly>[^\\@\n$]+ |
<St_ManOnly>\n |
<St_ManOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_RtfOnly>{CMD}"endrtfonly" {
return RetVal_OK;
}
<St_RtfOnly>[^\\@\n$]+ |
<St_RtfOnly>\n |
<St_RtfOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_LatexOnly>{CMD}"endlatexonly" {
return RetVal_OK;
}
<St_LatexOnly>[^\\@\n]+ |
<St_LatexOnly>\n |
<St_LatexOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_XmlOnly>{CMD}"endxmlonly" {
return RetVal_OK;
}
<St_XmlOnly>[^\\@\n]+ |
<St_XmlOnly>\n |
<St_XmlOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_DbOnly>{CMD}"enddocbookonly" {
return RetVal_OK;
}
<St_DbOnly>[^\\@\n]+ |
<St_DbOnly>\n |
<St_DbOnly>. {
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_Verbatim>{CMD}"endverbatim" {
- g_token->verb=stripEmptyLines(g_token->verb);
+ g_token->verb=stripEmptyLines(g_token->verb);
return RetVal_OK;
}
<St_Verbatim>[^\\@\n]+ |
<St_Verbatim>\n |
<St_Verbatim>. { /* Verbatim text */
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_Dot>{CMD}"enddot" {
return RetVal_OK;
}
<St_Dot>[^\\@\n]+ |
<St_Dot>\n |
<St_Dot>. { /* dot text */
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_Msc>{CMD}("endmsc") {
return RetVal_OK;
}
<St_Msc>[^\\@\n]+ |
<St_Msc>\n |
<St_Msc>. { /* msc text */
- g_token->verb+=yytext;
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
<St_PlantUMLOpt>{BLANK}*"{"[^}]*"}" { // case 1: file name is specified as {filename}
g_token->sectionId = QCString(yytext).stripWhiteSpace();
// skip curly brackets around the optional image name
- g_token->sectionId = g_token->sectionId.mid(1,g_token->sectionId.length()-2).stripWhiteSpace();
+ g_token->sectionId = g_token->sectionId.mid(1,g_token->sectionId.length()-2).stripWhiteSpace();
return RetVal_OK;
}
<St_PlantUMLOpt>{BLANK}*{FILEMASK}{BLANK}+/{ID}"=" { // case 2: plain file name specified followed by an attribute
@@ -907,10 +972,15 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
g_token->sectionId = QCString(yytext).stripWhiteSpace();
return RetVal_OK;
}
+<St_PlantUMLOpt>{BLANK}*{FILEMASK}{BLANK}*/"\\ilinebr" { // case 5: plain file name specified without title or attributes
+ g_token->sectionId = QCString(yytext).stripWhiteSpace();
+ return RetVal_OK;
+ }
+<St_PlantUMLOpt>"\\ilinebr" |
<St_PlantUMLOpt>"\n" |
<St_PlantUMLOpt>. {
g_token->sectionId = "";
- unput(*yytext);
+ unput_string(yytext,yyleng);
return RetVal_OK;
}
<St_PlantUML>{CMD}"enduml" {
@@ -919,176 +989,190 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
<St_PlantUML>[^\\@\n]+ |
<St_PlantUML>\n |
<St_PlantUML>. { /* plantuml text */
- g_token->verb+=yytext;
- }
-<St_Title>"\"" { // quoted title
- BEGIN(St_TitleQ);
- }
+ lineCount(yytext,yyleng);
+ g_token->verb+=yytext;
+ }
+<St_Title>"\"" { // quoted title
+ BEGIN(St_TitleQ);
+ }
<St_Title>[ \t]+ {
g_token->chars=yytext;
- return TK_WHITESPACE;
+ return TK_WHITESPACE;
}
-<St_Title>. { // non-quoted title
- unput(*yytext);
- BEGIN(St_TitleN);
+<St_Title>. { // non-quoted title
+ unput(*yytext);
+ BEGIN(St_TitleN);
}
-<St_Title>\n {
+<St_Title>\n {
unput(*yytext);
- return 0;
- }
+ return 0;
+ }
+<St_Title>"\\ilinebr" {
+ unput_string(yytext,yyleng);
+ return 0;
+ }
<St_TitleN>"&"{ID}";" { /* symbol */
g_token->name = yytext;
- return TK_SYMBOL;
+ return TK_SYMBOL;
}
<St_TitleN>{HTMLTAG} {
- }
-<St_TitleN>{SPCMD1} |
-<St_TitleN>{SPCMD2} { /* special command */
+ lineCount(yytext,yyleng);
+ }
+<St_TitleN>\n { /* new line => end of title */
+ unput(*yytext);
+ return 0;
+ }
+<St_TitleN>"\\ilinebr" { /* new line => end of title */
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_TitleN>{SPCMD1} |
+<St_TitleN>{SPCMD2} { /* special command */
g_token->name = yytext+1;
- g_token->paramDir=TokenInfo::Unspecified;
+ g_token->paramDir=TokenInfo::Unspecified;
return TK_COMMAND_SEL();
}
<St_TitleN>{ID}"=" { /* attribute */
if (yytext[0]=='%') // strip % if present
- g_token->name = &yytext[1];
- else
+ g_token->name = &yytext[1];
+ else
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_TitleN>[\-+0-9] |
<St_TitleN>{WORD1} |
<St_TitleN>{WORD2} { /* word */
+ lineCount(yytext,yyleng);
if (yytext[0]=='%') // strip % if present
- g_token->name = &yytext[1];
- else
+ g_token->name = &yytext[1];
+ else
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_TitleN>[ \t]+ {
g_token->chars=yytext;
- return TK_WHITESPACE;
- }
-<St_TitleN>\n { /* new line => end of title */
- unput(*yytext);
- return 0;
+ return TK_WHITESPACE;
}
<St_TitleQ>"&"{ID}";" { /* symbol */
g_token->name = yytext;
- return TK_SYMBOL;
+ return TK_SYMBOL;
+ }
+<St_TitleQ>(\n|"\\ilinebr") { /* new line => end of title */
+ unput_string(yytext,yyleng);
+ return 0;
}
-<St_TitleQ>{SPCMD1} |
-<St_TitleQ>{SPCMD2} { /* special command */
+<St_TitleQ>{SPCMD1} |
+<St_TitleQ>{SPCMD2} { /* special command */
g_token->name = yytext+1;
- g_token->paramDir=TokenInfo::Unspecified;
+ g_token->paramDir=TokenInfo::Unspecified;
return TK_COMMAND_SEL();
}
<St_TitleQ>{WORD1NQ} |
<St_TitleQ>{WORD2NQ} { /* word */
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_TitleQ>[ \t]+ {
g_token->chars=yytext;
- return TK_WHITESPACE;
- }
-<St_TitleQ>"\"" { /* closing quote => end of title */
- BEGIN(St_TitleA);
- return 0;
+ return TK_WHITESPACE;
}
-<St_TitleQ>\n { /* new line => end of title */
- unput(*yytext);
- return 0;
+<St_TitleQ>"\"" { /* closing quote => end of title */
+ BEGIN(St_TitleA);
+ return 0;
}
<St_TitleA>{BLANK}*{ID}{BLANK}*"="{BLANK}* { // title attribute
- g_token->name = yytext;
- g_token->name = g_token->name.left(g_token->name.find('=')).stripWhiteSpace();
- BEGIN(St_TitleV);
- }
+ g_token->name = yytext;
+ g_token->name = g_token->name.left(g_token->name.find('=')).stripWhiteSpace();
+ BEGIN(St_TitleV);
+ }
<St_TitleV>[^ \t\r\n]+ { // attribute value
- g_token->chars = yytext;
- BEGIN(St_TitleN);
- return TK_WORD;
- }
+ lineCount(yytext,yyleng);
+ g_token->chars = yytext;
+ BEGIN(St_TitleN);
+ return TK_WORD;
+ }
<St_TitleV,St_TitleA>. {
- unput(*yytext);
- return 0;
+ unput(*yytext);
+ return 0;
}
-<St_TitleV,St_TitleA>\n {
- unput(*yytext);
- return 0;
+<St_TitleV,St_TitleA>(\n|"\\ilinebr") {
+ unput_string(yytext,yyleng);
+ return 0;
}
<St_Anchor>{LABELID}{WS}? { // anchor
- g_token->name = QCString(yytext).stripWhiteSpace();
- return TK_WORD;
- }
-<St_Anchor>. {
- unput(*yytext);
- return 0;
- }
+ lineCount(yytext,yyleng);
+ g_token->name = QCString(yytext).stripWhiteSpace();
+ return TK_WORD;
+ }
+<St_Anchor>. {
+ unput(*yytext);
+ return 0;
+ }
<St_Cite>{CITEID} { // label to cite
if (yytext[0] =='"')
{
g_token->name=yytext+1;
- g_token->name=g_token->name.left(yyleng-2);
+ g_token->name=g_token->name.left(static_cast<uint>(yyleng)-2);
}
else
{
g_token->name=yytext;
}
- return TK_WORD;
- }
+ return TK_WORD;
+ }
<St_Cite>{BLANK} { // white space
- unput(' ');
- return 0;
+ unput(' ');
+ return 0;
}
-<St_Cite>\n { // new line
- unput(*yytext);
- return 0;
- }
-<St_Cite>. { // any other character
+<St_Cite>(\n|"\\ilinebr") { // new line
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_Cite>. { // any other character
unput(*yytext);
- return 0;
- }
+ return 0;
+ }
<St_Ref>{REFWORD_NOCV}/{BLANK}("const")[a-z_A-Z0-9] { // see bug776988
- g_token->name=yytext;
- return TK_WORD;
+ g_token->name=yytext;
+ return TK_WORD;
}
<St_Ref>{REFWORD_NOCV}/{BLANK}("volatile")[a-z_A-Z0-9] { // see bug776988
- g_token->name=yytext;
- return TK_WORD;
+ g_token->name=yytext;
+ return TK_WORD;
}
<St_Ref>{REFWORD} { // label to refer to
- g_token->name=yytext;
- return TK_WORD;
- }
+ g_token->name=yytext;
+ return TK_WORD;
+ }
<St_Ref>{BLANK} { // white space
- unput(' ');
- return 0;
+ unput(' ');
+ return 0;
}
<St_Ref>{WS}+"\""{WS}* { // white space following by quoted string
- BEGIN(St_Ref2);
+ lineCount(yytext,yyleng);
+ BEGIN(St_Ref2);
}
-<St_Ref>\n { // new line
- unput(*yytext);
- return 0;
- }
-<St_Ref>. { // any other character
+<St_Ref>(\n|"\\ilinebr") { // new line
+ unput_string(yytext,yyleng);
+ return 0;
+ }
+<St_Ref>. { // any other character
unput(*yytext);
- return 0;
- }
+ return 0;
+ }
<St_IntRef>[A-Z_a-z0-9.:/#\-\+\(\)]+ {
g_token->name = yytext;
- return TK_WORD;
- }
+ return TK_WORD;
+ }
<St_IntRef>{BLANK}+"\"" {
BEGIN(St_Ref2);
}
<St_SetScope>({SCOPEMASK}|{ANONNS}){BLANK}|{FILEMASK} {
g_token->name = yytext;
g_token->name = g_token->name.stripWhiteSpace();
- return TK_WORD;
- }
+ return TK_WORD;
+ }
<St_SetScope>{SCOPEMASK}"<" {
g_token->name = yytext;
g_token->name = g_token->name.stripWhiteSpace();
@@ -1114,26 +1198,27 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
}
<St_Ref2>"&"{ID}";" { /* symbol */
g_token->name = yytext;
- return TK_SYMBOL;
+ return TK_SYMBOL;
+ }
+<St_Ref2>"\""|\n|"\\ilinebr" { /* " or \n => end of title */
+ lineCount(yytext,yyleng);
+ return 0;
}
-<St_Ref2>{SPCMD1} |
-<St_Ref2>{SPCMD2} { /* special command */
+<St_Ref2>{SPCMD1} |
+<St_Ref2>{SPCMD2} { /* special command */
g_token->name = yytext+1;
- g_token->paramDir=TokenInfo::Unspecified;
+ g_token->paramDir=TokenInfo::Unspecified;
return TK_COMMAND_SEL();
}
<St_Ref2>{WORD1NQ} |
<St_Ref2>{WORD2NQ} {
/* word */
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_Ref2>[ \t]+ {
g_token->chars=yytext;
- return TK_WHITESPACE;
- }
-<St_Ref2>"\""|\n { /* " or \n => end of title */
- return 0;
+ return TK_WHITESPACE;
}
<St_XRefItem>{LABELID} {
g_token->name=yytext;
@@ -1142,39 +1227,41 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
BEGIN(St_XRefItem2);
}
<St_XRefItem2>[0-9]+"." {
- QCString numStr=yytext;
- numStr=numStr.left((int)yyleng-1);
- g_token->id=numStr.toInt();
- return RetVal_OK;
- }
+ QCString numStr=yytext;
+ numStr=numStr.left((int)yyleng-1);
+ g_token->id=numStr.toInt();
+ return RetVal_OK;
+ }
<St_Para,St_Title,St_Ref2>"<!--" { /* html style comment block */
g_commentState = YY_START;
- BEGIN(St_Comment);
+ BEGIN(St_Comment);
}
<St_Param>"\""[^\n\"]+"\"" {
- g_token->name = yytext+1;
- g_token->name = g_token->name.left((int)yyleng-2);
- return TK_WORD;
+ g_token->name = yytext+1;
+ g_token->name = g_token->name.left((int)yyleng-2);
+ return TK_WORD;
}
<St_Param>({PHPTYPE}{BLANK}*("["{BLANK}*"]")*{BLANK}*"|"{BLANK}*)*{PHPTYPE}{BLANK}*("["{BLANK}*"]")*{WS}+("&")?"$"{LABELID} {
- QCString params = yytext;
- int j = params.find('&');
- int i = params.find('$');
- if (j<i && j!=-1) i=j;
- QCString types = params.left(i).stripWhiteSpace();
- g_token->name = types+"#"+params.mid(i);
- return TK_WORD;
- }
+ lineCount(yytext,yyleng);
+ QCString params = yytext;
+ int j = params.find('&');
+ int i = params.find('$');
+ if (j<i && j!=-1) i=j;
+ QCString types = params.left(i).stripWhiteSpace();
+ g_token->name = types+"#"+params.mid(i);
+ return TK_WORD;
+ }
<St_Param>[^ \t\n,@\\]+ {
- g_token->name = yytext;
- if (g_token->name.at(yyleng-1)==':')
+ g_token->name = yytext;
+ if (g_token->name.at(static_cast<uint>(yyleng)-1)==':')
{
- g_token->name=g_token->name.left(yyleng-1);
+ g_token->name=g_token->name.left(static_cast<uint>(yyleng)-1);
}
- return TK_WORD;
+ return TK_WORD;
}
<St_Param>{WS}*","{WS}* /* param separator */
-<St_Param>{WS} {
+<St_Param>{WS} {
+ lineCount(yytext,yyleng);
g_token->chars=yytext;
return TK_WHITESPACE;
}
@@ -1183,6 +1270,7 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
}
<St_Options>{WS}*","{WS}*
<St_Options>{WS} { /* option separator */
+ lineCount(yytext,yyleng);
g_token->name+=",";
}
<St_Options>"}" {
@@ -1202,25 +1290,35 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
return 0;
}
<St_File>{FILEMASK} {
- g_token->name = yytext;
- return TK_WORD;
- }
-<St_File>"\""[^\n\"]+"\"" {
- QCString text=yytext;
- g_token->name = text.mid(1,text.length()-2);
- return TK_WORD;
- }
-<St_Pattern>[^\r\n]+ {
g_token->name = yytext;
+ return TK_WORD;
+ }
+<St_File>"\""[^\n\"]+"\"" {
+ QCString text=yytext;
+ g_token->name = text.mid(1,text.length()-2);
+ return TK_WORD;
+ }
+<St_Pattern>[^\\\r\n]+ {
+ g_token->name += yytext;
+ }
+<St_Pattern>"\\ilinebr" {
+ g_token->name = g_token->name.stripWhiteSpace();
+ return TK_WORD;
+ }
+<St_Pattern>\n {
+ lineCount(yytext,yyleng);
g_token->name = g_token->name.stripWhiteSpace();
- return TK_WORD;
- }
+ return TK_WORD;
+ }
+<St_Pattern>. {
+ g_token->name += yytext;
+ }
<St_Link>{LINKMASK}|{REFWORD} {
g_token->name = yytext;
- return TK_WORD;
+ return TK_WORD;
}
<St_Comment>"-->" { /* end of html comment */
- BEGIN(g_commentState);
+ BEGIN(g_commentState);
}
<St_Comment>[^-]+ /* inside html comment */
<St_Comment>. /* inside html comment */
@@ -1228,13 +1326,17 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
/* State for skipping title (all chars until the end of the line) */
<St_SkipTitle>.
-<St_SkipTitle>\n { return 0; }
+<St_SkipTitle>(\n|"\\ilinebr") {
+ lineCount(yytext,yyleng);
+ return 0;
+ }
- /* State for the pass used to find the anchors and sections */
+ /* State for the pass used to find the anchors and sections */
<St_Sections>[^\n@\\<]+
<St_Sections>{CMD}("<"|{CMD})
<St_Sections>"<"{CAPTION}({WS}+{ATTRIB})*">" {
+ lineCount(yytext,yyleng);
QCString tag=yytext;
int s=tag.find("id=");
if (s!=-1) // command has id attribute
@@ -1245,131 +1347,153 @@ REFWORD_NOCV {FILEMASK}|{LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV}
int e=tag.find(c,s+4);
if (e!=-1) // found matching end
{
- g_secType = SectionInfo::Table;
+ g_secType = SectionType::Table;
g_secLabel=tag.mid(s+4,e-s-4); // extract id
processSection();
}
}
}
}
-<St_Sections>{CMD}"anchor"{BLANK}+ {
- g_secType = SectionInfo::Anchor;
- BEGIN(St_SecLabel1);
+<St_Sections>{CMD}"anchor"{BLANK}+ {
+ g_secType = SectionType::Anchor;
+ BEGIN(St_SecLabel1);
}
-<St_Sections>{CMD}"section"{BLANK}+ {
- g_secType = SectionInfo::Section;
- BEGIN(St_SecLabel2);
+<St_Sections>{CMD}"section"{BLANK}+ {
+ g_secType = SectionType::Section;
+ BEGIN(St_SecLabel2);
}
-<St_Sections>{CMD}"subsection"{BLANK}+ {
- g_secType = SectionInfo::Subsection;
- BEGIN(St_SecLabel2);
+<St_Sections>{CMD}"subsection"{BLANK}+ {
+ g_secType = SectionType::Subsection;
+ BEGIN(St_SecLabel2);
}
-<St_Sections>{CMD}"subsubsection"{BLANK}+ {
- g_secType = SectionInfo::Subsubsection;
- BEGIN(St_SecLabel2);
+<St_Sections>{CMD}"subsubsection"{BLANK}+ {
+ g_secType = SectionType::Subsubsection;
+ BEGIN(St_SecLabel2);
}
-<St_Sections>{CMD}"paragraph"{BLANK}+ {
- g_secType = SectionInfo::Paragraph;
- BEGIN(St_SecLabel2);
+<St_Sections>{CMD}"paragraph"{BLANK}+ {
+ g_secType = SectionType::Paragraph;
+ BEGIN(St_SecLabel2);
}
<St_Sections>{CMD}"verbatim"/[^a-z_A-Z0-9] {
g_endMarker="endverbatim";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"dot"/[^a-z_A-Z0-9] {
g_endMarker="enddot";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"msc"/[^a-z_A-Z0-9] {
g_endMarker="endmsc";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"startuml"/[^a-z_A-Z0-9] {
g_endMarker="enduml";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>{CMD}"htmlonly"/[^a-z_A-Z0-9] {
g_endMarker="endhtmlonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"latexonly"/[^a-z_A-Z0-9] {
g_endMarker="endlatexonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
+ }
+<St_Sections>{CMD}"manonly"/[^a-z_A-Z0-9] {
+ g_endMarker="endmanonly";
+ BEGIN(St_SecSkip);
+ }
+<St_Sections>{CMD}"rtfonly"/[^a-z_A-Z0-9] {
+ g_endMarker="endrtfonly";
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"xmlonly"/[^a-z_A-Z0-9] {
g_endMarker="endxmlonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"docbookonly"/[^a-z_A-Z0-9] {
g_endMarker="enddocbookonly";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"code"/[^a-z_A-Z0-9] {
g_endMarker="endcode";
- BEGIN(St_SecSkip);
- }
+ BEGIN(St_SecSkip);
+ }
<St_Sections>"<!--" {
g_endMarker="-->";
- BEGIN(St_SecSkip);
+ BEGIN(St_SecSkip);
}
-<St_SecSkip>{CMD}{ID} {
+<St_SecSkip>{CMD}{ID} {
if (qstrcmp(yytext+1,g_endMarker)==0)
- {
- BEGIN(St_Sections);
- }
+ {
+ BEGIN(St_Sections);
+ }
}
-<St_SecSkip>"-->" {
+<St_SecSkip>"-->" {
if (qstrcmp(yytext,g_endMarker)==0)
- {
- BEGIN(St_Sections);
- }
+ {
+ BEGIN(St_Sections);
+ }
}
<St_SecSkip>[^a-z_A-Z0-9\-\\\@]+
<St_SecSkip>.
-<St_SecSkip>\n
+<St_SecSkip>(\n|"\\ilinebr")
<St_Sections>.
-<St_Sections>\n
-<St_SecLabel1>{LABELID} {
+<St_Sections>(\n|"\\ilinebr")
+<St_SecLabel1>{LABELID} {
+ lineCount(yytext,yyleng);
g_secLabel = yytext;
processSection();
BEGIN(St_Sections);
}
-<St_SecLabel2>{LABELID}{BLANK}+ |
-<St_SecLabel2>{LABELID} {
+<St_SecLabel2>{LABELID}{BLANK}+ |
+<St_SecLabel2>{LABELID} {
g_secLabel = yytext;
- g_secLabel = g_secLabel.stripWhiteSpace();
+ g_secLabel = g_secLabel.stripWhiteSpace();
BEGIN(St_SecTitle);
}
<St_SecTitle>[^\n]+ |
<St_SecTitle>[^\n]*\n {
+ lineCount(yytext,yyleng);
g_secTitle = yytext;
- g_secTitle = g_secTitle.stripWhiteSpace();
+ g_secTitle = g_secTitle.stripWhiteSpace();
+ if (g_secTitle.right(8)=="\\ilinebr")
+ {
+ g_secTitle.left(g_secTitle.length()-8);
+ }
processSection();
BEGIN(St_Sections);
- }
+ }
<St_SecTitle,St_SecLabel1,St_SecLabel2>. {
- warn(g_fileName,yylineno,"Unexpected character '%s' while looking for section label or title",yytext);
- }
-
-<St_Snippet>[^\n]+ |
-<St_Snippet>[^\n]*\n {
- g_token->name = yytext;
- g_token->name = g_token->name.stripWhiteSpace();
- return TK_WORD;
- }
-
- /* Generic rules that work for all states */
-<*>\n {
- warn(g_fileName,yylineno,"Unexpected new line character");
- }
+ warn(g_fileName,g_yyLineNr,"Unexpected character '%s' while looking for section label or title",yytext);
+ }
+
+<St_Snippet>[^\\\n]+ {
+ g_token->name += yytext;
+ }
+<St_Snippet>"\\" {
+ g_token->name += yytext;
+ }
+<St_Snippet>(\n|"\\ilinebr") {
+ lineCount(yytext,yyleng);
+ g_token->name = g_token->name.stripWhiteSpace();
+ return TK_WORD;
+ }
+
+ /* Generic rules that work for all states */
+<*>\n {
+ lineCount(yytext,yyleng);
+ warn(g_fileName,g_yyLineNr,"Unexpected new line character");
+ }
+<*>"\\ilinebr" {
+ }
<*>[\\@<>&$#%~"=] { /* unescaped special character */
- //warn(g_fileName,yylineno,"Unexpected character '%s', assuming command \\%s was meant.",yytext,yytext);
- g_token->name = yytext;
- return TK_COMMAND_SEL();
+ //warn(g_fileName,g_yyLineNr,"Unexpected character '%s', assuming command \\%s was meant.",yytext,yytext);
+ g_token->name = yytext;
+ return TK_COMMAND_SEL();
+ }
+<*>. {
+ warn(g_fileName,g_yyLineNr,"Unexpected character '%s'",yytext);
}
-<*>. {
- warn(g_fileName,yylineno,"Unexpected character '%s'",yytext);
- }
%%
//--------------------------------------------------------------------------
@@ -1385,18 +1509,19 @@ void doctokenizerYYFindSections(const char *input,const Definition *d,
g_definition = d;
g_fileName = fileName;
BEGIN(St_Sections);
- doctokenizerYYlineno = 1;
+ g_yyLineNr = 1;
doctokenizerYYlex();
printlex(yy_flex_debug, FALSE, __FILE__, fileName);
}
-void doctokenizerYYinit(const char *input,const char *fileName)
+void doctokenizerYYinit(const char *input,const char *fileName,bool markdownSupport)
{
g_autoListLevel = 0;
g_inputString = input;
g_inputPos = 0;
g_fileName = fileName;
g_insidePre = FALSE;
+ g_markdownSupport = markdownSupport;
BEGIN(St_Para);
}
@@ -1514,6 +1639,7 @@ void doctokenizerYYsetStateFile()
void doctokenizerYYsetStatePattern()
{
+ g_token->name = "";
BEGIN(St_Pattern);
}
@@ -1554,6 +1680,7 @@ void doctokenizerYYsetStateAnchor()
void doctokenizerYYsetStateSnippet()
{
+ g_token->name="";
BEGIN(St_Snippet);
}
@@ -1620,4 +1747,17 @@ void doctokenizerYYendAutoList()
// return retval;
//}
+void setDoctokinizerLineNr(int lineno)
+{
+ g_yyLineNr = lineno;
+}
+
+int getDoctokinizerLineNr(void)
+{
+ return g_yyLineNr;
+}
+
+
+#if USE_STATE2STRING
#include "doctokenizer.l.h"
+#endif
diff --git a/src/docvisitor.cpp b/src/docvisitor.cpp
new file mode 100644
index 0000000..d46d8c0
--- /dev/null
+++ b/src/docvisitor.cpp
@@ -0,0 +1,58 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ */
+
+
+#include <unordered_map>
+
+#include "parserintf.h"
+#include "docvisitor.h"
+#include "util.h"
+#include "types.h"
+#include "doxygen.h"
+
+struct DocVisitor::Private
+{
+ int id;
+ std::unordered_map< std::string, std::unique_ptr<CodeParserInterface> > parserFactoryMap;
+};
+
+DocVisitor::DocVisitor(int id) : m_p(std::make_unique<Private>())
+{
+ m_p->id = id;
+}
+
+DocVisitor::~DocVisitor()
+{
+}
+
+CodeParserInterface &DocVisitor::getCodeParser(const char *extension)
+{
+ std::string ext(extension?extension:"");
+ // for each extension we create a code parser once per visitor, so that
+ // the context of the same parser object is reused throughout multiple passes for instance
+ // for code fragments shown via dontinclude.
+ auto it = m_p->parserFactoryMap.find(ext);
+ if (it==m_p->parserFactoryMap.end())
+ {
+ auto factory = Doxygen::parserManager->getCodeParserFactory(extension);
+ auto result = m_p->parserFactoryMap.insert(std::make_pair(ext,factory()));
+ it = result.first;
+ }
+ return *it->second.get();
+}
+
+int DocVisitor::id() const
+{
+ return m_p->id;
+}
diff --git a/src/docvisitor.h b/src/docvisitor.h
index 0a53595..4d4b263 100644
--- a/src/docvisitor.h
+++ b/src/docvisitor.h
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,6 +16,8 @@
#ifndef _DOCVISITOR_H
#define _DOCVISITOR_H
+#include <memory>
+
// ids
const int DocVisitor_Html = 0;
const int DocVisitor_Latex = 1;
@@ -84,18 +83,21 @@ class DocSimpleSectSep;
class DocHtmlBlockQuote;
class DocVhdlFlow;
class DocParBlock;
+class CodeParserInterface;
/*! @brief Abstract visitor that participates in the visitor pattern.
*/
class DocVisitor
{
- int m_id;
+ struct Private;
+ std::unique_ptr<Private> m_p;
public:
- DocVisitor(int id) : m_id(id) {}
- virtual ~DocVisitor() {}
- int id() const { return m_id; }
+ DocVisitor(int id);
+ virtual ~DocVisitor();
+ int id() const;
+ CodeParserInterface &getCodeParser(const char *langExt);
- /*! @name Visitor functions for leaf nodes
+ /*! @name Visitor functions for leaf nodes
* @{
*/
virtual void visit(DocWord *) = 0;
@@ -117,7 +119,7 @@ class DocVisitor
virtual void visit(DocCite *) = 0;
/*! @} */
- /*! @name Visitor functions for internal nodes
+ /*! @name Visitor functions for internal nodes
* @{
*/
virtual void visitPre(DocAutoList *) = 0;
@@ -167,7 +169,7 @@ class DocVisitor
virtual void visitPre(DocDotFile *) = 0;
virtual void visitPost(DocDotFile *) = 0;
virtual void visitPre(DocMscFile *) = 0;
- virtual void visitPost(DocMscFile *) = 0;
+ virtual void visitPost(DocMscFile *) = 0;
virtual void visitPre(DocDiaFile *) = 0;
virtual void visitPost(DocDiaFile *) = 0;
virtual void visitPre(DocLink *) = 0;
diff --git a/src/dot.cpp b/src/dot.cpp
index f26bee4..ddabbc7 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -13,7 +13,8 @@
*
*/
-#include <stdlib.h>
+#include <cstdlib>
+#include <cassert>
#include <qdir.h>
@@ -83,10 +84,14 @@ DotManager *DotManager::instance()
return m_theInstance;
}
-DotManager::DotManager() : m_runners(1009), m_filePatchers(1009)
+void DotManager::deleteInstance()
+{
+ delete m_theInstance;
+ m_theInstance=0;
+}
+
+DotManager::DotManager() : m_runners(), m_filePatchers()
{
- m_runners.setAutoDelete(TRUE);
- m_filePatchers.setAutoDelete(TRUE);
m_queue = new DotRunnerQueue;
int i;
int dotNumThreads = Config_getInt(DOT_NUM_THREADS);
@@ -94,18 +99,17 @@ DotManager::DotManager() : m_runners(1009), m_filePatchers(1009)
{
for (i=0;i<dotNumThreads;i++)
{
- DotWorkerThread *thread = new DotWorkerThread(m_queue);
+ std::unique_ptr<DotWorkerThread> thread = std::make_unique<DotWorkerThread>(m_queue);
thread->start();
if (thread->isRunning())
{
- m_workers.append(thread);
+ m_workers.push_back(std::move(thread));
}
else // no more threads available!
{
- delete thread;
}
}
- ASSERT(m_workers.count()>0);
+ ASSERT(m_workers.size()>0);
}
}
@@ -114,53 +118,56 @@ DotManager::~DotManager()
delete m_queue;
}
-DotRunner* DotManager::createRunner(const QCString& absDotName, const QCString& md5Hash)
+DotRunner* DotManager::createRunner(const std::string &absDotName, const std::string& md5Hash)
{
- DotRunner * run = m_runners.find(absDotName);
- if (run == 0)
+ DotRunner* rv = nullptr;
+ auto const runit = m_runners.find(absDotName);
+ if (runit == m_runners.end())
{
- run = new DotRunner(absDotName, md5Hash);
- m_runners.insert(absDotName, run);
+ auto insobj = std::make_unique<DotRunner>(absDotName, md5Hash);
+ rv = insobj.get();
+ m_runners.emplace(absDotName, std::move(insobj));
}
else
{
// we have a match
- if (md5Hash != QCString(run->getMd5Hash().data()))
+ if (md5Hash != runit->second->getMd5Hash())
{
err("md5 hash does not match for two different runs of %s !\n", absDotName.data());
}
+ rv = runit->second.get();
}
- return run;
+ assert(rv);
+ return rv;
}
-DotFilePatcher *DotManager::createFilePatcher(const QCString &fileName)
+DotFilePatcher *DotManager::createFilePatcher(const std::string &fileName)
{
- DotFilePatcher *patcher = m_filePatchers.find(fileName);
- if (patcher==0)
- {
- patcher = new DotFilePatcher(fileName);
- m_filePatchers.append(fileName,patcher);
- }
- return patcher;
+ auto patcher = m_filePatchers.find(fileName);
+
+ if (patcher != m_filePatchers.end()) return &(patcher->second);
+
+ auto rv = m_filePatchers.emplace(fileName, fileName.c_str());
+ assert(rv.second);
+ return &(rv.first->second);
}
bool DotManager::run() const
{
- uint numDotRuns = m_runners.count();
- uint numFilePatchers = m_filePatchers.count();
+ size_t numDotRuns = m_runners.size();
+ size_t numFilePatchers = m_filePatchers.size();
if (numDotRuns+numFilePatchers>1)
{
- if (m_workers.count()==0)
+ if (m_workers.size()==0)
{
msg("Generating dot graphs in single threaded mode...\n");
}
else
{
- msg("Generating dot graphs using %d parallel threads...\n",QMIN(numDotRuns+numFilePatchers,m_workers.count()));
+ msg("Generating dot graphs using %zu parallel threads...\n",QMIN(numDotRuns+numFilePatchers,m_workers.size()));
}
}
- int i=1;
- QDictIterator<DotRunner> li(m_runners);
+ size_t i=1;
bool setPath=FALSE;
if (Config_getBool(GENERATE_HTML))
@@ -185,46 +192,45 @@ bool DotManager::run() const
}
Portable::sysTimerStart();
// fill work queue with dot operations
- DotRunner *dr;
- int prev=1;
- if (m_workers.count()==0) // no threads to work with
+ size_t prev=1;
+ if (m_workers.size()==0) // no threads to work with
{
- for (li.toFirst();(dr=li.current());++li)
+ for (auto & dr : m_runners)
{
- msg("Running dot for graph %d/%d\n",prev,numDotRuns);
- dr->run();
+ msg("Running dot for graph %zu/%zu\n",prev,numDotRuns);
+ dr.second->run();
prev++;
}
}
else // use multiple threads to run instances of dot in parallel
{
- for (li.toFirst();(dr=li.current());++li)
+ for (auto & dr: m_runners)
{
- m_queue->enqueue(dr);
+ m_queue->enqueue(dr.second.get());
}
// wait for the queue to become empty
- while ((i=m_queue->count())>0)
+ while ((i=m_queue->size())>0)
{
i = numDotRuns - i;
while (i>=prev)
{
- msg("Running dot for graph %d/%d\n",prev,numDotRuns);
+ msg("Running dot for graph %zu/%zu\n",prev,numDotRuns);
prev++;
}
Portable::sleep(100);
}
- while ((int)numDotRuns>=prev)
+ while (numDotRuns>=prev)
{
- msg("Running dot for graph %d/%d\n",prev,numDotRuns);
+ msg("Running dot for graph %zu/%zu\n",prev,numDotRuns);
prev++;
}
// signal the workers we are done
- for (i=0;i<(int)m_workers.count();i++)
+ for (i=0;i<m_workers.size();i++)
{
m_queue->enqueue(0); // add terminator for each worker
}
// wait for the workers to finish
- for (i=0;i<(int)m_workers.count();i++)
+ for (i=0;i<m_workers.size();i++)
{
m_workers.at(i)->wait();
}
@@ -237,27 +243,25 @@ bool DotManager::run() const
// patch the output file and insert the maps and figures
i=1;
- SDict<DotFilePatcher>::Iterator di(m_filePatchers);
- const DotFilePatcher *fp;
// since patching the svg files may involve patching the header of the SVG
// (for zoomable SVGs), and patching the .html files requires reading that
- // header after the SVG is patched, we first process the .svg files and
- // then the other files.
- for (di.toFirst();(fp=di.current());++di)
+ // header after the SVG is patched, we first process the .svg files and
+ // then the other files.
+ for (auto & fp : m_filePatchers)
{
- if (fp->isSVGFile())
+ if (fp.second.isSVGFile())
{
- msg("Patching output file %d/%d\n",i,numFilePatchers);
- if (!fp->run()) return FALSE;
+ msg("Patching output file %zu/%zu\n",i,numFilePatchers);
+ if (!fp.second.run()) return FALSE;
i++;
}
}
- for (di.toFirst();(fp=di.current());++di)
+ for (auto& fp : m_filePatchers)
{
- if (!fp->isSVGFile())
+ if (!fp.second.isSVGFile())
{
- msg("Patching output file %d/%d\n",i,numFilePatchers);
- if (!fp->run()) return FALSE;
+ msg("Patching output file %zu/%zu\n",i,numFilePatchers);
+ if (!fp.second.run()) return FALSE;
i++;
}
}
@@ -280,7 +284,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
QCString absImgName = d.absPath().utf8()+"/"+imgName;
QCString absOutFile = d.absPath().utf8()+"/"+outFile;
- DotRunner dotRun(inFile, QCString());
+ DotRunner dotRun(inFile);
if (format==GOF_BITMAP)
{
dotRun.addJob(Config_getEnum(DOT_IMAGE_FORMAT),absImgName);
@@ -333,7 +337,7 @@ void writeDotImageMapFromFile(FTextStream &t,
QCString imgName = baseName+"."+imgExt;
QCString absOutFile = d.absPath().utf8()+"/"+mapName;
- DotRunner dotRun(inFile, QCString());
+ DotRunner dotRun(inFile.data());
dotRun.addJob(MAP_CMD,absOutFile);
dotRun.preventCleanUp();
if (!dotRun.run())
diff --git a/src/dot.h b/src/dot.h
index 60f7f26..d14c38a 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -16,9 +16,8 @@
#ifndef DOT_H
#define DOT_H
-#include <qlist.h>
-#include <qdict.h>
#include <qcstring.h>
+#include <map>
#include "sortdict.h"
@@ -35,19 +34,20 @@ class DotManager
{
public:
static DotManager *instance();
- DotRunner* createRunner(const QCString& absDotName, const QCString& md5Hash);
- DotFilePatcher *createFilePatcher(const QCString &fileName);
+ static void deleteInstance();
+ DotRunner* createRunner(const std::string& absDotName, const std::string& md5Hash);
+ DotFilePatcher *createFilePatcher(const std::string &fileName);
bool run() const;
private:
DotManager();
virtual ~DotManager();
- QDict<DotRunner> m_runners;
- SDict<DotFilePatcher> m_filePatchers;
+ std::map<std::string, std::unique_ptr<DotRunner>> m_runners;
+ std::map<std::string, DotFilePatcher> m_filePatchers;
static DotManager *m_theInstance;
DotRunnerQueue *m_queue;
- QList<DotWorkerThread> m_workers;
+ std::vector< std::unique_ptr<DotWorkerThread> > m_workers;
};
void writeDotGraphFromFile(const char *inFile,const char *outDir,
diff --git a/src/dotcallgraph.cpp b/src/dotcallgraph.cpp
index 5e13f8e..cbd62ef 100644
--- a/src/dotcallgraph.cpp
+++ b/src/dotcallgraph.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
-* Copyright (C) 1997-2019 by Dimitri van Heesch.
+* Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -20,10 +20,6 @@
#include "config.h"
#include "util.h"
-#define HIDE_SCOPE_NAMES Config_getBool(HIDE_SCOPE_NAMES)
-#define DOT_GRAPH_MAX_NODES Config_getInt(DOT_GRAPH_MAX_NODES)
-#define MAX_DOT_GRAPH_DEPTH Config_getInt(MAX_DOT_GRAPH_DEPTH)
-
static QCString getUniqueId(const MemberDef *md)
{
QCString result = md->getReference()+"$"+
@@ -34,51 +30,45 @@ static QCString getUniqueId(const MemberDef *md)
void DotCallGraph::buildGraph(DotNode *n,const MemberDef *md,int distance)
{
- MemberSDict *refs = m_inverse ? md->getReferencedByMembers() : md->getReferencesMembers();
- if (refs)
+ auto refs = m_inverse ? md->getReferencedByMembers() : md->getReferencesMembers();
+ for (const auto &rmd : refs)
{
- refs->sort();
- MemberSDict::Iterator mri(*refs);
- MemberDef *rmd;
- for (;(rmd=mri.current());++mri)
+ if (rmd->showInCallGraph())
{
- if (rmd->showInCallGraph())
+ QCString uniqueId = getUniqueId(rmd);
+ 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
{
- QCString uniqueId = getUniqueId(rmd);
- DotNode *bn = m_usedNodes->find(uniqueId);
- if (bn) // file is already a node in the graph
+ QCString name;
+ if (Config_getBool(HIDE_SCOPE_NAMES))
{
- n->addChild(bn,0,0,0);
- bn->addParent(n);
- bn->setDistance(distance);
+ name = rmd->getOuterScope()==m_scope ?
+ rmd->name() : rmd->qualifiedName();
}
else
{
- QCString name;
- if (HIDE_SCOPE_NAMES)
- {
- name = rmd->getOuterScope()==m_scope ?
- rmd->name() : rmd->qualifiedName();
- }
- else
- {
- name = rmd->qualifiedName();
- }
- QCString tooltip = rmd->briefDescriptionAsTooltip();
- bn = new DotNode(
+ name = rmd->qualifiedName();
+ }
+ QCString tooltip = rmd->briefDescriptionAsTooltip();
+ bn = new DotNode(
getNextNodeNumber(),
linkToText(rmd->getLanguage(),name,FALSE),
tooltip,
uniqueId,
0 //distance
- );
- n->addChild(bn,0,0,0);
- bn->addParent(n);
- bn->setDistance(distance);
- m_usedNodes->insert(uniqueId,bn);
+ );
+ n->addChild(bn,0,0,0);
+ bn->addParent(n);
+ bn->setDistance(distance);
+ m_usedNodes->insert(uniqueId,bn);
- buildGraph(bn,rmd,distance+1);
- }
+ buildGraph(bn,rmd,distance+1);
}
}
}
@@ -89,7 +79,7 @@ void DotCallGraph::determineVisibleNodes(QList<DotNode> &queue, int &maxNodes)
while (queue.count()>0 && maxNodes>0)
{
DotNode *n = queue.take(0);
- if (!n->isVisible() && n->distance()<=MAX_DOT_GRAPH_DEPTH) // not yet processed
+ if (!n->isVisible() && n->distance()<=Config_getInt(MAX_DOT_GRAPH_DEPTH)) // not yet processed
{
n->markAsVisible();
maxNodes--;
@@ -121,9 +111,9 @@ void DotCallGraph::determineTruncatedNodes(QList<DotNode> &queue)
const DotNode *dn;
for (li.toFirst();(dn=li.current());++li)
{
- if (!dn->isVisible())
+ if (!dn->isVisible())
truncated = TRUE;
- else
+ else
queue.append(dn);
}
}
@@ -139,7 +129,7 @@ DotCallGraph::DotCallGraph(const MemberDef *md,bool inverse)
m_scope = md->getOuterScope();
QCString uniqueId = getUniqueId(md);
QCString name;
- if (HIDE_SCOPE_NAMES)
+ if (Config_getBool(HIDE_SCOPE_NAMES))
{
name = md->name();
}
@@ -159,7 +149,7 @@ DotCallGraph::DotCallGraph(const MemberDef *md,bool inverse)
m_usedNodes->insert(uniqueId,m_startNode);
buildGraph(m_startNode,md,1);
- int maxNodes = DOT_GRAPH_MAX_NODES;
+ int maxNodes = Config_getInt(DOT_GRAPH_MAX_NODES);
QList<DotNode> openNodeQueue;
openNodeQueue.append(m_startNode);
determineVisibleNodes(openNodeQueue,maxNodes);
@@ -198,7 +188,7 @@ QCString DotCallGraph::getMapLabel() const
}
QCString DotCallGraph::writeGraph(
- FTextStream &out,
+ FTextStream &out,
GraphOutputFormat graphFormat,
EmbeddedOutputFormat textFormat,
const char *path,
@@ -216,7 +206,7 @@ bool DotCallGraph::isTrivial() const
bool DotCallGraph::isTooBig() const
{
- return numNodes()>=DOT_GRAPH_MAX_NODES;
+ return numNodes()>=Config_getInt(DOT_GRAPH_MAX_NODES);
}
int DotCallGraph::numNodes() const
diff --git a/src/dotclassgraph.cpp b/src/dotclassgraph.cpp
index da272b4..be318e4 100644
--- a/src/dotclassgraph.cpp
+++ b/src/dotclassgraph.cpp
@@ -13,18 +13,13 @@
*
*/
+#include "containers.h"
#include "dotclassgraph.h"
#include "dotnode.h"
#include "config.h"
#include "util.h"
-#define HIDE_SCOPE_NAMES Config_getBool(HIDE_SCOPE_NAMES)
-#define MAX_DOT_GRAPH_DEPTH Config_getInt(MAX_DOT_GRAPH_DEPTH)
-#define UML_LOOK Config_getBool(UML_LOOK)
-#define TEMPLATE_RELATIONS Config_getBool(TEMPLATE_RELATIONS)
-#define DOT_GRAPH_MAX_NODES Config_getInt(DOT_GRAPH_MAX_NODES)
-
void DotClassGraph::addClass(const ClassDef *cd,DotNode *n,int prot,
const char *label,const char *usedName,const char *templSpec,bool base,int distance)
{
@@ -43,7 +38,7 @@ void DotClassGraph::addClass(const ClassDef *cd,DotNode *n,int prot,
}
else if (templSpec) // name has a template part
{
- className=insertTemplateSpecifierInScope(cd->name(),templSpec);
+ className=insertTemplateSpecifierInScope(cd->displayName(),templSpec);
}
else // just a normal name
{
@@ -70,9 +65,9 @@ void DotClassGraph::addClass(const ClassDef *cd,DotNode *n,int prot,
else // new class
{
QCString displayName=className;
- if (HIDE_SCOPE_NAMES) displayName=stripScope(displayName);
+ if (Config_getBool(HIDE_SCOPE_NAMES)) displayName=stripScope(displayName);
QCString tmp_url;
- if (cd->isLinkable() && !cd->isHidden())
+ if (cd->isLinkable() && !cd->isHidden())
{
tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
if (!cd->anchor().isEmpty())
@@ -121,9 +116,9 @@ void DotClassGraph::determineTruncatedNodes(QList<DotNode> &queue,bool includePa
const DotNode *dn;
for (li.toFirst();(dn=li.current());++li)
{
- if (!dn->isVisible())
+ if (!dn->isVisible())
truncated = TRUE;
- else
+ else
queue.append(dn);
}
}
@@ -133,9 +128,9 @@ void DotClassGraph::determineTruncatedNodes(QList<DotNode> &queue,bool includePa
const DotNode *dn;
for (li.toFirst();(dn=li.current());++li)
{
- if (!dn->isVisible())
+ if (!dn->isVisible())
truncated = TRUE;
- else
+ else
queue.append(dn);
}
}
@@ -149,11 +144,11 @@ bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
{
QList<DotNode> childQueue;
QList<DotNode> parentQueue;
- QArray<int> childTreeWidth;
- QArray<int> parentTreeWidth;
+ IntVector childTreeWidth;
+ IntVector parentTreeWidth;
childQueue.append(rootNode);
if (includeParents) parentQueue.append(rootNode);
- bool firstNode=TRUE; // flag to force reprocessing rootNode in the parent loop
+ bool firstNode=TRUE; // flag to force reprocessing rootNode in the parent loop
// despite being marked visible in the child loop
while ((childQueue.count()>0 || parentQueue.count()>0) && maxNodes>0)
{
@@ -161,7 +156,7 @@ bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
{
DotNode *n = childQueue.take(0);
int distance = n->distance();
- if (!n->isVisible() && distance<=MAX_DOT_GRAPH_DEPTH) // not yet processed
+ if (!n->isVisible() && distance<=Config_getInt(MAX_DOT_GRAPH_DEPTH)) // not yet processed
{
if (distance>0)
{
@@ -190,7 +185,7 @@ bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
if (includeParents && parentQueue.count()>0)
{
DotNode *n = parentQueue.take(0);
- if ((!n->isVisible() || firstNode) && n->distance()<=MAX_DOT_GRAPH_DEPTH) // not yet processed
+ if ((!n->isVisible() || firstNode) && n->distance()<=Config_getInt(MAX_DOT_GRAPH_DEPTH)) // not yet processed
{
firstNode=FALSE;
int distance = n->distance();
@@ -219,7 +214,7 @@ bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
}
}
}
- if (UML_LOOK) return FALSE; // UML graph are always top to bottom
+ if (Config_getBool(UML_LOOK)) return FALSE; // UML graph are always top to bottom
int maxWidth=0;
int maxHeight=(int)QMAX(childTreeWidth.size(),parentTreeWidth.size());
uint i;
@@ -238,6 +233,25 @@ bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
// left to right order.
}
+static QCString joinLabels(const StringSet &ss)
+{
+ QCString label;
+ int count=1;
+ int maxLabels=10;
+ auto it = std::begin(ss), e = std::end(ss);
+ if (it!=e) // set not empty
+ {
+ label += (*it++).c_str();
+ for (; it!=e && count < maxLabels ; ++it,++count)
+ {
+ label += '\n';
+ label += (*it).c_str();
+ }
+ if (count==maxLabels) label+="\n...";
+ }
+ return label;
+}
+
void DotClassGraph::buildGraph(const ClassDef *cd,DotNode *n,bool base,int distance)
{
//printf("DocClassGraph::buildGraph(%s,distance=%d,base=%d)\n",
@@ -246,18 +260,11 @@ void DotClassGraph::buildGraph(const ClassDef *cd,DotNode *n,bool base,int dista
if (m_graphType == Inheritance || m_graphType==Collaboration)
{
- BaseClassList *bcl = base ? cd->baseClasses() : cd->subClasses();
- if (bcl)
+ for (const auto &bcd : base ? cd->baseClasses() : cd->subClasses())
{
- BaseClassListIterator bcli(*bcl);
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
- {
- //printf("-------- inheritance relation %s->%s templ='%s'\n",
- // cd->name().data(),bcd->classDef->name().data(),bcd->templSpecifiers.data());
- addClass(bcd->classDef,n,bcd->prot,0,bcd->usedName,
- bcd->templSpecifiers,base,distance);
- }
+ //printf("-------- inheritance relation %s->%s templ='%s'\n",
+ // cd->name().data(),bcd->classDef->name().data(),bcd->templSpecifiers.data());
+ addClass(bcd.classDef,n,bcd.prot,0,bcd.usedName,bcd.templSpecifiers,base,distance);
}
}
if (m_graphType == Collaboration)
@@ -274,32 +281,13 @@ void DotClassGraph::buildGraph(const ClassDef *cd,DotNode *n,bool base,int dista
UsesClassDef *ucd;
for (;(ucd=ucdi.current());++ucdi)
{
- QCString label;
- QDictIterator<void> dvi(*ucd->accessors);
- const char *s;
- bool first=TRUE;
- int count=0;
- int maxLabels=10;
- for (;(s=dvi.currentKey()) && count<maxLabels;++dvi,++count)
- {
- if (first)
- {
- label=s;
- first=FALSE;
- }
- else
- {
- label+=QCString("\n")+s;
- }
- }
- if (count==maxLabels) label+="\n...";
//printf("addClass: %s templSpec=%s\n",ucd->classDef->name().data(),ucd->templSpecifiers.data());
- addClass(ucd->classDef,n,EdgeInfo::Purple,label,0,
+ addClass(ucd->classDef,n,EdgeInfo::Purple,joinLabels(ucd->accessors),0,
ucd->templSpecifiers,base,distance);
}
}
}
- if (TEMPLATE_RELATIONS && base)
+ if (Config_getBool(TEMPLATE_RELATIONS) && base)
{
ConstraintClassDict *dict = cd->templateTypeConstraints();
if (dict)
@@ -308,27 +296,8 @@ void DotClassGraph::buildGraph(const ClassDef *cd,DotNode *n,bool base,int dista
ConstraintClassDef *ccd;
for (;(ccd=ccdi.current());++ccdi)
{
- QCString label;
- QDictIterator<void> dvi(*ccd->accessors);
- const char *s;
- bool first=TRUE;
- int count=0;
- int maxLabels=10;
- for (;(s=dvi.currentKey()) && count<maxLabels;++dvi,++count)
- {
- if (first)
- {
- label=s;
- first=FALSE;
- }
- else
- {
- label+=QCString("\n")+s;
- }
- }
- if (count==maxLabels) label+="\n...";
//printf("addClass: %s templSpec=%s\n",ucd->classDef->name().data(),ucd->templSpecifiers.data());
- addClass(ccd->classDef,n,EdgeInfo::Orange2,label,0,
+ addClass(ccd->classDef,n,EdgeInfo::Orange2,joinLabels(ccd->accessors),0,
0,TRUE,distance);
}
}
@@ -336,7 +305,7 @@ void DotClassGraph::buildGraph(const ClassDef *cd,DotNode *n,bool base,int dista
// ---- Add template instantiation relations
- if (TEMPLATE_RELATIONS)
+ if (Config_getBool(TEMPLATE_RELATIONS))
{
if (base) // template relations for base classes
{
@@ -377,7 +346,7 @@ DotClassGraph::DotClassGraph(const ClassDef *cd,GraphType t)
//printf("--------------- DotClassGraph::DotClassGraph '%s'\n",cd->displayName().data());
m_graphType = t;
QCString tmp_url="";
- if (cd->isLinkable() && !cd->isHidden())
+ if (cd->isLinkable() && !cd->isHidden())
{
tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
if (!cd->anchor().isEmpty())
@@ -401,7 +370,7 @@ DotClassGraph::DotClassGraph(const ClassDef *cd,GraphType t)
buildGraph(cd,m_startNode,TRUE,1);
if (t==Inheritance) buildGraph(cd,m_startNode,FALSE,1);
- m_lrRank = determineVisibleNodes(m_startNode,DOT_GRAPH_MAX_NODES,t==Inheritance);
+ m_lrRank = determineVisibleNodes(m_startNode,Config_getInt(DOT_GRAPH_MAX_NODES),t==Inheritance);
QList<DotNode> openNodeQueue;
openNodeQueue.append(m_startNode);
determineTruncatedNodes(openNodeQueue,t==Inheritance);
@@ -415,12 +384,12 @@ bool DotClassGraph::isTrivial() const
if (m_graphType==Inheritance)
return m_startNode->children()==0 && m_startNode->parents()==0;
else
- return !UML_LOOK && m_startNode->children()==0;
+ return !Config_getBool(UML_LOOK) && m_startNode->children()==0;
}
bool DotClassGraph::isTooBig() const
{
- return numNodes()>=DOT_GRAPH_MAX_NODES;
+ return numNodes()>=Config_getInt(DOT_GRAPH_MAX_NODES);
}
int DotClassGraph::numNodes() const
@@ -490,7 +459,7 @@ QCString DotClassGraph::getMapLabel() const
return escapeCharsInString(m_startNode->label(),FALSE)+"_"+escapeCharsInString(mapName,FALSE);
}
-QCString DotClassGraph::getImgAltText() const
+QCString DotClassGraph::getImgAltText() const
{
switch (m_graphType)
{
@@ -504,7 +473,7 @@ QCString DotClassGraph::getImgAltText() const
ASSERT(0);
break;
}
- return "";
+ return "";
}
QCString DotClassGraph::writeGraph(FTextStream &out,
diff --git a/src/dotdirdeps.cpp b/src/dotdirdeps.cpp
index c70128c..da6364f 100644
--- a/src/dotdirdeps.cpp
+++ b/src/dotdirdeps.cpp
@@ -20,6 +20,30 @@
#include "doxygen.h"
#include "config.h"
+/**
+ * Puts DOT code for drawing directory to stream and adds it to the list.
+ * @param[in,out] outStream stream to which the DOT code is written to
+ * @param[in] directory will be mapped to a node in DOT code
+ * @param[in] fillBackground if the node shall be explicitly filled
+ * @param[in,out] directoriesInGraph lists the directories which have been written to the output stream
+ */
+static void drawDirectory(FTextStream &outStream, const DirDef *const directory, const bool fillBackground,
+ QDict<DirDef> &directoriesInGraph)
+{
+ outStream << " " << directory->getOutputFileBase() << " [shape=box "
+ "label=\"" << directory->shortName() << "\" ";
+ if (fillBackground)
+ {
+ outStream << "fillcolor=\"white\" style=\"filled\" ";
+ }
+ if (directory->isCluster())
+ {
+ outStream << "color=\"red\" ";
+ }
+ outStream << "URL=\"" << directory->getOutputFileBase() << Doxygen::htmlFileExtension << "\"];\n";
+ directoriesInGraph.insert(directory->getOutputFileBase(), directory);
+}
+
void writeDotDirDepGraph(FTextStream &t,const DirDef *dd,bool linkRelations)
{
int fontSize = Config_getInt(DOT_FONTSIZE);
@@ -36,52 +60,59 @@ void writeDotDirDepGraph(FTextStream &t,const DirDef *dd,bool linkRelations)
QDict<DirDef> dirsInGraph(257);
dirsInGraph.insert(dd->getOutputFileBase(),dd);
- if (dd->parent())
+
+ std::vector<const DirDef *> usedDirsNotDrawn;
+ for(const auto& usedDir : dd->usedDirs())
+ {
+ usedDirsNotDrawn.push_back(usedDir->dir());
+ }
+
+ const auto parent = dd->parent();
+ if (parent)
{
t << " subgraph cluster" << dd->parent()->getOutputFileBase() << " {\n";
- t << " graph [ bgcolor=\"#ddddee\", pencolor=\"black\", label=\""
- << dd->parent()->shortName()
+ t << " graph [ bgcolor=\"#ddddee\", pencolor=\"black\", label=\""
+ << dd->parent()->shortName()
<< "\" fontname=\"" << fontName << "\", fontsize=\"" << fontSize << "\", URL=\"";
t << dd->parent()->getOutputFileBase() << Doxygen::htmlFileExtension;
t << "\"]\n";
+
+ {
+ // draw all directories which have `dd->parent()` as parent and `dd` as dependent
+ const auto newEnd = std::remove_if(usedDirsNotDrawn.begin(), usedDirsNotDrawn.end(), [&](const DirDef *const usedDir)
+ {
+ if (dd!=usedDir && dd->parent()==usedDir->parent())
+ {
+ drawDirectory(t, usedDir, usedDir->isCluster() && !Config_getBool(DOT_TRANSPARENT), dirsInGraph);
+ return true;
+ }
+ return false;
+ }
+ );
+ usedDirsNotDrawn.erase(newEnd, usedDirsNotDrawn.end());
+ }
}
if (dd->isCluster())
{
t << " subgraph cluster" << dd->getOutputFileBase() << " {\n";
t << " graph [ bgcolor=\"#eeeeff\", pencolor=\"black\", label=\"\""
- << " URL=\"" << dd->getOutputFileBase() << Doxygen::htmlFileExtension
+ << " URL=\"" << dd->getOutputFileBase() << Doxygen::htmlFileExtension
<< "\"];\n";
- t << " " << dd->getOutputFileBase() << " [shape=plaintext label=\""
+ t << " " << dd->getOutputFileBase() << " [shape=plaintext label=\""
<< dd->shortName() << "\"];\n";
// add nodes for sub directories
- QListIterator<DirDef> sdi(dd->subDirs());
- const DirDef *sdir;
- for (sdi.toFirst();(sdir=sdi.current());++sdi)
+ for(const auto sdir : dd->subDirs())
{
- t << " " << sdir->getOutputFileBase() << " [shape=box label=\""
- << sdir->shortName() << "\"";
- if (sdir->isCluster())
- {
- t << " color=\"red\"";
- }
- else
- {
- t << " color=\"black\"";
- }
- t << " fillcolor=\"white\" style=\"filled\"";
- t << " URL=\"" << sdir->getOutputFileBase()
- << Doxygen::htmlFileExtension << "\"";
- t << "];\n";
- dirsInGraph.insert(sdir->getOutputFileBase(),sdir);
+ drawDirectory(t, sdir, true, dirsInGraph);
}
t << " }\n";
}
else
{
- t << " " << dd->getOutputFileBase() << " [shape=box, label=\""
+ t << " " << dd->getOutputFileBase() << " [shape=box, label=\""
<< dd->shortName() << "\", style=\"filled\", fillcolor=\"#eeeeff\","
- << " pencolor=\"black\", URL=\"" << dd->getOutputFileBase()
+ << " pencolor=\"black\", URL=\"" << dd->getOutputFileBase()
<< Doxygen::htmlFileExtension << "\"];\n";
}
if (dd->parent())
@@ -90,54 +121,38 @@ void writeDotDirDepGraph(FTextStream &t,const DirDef *dd,bool linkRelations)
}
// add nodes for other used directories
- QDictIterator<UsedDir> udi(*dd->usedDirs());
- UsedDir *udir;
- //printf("*** For dir %s\n",shortName().data());
- for (udi.toFirst();(udir=udi.current());++udi)
- // for each used dir (=directly used or a parent of a directly used dir)
{
- const DirDef *usedDir=udir->dir();
- const DirDef *dir=dd;
- while (dir)
+ //printf("*** For dir %s\n",shortName().data());
+ for (const auto &usedDir : usedDirsNotDrawn)
+ // for each used dir (=directly used or a parent of a directly used dir)
{
- //printf("*** check relation %s->%s same_parent=%d !%s->isParentOf(%s)=%d\n",
- // dir->shortName().data(),usedDir->shortName().data(),
- // dir->parent()==usedDir->parent(),
- // usedDir->shortName().data(),
- // shortName().data(),
- // !usedDir->isParentOf(this)
- // );
- if (dir!=usedDir && dir->parent()==usedDir->parent() &&
- !usedDir->isParentOf(dd))
- // include if both have the same parent (or no parent)
+ const DirDef *dir=dd;
+ while (dir)
{
- t << " " << usedDir->getOutputFileBase() << " [shape=box label=\""
- << usedDir->shortName() << "\"";
- if (usedDir->isCluster())
+ //printf("*** check relation %s->%s same_parent=%d !%s->isParentOf(%s)=%d\n",
+ // dir->shortName().data(),usedDir->shortName().data(),
+ // dir->parent()==usedDir->parent(),
+ // usedDir->shortName().data(),
+ // shortName().data(),
+ // !usedDir->isParentOf(this)
+ // );
+ if (dir!=usedDir && dir->parent()==usedDir->parent())
+ // include if both have the same parent (or no parent)
{
- if (!Config_getBool(DOT_TRANSPARENT))
- {
- t << " fillcolor=\"white\" style=\"filled\"";
- }
- t << " color=\"red\"";
+ drawDirectory(t, usedDir, usedDir->isCluster() && !Config_getBool(DOT_TRANSPARENT), dirsInGraph);
+ break;
}
- t << " URL=\"" << usedDir->getOutputFileBase()
- << Doxygen::htmlFileExtension << "\"];\n";
- dirsInGraph.insert(usedDir->getOutputFileBase(),usedDir);
- break;
+ dir=dir->parent();
}
- dir=dir->parent();
}
}
// add relations between all selected directories
const DirDef *dir;
QDictIterator<DirDef> di(dirsInGraph);
- for (di.toFirst();(dir=di.current());++di) // foreach dir in the graph
+ for (;(dir=di.current());++di) // foreach dir in the graph
{
- QDictIterator<UsedDir> udi(*dir->usedDirs());
- UsedDir *udir;
- for (udi.toFirst();(udir=udi.current());++udi) // foreach used dir
+ for (const auto &udir : dir->usedDirs())
{
const DirDef *usedDir=udir->dir();
if ((dir!=dd || !udir->inherited()) && // only show direct dependencies for this dir
@@ -147,12 +162,9 @@ void writeDotDirDepGraph(FTextStream &t,const DirDef *dd,bool linkRelations)
{
QCString relationName;
relationName.sprintf("dir_%06d_%06d",dir->dirCount(),usedDir->dirCount());
- if (Doxygen::dirRelations.find(relationName)==0)
- {
- // new relation
- Doxygen::dirRelations.append(relationName,
- new DirRelation(relationName,dir,udir));
- }
+ Doxygen::dirRelations.add(relationName,
+ std::make_unique<DirRelation>(
+ relationName,dir,udir.get()));
int nrefs = udir->filePairs().count();
t << " " << dir->getOutputFileBase() << "->"
<< usedDir->getOutputFileBase();
diff --git a/src/dotfilepatcher.cpp b/src/dotfilepatcher.cpp
index efc6341..285c0bb 100644
--- a/src/dotfilepatcher.cpp
+++ b/src/dotfilepatcher.cpp
@@ -132,7 +132,7 @@ static QCString replaceRef(const QCString &buf,const QCString relPath,
//bool isXLink=FALSE;
int len = 6;
int indexS = buf.find("href=\""), indexE;
- bool setTarget = FALSE;
+ bool targetAlreadySet = buf.find("target=")!=-1;
if (indexS>5 && buf.find("xlink:href=\"")!=-1) // XLink href (for SVG)
{
indexS-=6;
@@ -152,9 +152,9 @@ static QCString replaceRef(const QCString &buf,const QCString relPath,
// fake ref node to resolve the url
DocRef *df = new DocRef( (DocNode*) 0, link.mid(5), context );
result+=externalRef(relPath,df->ref(),TRUE);
- if (!df->file().isEmpty())
+ if (!df->file().isEmpty())
result += df->file().data() + Doxygen::htmlFileExtension;
- if (!df->anchor().isEmpty())
+ if (!df->anchor().isEmpty())
result += "#" + df->anchor();
delete df;
result += "\"";
@@ -173,8 +173,8 @@ static QCString replaceRef(const QCString &buf,const QCString relPath,
QCString url = link.mid(marker+1);
if (!ref.isEmpty())
{
- result = externalLinkTarget();
- if (result != "") setTarget = TRUE;
+ result = externalLinkTarget(true);
+ if (!result.isEmpty())targetAlreadySet=true;
}
result+= href+"=\"";
result+=externalRef(relPath,ref,TRUE);
@@ -185,12 +185,14 @@ static QCString replaceRef(const QCString &buf,const QCString relPath,
result = href+"=\"" + link + "\"";
}
}
- if (!target.isEmpty() && !setTarget)
+ if (!target.isEmpty() && !targetAlreadySet)
{
result+=" target=\""+target+"\"";
}
QCString leftPart = buf.left(indexS);
QCString rightPart = buf.mid(indexE+1);
+ //printf("replaceRef(\n'%s'\n)->\n'%s+%s+%s'\n",
+ // buf.data(),leftPart.data(),result.data(),rightPart.data());
return leftPart + result + rightPart;
}
else
@@ -215,7 +217,7 @@ bool DotFilePatcher::convertMapFile(FTextStream &t,const char *mapName,
const QCString &context)
{
QFile f(mapName);
- if (!f.open(IO_ReadOnly))
+ if (!f.open(IO_ReadOnly))
{
err("problems opening map file %s for inclusion in the docs!\n"
"If you installed Graphviz/dot after a previous failing run, \n"
@@ -250,7 +252,7 @@ bool DotFilePatcher::convertMapFile(FTextStream &t,const char *mapName,
return TRUE;
}
-DotFilePatcher::DotFilePatcher(const char *patchFile)
+DotFilePatcher::DotFilePatcher(const char *patchFile)
: m_patchFile(patchFile)
{
m_maps.setAutoDelete(TRUE);
@@ -346,7 +348,7 @@ bool DotFilePatcher::run() const
}
QFile fi(tmpName);
QFile fo(patchFile);
- if (!fi.open(IO_ReadOnly))
+ if (!fi.open(IO_ReadOnly))
{
err("problem opening file %s for patching!\n",tmpName.data());
QDir::current().rename(tmpName,patchFile);
@@ -380,7 +382,7 @@ bool DotFilePatcher::run() const
ASSERT(numBytes<maxLineLen);
if (isSVGFile)
{
- if (interactiveSVG_local)
+ if (interactiveSVG_local)
{
if (line.find("<svg")!=-1 && !replacedHeader)
{
@@ -412,7 +414,7 @@ bool DotFilePatcher::run() const
replacedHeader=TRUE;
}
}
- if (!insideHeader || !foundSize) // copy SVG and replace refs,
+ if (!insideHeader || !foundSize) // copy SVG and replace refs,
// unless we are inside the header of the SVG.
// Then we replace it with another header.
{
@@ -459,7 +461,7 @@ bool DotFilePatcher::run() const
convertMapFile(tt,map->mapFile,map->relPath,map->urlOnly,map->context);
if (!result.isEmpty())
{
- t << "<map name=\"" << map->label << "\" id=\"" << map->label << "\">" << endl;
+ t << "<map name=\"" << correctId(map->label) << "\" id=\"" << correctId(map->label) << "\">" << endl;
t << result;
t << "</map>" << endl;
}
@@ -506,9 +508,9 @@ bool DotFilePatcher::run() const
fo.close();
// keep original SVG file so we can refer to it, we do need to replace
// dummy link by real ones
- QFile fi(tmpName);
- QFile fo(orgName);
- if (!fi.open(IO_ReadOnly))
+ fi.setName(tmpName);
+ fo.setName(orgName);
+ if (!fi.open(IO_ReadOnly))
{
err("problem opening file %s for reading!\n",tmpName.data());
return FALSE;
@@ -518,7 +520,7 @@ bool DotFilePatcher::run() const
err("problem opening file %s for writing!\n",orgName.data());
return FALSE;
}
- FTextStream t(&fo);
+ FTextStream to(&fo);
while (!fi.atEnd()) // foreach line
{
QCString line(maxLineLen);
@@ -529,7 +531,7 @@ bool DotFilePatcher::run() const
}
line.resize(numBytes+1);
Map *map = m_maps.at(0); // there is only one 'map' for a SVG file
- t << replaceRef(line,map->relPath,map->urlOnly,map->context,"_top");
+ to << replaceRef(line,map->relPath,map->urlOnly,map->context,"_top");
}
fi.close();
fo.close();
@@ -602,18 +604,18 @@ bool DotFilePatcher::writeSVGFigureLink(FTextStream &out,const QCString &relPath
if (height<=60) height=300; else height+=300; // add some extra space for zooming
if (height>600) height=600; // clip to maximum height of 600 pixels
out << "<div class=\"zoom\">";
- //out << "<object type=\"image/svg+xml\" data=\""
- //out << "<embed type=\"image/svg+xml\" src=\""
- out << "<iframe scrolling=\"no\" frameborder=\"0\" src=\""
+ //out << "<object type=\"image/svg+xml\" data=\""
+ //out << "<embed type=\"image/svg+xml\" src=\""
+ out << "<iframe scrolling=\"no\" frameborder=\"0\" src=\""
<< relPath << baseName << ".svg\" width=\"100%\" height=\"" << height << "\">";
}
else
{
- //out << "<object type=\"image/svg+xml\" data=\""
- //out << "<embed type=\"image/svg+xml\" src=\""
- out << "<iframe scrolling=\"no\" frameborder=\"0\" src=\""
- << relPath << baseName << ".svg\" width=\""
- << ((width*96+48)/72) << "\" height=\""
+ //out << "<object type=\"image/svg+xml\" data=\""
+ //out << "<embed type=\"image/svg+xml\" src=\""
+ out << "<iframe scrolling=\"no\" frameborder=\"0\" src=\""
+ << relPath << baseName << ".svg\" width=\""
+ << ((width*96+48)/72) << "\" height=\""
<< ((height*96+48)/72) << "\">";
}
writeSVGNotSupported(out);
@@ -650,7 +652,7 @@ bool DotFilePatcher::writeVecGfxFigure(FTextStream &out,const QCString &baseName
}
//printf("Got PDF/EPS size %d,%d\n",width,height);
int maxWidth = 350; /* approx. page width in points, excl. margins */
- int maxHeight = 550; /* approx. page height in points, excl. margins */
+ int maxHeight = 550; /* approx. page height in points, excl. margins */
out << "\\nopagebreak\n"
"\\begin{figure}[H]\n"
"\\begin{center}\n"
diff --git a/src/dotgfxhierarchytable.cpp b/src/dotgfxhierarchytable.cpp
index 3d56de8..c535acf 100644
--- a/src/dotgfxhierarchytable.cpp
+++ b/src/dotgfxhierarchytable.cpp
@@ -21,8 +21,6 @@
#include "doxygen.h"
#include "classlist.h"
-#define OPTIMIZE_OUTPUT_SLICE Config_getBool(OPTIMIZE_OUTPUT_SLICE)
-
QCString DotGfxHierarchyTable::getBaseName() const
{
QCString baseName;
@@ -35,22 +33,19 @@ QCString DotGfxHierarchyTable::getBaseName() const
void DotGfxHierarchyTable::computeTheGraph()
{
- QListIterator<DotNode> dnli2(*m_rootNodes);
- DotNode *node;
-
FTextStream md5stream(&m_theGraph);
writeGraphHeader(md5stream,theTranslator->trGraphicalHierarchy());
md5stream << " rankdir=\"LR\";" << endl;
- for (dnli2.toFirst();(node=dnli2.current());++dnli2)
+ for (auto node : m_rootNodes)
{
- if (node->subgraphId()==m_rootSubgraphNode->subgraphId())
+ if (node->subgraphId()==m_rootSubgraphNode->subgraphId())
{
node->clearWriteFlag();
}
}
- for (dnli2.toFirst();(node=dnli2.current());++dnli2)
+ for (auto node : m_rootNodes)
{
- if (node->subgraphId()==m_rootSubgraphNode->subgraphId())
+ if (node->subgraphId()==m_rootSubgraphNode->subgraphId())
{
node->write(md5stream,Hierarchy,GOF_BITMAP,FALSE,TRUE,TRUE);
}
@@ -80,7 +75,7 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,
//printf("DotGfxHierarchyTable::writeGraph(%s)\n",name);
//printf("m_rootNodes=%p count=%d\n",m_rootNodes,m_rootNodes->count());
- if (m_rootSubgraphs->count()==0) return;
+ if (m_rootSubgraphs.empty()) return;
QDir d(path);
// store the original directory
@@ -92,10 +87,10 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,
// put each connected subgraph of the hierarchy in a row of the HTML output
out << "<table border=\"0\" cellspacing=\"10\" cellpadding=\"0\">" << endl;
- QListIterator<DotNode> dnli(*m_rootSubgraphs);
- DotNode *n;
int count=0;
- for (dnli.toFirst();(n=dnli.current());++dnli)
+ std::sort(m_rootSubgraphs.begin(),m_rootSubgraphs.end(),
+ [](auto n1,auto n2) { return qstricmp(n1->label(),n2->label())<0; });
+ for (auto n : m_rootSubgraphs)
{
out << "<tr><td>";
createGraph(n,out,path,fileName,count++);
@@ -104,85 +99,81 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,
out << "</table>" << endl;
}
-void DotGfxHierarchyTable::addHierarchy(DotNode *n,const ClassDef *cd,bool hideSuper)
+void DotGfxHierarchyTable::addHierarchy(DotNode *n,const ClassDef *cd,ClassDefSet &visitedClasses)
{
//printf("addHierarchy '%s' baseClasses=%d\n",cd->name().data(),cd->baseClasses()->count());
- if (cd->subClasses())
+ for (const auto &bcd : cd->subClasses())
{
- BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
+ ClassDef *bClass=bcd.classDef;
+ //printf(" Trying sub class='%s' usedNodes=%d\n",bClass->name().data(),m_usedNodes->count());
+ if (bClass && bClass->isVisibleInHierarchy() && hasVisibleRoot(bClass->baseClasses()))
{
- ClassDef *bClass=bcd->classDef;
- //printf(" Trying sub class='%s' usedNodes=%d\n",bClass->name().data(),m_usedNodes->count());
- if (bClass->isVisibleInHierarchy() && hasVisibleRoot(bClass->baseClasses()))
+ auto it = m_usedNodes.find(bClass->name().str());
+ //printf(" Node '%s' Found visible class='%s'\n",n->label().data(),
+ // bClass->name().data());
+ DotNode *root = 0;
+ if (it!=m_usedNodes.end()) // node already present
{
- DotNode *bn;
- //printf(" Node '%s' Found visible class='%s'\n",n->label().data(),
- // bClass->name().data());
- if ((bn=m_usedNodes->find(bClass->name()))) // node already present
+ const auto &bn = it->second;
+ root = bn.get();
+ if (n->children()==0 || n->children()->findRef(bn.get())==-1) // no arrow yet
{
- if (n->children()==0 || n->children()->findRef(bn)==-1) // no arrow yet
- {
- n->addChild(bn,bcd->prot);
- bn->addParent(n);
- //printf(" Adding node %s to existing base node %s (c=%d,p=%d)\n",
- // n->label().data(),
- // bn->label().data(),
- // bn->children() ? bn->children()->count() : 0,
- // bn->parents() ? bn->parents()->count() : 0
- // );
- }
- //else
- //{
- // printf(" Class already has an arrow!\n");
- //}
+ n->addChild(bn.get(),bcd.prot);
+ bn->addParent(n);
+ //printf(" Adding node %s to existing base node %s (c=%d,p=%d)\n",
+ // n->label().data(),
+ // bn->label().data(),
+ // bn->children() ? bn->children()->count() : 0,
+ // bn->parents() ? bn->parents()->count() : 0
+ // );
}
- else
+ //else
+ //{
+ // printf(" Class already has an arrow!\n");
+ //}
+ }
+ else
+ {
+ QCString tmp_url="";
+ if (bClass->isLinkable() && !bClass->isHidden())
{
- QCString tmp_url="";
- if (bClass->isLinkable() && !bClass->isHidden())
+ tmp_url=bClass->getReference()+"$"+bClass->getOutputFileBase();
+ if (!bClass->anchor().isEmpty())
{
- tmp_url=bClass->getReference()+"$"+bClass->getOutputFileBase();
- if (!bClass->anchor().isEmpty())
- {
- tmp_url+="#"+bClass->anchor();
- }
+ tmp_url+="#"+bClass->anchor();
}
- QCString tooltip = bClass->briefDescriptionAsTooltip();
- bn = new DotNode(getNextNodeNumber(),
+ }
+ QCString tooltip = bClass->briefDescriptionAsTooltip();
+ auto bn = std::make_unique<DotNode>(getNextNodeNumber(),
bClass->displayName(),
tooltip,
tmp_url.data()
- );
- n->addChild(bn,bcd->prot);
- bn->addParent(n);
- //printf(" Adding node %s to new base node %s (c=%d,p=%d)\n",
- // n->label().data(),
- // bn->label().data(),
- // bn->children() ? bn->children()->count() : 0,
- // bn->parents() ? bn->parents()->count() : 0
- // );
- //printf(" inserting %s (%p)\n",bClass->name().data(),bn);
- m_usedNodes->insert(bClass->name(),bn); // add node to the used list
- }
- if (!bClass->isVisited() && !hideSuper && bClass->subClasses())
- {
- bool wasVisited=bClass->isVisited();
- bClass->setVisited(TRUE);
- addHierarchy(bn,bClass,wasVisited);
- }
+ );
+ n->addChild(bn.get(),bcd.prot);
+ bn->addParent(n);
+ root = bn.get();
+ //printf(" Adding node %s to new base node %s (c=%d,p=%d)\n",
+ // n->label().data(),
+ // bn->label().data(),
+ // bn->children() ? bn->children()->count() : 0,
+ // bn->parents() ? bn->parents()->count() : 0
+ // );
+ //printf(" inserting %s (%p)\n",bClass->name().data(),bn);
+ m_usedNodes.insert(std::make_pair(bClass->name().str(),std::move(bn))); // add node to the used list
+ }
+ if (visitedClasses.find(bClass)==visitedClasses.end() && !bClass->subClasses().empty())
+ {
+ visitedClasses.insert(bClass);
+ addHierarchy(root,bClass,visitedClasses);
}
}
}
//printf("end addHierarchy\n");
}
-void DotGfxHierarchyTable::addClassList(const ClassSDict *cl)
+void DotGfxHierarchyTable::addClassList(const ClassLinkedMap &cl,ClassDefSet &visitedClasses)
{
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for (cli.toLast();(cd=cli.current());--cli)
+ for (const auto &cd : cl)
{
//printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
if (cd->getLanguage()==SrcLangExt_VHDL &&
@@ -191,7 +182,7 @@ void DotGfxHierarchyTable::addClassList(const ClassSDict *cl)
{
continue;
}
- if (OPTIMIZE_OUTPUT_SLICE && cd->compoundType() != m_classType)
+ if (Config_getBool(OPTIMIZE_OUTPUT_SLICE) && cd->compoundType() != m_classType)
{
continue;
}
@@ -200,7 +191,7 @@ void DotGfxHierarchyTable::addClassList(const ClassSDict *cl)
) // root node in the forest
{
QCString tmp_url="";
- if (cd->isLinkable() && !cd->isHidden())
+ if (cd->isLinkable() && !cd->isHidden())
{
tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
if (!cd->anchor().isEmpty())
@@ -210,18 +201,18 @@ void DotGfxHierarchyTable::addClassList(const ClassSDict *cl)
}
//printf("Inserting root class %s\n",cd->name().data());
QCString tooltip = cd->briefDescriptionAsTooltip();
- DotNode *n = new DotNode(getNextNodeNumber(),
+ auto n = std::make_unique<DotNode>(getNextNodeNumber(),
cd->displayName(),
tooltip,
tmp_url.data());
+ DotNode *root = n.get();
- //m_usedNodes->clear();
- m_usedNodes->insert(cd->name(),n);
- m_rootNodes->insert(0,n);
- if (!cd->isVisited() && cd->subClasses())
+ m_usedNodes.insert(std::make_pair(cd->name().str(),std::move(n)));
+ m_rootNodes.push_back(root);
+ if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->subClasses().empty())
{
- addHierarchy(n,cd,cd->isVisited());
- cd->setVisited(TRUE);
+ addHierarchy(root,cd.get(),visitedClasses);
+ visitedClasses.insert(cd.get());
}
}
}
@@ -231,28 +222,20 @@ DotGfxHierarchyTable::DotGfxHierarchyTable(const char *prefix,ClassDef::Compound
: m_prefix(prefix)
, m_classType(ct)
{
- m_rootNodes = new QList<DotNode>;
- m_usedNodes = new QDict<DotNode>(1009);
- m_usedNodes->setAutoDelete(TRUE);
- m_rootSubgraphs = new DotNodeList;
-
// build a graph with each class as a node and the inheritance relations
// as edges
- initClassHierarchy(Doxygen::classSDict);
- initClassHierarchy(Doxygen::hiddenClasses);
- addClassList(Doxygen::classSDict);
- addClassList(Doxygen::hiddenClasses);
+ ClassDefSet visitedClasses;
+ addClassList(*Doxygen::classLinkedMap,visitedClasses);
+ addClassList(*Doxygen::hiddenClassLinkedMap,visitedClasses);
// m_usedNodes now contains all nodes in the graph
// color the graph into a set of independent subgraphs
- bool done=FALSE;
+ bool done=FALSE;
int curColor=0;
- QListIterator<DotNode> dnli(*m_rootNodes);
while (!done) // there are still nodes to color
{
- DotNode *n;
done=TRUE; // we are done unless there are still uncolored nodes
- for (dnli.toLast();(n=dnli.current());--dnli)
+ for (auto n : m_rootNodes)
{
if (n->subgraphId()==-1) // not yet colored
{
@@ -263,18 +246,16 @@ DotGfxHierarchyTable::DotGfxHierarchyTable(const char *prefix,ClassDef::Compound
n->colorConnectedNodes(curColor);
curColor++;
const DotNode *dn=n->findDocNode();
- if (dn!=0)
- m_rootSubgraphs->inSort(dn);
+ if (dn!=0)
+ m_rootSubgraphs.push_back(const_cast<DotNode*>(dn));
else
- m_rootSubgraphs->inSort(n);
+ m_rootSubgraphs.push_back(n);
}
}
}
//printf("Number of independent subgraphs: %d\n",curColor);
- QListIterator<DotNode> dnli2(*m_rootSubgraphs);
- DotNode *n;
- for (dnli2.toFirst();(n=dnli2.current());++dnli2)
+ for (auto n : m_rootSubgraphs)
{
//printf("Node %s color=%d (c=%d,p=%d)\n",
// n->label().data(),n->m_subgraphId,
@@ -285,18 +266,3 @@ DotGfxHierarchyTable::DotGfxHierarchyTable(const char *prefix,ClassDef::Compound
}
}
-DotGfxHierarchyTable::~DotGfxHierarchyTable()
-{
- //printf("DotGfxHierarchyTable::~DotGfxHierarchyTable\n");
-
- //QDictIterator<DotNode> di(*m_usedNodes);
- //DotNode *n;
- //for (;(n=di.current());++di)
- //{
- // printf("Node %p: %s\n",n,n->label().data());
- //}
-
- delete m_rootNodes;
- delete m_usedNodes;
- delete m_rootSubgraphs;
-}
diff --git a/src/dotgfxhierarchytable.h b/src/dotgfxhierarchytable.h
index 5a5bcad..089ecd2 100644
--- a/src/dotgfxhierarchytable.h
+++ b/src/dotgfxhierarchytable.h
@@ -16,22 +16,28 @@
#ifndef DOTGFXHIERARCHYTABLE_H
#define DOTGFXHIERARCHYTABLE_H
+#include <memory>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
#include "classdef.h"
#include "ftextstream.h"
#include "dotgraph.h"
#include "dotnode.h"
+class ClassLinkedMap;
+
/** Represents a graphical class hierarchy */
class DotGfxHierarchyTable : public DotGraph
{
public:
DotGfxHierarchyTable(const char *prefix="",ClassDef::CompoundType ct=ClassDef::Class);
- ~DotGfxHierarchyTable();
void createGraph(DotNode *rootNode,FTextStream &t,const char *path,
const char *fileName,int id);
void writeGraph(FTextStream &t,const char *path, const char *fileName);
- const DotNodeList *subGraphs() const { return m_rootSubgraphs; }
+ const std::vector<DotNode*> subGraphs() const { return m_rootSubgraphs; }
protected:
virtual QCString getBaseName() const;
@@ -39,15 +45,16 @@ class DotGfxHierarchyTable : public DotGraph
virtual void computeTheGraph();
private:
- void addHierarchy(DotNode *n,const ClassDef *cd,bool hide);
- void addClassList(const ClassSDict *cl);
+ void addHierarchy(DotNode *n,const ClassDef *cd,ClassDefSet &visited);
+ void addClassList(const ClassLinkedMap &cl,ClassDefSet &visited);
+ using DotNodeMap = std::unordered_multimap< std::string, std::unique_ptr<DotNode> >;
int m_graphId;
QCString m_prefix;
ClassDef::CompoundType m_classType;
- QList<DotNode> *m_rootNodes;
- QDict<DotNode> *m_usedNodes;
- DotNodeList *m_rootSubgraphs;
+ std::vector<DotNode*> m_rootNodes;
+ DotNodeMap m_usedNodes;
+ std::vector<DotNode*> m_rootSubgraphs;
DotNode * m_rootSubgraphNode;
};
diff --git a/src/dotgraph.cpp b/src/dotgraph.cpp
index 0bfa712..287793e 100644
--- a/src/dotgraph.cpp
+++ b/src/dotgraph.cpp
@@ -74,15 +74,6 @@ static bool checkDeliverables(const QCString &file1,
return file1Ok && file2Ok;
}
-static void removeDotGraph(const QCString &dotName)
-{
- if (Config_getBool(DOT_CLEANUP))
- {
- QDir d;
- d.remove(dotName);
- }
-}
-
static bool insertMapFile(FTextStream &out,const QCString &mapFile,
const QCString &relPath,const QCString &mapLabel)
{
@@ -108,7 +99,7 @@ static bool insertMapFile(FTextStream &out,const QCString &mapFile,
QCString DotGraph::imgName() const
{
return m_baseName + ((m_graphFormat == GOF_BITMAP) ?
- ("." + getDotImageExtension()) : (Config_getBool(USE_PDFLATEX) ? ".pdf" : ".eps"));
+ ("." + getDotImageExtension()) : (Config_getBool(USE_PDFLATEX) ? ".pdf" : ".eps"));
}
QCString DotGraph::writeGraph(
@@ -166,7 +157,6 @@ bool DotGraph::prepareDotFile()
)
{
// all needed files are there
- removeDotGraph(absDotName());
return FALSE;
}
@@ -186,14 +176,14 @@ bool DotGraph::prepareDotFile()
if (m_graphFormat == GOF_BITMAP)
{
// run dot to create a bitmap image
- DotRunner * dotRun = DotManager::instance()->createRunner(absDotName(), sigStr);
+ DotRunner * dotRun = DotManager::instance()->createRunner(absDotName().data(), sigStr.data());
dotRun->addJob(Config_getEnum(DOT_IMAGE_FORMAT), absImgName());
if (m_generateImageMap) dotRun->addJob(MAP_CMD, absMapName());
}
else if (m_graphFormat == GOF_EPS)
{
// run dot to create a .eps image
- DotRunner *dotRun = DotManager::instance()->createRunner(absDotName(), sigStr);
+ DotRunner *dotRun = DotManager::instance()->createRunner(absDotName().data(), sigStr.data());
if (Config_getBool(USE_PDFLATEX))
{
dotRun->addJob("pdf",absImgName());
@@ -233,11 +223,11 @@ void DotGraph::generateCode(FTextStream &t)
if (m_regenerate)
{
DotManager::instance()->
- createFilePatcher(absImgName())->
+ createFilePatcher(absImgName().data())->
addSVGConversion(m_relPath,FALSE,QCString(),m_zoomable,m_graphId);
}
int mapId = DotManager::instance()->
- createFilePatcher(m_fileName)->
+ createFilePatcher(m_fileName.data())->
addSVGObject(m_baseName,absImgName(),m_relPath);
t << "<!-- SVG " << mapId << " -->" << endl;
}
@@ -246,13 +236,13 @@ void DotGraph::generateCode(FTextStream &t)
else // add link to bitmap file with image map
{
if (!m_noDivTag) t << "<div class=\"center\">";
- t << "<img src=\"" << relImgName() << "\" border=\"0\" usemap=\"#" << getMapLabel() << "\" alt=\"" << getImgAltText() << "\"/>";
+ t << "<img src=\"" << relImgName() << "\" border=\"0\" usemap=\"#" << correctId(getMapLabel()) << "\" alt=\"" << getImgAltText() << "\"/>";
if (!m_noDivTag) t << "</div>";
t << endl;
- if (m_regenerate || !insertMapFile(t, absMapName(), m_relPath, getMapLabel()))
+ if (m_regenerate || !insertMapFile(t, absMapName(), m_relPath, correctId(getMapLabel())))
{
int mapId = DotManager::instance()->
- createFilePatcher(m_fileName)->
+ createFilePatcher(m_fileName.data())->
addMap(absMapName(), m_relPath, m_urlOnly, QCString(), getMapLabel());
t << "<!-- MAP " << mapId << " -->" << endl;
}
@@ -263,7 +253,7 @@ void DotGraph::generateCode(FTextStream &t)
if (m_regenerate || !DotFilePatcher::writeVecGfxFigure(t,m_baseName,absBaseName()))
{
int figId = DotManager::instance()->
- createFilePatcher(m_fileName)->
+ createFilePatcher(m_fileName.data())->
addFigure(m_baseName,absBaseName(),FALSE /*TRUE*/);
t << endl << "% FIG " << figId << endl;
}
diff --git a/src/dotgraph.h b/src/dotgraph.h
index edba009..b90d980 100644
--- a/src/dotgraph.h
+++ b/src/dotgraph.h
@@ -31,7 +31,8 @@ enum GraphType { Dependency, Inheritance, Collaboration, Hierarchy, C
class DotGraph
{
public:
- DotGraph() : m_curNodeNumber(0), m_doNotAddImageToIndex(FALSE), m_noDivTag(FALSE), m_zoomable(TRUE), m_urlOnly(FALSE) {}
+ DotGraph() : m_doNotAddImageToIndex(FALSE), m_noDivTag(FALSE),
+ m_zoomable(TRUE), m_urlOnly(FALSE) {}
virtual ~DotGraph() {}
protected:
@@ -98,7 +99,7 @@ class DotGraph
bool prepareDotFile();
void generateCode(FTextStream &t);
- int m_curNodeNumber;
+ int m_curNodeNumber = 0;
};
#endif
diff --git a/src/dotgroupcollaboration.cpp b/src/dotgroupcollaboration.cpp
index 0a56460..1b632ce 100644
--- a/src/dotgroupcollaboration.cpp
+++ b/src/dotgroupcollaboration.cpp
@@ -23,8 +23,6 @@
#include "util.h"
#include "config.h"
-#define DOT_TRANSPARENT Config_getBool(DOT_TRANSPARENT)
-
DotGroupCollaboration::DotGroupCollaboration(const GroupDef* gd)
{
QCString tmp_url = gd->getReference()+"$"+gd->getOutputFileBase();
@@ -62,46 +60,35 @@ void DotGroupCollaboration::buildGraph(const GroupDef* gd)
// hierarchy.
// Write parents
- const GroupList *groups = gd->partOfGroups();
- if ( groups )
+ for (const auto &d : gd->partOfGroups())
{
- GroupListIterator gli(*groups);
- const GroupDef *d;
- for (gli.toFirst();(d=gli.current());++gli)
- {
- DotNode* nnode = m_usedNodes->find(d->name());
- if ( !nnode )
- { // add node
- tmp_url = d->getReference()+"$"+d->getOutputFileBase();
- QCString tooltip = d->briefDescriptionAsTooltip();
- nnode = new DotNode(getNextNodeNumber(), d->groupTitle(), tooltip, tmp_url );
- nnode->markAsVisible();
- m_usedNodes->insert(d->name(), nnode );
- }
- tmp_url = "";
- addEdge( nnode, m_rootNode, DotGroupCollaboration::thierarchy, tmp_url, tmp_url );
+ DotNode* nnode = m_usedNodes->find(d->name());
+ if ( !nnode )
+ { // add node
+ tmp_url = d->getReference()+"$"+d->getOutputFileBase();
+ QCString tooltip = d->briefDescriptionAsTooltip();
+ nnode = new DotNode(getNextNodeNumber(), d->groupTitle(), tooltip, tmp_url );
+ nnode->markAsVisible();
+ m_usedNodes->insert(d->name(), nnode );
}
+ tmp_url = "";
+ addEdge( nnode, m_rootNode, DotGroupCollaboration::thierarchy, tmp_url, tmp_url );
}
// Add subgroups
- if ( gd->getSubGroups() && gd->getSubGroups()->count() )
+ for (const auto &def : gd->getSubGroups())
{
- QListIterator<GroupDef> defli(*gd->getSubGroups());
- const GroupDef *def;
- for (;(def=defli.current());++defli)
- {
- DotNode* nnode = m_usedNodes->find(def->name());
- if ( !nnode )
- { // add node
- tmp_url = def->getReference()+"$"+def->getOutputFileBase();
- QCString tooltip = def->briefDescriptionAsTooltip();
- nnode = new DotNode(getNextNodeNumber(), def->groupTitle(), tooltip, tmp_url );
- nnode->markAsVisible();
- m_usedNodes->insert(def->name(), nnode );
- }
- tmp_url = "";
- addEdge( m_rootNode, nnode, DotGroupCollaboration::thierarchy, tmp_url, tmp_url );
+ DotNode* nnode = m_usedNodes->find(def->name());
+ if ( !nnode )
+ { // add node
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase();
+ QCString tooltip = def->briefDescriptionAsTooltip();
+ nnode = new DotNode(getNextNodeNumber(), def->groupTitle(), tooltip, tmp_url );
+ nnode->markAsVisible();
+ m_usedNodes->insert(def->name(), nnode );
}
+ tmp_url = "";
+ addEdge( m_rootNode, nnode, DotGroupCollaboration::thierarchy, tmp_url, tmp_url );
}
//=======================
@@ -111,31 +98,21 @@ void DotGroupCollaboration::buildGraph(const GroupDef* gd)
addMemberList( gd->getMemberList(MemberListType_allMembersList) );
// Add classes
- if ( gd->getClasses() && gd->getClasses()->count() )
+ for (const auto &def : gd->getClasses())
{
- ClassSDict::Iterator defli(*gd->getClasses());
- ClassDef *def;
- for (;(def=defli.current());++defli)
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ if (!def->anchor().isEmpty())
{
- tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
- if (!def->anchor().isEmpty())
- {
- tmp_url+="#"+def->anchor();
- }
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tclass );
+ tmp_url+="#"+def->anchor();
}
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tclass );
}
// Add namespaces
- if ( gd->getNamespaces() && gd->getNamespaces()->count() )
+ for (const auto &def : gd->getNamespaces())
{
- NamespaceSDict::Iterator defli(*gd->getNamespaces());
- NamespaceDef *def;
- for (;(def=defli.current());++defli)
- {
- tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tnamespace );
- }
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tnamespace );
}
// Add files
@@ -146,31 +123,24 @@ void DotGroupCollaboration::buildGraph(const GroupDef* gd)
for (;(def=defli.current());++defli)
{
tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tfile );
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tfile );
}
}
// Add pages
- if ( gd->getPages() && gd->getPages()->count() )
+ for (const auto &def : gd->getPages())
{
- PageSDict::Iterator defli(*gd->getPages());
- PageDef *def;
- for (;(def=defli.current());++defli)
- {
- tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tpages );
- }
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tpages );
}
// Add directories
- if ( gd->getDirs() && gd->getDirs()->count() )
+ if ( !gd->getDirs().empty() )
{
- QListIterator<DirDef> defli(*gd->getDirs());
- const DirDef *def;
- for (;(def=defli.current());++defli)
+ for(const auto def : gd->getDirs())
{
tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tdir );
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tdir );
}
}
}
@@ -188,7 +158,7 @@ void DotGroupCollaboration::addMemberList( MemberList* ml )
}
}
-DotGroupCollaboration::Edge* DotGroupCollaboration::addEdge(
+DotGroupCollaboration::Edge* DotGroupCollaboration::addEdge(
DotNode* _pNStart, DotNode* _pNEnd, EdgeType _eType,
const QCString& _label, const QCString& _url )
{
@@ -197,9 +167,9 @@ DotGroupCollaboration::Edge* DotGroupCollaboration::addEdge(
Edge* newEdge = 0;
for ( lli.toFirst(); (newEdge=lli.current()); ++lli)
{
- if ( newEdge->pNStart==_pNStart &&
+ if ( newEdge->pNStart==_pNStart &&
newEdge->pNEnd==_pNEnd &&
- newEdge->eType==_eType
+ newEdge->eType==_eType
)
{ // edge already found
break;
@@ -209,7 +179,7 @@ DotGroupCollaboration::Edge* DotGroupCollaboration::addEdge(
{
newEdge = new Edge(_pNStart,_pNEnd,_eType);
m_edges.append( newEdge );
- }
+ }
if (!_label.isEmpty())
{
@@ -219,16 +189,12 @@ DotGroupCollaboration::Edge* DotGroupCollaboration::addEdge(
return newEdge;
}
-void DotGroupCollaboration::addCollaborationMember(
+void DotGroupCollaboration::addCollaborationMember(
const Definition* def, QCString& url, EdgeType eType )
{
// Create group nodes
- if ( !def->partOfGroups() )
- return;
- GroupListIterator gli(*def->partOfGroups());
- GroupDef *d;
QCString tmp_str;
- for (;(d=gli.current());++gli)
+ for (const auto &d : def->partOfGroups())
{
DotNode* nnode = m_usedNodes->find(d->name());
if ( nnode != m_rootNode )
@@ -304,8 +270,8 @@ void DotGroupCollaboration::Edge::write( FTextStream &t ) const
"darkorchid3"
,"orange"
,"blueviolet"
- ,"darkgreen"
- ,"firebrick4"
+ ,"darkgreen"
+ ,"firebrick4"
,"grey75"
,"midnightblue"
};
@@ -341,7 +307,7 @@ void DotGroupCollaboration::Edge::write( FTextStream &t ) const
const int maxLabels = 10;
for( lli.toFirst(); (link=lli.current()) && count<maxLabels; ++lli,++count)
{
- if (first) first=FALSE; else t << "\\n";
+ if (first) first=FALSE; else t << "\\n";
t << DotNode::convertLabel(link->label);
}
if (count==maxLabels) t << "\\n...";
@@ -381,7 +347,7 @@ void DotGroupCollaboration::writeGraphHeader(FTextStream &t,const QCString &titl
}
t << endl;
t << "{" << endl;
- if (DOT_TRANSPARENT)
+ if (Config_getBool(DOT_TRANSPARENT))
{
t << " bgcolor=\"transparent\";" << endl;
}
diff --git a/src/dotlegendgraph.cpp b/src/dotlegendgraph.cpp
index 98e1f88..b17a293 100644
--- a/src/dotlegendgraph.cpp
+++ b/src/dotlegendgraph.cpp
@@ -29,7 +29,7 @@ void DotLegendGraph::writeGraph(const char *path)
if (getDotImageExtension()=="svg")
{
DotManager::instance()->
- createFilePatcher(absBaseName()+Config_getString(HTML_FILE_EXTENSION))->
+ createFilePatcher((absBaseName()+Config_getString(HTML_FILE_EXTENSION)).data())->
addSVGObject("graph_legend", absImgName(),QCString());
}
}
diff --git a/src/dotnode.cpp b/src/dotnode.cpp
index 9eccdde..06de5f4 100644
--- a/src/dotnode.cpp
+++ b/src/dotnode.cpp
@@ -87,7 +87,7 @@ static const char *umlEdgeStyleMap[] =
"solid" // usage
};
-static EdgeProperties normalEdgeProps =
+static EdgeProperties normalEdgeProps =
{
normalEdgeColorMap, normalArrowStyleMap, normalEdgeStyleMap
};
@@ -97,6 +97,30 @@ static EdgeProperties umlEdgeProps =
umlEdgeColorMap, umlArrowStyleMap, umlEdgeStyleMap
};
+// Extracted from config setting "DOT_UML_DETAILS"
+enum class UmlDetailLevel
+{
+ Default, // == NO, the default setting
+ Full, // == YES, include type and arguments
+ None // == NONE, don't include compartments for attributes and methods
+};
+
+// Local helper function for extracting the configured detail level
+static UmlDetailLevel getUmlDetailLevelFromConfig()
+{
+ UmlDetailLevel result = UmlDetailLevel::Default;
+ QCString umlDetailsStr = Config_getEnum(DOT_UML_DETAILS).upper();
+ if (umlDetailsStr == "YES")
+ {
+ result=UmlDetailLevel::Full;
+ }
+ else if (umlDetailsStr == "NONE")
+ {
+ result=UmlDetailLevel::None;
+ }
+ return result;
+}
+
static QCString escapeTooltip(const QCString &tooltip)
{
QCString result;
@@ -117,9 +141,8 @@ static QCString escapeTooltip(const QCString &tooltip)
static void writeBoxMemberList(FTextStream &t,
char prot,MemberList *ml,const ClassDef *scope,
- bool isStatic=FALSE,const QDict<void> *skipNames=0)
+ bool isStatic=FALSE,const StringUnorderedSet *skipNames=nullptr)
{
- (void)isStatic;
if (ml)
{
MemberListIterator mlia(*ml);
@@ -127,8 +150,8 @@ static void writeBoxMemberList(FTextStream &t,
int totalCount=0;
for (mlia.toFirst();(mma = mlia.current());++mlia)
{
- if (mma->getClassDef()==scope &&
- (skipNames==0 || skipNames->find(mma->name())==0))
+ if (mma->getClassDef()==scope &&
+ (skipNames==nullptr || skipNames->find(mma->name().str())==std::end(*skipNames)))
{
totalCount++;
}
@@ -138,7 +161,7 @@ static void writeBoxMemberList(FTextStream &t,
for (mlia.toFirst();(mma = mlia.current());++mlia)
{
if (mma->getClassDef() == scope &&
- (skipNames==0 || skipNames->find(mma->name())==0))
+ (skipNames==nullptr || skipNames->find(mma->name().str())==std::end(*skipNames)))
{
int numFields = Config_getInt(UML_LIMIT_NUM_FIELDS);
if (numFields>0 && (totalCount>numFields*3/2 && count>=numFields))
@@ -149,26 +172,36 @@ static void writeBoxMemberList(FTextStream &t,
else
{
t << prot << " ";
- t << DotNode::convertLabel(mma->name());
- if (!mma->isObjCMethod() &&
- (mma->isFunction() || mma->isSlot() || mma->isSignal())) t << "()";
+ QCString label;
+ if(getUmlDetailLevelFromConfig()==UmlDetailLevel::Full)
+ {
+ label+=mma->typeString();
+ label+=" ";
+ }
+ label+=mma->name();
+ if (!mma->isObjCMethod() && (mma->isFunction() || mma->isSlot() || mma->isSignal()))
+ {
+ if(getUmlDetailLevelFromConfig()==UmlDetailLevel::Full)
+ {
+ label+=mma->argsString();
+ }
+ else
+ {
+ label+="()";
+ }
+ }
+ t << DotNode::convertLabel(label);
t << "\\l";
count++;
}
}
}
// write member groups within the memberlist
- MemberGroupList *mgl = ml->getMemberGroupList();
- if (mgl)
+ for (const auto &mg : ml->getMemberGroupList())
{
- MemberGroupListIterator mgli(*mgl);
- MemberGroup *mg;
- for (mgli.toFirst();(mg=mgli.current());++mgli)
+ if (mg->members())
{
- if (mg->members())
- {
- writeBoxMemberList(t,prot,mg->members(),scope,isStatic,skipNames);
- }
+ writeBoxMemberList(t,prot,mg->members(),scope,isStatic,skipNames);
}
}
}
@@ -186,7 +219,7 @@ QCString DotNode::convertLabel(const QCString &l)
int len=p.length();
int charsLeft=len;
int sinceLast=0;
- int foldLen=17; // ideal text length
+ int foldLen = Config_getInt(DOT_WRAP_THRESHOLD); // ideal text length
while (idx < p.length())
{
c = p[idx++];
@@ -218,7 +251,7 @@ QCString DotNode::convertLabel(const QCString &l)
foldLen = (foldLen+sinceLast+1)/2;
sinceLast=1;
}
- else if (charsLeft>1+foldLen/4 && sinceLast>foldLen+foldLen/3 &&
+ else if (charsLeft>1+foldLen/4 && sinceLast>foldLen+foldLen/3 &&
!isupper(c) && isupper(p[idx]))
{
result+=replacement;
@@ -258,23 +291,12 @@ static QCString stripProtectionPrefix(const QCString &s)
DotNode::DotNode(int n,const char *lab,const char *tip, const char *url,
bool isRoot,const ClassDef *cd)
- : m_subgraphId(-1)
- , m_number(n)
+ : m_number(n)
, m_label(lab)
, m_tooltip(tip)
, m_url(url)
- , m_parents(0)
- , m_children(0)
- , m_edgeInfo(0)
- , m_deleted(FALSE)
- , m_written(FALSE)
- , m_hasDoc(FALSE)
, m_isRoot(isRoot)
, m_classDef(cd)
- , m_visible(FALSE)
- , m_truncated(Unknown)
- , m_distance(1000)
- , m_renumbered(false)
{
}
@@ -396,9 +418,9 @@ void DotNode::writeBox(FTextStream &t,
if (m_classDef && Config_getBool(UML_LOOK) && (gt==Inheritance || gt==Collaboration))
{
- // add names shown as relations to a dictionary, so we don't show
+ // add names shown as relations to a set, so we don't show
// them as attributes as well
- QDict<void> arrowNames(17);
+ StringUnorderedSet arrowNames;
if (m_edgeInfo)
{
// for each edge
@@ -408,61 +430,61 @@ void DotNode::writeBox(FTextStream &t,
{
if (!ei->label().isEmpty()) // labels joined by \n
{
- int li=ei->label().find('\n');
+ int i=ei->label().find('\n');
int p=0;
QCString lab;
- while ((li=ei->label().find('\n',p))!=-1)
+ while ((i=ei->label().find('\n',p))!=-1)
{
- lab = stripProtectionPrefix(ei->label().mid(p,li-p));
- arrowNames.insert(lab,(void*)0x8);
- p=li+1;
+ lab = stripProtectionPrefix(ei->label().mid(p,i-p));
+ arrowNames.insert(lab.str());
+ p=i+1;
}
lab = stripProtectionPrefix(ei->label().right(ei->label().length()-p));
- arrowNames.insert(lab,(void*)0x8);
+ arrowNames.insert(lab.str());
}
}
}
//printf("DotNode::writeBox for %s\n",m_classDef->name().data());
- t << "{" << convertLabel(m_label);
- t << "\\n|";
- writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubAttribs),m_classDef,FALSE,&arrowNames);
- writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubStaticAttribs),m_classDef,TRUE,&arrowNames);
- writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_properties),m_classDef,FALSE,&arrowNames);
- writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType_pacAttribs),m_classDef,FALSE,&arrowNames);
- writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType_pacStaticAttribs),m_classDef,TRUE,&arrowNames);
- writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proAttribs),m_classDef,FALSE,&arrowNames);
- writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proStaticAttribs),m_classDef,TRUE,&arrowNames);
- if (Config_getBool(EXTRACT_PRIVATE))
- {
- writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priAttribs),m_classDef,FALSE,&arrowNames);
- writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priStaticAttribs),m_classDef,TRUE,&arrowNames);
- }
- t << "|";
- writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubMethods),m_classDef);
- writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubStaticMethods),m_classDef,TRUE);
- writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubSlots),m_classDef);
- writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType_pacMethods),m_classDef);
- writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType_pacStaticMethods),m_classDef,TRUE);
- writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proMethods),m_classDef);
- writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proStaticMethods),m_classDef,TRUE);
- writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proSlots),m_classDef);
- if (Config_getBool(EXTRACT_PRIVATE))
- {
- writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priMethods),m_classDef);
- writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priStaticMethods),m_classDef,TRUE);
- writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priSlots),m_classDef);
- }
- if (m_classDef->getLanguage()!=SrcLangExt_Fortran &&
- m_classDef->getMemberGroupSDict())
- {
- MemberGroupSDict::Iterator mgdi(*m_classDef->getMemberGroupSDict());
- MemberGroup *mg;
- for (mgdi.toFirst();(mg=mgdi.current());++mgdi)
+ t << "{" << convertLabel(m_label) << "\\n";
+ if (getUmlDetailLevelFromConfig()!=UmlDetailLevel::None)
+ {
+ t << "|";
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubAttribs),m_classDef,FALSE,&arrowNames);
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubStaticAttribs),m_classDef,TRUE,&arrowNames);
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_properties),m_classDef,FALSE,&arrowNames);
+ writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType_pacAttribs),m_classDef,FALSE,&arrowNames);
+ writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType_pacStaticAttribs),m_classDef,TRUE,&arrowNames);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proAttribs),m_classDef,FALSE,&arrowNames);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proStaticAttribs),m_classDef,TRUE,&arrowNames);
+ if (Config_getBool(EXTRACT_PRIVATE))
+ {
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priAttribs),m_classDef,FALSE,&arrowNames);
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priStaticAttribs),m_classDef,TRUE,&arrowNames);
+ }
+ t << "|";
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubMethods),m_classDef);
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubStaticMethods),m_classDef,TRUE);
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType_pubSlots),m_classDef);
+ writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType_pacMethods),m_classDef);
+ writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType_pacStaticMethods),m_classDef,TRUE);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proMethods),m_classDef);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proStaticMethods),m_classDef,TRUE);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType_proSlots),m_classDef);
+ if (Config_getBool(EXTRACT_PRIVATE))
{
- if (mg->members())
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priMethods),m_classDef);
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priStaticMethods),m_classDef,TRUE);
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType_priSlots),m_classDef);
+ }
+ if (m_classDef->getLanguage()!=SrcLangExt_Fortran)
+ {
+ for (const auto &mg : m_classDef->getMemberGroups())
{
- writeBoxMemberList(t,'*',mg->members(),m_classDef,FALSE,&arrowNames);
+ if (mg->members())
+ {
+ writeBoxMemberList(t,'*',mg->members(),m_classDef,FALSE,&arrowNames);
+ }
}
}
}
@@ -511,7 +533,7 @@ void DotNode::writeBox(FTextStream &t,
{
t << ",tooltip=\" \""; // space in tooltip is required otherwise still something like 'Node0' is used
}
- t << "];" << endl;
+ t << "];" << endl;
}
void DotNode::writeArrow(FTextStream &t,
@@ -547,20 +569,20 @@ void DotNode::writeArrow(FTextStream &t,
t << ",label=\" " << convertLabel(ei->label()) << "\" ";
}
if (Config_getBool(UML_LOOK) &&
- eProps->arrowStyleMap[ei->color()] &&
+ eProps->arrowStyleMap[ei->color()] &&
(gt==Inheritance || gt==Collaboration)
)
{
bool rev = pointBack;
if (umlUseArrow) rev=!rev; // UML use relates has arrow on the start side
- if (rev)
- t << ",arrowtail=\"" << eProps->arrowStyleMap[ei->color()] << "\"";
- else
+ if (rev)
+ t << ",arrowtail=\"" << eProps->arrowStyleMap[ei->color()] << "\"";
+ else
t << ",arrowhead=\"" << eProps->arrowStyleMap[ei->color()] << "\"";
}
if (format==GOF_BITMAP) t << ",fontname=\"" << Config_getString(DOT_FONTNAME) << "\"";
- t << "];" << endl;
+ t << "];" << endl;
}
void DotNode::write(FTextStream &t,
@@ -575,7 +597,7 @@ void DotNode::write(FTextStream &t,
if (!m_visible) return; // node is not visible
writeBox(t,gt,format,m_truncated==Truncated);
m_written=TRUE;
- QList<DotNode> *nl = toChildren ? m_children : m_parents;
+ QList<DotNode> *nl = toChildren ? m_children : m_parents;
if (nl)
{
if (toChildren)
@@ -682,7 +704,7 @@ void DotNode::writeXML(FTextStream &t,bool isClassGraph) const
<< "</edgelabel>" << endl;
}
t << " </childnode>" << endl;
- }
+ }
}
t << " </node>" << endl;
}
@@ -852,7 +874,7 @@ void DotNode::clearWriteFlag()
}
void DotNode::colorConnectedNodes(int curColor)
-{
+{
if (m_children)
{
QListIterator<DotNode> dnlic(*m_children);
diff --git a/src/dotnode.h b/src/dotnode.h
index 334fdef..92f268e 100644
--- a/src/dotnode.h
+++ b/src/dotnode.h
@@ -107,22 +107,22 @@ class DotNode
private:
int m_number;
- QCString m_label; //!< label text
- QCString m_tooltip; //!< node's tooltip
- QCString m_url; //!< url of the node (format: remote$local)
- QList<DotNode> *m_parents; //!< list of parent nodes (incoming arrows)
- QList<DotNode> *m_children; //!< list of child nodes (outgoing arrows)
- QList<EdgeInfo> *m_edgeInfo; //!< edge info for each child
- bool m_deleted; //!< used to mark a node as deleted
- mutable bool m_written; //!< used to mark a node as written
- bool m_hasDoc; //!< used to mark a node as documented
- bool m_isRoot; //!< indicates if this is a root node
- const ClassDef * m_classDef; //!< class representing this node (can be 0)
- bool m_visible; //!< is the node visible in the output
- TruncState m_truncated; //!< does the node have non-visible children/parents
- int m_distance; //!< shortest path to the root node
- bool m_renumbered;//!< indicates if the node has been renumbered (to prevent endless loops)
- int m_subgraphId;
+ QCString m_label; //!< label text
+ QCString m_tooltip; //!< node's tooltip
+ QCString m_url; //!< url of the node (format: remote$local)
+ QList<DotNode> *m_parents = 0; //!< list of parent nodes (incoming arrows)
+ QList<DotNode> *m_children = 0; //!< list of child nodes (outgoing arrows)
+ QList<EdgeInfo> *m_edgeInfo = 0; //!< edge info for each child
+ bool m_deleted = false; //!< used to mark a node as deleted
+ mutable bool m_written = false; //!< used to mark a node as written
+ bool m_hasDoc = false; //!< used to mark a node as documented
+ bool m_isRoot; //!< indicates if this is a root node
+ const ClassDef * m_classDef; //!< class representing this node (can be 0)
+ bool m_visible = false; //!< is the node visible in the output
+ TruncState m_truncated = Unknown; //!< does the node have non-visible children/parents
+ int m_distance = 1000; //!< shortest path to the root node
+ bool m_renumbered = false; //!< indicates if the node has been renumbered (to prevent endless loops)
+ int m_subgraphId = -1;
};
/** Class representing a list of DotNode objects. */
diff --git a/src/dotrunner.cpp b/src/dotrunner.cpp
index fbfeaca..a1bbc52 100644
--- a/src/dotrunner.cpp
+++ b/src/dotrunner.cpp
@@ -13,8 +13,11 @@
*
*/
+#include <cassert>
+
#include "dotrunner.h"
+#include "qstring.h"
#include "util.h"
#include "portable.h"
#include "dot.h"
@@ -72,7 +75,7 @@ static bool resetPDFSize(const int width,const int height, const char *base)
}
QFile fi(tmpName);
QFile fo(patchFile);
- if (!fi.open(IO_ReadOnly))
+ if (!fi.open(IO_ReadOnly))
{
err("problem opening file %s for patching!\n",tmpName.data());
QDir::current().rename(tmpName,patchFile);
@@ -114,9 +117,9 @@ static bool resetPDFSize(const int width,const int height, const char *base)
bool DotRunner::readBoundingBox(const char *fileName,int *width,int *height,bool isEps)
{
const char *bb = isEps ? "%%PageBoundingBox:" : "/MediaBox [";
- int bblen = strlen(bb);
+ int bblen = (int)strlen(bb);
FILE *f = Portable::fopen(fileName,"rb");
- if (!f)
+ if (!f)
{
//printf("readBoundingBox: could not open %s\n",fileName);
return FALSE;
@@ -145,29 +148,30 @@ bool DotRunner::readBoundingBox(const char *fileName,int *width,int *height,bool
//---------------------------------------------------------------------------------
-DotRunner::DotRunner(const QCString& absDotName, const QCString& md5Hash)
- : m_file(absDotName), m_md5Hash(md5Hash), m_cleanUp(Config_getBool(DOT_CLEANUP)),
- m_dotExe(Config_getString(DOT_PATH)+"dot")
+DotRunner::DotRunner(const std::string& absDotName, const std::string& md5Hash)
+ : m_file(absDotName.data())
+ , m_md5Hash(md5Hash.data())
+ , m_dotExe(Config_getString(DOT_PATH)+"dot")
+ , m_cleanUp(Config_getBool(DOT_CLEANUP))
{
- m_jobs.setAutoDelete(TRUE);
}
-void DotRunner::addJob(const char *format,const char *output)
+
+void DotRunner::addJob(const char *format, const char *output)
{
- QListIterator<DotJob> li(m_jobs);
- DotJob *s;
- for (li.toFirst(); (s = li.current()); ++li)
+
+ for (auto& s: m_jobs)
{
- if (qstrcmp(s->format.data(), format) != 0) continue;
- if (qstrcmp(s->output.data(), output) != 0) continue;
+ if (s.format != format) continue;
+ if (s.output != output) continue;
// we have this job already
return;
}
- QCString args = QCString("-T")+format+" -o \""+output+"\"";
- m_jobs.append(new DotJob(format, output, args));
+ auto args = std::string ("-T") + format + " -o \"" + output + "\"";
+ m_jobs.emplace_back(format, output, args);
}
-QCString getBaseNameOfOutput(QCString const& output)
+QCString getBaseNameOfOutput(const QCString &output)
{
int index = output.findRev('.');
if (index < 0) return output;
@@ -179,66 +183,64 @@ bool DotRunner::run()
int exitCode=0;
QCString dotArgs;
- QListIterator<DotJob> li(m_jobs);
- DotJob *s;
// create output
if (Config_getBool(DOT_MULTI_TARGETS))
{
dotArgs=QCString("\"")+m_file.data()+"\"";
- for (li.toFirst();(s=li.current());++li)
+ for (auto& s: m_jobs)
{
dotArgs+=' ';
- dotArgs+=s->args.data();
+ dotArgs+=s.args.data();
}
if ((exitCode=Portable::system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error;
}
else
{
- for (li.toFirst();(s=li.current());++li)
+ for (auto& s : m_jobs)
{
- dotArgs=QCString("\"")+m_file.data()+"\" "+s->args.data();
+ dotArgs=QCString("\"")+m_file.data()+"\" "+s.args.data();
if ((exitCode=Portable::system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error;
}
}
// check output
// As there should be only one pdf file be generated, we don't need code for regenerating multiple pdf files in one call
- for (li.toFirst();(s=li.current());++li)
+ for (auto& s : m_jobs)
{
- if (qstrncmp(s->format.data(), "pdf", 3) == 0)
+ if (s.format.compare(0, 3, "pdf") == 0)
{
int width=0,height=0;
- if (!readBoundingBox(s->output.data(),&width,&height,FALSE)) goto error;
+ if (!readBoundingBox(s.output.data(),&width,&height,FALSE)) goto error;
if ((width > MAX_LATEX_GRAPH_SIZE) || (height > MAX_LATEX_GRAPH_SIZE))
{
- if (!resetPDFSize(width,height,getBaseNameOfOutput(s->output.data()))) goto error;
- dotArgs=QCString("\"")+m_file.data()+"\" "+s->args.data();
+ if (!resetPDFSize(width,height,getBaseNameOfOutput(s.output.data()))) goto error;
+ dotArgs=QCString("\"")+m_file.data()+"\" "+s.args.data();
if ((exitCode=Portable::system(m_dotExe.data(),dotArgs,FALSE))!=0) goto error;
}
}
- if (qstrncmp(s->format.data(), "png", 3) == 0)
+ if (s.format.compare(0, 3, "png") == 0)
{
- checkPngResult(s->output.data());
+ checkPngResult(s.output.data());
}
}
// remove .dot files
- if (m_cleanUp)
+ if (m_cleanUp)
{
//printf("removing dot file %s\n",m_file.data());
Portable::unlink(m_file.data());
}
// create checksum file
- if (!m_md5Hash.isEmpty())
+ if (!m_md5Hash.empty())
{
QCString md5Name = getBaseNameOfOutput(m_file.data()) + ".md5";
FILE *f = Portable::fopen(md5Name,"w");
if (f)
{
- fwrite(m_md5Hash.data(),1,32,f);
+ fwrite(m_md5Hash.data(),1,32,f);
fclose(f);
}
}
@@ -254,27 +256,27 @@ error:
void DotRunnerQueue::enqueue(DotRunner *runner)
{
- QMutexLocker locker(&m_mutex);
- m_queue.enqueue(runner);
- m_bufferNotEmpty.wakeAll();
+ std::lock_guard<std::mutex> locker(m_mutex);
+ m_queue.push(runner);
+ m_bufferNotEmpty.notify_all();
}
DotRunner *DotRunnerQueue::dequeue()
{
- QMutexLocker locker(&m_mutex);
- while (m_queue.isEmpty())
- {
- // wait until something is added to the queue
- m_bufferNotEmpty.wait(&m_mutex);
- }
- DotRunner *result = m_queue.dequeue();
+ std::unique_lock<std::mutex> locker(m_mutex);
+
+ // wait until something is added to the queue
+ m_bufferNotEmpty.wait(locker, [this]() { return !m_queue.empty(); });
+
+ DotRunner *result = m_queue.front();
+ m_queue.pop();
return result;
}
-uint DotRunnerQueue::count() const
+size_t DotRunnerQueue::size() const
{
- QMutexLocker locker(&m_mutex);
- return m_queue.count();
+ std::lock_guard<std::mutex> locker(m_mutex);
+ return m_queue.size();
}
//--------------------------------------------------------------------
@@ -284,6 +286,14 @@ DotWorkerThread::DotWorkerThread(DotRunnerQueue *queue)
{
}
+DotWorkerThread::~DotWorkerThread()
+{
+ if (isRunning())
+ {
+ wait();
+ }
+}
+
void DotWorkerThread::run()
{
DotRunner *runner;
@@ -292,3 +302,9 @@ void DotWorkerThread::run()
runner->run();
}
}
+
+void DotWorkerThread::start()
+{
+ assert(!m_thread);
+ m_thread = std::make_unique<std::thread>(&DotWorkerThread::run, this);
+}
diff --git a/src/dotrunner.h b/src/dotrunner.h
index 1b68c18..1b54617 100644
--- a/src/dotrunner.h
+++ b/src/dotrunner.h
@@ -16,70 +16,29 @@
#ifndef DOTRUNNER_H
#define DOTRUNNER_H
-#include "qcstring.h"
-#include "qlist.h"
-#include "qwaitcondition.h"
-#include "qthread.h"
-#include "qqueue.h"
-#include "qmutex.h"
-
-/** Minimal constant string class that is thread safe, once initialized. */
-class DotConstString
-{
- public:
- DotConstString() { m_str=0;}
- ~DotConstString() { delete[] m_str;}
- DotConstString(char const* s) : m_str(0) { set(s); }
- DotConstString(const QCString &s) : m_str(0) { set(s); }
- DotConstString(const DotConstString &s) : m_str(0) { set(s.data()); }
- const char *data() const { return m_str; }
- bool isEmpty() const { return m_str==0 || m_str[0]=='\0'; }
-
- private:
- void set(char const* s)
- {
- delete[] m_str;
- m_str=0;
- if (s)
- {
- m_str=new char[strlen(s) + 1];
- qstrcpy(m_str,s);
- }
- }
-
- void set(const QCString &s)
- {
- delete[] m_str;
- m_str=0;
- if (!s.isEmpty())
- {
- m_str=new char[s.length()+1];
- qstrcpy(m_str,s.data());
- }
- }
-
- DotConstString &operator=(const DotConstString &);
-
- char *m_str;
-};
+#include <string>
+#include <thread>
+#include <list>
+#include <queue>
+#include <mutex>
+#include <condition_variable>
+#include <memory>
/** Helper class to run dot from doxygen from multiple threads. */
class DotRunner
{
- public:
struct DotJob
{
- DotJob(const DotConstString & format,
- const DotConstString & output,
- const DotConstString & args)
- : format(format), output(output), args(args) {}
- DotConstString format;
- DotConstString output;
- DotConstString args;
+ DotJob(std::string f, std::string o, std::string a)
+ : format(f), output(o), args(a) {}
+ std::string format;
+ std::string output;
+ std::string args;
};
+ public:
/** Creates a runner for a dot \a file. */
- DotRunner(const QCString& absDotName, const QCString& md5Hash);
+ DotRunner(const std::string& absDotName, const std::string& md5Hash = std::string());
/** Adds an additional job to the run.
* Performing multiple jobs one file can be faster.
@@ -87,22 +46,22 @@ class DotRunner
void addJob(const char *format,const char *output);
/** Prevent cleanup of the dot file (for user provided dot files) */
- void preventCleanUp() { m_cleanUp = FALSE; }
+ void preventCleanUp() { m_cleanUp = false; }
/** Runs dot for all jobs added. */
bool run();
// DotConstString const& getFileName() { return m_file; }
- DotConstString const& getMd5Hash() { return m_md5Hash; }
+ std::string const & getMd5Hash() { return m_md5Hash; }
static bool readBoundingBox(const char* fileName, int* width, int* height, bool isEps);
private:
- DotConstString m_file;
- DotConstString m_md5Hash;
- DotConstString m_dotExe;
- bool m_cleanUp;
- QList<DotJob> m_jobs;
+ std::string m_file;
+ std::string m_md5Hash;
+ std::string m_dotExe;
+ bool m_cleanUp;
+ std::vector<DotJob> m_jobs;
};
/** Queue of dot jobs to run. */
@@ -112,20 +71,25 @@ class DotRunnerQueue
public:
void enqueue(DotRunner *runner);
DotRunner *dequeue();
- uint count() const;
+ size_t size() const;
private:
- QWaitCondition m_bufferNotEmpty;
- QQueue<DotRunner> m_queue;
- mutable QMutex m_mutex;
+ std::condition_variable m_bufferNotEmpty;
+ std::queue<DotRunner *> m_queue;
+ mutable std::mutex m_mutex;
};
/** Worker thread to execute a dot run */
-class DotWorkerThread : public QThread
+class DotWorkerThread
{
public:
DotWorkerThread(DotRunnerQueue *queue);
+ ~DotWorkerThread();
void run();
+ void start();
+ bool isRunning() { return m_thread && m_thread->joinable(); }
+ void wait() { m_thread->join(); }
private:
+ std::unique_ptr<std::thread> m_thread;
DotRunnerQueue *m_queue;
};
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 5a5e95d..dded2e7 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -13,10 +13,6 @@
*
*/
-#if !defined(_WIN32) || defined(__CYGWIN__)
-#define _DEFAULT_SOURCE 1
-#endif
-
#include <locale.h>
#include <qfileinfo.h>
@@ -33,8 +29,10 @@
#include <qptrdict.h>
#include <qtextstream.h>
+#include <algorithm>
#include <unordered_map>
#include <memory>
+#include <cinttypes>
#include "version.h"
#include "doxygen.h"
@@ -81,12 +79,11 @@
#include "fortranscanner.h"
#include "xmlcode.h"
#include "sqlcode.h"
-#include "tclscanner.h"
#include "code.h"
-#include "objcache.h"
#include "portable.h"
#include "vhdljjparser.h"
#include "vhdldocgen.h"
+#include "vhdlcode.h"
#include "eclipsehelp.h"
#include "cite.h"
#include "markdown.h"
@@ -107,6 +104,9 @@
#include "emoji.h"
#include "plantuml.h"
#include "stlsupport.h"
+#include "threadpool.h"
+#include "clangparser.h"
+#include "symbolresolver.h"
// provided by the generated file resources.cpp
extern void initResources();
@@ -117,68 +117,53 @@ extern void initResources();
#endif
// globally accessible variables
-ClassSDict *Doxygen::classSDict = 0;
-ClassSDict *Doxygen::hiddenClasses = 0;
-NamespaceSDict *Doxygen::namespaceSDict = 0;
-MemberNameSDict *Doxygen::memberNameSDict = 0;
-MemberNameSDict *Doxygen::functionNameSDict = 0;
-FileNameList *Doxygen::inputNameList = 0; // all input files
-FileNameDict *Doxygen::inputNameDict = 0;
-GroupSDict *Doxygen::groupSDict = 0;
-FormulaList *Doxygen::formulaList = 0; // all formulas
-FormulaDict *Doxygen::formulaDict = 0; // all formulas
-FormulaDict *Doxygen::formulaNameDict = 0; // the label name of all formulas
-PageSDict *Doxygen::pageSDict = 0;
-PageSDict *Doxygen::exampleSDict = 0;
-SectionDict *Doxygen::sectionDict = 0; // all page sections
-CiteDict *Doxygen::citeDict=0; // database of bibliographic references
-StringDict Doxygen::aliasDict(257); // aliases
-QDict<void> Doxygen::inputPaths(1009);
-FileNameDict *Doxygen::includeNameDict = 0; // include names
-FileNameDict *Doxygen::exampleNameDict = 0; // examples
-FileNameDict *Doxygen::imageNameDict = 0; // images
-FileNameDict *Doxygen::dotFileNameDict = 0; // dot files
-FileNameDict *Doxygen::mscFileNameDict = 0; // msc files
-FileNameDict *Doxygen::diaFileNameDict = 0; // dia files
-StringDict Doxygen::namespaceAliasDict(257); // all namespace aliases
-StringDict Doxygen::tagDestinationDict(257); // all tag locations
-QDict<void> Doxygen::expandAsDefinedDict(257); // all macros that should be expanded
-QIntDict<MemberGroupInfo> Doxygen::memGrpInfoDict(1009); // dictionary of the member groups heading
-PageDef *Doxygen::mainPage = 0;
-bool Doxygen::insideMainPage = FALSE; // are we generating docs for the main page?
-NamespaceDef *Doxygen::globalScope = 0;
-QDict<RefList> *Doxygen::xrefLists = new QDict<RefList>; // dictionary of cross-referenced item lists
-bool Doxygen::parseSourcesNeeded = FALSE;
-QTime Doxygen::runningTime;
-SearchIndexIntf *Doxygen::searchIndex=0;
-QDict<DefinitionIntf> *Doxygen::symbolMap = 0;
-QDict<Definition> *Doxygen::clangUsrMap = 0;
-bool Doxygen::outputToWizard=FALSE;
-QDict<int> * Doxygen::htmlDirMap = 0;
-QCache<LookupInfo> *Doxygen::lookupCache;
-DirSDict *Doxygen::directories;
-SDict<DirRelation> Doxygen::dirRelations(257);
-ParserManager *Doxygen::parserManager = 0;
-QCString Doxygen::htmlFileExtension;
-bool Doxygen::suppressDocWarnings = FALSE;
-//Store *Doxygen::symbolStorage;
-QCString Doxygen::objDBFileName;
-QCString Doxygen::entryDBFileName;
-QCString Doxygen::filterDBFileName;
-bool Doxygen::gatherDefines = TRUE;
-IndexList *Doxygen::indexList;
-int Doxygen::subpageNestingLevel = 0;
-bool Doxygen::userComments = FALSE;
-QCString Doxygen::spaces;
-bool Doxygen::generatingXmlOutput = FALSE;
-bool Doxygen::markdownSupport = TRUE;
-GenericsSDict *Doxygen::genericsDict;
-DocGroup Doxygen::docGroup;
-Preprocessor *Doxygen::preprocessor = 0;
+ClassLinkedMap *Doxygen::classLinkedMap = 0;
+ClassLinkedMap *Doxygen::hiddenClassLinkedMap = 0;
+NamespaceLinkedMap *Doxygen::namespaceLinkedMap = 0;
+MemberNameLinkedMap *Doxygen::memberNameLinkedMap = 0;
+MemberNameLinkedMap *Doxygen::functionNameLinkedMap = 0;
+FileNameLinkedMap *Doxygen::inputNameLinkedMap = 0;
+GroupLinkedMap *Doxygen::groupLinkedMap = 0;
+PageLinkedMap *Doxygen::pageLinkedMap = 0;
+PageLinkedMap *Doxygen::exampleLinkedMap = 0;
+StringDict Doxygen::aliasDict(257); // aliases
+StringSet Doxygen::inputPaths;
+FileNameLinkedMap *Doxygen::includeNameLinkedMap = 0; // include names
+FileNameLinkedMap *Doxygen::exampleNameLinkedMap = 0; // examples
+FileNameLinkedMap *Doxygen::imageNameLinkedMap = 0; // images
+FileNameLinkedMap *Doxygen::dotFileNameLinkedMap = 0; // dot files
+FileNameLinkedMap *Doxygen::mscFileNameLinkedMap = 0; // msc files
+FileNameLinkedMap *Doxygen::diaFileNameLinkedMap = 0; // dia files
+StringUnorderedMap Doxygen::namespaceAliasMap; // all namespace aliases
+StringDict Doxygen::tagDestinationDict(257); // all tag locations
+StringUnorderedSet Doxygen::expandAsDefinedSet; // all macros that should be expanded
+MemberGroupInfoMap Doxygen::memberGroupInfoMap; // dictionary of the member groups heading
+std::unique_ptr<PageDef> Doxygen::mainPage;
+bool Doxygen::insideMainPage = FALSE; // are we generating docs for the main page?
+NamespaceDefMutable *Doxygen::globalScope = 0;
+bool Doxygen::parseSourcesNeeded = FALSE;
+SearchIndexIntf *Doxygen::searchIndex=0;
+SymbolMap<Definition> Doxygen::symbolMap;
+ClangUsrMap *Doxygen::clangUsrMap = 0;
+bool Doxygen::outputToWizard=FALSE;
+Cache<std::string,LookupInfo> *Doxygen::lookupCache;
+DirLinkedMap *Doxygen::dirLinkedMap;
+DirRelationLinkedMap Doxygen::dirRelations;
+ParserManager *Doxygen::parserManager = 0;
+QCString Doxygen::htmlFileExtension;
+bool Doxygen::suppressDocWarnings = FALSE;
+QCString Doxygen::filterDBFileName;
+IndexList *Doxygen::indexList;
+int Doxygen::subpageNestingLevel = 0;
+bool Doxygen::userComments = FALSE;
+QCString Doxygen::spaces;
+bool Doxygen::generatingXmlOutput = FALSE;
+DefinesPerFileList Doxygen::macroDefinitions;
+bool Doxygen::clangAssistedParsing = FALSE;
// locally accessible globals
-static std::unordered_map< std::string, const Entry* > g_classEntries;
-static StringList g_inputFiles;
+static std::multimap< std::string, const Entry* > g_classEntries;
+static StringVector g_inputFiles;
static QDict<void> g_compoundKeywordDict(7); // keywords recognised as compounds
static OutputList *g_outputList = 0; // list of output generating objects
static QDict<FileDef> g_usingDeclarations(1009); // used classes
@@ -192,25 +177,23 @@ void clearAll()
//g_excludeNameDict.clear();
//delete g_outputList; g_outputList=0;
- Doxygen::classSDict->clear();
- Doxygen::namespaceSDict->clear();
- Doxygen::pageSDict->clear();
- Doxygen::exampleSDict->clear();
- Doxygen::inputNameList->clear();
- Doxygen::formulaList->clear();
- Doxygen::sectionDict->clear();
- Doxygen::inputNameDict->clear();
- Doxygen::includeNameDict->clear();
- Doxygen::exampleNameDict->clear();
- Doxygen::imageNameDict->clear();
- Doxygen::dotFileNameDict->clear();
- Doxygen::mscFileNameDict->clear();
- Doxygen::diaFileNameDict->clear();
- Doxygen::formulaDict->clear();
- Doxygen::formulaNameDict->clear();
+ Doxygen::classLinkedMap->clear();
+ Doxygen::hiddenClassLinkedMap->clear();
+ Doxygen::namespaceLinkedMap->clear();
+ Doxygen::pageLinkedMap->clear();
+ Doxygen::exampleLinkedMap->clear();
+ Doxygen::inputNameLinkedMap->clear();
+ Doxygen::includeNameLinkedMap->clear();
+ Doxygen::exampleNameLinkedMap->clear();
+ Doxygen::imageNameLinkedMap->clear();
+ Doxygen::dotFileNameLinkedMap->clear();
+ Doxygen::mscFileNameLinkedMap->clear();
+ Doxygen::diaFileNameLinkedMap->clear();
Doxygen::tagDestinationDict.clear();
- delete Doxygen::citeDict;
- delete Doxygen::mainPage; Doxygen::mainPage=0;
+ SectionManager::instance().clear();
+ CitationManager::instance().clear();
+ Doxygen::mainPage.reset();
+ FormulaManager::instance().clear();
}
class Statistics
@@ -219,7 +202,7 @@ class Statistics
Statistics() { stats.setAutoDelete(TRUE); }
void begin(const char *name)
{
- msg(name);
+ msg("%s", name);
stat *entry= new stat(name,0);
stats.append(entry);
time.restart();
@@ -260,8 +243,9 @@ class Statistics
void statistics()
{
- fprintf(stderr,"--- inputNameDict stats ----\n");
- Doxygen::inputNameDict->statistics();
+#if 0
+ fprintf(stderr,"--- inputNameLinkedMap stats ----\n");
+ Doxygen::inputNameLinkedMap->statistics();
fprintf(stderr,"--- includeNameDict stats ----\n");
Doxygen::includeNameDict->statistics();
fprintf(stderr,"--- exampleNameDict stats ----\n");
@@ -274,30 +258,22 @@ void statistics()
Doxygen::mscFileNameDict->statistics();
fprintf(stderr,"--- diaFileNameDict stats ----\n");
Doxygen::diaFileNameDict->statistics();
+ fprintf(stderr,"--- memGrpInfoDict stats ----\n");
+ Doxygen::memGrpInfoDict.statistics();
+#endif
//fprintf(stderr,"--- g_excludeNameDict stats ----\n");
//g_excludeNameDict.statistics();
fprintf(stderr,"--- aliasDict stats ----\n");
Doxygen::aliasDict.statistics();
- fprintf(stderr,"--- typedefDict stats ----\n");
- fprintf(stderr,"--- namespaceAliasDict stats ----\n");
- Doxygen::namespaceAliasDict.statistics();
- fprintf(stderr,"--- formulaDict stats ----\n");
- Doxygen::formulaDict->statistics();
- fprintf(stderr,"--- formulaNameDict stats ----\n");
- Doxygen::formulaNameDict->statistics();
fprintf(stderr,"--- tagDestinationDict stats ----\n");
Doxygen::tagDestinationDict.statistics();
fprintf(stderr,"--- g_compoundKeywordDict stats ----\n");
g_compoundKeywordDict.statistics();
- fprintf(stderr,"--- expandAsDefinedDict stats ----\n");
- Doxygen::expandAsDefinedDict.statistics();
- fprintf(stderr,"--- memGrpInfoDict stats ----\n");
- Doxygen::memGrpInfoDict.statistics();
}
-static void addMemberDocs(const Entry *root,MemberDef *md, const char *funcDecl,
+static void addMemberDocs(const Entry *root,MemberDefMutable *md, const char *funcDecl,
const ArgumentList *al,bool over_load,uint64 spec);
static void findMember(const Entry *root,
const QCString &relates,
@@ -318,7 +294,7 @@ enum FindBaseClassRelation_Mode
static bool findClassRelation(
const Entry *root,
Definition *context,
- ClassDef *cd,
+ ClassDefMutable *cd,
const BaseInfo *bi,
QDict<int> *templateNames,
/*bool insertUndocumented*/
@@ -328,7 +304,7 @@ static bool findClassRelation(
//----------------------------------------------------------------------------
-static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n,
+static Definition *findScopeFromQualifiedName(NamespaceDefMutable *startScope,const QCString &n,
FileDef *fileScope,const TagInfo *tagInfo);
static void addPageToContext(PageDef *pd,Entry *root)
@@ -355,7 +331,7 @@ static void addRelatedPage(Entry *root)
GroupDef *gd=0;
for (const Grouping &g : root->groups)
{
- if (!g.groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g.groupname))) break;
+ if (!g.groupname.isEmpty() && (gd=Doxygen::groupLinkedMap->find(g.groupname))) break;
}
//printf("---> addRelatedPage() %s gd=%p\n",root->name.data(),gd);
QCString doc;
@@ -369,7 +345,9 @@ static void addRelatedPage(Entry *root)
}
PageDef *pd = addRelatedPage(root->name,root->args,doc,
- root->docFile,root->docLine,
+ root->docFile,
+ root->docLine,
+ root->startLine,
root->sli,
gd,root->tagInfo(),
FALSE,
@@ -394,7 +372,7 @@ static void buildGroupListFiltered(const Entry *root,bool additional, bool inclu
if ((root->groupDocType==Entry::GROUPDOC_NORMAL && !additional) ||
(root->groupDocType!=Entry::GROUPDOC_NORMAL && additional))
{
- GroupDef *gd = Doxygen::groupSDict->find(root->name);
+ GroupDef *gd = Doxygen::groupLinkedMap->find(root->name);
//printf("Processing group '%s':'%s' add=%d ext=%d gd=%p\n",
// root->type.data(),root->name.data(),additional,includeExternal,gd);
@@ -421,19 +399,22 @@ static void buildGroupListFiltered(const Entry *root,bool additional, bool inclu
{
if (root->tagInfo())
{
- gd = createGroupDef(root->fileName,root->startLine,root->name,root->type,root->tagInfo()->fileName);
+ gd = Doxygen::groupLinkedMap->add(root->name,
+ std::unique_ptr<GroupDef>(
+ createGroupDef(root->fileName,root->startLine,root->name,root->type,root->tagInfo()->fileName)));
gd->setReference(root->tagInfo()->tagName);
}
else
{
- gd = createGroupDef(root->fileName,root->startLine,root->name,root->type);
+ gd = Doxygen::groupLinkedMap->add(root->name,
+ std::unique_ptr<GroupDef>(
+ createGroupDef(root->fileName,root->startLine,root->name,root->type)));
}
gd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
// allow empty docs for group
gd->setDocumentation(!root->doc.isEmpty() ? root->doc : QCString(" "),root->docFile,root->docLine,FALSE);
gd->setInbodyDocumentation( root->inbodyDocs, root->inbodyFile, root->inbodyLine );
gd->addSectionsToDefinition(root->anchors);
- Doxygen::groupSDict->append(root->name,gd);
gd->setRefItems(root->sli);
gd->setLanguage(root->lang);
}
@@ -463,7 +444,7 @@ static void findGroupScope(const Entry *root)
root->parent() && !root->parent()->name.isEmpty())
{
GroupDef *gd;
- if ((gd=Doxygen::groupSDict->find(root->name)))
+ if ((gd=Doxygen::groupLinkedMap->find(root->name)))
{
QCString scope = root->parent()->name;
if (root->parent()->section==Entry::PACKAGEDOC_SEC)
@@ -490,7 +471,7 @@ static void organizeSubGroupsFiltered(const Entry *root,bool additional)
(root->groupDocType!=Entry::GROUPDOC_NORMAL && additional))
{
GroupDef *gd;
- if ((gd=Doxygen::groupSDict->find(root->name)))
+ if ((gd=Doxygen::groupLinkedMap->find(root->name)))
{
//printf("adding %s to group %s\n",root->name.data(),gd->name().data());
addGroupToGroups(root,gd);
@@ -520,7 +501,7 @@ static void buildFileList(const Entry *root)
)
{
bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->name,ambig);
+ FileDef *fd=findFileDef(Doxygen::inputNameLinkedMap,root->name,ambig);
if (!fd || ambig)
{
int save_ambig = ambig;
@@ -528,7 +509,7 @@ static void buildFileList(const Entry *root)
// directory as the describing file.
QCString fn = root->fileName;
int newIndex=fn.findRev('/');
- fd=findFileDef(Doxygen::inputNameDict,fn.left(newIndex) + "/" + root->name,ambig);
+ fd=findFileDef(Doxygen::inputNameLinkedMap,fn.left(newIndex) + "/" + root->name,ambig);
if (!fd) ambig = save_ambig;
}
//printf("**************** root->name=%s fd=%p\n",root->name.data(),fd);
@@ -545,7 +526,7 @@ static void buildFileList(const Entry *root)
for (const Grouping &g : root->groups)
{
GroupDef *gd=0;
- if (!g.groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g.groupname)))
+ if (!g.groupname.isEmpty() && (gd=Doxygen::groupLinkedMap->find(g.groupname)))
{
gd->addFile(fd);
fd->makePartOfGroup(gd);
@@ -563,7 +544,7 @@ static void buildFileList(const Entry *root)
if (ambig) // name is ambiguous
{
text+="matches the following input files:\n";
- text+=showFileDefMatches(Doxygen::inputNameDict,root->name);
+ text+=showFileDefMatches(Doxygen::inputNameLinkedMap,root->name);
text+="Please use a more specific name by "
"including a (larger) part of the path!";
}
@@ -571,13 +552,13 @@ static void buildFileList(const Entry *root)
{
text+="is not an input file";
}
- warn(fn,root->startLine,text);
+ warn(fn,root->startLine,"%s", text.data());
}
}
for (const auto &e : root->children()) buildFileList(e.get());
}
-static void addIncludeFile(ClassDef *cd,FileDef *ifd,const Entry *root)
+static void addIncludeFile(ClassDefMutable *cd,FileDef *ifd,const Entry *root)
{
if (
(!root->doc.stripWhiteSpace().isEmpty() ||
@@ -606,7 +587,7 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,const Entry *root)
// see if we need to include a verbatim copy of the header file
//printf("root->includeFile=%s\n",root->includeFile.data());
if (!includeFile.isEmpty() &&
- (fd=findFileDef(Doxygen::inputNameDict,includeFile,ambig))==0
+ (fd=findFileDef(Doxygen::inputNameLinkedMap,includeFile,ambig))==0
)
{ // explicit request
QCString text;
@@ -617,7 +598,7 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,const Entry *root)
if (ambig) // name is ambiguous
{
text+="matches the following input files:\n";
- text+=showFileDefMatches(Doxygen::inputNameDict,root->includeFile);
+ text+=showFileDefMatches(Doxygen::inputNameLinkedMap,root->includeFile);
text+="Please use a more specific name by "
"including a (larger) part of the path!";
}
@@ -625,7 +606,7 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,const Entry *root)
{
text+="is not an input file";
}
- warn(root->fileName,root->startLine,text);
+ warn(root->fileName,root->startLine, "%s", text.data());
}
else if (includeFile.isEmpty() && ifd &&
// see if the file extension makes sense
@@ -652,7 +633,7 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,const Entry *root)
iName=fd->name();
}
}
- else if (!Config_getList(STRIP_FROM_INC_PATH).isEmpty())
+ else if (!Config_getList(STRIP_FROM_INC_PATH).empty())
{
iName=stripFromIncludePath(fd->absFilePath());
}
@@ -731,13 +712,36 @@ static Definition *findScope(Entry *root,int level=0)
}
#endif
+QCString stripTemplateSpecifiers(const QCString &s)
+{
+ int l = s.length();
+ int count=0;
+ int round=0;
+ QCString result;
+ for (int i=0;i<l;i++)
+ {
+ char c=s.at(i);
+ if (c=='(') round++;
+ else if (c==')' && round>0) round--;
+ else if (c=='<' && round==0) count++;
+ if (count==0)
+ {
+ result+=c;
+ }
+ if (c=='>' && round==0 && count>0) count--;
+ }
+ //printf("stripTemplateSpecifiers(%s)=%s\n",s.data(),result.data());
+ return result;
+}
+
/*! returns the Definition object belonging to the first \a level levels of
* full qualified name \a name. Creates an artificial scope if the scope is
* not found and set the parent/child scope relation if the scope is found.
*/
-static Definition *buildScopeFromQualifiedName(const QCString name,
- int level,SrcLangExt lang,const TagInfo *tagInfo)
+static Definition *buildScopeFromQualifiedName(const QCString name_,SrcLangExt lang,const TagInfo *tagInfo)
{
+ QCString name = stripTemplateSpecifiers(name_);
+ int level = name.contains("::");
//printf("buildScopeFromQualifiedName(%s) level=%d\n",name.data(),level);
int i=0;
int p=0,l;
@@ -751,27 +755,33 @@ static Definition *buildScopeFromQualifiedName(const QCString name,
if (nsName.isEmpty()) return prevScope;
if (!fullScope.isEmpty()) fullScope+="::";
fullScope+=nsName;
- NamespaceDef *nd=Doxygen::namespaceSDict->find(fullScope);
- Definition *innerScope = nd;
+ NamespaceDef *nd=Doxygen::namespaceLinkedMap->find(fullScope);
+ DefinitionMutable *innerScope = toDefinitionMutable(nd);
ClassDef *cd=0;
if (nd==0) cd = getClass(fullScope);
if (nd==0 && cd) // scope is a class
{
- innerScope = cd;
+ innerScope = toDefinitionMutable(cd);
}
else if (nd==0 && cd==0 && fullScope.find('<')==-1) // scope is not known and could be a namespace!
{
// introduce bogus namespace
//printf("++ adding dummy namespace %s to %s tagInfo=%p\n",nsName.data(),prevScope->name().data(),tagInfo);
- nd=createNamespaceDef(
- "[generated]",1,1,fullScope,
- tagInfo?tagInfo->tagName:QCString(),
- tagInfo?tagInfo->fileName:QCString());
- nd->setLanguage(lang);
-
- // add namespace to the list
- Doxygen::namespaceSDict->inSort(fullScope,nd);
- innerScope = nd;
+ NamespaceDefMutable *newNd=
+ toNamespaceDefMutable(
+ Doxygen::namespaceLinkedMap->add(fullScope,
+ std::unique_ptr<NamespaceDef>(
+ createNamespaceDef(
+ "[generated]",1,1,fullScope,
+ tagInfo?tagInfo->tagName:QCString(),
+ tagInfo?tagInfo->fileName:QCString()))));
+ if (newNd)
+ {
+ newNd->setLanguage(lang);
+ newNd->setArtificial(TRUE);
+ // add namespace to the list
+ innerScope = newNd;
+ }
}
else // scope is a namespace
{
@@ -779,7 +789,11 @@ static Definition *buildScopeFromQualifiedName(const QCString name,
if (innerScope)
{
// make the parent/child scope relation
- prevScope->addInnerCompound(innerScope);
+ DefinitionMutable *prevScopeMutable = toDefinitionMutable(prevScope);
+ if (prevScopeMutable)
+ {
+ prevScopeMutable->addInnerCompound(toDefinition(innerScope));
+ }
innerScope->setOuterScope(prevScope);
}
else // current scope is a class, so return only the namespace part...
@@ -788,17 +802,17 @@ static Definition *buildScopeFromQualifiedName(const QCString name,
}
// proceed to the next scope fragment
p=idx+l+2;
- prevScope=innerScope;
+ prevScope=toDefinition(innerScope);
i++;
}
return prevScope;
}
-static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n,
+static Definition *findScopeFromQualifiedName(NamespaceDefMutable *startScope,const QCString &n,
FileDef *fileScope,const TagInfo *tagInfo)
{
//printf("<findScopeFromQualifiedName(%s,%s)\n",startScope ? startScope->name().data() : 0, n.data());
- Definition *resultScope=startScope;
+ Definition *resultScope=toDefinition(startScope);
if (resultScope==0) resultScope=Doxygen::globalScope;
QCString scope=stripTemplateSpecifiersFromScope(n,FALSE);
int l1=0,i1;
@@ -814,21 +828,17 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
QCString nestedNameSpecifier = scope.mid(i1,l1);
Definition *orgScope = resultScope;
//printf(" nestedNameSpecifier=%s\n",nestedNameSpecifier.data());
- resultScope = resultScope->findInnerCompound(nestedNameSpecifier);
+ resultScope = const_cast<Definition*>(resultScope->findInnerCompound(nestedNameSpecifier));
//printf(" resultScope=%p\n",resultScope);
if (resultScope==0)
{
- NamespaceSDict *usedNamespaces;
- if (orgScope==Doxygen::globalScope && fileScope &&
- (usedNamespaces = fileScope->getUsedNamespaces()))
+ if (orgScope==Doxygen::globalScope && fileScope && !fileScope->getUsedNamespaces().empty())
// also search for used namespaces
{
- NamespaceSDict::Iterator ni(*usedNamespaces);
- NamespaceDef *nd;
- for (ni.toFirst();((nd=ni.current()) && resultScope==0);++ni)
+ for (const auto &nd : fileScope->getUsedNamespaces())
{
- // restart search within the used namespace
- resultScope = findScopeFromQualifiedName(nd,n,fileScope,tagInfo);
+ resultScope = findScopeFromQualifiedName(toNamespaceDefMutable(nd),n,fileScope,tagInfo);
+ if (resultScope!=0) break;
}
if (resultScope)
{
@@ -860,8 +870,7 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
// so use this instead.
QCString fqn = QCString(ui.currentKey())+
scope.right(scope.length()-p);
- resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"),
- startScope->getLanguage(),0);
+ resultScope = buildScopeFromQualifiedName(fqn,startScope->getLanguage(),0);
//printf("Creating scope from fqn=%s result %p\n",fqn.data(),resultScope);
if (resultScope)
{
@@ -883,9 +892,9 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
return resultScope;
}
-ArgumentList getTemplateArgumentsFromName(
+std::unique_ptr<ArgumentList> getTemplateArgumentsFromName(
const QCString &name,
- const std::vector<ArgumentList> &tArgLists)
+ const ArgumentLists &tArgLists)
{
// for each scope fragment, check if it is a template and advance through
// the list if so.
@@ -893,7 +902,7 @@ ArgumentList getTemplateArgumentsFromName(
auto alIt = tArgLists.begin();
while ((i=name.find("::",p))!=-1 && alIt!=tArgLists.end())
{
- NamespaceDef *nd = Doxygen::namespaceSDict->find(name.left(i));
+ NamespaceDef *nd = Doxygen::namespaceLinkedMap->find(name.left(i));
if (nd==0)
{
ClassDef *cd = getClass(name.left(i));
@@ -907,7 +916,9 @@ ArgumentList getTemplateArgumentsFromName(
}
p=i+2;
}
- return alIt!=tArgLists.end() ? *alIt : ArgumentList();
+ return alIt!=tArgLists.end() ?
+ std::make_unique<ArgumentList>(*alIt) :
+ std::unique_ptr<ArgumentList>();
}
static
@@ -991,7 +1002,7 @@ static void addClassToContext(const Entry *root)
}
// see if we already found the class before
- ClassDef *cd = getClass(qualifiedName);
+ ClassDefMutable *cd = getClassMutable(qualifiedName);
Debug::print(Debug::Classes,0, " Found class with name %s (qualifiedName=%s -> cd=%p)\n",
cd ? qPrint(cd->name()) : qPrint(root->name), qPrint(qualifiedName),cd);
@@ -1009,20 +1020,26 @@ static void addClassToContext(const Entry *root)
cd->setDocumentation(root->doc,root->docFile,root->docLine);
cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- if (root->bodyLine!=-1 && cd->getStartBodyLine()==-1)
+ if ((root->spec&Entry::ForwardDecl)==0 && cd->isForwardDeclared())
{
- cd->setBodySegment(root->bodyLine,root->endBodyLine);
- cd->setBodyDef(fd);
+ cd->setDefFile(root->fileName,root->startLine,root->startColumn);
+ if (root->bodyLine!=-1)
+ {
+ cd->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
+ cd->setBodyDef(fd);
+ }
}
- //cd->setName(fullName); // change name to match docs
if (cd->templateArguments().empty() || (cd->isForwardDeclared() && (root->spec&Entry::ForwardDecl)==0))
{
// this happens if a template class declared with @class is found
// before the actual definition or if a forward declaration has different template
// parameter names.
- ArgumentList tArgList = getTemplateArgumentsFromName(cd->name(),root->tArgLists);
- cd->setTemplateArguments(tArgList);
+ std::unique_ptr<ArgumentList> tArgList = getTemplateArgumentsFromName(cd->name(),root->tArgLists);
+ if (tArgList)
+ {
+ cd->setTemplateArguments(*tArgList);
+ }
}
cd->setCompoundType(convertToCompoundType(root->section,root->spec));
@@ -1052,81 +1069,92 @@ static void addClassToContext(const Entry *root)
// symbols imported via tag files may come without the parent scope,
// so we artificially create it here
{
- buildScopeFromQualifiedName(fullName,fullName.contains("::"),root->lang,tagInfo);
+ buildScopeFromQualifiedName(fullName,root->lang,tagInfo);
}
}
- ArgumentList tArgList;
- if ((root->lang==SrcLangExt_CSharp || root->lang==SrcLangExt_Java) && (i=fullName.find('<'))!=-1)
+ std::unique_ptr<ArgumentList> tArgList;
+ if ((root->lang==SrcLangExt_CSharp || root->lang==SrcLangExt_Java) && (i=fullName.findRev('<'))!=-1)
{
// a Java/C# generic class looks like a C++ specialization, so we need to split the
// name and template arguments here
- stringToArgumentList(root->lang,fullName.mid(i),tArgList);
+ tArgList = stringToArgumentList(root->lang,fullName.mid(i));
fullName=fullName.left(i);
}
else
{
tArgList = getTemplateArgumentsFromName(fullName,root->tArgLists);
}
- cd=createClassDef(tagInfo?tagName:root->fileName,root->startLine,root->startColumn,
- fullName,sec,tagName,refFileName,TRUE,root->spec&Entry::Enum);
- Debug::print(Debug::Classes,0," New class '%s' (sec=0x%08x)! #tArgLists=%d tagInfo=%p\n",
- qPrint(fullName),sec,root->tArgLists.size(), tagInfo);
- cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
- cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- cd->setLanguage(root->lang);
- cd->setId(root->id);
- cd->setHidden(root->hidden);
- cd->setArtificial(root->artificial);
- cd->setClassSpecifier(root->spec);
- cd->setTypeConstraints(root->typeConstr);
- //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data());
-
- //printf("class %s template args=%s\n",fullName.data(),
- // tArgList ? tempArgListToString(tArgList,root->lang).data() : "<none>");
- cd->setTemplateArguments(tArgList);
- cd->setProtection(root->protection);
- cd->setIsStatic(root->stat);
-
- // file definition containing the class cd
- cd->setBodySegment(root->bodyLine,root->endBodyLine);
- cd->setBodyDef(fd);
-
- cd->setMetaData(root->metaData);
-
- // see if the class is found inside a namespace
- //bool found=addNamespace(root,cd);
-
- cd->insertUsedFile(fd);
-
// add class to the list
//printf("ClassDict.insert(%s)\n",fullName.data());
- Doxygen::classSDict->append(fullName,cd);
+ cd = toClassDefMutable(
+ Doxygen::classLinkedMap->add(fullName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(tagInfo?tagName:root->fileName,root->startLine,root->startColumn,
+ fullName,sec,tagName,refFileName,TRUE,root->spec&Entry::Enum) )));
+ if (cd)
+ {
+ Debug::print(Debug::Classes,0," New class '%s' (sec=0x%08x)! #tArgLists=%d tagInfo=%p hidden=%d artificial=%d\n",
+ qPrint(fullName),sec,root->tArgLists.size(), tagInfo,root->hidden,root->artificial);
+ cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
+ cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ cd->setLanguage(root->lang);
+ cd->setId(root->id);
+ cd->setHidden(root->hidden);
+ cd->setArtificial(root->artificial);
+ cd->setClassSpecifier(root->spec);
+ cd->setTypeConstraints(root->typeConstr);
+ //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data());
+
+ //printf("class %s template args=%s\n",fullName.data(),
+ // tArgList ? tempArgListToString(tArgList,root->lang).data() : "<none>");
+ if (tArgList)
+ {
+ cd->setTemplateArguments(*tArgList);
+ }
+ cd->setProtection(root->protection);
+ cd->setIsStatic(root->stat);
+
+ // file definition containing the class cd
+ cd->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
+ cd->setBodyDef(fd);
+
+ cd->setMetaData(root->metaData);
- if (cd->isGeneric()) // generics are also stored in a separate dictionary for fast lookup of instances
+ // see if the class is found inside a namespace
+ //bool found=addNamespace(root,cd);
+
+ cd->insertUsedFile(fd);
+ }
+ else
{
- //printf("inserting generic '%s' cd=%p\n",fullName.data(),cd);
- Doxygen::genericsDict->insert(fullName,cd);
+ Debug::print(Debug::Classes,0," Not added class '%s', already exists as alias\n", qPrint(fullName));
}
}
- cd->addSectionsToDefinition(root->anchors);
- if (!root->subGrouping) cd->setSubGrouping(FALSE);
- if (cd->hasDocumentation())
- {
- addIncludeFile(cd,fd,root);
- }
- if (fd && (root->section & Entry::COMPOUND_MASK))
+ if (cd)
{
- //printf(">> Inserting class '%s' in file '%s' (root->fileName='%s')\n",
- // cd->name().data(),
- // fd->name().data(),
- // root->fileName.data()
- // );
- cd->setFileDef(fd);
- fd->insertClass(cd);
+ cd->addSectionsToDefinition(root->anchors);
+ if (!root->subGrouping) cd->setSubGrouping(FALSE);
+ if ((root->spec&Entry::ForwardDecl)==0)
+ {
+ if (cd->hasDocumentation())
+ {
+ addIncludeFile(cd,fd,root);
+ }
+ if (fd && (root->section & Entry::COMPOUND_MASK))
+ {
+ //printf(">> Inserting class '%s' in file '%s' (root->fileName='%s')\n",
+ // cd->name().data(),
+ // fd->name().data(),
+ // root->fileName.data()
+ // );
+ cd->setFileDef(fd);
+ fd->insertClass(cd);
+ }
+ }
+ addClassToGroups(root,cd);
+ cd->setRefItems(root->sli);
}
- addClassToGroups(root,cd);
- cd->setRefItems(root->sli);
}
//----------------------------------------------------------------------
@@ -1157,8 +1185,7 @@ static void buildClassDocList(const Entry *root)
static void resolveClassNestingRelations()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- for (cli.toFirst();cli.current();++cli) cli.current()->setVisited(FALSE);
+ ClassDefSet visitedClasses;
bool done=FALSE;
int iteration=0;
@@ -1166,38 +1193,53 @@ static void resolveClassNestingRelations()
{
done=TRUE;
++iteration;
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ struct ClassAlias
+ {
+ ClassAlias(const QCString &name,std::unique_ptr<ClassDef> cd,DefinitionMutable *ctx) :
+ aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
+ const QCString aliasFullName;
+ std::unique_ptr<ClassDef> aliasCd;
+ DefinitionMutable *aliasContext;
+ };
+ std::vector<ClassAlias> aliases;
+ for (const auto &icd : *Doxygen::classLinkedMap)
{
- if (!cd->isVisited())
+ ClassDefMutable *cd = toClassDefMutable(icd.get());
+ if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
{
- QCString name = stripAnonymousNamespaceScope(cd->name());
+ QCString name = stripAnonymousNamespaceScope(icd->name());
//printf("processing=%s, iteration=%d\n",cd->name().data(),iteration);
// also add class to the correct structural context
Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,
- name,cd->getFileDef(),0);
+ name,icd->getFileDef(),0);
if (d)
{
//printf("****** adding %s to scope %s in iteration %d\n",cd->name().data(),d->name().data(),iteration);
- d->addInnerCompound(cd);
+ DefinitionMutable *dm = toDefinitionMutable(d);
+ if (dm)
+ {
+ dm->addInnerCompound(cd);
+ }
cd->setOuterScope(d);
// for inline namespace add an alias of the class to the outer scope
- while (d->definitionType()==DefinitionIntf::TypeNamespace)
+ while (d->definitionType()==Definition::TypeNamespace)
{
- NamespaceDef *nd = dynamic_cast<NamespaceDef*>(d);
- //printf("d->isInline()=%d\n",nd->isInline());
- if (nd->isInline())
+ NamespaceDef *nd = toNamespaceDef(d);
+ //printf("nd->isInline()=%d\n",nd->isInline());
+ if (nd && nd->isInline())
{
d = d->getOuterScope();
if (d)
{
- ClassDef *aliasCd = createClassDefAlias(d,cd);
- d->addInnerCompound(aliasCd);
- QCString aliasFullName = d->qualifiedName()+"::"+aliasCd->localName();
- Doxygen::classSDict->append(aliasFullName,aliasCd);
- //printf("adding %s to %s as %s\n",qPrint(aliasCd->name()),qPrint(d->name()),qPrint(aliasFullName));
- aliasCd->setVisited(TRUE);
+ dm = toDefinitionMutable(d);
+ if (dm)
+ {
+ std::unique_ptr<ClassDef> aliasCd { createClassDefAlias(d,cd) };
+ QCString aliasFullName = d->qualifiedName()+"::"+aliasCd->localName();
+ aliases.push_back(ClassAlias(aliasFullName,std::move(aliasCd),dm));
+ //printf("adding %s to %s as %s\n",qPrint(aliasCd->name()),qPrint(d->name()),qPrint(aliasFullName));
+ }
}
}
else
@@ -1206,7 +1248,7 @@ static void resolveClassNestingRelations()
}
}
- cd->setVisited(TRUE);
+ visitedClasses.insert(icd.get());
done=FALSE;
}
//else
@@ -1215,25 +1257,38 @@ static void resolveClassNestingRelations()
//}
}
}
+ // add aliases
+ for (auto &alias : aliases)
+ {
+ ClassDef *aliasCd = Doxygen::classLinkedMap->add(alias.aliasFullName,std::move(alias.aliasCd));
+ if (aliasCd)
+ {
+ alias.aliasContext->addInnerCompound(aliasCd);
+ }
+ }
}
//give warnings for unresolved compounds
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &icd : *Doxygen::classLinkedMap)
{
- if (!cd->isVisited())
+ ClassDefMutable *cd = toClassDefMutable(icd.get());
+ if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
{
QCString name = stripAnonymousNamespaceScope(cd->name());
//printf("processing unresolved=%s, iteration=%d\n",cd->name().data(),iteration);
/// create the scope artificially
// anyway, so we can at least relate scopes properly.
- Definition *d = buildScopeFromQualifiedName(name,name.contains("::"),cd->getLanguage(),0);
- if (d!=cd && !cd->getDefFileName().isEmpty())
+ Definition *d = buildScopeFromQualifiedName(name,cd->getLanguage(),0);
+ if (d && d!=cd && !cd->getDefFileName().isEmpty())
// avoid recursion in case of redundant scopes, i.e: namespace N { class N::C {}; }
// for this case doxygen assumes the existence of a namespace N::N in which C is to be found!
// also avoid warning for stuff imported via a tagfile.
{
- d->addInnerCompound(cd);
+ DefinitionMutable *dm = toDefinitionMutable(d);
+ if (dm)
+ {
+ dm->addInnerCompound(cd);
+ }
cd->setOuterScope(d);
warn(cd->getDefFileName(),cd->getDefLine(),
"Internal inconsistency: scope for class %s not "
@@ -1250,103 +1305,103 @@ void distributeClassGroupRelations()
//if (!inlineGroupedClasses) return;
//printf("** distributeClassGroupRelations()\n");
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- for (cli.toFirst();cli.current();++cli) cli.current()->setVisited(FALSE);
-
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ ClassDefSet visitedClasses;
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
//printf("Checking %s\n",cd->name().data());
// distribute the group to nested classes as well
- if (!cd->isVisited() && cd->partOfGroups()!=0 && cd->getClassSDict())
+ if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
{
//printf(" Candidate for merging\n");
- ClassSDict::Iterator ncli(*cd->getClassSDict());
- ClassDef *ncd;
- GroupDef *gd = cd->partOfGroups()->at(0);
- for (ncli.toFirst();(ncd=ncli.current());++ncli)
+ const GroupDef *gd = cd->partOfGroups().front();
+ for (const auto &ncd : cd->getClasses())
{
- if (ncd->partOfGroups()==0)
+ ClassDefMutable *ncdm = toClassDefMutable(ncd);
+ if (ncdm && ncdm->partOfGroups().empty())
{
//printf(" Adding %s to group '%s'\n",ncd->name().data(),
// gd->groupTitle());
- ncd->makePartOfGroup(gd);
- gd->addClass(ncd);
+ ncdm->makePartOfGroup(gd);
+ const_cast<GroupDef*>(gd)->addClass(ncdm);
}
}
- cd->setVisited(TRUE); // only visit every class once
+ visitedClasses.insert(cd.get()); // only visit every class once
}
}
}
//----------------------------
-static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QCString &fieldName)
+static ClassDefMutable *createTagLessInstance(const ClassDef *rootCd,const ClassDef *templ,const QCString &fieldName)
{
QCString fullName = removeAnonymousScopes(templ->name());
if (fullName.right(2)=="::") fullName=fullName.left(fullName.length()-2);
fullName+="."+fieldName;
- ClassDef *cd = createClassDef(templ->getDefFileName(),
+
+ //printf("** adding class %s based on %s\n",fullName.data(),templ->name().data());
+ ClassDefMutable *cd = toClassDefMutable(
+ Doxygen::classLinkedMap->add(fullName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(templ->getDefFileName(),
templ->getDefLine(),
templ->getDefColumn(),
fullName,
- templ->compoundType());
- cd->setDocumentation(templ->documentation(),templ->docFile(),templ->docLine()); // copy docs to definition
- cd->setBriefDescription(templ->briefDescription(),templ->briefFile(),templ->briefLine());
- cd->setLanguage(templ->getLanguage());
- cd->setBodySegment(templ->getStartBodyLine(),templ->getEndBodyLine());
- cd->setBodyDef(templ->getBodyDef());
-
- cd->setOuterScope(rootCd->getOuterScope());
- if (rootCd->getOuterScope()!=Doxygen::globalScope)
+ templ->compoundType()))));
+ if (cd)
{
- rootCd->getOuterScope()->addInnerCompound(cd);
- }
+ cd->setDocumentation(templ->documentation(),templ->docFile(),templ->docLine()); // copy docs to definition
+ cd->setBriefDescription(templ->briefDescription(),templ->briefFile(),templ->briefLine());
+ cd->setLanguage(templ->getLanguage());
+ cd->setBodySegment(templ->getDefLine(),templ->getStartBodyLine(),templ->getEndBodyLine());
+ cd->setBodyDef(templ->getBodyDef());
- FileDef *fd = templ->getFileDef();
- if (fd)
- {
- cd->setFileDef(fd);
- fd->insertClass(cd);
- }
- GroupList *groups = rootCd->partOfGroups();
- if ( groups!=0 )
- {
- GroupListIterator gli(*groups);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ cd->setOuterScope(rootCd->getOuterScope());
+ if (rootCd->getOuterScope()!=Doxygen::globalScope)
+ {
+ DefinitionMutable *outerScope = toDefinitionMutable(rootCd->getOuterScope());
+ if (outerScope)
+ {
+ outerScope->addInnerCompound(cd);
+ }
+ }
+
+ FileDef *fd = templ->getFileDef();
+ if (fd)
+ {
+ cd->setFileDef(fd);
+ fd->insertClass(cd);
+ }
+ for (const auto &gd : rootCd->partOfGroups())
{
cd->makePartOfGroup(gd);
- gd->addClass(cd);
+ const_cast<GroupDef*>(gd)->addClass(cd);
}
- }
- //printf("** adding class %s based on %s\n",fullName.data(),templ->name().data());
- Doxygen::classSDict->append(fullName,cd);
-
- MemberList *ml = templ->getMemberList(MemberListType_pubAttribs);
- if (ml)
- {
- MemberListIterator li(*ml);
- MemberDef *md;
- for (li.toFirst();(md=li.current());++li)
- {
- //printf(" Member %s type=%s\n",md->name().data(),md->typeString());
- MemberDef *imd = createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
- md->typeString(),md->name(),md->argsString(),md->excpString(),
- md->protection(),md->virtualness(),md->isStatic(),Member,
- md->memberType(),
- ArgumentList(),ArgumentList(),"");
- imd->setMemberClass(cd);
- imd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
- imd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
- imd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
- imd->setMemberSpecifiers(md->getMemberSpecifiers());
- imd->setMemberGroupId(md->getMemberGroupId());
- imd->setInitializer(md->initializer());
- imd->setMaxInitLines(md->initializerLines());
- imd->setBitfields(md->bitfieldString());
- imd->setLanguage(md->getLanguage());
- cd->insertMember(imd);
+
+ MemberList *ml = templ->getMemberList(MemberListType_pubAttribs);
+ if (ml)
+ {
+ MemberListIterator li(*ml);
+ MemberDef *md;
+ for (li.toFirst();(md=li.current());++li)
+ {
+ //printf(" Member %s type=%s\n",md->name().data(),md->typeString());
+ MemberDefMutable *imd = createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
+ md->typeString(),md->name(),md->argsString(),md->excpString(),
+ md->protection(),md->virtualness(),md->isStatic(),Member,
+ md->memberType(),
+ ArgumentList(),ArgumentList(),"");
+ imd->setMemberClass(cd);
+ imd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
+ imd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
+ imd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
+ imd->setMemberSpecifiers(md->getMemberSpecifiers());
+ imd->setMemberGroupId(md->getMemberGroupId());
+ imd->setInitializer(md->initializer());
+ imd->setMaxInitLines(md->initializerLines());
+ imd->setBitfields(md->bitfieldString());
+ imd->setLanguage(md->getLanguage());
+ cd->insertMember(imd);
+ }
}
}
return cd;
@@ -1361,14 +1416,14 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC
* recursively. Later on we need to patch the member types so we keep
* track of the hierarchy of classes we create.
*/
-static void processTagLessClasses(ClassDef *rootCd,
- ClassDef *cd,
- ClassDef *tagParentCd,
+static void processTagLessClasses(const ClassDef *rootCd,
+ const ClassDef *cd,
+ ClassDefMutable *tagParentCd,
const QCString &prefix,int count)
{
//printf("%d: processTagLessClasses %s\n",count,cd->name().data());
//printf("checking members for %s\n",cd->name().data());
- if (cd->getClassSDict())
+ if (tagParentCd && !cd->getClasses().empty())
{
MemberList *ml = cd->getMemberList(MemberListType_pubAttribs);
if (ml)
@@ -1380,42 +1435,43 @@ static void processTagLessClasses(ClassDef *rootCd,
QCString type = md->typeString();
if (type.find("::@")!=-1) // member of tag less struct/union
{
- ClassSDict::Iterator it(*cd->getClassSDict());
- ClassDef *icd;
- for (it.toFirst();(icd=it.current());++it)
+ for (const auto &icd : cd->getClasses())
{
//printf(" member %s: type='%s'\n",md->name().data(),type.data());
//printf(" comparing '%s'<->'%s'\n",type.data(),icd->name().data());
if (type.find(icd->name())!=-1) // matching tag less struct/union
{
QCString name = md->name();
- if (md->isAnonymous()) name = "__unnamed__";
+ if (md->isAnonymous()) name = "__unnamed" + name.right(name.length()-1)+"__";
if (!prefix.isEmpty()) name.prepend(prefix+".");
//printf(" found %s for class %s\n",name.data(),cd->name().data());
- ClassDef *ncd = createTagLessInstance(rootCd,icd,name);
- processTagLessClasses(rootCd,icd,ncd,name,count+1);
- //printf(" addTagged %s to %s\n",ncd->name().data(),tagParentCd->name().data());
- tagParentCd->addTaggedInnerClass(ncd);
- ncd->setTagLessReference(icd);
-
- // replace tag-less type for generated/original member
- // by newly created class name.
- // note the difference between changing cd and tagParentCd.
- // for the initial call this is the same pointer, but for
- // recursive calls cd is the original tag-less struct (of which
- // there is only one instance) and tagParentCd is the newly
- // generated tagged struct of which there can be multiple instances!
- MemberList *pml = tagParentCd->getMemberList(MemberListType_pubAttribs);
- if (pml)
+ ClassDefMutable *ncd = createTagLessInstance(rootCd,icd,name);
+ if (ncd)
{
- MemberListIterator pli(*pml);
- MemberDef *pmd;
- for (pli.toFirst();(pmd=pli.current());++pli)
+ processTagLessClasses(rootCd,icd,ncd,name,count+1);
+ //printf(" addTagged %s to %s\n",ncd->name().data(),tagParentCd->name().data());
+ ncd->setTagLessReference(icd);
+
+ // replace tag-less type for generated/original member
+ // by newly created class name.
+ // note the difference between changing cd and tagParentCd.
+ // for the initial call this is the same pointer, but for
+ // recursive calls cd is the original tag-less struct (of which
+ // there is only one instance) and tagParentCd is the newly
+ // generated tagged struct of which there can be multiple instances!
+ MemberList *pml = tagParentCd->getMemberList(MemberListType_pubAttribs);
+ if (pml)
{
- if (pmd->name()==md->name())
+ MemberListIterator pli(*pml);
+ MemberDef *pmd;
+ for (pli.toFirst();(pmd=pli.current());++pli)
{
- pmd->setAccessorType(ncd,substitute(pmd->typeString(),icd->name(),ncd->name()));
- //pmd->setType(substitute(pmd->typeString(),icd->name(),ncd->name()));
+ MemberDefMutable *pmdm = toMemberDefMutable(pmd);
+ if (pmdm && pmd->name()==md->name())
+ {
+ pmdm->setAccessorType(ncd,substitute(pmd->typeString(),icd->name(),ncd->name()));
+ //pmd->setType(substitute(pmd->typeString(),icd->name(),ncd->name()));
+ }
}
}
}
@@ -1427,36 +1483,41 @@ static void processTagLessClasses(ClassDef *rootCd,
}
}
-static void findTagLessClasses(ClassDef *cd)
+static void findTagLessClasses(std::vector<ClassDefMutable*> &candidates,const ClassDef *cd)
{
- if (cd->getClassSDict())
+ for (const auto &icd : cd->getClasses())
{
- ClassSDict::Iterator it(*cd->getClassSDict());
- ClassDef *icd;
- for (it.toFirst();(icd=it.current());++it)
+ if (icd->name().find("@")==-1) // process all non-anonymous inner classes
{
- if (icd->name().find("@")==-1) // process all non-anonymous inner classes
- {
- findTagLessClasses(icd);
- }
+ findTagLessClasses(candidates,icd);
}
}
- processTagLessClasses(cd,cd,cd,"",0); // process tag less inner struct/classes (if any)
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm)
+ {
+ candidates.push_back(cdm);
+ }
}
static void findTagLessClasses()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli) // for each class
+ std::vector<ClassDefMutable *> candidates;
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
Definition *scope = cd->getOuterScope();
if (scope && scope->definitionType()!=Definition::TypeClass) // that is not nested
{
- findTagLessClasses(cd);
+ findTagLessClasses(candidates,cd.get());
}
}
+
+ // since processTagLessClasses is potentially adding classes to Doxygen::classLinkedMap
+ // we need to call it outside of the loop above, otherwise the iterator gets invalidated!
+ for (auto &cd : candidates)
+ {
+ processTagLessClasses(cd,cd,cd,"",0); // process tag less inner struct/classes
+ }
}
@@ -1486,32 +1547,36 @@ static void buildNamespaceList(const Entry *root)
{
//printf("Found namespace %s in %s at line %d\n",root->name.data(),
// root->fileName.data(), root->startLine);
- NamespaceDef *nd;
- if ((nd=Doxygen::namespaceSDict->find(fullName))) // existing namespace
+ NamespaceDef *ndi = Doxygen::namespaceLinkedMap->find(fullName);
+ if (ndi) // existing namespace
{
- nd->setDocumentation(root->doc,root->docFile,root->docLine);
- nd->setName(fullName); // change name to match docs
- nd->addSectionsToDefinition(root->anchors);
- nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- if (nd->getLanguage()==SrcLangExt_Unknown)
- {
- nd->setLanguage(root->lang);
- }
- if (root->tagInfo()==0) // if we found the namespace in a tag file
- // and also in a project file, then remove
- // the tag file reference
+ NamespaceDefMutable *nd = toNamespaceDefMutable(ndi);
+ if (nd) // non-inline namespace
{
- nd->setReference("");
- nd->setFileName(fullName);
- }
- nd->setMetaData(root->metaData);
+ nd->setDocumentation(root->doc,root->docFile,root->docLine);
+ nd->setName(fullName); // change name to match docs
+ nd->addSectionsToDefinition(root->anchors);
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ if (nd->getLanguage()==SrcLangExt_Unknown)
+ {
+ nd->setLanguage(root->lang);
+ }
+ if (root->tagInfo()==0) // if we found the namespace in a tag file
+ // and also in a project file, then remove
+ // the tag file reference
+ {
+ nd->setReference("");
+ nd->setFileName(fullName);
+ }
+ nd->setMetaData(root->metaData);
- // file definition containing the namespace nd
- FileDef *fd=root->fileDef();
- // insert the namespace in the file definition
- if (fd) fd->insertNamespace(nd);
- addNamespaceToGroups(root,nd);
- nd->setRefItems(root->sli);
+ // file definition containing the namespace nd
+ FileDef *fd=root->fileDef();
+ // insert the namespace in the file definition
+ if (fd) fd->insertNamespace(nd);
+ addNamespaceToGroups(root,nd);
+ nd->setRefItems(root->sli);
+ }
}
else // fresh namespace
{
@@ -1524,69 +1589,93 @@ static void buildNamespaceList(const Entry *root)
tagFileName = tagInfo->fileName;
}
//printf("++ new namespace %s lang=%s tagName=%s\n",fullName.data(),langToString(root->lang).data(),tagName.data());
- NamespaceDef *nd=createNamespaceDef(tagInfo?tagName:root->fileName,root->startLine,
- root->startColumn,fullName,tagName,tagFileName,
- root->type,root->spec&Entry::Published);
- nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
- nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- nd->addSectionsToDefinition(root->anchors);
- nd->setHidden(root->hidden);
- nd->setArtificial(root->artificial);
- nd->setLanguage(root->lang);
- nd->setId(root->id);
- nd->setMetaData(root->metaData);
- nd->setInline((root->spec&Entry::Inline)!=0);
-
- //printf("Adding namespace to group\n");
- addNamespaceToGroups(root,nd);
- nd->setRefItems(root->sli);
-
- // file definition containing the namespace nd
- FileDef *fd=root->fileDef();
- // insert the namespace in the file definition
- if (fd) fd->insertNamespace(nd);
-
- // the empty string test is needed for extract all case
- nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- nd->insertUsedFile(fd);
- nd->setBodySegment(root->bodyLine,root->endBodyLine);
- nd->setBodyDef(fd);
- // add class to the list
- Doxygen::namespaceSDict->inSort(fullName,nd);
-
- // also add namespace to the correct structural context
- Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName,0,tagInfo);
- //printf("adding namespace %s to context %s\n",nd->name().data(),d?d->name().data():"<none>");
- if (d==0) // we didn't find anything, create the scope artificially
- // anyway, so we can at least relate scopes properly.
- {
- Definition *d = buildScopeFromQualifiedName(fullName,fullName.contains("::"),nd->getLanguage(),tagInfo);
- d->addInnerCompound(nd);
- nd->setOuterScope(d);
- // TODO: Due to the order in which the tag file is written
- // a nested class can be found before its parent!
- }
- else
+ // add namespace to the list
+ NamespaceDefMutable *nd = toNamespaceDefMutable(
+ Doxygen::namespaceLinkedMap->add(fullName,
+ std::unique_ptr<NamespaceDef>(
+ createNamespaceDef(tagInfo?tagName:root->fileName,root->startLine,
+ root->startColumn,fullName,tagName,tagFileName,
+ root->type,root->spec&Entry::Published))));
+ if (nd)
{
- d->addInnerCompound(nd);
- nd->setOuterScope(d);
- // in case of d is an inline namespace, alias insert nd in the part scope of d.
- while (d->definitionType()==DefinitionIntf::TypeNamespace)
+ nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ nd->addSectionsToDefinition(root->anchors);
+ nd->setHidden(root->hidden);
+ nd->setArtificial(root->artificial);
+ nd->setLanguage(root->lang);
+ nd->setId(root->id);
+ nd->setMetaData(root->metaData);
+ nd->setInline((root->spec&Entry::Inline)!=0);
+
+ //printf("Adding namespace to group\n");
+ addNamespaceToGroups(root,nd);
+ nd->setRefItems(root->sli);
+
+ // file definition containing the namespace nd
+ FileDef *fd=root->fileDef();
+ // insert the namespace in the file definition
+ if (fd) fd->insertNamespace(nd);
+
+ // the empty string test is needed for extract all case
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ nd->insertUsedFile(fd);
+ nd->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
+ nd->setBodyDef(fd);
+
+ // also add namespace to the correct structural context
+ Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName,0,tagInfo);
+ //printf("adding namespace %s to context %s\n",nd->name().data(),d?d->name().data():"<none>");
+ if (d==0) // we didn't find anything, create the scope artificially
+ // anyway, so we can at least relate scopes properly.
{
- NamespaceDef *pnd = dynamic_cast<NamespaceDef*>(d);
- if (pnd->isInline())
+ d = buildScopeFromQualifiedName(fullName,nd->getLanguage(),tagInfo);
+ DefinitionMutable *dm = toDefinitionMutable(d);
+ if (dm)
{
- d = d->getOuterScope();
- if (d)
- {
- NamespaceDef *aliasNd = createNamespaceDefAlias(d,nd);
- //printf("adding %s to %s\n",qPrint(aliasNd->name()),qPrint(d->name()));
- d->addInnerCompound(aliasNd);
- }
+ dm->addInnerCompound(nd);
}
- else
+ nd->setOuterScope(d);
+ // TODO: Due to the order in which the tag file is written
+ // a nested class can be found before its parent!
+ }
+ else
+ {
+ DefinitionMutable *dm = toDefinitionMutable(d);
+ if (dm)
{
- break;
+ dm->addInnerCompound(nd);
+ }
+ nd->setOuterScope(d);
+ // in case of d is an inline namespace, alias insert nd in the part scope of d.
+ while (d->definitionType()==Definition::TypeNamespace)
+ {
+ NamespaceDef *pnd = toNamespaceDef(d);
+ if (pnd && pnd->isInline())
+ {
+ d = d->getOuterScope();
+ if (d)
+ {
+ dm = toDefinitionMutable(d);
+ if (dm)
+ {
+ NamespaceDef *aliasNd = createNamespaceDefAlias(d,nd);
+ dm->addInnerCompound(aliasNd);
+ QCString aliasName = aliasNd->name();
+ //printf("adding alias %s (%p) to %s\n",qPrint(aliasName),aliasNd,qPrint(d->name()));
+ Doxygen::namespaceLinkedMap->add(
+ aliasName,std::unique_ptr<NamespaceDef>(aliasNd));
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
}
}
}
@@ -1598,21 +1687,15 @@ static void buildNamespaceList(const Entry *root)
//----------------------------------------------------------------------
-static const NamespaceDef *findUsedNamespace(const NamespaceSDict *unl,
+static const NamespaceDef *findUsedNamespace(const LinkedRefMap<const NamespaceDef> &unl,
const QCString &name)
{
const NamespaceDef *usingNd =0;
- if (unl)
+ for (const auto &und : unl)
{
- //printf("Found namespace dict %d\n",unl->count());
- NamespaceSDict::Iterator unli(*unl);
- const NamespaceDef *und;
- for (unli.toFirst();(und=unli.current());++unli)
- {
- QCString uScope=und->name()+"::";
- usingNd = getResolvedNamespace(uScope+name);
- //printf("Also trying with scope='%s' usingNd=%p\n",(uScope+name).data(),usingNd);
- }
+ QCString uScope=und->name()+"::";
+ usingNd = getResolvedNamespace(uScope+name);
+ if (usingNd!=0) break;
}
return usingNd;
}
@@ -1631,7 +1714,7 @@ static void findUsingDirectives(const Entry *root)
if (!name.isEmpty())
{
const NamespaceDef *usingNd = 0;
- NamespaceDef *nd = 0;
+ NamespaceDefMutable *nd = 0;
FileDef *fd = root->fileDef();
QCString nsName;
@@ -1644,7 +1727,7 @@ static void findUsingDirectives(const Entry *root)
nsName=stripAnonymousNamespaceScope(root->parent()->name);
if (!nsName.isEmpty())
{
- nd = getResolvedNamespace(nsName);
+ nd = getResolvedNamespaceMutable(nsName);
}
}
@@ -1672,17 +1755,17 @@ static void findUsingDirectives(const Entry *root)
if (usingNd==0 && nd) // not found, try used namespaces in this scope
// or in one of the parent namespace scopes
{
- const NamespaceDef *pnd = nd;
+ const NamespaceDefMutable *pnd = nd;
while (pnd && usingNd==0)
{
// also try with one of the used namespaces found earlier
- usingNd = findUsedNamespace(pnd->getUsedNamespaces(),name);
+ usingNd = toNamespaceDefMutable(findUsedNamespace(pnd->getUsedNamespaces(),name));
// goto the parent
const Definition *s = pnd->getOuterScope();
if (s && s->definitionType()==Definition::TypeNamespace)
{
- pnd = dynamic_cast<const NamespaceDef*>(s);
+ pnd = toNamespaceDefMutable(toNamespaceDef(s));
}
else
{
@@ -1716,41 +1799,46 @@ static void findUsingDirectives(const Entry *root)
else // unknown namespace, but add it anyway.
{
//printf("++ new unknown namespace %s lang=%s\n",name.data(),langToString(root->lang).data());
- NamespaceDef *nd=createNamespaceDef(root->fileName,root->startLine,root->startColumn,name);
- nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
- nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- nd->addSectionsToDefinition(root->anchors);
- //printf("** Adding namespace %s hidden=%d\n",name.data(),root->hidden);
- nd->setHidden(root->hidden);
- nd->setArtificial(TRUE);
- nd->setLanguage(root->lang);
- nd->setId(root->id);
- nd->setMetaData(root->metaData);
- nd->setInline((root->spec&Entry::Inline)!=0);
-
- //QListIterator<Grouping> gli(*root->groups);
- //Grouping *g;
- //for (;(g=gli.current());++gli)
- for (const Grouping &g : root->groups)
- {
- GroupDef *gd=0;
- if (!g.groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g.groupname)))
- gd->addNamespace(nd);
- }
-
- // insert the namespace in the file definition
- if (fd)
+ // add namespace to the list
+ nd = toNamespaceDefMutable(
+ Doxygen::namespaceLinkedMap->add(name,
+ std::unique_ptr<NamespaceDef>(
+ createNamespaceDef(root->fileName,root->startLine,root->startColumn,name))));
+ if (nd)
{
- fd->insertNamespace(nd);
- fd->addUsingDirective(nd);
- }
+ nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ nd->addSectionsToDefinition(root->anchors);
+ //printf("** Adding namespace %s hidden=%d\n",name.data(),root->hidden);
+ nd->setHidden(root->hidden);
+ nd->setArtificial(TRUE);
+ nd->setLanguage(root->lang);
+ nd->setId(root->id);
+ nd->setMetaData(root->metaData);
+ nd->setInline((root->spec&Entry::Inline)!=0);
+
+ //QListIterator<Grouping> gli(*root->groups);
+ //Grouping *g;
+ //for (;(g=gli.current());++gli)
+ for (const Grouping &g : root->groups)
+ {
+ GroupDef *gd=0;
+ if (!g.groupname.isEmpty() && (gd=Doxygen::groupLinkedMap->find(g.groupname)))
+ gd->addNamespace(nd);
+ }
- // the empty string test is needed for extract all case
- nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- nd->insertUsedFile(fd);
- // add class to the list
- Doxygen::namespaceSDict->inSort(name,nd);
- nd->setRefItems(root->sli);
+ // insert the namespace in the file definition
+ if (fd)
+ {
+ fd->insertNamespace(nd);
+ fd->addUsingDirective(nd);
+ }
+
+ // the empty string test is needed for extract all case
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ nd->insertUsedFile(fd);
+ nd->setRefItems(root->sli);
+ }
}
}
}
@@ -1791,8 +1879,8 @@ static void findUsingDeclarations(const Entry *root)
// rootNav->parent()->section());
if (!root->name.isEmpty())
{
- ClassDef *usingCd = 0;
- NamespaceDef *nd = 0;
+ ClassDefMutable *usingCd = 0;
+ NamespaceDefMutable *nd = 0;
FileDef *fd = root->fileDef();
QCString scName;
@@ -1803,7 +1891,7 @@ static void findUsingDeclarations(const Entry *root)
scName=root->parent()->name;
if (!scName.isEmpty())
{
- nd = getResolvedNamespace(scName);
+ nd = getResolvedNamespaceMutable(scName);
}
}
@@ -1814,16 +1902,17 @@ static void findUsingDeclarations(const Entry *root)
// file scope).
QCString name = substitute(root->name,".","::"); //Java/C# scope->internal
- usingCd = getClass(name); // try direct lookup first, this is needed to get
+ usingCd = getClassMutable(name); // try direct lookup first, this is needed to get
// builtin STL classes to properly resolve, e.g.
// vector -> std::vector
if (usingCd==0)
{
- usingCd = const_cast<ClassDef*>(getResolvedClass(nd,fd,name)); // try via resolving (see also bug757509)
+ SymbolResolver resolver(fd);
+ usingCd = resolver.resolveClassMutable(nd,name); // try via resolving (see also bug757509)
}
if (usingCd==0)
{
- usingCd = Doxygen::hiddenClasses->find(name); // check if it is already hidden
+ usingCd = toClassDefMutable(Doxygen::hiddenClassLinkedMap->find(name)); // check if it is already hidden
}
//printf("%s -> %p\n",root->name.data(),usingCd);
@@ -1831,13 +1920,15 @@ static void findUsingDeclarations(const Entry *root)
{
Debug::print(Debug::Classes,0," New using class '%s' (sec=0x%08x)! #tArgLists=%d\n",
qPrint(name),root->section,root->tArgLists.size());
- usingCd = createClassDef(
- "<using>",1,1,
- name,
- ClassDef::Class);
- Doxygen::hiddenClasses->append(root->name,usingCd);
- usingCd->setArtificial(TRUE);
- usingCd->setLanguage(root->lang);
+ usingCd = toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(name,
+ std::unique_ptr<ClassDef>(
+ createClassDef( "<using>",1,1, name, ClassDef::Class))));
+ if (usingCd)
+ {
+ usingCd->setArtificial(TRUE);
+ usingCd->setLanguage(root->lang);
+ }
}
else
{
@@ -1876,7 +1967,7 @@ static void findUsingDeclImports(const Entry *root)
QCString fullName=removeRedundantWhiteSpace(root->parent()->name);
fullName=stripAnonymousNamespaceScope(fullName);
fullName=stripTemplateSpecifiersFromScope(fullName);
- ClassDef *cd = getClass(fullName);
+ ClassDefMutable *cd = getClassMutable(fullName);
if (cd)
{
//printf("found class %s\n",cd->name().data());
@@ -1885,71 +1976,66 @@ static void findUsingDeclImports(const Entry *root)
{
QCString scope=root->name.left(i);
QCString memName=root->name.right(root->name.length()-i-2);
- const ClassDef *bcd = getResolvedClass(cd,0,scope); // todo: file in fileScope parameter
+ SymbolResolver resolver;
+ const ClassDef *bcd = resolver.resolveClass(cd,scope); // todo: file in fileScope parameter
if (bcd && bcd!=cd)
{
//printf("found class %s memName=%s\n",bcd->name().data(),memName.data());
- MemberNameInfoSDict *mndict=bcd->memberNameInfoSDict();
- if (mndict)
+ const MemberNameInfoLinkedMap &mnlm=bcd->memberNameInfoLinkedMap();
+ const MemberNameInfo *mni = mnlm.find(memName);
+ if (mni)
{
- MemberNameInfo *mni = mndict->find(memName);
- if (mni)
+ for (auto &mi : *mni)
{
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for ( ; (mi=mnii.current()) ; ++mnii )
+ MemberDef *md = mi->memberDef();
+ if (md && md->protection()!=Private)
{
- MemberDef *md = mi->memberDef;
- if (md && md->protection()!=Private)
+ //printf("found member %s\n",mni->memberName());
+ QCString fileName = root->fileName;
+ if (fileName.isEmpty() && root->tagInfo())
{
- //printf("found member %s\n",mni->memberName());
- MemberDef *newMd = 0;
- {
- QCString fileName = root->fileName;
- if (fileName.isEmpty() && root->tagInfo())
- {
- fileName = root->tagInfo()->tagName;
- }
- const ArgumentList &templAl = md->templateArguments();
- const ArgumentList &al = md->templateArguments();
- newMd = createMemberDef(
- fileName,root->startLine,root->startColumn,
- md->typeString(),memName,md->argsString(),
- md->excpString(),root->protection,root->virt,
- md->isStatic(),Member,md->memberType(),
- templAl,al,root->metaData
- );
- }
- newMd->setMemberClass(cd);
- cd->insertMember(newMd);
- if (!root->doc.isEmpty() || !root->brief.isEmpty())
- {
- newMd->setDocumentation(root->doc,root->docFile,root->docLine);
- newMd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- newMd->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- }
- else
- {
- newMd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
- newMd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
- newMd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
- }
- newMd->setDefinition(md->definition());
- newMd->enableCallGraph(root->callGraph);
- newMd->enableCallerGraph(root->callerGraph);
- newMd->enableReferencedByRelation(root->referencedByRelation);
- newMd->enableReferencesRelation(root->referencesRelation);
- newMd->setBitfields(md->bitfieldString());
- newMd->addSectionsToDefinition(root->anchors);
- newMd->setBodySegment(md->getStartBodyLine(),md->getEndBodyLine());
- newMd->setBodyDef(md->getBodyDef());
- newMd->setInitializer(md->initializer());
- newMd->setMaxInitLines(md->initializerLines());
- newMd->setMemberGroupId(root->mGrpId);
- newMd->setMemberSpecifiers(md->getMemberSpecifiers());
- newMd->setLanguage(root->lang);
- newMd->setId(root->id);
+ fileName = root->tagInfo()->tagName;
+ }
+ const ArgumentList &templAl = md->templateArguments();
+ const ArgumentList &al = md->templateArguments();
+ std::unique_ptr<MemberDefMutable> newMd { createMemberDef(
+ fileName,root->startLine,root->startColumn,
+ md->typeString(),memName,md->argsString(),
+ md->excpString(),root->protection,root->virt,
+ md->isStatic(),Member,md->memberType(),
+ templAl,al,root->metaData
+ ) };
+ newMd->setMemberClass(cd);
+ cd->insertMember(newMd.get());
+ if (!root->doc.isEmpty() || !root->brief.isEmpty())
+ {
+ newMd->setDocumentation(root->doc,root->docFile,root->docLine);
+ newMd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ newMd->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
}
+ else
+ {
+ newMd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
+ newMd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
+ newMd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
+ }
+ newMd->setDefinition(md->definition());
+ newMd->enableCallGraph(root->callGraph);
+ newMd->enableCallerGraph(root->callerGraph);
+ newMd->enableReferencedByRelation(root->referencedByRelation);
+ newMd->enableReferencesRelation(root->referencesRelation);
+ newMd->setBitfields(md->bitfieldString());
+ newMd->addSectionsToDefinition(root->anchors);
+ newMd->setBodySegment(md->getDefLine(),md->getStartBodyLine(),md->getEndBodyLine());
+ newMd->setBodyDef(md->getBodyDef());
+ newMd->setInitializer(md->initializer());
+ newMd->setMaxInitLines(md->initializerLines());
+ newMd->setMemberGroupId(root->mGrpId);
+ newMd->setMemberSpecifiers(md->getMemberSpecifiers());
+ newMd->setLanguage(root->lang);
+ newMd->setId(root->id);
+ MemberName *mn = Doxygen::memberNameLinkedMap->add(memName);
+ mn->push_back(std::move(newMd));
}
}
}
@@ -1965,31 +2051,15 @@ static void findUsingDeclImports(const Entry *root)
static void findIncludedUsingDirectives()
{
- // first mark all files as not visited
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- fd->setVisited(FALSE);
- }
- }
+ FileDefSet visitedFiles;
// then recursively add using directives found in #include files
// to files that have not been visited.
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
- if (!fd->isVisited())
- {
- //printf("----- adding using directives for file %s\n",fd->name().data());
- fd->addIncludedUsingDirectives();
- }
+ //printf("----- adding using directives for file %s\n",fd->name().data());
+ fd->addIncludedUsingDirectives(visitedFiles);
}
}
}
@@ -1998,7 +2068,7 @@ static void findIncludedUsingDirectives()
static MemberDef *addVariableToClass(
const Entry *root,
- ClassDef *cd,
+ ClassDefMutable *cd,
MemberType mtype,
const QCString &type,
const QCString &name,
@@ -2039,7 +2109,7 @@ static MemberDef *addVariableToClass(
}
else
{
- def=type+" "+name+root->args;
+ def=type+" "+name+args;
}
}
else
@@ -2070,16 +2140,15 @@ static MemberDef *addVariableToClass(
// see if the member is already found in the same scope
// (this may be the case for a static member that is initialized
// outside the class)
- MemberName *mn=Doxygen::memberNameSDict->find(name);
+ MemberName *mn=Doxygen::memberNameLinkedMap->find(name);
if (mn)
{
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &imd : *mn)
{
//printf("md->getClassDef()=%p cd=%p type=[%s] md->typeString()=[%s]\n",
// md->getClassDef(),cd,type.data(),md->typeString());
- if (!md->isAlias() &&
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md &&
md->getClassDef()==cd &&
removeRedundantWhiteSpace(type)==md->typeString())
// member already in the scope
@@ -2107,16 +2176,14 @@ static MemberDef *addVariableToClass(
}
// new member variable, typedef or enum value
- MemberDef *md=createMemberDef(
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
fileName,root->startLine,root->startColumn,
type,name,args,root->exception,
prot,Normal,root->stat,related,
mtype,!root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList(),
- ArgumentList(), root->metaData);
+ ArgumentList(), root->metaData) };
md->setTagInfo(root->tagInfo());
md->setMemberClass(cd); // also sets outer scope (i.e. getOuterScope())
- //md->setDefFile(root->fileName);
- //md->setDefLine(root->startLine);
md->setDocumentation(root->doc,root->docFile,root->docLine);
md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
@@ -2126,7 +2193,7 @@ static MemberDef *addVariableToClass(
md->setFromAnonymousScope(fromAnnScope);
md->setFromAnonymousMember(fromAnnMemb);
//md->setIndentDepth(indentDepth);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setInitializer(root->initializer);
md->setMaxInitLines(root->initLines);
md->setMemberGroupId(root->mGrpId);
@@ -2141,38 +2208,24 @@ static MemberDef *addVariableToClass(
md->setArtificial(root->artificial);
md->setLanguage(root->lang);
md->setId(root->id);
- addMemberToGroups(root,md);
- //if (root->mGrpId!=-1)
- //{
- // printf("memberdef %s in memberGroup %d\n",name.data(),root->mGrpId);
- // md->setMemberGroup(memberGroupDict[root->mGrpId]);
- //
+ addMemberToGroups(root,md.get());
md->setBodyDef(root->fileDef());
- //printf(" Adding member=%s\n",md->name().data());
- // add the member to the global list
- if (mn)
- {
- mn->append(md);
- }
- else // new variable name
- {
- mn = new MemberName(name);
- mn->append(md);
- //printf("Adding memberName=%s\n",mn->memberName());
- //Doxygen::memberNameDict.insert(name,mn);
- //Doxygen::memberNameList.append(mn);
- Doxygen::memberNameSDict->append(name,mn);
- // add the member to the class
- }
//printf(" New member adding to %s (%p)!\n",cd->name().data(),cd);
- cd->insertMember(md);
+ cd->insertMember(md.get());
md->setRefItems(root->sli);
//TODO: insert FileDef instead of filename strings.
cd->insertUsedFile(root->fileDef());
root->markAsProcessed();
- return md;
+
+ //printf(" Adding member=%s\n",md->name().data());
+ // add the member to the global list
+ MemberDef *result = md.get();
+ mn = Doxygen::memberNameLinkedMap->add(name);
+ mn->push_back(std::move(md));
+
+ return result;
}
//----------------------------------------------------------------------
@@ -2218,7 +2271,7 @@ static MemberDef *addVariableToFile(
if (s>=0)
{
QCString typeValue = ttype.mid(s,l);
- ClassDef *cd = getClass(typeValue);
+ ClassDefMutable *cd = getClassMutable(typeValue);
if (cd)
{
// this typedef should hide compound name cd, so we
@@ -2233,15 +2286,11 @@ static MemberDef *addVariableToFile(
}
// see if the function is inside a namespace
- NamespaceDef *nd = 0;
+ NamespaceDefMutable *nd = 0;
if (!scope.isEmpty())
{
if (scope.find('@')!=-1) return 0; // anonymous scope!
- //nscope=removeAnonymousScopes(scope);
- //if (!nscope.isEmpty())
- //{
- nd = getResolvedNamespace(scope);
- //}
+ nd = getResolvedNamespaceMutable(scope);
}
QCString def;
@@ -2297,7 +2346,7 @@ static MemberDef *addVariableToFile(
}
def.stripPrefix("static ");
- MemberName *mn=Doxygen::functionNameSDict->find(name);
+ MemberName *mn=Doxygen::functionNameLinkedMap->find(name);
if (mn)
{
//QCString nscope=removeAnonymousScopes(scope);
@@ -2305,13 +2354,12 @@ static MemberDef *addVariableToFile(
//if (!nscope.isEmpty())
if (!scope.isEmpty())
{
- nd = getResolvedNamespace(scope);
+ nd = getResolvedNamespaceMutable(scope);
}
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &imd : *mn)
{
- if (!md->isAlias() &&
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md &&
((nd==0 && md->getNamespaceDef()==0 && md->getFileDef() &&
root->fileName==md->getFileDef()->absFilePath()
) // both variable names in the same file
@@ -2367,12 +2415,12 @@ static MemberDef *addVariableToFile(
Debug::print(Debug::Variables,0,
" new variable, nd=%s tagInfo=%p!\n",nd?qPrint(nd->name()):"<global>",root->tagInfo());
// new global variable, enum value or typedef
- MemberDef *md=createMemberDef(
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
fileName,root->startLine,root->startColumn,
type,name,args,0,
root->protection, Normal,root->stat,Member,
mtype,!root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList(),
- ArgumentList(), root->metaData);
+ root->argList, root->metaData) };
md->setTagInfo(root->tagInfo());
md->setMemberSpecifiers(root->spec);
md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -2395,16 +2443,16 @@ static MemberDef *addVariableToFile(
//md->setOuterScope(fd);
if (!root->explicitExternal)
{
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setBodyDef(fd);
}
- addMemberToGroups(root,md);
+ addMemberToGroups(root,md.get());
md->setRefItems(root->sli);
if (nd && !nd->isAnonymous())
{
md->setNamespace(nd);
- nd->insertMember(md);
+ nd->insertMember(md.get());
}
// add member to the file (we do this even if we have already inserted
@@ -2412,22 +2460,17 @@ static MemberDef *addVariableToFile(
if (fd)
{
md->setFileDef(fd);
- fd->insertMember(md);
+ fd->insertMember(md.get());
}
- // add member definition to the list of globals
- if (mn)
- {
- mn->append(md);
- }
- else
- {
- mn = new MemberName(name);
- mn->append(md);
- Doxygen::functionNameSDict->append(name,mn);
- }
root->markAsProcessed();
- return md;
+
+ // add member definition to the list of globals
+ MemberDef *result = md.get();
+ mn = Doxygen::functionNameLinkedMap->add(name);
+ mn->push_back(std::move(md));
+
+ return result;
}
/*! See if the return type string \a type is that of a function pointer
@@ -2472,11 +2515,13 @@ static bool isVarWithConstructor(const Entry *root)
static QRegExp initChars("[0-9\"'&*!^]+");
static QRegExp idChars("[a-z_A-Z][a-z_A-Z0-9]*");
bool result=FALSE;
- bool typeIsClass;
+ bool typeIsClass = false;
+ bool typePtrType = false;
QCString type;
Definition *ctx = 0;
- FileDef *fd = 0;
+ FileDef *fd = root->fileDef();
int ti;
+ SymbolResolver resolver(fd);
//printf("isVarWithConstructor(%s)\n",rootNav->name().data());
if (root->parent()->section & Entry::COMPOUND_MASK)
@@ -2484,9 +2529,7 @@ static bool isVarWithConstructor(const Entry *root)
result=FALSE;
goto done;
}
- else if ((fd = root->fileDef()) &&
- (fd->name().right(2)==".c" || fd->name().right(2)==".h")
- )
+ else if ((fd != nullptr) && (fd->name().right(2)==".c" || fd->name().right(2)==".h"))
{ // inside a .c file
result=FALSE;
goto done;
@@ -2498,18 +2541,22 @@ static bool isVarWithConstructor(const Entry *root)
}
if (!root->parent()->name.isEmpty())
{
- ctx=Doxygen::namespaceSDict->find(root->parent()->name);
+ ctx=Doxygen::namespaceLinkedMap->find(root->parent()->name);
}
type = root->type;
// remove qualifiers
findAndRemoveWord(type,"const");
findAndRemoveWord(type,"static");
findAndRemoveWord(type,"volatile");
+ typePtrType = type.find('*')!=-1 || type.find('&')!=-1;
//if (type.left(6)=="const ") type=type.right(type.length()-6);
- typeIsClass=getResolvedClass(ctx,fd,type)!=0;
- if (!typeIsClass && (ti=type.find('<'))!=-1)
+ if (!typePtrType)
{
- typeIsClass=getResolvedClass(ctx,fd,type.left(ti))!=0;
+ typeIsClass = resolver.resolveClass(ctx,type)!=0;
+ if (!typeIsClass && (ti=type.find('<'))!=-1)
+ {
+ typeIsClass=resolver.resolveClass(ctx,type.left(ti))!=0;
+ }
}
if (typeIsClass) // now we still have to check if the arguments are
// types or values. Since we do not have complete type info
@@ -2535,7 +2582,15 @@ static bool isVarWithConstructor(const Entry *root)
}
goto done;
}
- if (a.type.isEmpty() || getResolvedClass(ctx,fd,a.type)!=0)
+ if (!a.type.isEmpty() &&
+ (a.type.at(a.type.length()-1)=='*' ||
+ a.type.at(a.type.length()-1)=='&'))
+ // type ends with * or & => pointer or reference
+ {
+ result=FALSE;
+ goto done;
+ }
+ if (a.type.isEmpty() || resolver.resolveClass(ctx,a.type)!=0)
{
result=FALSE; // arg type is a known type
goto done;
@@ -2546,13 +2601,6 @@ static bool isVarWithConstructor(const Entry *root)
result=FALSE; // argument is a typedef
goto done;
}
- if (a.type.at(a.type.length()-1)=='*' ||
- a.type.at(a.type.length()-1)=='&')
- // type ends with * or & => pointer or reference
- {
- result=FALSE;
- goto done;
- }
if (a.type.find(initChars)==0)
{
result=TRUE; // argument type starts with typical initializer char
@@ -2612,11 +2660,13 @@ static void addVariable(const Entry *root,int isFuncPtr=-1)
type=name;
static const QRegExp reName("[a-z_A-Z][a-z_A-Z0-9]*");
int l=0;
+ int j=0;
int i=args.isEmpty() ? -1 : reName.match(args,0,&l);
if (i!=-1)
{
name=args.mid(i,l);
- args=args.mid(i+l,args.find(')',i+l)-i-l);
+ j=args.find(')',i+l)-i-l;
+ if (j >= 0) args=args.mid(i+l,j);
}
//printf("new: type='%s' name='%s' args='%s'\n",
// type.data(),name.data(),args.data());
@@ -2661,7 +2711,7 @@ static void addVariable(const Entry *root,int isFuncPtr=-1)
MemberType mtype;
type=type.stripWhiteSpace();
- ClassDef *cd=0;
+ ClassDefMutable *cd=0;
bool isRelated=FALSE;
bool isMemberOf=FALSE;
@@ -2674,7 +2724,7 @@ static void addVariable(const Entry *root,int isFuncPtr=-1)
if (type=="friend class" || type=="friend struct" ||
type=="friend union")
{
- cd=getClass(scope);
+ cd=getClassMutable(scope);
if (cd)
{
addVariableToClass(root, // entry
@@ -2725,8 +2775,8 @@ static void addVariable(const Entry *root,int isFuncPtr=-1)
scope=root->relates;
}
- cd=getClass(scope);
- if (cd==0 && classScope!=scope) cd=getClass(classScope);
+ cd=getClassMutable(scope);
+ if (cd==0 && classScope!=scope) cd=getClassMutable(classScope);
if (cd)
{
MemberDef *md=0;
@@ -2744,7 +2794,7 @@ static void addVariable(const Entry *root,int isFuncPtr=-1)
if (si!=-1 && !inlineSimpleStructs) // anonymous scope or type
{
QCString pScope;
- ClassDef *pcd=0;
+ ClassDefMutable *pcd=0;
pScope = scope.left(QMAX(si-2,0)); // scope without tag less parts
if (!pScope.isEmpty())
pScope.prepend(annScopePrefix);
@@ -2752,7 +2802,7 @@ static void addVariable(const Entry *root,int isFuncPtr=-1)
pScope=annScopePrefix.left(annScopePrefix.length()-2);
if (name.at(0)!='@')
{
- if (!pScope.isEmpty() && (pcd=getClass(pScope)))
+ if (!pScope.isEmpty() && (pcd=getClassMutable(pScope)))
{
md=addVariableToClass(root, // entry
pcd, // class to add member to
@@ -2888,7 +2938,7 @@ static void buildVarList(const Entry *root)
static void addInterfaceOrServiceToServiceOrSingleton(
const Entry *root,
- ClassDef *const cd,
+ ClassDefMutable *cd,
QCString const& rname)
{
FileDef *fd = root->fileDef();
@@ -2900,17 +2950,17 @@ static void addInterfaceOrServiceToServiceOrSingleton(
{
fileName = root->tagInfo()->tagName;
}
- MemberDef *const md = createMemberDef(
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
fileName, root->startLine, root->startColumn, root->type, rname,
"", "", root->protection, root->virt, root->stat, Member,
- type, ArgumentList(), root->argList, root->metaData);
+ type, ArgumentList(), root->argList, root->metaData) };
md->setTagInfo(root->tagInfo());
md->setMemberClass(cd);
md->setDocumentation(root->doc,root->docFile,root->docLine);
md->setDocsForDefinition(false);
md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setMemberSpecifiers(root->spec);
md->setMemberGroupId(root->mGrpId);
md->setTypeConstraints(root->typeConstr);
@@ -2935,21 +2985,9 @@ static void addInterfaceOrServiceToServiceOrSingleton(
qPrint(def)
);
- // add member to the global list of all members
- MemberName *mn;
- if ((mn=Doxygen::memberNameSDict->find(rname)))
- {
- mn->append(md);
- }
- else
- {
- mn = new MemberName(rname);
- mn->append(md);
- Doxygen::memberNameSDict->append(rname,mn);
- }
// add member to the class cd
- cd->insertMember(md);
+ cd->insertMember(md.get());
// also add the member as a "base" (to get nicer diagrams)
// "optional" interface/service get Protected which turns into dashed line
BaseInfo base(rname,
@@ -2958,9 +2996,13 @@ static void addInterfaceOrServiceToServiceOrSingleton(
// add file to list of used files
cd->insertUsedFile(fd);
- addMemberToGroups(root,md);
+ addMemberToGroups(root,md.get());
root->markAsProcessed();
md->setRefItems(root->sli);
+
+ // add member to the global list of all members
+ MemberName *mn = Doxygen::memberNameLinkedMap->add(rname);
+ mn->push_back(std::move(md));
}
static void buildInterfaceAndServiceList(const Entry *root)
@@ -2992,7 +3034,7 @@ static void buildInterfaceAndServiceList(const Entry *root)
if (!rname.isEmpty())
{
QCString scope = root->parent()->name;
- ClassDef *cd = getClass(scope);
+ ClassDefMutable *cd = getClassMutable(scope);
assert(cd);
if (cd && ((ClassDef::Interface == cd->compoundType()) ||
(ClassDef::Service == cd->compoundType()) ||
@@ -3028,7 +3070,7 @@ static void buildInterfaceAndServiceList(const Entry *root)
// Searches the Entry tree for Function sections.
// If found they are stored in their class or in the global list.
-static void addMethodToClass(const Entry *root,ClassDef *cd,
+static void addMethodToClass(const Entry *root,ClassDefMutable *cd,
const QCString &rtype,const QCString &rname,const QCString &rargs,
bool isFriend,
Protection protection,bool stat,Specifier virt,uint64 spec,
@@ -3067,8 +3109,13 @@ static void addMethodToClass(const Entry *root,ClassDef *cd,
else mtype=MemberType_Function;
// strip redundant template specifier for constructors
+ int j = -1;
if ((fd==0 || fd->getLanguage()==SrcLangExt_Cpp) &&
- name.left(9)!="operator " && (i=name.find('<'))!=-1 && name.find('>')!=-1)
+ name.left(9)!="operator " && // not operator
+ (i=name.find('<'))!=-1 && // containing <
+ (j=name.find('>'))!=-1 && // or >
+ (j!=i+2 || name.at(i+1)!='=') // but not the C++20 spaceship operator <=>
+ )
{
name=name.left(i);
}
@@ -3084,7 +3131,7 @@ static void addMethodToClass(const Entry *root,ClassDef *cd,
// );
// adding class member
- MemberDef *md=createMemberDef(
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
fileName,root->startLine,root->startColumn,
type,name,args,root->exception,
protection,virt,
@@ -3092,14 +3139,14 @@ static void addMethodToClass(const Entry *root,ClassDef *cd,
relates.isEmpty() ? Member :
root->relatesType == MemberOf ? Foreign : Related,
mtype,!root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList(),
- root->argList, root->metaData);
+ root->argList, root->metaData) };
md->setTagInfo(root->tagInfo());
md->setMemberClass(cd);
md->setDocumentation(root->doc,root->docFile,root->docLine);
md->setDocsForDefinition(!root->proto);
md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setMemberSpecifiers(spec);
md->setMemberGroupId(root->mGrpId);
md->setTypeConstraints(root->typeConstr);
@@ -3107,7 +3154,6 @@ static void addMethodToClass(const Entry *root,ClassDef *cd,
md->setId(root->id);
md->setBodyDef(fd);
md->setFileDef(fd);
- //md->setScopeTemplateArguments(root->tArgList);
md->addSectionsToDefinition(root->anchors);
QCString def;
QCString qualScope = cd->qualifiedNameWithTemplateParameters();
@@ -3164,30 +3210,140 @@ static void addMethodToClass(const Entry *root,ClassDef *cd,
qPrint(def)
);
+ // add member to the class cd
+ cd->insertMember(md.get());
+ // add file to list of used files
+ cd->insertUsedFile(fd);
+
+ addMemberToGroups(root,md.get());
+ root->markAsProcessed();
+ md->setRefItems(root->sli);
+
// add member to the global list of all members
//printf("Adding member=%s class=%s\n",md->name().data(),cd->name().data());
- MemberName *mn;
- if ((mn=Doxygen::memberNameSDict->find(name)))
+ MemberName *mn = Doxygen::memberNameLinkedMap->add(name);
+ mn->push_back(std::move(md));
+}
+
+//------------------------------------------------------------------------------------------
+
+static void addGlobalFunction(const Entry *root,const QCString &rname,const QCString &sc)
+{
+ QCString scope = sc;
+ Debug::print(Debug::Functions,0," --> new function %s found!\n",qPrint(rname));
+ //printf("New function type='%s' name='%s' args='%s' bodyLine=%d\n",
+ // root->type.data(),rname.data(),root->args.data(),root->bodyLine);
+
+ // new global function
+ QCString name=removeRedundantWhiteSpace(rname);
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
+ root->fileName,root->startLine,root->startColumn,
+ root->type,name,root->args,root->exception,
+ root->protection,root->virt,root->stat,Member,
+ MemberType_Function,
+ !root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList(),
+ root->argList,root->metaData) };
+
+ md->setTagInfo(root->tagInfo());
+ md->setLanguage(root->lang);
+ md->setId(root->id);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setPrototype(root->proto,root->fileName,root->startLine,root->startColumn);
+ md->setDocsForDefinition(!root->proto);
+ md->setTypeConstraints(root->typeConstr);
+ //md->setBody(root->body);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
+ FileDef *fd=root->fileDef();
+ md->setBodyDef(fd);
+ md->addSectionsToDefinition(root->anchors);
+ md->setMemberSpecifiers(root->spec);
+ md->setMemberGroupId(root->mGrpId);
+
+ NamespaceDefMutable *nd = 0;
+ // see if the function is inside a namespace that was not part of
+ // the name already (in that case nd should be non-zero already)
+ if (root->parent()->section == Entry::NAMESPACE_SEC )
{
- mn->append(md);
+ //QCString nscope=removeAnonymousScopes(root->parent()->name);
+ QCString nscope=root->parent()->name;
+ if (!nscope.isEmpty())
+ {
+ nd = getResolvedNamespaceMutable(nscope);
+ }
}
- else
+
+ if (!scope.isEmpty())
{
- mn = new MemberName(name);
- mn->append(md);
- Doxygen::memberNameSDict->append(name,mn);
+ QCString sep = getLanguageSpecificSeparator(root->lang);
+ if (sep!="::")
+ {
+ scope = substitute(scope,"::",sep);
+ }
+ scope+=sep;
}
- // add member to the class cd
- cd->insertMember(md);
- // add file to list of used files
- cd->insertUsedFile(fd);
+ QCString def;
+ //QCString optArgs = root->argList.empty() ? QCString() : root->args;
+ if (!root->type.isEmpty())
+ {
+ def=root->type+" "+scope+name; //+optArgs;
+ }
+ else
+ {
+ def=scope+name; //+optArgs;
+ }
+ Debug::print(Debug::Functions,0,
+ " Global Function:\n"
+ " '%s' '%s'::'%s' '%s' proto=%d\n"
+ " def='%s'\n",
+ qPrint(root->type),
+ qPrint(root->parent()->name),
+ qPrint(rname),
+ qPrint(root->args),
+ root->proto,
+ qPrint(def)
+ );
+ md->setDefinition(def);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
+ //if (root->mGrpId!=-1)
+ //{
+ // md->setMemberGroup(memberGroupDict[root->mGrpId]);
+ //}
- addMemberToGroups(root,md);
- root->markAsProcessed();
md->setRefItems(root->sli);
+ if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
+ {
+ // add member to namespace
+ md->setNamespace(nd);
+ nd->insertMember(md.get());
+ }
+ if (fd)
+ {
+ // add member to the file (we do this even if we have already
+ // inserted it into the namespace)
+ md->setFileDef(fd);
+ fd->insertMember(md.get());
+ }
+
+ addMemberToGroups(root,md.get());
+ if (root->relatesType == Simple) // if this is a relatesalso command,
+ // allow find Member to pick it up
+ {
+ root->markAsProcessed(); // Otherwise we have finished with this entry.
+ }
+
+ // add member to the list of file members
+ //printf("Adding member=%s\n",md->name().data());
+ MemberName *mn = Doxygen::functionNameLinkedMap->add(name);
+ mn->push_back(std::move(md));
}
+//------------------------------------------------------------------------------------------
static void buildFunctionList(const Entry *root)
{
@@ -3219,7 +3375,7 @@ static void buildFunctionList(const Entry *root)
QCString scope=root->parent()->name; //stripAnonymousNamespaceScope(root->parent->name);
if (!rname.isEmpty() && scope.find('@')==-1)
{
- ClassDef *cd=0;
+ ClassDefMutable *cd=0;
// check if this function's parent is a class
scope=stripTemplateSpecifiersFromScope(scope,FALSE);
@@ -3227,14 +3383,13 @@ static void buildFunctionList(const Entry *root)
int memIndex=rname.findRev("::");
- cd=getClass(scope);
+ cd=getClassMutable(scope);
if (cd && scope+"::"==rname.left(scope.length()+2)) // found A::f inside A
{
// strip scope from name
rname=rname.right(rname.length()-root->parent()->name.length()-2);
}
- NamespaceDef *nd = 0;
bool isMember=FALSE;
if (memIndex!=-1)
{
@@ -3245,7 +3400,7 @@ static void buildFunctionList(const Entry *root)
// note: the following code was replaced by inMember=TRUE to deal with a
// function rname='X::foo' of class X inside a namespace also called X...
// bug id 548175
- //nd = Doxygen::namespaceSDict->find(rname.left(memIndex));
+ //nd = Doxygen::namespaceLinkedMap->find(rname.left(memIndex));
//isMember = nd==0;
//if (nd)
//{
@@ -3298,14 +3453,14 @@ static void buildFunctionList(const Entry *root)
*/
bool found=FALSE;
MemberName *mn;
- MemberDef *md=0;
- if ((mn=Doxygen::functionNameSDict->find(rname)))
+ MemberDef *md_found=0;
+ if ((mn=Doxygen::functionNameLinkedMap->find(rname)))
{
Debug::print(Debug::Functions,0," --> function %s already found!\n",qPrint(rname));
- MemberNameIterator mni(*mn);
- for (mni.toFirst();(!found && (md=mni.current()));++mni)
+ for (const auto &imd : *mn)
{
- if (!md->isAlias())
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md)
{
const NamespaceDef *mnd = md->getNamespaceDef();
NamespaceDef *rnd = 0;
@@ -3325,7 +3480,7 @@ static void buildFunctionList(const Entry *root)
if (rnd) rnsName = rnd->name().copy();
//printf("matching arguments for %s%s %s%s\n",
// md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data());
- ArgumentList &mdAl = md->argumentList();
+ const ArgumentList &mdAl = md->argumentList();
const ArgumentList &mdTempl = md->templateArguments();
// in case of template functions, we need to check if the
@@ -3348,8 +3503,8 @@ static void buildFunctionList(const Entry *root)
root->stat && md->isStatic() && root->fileName!=md->getDefFileName();
if (
- matchArguments2(md->getOuterScope(),mfd,mdAl,
- rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
+ matchArguments2(md->getOuterScope(),mfd,&mdAl,
+ rnd ? rnd : Doxygen::globalScope,rfd,&root->argList,
FALSE) &&
sameNumTemplateArgs &&
matchingReturnTypes &&
@@ -3359,7 +3514,7 @@ static void buildFunctionList(const Entry *root)
GroupDef *gd=0;
if (!root->groups.empty() && !root->groups.front().groupname.isEmpty())
{
- gd = Doxygen::groupSDict->find(root->groups.front().groupname);
+ gd = Doxygen::groupLinkedMap->find(root->groups.front().groupname);
}
//printf("match!\n");
//printf("mnd=%p rnd=%p nsName=%s rnsName=%s\n",mnd,rnd,nsName.data(),rnsName.data());
@@ -3383,20 +3538,18 @@ static void buildFunctionList(const Entry *root)
{
// merge argument lists
ArgumentList mergedArgList = root->argList;
- mergeArguments(mdAl,mergedArgList,!root->doc.isEmpty());
+ mergeArguments(const_cast<ArgumentList&>(mdAl),mergedArgList,!root->doc.isEmpty());
// merge documentation
if (md->documentation().isEmpty() && !root->doc.isEmpty())
{
- ArgumentList argList;
- stringToArgumentList(root->lang,root->args,argList);
if (root->proto)
{
//printf("setDeclArgumentList to %p\n",argList);
- md->setDeclArgumentList(argList);
+ md->moveDeclArgumentList(stringToArgumentList(root->lang,root->args));
}
else
{
- md->setArgumentList(argList);
+ md->moveArgumentList(stringToArgumentList(root->lang,root->args));
}
}
@@ -3405,7 +3558,7 @@ static void buildFunctionList(const Entry *root)
md->setDocsForDefinition(!root->proto);
if (md->getStartBodyLine()==-1 && root->bodyLine!=-1)
{
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setBodyDef(rfd);
}
@@ -3451,130 +3604,16 @@ static void buildFunctionList(const Entry *root)
}
}
}
+ if (found)
+ {
+ md_found = md;
+ break;
+ }
}
}
if (!found) /* global function is unique with respect to the file */
{
- Debug::print(Debug::Functions,0," --> new function %s found!\n",qPrint(rname));
- //printf("New function type='%s' name='%s' args='%s' bodyLine=%d\n",
- // root->type.data(),rname.data(),root->args.data(),root->bodyLine);
-
- // new global function
- QCString name=removeRedundantWhiteSpace(rname);
- md=createMemberDef(
- root->fileName,root->startLine,root->startColumn,
- root->type,name,root->args,root->exception,
- root->protection,root->virt,root->stat,Member,
- MemberType_Function,
- !root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList(),
- root->argList,root->metaData);
-
- md->setTagInfo(root->tagInfo());
- md->setLanguage(root->lang);
- md->setId(root->id);
- //md->setDefFile(root->fileName);
- //md->setDefLine(root->startLine);
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setPrototype(root->proto,root->fileName,root->startLine,root->startColumn);
- md->setDocsForDefinition(!root->proto);
- md->setTypeConstraints(root->typeConstr);
- //md->setBody(root->body);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- FileDef *fd=root->fileDef();
- md->setBodyDef(fd);
- md->addSectionsToDefinition(root->anchors);
- md->setMemberSpecifiers(root->spec);
- md->setMemberGroupId(root->mGrpId);
-
- // see if the function is inside a namespace that was not part of
- // the name already (in that case nd should be non-zero already)
- if (nd==0 && root->parent()->section == Entry::NAMESPACE_SEC )
- {
- //QCString nscope=removeAnonymousScopes(root->parent()->name);
- QCString nscope=root->parent()->name;
- if (!nscope.isEmpty())
- {
- nd = getResolvedNamespace(nscope);
- }
- }
-
- if (!scope.isEmpty())
- {
- QCString sep = getLanguageSpecificSeparator(root->lang);
- if (sep!="::")
- {
- scope = substitute(scope,"::",sep);
- }
- scope+=sep;
- }
-
- QCString def;
- //QCString optArgs = root->argList.empty() ? QCString() : root->args;
- if (!root->type.isEmpty())
- {
- def=root->type+" "+scope+name; //+optArgs;
- }
- else
- {
- def=scope+name; //+optArgs;
- }
- Debug::print(Debug::Functions,0,
- " Global Function:\n"
- " '%s' '%s'::'%s' '%s' proto=%d\n"
- " def='%s'\n",
- qPrint(root->type),
- qPrint(root->parent()->name),
- qPrint(rname),
- qPrint(root->args),
- root->proto,
- qPrint(def)
- );
- md->setDefinition(def);
- md->enableCallGraph(root->callGraph);
- md->enableCallerGraph(root->callerGraph);
- md->enableReferencedByRelation(root->referencedByRelation);
- md->enableReferencesRelation(root->referencesRelation);
- //if (root->mGrpId!=-1)
- //{
- // md->setMemberGroup(memberGroupDict[root->mGrpId]);
- //}
-
- md->setRefItems(root->sli);
- if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
- {
- // add member to namespace
- md->setNamespace(nd);
- nd->insertMember(md);
- }
- if (fd)
- {
- // add member to the file (we do this even if we have already
- // inserted it into the namespace)
- md->setFileDef(fd);
- fd->insertMember(md);
- }
-
- // add member to the list of file members
- //printf("Adding member=%s\n",md->name().data());
- MemberName *mn;
- if ((mn=Doxygen::functionNameSDict->find(name)))
- {
- mn->append(md);
- }
- else
- {
- mn = new MemberName(name);
- mn->append(md);
- Doxygen::functionNameSDict->append(name,mn);
- }
- addMemberToGroups(root,md);
- if (root->relatesType == Simple) // if this is a relatesalso command,
- // allow find Member to pick it up
- {
- root->markAsProcessed(); // Otherwise we have finished with this entry.
- }
+ addGlobalFunction(root,rname,scope);
}
else
{
@@ -3583,7 +3622,7 @@ static void buildFunctionList(const Entry *root)
{
// add member to the file (we do this even if we have already
// inserted it into the namespace)
- fd->insertMember(md);
+ fd->insertMember(md_found);
}
}
@@ -3610,41 +3649,37 @@ static void buildFunctionList(const Entry *root)
static void findFriends()
{
//printf("findFriends()\n");
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
- MemberName *fn;
- for (;(fn=fnli.current());++fnli) // for each global function name
+ for (const auto &fn : *Doxygen::functionNameLinkedMap) // for each global function name
{
//printf("Function name='%s'\n",fn->memberName());
MemberName *mn;
- if ((mn=Doxygen::memberNameSDict->find(fn->memberName())))
+ if ((mn=Doxygen::memberNameLinkedMap->find(fn->memberName())))
{ // there are members with the same name
//printf("Function name is also a member name\n");
- MemberNameIterator fni(*fn);
- MemberDef *fmd;
- for (;(fmd=fni.current());++fni) // for each function with that name
+ // for each function with that name
+ for (const auto &ifmd : *fn)
{
- const MemberDef *cfmd = const_cast<const MemberDef*>(fmd);
- MemberNameIterator mni(*mn);
- MemberDef *mmd;
- for (;(mmd=mni.current());++mni) // for each member with that name
+ MemberDefMutable *fmd = toMemberDefMutable(ifmd.get());
+ // for each member with that name
+ for (const auto &immd : *mn)
{
- const MemberDef *cmmd = const_cast<const MemberDef*>(mmd);
+ MemberDefMutable *mmd = toMemberDefMutable(immd.get());
//printf("Checking for matching arguments
// mmd->isRelated()=%d mmd->isFriend()=%d mmd->isFunction()=%d\n",
// mmd->isRelated(),mmd->isFriend(),mmd->isFunction());
- if ((cmmd->isFriend() || (cmmd->isRelated() && cmmd->isFunction())) &&
- !fmd->isAlias() && !mmd->isAlias() &&
- matchArguments2(cmmd->getOuterScope(), cmmd->getFileDef(), cmmd->argumentList(),
- cfmd->getOuterScope(), cfmd->getFileDef(), cfmd->argumentList(),
+ if (fmd && mmd &&
+ (mmd->isFriend() || (mmd->isRelated() && mmd->isFunction())) &&
+ matchArguments2(mmd->getOuterScope(), mmd->getFileDef(), &mmd->argumentList(),
+ fmd->getOuterScope(), fmd->getFileDef(), &fmd->argumentList(),
TRUE
)
) // if the member is related and the arguments match then the
// function is actually a friend.
{
- ArgumentList &mmdAl = mmd->argumentList();
- ArgumentList &fmdAl = fmd->argumentList();
- mergeArguments(mmdAl,fmdAl);
+ const ArgumentList &mmdAl = mmd->argumentList();
+ const ArgumentList &fmdAl = fmd->argumentList();
+ mergeArguments(const_cast<ArgumentList&>(mmdAl),const_cast<ArgumentList&>(fmdAl));
if (!fmd->documentation().isEmpty())
{
mmd->setDocumentation(fmd->documentation(),fmd->docFile(),fmd->docLine());
@@ -3672,13 +3707,13 @@ static void findFriends()
//printf("body mmd %d fmd %d\n",mmd->getStartBodyLine(),fmd->getStartBodyLine());
if (mmd->getStartBodyLine()==-1 && fmd->getStartBodyLine()!=-1)
{
- mmd->setBodySegment(fmd->getStartBodyLine(),fmd->getEndBodyLine());
+ mmd->setBodySegment(fmd->getDefLine(),fmd->getStartBodyLine(),fmd->getEndBodyLine());
mmd->setBodyDef(fmd->getBodyDef());
//mmd->setBodyMember(fmd);
}
else if (mmd->getStartBodyLine()!=-1 && fmd->getStartBodyLine()==-1)
{
- fmd->setBodySegment(mmd->getStartBodyLine(),mmd->getEndBodyLine());
+ fmd->setBodySegment(mmd->getDefLine(),mmd->getStartBodyLine(),mmd->getEndBodyLine());
fmd->setBodyDef(mmd->getBodyDef());
//fmd->setBodyMember(mmd);
}
@@ -3707,24 +3742,23 @@ static void transferFunctionDocumentation()
//printf("---- transferFunctionDocumentation()\n");
// find matching function declaration and definitions.
- MemberNameSDict::Iterator mnli(*Doxygen::functionNameSDict);
- MemberName *mn;
- for (;(mn=mnli.current());++mnli)
+ for (const auto &mn : *Doxygen::functionNameLinkedMap)
{
//printf("memberName=%s count=%d\n",mn->memberName(),mn->count());
- MemberDef *mdef=0,*mdec=0;
- MemberNameIterator mni1(*mn);
/* find a matching function declaration and definition for this function */
- for (;(mdec=mni1.current());++mni1)
+ for (const auto &imdec : *mn)
{
- if (mdec->isPrototype() ||
- (mdec->isVariable() && mdec->isExternal())
- )
+ MemberDefMutable *mdec = toMemberDefMutable(imdec.get());
+ if (mdec &&
+ (mdec->isPrototype() ||
+ (mdec->isVariable() && mdec->isExternal())
+ ))
{
- MemberNameIterator mni2(*mn);
- for (;(mdef=mni2.current());++mni2)
+ for (const auto &imdef : *mn)
{
- if (mdec!=mdef && !mdec->isAlias() && !mdef->isAlias())
+ MemberDefMutable *mdef = toMemberDefMutable(imdef.get());
+ if (mdef && mdec!=mdef &&
+ mdec->getNamespaceDef()==mdef->getNamespaceDef())
{
combineDeclarationAndDefinition(mdec,mdef);
}
@@ -3738,89 +3772,43 @@ static void transferFunctionDocumentation()
static void transferFunctionReferences()
{
- MemberNameSDict::Iterator mnli(*Doxygen::functionNameSDict);
- MemberName *mn;
- for (;(mn=mnli.current());++mnli)
+ for (const auto &mn : *Doxygen::functionNameLinkedMap)
{
- MemberDef *md,*mdef=0,*mdec=0;
- MemberNameIterator mni(*mn);
+ MemberDefMutable *mdef=0,*mdec=0;
/* find a matching function declaration and definition for this function */
- for (;(md=mni.current());++mni)
+ for (const auto &imd : *mn)
{
- if (md->isPrototype())
- mdec=md;
- else if (md->isVariable() && md->isExternal())
- mdec=md;
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md)
+ {
+ if (md->isPrototype())
+ mdec=md;
+ else if (md->isVariable() && md->isExternal())
+ mdec=md;
- if (md->isFunction() && !md->isStatic() && !md->isPrototype())
- mdef=md;
- else if (md->isVariable() && !md->isExternal() && !md->isStatic())
- mdef=md;
+ if (md->isFunction() && !md->isStatic() && !md->isPrototype())
+ mdef=md;
+ else if (md->isVariable() && !md->isExternal() && !md->isStatic())
+ mdef=md;
+ }
+
+ if (mdef && mdec) break;
}
if (mdef && mdec)
{
- ArgumentList &mdefAl = mdef->argumentList();
- ArgumentList &mdecAl = mdec->argumentList();
+ const ArgumentList &mdefAl = mdef->argumentList();
+ const ArgumentList &mdecAl = mdec->argumentList();
if (
- matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl,
- mdec->getOuterScope(),mdec->getFileDef(),mdecAl,
+ matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),const_cast<ArgumentList*>(&mdefAl),
+ mdec->getOuterScope(),mdec->getFileDef(),const_cast<ArgumentList*>(&mdecAl),
TRUE
)
) /* match found */
{
- MemberSDict *defDict = mdef->getReferencesMembers();
- MemberSDict *decDict = mdec->getReferencesMembers();
- if (defDict!=0)
- {
- MemberSDict::IteratorDict msdi(*defDict);
- MemberDef *rmd;
- for (msdi.toFirst();(rmd=msdi.current());++msdi)
- {
- if (decDict==0 || decDict->find(rmd->name())==0)
- {
- mdec->addSourceReferences(rmd);
- }
- }
- }
- if (decDict!=0)
- {
- MemberSDict::IteratorDict msdi(*decDict);
- MemberDef *rmd;
- for (msdi.toFirst();(rmd=msdi.current());++msdi)
- {
- if (defDict==0 || defDict->find(rmd->name())==0)
- {
- mdef->addSourceReferences(rmd);
- }
- }
- }
-
- defDict = mdef->getReferencedByMembers();
- decDict = mdec->getReferencedByMembers();
- if (defDict!=0)
- {
- MemberSDict::IteratorDict msdi(*defDict);
- MemberDef *rmd;
- for (msdi.toFirst();(rmd=msdi.current());++msdi)
- {
- if (decDict==0 || decDict->find(rmd->name())==0)
- {
- mdec->addSourceReferencedBy(rmd);
- }
- }
- }
- if (decDict!=0)
- {
- MemberSDict::IteratorDict msdi(*decDict);
- MemberDef *rmd;
- for (msdi.toFirst();(rmd=msdi.current());++msdi)
- {
- if (defDict==0 || defDict->find(rmd->name())==0)
- {
- mdef->addSourceReferencedBy(rmd);
- }
- }
- }
+ mdef->mergeReferences(mdec);
+ mdec->mergeReferences(mdef);
+ mdef->mergeReferencedBy(mdec);
+ mdec->mergeReferencedBy(mdef);
}
}
}
@@ -3832,40 +3820,41 @@ static void transferRelatedFunctionDocumentation()
{
// find match between function declaration and definition for
// related functions
- MemberNameSDict::Iterator mnli(*Doxygen::functionNameSDict);
- MemberName *mn;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
+ for (const auto &mn : *Doxygen::functionNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
/* find a matching function declaration and definition for this function */
- for (mni.toFirst();(md=mni.current());++mni) // for each global function
- {
- //printf(" Function '%s'\n",md->name().data());
- MemberName *rmn;
- if ((rmn=Doxygen::memberNameSDict->find(md->name()))) // check if there is a member with the same name
- {
- //printf(" Member name found\n");
- MemberDef *rmd;
- MemberNameIterator rmni(*rmn);
- for (rmni.toFirst();(rmd=rmni.current());++rmni) // for each member with the same name
- {
- //printf(" Member found: related='%d'\n",rmd->isRelated());
- if ((rmd->isRelated() || rmd->isForeign()) && // related function
- !md->isAlias() && !rmd->isAlias() &&
- matchArguments2( md->getOuterScope(), md->getFileDef(), md->argumentList(),
- rmd->getOuterScope(),rmd->getFileDef(),rmd->argumentList(),
- TRUE
- )
- )
+ // for each global function
+ for (const auto &imd : *mn)
+ {
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md)
+ {
+ //printf(" Function '%s'\n",md->name().data());
+ MemberName *rmn;
+ if ((rmn=Doxygen::memberNameLinkedMap->find(md->name()))) // check if there is a member with the same name
+ {
+ //printf(" Member name found\n");
+ // for each member with the same name
+ for (const auto &irmd : *rmn)
{
- //printf(" Found related member '%s'\n",md->name().data());
- if (rmd->relatedAlso())
- md->setRelatedAlso(rmd->relatedAlso());
- else if (rmd->isForeign())
- md->makeForeign();
- else
- md->makeRelated();
+ MemberDefMutable *rmd = toMemberDefMutable(irmd.get());
+ //printf(" Member found: related='%d'\n",rmd->isRelated());
+ if (rmd &&
+ (rmd->isRelated() || rmd->isForeign()) && // related function
+ matchArguments2( md->getOuterScope(), md->getFileDef(), &md->argumentList(),
+ rmd->getOuterScope(),rmd->getFileDef(),&rmd->argumentList(),
+ TRUE
+ )
+ )
+ {
+ //printf(" Found related member '%s'\n",md->name().data());
+ if (rmd->relatedAlso())
+ md->setRelatedAlso(rmd->relatedAlso());
+ else if (rmd->isForeign())
+ md->makeForeign();
+ else
+ md->makeRelated();
+ }
}
}
}
@@ -3916,24 +3905,22 @@ static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,co
return result;
}
FileDef *fd=cd->getFileDef();
+ SymbolResolver resolver(fd);
if (context && cd!=context)
{
- result = const_cast<ClassDef*>(getResolvedClass(context,0,name,0,0,TRUE,TRUE));
+ result = const_cast<ClassDef*>(resolver.resolveClass(context,name,true,true));
}
+ //printf("1. result=%p\n",result);
if (result==0)
{
- result = const_cast<ClassDef*>(getResolvedClass(cd,fd,name,0,0,TRUE,TRUE));
+ result = const_cast<ClassDef*>(resolver.resolveClass(cd,name,true,true));
}
+ //printf("2. result=%p\n",result);
if (result==0) // try direct class, needed for namespaced classes imported via tag files (see bug624095)
{
result = getClass(name);
}
- if (result==0 &&
- (cd->getLanguage()==SrcLangExt_CSharp || cd->getLanguage()==SrcLangExt_Java) &&
- name.find('<')!=-1)
- {
- result = Doxygen::genericsDict->find(name);
- }
+ //printf("3. result=%p\n",result);
//printf("** Trying to find %s within context %s class %s result=%s lookup=%p\n",
// name.data(),
// context ? context->name().data() : "<none>",
@@ -3947,184 +3934,192 @@ static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,co
static void findUsedClassesForClass(const Entry *root,
Definition *context,
- ClassDef *masterCd,
- ClassDef *instanceCd,
+ ClassDefMutable *masterCd,
+ ClassDefMutable *instanceCd,
bool isArtificial,
- const ArgumentList &actualArgs=ArgumentList(),
+ const std::unique_ptr<ArgumentList> &actualArgs = std::unique_ptr<ArgumentList>(),
QDict<int> *templateNames=0
)
{
- masterCd->setVisited(TRUE);
const ArgumentList &formalArgs = masterCd->templateArguments();
- if (masterCd->memberNameInfoSDict())
+ for (auto &mni : masterCd->memberNameInfoLinkedMap())
{
- MemberNameInfoSDict::Iterator mnili(*masterCd->memberNameInfoSDict());
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
+ for (auto &mi : *mni)
{
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
+ MemberDef *md=mi->memberDef();
+ if (md->isVariable() || md->isObjCProperty()) // for each member variable in this class
{
- MemberDef *md=mi->memberDef;
- if (md->isVariable() || md->isObjCProperty()) // for each member variable in this class
+ //printf(" Found variable %s in class %s\n",md->name().data(),masterCd->name().data());
+ QCString type = normalizeNonTemplateArgumentsInString(md->typeString(),masterCd,formalArgs);
+ QCString typedefValue = resolveTypeDef(masterCd,type);
+ if (!typedefValue.isEmpty())
{
- //printf(" Found variable %s in class %s\n",md->name().data(),masterCd->name().data());
- QCString type = normalizeNonTemplateArgumentsInString(md->typeString(),masterCd,formalArgs);
- QCString typedefValue = resolveTypeDef(masterCd,type);
- if (!typedefValue.isEmpty())
+ type = typedefValue;
+ }
+ int pos=0;
+ QCString usedClassName;
+ QCString templSpec;
+ bool found=FALSE;
+ // the type can contain template variables, replace them if present
+ type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs);
+
+ //printf(" template substitution gives=%s\n",type.data());
+ while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec,root->lang)!=-1)
+ {
+ // find the type (if any) that matches usedClassName
+ SymbolResolver resolver(masterCd->getFileDef());
+ const ClassDefMutable *typeCd = resolver.resolveClassMutable(masterCd,usedClassName,false,true);
+ //printf("====> usedClassName=%s -> typeCd=%s\n",
+ // usedClassName.data(),typeCd?typeCd->name().data():"<none>");
+ if (typeCd)
{
- type = typedefValue;
+ usedClassName = typeCd->name();
}
- int pos=0;
- QCString usedClassName;
- QCString templSpec;
- bool found=FALSE;
- // the type can contain template variables, replace them if present
- type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs);
- //printf(" template substitution gives=%s\n",type.data());
- while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec,root->lang)!=-1)
+ int sp=usedClassName.find('<');
+ if (sp==-1) sp=0;
+ int si=usedClassName.findRev("::",sp);
+ if (si!=-1)
{
- // find the type (if any) that matches usedClassName
- const ClassDef *typeCd = getResolvedClass(masterCd,
- masterCd->getFileDef(),
- usedClassName,
- 0,0,
- FALSE,TRUE
- );
- //printf("====> usedClassName=%s -> typeCd=%s\n",
- // usedClassName.data(),typeCd?typeCd->name().data():"<none>");
- if (typeCd)
- {
- usedClassName = typeCd->name();
- }
+ // replace any namespace aliases
+ replaceNamespaceAliases(usedClassName,si);
+ }
+ // add any template arguments to the class
+ QCString usedName = removeRedundantWhiteSpace(usedClassName+templSpec);
+ //printf(" usedName=%s\n",usedName.data());
- int sp=usedClassName.find('<');
- if (sp==-1) sp=0;
- int si=usedClassName.findRev("::",sp);
- if (si!=-1)
- {
- // replace any namespace aliases
- replaceNamespaceAliases(usedClassName,si);
- }
- // add any template arguments to the class
- QCString usedName = removeRedundantWhiteSpace(usedClassName+templSpec);
- //printf(" usedName=%s\n",usedName.data());
+ bool delTempNames=FALSE;
+ if (templateNames==0)
+ {
+ templateNames = getTemplateArgumentsInName(formalArgs,usedName);
+ delTempNames=TRUE;
+ }
+ BaseInfo bi(usedName,Public,Normal);
+ findClassRelation(root,context,instanceCd,&bi,templateNames,TemplateInstances,isArtificial);
- bool delTempNames=FALSE;
- if (templateNames==0)
+ for (const Argument &arg : masterCd->templateArguments())
+ {
+ if (arg.name==usedName) // type is a template argument
{
- templateNames = getTemplateArgumentsInName(formalArgs,usedName);
- delTempNames=TRUE;
- }
- BaseInfo bi(usedName,Public,Normal);
- findClassRelation(root,context,instanceCd,&bi,templateNames,TemplateInstances,isArtificial);
+ Debug::print(Debug::Classes,0," New used class '%s'\n", qPrint(usedName));
- int count=0;
- for (const Argument &arg : masterCd->templateArguments())
- {
- if (arg.name==usedName) // type is a template argument
+ ClassDef *usedCd = Doxygen::hiddenClassLinkedMap->find(usedName);
+ ClassDefMutable *usedCdm = toClassDefMutable(usedCd);
+ if (usedCd==0)
{
- found=TRUE;
- Debug::print(Debug::Classes,0," New used class '%s'\n", qPrint(usedName));
-
- ClassDef *usedCd = Doxygen::hiddenClasses->find(usedName);
- if (usedCd==0)
+ usedCdm = toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(usedName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(
+ masterCd->getDefFileName(),masterCd->getDefLine(),
+ masterCd->getDefColumn(),
+ usedName,
+ ClassDef::Class))));
+ if (usedCdm)
{
- usedCd = createClassDef(
- masterCd->getDefFileName(),masterCd->getDefLine(),
- masterCd->getDefColumn(),
- usedName,
- ClassDef::Class);
//printf("making %s a template argument!!!\n",usedCd->name().data());
- usedCd->makeTemplateArgument();
- usedCd->setUsedOnly(TRUE);
- usedCd->setLanguage(masterCd->getLanguage());
- Doxygen::hiddenClasses->append(usedName,usedCd);
+ usedCdm->makeTemplateArgument();
+ usedCdm->setUsedOnly(TRUE);
+ usedCdm->setLanguage(masterCd->getLanguage());
+ usedCd = usedCdm;
}
- if (isArtificial) usedCd->setArtificial(TRUE);
+ }
+ if (usedCd)
+ {
+ found=TRUE;
Debug::print(Debug::Classes,0," Adding used class '%s' (1)\n", qPrint(usedCd->name()));
instanceCd->addUsedClass(usedCd,md->name(),md->protection());
- usedCd->addUsedByClass(instanceCd,md->name(),md->protection());
+ if (usedCdm)
+ {
+ if (isArtificial) usedCdm->setArtificial(TRUE);
+ usedCdm->addUsedByClass(instanceCd,md->name(),md->protection());
+ }
}
}
+ }
- if (!found)
- {
- ClassDef *usedCd=findClassWithinClassContext(context,masterCd,usedName);
- //printf("Looking for used class %s: result=%s master=%s\n",
- // usedName.data(),usedCd?usedCd->name().data():"<none>",masterCd?masterCd->name().data():"<none>");
+ if (!found)
+ {
+ ClassDef *usedCd=findClassWithinClassContext(context,masterCd,usedName);
+ //printf("Looking for used class %s: result=%s master=%s\n",
+ // usedName.data(),usedCd?usedCd->name().data():"<none>",masterCd?masterCd->name().data():"<none>");
- if (usedCd)
+ if (usedCd)
+ {
+ found=TRUE;
+ Debug::print(Debug::Classes,0," Adding used class '%s' (2)\n", qPrint(usedCd->name()));
+ instanceCd->addUsedClass(usedCd,md->name(),md->protection()); // class exists
+ ClassDefMutable *usedCdm = toClassDefMutable(usedCd);
+ if (usedCdm)
{
- found=TRUE;
- Debug::print(Debug::Classes,0," Adding used class '%s' (2)\n", qPrint(usedCd->name()));
- instanceCd->addUsedClass(usedCd,md->name(),md->protection()); // class exists
- usedCd->addUsedByClass(instanceCd,md->name(),md->protection());
+ usedCdm->addUsedByClass(instanceCd,md->name(),md->protection());
}
}
- if (delTempNames)
- {
- delete templateNames;
- templateNames=0;
- }
}
- if (!found && !type.isEmpty()) // used class is not documented in any scope
+ if (delTempNames)
+ {
+ delete templateNames;
+ templateNames=0;
+ }
+ }
+ if (!found && !type.isEmpty()) // used class is not documented in any scope
+ {
+ ClassDef *usedCd = Doxygen::hiddenClassLinkedMap->find(type);
+ ClassDefMutable *usedCdm = toClassDefMutable(usedCd);
+ if (usedCd==0 && !Config_getBool(HIDE_UNDOC_RELATIONS))
{
- ClassDef *usedCd = Doxygen::hiddenClasses->find(type);
- if (usedCd==0 && !Config_getBool(HIDE_UNDOC_RELATIONS))
+ if (type.right(2)=="(*" || type.right(2)=="(^") // type is a function pointer
{
- if (type.right(2)=="(*" || type.right(2)=="(^") // type is a function pointer
- {
- type+=md->argsString();
- }
- Debug::print(Debug::Classes,0," New undocumented used class '%s'\n", qPrint(type));
- usedCd = createClassDef(
- masterCd->getDefFileName(),masterCd->getDefLine(),
- masterCd->getDefColumn(),
- type,ClassDef::Class);
- usedCd->setUsedOnly(TRUE);
- usedCd->setLanguage(masterCd->getLanguage());
- Doxygen::hiddenClasses->append(type,usedCd);
+ type+=md->argsString();
}
- if (usedCd)
+ Debug::print(Debug::Classes,0," New undocumented used class '%s'\n", qPrint(type));
+ usedCdm = toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(type,
+ std::unique_ptr<ClassDef>(
+ createClassDef(
+ masterCd->getDefFileName(),masterCd->getDefLine(),
+ masterCd->getDefColumn(),
+ type,ClassDef::Class))));
+ if (usedCdm)
{
- if (isArtificial) usedCd->setArtificial(TRUE);
- Debug::print(Debug::Classes,0," Adding used class '%s' (3)\n", qPrint(usedCd->name()));
- instanceCd->addUsedClass(usedCd,md->name(),md->protection());
- usedCd->addUsedByClass(instanceCd,md->name(),md->protection());
+ usedCdm->setUsedOnly(TRUE);
+ usedCdm->setLanguage(masterCd->getLanguage());
+ usedCd = usedCdm;
+ }
+ }
+ if (usedCd)
+ {
+ Debug::print(Debug::Classes,0," Adding used class '%s' (3)\n", qPrint(usedCd->name()));
+ instanceCd->addUsedClass(usedCd,md->name(),md->protection());
+ if (usedCdm)
+ {
+ if (isArtificial) usedCdm->setArtificial(TRUE);
+ usedCdm->addUsedByClass(instanceCd,md->name(),md->protection());
}
}
}
}
}
}
- else
- {
- //printf("no members for class %s (%p)\n",masterCd->name().data(),masterCd);
- }
}
static void findBaseClassesForClass(
const Entry *root,
Definition *context,
- ClassDef *masterCd,
- ClassDef *instanceCd,
+ ClassDefMutable *masterCd,
+ ClassDefMutable *instanceCd,
FindBaseClassRelation_Mode mode,
bool isArtificial,
- const ArgumentList &actualArgs=ArgumentList(),
+ const std::unique_ptr<ArgumentList> &actualArgs = std::unique_ptr<ArgumentList>(),
QDict<int> *templateNames=0
)
{
- //if (masterCd->visited) return;
- masterCd->setVisited(TRUE);
// The base class could ofcouse also be a non-nested class
const ArgumentList &formalArgs = masterCd->templateArguments();
for (const BaseInfo &bi : root->extends)
{
- //printf("masterCd=%s bi->name='%s' #actualArgs=%d\n",
- // masterCd->localName().data(),bi->name.data(),actualArgs?(int)actualArgs->count():-1);
+ //printf("masterCd=%s bi.name='%s' #actualArgs=%d\n",
+ // masterCd->localName().data(),bi.name.data(),actualArgs ? (int)actualArgs->size() : -1);
bool delTempNames=FALSE;
if (templateNames==0)
{
@@ -4164,14 +4159,14 @@ static void findBaseClassesForClass(
//----------------------------------------------------------------------
-static bool findTemplateInstanceRelation(const Entry *root,
+static void findTemplateInstanceRelation(const Entry *root,
Definition *context,
- ClassDef *templateClass,const QCString &templSpec,
+ ClassDefMutable *templateClass,const QCString &templSpec,
QDict<int> *templateNames,
bool isArtificial)
{
- Debug::print(Debug::Classes,0," derived from template %s with parameters %s\n",
- qPrint(templateClass->name()),qPrint(templSpec));
+ Debug::print(Debug::Classes,0," derived from template %s with parameters %s isArtificial=%d\n",
+ qPrint(templateClass->name()),qPrint(templSpec),isArtificial);
//printf("findTemplateInstanceRelation(base=%s templSpec=%s templateNames=",
// templateClass->name().data(),templSpec.data());
//if (templateNames)
@@ -4186,52 +4181,51 @@ static bool findTemplateInstanceRelation(const Entry *root,
//printf("\n");
bool existingClass = (templSpec ==
- tempArgListToString(templateClass->templateArguments(),root->lang)
+ tempArgListToString(templateClass->templateArguments(),root->lang,false)
);
- if (existingClass) return TRUE;
+ if (existingClass) return;
bool freshInstance=FALSE;
- ClassDef *instanceClass = templateClass->insertTemplateInstance(
- root->fileName,root->startLine,root->startColumn,templSpec,freshInstance);
- if (isArtificial) instanceClass->setArtificial(TRUE);
- instanceClass->setLanguage(root->lang);
-
- if (freshInstance)
+ ClassDefMutable *instanceClass = toClassDefMutable(
+ templateClass->insertTemplateInstance(
+ root->fileName,root->startLine,root->startColumn,templSpec,freshInstance));
+ if (instanceClass)
{
- Debug::print(Debug::Classes,0," found fresh instance '%s'!\n",qPrint(instanceClass->name()));
- Doxygen::classSDict->append(instanceClass->name(),instanceClass);
- instanceClass->setTemplateBaseClassNames(templateNames);
+ if (isArtificial)
+ {
+ instanceClass->setArtificial(TRUE);
+ }
+ instanceClass->setLanguage(root->lang);
- // search for new template instances caused by base classes of
- // instanceClass
- auto it = g_classEntries.find(templateClass->name().data());
- if (it!=g_classEntries.end())
+ if (freshInstance)
{
- const Entry *templateRoot = it->second;
- Debug::print(Debug::Classes,0," template root found %s templSpec=%s!\n",
- qPrint(templateRoot->name),qPrint(templSpec));
- ArgumentList templArgs;
- stringToArgumentList(root->lang,templSpec,templArgs);
- findBaseClassesForClass(templateRoot,context,templateClass,instanceClass,
- TemplateInstances,isArtificial,templArgs,templateNames);
+ Debug::print(Debug::Classes,0," found fresh instance '%s'!\n",qPrint(instanceClass->name()));
+ instanceClass->setTemplateBaseClassNames(templateNames);
- findUsedClassesForClass(templateRoot,context,templateClass,instanceClass,
- isArtificial,templArgs,templateNames);
+ // search for new template instances caused by base classes of
+ // instanceClass
+ auto it_pair = g_classEntries.equal_range(templateClass->name().data());
+ for (auto it=it_pair.first ; it!=it_pair.second ; ++it)
+ {
+ const Entry *templateRoot = it->second;
+ Debug::print(Debug::Classes,0," template root found %s templSpec=%s!\n",
+ qPrint(templateRoot->name),qPrint(templSpec));
+ std::unique_ptr<ArgumentList> templArgs = stringToArgumentList(root->lang,templSpec);
+ findBaseClassesForClass(templateRoot,context,templateClass,instanceClass,
+ TemplateInstances,isArtificial,templArgs,templateNames);
+
+ findUsedClassesForClass(templateRoot,context,templateClass,instanceClass,
+ isArtificial,templArgs,templateNames);
+ }
+
+ //Debug::print(Debug::Classes,0," Template instance %s : \n",instanceClass->name().data());
+ //ArgumentList *tl = templateClass->templateArguments();
}
else
{
- Debug::print(Debug::Classes,0," no template root entry found!\n");
- // TODO: what happened if we get here?
+ Debug::print(Debug::Classes,0," instance already exists!\n");
}
-
- //Debug::print(Debug::Classes,0," Template instance %s : \n",instanceClass->name().data());
- //ArgumentList *tl = templateClass->templateArguments();
- }
- else
- {
- Debug::print(Debug::Classes,0," instance already exists!\n");
}
- return TRUE;
}
static bool isRecursiveBaseClass(const QCString &scope,const QCString &name)
@@ -4325,10 +4319,40 @@ static int findEndOfTemplate(const QCString &s,int startPos)
return brCount==0 ? e : -1;
}
+static int findTemplateSpecializationPosition(const char *name)
+{
+ if (name==0 || name[0]=='\0') return 0;
+ int l = static_cast<int>(strlen(name));
+ if (name[l-1]=='>') // search backward to find the matching <, allowing nested <...> and strings.
+ {
+ int count=1;
+ int i=l-2;
+ char insideQuote=0;
+ while (count>0 && i>=0)
+ {
+ char c = name[i--];
+ switch (c)
+ {
+ case '>': if (!insideQuote) count++; break;
+ case '<': if (!insideQuote) count--; break;
+ case '\'': if (!insideQuote) insideQuote=c;
+ else if (insideQuote==c && (i<0 || name[i]!='\\')) insideQuote=0;
+ break;
+ case '"': if (!insideQuote) insideQuote=c;
+ else if (insideQuote==c && (i<0 || name[i]!='\\')) insideQuote=0;
+ break;
+ default: break;
+ }
+ }
+ if (i>=0) l=i+1;
+ }
+ return l;
+}
+
static bool findClassRelation(
const Entry *root,
Definition *context,
- ClassDef *cd,
+ ClassDefMutable *cd,
const BaseInfo *bi,
QDict<int> *templateNames,
FindBaseClassRelation_Mode mode,
@@ -4378,17 +4402,14 @@ static bool findClassRelation(
//baseClassName=stripTemplateSpecifiersFromScope
// (removeRedundantWhiteSpace(baseClassName),TRUE,
// &stripped);
- const MemberDef *baseClassTypeDef=0;
- QCString templSpec;
- ClassDef *baseClass=const_cast<ClassDef*>(
- getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context,
- cd->getFileDef(),
+ SymbolResolver resolver(cd->getFileDef());
+ ClassDefMutable *baseClass = resolver.resolveClassMutable(explicitGlobalScope ? Doxygen::globalScope : context,
baseClassName,
- &baseClassTypeDef,
- &templSpec,
mode==Undocumented,
- TRUE
- ));
+ true
+ );
+ const MemberDef *baseClassTypeDef = resolver.getTypedef();
+ QCString templSpec = resolver.getTemplateSpec();
//printf("baseClassName=%s baseClass=%p cd=%p explicitGlobalScope=%d\n",
// baseClassName.data(),baseClass,cd,explicitGlobalScope);
//printf(" scope='%s' baseClassName='%s' baseClass=%s templSpec=%s\n",
@@ -4419,16 +4440,10 @@ static bool findClassRelation(
qPrint(templSpec)
);
- int i=baseClassName.find('<');
- int si=baseClassName.findRev("::",i==-1 ? baseClassName.length() : i);
+ int i=findTemplateSpecializationPosition(baseClassName);
+ int si=baseClassName.findRev("::",i);
if (si==-1) si=0;
- if (baseClass==0 && (root->lang==SrcLangExt_CSharp || root->lang==SrcLangExt_Java))
- {
- // for Java/C# strip the template part before looking for matching
- baseClass = Doxygen::genericsDict->find(baseClassName.left(i));
- //printf("looking for '%s' result=%p\n",baseClassName.data(),baseClass);
- }
- if (baseClass==0 && i!=-1)
+ if (baseClass==0 && static_cast<uint>(i)!=baseClassName.length())
// base class has template specifiers
{
// TODO: here we should try to find the correct template specialization
@@ -4437,17 +4452,14 @@ static bool findClassRelation(
//printf("baseClass==0 i=%d e=%d\n",i,e);
if (e!=-1) // end of template was found at e
{
- templSpec=removeRedundantWhiteSpace(baseClassName.mid(i,e-i));
- baseClassName=baseClassName.left(i)+baseClassName.right(baseClassName.length()-e);
- baseClass=const_cast<ClassDef*>(
- getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context,
- cd->getFileDef(),
+ templSpec = removeRedundantWhiteSpace(baseClassName.mid(i,e-i));
+ baseClassName = baseClassName.left(i)+baseClassName.right(baseClassName.length()-e);
+ baseClass = resolver.resolveClassMutable(explicitGlobalScope ? Doxygen::globalScope : context,
baseClassName,
- &baseClassTypeDef,
- 0, //&templSpec,
mode==Undocumented,
- TRUE
- ));
+ true
+ );
+ baseClassTypeDef = resolver.getTypedef();
//printf("baseClass=%p -> baseClass=%s templSpec=%s\n",
// baseClass,baseClassName.data(),templSpec.data());
}
@@ -4458,8 +4470,8 @@ static bool findClassRelation(
// instance (for instance if a class
// derived from a template argument)
{
- //printf("baseClass=%p templSpec=%s\n",baseClass,templSpec.data());
- ClassDef *templClass=getClass(baseClass->name()+templSpec);
+ //printf("baseClass=%s templSpec=%s\n",baseClass->name().data(),templSpec.data());
+ ClassDefMutable *templClass=getClassMutable(baseClass->name()+templSpec);
if (templClass)
{
// use the template instance instead of the template base.
@@ -4473,46 +4485,37 @@ static bool findClassRelation(
//printf("1. found=%d\n",found);
if (!found && si!=-1)
{
- QCString tmpTemplSpec;
// replace any namespace aliases
replaceNamespaceAliases(baseClassName,si);
- baseClass=const_cast<ClassDef*>(
- getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context,
- cd->getFileDef(),
+ baseClass = resolver.resolveClassMutable(explicitGlobalScope ? Doxygen::globalScope : context,
baseClassName,
- &baseClassTypeDef,
- &tmpTemplSpec,
mode==Undocumented,
- TRUE
- ));
+ true
+ );
+ baseClassTypeDef = resolver.getTypedef();
+ QCString tmpTemplSpec = resolver.getTemplateSpec();
found=baseClass!=0 && baseClass!=cd;
if (found) templSpec = tmpTemplSpec;
}
//printf("2. found=%d\n",found);
- //printf("root->name=%s biName=%s baseClassName=%s\n",
- // root->name.data(),biName.data(),baseClassName.data());
- //if (cd->isCSharp() && i!=-1) // C# generic -> add internal -g postfix
- //{
- // baseClassName+="-g";
- //}
-
if (!found)
{
- baseClass=findClassWithinClassContext(context,cd,baseClassName);
+ baseClass=toClassDefMutable(findClassWithinClassContext(context,cd,baseClassName));
//printf("findClassWithinClassContext(%s,%s)=%p\n",
// cd->name().data(),baseClassName.data(),baseClass);
found = baseClass!=0 && baseClass!=cd;
}
+ //printf("3. found=%d\n",found);
if (!found)
{
// for PHP the "use A\B as C" construct map class C to A::B, so we lookup
// the class name also in the alias mapping.
- QCString *aliasName = Doxygen::namespaceAliasDict[baseClassName];
- if (aliasName) // see if it is indeed a class.
+ auto it = Doxygen::namespaceAliasMap.find(baseClassName.data());
+ if (it!=Doxygen::namespaceAliasMap.end()) // see if it is indeed a class.
{
- baseClass=getClass(*aliasName);
+ baseClass=getClassMutable(it->second.c_str());
found = baseClass!=0 && baseClass!=cd;
}
}
@@ -4521,7 +4524,7 @@ static bool findClassRelation(
// warning: the following line doesn't work for Mixin classes (see bug 560623)
// templSpec = getCanonicalTemplateSpec(cd, cd->getFileDef(), templSpec);
- //printf("3. found=%d\n",found);
+ //printf("4. found=%d\n",found);
if (found)
{
Debug::print(Debug::Classes,0," Documented base class '%s' templSpec=%s\n",qPrint(biName),qPrint(templSpec));
@@ -4545,7 +4548,7 @@ static bool findClassRelation(
if (baseClassTypeDef==0)
{
//printf(" => findTemplateInstanceRelation: %p\n",baseClassTypeDef);
- findTemplateInstanceRelation(root,context,baseClass,templSpec,templateNames,isArtificial);
+ findTemplateInstanceRelation(root,context,baseClass,templSpec,templateNames,baseClass->isArtificial());
}
}
else if (mode==DocumentedOnly || mode==Undocumented)
@@ -4585,57 +4588,80 @@ static bool findClassRelation(
baseClass=0;
if (isATemplateArgument)
{
- baseClass=Doxygen::hiddenClasses->find(baseClassName);
- if (baseClass==0)
+ baseClass = toClassDefMutable(Doxygen::hiddenClassLinkedMap->find(baseClassName));
+ if (baseClass==0) // not found (or alias)
{
- baseClass=createClassDef(root->fileName,root->startLine,root->startColumn,
+ baseClass= toClassDefMutable(
+ Doxygen::hiddenClassLinkedMap->add(baseClassName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(root->fileName,root->startLine,root->startColumn,
baseClassName,
- ClassDef::Class);
- Doxygen::hiddenClasses->append(baseClassName,baseClass);
- if (isArtificial) baseClass->setArtificial(TRUE);
- baseClass->setLanguage(root->lang);
+ ClassDef::Class))));
+ if (baseClass) // really added (not alias)
+ {
+ if (isArtificial) baseClass->setArtificial(TRUE);
+ baseClass->setLanguage(root->lang);
+ }
}
}
else
{
- baseClass=Doxygen::classSDict->find(baseClassName);
+ baseClass = toClassDefMutable(Doxygen::classLinkedMap->find(baseClassName));
//printf("*** classDDict->find(%s)=%p biName=%s templSpec=%s\n",
// baseClassName.data(),baseClass,biName.data(),templSpec.data());
- if (baseClass==0)
+ if (baseClass==0) // not found (or alias)
{
- baseClass=createClassDef(root->fileName,root->startLine,root->startColumn,
- baseClassName,
- ClassDef::Class);
- Doxygen::classSDict->append(baseClassName,baseClass);
- if (isArtificial) baseClass->setArtificial(TRUE);
- baseClass->setLanguage(root->lang);
- int si = baseClassName.findRev("::");
- if (si!=-1) // class is nested
+ baseClass = toClassDefMutable(
+ Doxygen::classLinkedMap->add(baseClassName,
+ std::unique_ptr<ClassDef>(
+ createClassDef(root->fileName,root->startLine,root->startColumn,
+ baseClassName,
+ ClassDef::Class))));
+ if (baseClass) // really added (not alias)
{
- Definition *sd = findScopeFromQualifiedName(Doxygen::globalScope,baseClassName.left(si),0,root->tagInfo());
- if (sd==0 || sd==Doxygen::globalScope) // outer scope not found
+ if (isArtificial) baseClass->setArtificial(TRUE);
+ baseClass->setLanguage(root->lang);
+ si = baseClassName.findRev("::");
+ if (si!=-1) // class is nested
{
- baseClass->setArtificial(TRUE); // see bug678139
+ Definition *sd = findScopeFromQualifiedName(Doxygen::globalScope,baseClassName.left(si),0,root->tagInfo());
+ if (sd==0 || sd==Doxygen::globalScope) // outer scope not found
+ {
+ baseClass->setArtificial(TRUE); // see bug678139
+ }
}
}
}
}
- if (biName.right(2)=="-p")
+ if (baseClass)
{
- biName="<"+biName.left(biName.length()-2)+">";
+ if (biName.right(2)=="-p")
+ {
+ biName="<"+biName.left(biName.length()-2)+">";
+ }
+ // add base class to this class
+ cd->insertBaseClass(baseClass,biName,bi->prot,bi->virt,templSpec);
+ // add this class as super class to the base class
+ baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
+ // the undocumented base was found in this file
+ baseClass->insertUsedFile(root->fileDef());
+
+ Definition *scope = buildScopeFromQualifiedName(baseClass->name(),root->lang,0);
+ if (scope!=baseClass)
+ {
+ baseClass->setOuterScope(scope);
+ }
+
+ if (baseClassName.right(2)=="-p")
+ {
+ baseClass->setCompoundType(ClassDef::Protocol);
+ }
+ return TRUE;
}
- // add base class to this class
- cd->insertBaseClass(baseClass,biName,bi->prot,bi->virt,templSpec);
- // add this class as super class to the base class
- baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
- // the undocumented base was found in this file
- baseClass->insertUsedFile(root->fileDef());
- baseClass->setOuterScope(Doxygen::globalScope);
- if (baseClassName.right(2)=="-p")
+ else
{
- baseClass->setCompoundType(ClassDef::Protocol);
+ Debug::print(Debug::Classes,0," Base class '%s' not created (alias?)\n",qPrint(biName));
}
- return TRUE;
}
else
{
@@ -4709,7 +4735,7 @@ static void findClassEntries(const Entry *root)
{
if (isClassSection(root))
{
- g_classEntries.insert({root->name.data(),root});
+ g_classEntries.insert({root->name.str(),root});
}
for (const auto &e : root->children()) findClassEntries(e.get());
}
@@ -4737,8 +4763,7 @@ static QCString extractClassName(const Entry *root)
*/
static void findInheritedTemplateInstances()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- for (cli.toFirst();cli.current();++cli) cli.current()->setVisited(FALSE);
+ ClassDefSet visitedClasses;
for (const auto &kv : g_classEntries)
{
const Entry *root = kv.second;
@@ -4747,16 +4772,18 @@ static void findInheritedTemplateInstances()
Debug::print(Debug::Classes,0," Inheritance: Class %s : \n",qPrint(bName));
if ((cd=getClass(bName)))
{
- //printf("Class %s %d\n",cd->name().data(),root->extends->count());
- findBaseClassesForClass(root,cd,cd,cd,TemplateInstances,FALSE);
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm)
+ {
+ //printf("Class %s %zu\n",cd->name().data(),root->extends.size());
+ findBaseClassesForClass(root,cd,cdm,cdm,TemplateInstances,FALSE);
+ }
}
}
}
static void findUsedTemplateInstances()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- for (cli.toFirst();cli.current();++cli) cli.current()->setVisited(FALSE);
for (const auto &kv : g_classEntries)
{
const Entry *root = kv.second;
@@ -4765,28 +4792,30 @@ static void findUsedTemplateInstances()
Debug::print(Debug::Classes,0," Usage: Class %s : \n",qPrint(bName));
if ((cd=getClass(bName)))
{
- findUsedClassesForClass(root,cd,cd,cd,TRUE);
- cd->addTypeConstraints();
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm)
+ {
+ findUsedClassesForClass(root,cd,cdm,cdm,TRUE);
+ cdm->addTypeConstraints();
+ }
}
}
}
static void computeClassRelations()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- for (cli.toFirst();cli.current();++cli) cli.current()->setVisited(FALSE);
for (const auto &kv : g_classEntries)
{
const Entry *root = kv.second;
- ClassDef *cd;
+ ClassDefMutable *cd;
QCString bName = extractClassName(root);
Debug::print(Debug::Classes,0," Relations: Class %s : \n",qPrint(bName));
- if ((cd=getClass(bName)))
+ if ((cd=getClassMutable(bName)))
{
findBaseClassesForClass(root,cd,cd,cd,DocumentedOnly,FALSE);
}
- int numMembers = cd && cd->memberNameInfoSDict() ? cd->memberNameInfoSDict()->count() : 0;
+ size_t numMembers = cd ? cd->memberNameInfoLinkedMap().size() : 0;
if ((cd==0 || (!cd->hasDocumentation() && !cd->isReference())) && numMembers>0 &&
bName.right(2)!="::")
{
@@ -4812,66 +4841,69 @@ static void computeTemplateClassRelations()
const Entry *root = kv.second;
QCString bName=stripAnonymousNamespaceScope(root->name);
bName=stripTemplateSpecifiersFromScope(bName);
- ClassDef *cd=getClass(bName);
+ ClassDefMutable *cd=getClassMutable(bName);
// strip any anonymous scopes first
QDict<ClassDef> *templInstances = 0;
if (cd && (templInstances=cd->getTemplateInstances()))
{
Debug::print(Debug::Classes,0," Template class %s : \n",qPrint(cd->name()));
QDictIterator<ClassDef> tdi(*templInstances);
- ClassDef *tcd;
- for (tdi.toFirst();(tcd=tdi.current());++tdi) // for each template instance
- {
- Debug::print(Debug::Classes,0," Template instance %s : \n",qPrint(tcd->name()));
- QCString templSpec = tdi.currentKey();
- ArgumentList templArgs;
- stringToArgumentList(tcd->getLanguage(),templSpec,templArgs);
- for (const BaseInfo &bi : root->extends)
- {
- // check if the base class is a template argument
- BaseInfo tbi = bi;
- const ArgumentList &tl = cd->templateArguments();
- if (!tl.empty())
+ ClassDef *itcd;
+ for (tdi.toFirst();(itcd=tdi.current());++tdi) // for each template instance
+ {
+ ClassDefMutable *tcd=toClassDefMutable(itcd);
+ if (tcd)
+ {
+ Debug::print(Debug::Classes,0," Template instance %s : \n",qPrint(tcd->name()));
+ QCString templSpec = tdi.currentKey();
+ std::unique_ptr<ArgumentList> templArgs = stringToArgumentList(tcd->getLanguage(),templSpec);
+ for (const BaseInfo &bi : root->extends)
{
- QDict<int> *baseClassNames = tcd->getTemplateBaseClassNames();
- QDict<int> *templateNames = getTemplateArgumentsInName(tl,bi.name);
- // for each template name that we inherit from we need to
- // substitute the formal with the actual arguments
- QDict<int> *actualTemplateNames = new QDict<int>(17);
- actualTemplateNames->setAutoDelete(TRUE);
- QDictIterator<int> qdi(*templateNames);
- for (qdi.toFirst();qdi.current();++qdi)
+ // check if the base class is a template argument
+ BaseInfo tbi = bi;
+ const ArgumentList &tl = cd->templateArguments();
+ if (!tl.empty())
{
- int templIndex = *qdi.current();
- Argument actArg;
- bool hasActArg=FALSE;
- if (templIndex<(int)templArgs.size())
+ QDict<int> *baseClassNames = tcd->getTemplateBaseClassNames();
+ QDict<int> *templateNames = getTemplateArgumentsInName(tl,bi.name);
+ // for each template name that we inherit from we need to
+ // substitute the formal with the actual arguments
+ QDict<int> *actualTemplateNames = new QDict<int>(17);
+ actualTemplateNames->setAutoDelete(TRUE);
+ QDictIterator<int> qdi(*templateNames);
+ for (qdi.toFirst();qdi.current();++qdi)
{
- actArg=templArgs.at(templIndex);
- hasActArg=TRUE;
+ int templIndex = *qdi.current();
+ Argument actArg;
+ bool hasActArg=FALSE;
+ if (templIndex<(int)templArgs->size())
+ {
+ actArg=templArgs->at(templIndex);
+ hasActArg=TRUE;
+ }
+ if (hasActArg &&
+ baseClassNames!=0 &&
+ baseClassNames->find(actArg.type)!=0 &&
+ actualTemplateNames->find(actArg.type)==0
+ )
+ {
+ actualTemplateNames->insert(actArg.type,new int(templIndex));
+ }
}
- if (hasActArg &&
- baseClassNames!=0 &&
- baseClassNames->find(actArg.type)!=0 &&
- actualTemplateNames->find(actArg.type)==0
- )
+ delete templateNames;
+
+ tbi.name = substituteTemplateArgumentsInString(bi.name,tl,templArgs);
+ // find a documented base class in the correct scope
+ if (!findClassRelation(root,cd,tcd,&tbi,actualTemplateNames,DocumentedOnly,FALSE))
{
- actualTemplateNames->insert(actArg.type,new int(templIndex));
+ // no documented base class -> try to find an undocumented one
+ findClassRelation(root,cd,tcd,&tbi,actualTemplateNames,Undocumented,TRUE);
}
+ delete actualTemplateNames;
}
- delete templateNames;
-
- tbi.name = substituteTemplateArgumentsInString(bi.name,tl,templArgs);
- // find a documented base class in the correct scope
- if (!findClassRelation(root,cd,tcd,&tbi,actualTemplateNames,DocumentedOnly,FALSE))
- {
- // no documented base class -> try to find an undocumented one
- findClassRelation(root,cd,tcd,&tbi,actualTemplateNames,Undocumented,TRUE);
- }
- delete actualTemplateNames;
}
}
- } // class has no base classes
+ }
}
}
}
@@ -4881,32 +4913,30 @@ static void computeTemplateClassRelations()
static void computeMemberReferences()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- cd->computeAnchors();
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
+ {
+ cdm->computeAnchors();
+ }
}
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
fd->computeAnchors();
}
}
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd=0;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- nd->computeAnchors();
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm)
+ {
+ ndm->computeAnchors();
+ }
}
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
gd->computeAnchors();
}
@@ -4916,48 +4946,38 @@ static void computeMemberReferences()
static void addListReferences()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- if (!cd->isAlias())
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
{
- cd->addListReferences();
+ cdm->addListReferences();
}
}
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
fd->addListReferences();
}
}
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd=0;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- if (!nd->isAlias())
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm)
{
- nd->addListReferences();
+ ndm->addListReferences();
}
}
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
gd->addListReferences();
}
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
QCString name = pd->getOutputFileBase();
if (pd->getGroupDef())
@@ -4965,7 +4985,7 @@ static void addListReferences()
name = pd->getGroupDef()->getOutputFileBase();
}
{
- const std::vector<ListItemInfo> &xrefItems = pd->xrefListItems();
+ const RefItemVector &xrefItems = pd->xrefListItems();
addRefItem(xrefItems,
name,
theTranslator->trPage(TRUE,TRUE),
@@ -4973,16 +4993,14 @@ static void addListReferences()
}
}
- DirSDict::Iterator ddi(*Doxygen::directories);
- DirDef *dd = 0;
- for (ddi.toFirst();(dd=ddi.current());++ddi)
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
QCString name = dd->getOutputFileBase();
//if (dd->getGroupDef())
//{
// name = dd->getGroupDef()->getOutputFileBase();
//}
- const std::vector<ListItemInfo> &xrefItems = dd->xrefListItems();
+ const RefItemVector &xrefItems = dd->xrefListItems();
addRefItem(xrefItems,
name,
theTranslator->trDir(TRUE,TRUE),
@@ -4994,9 +5012,7 @@ static void addListReferences()
static void generateXRefPages()
{
- QDictIterator<RefList> di(*Doxygen::xrefLists);
- RefList *rl;
- for (di.toFirst();(rl=di.current());++di)
+ for (RefListManager::Ptr &rl : RefListManager::instance())
{
rl->generatePage();
}
@@ -5008,12 +5024,13 @@ static void generateXRefPages()
// over_load is set the standard overload text is added.
static void addMemberDocs(const Entry *root,
- MemberDef *md, const char *funcDecl,
+ MemberDefMutable *md, const char *funcDecl,
const ArgumentList *al,
bool over_load,
uint64 spec
)
{
+ if (md==0) return;
//printf("addMemberDocs: '%s'::'%s' '%s' funcDecl='%s' mSpec=%lld\n",
// root->parent()->name.data(),md->name().data(),md->argsString(),funcDecl,spec);
QCString fDecl=funcDecl;
@@ -5024,7 +5041,7 @@ static void addMemberDocs(const Entry *root,
md->enableCallerGraph(root->callerGraph);
md->enableReferencedByRelation(root->referencedByRelation);
md->enableReferencesRelation(root->referencesRelation);
- ClassDef *cd=md->getClassDef();
+ ClassDefMutable *cd=md->getClassDefMutable();
const NamespaceDef *nd=md->getNamespaceDef();
QCString fullName;
if (cd)
@@ -5039,25 +5056,25 @@ static void addMemberDocs(const Entry *root,
// TODO determine scope based on root not md
Definition *rscope = md->getOuterScope();
- ArgumentList &mdAl = md->argumentList();
+ const ArgumentList &mdAl = md->argumentList();
if (al)
{
ArgumentList mergedAl = *al;
//printf("merging arguments (1) docs=%d\n",root->doc.isEmpty());
- mergeArguments(mdAl,mergedAl,!root->doc.isEmpty());
+ mergeArguments(const_cast<ArgumentList&>(mdAl),mergedAl,!root->doc.isEmpty());
}
else
{
if (
- matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl,
- rscope,rfd,root->argList,
+ matchArguments2( md->getOuterScope(), md->getFileDef(),const_cast<ArgumentList*>(&mdAl),
+ rscope,rfd,&root->argList,
TRUE
)
)
{
//printf("merging arguments (2)\n");
ArgumentList mergedArgList = root->argList;
- mergeArguments(mdAl,mergedArgList,!root->doc.isEmpty());
+ mergeArguments(const_cast<ArgumentList&>(mdAl),mergedArgList,!root->doc.isEmpty());
}
}
if (over_load) // the \overload keyword was used
@@ -5109,7 +5126,7 @@ static void addMemberDocs(const Entry *root,
)
{
//printf("Setting new body segment [%d,%d]\n",root->bodyLine,root->endBodyLine);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setBodyDef(rfd);
}
@@ -5155,7 +5172,8 @@ static void addMemberDocs(const Entry *root,
static const ClassDef *findClassDefinition(FileDef *fd,NamespaceDef *nd,
const char *scopeName)
{
- const ClassDef *tcd = getResolvedClass(nd,fd,scopeName,0,0,TRUE,TRUE);
+ SymbolResolver resolver(fd);
+ const ClassDef *tcd = resolver.resolveClass(nd,scopeName,true,true);
return tcd;
}
@@ -5180,42 +5198,84 @@ static bool findGlobalMember(const Entry *root,
QCString n=name;
if (n.isEmpty()) return FALSE;
if (n.find("::")!=-1) return FALSE; // skip undefined class members
- MemberName *mn=Doxygen::functionNameSDict->find(n+tempArg); // look in function dictionary
+ MemberName *mn=Doxygen::functionNameLinkedMap->find(n+tempArg); // look in function dictionary
if (mn==0)
{
- mn=Doxygen::functionNameSDict->find(n); // try without template arguments
+ mn=Doxygen::functionNameLinkedMap->find(n); // try without template arguments
}
if (mn) // function name defined
{
Debug::print(Debug::FindMembers,0,"3. Found symbol scope\n");
//int count=0;
- MemberNameIterator mni(*mn);
- MemberDef *md;
bool found=FALSE;
- for (mni.toFirst();(md=mni.current()) && !found;++mni)
+ for (const auto &md : *mn)
{
const NamespaceDef *nd=0;
if (md->isAlias() && md->getOuterScope() &&
md->getOuterScope()->definitionType()==Definition::TypeNamespace)
{
- nd = dynamic_cast<const NamespaceDef *>(md->getOuterScope());
+ nd = toNamespaceDef(md->getOuterScope());
}
else
{
nd = md->getNamespaceDef();
}
- //const Definition *scope=md->getOuterScope();
- //md = md->resolveAlias();
+
+ // special case for strong enums
+ int enumNamePos=0;
+ if (nd && md->isEnumValue() && (enumNamePos=namespaceName.findRev("::"))!=-1)
+ { // md part of a strong enum in a namespace?
+ QCString enumName = namespaceName.mid(enumNamePos+2);
+ if (namespaceName.left(enumNamePos)==nd->name())
+ {
+ MemberName *enumMn=Doxygen::functionNameLinkedMap->find(enumName);
+ if (enumMn)
+ {
+ for (const auto &emd : *enumMn)
+ {
+ found = emd->isStrong() && md->getEnumScope()==emd.get();
+ if (found)
+ {
+ addMemberDocs(root,toMemberDefMutable(md->resolveAlias()),decl,0,FALSE,root->spec);
+ break;
+ }
+ }
+ }
+ }
+ if (found)
+ {
+ break;
+ }
+ }
+ else if (nd==0 && md->isEnumValue()) // md part of global strong enum?
+ {
+ MemberName *enumMn=Doxygen::functionNameLinkedMap->find(namespaceName);
+ if (enumMn)
+ {
+ for (const auto &emd : *enumMn)
+ {
+ found = emd->isStrong() && md->getEnumScope()==emd.get();
+ if (found)
+ {
+ addMemberDocs(root,toMemberDefMutable(md->resolveAlias()),decl,0,FALSE,root->spec);
+ break;
+ }
+ }
+ }
+ }
const FileDef *fd=root->fileDef();
//printf("File %s\n",fd ? fd->name().data() : "<none>");
- NamespaceSDict *nl = fd ? fd->getUsedNamespaces() : 0;
- //SDict<Definition> *cl = fd ? fd->getUsedClasses() : 0;
+ LinkedRefMap<const NamespaceDef> nl;
+ if (fd)
+ {
+ nl = fd->getUsedNamespaces();
+ }
//printf("NamespaceList %p\n",nl);
// search in the list of namespaces that are imported via a
// using declaration
- bool viaUsingDirective = nl && nd && nl->find(nd->qualifiedName())!=0;
+ bool viaUsingDirective = nd && nl.find(nd->qualifiedName())!=0;
if ((namespaceName.isEmpty() && nd==0) || // not in a namespace
(nd && nd->name()==namespaceName) || // or in the same namespace
@@ -5226,14 +5286,14 @@ static bool findGlobalMember(const Entry *root,
qPrint(md->name()),qPrint(namespaceName));
NamespaceDef *rnd = 0;
- if (!namespaceName.isEmpty()) rnd = Doxygen::namespaceSDict->find(namespaceName);
+ if (!namespaceName.isEmpty()) rnd = Doxygen::namespaceLinkedMap->find(namespaceName);
- const ArgumentList &mdAl = const_cast<const MemberDef *>(md)->argumentList();
+ const ArgumentList &mdAl = const_cast<const MemberDef *>(md.get())->argumentList();
bool matching=
(mdAl.empty() && root->argList.empty()) ||
md->isVariable() || md->isTypedef() || /* in case of function pointers */
- matchArguments2(md->getOuterScope(),const_cast<const MemberDef *>(md)->getFileDef(),mdAl,
- rnd ? rnd : Doxygen::globalScope,fd,root->argList,
+ matchArguments2(md->getOuterScope(),const_cast<const MemberDef *>(md.get())->getFileDef(),&mdAl,
+ rnd ? rnd : Doxygen::globalScope,fd,&root->argList,
FALSE);
// for template members we need to check if the number of
@@ -5258,7 +5318,7 @@ static bool findGlobalMember(const Entry *root,
// put the comment block at the first syntactically matching member.
if (matching && md->isStatic() &&
md->getDefFileName()!=root->fileName &&
- mn->count()>1)
+ mn->size()>1)
{
matching = FALSE;
}
@@ -5279,8 +5339,9 @@ static bool findGlobalMember(const Entry *root,
if (matching) // add docs to the member
{
Debug::print(Debug::FindMembers,0,"5. Match found\n");
- addMemberDocs(root,md->resolveAlias(),decl,&root->argList,FALSE,root->spec);
+ addMemberDocs(root,toMemberDefMutable(md->resolveAlias()),decl,&root->argList,FALSE,root->spec);
found=TRUE;
+ break;
}
}
}
@@ -5290,10 +5351,10 @@ static bool findGlobalMember(const Entry *root,
if (!root->argList.empty()) fullFuncDecl+=argListToString(root->argList,TRUE);
QCString warnMsg =
QCString("no matching file member found for \n")+substitute(fullFuncDecl,"%","%%");
- if (mn->count()>0)
+ if (mn->size()>0)
{
warnMsg+="\nPossible candidates:\n";
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
warnMsg+=" '";
warnMsg+=substitute(md->declaration(),"%","%%");
@@ -5301,7 +5362,7 @@ static bool findGlobalMember(const Entry *root,
" of file "+md->getDefFileName()+"\n";
}
}
- warn(root->fileName,root->startLine,warnMsg);
+ warn(root->fileName,root->startLine, "%s", warnMsg.data());
}
}
else // got docs for an undefined member!
@@ -5323,8 +5384,8 @@ static bool findGlobalMember(const Entry *root,
}
static bool isSpecialization(
- const std::vector<ArgumentList> &srcTempArgLists,
- const std::vector<ArgumentList> &dstTempArgLists
+ const ArgumentLists &srcTempArgLists,
+ const ArgumentLists &dstTempArgLists
)
{
auto srcIt = srcTempArgLists.begin();
@@ -5343,15 +5404,15 @@ static bool scopeIsTemplate(const Definition *d)
bool result=FALSE;
if (d && d->definitionType()==Definition::TypeClass)
{
- result = !(dynamic_cast<const ClassDef*>(d))->templateArguments().empty() ||
+ result = !(toClassDef(d))->templateArguments().empty() ||
scopeIsTemplate(d->getOuterScope());
}
return result;
}
static QCString substituteTemplatesInString(
- const std::vector<ArgumentList> &srcTempArgLists,
- const std::vector<ArgumentList> &dstTempArgLists,
+ const ArgumentLists &srcTempArgLists,
+ const ArgumentLists &dstTempArgLists,
const QCString &src
)
{
@@ -5429,8 +5490,8 @@ static QCString substituteTemplatesInString(
}
static void substituteTemplatesInArgList(
- const std::vector<ArgumentList> &srcTempArgLists,
- const std::vector<ArgumentList> &dstTempArgLists,
+ const ArgumentLists &srcTempArgLists,
+ const ArgumentLists &dstTempArgLists,
const ArgumentList &src,
ArgumentList &dst
)
@@ -5456,18 +5517,548 @@ static void substituteTemplatesInArgList(
++dstIt;
}
}
- dst.constSpecifier = src.constSpecifier;
- dst.volatileSpecifier = src.volatileSpecifier;
- dst.pureSpecifier = src.pureSpecifier;
- dst.trailingReturnType = substituteTemplatesInString(
+ dst.setConstSpecifier(src.constSpecifier());
+ dst.setVolatileSpecifier(src.volatileSpecifier());
+ dst.setPureSpecifier(src.pureSpecifier());
+ dst.setTrailingReturnType(substituteTemplatesInString(
srcTempArgLists,dstTempArgLists,
- src.trailingReturnType);
+ src.trailingReturnType()));
//printf("substituteTemplatesInArgList: replacing %s with %s\n",
// argListToString(src).data(),argListToString(dst).data()
// );
}
+//-------------------------------------------------------------------------------------------
+
+static void addLocalObjCMethod(const Entry *root,
+ const QCString &scopeName,
+ const QCString &funcType,const QCString &funcName,const QCString &funcArgs,
+ const QCString &exceptions,const QCString &funcDecl,
+ uint64 spec)
+{
+ //printf("scopeName='%s' className='%s'\n",scopeName.data(),className.data());
+ ClassDefMutable *cd=0;
+ if (Config_getBool(EXTRACT_LOCAL_METHODS) && (cd=getClassMutable(scopeName)))
+ {
+ Debug::print(Debug::FindMembers,0,"4. Local objective C method %s\n"
+ " scopeName=%s\n",qPrint(root->name),qPrint(scopeName));
+ //printf("Local objective C method '%s' of class '%s' found\n",root->name.data(),cd->name().data());
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
+ root->fileName,root->startLine,root->startColumn,
+ funcType,funcName,funcArgs,exceptions,
+ root->protection,root->virt,root->stat,Member,
+ MemberType_Function,ArgumentList(),root->argList,root->metaData) };
+ md->setTagInfo(root->tagInfo());
+ md->setLanguage(root->lang);
+ md->setId(root->id);
+ md->makeImplementationDetail();
+ md->setMemberClass(cd);
+ md->setDefinition(funcDecl);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setPrototype(root->proto,root->fileName,root->startLine,root->startColumn);
+ md->addSectionsToDefinition(root->anchors);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
+ FileDef *fd=root->fileDef();
+ md->setBodyDef(fd);
+ md->setMemberSpecifiers(spec);
+ md->setMemberGroupId(root->mGrpId);
+ cd->insertMember(md.get());
+ cd->insertUsedFile(fd);
+ md->setRefItems(root->sli);
+
+ MemberName *mn = Doxygen::memberNameLinkedMap->add(root->name);
+ mn->push_back(std::move(md));
+ }
+ else
+ {
+ // local objective C method found for class without interface
+ }
+}
+
+//-------------------------------------------------------------------------------------------
+static void addMemberFunction(const Entry *root,
+ MemberName *mn,
+ const QCString &scopeName,
+ const QCString &namespaceName,
+ const QCString &className,
+ const QCString &funcTyp,
+ const QCString &funcName,
+ const QCString &funcArgs,
+ const QCString &funcTempList,
+ const QCString &exceptions,
+ const QCString &type,
+ const QCString &args,
+ bool isFriend,
+ uint64 spec,
+ const QCString &relates,
+ const QCString &funcDecl,
+ bool overloaded,
+ bool isFunc)
+{
+ QCString funcType = funcTyp;
+ int count=0;
+ int noMatchCount=0;
+ bool memFound=FALSE;
+ for (const auto &imd : *mn)
+ {
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md==0) continue;
+ ClassDefMutable *cd=md->getClassDefMutable();
+ if (cd==0) continue;
+ Debug::print(Debug::FindMembers,0,
+ "3. member definition found, "
+ "scope needed='%s' scope='%s' args='%s' fileName=%s\n",
+ qPrint(scopeName),cd ? qPrint(cd->name()) : "<none>",
+ qPrint(md->argsString()),
+ qPrint(root->fileName));
+ //printf("Member %s (member scopeName=%s) (this scopeName=%s) isEnumValue()=%d\n",
+ // md->name().data(),cd->name().data(),scopeName.data(),md->isEnumValue());
+ FileDef *fd=root->fileDef();
+ NamespaceDef *nd=0;
+ if (!namespaceName.isEmpty()) nd=getResolvedNamespace(namespaceName);
+
+ //printf("scopeName %s->%s\n",scopeName.data(),
+ // stripTemplateSpecifiersFromScope(scopeName,FALSE).data());
+
+ // if the member we are searching for is an enum value that is part of
+ // a "strong" enum, we need to look into the fields of the enum for a match
+ int enumNamePos=0;
+ if (md->isEnumValue() && (enumNamePos=className.findRev("::"))!=-1)
+ {
+ QCString enumName = className.mid(enumNamePos+2);
+ if (className.left(enumNamePos)==cd->name())
+ {
+ MemberName *enumMn=Doxygen::memberNameLinkedMap->find(enumName);
+ //printf("enumMn(%s)=%p\n",className.data(),enumMn);
+ if (enumMn)
+ {
+ for (const auto &emd : *enumMn)
+ {
+ memFound = emd->isStrong() && md->getEnumScope()==emd.get();
+ if (memFound)
+ {
+ addMemberDocs(root,md,funcDecl,0,overloaded,spec);
+ count++;
+ }
+ if (memFound) break;
+ }
+ }
+ }
+ }
+ if (memFound) break;
+
+ const ClassDef *tcd=findClassDefinition(fd,nd,scopeName);
+ if (tcd==0 && cd && stripAnonymousNamespaceScope(cd->name())==scopeName)
+ {
+ // don't be fooled by anonymous scopes
+ tcd=cd;
+ }
+ //printf("Looking for %s inside nd=%s result=%p (%s) cd=%p\n",
+ // scopeName.data(),nd?nd->name().data():"<none>",tcd,tcd?tcd->name().data():"",cd);
+
+ if (cd && tcd==cd) // member's classes match
+ {
+ Debug::print(Debug::FindMembers,0,
+ "4. class definition %s found\n",cd->name().data());
+
+ // get the template parameter lists found at the member declaration
+ ArgumentLists declTemplArgs = cd->getTemplateParameterLists();
+ const ArgumentList &templAl = md->templateArguments();
+ if (!templAl.empty())
+ {
+ declTemplArgs.push_back(templAl);
+ }
+
+ // get the template parameter lists found at the member definition
+ const ArgumentLists &defTemplArgs = root->tArgLists;
+ //printf("defTemplArgs=%p\n",defTemplArgs);
+
+ // do we replace the decl argument lists with the def argument lists?
+ bool substDone=FALSE;
+ ArgumentList argList;
+
+ /* substitute the occurrences of class template names in the
+ * argument list before matching
+ */
+ const ArgumentList &mdAl = md->argumentList();
+ if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
+ {
+ /* the function definition has template arguments
+ * and the class definition also has template arguments, so
+ * we must substitute the template names of the class by that
+ * of the function definition before matching.
+ */
+ substituteTemplatesInArgList(declTemplArgs,defTemplArgs,mdAl,argList);
+
+ substDone=TRUE;
+ }
+ else /* no template arguments, compare argument lists directly */
+ {
+ argList = mdAl;
+ }
+
+ Debug::print(Debug::FindMembers,0,
+ "5. matching '%s'<=>'%s' className=%s namespaceName=%s\n",
+ qPrint(argListToString(argList,TRUE)),qPrint(argListToString(root->argList,TRUE)),
+ qPrint(className),qPrint(namespaceName)
+ );
+
+ bool matching=
+ md->isVariable() || md->isTypedef() || // needed for function pointers
+ matchArguments2(
+ md->getClassDef(),md->getFileDef(),&argList,
+ cd,fd,&root->argList,
+ TRUE);
+
+ if (md->getLanguage()==SrcLangExt_ObjC && md->isVariable() && (root->section&Entry::FUNCTION_SEC))
+ {
+ matching = FALSE; // don't match methods and attributes with the same name
+ }
+
+ // for template member we also need to check the return type
+ if (!md->templateArguments().empty() && !root->tArgLists.empty())
+ {
+ QCString memType = md->typeString();
+ memType.stripPrefix("static "); // see bug700696
+ funcType=substitute(stripTemplateSpecifiersFromScope(funcType,TRUE),
+ className+"::",""); // see bug700693 & bug732594
+ memType=substitute(stripTemplateSpecifiersFromScope(memType,TRUE),
+ className+"::",""); // see bug758900
+ Debug::print(Debug::FindMembers,0,
+ "5b. Comparing return types '%s'<->'%s' #args %d<->%d\n",
+ qPrint(md->typeString()),qPrint(funcType),
+ md->templateArguments().size(),root->tArgLists.back().size());
+ if (md->templateArguments().size()!=root->tArgLists.back().size() ||
+ qstrcmp(memType,funcType))
+ {
+ //printf(" ---> no matching\n");
+ matching = FALSE;
+ }
+ }
+ bool rootIsUserDoc = (root->section&Entry::MEMBERDOC_SEC)!=0;
+ bool classIsTemplate = scopeIsTemplate(md->getClassDef());
+ bool mdIsTemplate = md->templateArguments().hasParameters();
+ bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
+ bool rootIsTemplate = !root->tArgLists.empty();
+ //printf("classIsTemplate=%d mdIsTemplate=%d rootIsTemplate=%d\n",classIsTemplate,mdIsTemplate,rootIsTemplate);
+ if (!rootIsUserDoc && // don't check out-of-line @fn references, see bug722457
+ (mdIsTemplate || rootIsTemplate) && // either md or root is a template
+ ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
+ )
+ {
+ // Method with template return type does not match method without return type
+ // even if the parameters are the same. See also bug709052
+ Debug::print(Debug::FindMembers,0,
+ "5b. Comparing return types: template v.s. non-template\n");
+ matching = FALSE;
+ }
+
+
+ Debug::print(Debug::FindMembers,0,
+ "6. match results of matchArguments2 = %d substDone=%d\n",matching,substDone);
+
+ if (substDone) // found a new argument list
+ {
+ if (matching) // replace member's argument list
+ {
+ md->setDefinitionTemplateParameterLists(root->tArgLists);
+ md->moveArgumentList(std::make_unique<ArgumentList>(argList));
+ }
+ else // no match
+ {
+ if (!funcTempList.isEmpty() &&
+ isSpecialization(declTemplArgs,defTemplArgs))
+ {
+ // check if we are dealing with a partial template
+ // specialization. In this case we add it to the class
+ // even though the member arguments do not match.
+
+ addMethodToClass(root,cd,type,md->name(),args,isFriend,
+ md->protection(),md->isStatic(),md->virtualness(),spec,relates);
+ return;
+ }
+ }
+ }
+ if (matching)
+ {
+ addMemberDocs(root,md,funcDecl,0,overloaded,spec);
+ count++;
+ memFound=TRUE;
+ }
+ }
+ else if (cd && cd!=tcd) // we did find a class with the same name as cd
+ // but in a different namespace
+ {
+ noMatchCount++;
+ }
+
+ if (memFound) break;
+ }
+ if (count==0 && root->parent() &&
+ root->parent()->section==Entry::OBJCIMPL_SEC)
+ {
+ addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
+ return;
+ }
+ if (count==0 && !(isFriend && funcType=="class"))
+ {
+ int candidates=0;
+ const ClassDef *ecd = 0, *ucd = 0;
+ MemberDef *emd = 0, *umd = 0;
+ //printf("Assume template class\n");
+ for (const auto &md : *mn)
+ {
+ ClassDefMutable *ccd=md->getClassDefMutable();
+ MemberDef *cmd=md.get();
+ //printf("ccd->name()==%s className=%s\n",ccd->name().data(),className.data());
+ if (ccd!=0 && rightScopeMatch(ccd->name(),className))
+ {
+ const ArgumentList &templAl = md->templateArguments();
+ if (!root->tArgLists.empty() && !templAl.empty() &&
+ root->tArgLists.back().size()<=templAl.size())
+ {
+ Debug::print(Debug::FindMembers,0,"7. add template specialization\n");
+ addMethodToClass(root,ccd,type,md->name(),args,isFriend,
+ root->protection,root->stat,root->virt,spec,relates);
+ return;
+ }
+ if (md->argsString()==argListToString(root->argList,FALSE,FALSE))
+ { // exact argument list match -> remember
+ ucd = ecd = ccd;
+ umd = emd = cmd;
+ Debug::print(Debug::FindMembers,0,
+ "7. new candidate className=%s scope=%s args=%s exact match\n",
+ qPrint(className),qPrint(ccd->name()),qPrint(md->argsString()));
+ }
+ else // arguments do not match, but member name and scope do -> remember
+ {
+ ucd = ccd;
+ umd = cmd;
+ Debug::print(Debug::FindMembers,0,
+ "7. new candidate className=%s scope=%s args=%s no match\n",
+ qPrint(className),qPrint(ccd->name()),qPrint(md->argsString()));
+ }
+ candidates++;
+ }
+ }
+ static bool strictProtoMatching = Config_getBool(STRICT_PROTO_MATCHING);
+ if (!strictProtoMatching)
+ {
+ if (candidates==1 && ucd && umd)
+ {
+ // we didn't find an actual match on argument lists, but there is only 1 member with this
+ // name in the same scope, so that has to be the one.
+ addMemberDocs(root,toMemberDefMutable(umd),funcDecl,0,overloaded,spec);
+ return;
+ }
+ else if (candidates>1 && ecd && emd)
+ {
+ // we didn't find a unique match using type resolution,
+ // but one of the matches has the exact same signature so
+ // we take that one.
+ addMemberDocs(root,toMemberDefMutable(emd),funcDecl,0,overloaded,spec);
+ return;
+ }
+ }
+
+ QCString warnMsg = "no ";
+ if (noMatchCount>1) warnMsg+="uniquely ";
+ warnMsg+="matching class member found for \n";
+
+ for (const ArgumentList &al : root->tArgLists)
+ {
+ warnMsg+=" template ";
+ warnMsg+=tempArgListToString(al,root->lang);
+ warnMsg+='\n';
+ }
+
+ QCString fullFuncDecl=funcDecl.copy();
+ if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
+
+ warnMsg+=" ";
+ warnMsg+=fullFuncDecl;
+ warnMsg+='\n';
+
+ if (candidates>0)
+ {
+ warnMsg+="Possible candidates:\n";
+ for (const auto &md : *mn)
+ {
+ const ClassDef *cd=md->getClassDef();
+ if (cd!=0 && rightScopeMatch(cd->name(),className))
+ {
+ const ArgumentList &templAl = md->templateArguments();
+ warnMsg+=" '";
+ if (templAl.hasParameters())
+ {
+ warnMsg+="template ";
+ warnMsg+=tempArgListToString(templAl,root->lang);
+ warnMsg+='\n';
+ warnMsg+=" ";
+ }
+ if (md->typeString())
+ {
+ warnMsg+=md->typeString();
+ warnMsg+=' ';
+ }
+ QCString qScope = cd->qualifiedNameWithTemplateParameters();
+ if (!qScope.isEmpty())
+ warnMsg+=qScope+"::"+md->name();
+ if (md->argsString())
+ warnMsg+=md->argsString();
+ if (noMatchCount>1)
+ {
+ warnMsg+="' at line "+QCString().setNum(md->getDefLine()) +
+ " of file "+md->getDefFileName();
+ }
+ else
+ warnMsg += "'";
+
+ warnMsg+='\n';
+ }
+ }
+ }
+ warn_simple(root->fileName,root->startLine,warnMsg);
+ }
+}
+
+//-------------------------------------------------------------------------------------------
+
+static void addMemberSpecialization(const Entry *root,
+ MemberName *mn,
+ ClassDefMutable *cd,
+ const QCString &funcType,
+ const QCString &funcName,
+ const QCString &funcArgs,
+ const QCString &funcDecl,
+ const QCString &exceptions,
+ uint64 spec
+ )
+{
+ MemberDef *declMd=0;
+ for (const auto &md : *mn)
+ {
+ if (md->getClassDef()==cd)
+ {
+ // TODO: we should probably also check for matching arguments
+ declMd = md.get();
+ break;
+ }
+ }
+ MemberType mtype=MemberType_Function;
+ ArgumentList tArgList;
+ // getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
+ root->fileName,root->startLine,root->startColumn,
+ funcType,funcName,funcArgs,exceptions,
+ declMd ? declMd->protection() : root->protection,
+ root->virt,root->stat,Member,
+ mtype,tArgList,root->argList,root->metaData) };
+ //printf("new specialized member %s args='%s'\n",md->name().data(),funcArgs.data());
+ md->setTagInfo(root->tagInfo());
+ md->setLanguage(root->lang);
+ md->setId(root->id);
+ md->setMemberClass(cd);
+ md->setTemplateSpecialization(TRUE);
+ md->setTypeConstraints(root->typeConstr);
+ md->setDefinition(funcDecl);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setPrototype(root->proto,root->fileName,root->startLine,root->startColumn);
+ md->addSectionsToDefinition(root->anchors);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
+ FileDef *fd=root->fileDef();
+ md->setBodyDef(fd);
+ md->setMemberSpecifiers(spec);
+ md->setMemberGroupId(root->mGrpId);
+ cd->insertMember(md.get());
+ md->setRefItems(root->sli);
+
+ mn->push_back(std::move(md));
+}
+
+//-------------------------------------------------------------------------------------------
+
+static void addOverloaded(const Entry *root,MemberName *mn,
+ const QCString &funcType,const QCString &funcName,const QCString &funcArgs,
+ const QCString &funcDecl,const QCString &exceptions,uint64 spec)
+{
+ // for unique overloaded member we allow the class to be
+ // omitted, this is to be Qt compatible. Using this should
+ // however be avoided, because it is error prone
+ bool sameClass=false;
+ if (mn->size()>0)
+ {
+ // check if all members with the same name are also in the same class
+ sameClass = std::equal(mn->begin()+1,mn->end(),mn->begin(),
+ [](const auto &md1,const auto &md2)
+ { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
+ }
+ if (sameClass)
+ {
+ ClassDefMutable *cd = mn->front()->getClassDefMutable();
+ MemberType mtype;
+ if (root->mtype==Signal) mtype=MemberType_Signal;
+ else if (root->mtype==Slot) mtype=MemberType_Slot;
+ else if (root->mtype==DCOP) mtype=MemberType_DCOP;
+ else mtype=MemberType_Function;
+
+ // new overloaded member function
+ std::unique_ptr<ArgumentList> tArgList =
+ getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
+ //printf("new related member %s args='%s'\n",md->name().data(),funcArgs.data());
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
+ root->fileName,root->startLine,root->startColumn,
+ funcType,funcName,funcArgs,exceptions,
+ root->protection,root->virt,root->stat,Related,
+ mtype,tArgList ? *tArgList : ArgumentList(),root->argList,root->metaData) };
+ md->setTagInfo(root->tagInfo());
+ md->setLanguage(root->lang);
+ md->setId(root->id);
+ md->setTypeConstraints(root->typeConstr);
+ md->setMemberClass(cd);
+ md->setDefinition(funcDecl);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ md->enableReferencedByRelation(root->referencedByRelation);
+ md->enableReferencesRelation(root->referencesRelation);
+ QCString doc=getOverloadDocs();
+ doc+="<p>";
+ doc+=root->doc;
+ md->setDocumentation(doc,root->docFile,root->docLine);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setPrototype(root->proto,root->fileName,root->startLine,root->startColumn);
+ md->addSectionsToDefinition(root->anchors);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
+ FileDef *fd=root->fileDef();
+ md->setBodyDef(fd);
+ md->setMemberSpecifiers(spec);
+ md->setMemberGroupId(root->mGrpId);
+ cd->insertMember(md.get());
+ cd->insertUsedFile(fd);
+ md->setRefItems(root->sli);
+
+ mn->push_back(std::move(md));
+ }
+}
+
+//-------------------------------------------------------------------------------------------
/*! This function tries to find a member (in a documented class/file/namespace)
* that corresponds to the function/variable declaration given in \a funcDecl.
@@ -5609,7 +6200,7 @@ static void findMember(const Entry *root,
{
QCString joinedName = root->parent()->name+"::"+scopeName;
if (!scopeName.isEmpty() &&
- (getClass(joinedName) || Doxygen::namespaceSDict->find(joinedName)))
+ (getClass(joinedName) || Doxygen::namespaceLinkedMap->find(joinedName)))
{
scopeName = joinedName;
}
@@ -5623,20 +6214,13 @@ static void findMember(const Entry *root,
FileDef *fd=root->fileDef();
if (fd)
{
- NamespaceSDict *fnl = fd->getUsedNamespaces();
- if (fnl)
+ for (const auto &fnd : fd->getUsedNamespaces())
{
- QCString joinedName;
- NamespaceDef *fnd;
- NamespaceSDict::Iterator nsdi(*fnl);
- for (nsdi.toFirst();(fnd=nsdi.current());++nsdi)
+ QCString joinedName = fnd->name()+"::"+scopeName;
+ if (Doxygen::namespaceLinkedMap->find(joinedName))
{
- joinedName = fnd->name()+"::"+scopeName;
- if (Doxygen::namespaceSDict->find(joinedName))
- {
- scopeName=joinedName;
- break;
- }
+ scopeName=joinedName;
+ break;
}
}
}
@@ -5691,12 +6275,12 @@ static void findMember(const Entry *root,
//printf("new scope='%s'\n",scopeName.data());
QCString tempScopeName=scopeName;
- ClassDef *cd=getClass(scopeName);
+ ClassDefMutable *cd=getClassMutable(scopeName);
if (cd)
{
if (funcSpec.isEmpty())
{
- int argListIndex=0;
+ uint argListIndex=0;
tempScopeName=cd->qualifiedNameWithTemplateParameters(&root->tArgLists,&argListIndex);
}
else
@@ -5785,377 +6369,65 @@ static void findMember(const Entry *root,
isFunc
);
- MemberName *mn=0;
if (!funcName.isEmpty()) // function name is valid
{
Debug::print(Debug::FindMembers,0,
"1. funcName='%s'\n",funcName.data());
+
+ // check if 'className' is actually a scoped enum, in which case we need to
+ // process it as a global, see issue #6471
+ bool strongEnum = false;
+ MemberName *mn=0;
+ if (!className.isEmpty() && (mn=Doxygen::functionNameLinkedMap->find(className)))
+ {
+ for (const auto &imd : *mn)
+ {
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md && md->isEnumerate() && md->isStrong())
+ {
+ Debug::print(Debug::FindMembers,0,"%s is a strong enum!\n",qPrint(md->name()));
+ strongEnum = true;
+ // pass the scope name name as a 'namespace' to the findGlobalMember function
+ if (!namespaceName.isEmpty())
+ {
+ namespaceName+="::"+className;
+ }
+ else
+ {
+ namespaceName=className;
+ }
+ }
+ }
+ }
+
if (funcName.left(9)=="operator ") // strip class scope from cast operator
{
funcName = substitute(funcName,className+"::","");
}
+ mn = 0;
if (!funcTempList.isEmpty()) // try with member specialization
{
- mn=Doxygen::memberNameSDict->find(funcName+funcTempList);
+ mn=Doxygen::memberNameLinkedMap->find(funcName+funcTempList);
}
if (mn==0) // try without specialization
{
- mn=Doxygen::memberNameSDict->find(funcName);
+ mn=Doxygen::memberNameLinkedMap->find(funcName);
}
- if (!isRelated && mn) // function name already found
+ if (!isRelated && !strongEnum && mn) // function name already found
{
Debug::print(Debug::FindMembers,0,
- "2. member name exists (%d members with this name)\n",mn->count());
+ "2. member name exists (%d members with this name)\n",mn->size());
if (!className.isEmpty()) // class name is valid
{
if (funcSpec.isEmpty()) // not a member specialization
{
- int count=0;
- int noMatchCount=0;
- MemberNameIterator mni(*mn);
- MemberDef *md;
- bool memFound=FALSE;
- for (mni.toFirst();!memFound && (md=mni.current());++mni)
- {
- ClassDef *cd=md->getClassDef();
- Debug::print(Debug::FindMembers,0,
- "3. member definition found, "
- "scope needed='%s' scope='%s' args='%s' fileName=%s\n",
- qPrint(scopeName),cd ? qPrint(cd->name()) : "<none>",
- qPrint(md->argsString()),
- qPrint(root->fileName));
- //printf("Member %s (member scopeName=%s) (this scopeName=%s) classTempList=%s\n",md->name().data(),cd->name().data(),scopeName.data(),classTempList.data());
- FileDef *fd=root->fileDef();
- NamespaceDef *nd=0;
- if (!namespaceName.isEmpty()) nd=getResolvedNamespace(namespaceName);
-
- //printf("scopeName %s->%s\n",scopeName.data(),
- // stripTemplateSpecifiersFromScope(scopeName,FALSE).data());
-
- const ClassDef *tcd=findClassDefinition(fd,nd,scopeName);
- if (tcd==0 && cd && stripAnonymousNamespaceScope(cd->name())==scopeName)
- {
- // don't be fooled by anonymous scopes
- tcd=cd;
- }
- //printf("Looking for %s inside nd=%s result=%p (%s) cd=%p\n",
- // scopeName.data(),nd?nd->name().data():"<none>",tcd,tcd?tcd->name().data():"",cd);
-
- if (cd && tcd==cd) // member's classes match
- {
- Debug::print(Debug::FindMembers,0,
- "4. class definition %s found\n",cd->name().data());
-
- // get the template parameter lists found at the member declaration
- std::vector<ArgumentList> declTemplArgs = cd->getTemplateParameterLists();
- const ArgumentList &templAl = md->templateArguments();
- if (!templAl.empty())
- {
- declTemplArgs.push_back(templAl);
- }
-
- // get the template parameter lists found at the member definition
- const std::vector<ArgumentList> &defTemplArgs = root->tArgLists;
- //printf("defTemplArgs=%p\n",defTemplArgs);
-
- // do we replace the decl argument lists with the def argument lists?
- bool substDone=FALSE;
- ArgumentList argList;
-
- /* substitute the occurrences of class template names in the
- * argument list before matching
- */
- const ArgumentList &mdAl = md->argumentList();
- if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
- {
- /* the function definition has template arguments
- * and the class definition also has template arguments, so
- * we must substitute the template names of the class by that
- * of the function definition before matching.
- */
- substituteTemplatesInArgList(declTemplArgs,defTemplArgs,mdAl,argList);
-
- substDone=TRUE;
- }
- else /* no template arguments, compare argument lists directly */
- {
- argList = mdAl;
- }
-
- Debug::print(Debug::FindMembers,0,
- "5. matching '%s'<=>'%s' className=%s namespaceName=%s\n",
- qPrint(argListToString(argList,TRUE)),qPrint(argListToString(root->argList,TRUE)),
- qPrint(className),qPrint(namespaceName)
- );
-
- bool matching=
- md->isVariable() || md->isTypedef() || // needed for function pointers
- (mdAl.empty() && root->argList.empty()) ||
- matchArguments2(
- md->getClassDef(),md->getFileDef(),argList,
- cd,fd,root->argList,
- TRUE);
-
- if (md->getLanguage()==SrcLangExt_ObjC && md->isVariable() && (root->section&Entry::FUNCTION_SEC))
- {
- matching = FALSE; // don't match methods and attributes with the same name
- }
-
- // for template member we also need to check the return type
- if (!md->templateArguments().empty() && !root->tArgLists.empty())
- {
- QCString memType = md->typeString();
- memType.stripPrefix("static "); // see bug700696
- funcType=substitute(stripTemplateSpecifiersFromScope(funcType,TRUE),
- className+"::",""); // see bug700693 & bug732594
- memType=substitute(stripTemplateSpecifiersFromScope(memType,TRUE),
- className+"::",""); // see bug758900
- Debug::print(Debug::FindMembers,0,
- "5b. Comparing return types '%s'<->'%s' #args %d<->%d\n",
- qPrint(md->typeString()),qPrint(funcType),
- md->templateArguments().size(),root->tArgLists.back().size());
- if (md->templateArguments().size()!=root->tArgLists.back().size() ||
- qstrcmp(memType,funcType))
- {
- //printf(" ---> no matching\n");
- matching = FALSE;
- }
- }
- bool rootIsUserDoc = (root->section&Entry::MEMBERDOC_SEC)!=0;
- bool classIsTemplate = scopeIsTemplate(md->getClassDef());
- bool mdIsTemplate = md->templateArguments().hasParameters();
- bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
- bool rootIsTemplate = !root->tArgLists.empty();
- //printf("classIsTemplate=%d mdIsTemplate=%d rootIsTemplate=%d\n",classIsTemplate,mdIsTemplate,rootIsTemplate);
- if (!rootIsUserDoc && // don't check out-of-line @fn references, see bug722457
- (mdIsTemplate || rootIsTemplate) && // either md or root is a template
- ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
- )
- {
- // Method with template return type does not match method without return type
- // even if the parameters are the same. See also bug709052
- Debug::print(Debug::FindMembers,0,
- "5b. Comparing return types: template v.s. non-template\n");
- matching = FALSE;
- }
-
-
- Debug::print(Debug::FindMembers,0,
- "6. match results of matchArguments2 = %d substDone=%d\n",matching,substDone);
-
- if (substDone) // found a new argument list
- {
- if (matching) // replace member's argument list
- {
- md->setDefinitionTemplateParameterLists(root->tArgLists);
- md->setArgumentList(argList);
- }
- else // no match
- {
- if (!funcTempList.isEmpty() &&
- isSpecialization(declTemplArgs,defTemplArgs))
- {
- // check if we are dealing with a partial template
- // specialization. In this case we add it to the class
- // even though the member arguments do not match.
-
- addMethodToClass(root,cd,type,md->name(),args,isFriend,
- md->protection(),md->isStatic(),md->virtualness(),spec,relates);
- return;
- }
- }
- }
- if (matching)
- {
- addMemberDocs(root,md,funcDecl,0,overloaded,spec);
- count++;
- memFound=TRUE;
- }
- }
- else if (cd && cd!=tcd) // we did find a class with the same name as cd
- // but in a different namespace
- {
- noMatchCount++;
- }
- }
- if (count==0 && root->parent() &&
- root->parent()->section==Entry::OBJCIMPL_SEC)
- {
- goto localObjCMethod;
- }
- if (count==0 && !(isFriend && funcType=="class"))
- {
- int candidates=0;
- const ClassDef *ecd = 0, *ucd = 0;
- MemberDef *emd = 0, *umd = 0;
- if (mn->count()>0)
- {
- //printf("Assume template class\n");
- for (mni.toFirst();(md=mni.current());++mni)
- {
- ClassDef *ccd=md->getClassDef();
- MemberDef *cmd=md;
- //printf("ccd->name()==%s className=%s\n",ccd->name().data(),className.data());
- if (ccd!=0 && rightScopeMatch(ccd->name(),className))
- {
- const ArgumentList &templAl = md->templateArguments();
- if (!root->tArgLists.empty() && !templAl.empty() &&
- root->tArgLists.back().size()<=templAl.size())
- {
- Debug::print(Debug::FindMembers,0,"7. add template specialization\n");
- addMethodToClass(root,ccd,type,md->name(),args,isFriend,
- root->protection,root->stat,root->virt,spec,relates);
- return;
- }
- if (md->argsString()==argListToString(root->argList,TRUE,FALSE))
- { // exact argument list match -> remember
- ucd = ecd = ccd;
- umd = emd = cmd;
- Debug::print(Debug::FindMembers,0,
- "7. new candidate className=%s scope=%s args=%s exact match\n",
- qPrint(className),qPrint(ccd->name()),qPrint(md->argsString()));
- }
- else // arguments do not match, but member name and scope do -> remember
- {
- ucd = ccd;
- umd = cmd;
- Debug::print(Debug::FindMembers,0,
- "7. new candidate className=%s scope=%s args=%s no match\n",
- qPrint(className),qPrint(ccd->name()),qPrint(md->argsString()));
- }
- candidates++;
- }
- }
- }
- static bool strictProtoMatching = Config_getBool(STRICT_PROTO_MATCHING);
- if (!strictProtoMatching)
- {
- if (candidates==1 && ucd && umd)
- {
- // we didn't find an actual match on argument lists, but there is only 1 member with this
- // name in the same scope, so that has to be the one.
- addMemberDocs(root,umd,funcDecl,0,overloaded,spec);
- return;
- }
- else if (candidates>1 && ecd && emd)
- {
- // we didn't find a unique match using type resolution,
- // but one of the matches has the exact same signature so
- // we take that one.
- addMemberDocs(root,emd,funcDecl,0,overloaded,spec);
- return;
- }
- }
-
- QCString warnMsg = "no ";
- if (noMatchCount>1) warnMsg+="uniquely ";
- warnMsg+="matching class member found for \n";
-
- for (const ArgumentList &al : root->tArgLists)
- {
- warnMsg+=" template ";
- warnMsg+=tempArgListToString(al,root->lang);
- warnMsg+='\n';
- }
-
- QCString fullFuncDecl=funcDecl.copy();
- if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
-
- warnMsg+=" ";
- warnMsg+=fullFuncDecl;
- warnMsg+='\n';
-
- if (candidates>0)
- {
- warnMsg+="Possible candidates:\n";
- for (mni.toFirst();(md=mni.current());++mni)
- {
- const ClassDef *cd=md->getClassDef();
- if (cd!=0 && rightScopeMatch(cd->name(),className))
- {
- const ArgumentList &templAl = md->templateArguments();
- warnMsg+=" '";
- if (templAl.hasParameters())
- {
- warnMsg+="template ";
- warnMsg+=tempArgListToString(templAl,root->lang);
- warnMsg+='\n';
- warnMsg+=" ";
- }
- if (md->typeString())
- {
- warnMsg+=md->typeString();
- warnMsg+=' ';
- }
- QCString qScope = cd->qualifiedNameWithTemplateParameters();
- if (!qScope.isEmpty())
- warnMsg+=qScope+"::"+md->name();
- if (md->argsString())
- warnMsg+=md->argsString();
- if (noMatchCount>1)
- {
- warnMsg+="' at line "+QCString().setNum(md->getDefLine()) +
- " of file "+md->getDefFileName();
- }
- else
- warnMsg += "'";
-
- warnMsg+='\n';
- }
- }
- }
- warn_simple(root->fileName,root->startLine,warnMsg);
- }
+ addMemberFunction(root,mn,scopeName,namespaceName,className,funcType,funcName,
+ funcArgs,funcTempList,exceptions,
+ type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
}
else if (cd) // member specialization
{
- MemberNameIterator mni(*mn);
- MemberDef *declMd=0;
- MemberDef *md=0;
- for (mni.toFirst();(md=mni.current());++mni)
- {
- if (md->getClassDef()==cd)
- {
- // TODO: we should probably also check for matching arguments
- declMd = md;
- break;
- }
- }
- MemberType mtype=MemberType_Function;
- ArgumentList tArgList;
- // getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
- md=createMemberDef(
- root->fileName,root->startLine,root->startColumn,
- funcType,funcName,funcArgs,exceptions,
- declMd ? declMd->protection() : root->protection,
- root->virt,root->stat,Member,
- mtype,tArgList,root->argList,root->metaData);
- //printf("new specialized member %s args='%s'\n",md->name().data(),funcArgs.data());
- md->setTagInfo(root->tagInfo());
- md->setLanguage(root->lang);
- md->setId(root->id);
- md->setMemberClass(cd);
- md->setTemplateSpecialization(TRUE);
- md->setTypeConstraints(root->typeConstr);
- md->setDefinition(funcDecl);
- md->enableCallGraph(root->callGraph);
- md->enableCallerGraph(root->callerGraph);
- md->enableReferencedByRelation(root->referencedByRelation);
- md->enableReferencesRelation(root->referencesRelation);
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setDocsForDefinition(!root->proto);
- md->setPrototype(root->proto,root->fileName,root->startLine,root->startColumn);
- md->addSectionsToDefinition(root->anchors);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- FileDef *fd=root->fileDef();
- md->setBodyDef(fd);
- md->setMemberSpecifiers(spec);
- md->setMemberGroupId(root->mGrpId);
- mn->append(md);
- cd->insertMember(md);
- md->setRefItems(root->sli);
+ addMemberSpecialization(root,mn,cd,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
}
else
{
@@ -6165,68 +6437,7 @@ static void findMember(const Entry *root,
}
else if (overloaded) // check if the function belongs to only one class
{
- // for unique overloaded member we allow the class to be
- // omitted, this is to be Qt compatible. Using this should
- // however be avoided, because it is error prone
- MemberNameIterator mni(*mn);
- MemberDef *md=mni.toFirst();
- ASSERT(md);
- ClassDef *cd=md->getClassDef();
- ASSERT(cd);
- QCString className=cd->name().copy();
- ++mni;
- bool unique=TRUE;
- for (;(md=mni.current());++mni)
- {
- const ClassDef *cd=md->getClassDef();
- if (className!=cd->name()) unique=FALSE;
- }
- if (unique)
- {
- MemberType mtype;
- if (root->mtype==Signal) mtype=MemberType_Signal;
- else if (root->mtype==Slot) mtype=MemberType_Slot;
- else if (root->mtype==DCOP) mtype=MemberType_DCOP;
- else mtype=MemberType_Function;
-
- // new overloaded member function
- ArgumentList tArgList =
- getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
- //printf("new related member %s args='%s'\n",md->name().data(),funcArgs.data());
- MemberDef *md=createMemberDef(
- root->fileName,root->startLine,root->startColumn,
- funcType,funcName,funcArgs,exceptions,
- root->protection,root->virt,root->stat,Related,
- mtype,tArgList,root->argList,root->metaData);
- md->setTagInfo(root->tagInfo());
- md->setLanguage(root->lang);
- md->setId(root->id);
- md->setTypeConstraints(root->typeConstr);
- md->setMemberClass(cd);
- md->setDefinition(funcDecl);
- md->enableCallGraph(root->callGraph);
- md->enableCallerGraph(root->callerGraph);
- md->enableReferencedByRelation(root->referencedByRelation);
- md->enableReferencesRelation(root->referencesRelation);
- QCString doc=getOverloadDocs();
- doc+="<p>";
- doc+=root->doc;
- md->setDocumentation(doc,root->docFile,root->docLine);
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setDocsForDefinition(!root->proto);
- md->setPrototype(root->proto,root->fileName,root->startLine,root->startColumn);
- md->addSectionsToDefinition(root->anchors);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- FileDef *fd=root->fileDef();
- md->setBodyDef(fd);
- md->setMemberSpecifiers(spec);
- md->setMemberGroupId(root->mGrpId);
- mn->append(md);
- cd->insertMember(md);
- cd->insertUsedFile(fd);
- md->setRefItems(root->sli);
- }
+ addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
}
else // unrelated function with the same name as a member
{
@@ -6246,62 +6457,67 @@ static void findMember(const Entry *root,
Debug::print(Debug::FindMembers,0,"2. related function\n"
" scopeName=%s className=%s\n",qPrint(scopeName),qPrint(className));
if (className.isEmpty()) className=relates;
- ClassDef *cd;
//printf("scopeName='%s' className='%s'\n",scopeName.data(),className.data());
- if ((cd=getClass(scopeName)))
+ if ((cd=getClassMutable(scopeName)))
{
bool newMember=TRUE; // assume we have a new member
- bool newMemberName=FALSE;
- MemberDef *mdDefine=0;
- bool isDefine=FALSE;
+ MemberDefMutable *mdDefine=0;
{
- MemberName *mn = Doxygen::functionNameSDict->find(funcName);
+ mn = Doxygen::functionNameLinkedMap->find(funcName);
if (mn)
{
- MemberNameIterator mni(*mn);
- mdDefine = mni.current();
- while (mdDefine && !isDefine)
+ for (const auto &imd : *mn)
{
- isDefine = isDefine || mdDefine->isDefine();
- if (!isDefine) { ++mni; mdDefine=mni.current(); }
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md && md->isDefine())
+ {
+ mdDefine = md;
+ break;
+ }
}
}
}
FileDef *fd=root->fileDef();
- if ((mn=Doxygen::memberNameSDict->find(funcName))==0)
+ if ((mn=Doxygen::memberNameLinkedMap->find(funcName))==0)
{
- mn=new MemberName(funcName);
- newMemberName=TRUE; // we create a new member name
+ mn=Doxygen::memberNameLinkedMap->add(funcName);
}
else
{
- MemberNameIterator mni(*mn);
- MemberDef *rmd;
- while ((rmd=mni.current()) && newMember) // see if we got another member with matching arguments
+ // see if we got another member with matching arguments
+ MemberDefMutable *rmd_found = 0;
+ for (const auto &irmd : *mn)
{
- const ArgumentList &rmdAl = rmd->argumentList();
-
- newMember=
- className!=rmd->getOuterScope()->name() ||
- !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
- cd,fd,root->argList,
- TRUE);
- if (newMember) ++mni;
+ MemberDefMutable *rmd = toMemberDefMutable(irmd.get());
+ if (rmd)
+ {
+ const ArgumentList &rmdAl = rmd->argumentList();
+
+ newMember=
+ className!=rmd->getOuterScope()->name() ||
+ !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),&rmdAl,
+ cd,fd,&root->argList,
+ TRUE);
+ if (!newMember)
+ {
+ rmd_found = rmd;
+ }
+ }
}
- if (!newMember && rmd) // member already exists as rmd -> add docs
+ if (rmd_found) // member already exists as rmd -> add docs
{
//printf("addMemberDocs for related member %s\n",root->name.data());
//rmd->setMemberDefTemplateArguments(root->mtArgList);
- addMemberDocs(root,rmd,funcDecl,0,overloaded,spec);
+ addMemberDocs(root,rmd_found,funcDecl,0,overloaded,spec);
}
}
if (newMember) // need to create a new member
{
MemberType mtype;
- if (isDefine)
+ if (mdDefine)
mtype=MemberType_Define;
else if (root->mtype==Signal)
mtype=MemberType_Signal;
@@ -6312,7 +6528,7 @@ static void findMember(const Entry *root,
else
mtype=MemberType_Function;
- if (isDefine && mdDefine)
+ if (mdDefine)
{
mdDefine->setHidden(TRUE);
funcType="#define";
@@ -6329,7 +6545,7 @@ static void findMember(const Entry *root,
// this accurately reflects the template arguments of
// the related function, which don't have to do with
// those of the related class.
- MemberDef *md=createMemberDef(
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
root->fileName,root->startLine,root->startColumn,
funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,
@@ -6338,9 +6554,9 @@ static void findMember(const Entry *root,
mtype,
(!root->tArgLists.empty() ? root->tArgLists.back() : ArgumentList()),
funcArgs.isEmpty() ? ArgumentList() : root->argList,
- root->metaData);
+ root->metaData) };
- if (isDefine && mdDefine)
+ if (mdDefine)
{
md->setInitializer(mdDefine->initializer());
}
@@ -6360,8 +6576,6 @@ static void findMember(const Entry *root,
md->setTagInfo(root->tagInfo());
-
-
//printf("Related member name='%s' decl='%s' bodyLine='%d'\n",
// funcName.data(),funcDecl.data(),root->bodyLine);
@@ -6370,29 +6584,33 @@ static void findMember(const Entry *root,
bool found=FALSE;
if (root->bodyLine==-1)
{
- MemberName *rmn=Doxygen::functionNameSDict->find(funcName);
+ MemberName *rmn=Doxygen::functionNameLinkedMap->find(funcName);
if (rmn)
{
- MemberNameIterator rmni(*rmn);
- const MemberDef *rmd;
- while ((rmd=rmni.current()) && !found) // see if we got another member with matching arguments
+ const MemberDefMutable *rmd_found=0;
+ for (const auto &irmd : *rmn)
{
- const ArgumentList &rmdAl = rmd->argumentList();
- // check for matching argument lists
- if (
- matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
- cd,fd,root->argList,
- TRUE)
- )
+ MemberDefMutable *rmd = toMemberDefMutable(irmd.get());
+ if (rmd)
{
- found=TRUE;
+ const ArgumentList &rmdAl = rmd->argumentList();
+ // check for matching argument lists
+ if (
+ matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),&rmdAl,
+ cd,fd,&root->argList,
+ TRUE)
+ )
+ {
+ found=TRUE;
+ rmd_found = rmd;
+ break;
+ }
}
- if (!found) ++rmni;
}
- if (rmd) // member found -> copy line number info
+ if (rmd_found) // member found -> copy line number info
{
- md->setBodySegment(rmd->getStartBodyLine(),rmd->getEndBodyLine());
- md->setBodyDef(rmd->getBodyDef());
+ md->setBodySegment(rmd_found->getDefLine(),rmd_found->getStartBodyLine(),rmd_found->getEndBodyLine());
+ md->setBodyDef(rmd_found->getBodyDef());
//md->setBodyMember(rmd);
}
}
@@ -6400,7 +6618,7 @@ static void findMember(const Entry *root,
if (!found) // line number could not be found or is available in this
// entry
{
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setBodyDef(fd);
}
@@ -6425,22 +6643,16 @@ static void findMember(const Entry *root,
md->setLanguage(root->lang);
md->setId(root->id);
//md->setMemberDefTemplateArguments(root->mtArgList);
- mn->append(md);
- cd->insertMember(md);
+ cd->insertMember(md.get());
cd->insertUsedFile(fd);
md->setRefItems(root->sli);
if (root->relatesType == Duplicate) md->setRelatedAlso(cd);
- if (!isDefine)
+ if (!mdDefine)
{
- addMemberToGroups(root,md);
+ addMemberToGroups(root,md.get());
}
//printf("Adding member=%s\n",md->name().data());
- if (newMemberName)
- {
- //Doxygen::memberNameList.append(mn);
- //Doxygen::memberNameDict.insert(funcName,mn);
- Doxygen::memberNameSDict->append(funcName,mn);
- }
+ mn->push_back(std::move(md));
}
if (root->relatesType == Duplicate)
{
@@ -6466,58 +6678,7 @@ static void findMember(const Entry *root,
}
else if (root->parent() && root->parent()->section==Entry::OBJCIMPL_SEC)
{
-localObjCMethod:
- ClassDef *cd;
- //printf("scopeName='%s' className='%s'\n",scopeName.data(),className.data());
- if (Config_getBool(EXTRACT_LOCAL_METHODS) && (cd=getClass(scopeName)))
- {
- Debug::print(Debug::FindMembers,0,"4. Local objective C method %s\n"
- " scopeName=%s className=%s\n",qPrint(root->name),qPrint(scopeName),qPrint(className));
- //printf("Local objective C method '%s' of class '%s' found\n",root->name.data(),cd->name().data());
- MemberDef *md=createMemberDef(
- root->fileName,root->startLine,root->startColumn,
- funcType,funcName,funcArgs,exceptions,
- root->protection,root->virt,root->stat,Member,
- MemberType_Function,ArgumentList(),root->argList,root->metaData);
- md->setTagInfo(root->tagInfo());
- md->setLanguage(root->lang);
- md->setId(root->id);
- md->makeImplementationDetail();
- md->setMemberClass(cd);
- md->setDefinition(funcDecl);
- md->enableCallGraph(root->callGraph);
- md->enableCallerGraph(root->callerGraph);
- md->enableReferencedByRelation(root->referencedByRelation);
- md->enableReferencesRelation(root->referencesRelation);
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setDocsForDefinition(!root->proto);
- md->setPrototype(root->proto,root->fileName,root->startLine,root->startColumn);
- md->addSectionsToDefinition(root->anchors);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- FileDef *fd=root->fileDef();
- md->setBodyDef(fd);
- md->setMemberSpecifiers(spec);
- md->setMemberGroupId(root->mGrpId);
- cd->insertMember(md);
- cd->insertUsedFile(fd);
- md->setRefItems(root->sli);
- if ((mn=Doxygen::memberNameSDict->find(root->name)))
- {
- mn->append(md);
- }
- else
- {
- mn = new MemberName(root->name);
- mn->append(md);
- Doxygen::memberNameSDict->append(root->name,mn);
- }
- }
- else
- {
- // local objective C method found for class without interface
- }
+ addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
}
else // unrelated not overloaded member found
{
@@ -6762,11 +6923,10 @@ static void findEnums(const Entry *root)
{
if (root->section==Entry::ENUM_SEC)
{
- MemberDef *md=0;
- ClassDef *cd=0;
- FileDef *fd=0;
- NamespaceDef *nd=0;
- MemberNameSDict *mnsd=0;
+ ClassDefMutable *cd=0;
+ FileDef *fd=0;
+ NamespaceDefMutable *nd=0;
+ MemberNameLinkedMap *mnsd=0;
bool isGlobal;
bool isRelated=FALSE;
bool isMemberOf=FALSE;
@@ -6780,7 +6940,7 @@ static void findEnums(const Entry *root)
{
scope=root->name.left(i); // extract scope
name=root->name.right(root->name.length()-i-2); // extract name
- if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
}
else // no scope, check the scope in which the docs where found
{
@@ -6789,7 +6949,7 @@ static void findEnums(const Entry *root)
) // found enum docs inside a compound
{
scope=root->parent()->name;
- if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
}
name=root->name;
}
@@ -6802,43 +6962,43 @@ static void findEnums(const Entry *root)
scope=mergeScopes(scope,root->relates);
else
scope=root->relates.copy();
- if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
}
if (cd && !name.isEmpty()) // found a enum inside a compound
{
//printf("Enum '%s'::'%s'\n",cd->name().data(),name.data());
fd=0;
- mnsd=Doxygen::memberNameSDict;
+ mnsd=Doxygen::memberNameLinkedMap;
isGlobal=FALSE;
}
else if (nd) // found enum inside namespace
{
- mnsd=Doxygen::functionNameSDict;
+ mnsd=Doxygen::functionNameLinkedMap;
isGlobal=TRUE;
}
else // found a global enum
{
fd=root->fileDef();
- mnsd=Doxygen::functionNameSDict;
+ mnsd=Doxygen::functionNameLinkedMap;
isGlobal=TRUE;
}
if (!name.isEmpty())
{
// new enum type
- md = createMemberDef(
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
root->fileName,root->startLine,root->startColumn,
0,name,0,0,
root->protection,Normal,FALSE,
isMemberOf ? Foreign : isRelated ? Related : Member,
MemberType_Enumeration,
- ArgumentList(),ArgumentList(),root->metaData);
+ ArgumentList(),ArgumentList(),root->metaData) };
md->setTagInfo(root->tagInfo());
md->setLanguage(root->lang);
md->setId(root->id);
if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setBodyDef(root->fileDef());
md->setMemberSpecifiers(root->spec);
md->setEnumBaseType(root->args);
@@ -6850,7 +7010,7 @@ static void findEnums(const Entry *root)
md->enableCallerGraph(root->callerGraph);
md->enableReferencedByRelation(root->referencedByRelation);
md->enableReferencesRelation(root->referencesRelation);
- //printf("%s::setRefItems(%d)\n",md->name().data(),root->sli?root->sli->count():-1);
+ //printf("%s::setRefItems(%zu)\n",md->name().data(),root->sli.size());
md->setRefItems(root->sli);
//printf("found enum %s nd=%p\n",md->name().data(),nd);
bool defSet=FALSE;
@@ -6874,7 +7034,7 @@ static void findEnums(const Entry *root)
//printf("definition=%s\n",md->definition());
defSet=TRUE;
md->setNamespace(nd);
- nd->insertMember(md);
+ nd->insertMember(md.get());
}
// even if we have already added the enum to a namespace, we still
@@ -6890,7 +7050,7 @@ static void findEnums(const Entry *root)
if (fd)
{
md->setFileDef(fd);
- fd->insertMember(md);
+ fd->insertMember(md.get());
}
}
else if (cd)
@@ -6903,7 +7063,7 @@ static void findEnums(const Entry *root)
{
md->setDefinition(cd->name()+"::"+name+baseType);
}
- cd->insertMember(md);
+ cd->insertMember(md.get());
cd->insertUsedFile(fd);
}
md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -6912,21 +7072,10 @@ static void findEnums(const Entry *root)
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
//printf("Adding member=%s\n",md->name().data());
- MemberName *mn;
- if ((mn=(*mnsd)[name]))
- {
- // this is used if the same enum is in multiple namespaces/classes
- mn->append(md);
- }
- else // new enum name
- {
- mn = new MemberName(name);
- mn->append(md);
- mnsd->append(name,mn);
- //printf("add %s to new memberName. Now %d members\n",
- // name.data(),mn->count());
- }
- addMemberToGroups(root,md);
+ addMemberToGroups(root,md.get());
+
+ MemberName *mn = mnsd->add(name);
+ mn->push_back(std::move(md));
}
}
else
@@ -6942,10 +7091,10 @@ static void addEnumValuesToEnums(const Entry *root)
if (root->section==Entry::ENUM_SEC)
// non anonymous enumeration
{
- ClassDef *cd=0;
- FileDef *fd=0;
- NamespaceDef *nd=0;
- MemberNameSDict *mnsd=0;
+ ClassDefMutable *cd=0;
+ FileDef *fd=0;
+ NamespaceDefMutable *nd=0;
+ MemberNameLinkedMap *mnsd=0;
bool isGlobal;
bool isRelated=FALSE;
//printf("Found enum with name '%s' relates=%s\n",root->name.data(),root->relates.data());
@@ -6958,7 +7107,7 @@ static void addEnumValuesToEnums(const Entry *root)
{
scope=root->name.left(i); // extract scope
name=root->name.right(root->name.length()-i-2); // extract name
- if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
}
else // no scope, check the scope in which the docs where found
{
@@ -6967,7 +7116,7 @@ static void addEnumValuesToEnums(const Entry *root)
) // found enum docs inside a compound
{
scope=root->parent()->name;
- if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
}
name=root->name;
}
@@ -6975,31 +7124,31 @@ static void addEnumValuesToEnums(const Entry *root)
if (!root->relates.isEmpty())
{ // related member, prefix user specified scope
isRelated=TRUE;
- if (getClass(root->relates)==0 && !scope.isEmpty())
+ if (getClassMutable(root->relates)==0 && !scope.isEmpty())
scope=mergeScopes(scope,root->relates);
else
scope=root->relates.copy();
- if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ if ((cd=getClassMutable(scope))==0) nd=getResolvedNamespaceMutable(scope);
}
if (cd && !name.isEmpty()) // found a enum inside a compound
{
//printf("Enum in class '%s'::'%s'\n",cd->name().data(),name.data());
fd=0;
- mnsd=Doxygen::memberNameSDict;
+ mnsd=Doxygen::memberNameLinkedMap;
isGlobal=FALSE;
}
else if (nd && !nd->isAnonymous()) // found enum inside namespace
{
//printf("Enum in namespace '%s'::'%s'\n",nd->name().data(),name.data());
- mnsd=Doxygen::functionNameSDict;
+ mnsd=Doxygen::functionNameLinkedMap;
isGlobal=TRUE;
}
else // found a global enum
{
fd=root->fileDef();
//printf("Enum in file '%s': '%s'\n",fd->name().data(),name.data());
- mnsd=Doxygen::functionNameSDict;
+ mnsd=Doxygen::functionNameLinkedMap;
isGlobal=TRUE;
}
@@ -7009,11 +7158,20 @@ static void addEnumValuesToEnums(const Entry *root)
MemberName *mn = mnsd->find(name); // for all members with this name
if (mn)
{
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (mni.toFirst(); (md=mni.current()) ; ++mni) // for each enum in this list
+ struct EnumValueInfo
+ {
+ EnumValueInfo(const QCString &n,std::unique_ptr<MemberDefMutable> &md) :
+ name(n), member(std::move(md)) {}
+ QCString name;
+ std::unique_ptr<MemberDefMutable> member;
+ };
+ std::vector< EnumValueInfo > extraMembers;
+ // for each enum in this list
+ for (const auto &imd : *mn)
{
- if (!md->isAlias() && md->isEnumerate() && !root->children().empty())
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ // use raw pointer in this loop, since we modify mn and can then invalidate mdp.
+ if (md && md->isEnumerate() && !root->children().empty())
{
//printf(" enum with %d children\n",root->children()->count());
for (const auto &e : root->children())
@@ -7045,14 +7203,18 @@ static void addEnumValuesToEnums(const Entry *root)
{
fileName = e->tagInfo()->tagName;
}
- MemberDef *fmd=createMemberDef(
+ std::unique_ptr<MemberDefMutable> fmd { createMemberDef(
fileName,e->startLine,e->startColumn,
e->type,e->name,e->args,0,
e->protection, Normal,e->stat,Member,
- MemberType_EnumValue,ArgumentList(),ArgumentList(),e->metaData);
- if (md->getClassDef()) fmd->setMemberClass(md->getClassDef());
- else if (md->getNamespaceDef()) fmd->setNamespace(md->getNamespaceDef());
- else if (md->getFileDef()) fmd->setFileDef(md->getFileDef());
+ MemberType_EnumValue,ArgumentList(),ArgumentList(),e->metaData) };
+ const NamespaceDef *mnd = md->getNamespaceDef();
+ if (md->getClassDef())
+ fmd->setMemberClass(md->getClassDef());
+ else if (mnd && (mnd->isLinkable() || mnd->isAnonymous()))
+ fmd->setNamespace(mnd);
+ else if (md->getFileDef())
+ fmd->setFileDef(md->getFileDef());
fmd->setOuterScope(md->getOuterScope());
fmd->setTagInfo(e->tagInfo());
fmd->setLanguage(e->lang);
@@ -7066,34 +7228,23 @@ static void addEnumValuesToEnums(const Entry *root)
fmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
fmd->setRefItems(e->sli);
fmd->setAnchor();
- md->insertEnumField(fmd);
+ md->insertEnumField(fmd.get());
fmd->setEnumScope(md,TRUE);
- MemberName *mn=mnsd->find(e->name);
- if (mn)
- {
- mn->append(fmd);
- }
- else
- {
- mn = new MemberName(e->name);
- mn->append(fmd);
- mnsd->append(e->name,mn);
- }
+ extraMembers.push_back(EnumValueInfo(e->name,fmd));
}
}
else
{
- //printf("e->name=%s isRelated=%d\n",e->name().data(),isRelated);
+ //printf("e->name=%s isRelated=%d\n",e->name.data(),isRelated);
MemberName *fmn=0;
- MemberNameSDict *emnsd = isRelated ? Doxygen::functionNameSDict : mnsd;
- if (!e->name.isEmpty() && (fmn=(*emnsd)[e->name]))
+ MemberNameLinkedMap *emnsd = isRelated ? Doxygen::functionNameLinkedMap : mnsd;
+ if (!e->name.isEmpty() && (fmn=emnsd->find(e->name)))
// get list of members with the same name as the field
{
- MemberNameIterator fmni(*fmn);
- MemberDef *fmd;
- for (fmni.toFirst(); (fmd=fmni.current()) ; ++fmni)
+ for (const auto &ifmd : *fmn)
{
- if (fmd->isEnumValue() && fmd->getOuterScope()==md->getOuterScope()) // in same scope
+ MemberDefMutable *fmd = toMemberDefMutable(ifmd.get());
+ if (fmd && fmd->isEnumValue() && fmd->getOuterScope()==md->getOuterScope()) // in same scope
{
//printf("found enum value with same name %s in scope %s\n",
// fmd->name().data(),fmd->getOuterScope()->name().data());
@@ -7143,6 +7294,12 @@ static void addEnumValuesToEnums(const Entry *root)
}
}
}
+ // move the newly added members into mn
+ for (auto &e : extraMembers)
+ {
+ MemberName *emn=mnsd->add(e.name);
+ emn->push_back(std::move(e.member));
+ }
}
}
}
@@ -7152,6 +7309,42 @@ static void addEnumValuesToEnums(const Entry *root)
}
}
+//----------------------------------------------------------------------
+
+static void addEnumDocs(const Entry *root,MemberDefMutable *md)
+{
+ // documentation outside a compound overrides the documentation inside it
+ {
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
+ }
+
+ // brief descriptions inside a compound override the documentation
+ // outside it
+ {
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ }
+
+ if (!md->inbodyDocumentation() || !root->parent()->name.isEmpty())
+ {
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ }
+
+ if (root->mGrpId!=-1 && md->getMemberGroupId()==-1)
+ {
+ md->setMemberGroupId(root->mGrpId);
+ }
+
+ md->addSectionsToDefinition(root->anchors);
+ md->setRefItems(root->sli);
+
+ const GroupDef *gd=md->getGroupDef();
+ if (gd==0 && !root->groups.empty()) // member not grouped but out-of-line documentation is
+ {
+ addMemberToGroups(root,md);
+ }
+}
+
//----------------------------------------------------------------------
// find the documentation blocks for the enumerations
@@ -7163,8 +7356,6 @@ static void findEnumDocumentation(const Entry *root)
&& root->name.at(0)!='@' // skip anonymous enums
)
{
- //printf("Found docs for enum with name '%s' in context %s\n",
- // root->name.data(),root->parent->name.data());
int i;
QCString name;
QCString scope;
@@ -7185,97 +7376,57 @@ static void findEnumDocumentation(const Entry *root)
if (!scope.isEmpty()) scope.prepend("::");
scope.prepend(root->parent()->name);
}
- ClassDef *cd=getClass(scope);
+ const ClassDef *cd = getClass(scope);
+ const NamespaceDef *nd=Doxygen::namespaceLinkedMap->find(scope);
+ const FileDef *fd = root->fileDef();
+ Debug::print(Debug::FindMembers,0,"1. Found docs for enum with name '%s' and scope '%s' in context %s cd=%s, nd=%s fd=%s\n",
+ name.data(),scope.data(),root->parent()->name.data(),
+ cd?cd->name().data():"<none>",
+ nd?nd->name().data():"<none>",
+ fd?fd->name().data():"<none>");
if (!name.isEmpty())
{
bool found=FALSE;
+ MemberName *mn;
if (cd)
{
- //printf("Enum: scope='%s' name='%s'\n",cd->name(),name.data());
- QCString className=cd->name().copy();
- MemberName *mn=Doxygen::memberNameSDict->find(name);
- if (mn)
+ mn = Doxygen::memberNameLinkedMap->find(name);
+ }
+ else
+ {
+ mn = Doxygen::functionNameLinkedMap->find(name);
+ }
+ if (mn)
+ {
+ for (const auto &imd : *mn)
{
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (mni.toFirst();(md=mni.current()) && !found;++mni)
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md && md->isEnumerate())
{
- const ClassDef *cd=md->getClassDef();
- if (cd && cd->name()==className && md->isEnumerate())
+ const ClassDef *mcd = md->getClassDef();
+ const NamespaceDef *mnd = md->getNamespaceDef();
+ const FileDef *mfd = md->getFileDef();
+ if (cd && mcd==cd)
{
- // documentation outside a compound overrides the documentation inside it
-#if 0
- if (!md->documentation() || root->parent()->name.isEmpty())
-#endif
- {
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setDocsForDefinition(!root->proto);
- }
-
- // brief descriptions inside a compound override the documentation
- // outside it
-#if 0
- if (!md->briefDescription() || !root->parent()->name.isEmpty())
-#endif
- {
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- }
-
- if (!md->inbodyDocumentation() || !root->parent()->name.isEmpty())
- {
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- }
-
- if (root->mGrpId!=-1 && md->getMemberGroupId()==-1)
- {
- md->setMemberGroupId(root->mGrpId);
- }
-
- md->addSectionsToDefinition(root->anchors);
- md->setRefItems(root->sli);
-
- const GroupDef *gd=md->getGroupDef();
- if (gd==0 && !root->groups.empty()) // member not grouped but out-of-line documentation is
- {
- addMemberToGroups(root,md);
- }
-
+ Debug::print(Debug::FindMembers,0,"2. Match found for class scope\n");
+ addEnumDocs(root,md);
found=TRUE;
+ break;
}
- }
- }
- else
- {
- //printf("MemberName %s not found!\n",name.data());
- }
- }
- else // enum outside class
- {
- //printf("Enum outside class: %s grpId=%d\n",name.data(),root->mGrpId);
- MemberName *mn=Doxygen::functionNameSDict->find(name);
- if (mn)
- {
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (mni.toFirst();(md=mni.current()) && !found;++mni)
- {
- if (md->isEnumerate())
+ else if (cd==0 && mcd==0 && nd!=0 && mnd==nd)
{
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setDocsForDefinition(!root->proto);
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->addSectionsToDefinition(root->anchors);
- md->setMemberGroupId(root->mGrpId);
-
- const GroupDef *gd=md->getGroupDef();
- if (gd==0 && !root->groups.empty()) // member not grouped but out-of-line documentation is
- {
- addMemberToGroups(root,md);
- }
-
+ Debug::print(Debug::FindMembers,0,"2. Match found for namespace scope\n");
+ addEnumDocs(root,md);
+ found=TRUE;
+ break;
+ }
+ else if (cd==0 && nd==0 && mcd==0 && mnd==0 && fd==mfd)
+ {
+ Debug::print(Debug::FindMembers,0,"2. Match found for global scope\n");
+ addEnumDocs(root,md);
found=TRUE;
+ break;
}
}
}
@@ -7294,19 +7445,16 @@ static void findEnumDocumentation(const Entry *root)
// search for each enum (member or function) in mnl if it has documented
// enum values.
-static void findDEV(const MemberNameSDict &mnsd)
+static void findDEV(const MemberNameLinkedMap &mnsd)
{
- MemberName *mn;
- MemberNameSDict::Iterator mnli(mnsd);
// for each member name
- for (mnli.toFirst();(mn=mnli.current());++mnli)
+ for (const auto &mn : mnsd)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
// for each member definition
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &imd : *mn)
{
- if (md->isEnumerate()) // member is an enum
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md && md->isEnumerate()) // member is an enum
{
const MemberList *fmdl = md->enumFieldList();
int documentedEnumValues=0;
@@ -7331,78 +7479,70 @@ static void findDEV(const MemberNameSDict &mnsd)
// values.
static void findDocumentedEnumValues()
{
- findDEV(*Doxygen::memberNameSDict);
- findDEV(*Doxygen::functionNameSDict);
+ findDEV(*Doxygen::memberNameLinkedMap);
+ findDEV(*Doxygen::functionNameLinkedMap);
}
//----------------------------------------------------------------------
static void addMembersToIndex()
{
- MemberName *mn;
- MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
// for each member name
- for (mnli.toFirst();(mn=mnli.current());++mnli)
+ for (const auto &mn : *Doxygen::memberNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
// for each member definition
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
- addClassMemberNameToIndex(md);
+ addClassMemberNameToIndex(md.get());
}
}
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
// for each member name
- for (fnli.toFirst();(mn=fnli.current());++fnli)
+ for (const auto &mn : *Doxygen::functionNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
// for each member definition
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
- if (!md->isAlias())
+ if (md->getNamespaceDef())
{
- if (md->getNamespaceDef())
- {
- addNamespaceMemberNameToIndex(md);
- }
- else
- {
- addFileMemberNameToIndex(md);
- }
+ addNamespaceMemberNameToIndex(md.get());
+ }
+ else
+ {
+ addFileMemberNameToIndex(md.get());
}
}
}
+ sortMemberIndexLists();
}
//----------------------------------------------------------------------
static void vhdlCorrectMemberProperties()
{
- MemberName *mn;
- MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
// for each member name
- for (mnli.toFirst();(mn=mnli.current());++mnli)
+ for (const auto &mn : *Doxygen::memberNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
// for each member definition
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &imd : *mn)
{
- VhdlDocGen::correctMemberProperties(md);
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md)
+ {
+ VhdlDocGen::correctMemberProperties(md);
+ }
}
}
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
// for each member name
- for (fnli.toFirst();(mn=fnli.current());++fnli)
+ for (const auto &mn : *Doxygen::functionNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
// for each member definition
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &imd : *mn)
{
- VhdlDocGen::correctMemberProperties(md);
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md)
+ {
+ VhdlDocGen::correctMemberProperties(md);
+ }
}
}
}
@@ -7415,61 +7555,69 @@ static void vhdlCorrectMemberProperties()
static void computeMemberRelations()
{
- MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
- MemberName *mn;
- for ( ; (mn=mnli.current()) ; ++mnli ) // for each member name
- {
- MemberNameIterator mdi(*mn);
- MemberNameIterator bmdi(*mn);
- MemberDef *md;
- MemberDef *bmd;
- for ( ; (md=mdi.current()) ; ++mdi ) // for each member with a specific name
- {
- for ( bmdi.toFirst() ; (bmd=bmdi.current()); ++bmdi ) // for each other member with the same name
- {
- const ClassDef *mcd = md->getClassDef();
- if (mcd && mcd->baseClasses())
- {
- const ClassDef *bmcd = bmd->getClassDef();
- //printf("Check relation between '%s'::'%s' (%p) and '%s'::'%s' (%p)\n",
- // mcd->name().data(),md->name().data(),md,
- // bmcd->name().data(),bmd->name().data(),bmd
- // );
- if (md!=bmd && bmcd && mcd && bmcd!=mcd &&
- (bmd->virtualness()!=Normal || bmd->getLanguage()==SrcLangExt_Python ||
- bmd->getLanguage()==SrcLangExt_Java || bmd->getLanguage()==SrcLangExt_PHP ||
- bmcd->compoundType()==ClassDef::Interface ||
- bmcd->compoundType()==ClassDef::Protocol
- ) &&
- md->isFunction() &&
- mcd->isLinkable() &&
- bmcd->isLinkable() &&
- mcd->isBaseClass(bmcd,TRUE))
+ for (const auto &mn : *Doxygen::memberNameLinkedMap)
+ {
+ // for each member with a specific name
+ for (const auto &imd : *mn)
+ {
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md)
+ {
+ // for each other member with the same name
+ for ( const auto &ibmd : *mn)
+ {
+ MemberDefMutable *bmd = toMemberDefMutable(ibmd.get());
+ if (bmd && md!=bmd)
{
- //printf(" derived scope\n");
- const ArgumentList &bmdAl = bmd->argumentList();
- const ArgumentList &mdAl = md->argumentList();
- //printf(" Base argList='%s'\n Super argList='%s'\n",
- // argListToString(bmdAl.pointer()).data(),
- // argListToString(mdAl.pointer()).data()
- // );
- if (
- matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmdAl,
- md->getOuterScope(), md->getFileDef(), mdAl,
- TRUE
- )
- )
+ const ClassDef *mcd = md->getClassDef();
+ if (mcd && !mcd->baseClasses().empty())
{
- MemberDef *rmd;
- if ((rmd=md->reimplements())==0 ||
- minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->getClassDef())
- )
+ const ClassDef *bmcd = bmd->getClassDef();
+ //printf("Check relation between '%s'::'%s' (%p) and '%s'::'%s' (%p)\n",
+ // mcd->name().data(),md->name().data(),md.get(),
+ // bmcd->name().data(),bmd->name().data(),bmd.get()
+ // );
+ if (bmcd && mcd && bmcd!=mcd &&
+ (bmd->virtualness()!=Normal ||
+ bmd->getLanguage()==SrcLangExt_Python || bmd->getLanguage()==SrcLangExt_Java || bmd->getLanguage()==SrcLangExt_PHP ||
+ bmcd->compoundType()==ClassDef::Interface || bmcd->compoundType()==ClassDef::Protocol
+ ) &&
+ md->isFunction() &&
+ mcd->isLinkable() &&
+ bmcd->isLinkable() &&
+ mcd->isBaseClass(bmcd,TRUE))
{
- //printf("setting (new) reimplements member\n");
- md->setReimplements(bmd);
+ //printf(" derived scope\n");
+ const ArgumentList &bmdAl = bmd->argumentList();
+ const ArgumentList &mdAl = md->argumentList();
+ //printf(" Base argList='%s'\n Super argList='%s'\n",
+ // argListToString(bmdAl).data(),
+ // argListToString(mdAl).data()
+ // );
+ if (
+ matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),&bmdAl,
+ md->getOuterScope(), md->getFileDef(), &mdAl,
+ TRUE
+ )
+ )
+ {
+ //printf("match!\n");
+ MemberDef *rmd;
+ if ((rmd=md->reimplements())==0 ||
+ minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->getClassDef())
+ )
+ {
+ //printf("setting (new) reimplements member\n");
+ md->setReimplements(bmd);
+ }
+ //printf("%s: add reimplementedBy member %s\n",bmcd->name().data(),mcd->name().data());
+ bmd->insertReimplementedBy(md);
+ }
+ else
+ {
+ //printf("no match!\n");
+ }
}
- //printf("%s: add reimplementedBy member %s\n",bmcd->name().data(),mcd->name().data());
- bmd->insertReimplementedBy(md);
}
}
}
@@ -7478,26 +7626,12 @@ static void computeMemberRelations()
}
}
-
-//----------------------------------------------------------------------------
-//static void computeClassImplUsageRelations()
-//{
-// ClassDef *cd;
-// ClassSDict::Iterator cli(*Doxygen::classSDict);
-// for (;(cd=cli.current());++cli)
-// {
-// cd->determineImplUsageRelation();
-// }
-//}
-
//----------------------------------------------------------------------------
static void createTemplateInstanceMembers()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
// for each class
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
// that is a template
QDict<ClassDef> *templInstances = cd->getTemplateInstances();
@@ -7508,7 +7642,11 @@ static void createTemplateInstanceMembers()
// for each instance of the template
for (qdi.toFirst();(tcd=qdi.current());++qdi)
{
- tcd->addMembersToTemplateInstance(cd,qdi.currentKey());
+ ClassDefMutable *tcdm = toClassDefMutable(tcd);
+ if (tcdm)
+ {
+ tcdm->addMembersToTemplateInstance(cd.get(),cd->templateArguments(),qdi.currentKey());
+ }
}
}
}
@@ -7518,21 +7656,19 @@ static void createTemplateInstanceMembers()
static void mergeCategories()
{
- ClassDef *cd;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
// merge members of categories into the class they extend
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
int i=cd->name().find('(');
if (i!=-1) // it is an Objective-C category
{
QCString baseName=cd->name().left(i);
- ClassDef *baseClass=Doxygen::classSDict->find(baseName);
+ ClassDefMutable *baseClass=toClassDefMutable(Doxygen::classLinkedMap->find(baseName));
if (baseClass)
{
//printf("*** merging members of category %s into %s\n",
// cd->name().data(),baseClass->name().data());
- baseClass->mergeCategory(cd);
+ baseClass->mergeCategory(cd.get());
}
}
}
@@ -7542,23 +7678,29 @@ static void mergeCategories()
static void buildCompleteMemberLists()
{
- ClassDef *cd;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
// merge the member list of base classes into the inherited classes.
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (// !cd->isReference() && // not an external class
- cd->subClasses()==0 && // is a root of the hierarchy
- cd->baseClasses()) // and has at least one base class
+ cd->subClasses().empty() && // is a root of the hierarchy
+ !cd->baseClasses().empty()) // and has at least one base class
{
- //printf("*** merging members for %s\n",cd->name().data());
- cd->mergeMembers();
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
+ {
+ //printf("*** merging members for %s\n",cd->name().data());
+ cdm->mergeMembers();
+ }
}
}
- // now sort the member list of all classes.
- for (cli.toFirst();(cd=cli.current());++cli)
+ // now sort the member list of all members for all classes.
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- if (cd->memberNameInfoSDict()) cd->memberNameInfoSDict()->sort();
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
+ {
+ cdm->sortAllMembersList();
+ }
}
}
@@ -7566,108 +7708,109 @@ static void buildCompleteMemberLists()
static void generateFileSources()
{
- if (Doxygen::inputNameList->count()>0)
+ if (!Doxygen::inputNameLinkedMap->empty())
{
#if USE_LIBCLANG
- static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
- if (clangAssistedParsing)
+ if (Doxygen::clangAssistedParsing)
{
- QDict<void> g_processedFiles(10007);
+ StringUnorderedSet processedFiles;
// create a dictionary with files to process
- QDict<void> g_filesToProcess(10007);
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ StringUnorderedSet filesToProcess;
+
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
- g_filesToProcess.insert(fd->absFilePath(),(void*)0x8);
+ filesToProcess.insert(fd->absFilePath().str());
}
}
// process source files (and their include dependencies)
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
- if (fd->isSource() && !fd->isReference())
+ if (fd->isSource() && !fd->isReference() &&
+ ((fd->generateSourceFile() && !g_useOutputTemplate) ||
+ (!fd->isReference() && Doxygen::parseSourcesNeeded)
+ )
+ )
{
- QStrList filesInSameTu;
- fd->getAllIncludeFilesRecursively(filesInSameTu);
- fd->startParsing();
+ auto clangParser = ClangParser::instance()->createTUParser(fd.get());
if (fd->generateSourceFile() && !g_useOutputTemplate) // sources need to be shown in the output
{
msg("Generating code for file %s...\n",fd->docName().data());
- fd->writeSource(*g_outputList,FALSE,filesInSameTu);
-
+ clangParser->parse();
+ fd->writeSourceHeader(*g_outputList);
+ fd->writeSourceBody(*g_outputList,clangParser.get());
+ fd->writeSourceFooter(*g_outputList);
}
else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
// we needed to parse the sources even if we do not show them
{
msg("Parsing code for file %s...\n",fd->docName().data());
- fd->parseSource(FALSE,filesInSameTu);
+ clangParser->parse();
+ fd->parseSource(clangParser.get());
}
- char *incFile = filesInSameTu.first();
- while (incFile && g_filesToProcess.find(incFile))
+ for (auto incFile : clangParser->filesInSameTU())
{
- if (fd->absFilePath()!=incFile && !g_processedFiles.find(incFile))
+ if (filesToProcess.find(incFile)!=filesToProcess.end() && // part of input
+ fd->absFilePath()!=incFile && // not same file
+ processedFiles.find(incFile)==processedFiles.end()) // not yet marked as processed
{
- QStrList moreFiles;
+ StringVector moreFiles;
bool ambig;
- FileDef *ifd=findFileDef(Doxygen::inputNameDict,incFile,ambig);
+ FileDef *ifd=findFileDef(Doxygen::inputNameLinkedMap,incFile.c_str(),ambig);
if (ifd && !ifd->isReference())
{
if (ifd->generateSourceFile() && !g_useOutputTemplate) // sources need to be shown in the output
{
msg(" Generating code for file %s...\n",ifd->docName().data());
- ifd->writeSource(*g_outputList,TRUE,moreFiles);
-
+ ifd->writeSourceHeader(*g_outputList);
+ ifd->writeSourceBody(*g_outputList,clangParser.get());
+ ifd->writeSourceFooter(*g_outputList);
}
else if (!ifd->isReference() && Doxygen::parseSourcesNeeded)
// we needed to parse the sources even if we do not show them
{
msg(" Parsing code for file %s...\n",ifd->docName().data());
- ifd->parseSource(TRUE,moreFiles);
+ ifd->parseSource(clangParser.get());
}
- g_processedFiles.insert(incFile,(void*)0x8);
+ processedFiles.insert(incFile);
}
}
- incFile = filesInSameTu.next();
}
- fd->finishParsing();
- g_processedFiles.insert(fd->absFilePath(),(void*)0x8);
+ processedFiles.insert(fd->absFilePath().str());
}
}
}
// process remaining files
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
- if (!g_processedFiles.find(fd->absFilePath())) // not yet processed
+ if (processedFiles.find(fd->absFilePath().str())==processedFiles.end()) // not yet processed
{
- QStrList filesInSameTu;
- fd->startParsing();
if (fd->generateSourceFile() && !Htags::useHtags && !g_useOutputTemplate) // sources need to be shown in the output
{
+ auto clangParser = ClangParser::instance()->createTUParser(fd.get());
msg("Generating code for file %s...\n",fd->docName().data());
- fd->writeSource(*g_outputList,FALSE,filesInSameTu);
-
+ clangParser->parse();
+ fd->writeSourceHeader(*g_outputList);
+ fd->writeSourceBody(*g_outputList,clangParser.get());
+ fd->writeSourceFooter(*g_outputList);
}
else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
// we needed to parse the sources even if we do not show them
{
+ auto clangParser = ClangParser::instance()->createTUParser(fd.get());
msg("Parsing code for file %s...\n",fd->docName().data());
- fd->parseSource(FALSE,filesInSameTu);
+ clangParser->parse();
+ fd->writeSourceHeader(*g_outputList);
+ fd->writeSourceBody(*g_outputList,clangParser.get());
+ fd->writeSourceFooter(*g_outputList);
}
- fd->finishParsing();
}
}
}
@@ -7675,31 +7818,87 @@ static void generateFileSources()
else
#endif
{
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+#define MULTITHREADED_SOURCE_GENERATOR 0 // not ready to be enabled yet
+#if MULTITHREADED_SOURCE_GENERATOR
+ std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
+ if (numThreads==0)
{
- FileNameIterator fni(*fn);
+ numThreads = std::thread::hardware_concurrency();
+ }
+ msg("Generating code files using %zu threads.\n",numThreads);
+ struct SourceContext
+ {
+ SourceContext(FileDef *fd_,bool gen_,OutputList ol_)
+ : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
FileDef *fd;
- for (;(fd=fni.current());++fni)
+ bool generateSourceFile;
+ OutputList ol;
+ };
+ ThreadPool threadPool(numThreads);
+ std::vector< std::future< std::shared_ptr<SourceContext> > > results;
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
+ {
+ for (const auto &fd : *fn)
+ {
+ bool generateSourceFile = fd->generateSourceFile() && !Htags::useHtags && !g_useOutputTemplate;
+ auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*g_outputList);
+ if (generateSourceFile)
+ {
+ msg("Generating code for file %s...\n",fd->docName().data());
+ fd->writeSourceHeader(ctx->ol);
+ }
+ else
+ {
+ msg("Parsing code for file %s...\n",fd->docName().data());
+ }
+ auto processFile = [ctx]() {
+ StringVector filesInSameTu;
+ ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
+ if (ctx->generateSourceFile) // sources need to be shown in the output
+ {
+ ctx->fd->writeSourceBody(ctx->ol,nullptr);
+ }
+ else if (!ctx->fd->isReference() && Doxygen::parseSourcesNeeded)
+ // we needed to parse the sources even if we do not show them
+ {
+ ctx->fd->parseSource(nullptr);
+ }
+ return ctx;
+ };
+ results.emplace_back(threadPool.queue(processFile));
+ }
+ }
+ for (auto &f : results)
+ {
+ auto ctx = f.get();
+ if (ctx->generateSourceFile)
{
- QStrList filesInSameTu;
- fd->startParsing();
+ ctx->fd->writeSourceFooter(ctx->ol);
+ }
+ }
+#else // single threaded version
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
+ {
+ for (const auto &fd : *fn)
+ {
+ StringVector filesInSameTu;
+ fd->getAllIncludeFilesRecursively(filesInSameTu);
if (fd->generateSourceFile() && !Htags::useHtags && !g_useOutputTemplate) // sources need to be shown in the output
{
msg("Generating code for file %s...\n",fd->docName().data());
- fd->writeSource(*g_outputList,FALSE,filesInSameTu);
-
+ fd->writeSourceHeader(*g_outputList);
+ fd->writeSourceBody(*g_outputList,nullptr);
+ fd->writeSourceFooter(*g_outputList);
}
else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
// we needed to parse the sources even if we do not show them
{
msg("Parsing code for file %s...\n",fd->docName().data());
- fd->parseSource(FALSE,filesInSameTu);
+ fd->parseSource(nullptr);
}
- fd->finishParsing();
}
}
+#endif
}
}
}
@@ -7710,15 +7909,11 @@ static void generateFileDocs()
{
if (documentedHtmlFiles==0) return;
- if (Doxygen::inputNameList->count()>0)
+ if (!Doxygen::inputNameLinkedMap->empty())
{
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
bool doc = fd->isLinkableInProject();
if (doc)
@@ -7736,36 +7931,28 @@ static void generateFileDocs()
static void addSourceReferences()
{
// add source references for class definitions
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
FileDef *fd=cd->getBodyDef();
- if (fd && cd->isLinkableInProject() && cd->getStartBodyLine()!=-1)
+ if (fd && cd->isLinkableInProject() && cd->getStartDefLine()!=-1)
{
- fd->addSourceRef(cd->getStartBodyLine(),cd,0);
+ fd->addSourceRef(cd->getStartDefLine(),cd.get(),0);
}
}
// add source references for namespace definitions
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd=0;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
FileDef *fd=nd->getBodyDef();
- if (fd && nd->isLinkableInProject() && nd->getStartBodyLine()!=-1)
+ if (fd && nd->isLinkableInProject() && nd->getStartDefLine()!=-1)
{
- fd->addSourceRef(nd->getStartBodyLine(),nd,0);
+ fd->addSourceRef(nd->getStartDefLine(),nd.get(),0);
}
}
// add source references for member names
- MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
- MemberName *mn=0;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
+ for (const auto &mn : *Doxygen::memberNameLinkedMap)
{
- MemberNameIterator mni(*mn);
- MemberDef *md=0;
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
//printf("class member %s: def=%s body=%d link?=%d\n",
// md->name().data(),
@@ -7773,23 +7960,20 @@ static void addSourceReferences()
// md->getStartBodyLine(),md->isLinkableInProject());
FileDef *fd=md->getBodyDef();
if (fd &&
- md->getStartBodyLine()!=-1 &&
+ md->getStartDefLine()!=-1 &&
md->isLinkableInProject() &&
(fd->generateSourceFile() || Doxygen::parseSourcesNeeded)
)
{
//printf("Found member '%s' in file '%s' at line '%d' def=%s\n",
// md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data());
- fd->addSourceRef(md->getStartBodyLine(),md->getOuterScope(),md);
+ fd->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
}
}
}
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
- for (fnli.toFirst();(mn=fnli.current());++fnli)
+ for (const auto &mn : *Doxygen::functionNameLinkedMap)
{
- MemberNameIterator mni(*mn);
- MemberDef *md=0;
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
FileDef *fd=md->getBodyDef();
//printf("member %s body=[%d,%d] fd=%p link=%d parseSources=%d\n",
@@ -7798,14 +7982,51 @@ static void addSourceReferences()
// md->isLinkableInProject(),
// Doxygen::parseSourcesNeeded);
if (fd &&
- md->getStartBodyLine()!=-1 &&
+ md->getStartDefLine()!=-1 &&
md->isLinkableInProject() &&
(fd->generateSourceFile() || Doxygen::parseSourcesNeeded)
)
{
//printf("Found member '%s' in file '%s' at line '%d' def=%s\n",
// md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data());
- fd->addSourceRef(md->getStartBodyLine(),md->getOuterScope(),md);
+ fd->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+// add the macro definitions found during preprocessing as file members
+static void buildDefineList()
+{
+ for (const auto &s : g_inputFiles)
+ {
+ auto it = Doxygen::macroDefinitions.find(s);
+ if (it!=Doxygen::macroDefinitions.end())
+ {
+ for (const auto &def : it->second)
+ {
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
+ def.fileName,def.lineNr,def.columnNr,
+ "#define",def.name,def.args,0,
+ Public,Normal,FALSE,Member,MemberType_Define,
+ ArgumentList(),ArgumentList(),"") };
+
+ if (!def.args.isEmpty())
+ {
+ md->moveArgumentList(stringToArgumentList(SrcLangExt_Cpp, def.args));
+ }
+ md->setInitializer(def.definition);
+ md->setFileDef(def.fileDef);
+ md->setDefinition("#define "+def.name);
+
+ MemberName *mn=Doxygen::functionNameLinkedMap->add(def.name);
+ if (def.fileDef)
+ {
+ def.fileDef->insertMember(md.get());
+ }
+ mn->push_back(std::move(md));
}
}
}
@@ -7816,38 +8037,36 @@ static void addSourceReferences()
static void sortMemberLists()
{
// sort class member lists
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- cd->sortMemberLists();
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
+ {
+ cdm->sortMemberLists();
+ }
}
// sort namespace member lists
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd=0;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- nd->sortMemberLists();
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm)
+ {
+ ndm->sortMemberLists();
+ }
}
// sort file member lists
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
fd->sortMemberLists();
}
}
// sort group member lists
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
gd->sortMemberLists();
}
@@ -7855,77 +8074,70 @@ static void sortMemberLists()
//----------------------------------------------------------------------------
-static void setAnonymousEnumType()
+static bool isSymbolHidden(const Definition *d)
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- cd->setAnonymousEnumType();
- }
-
-#if 0
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd=0;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- nd->setAnonymousEnumType();
- }
+ bool hidden = d->isHidden();
+ const Definition *parent = d->getOuterScope();
+ return parent ? hidden || isSymbolHidden(parent) : hidden;
+}
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+static void computeTooltipTexts()
+{
+ for (const auto &kv : Doxygen::symbolMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ DefinitionMutable *dm = toDefinitionMutable(kv.second);
+ if (dm && !isSymbolHidden(toDefinition(dm)) && toDefinition(dm)->isLinkableInProject())
{
- fd->setAnonymousEnumType();
+ dm->computeTooltip();
}
}
+}
+
+//----------------------------------------------------------------------------
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+static void setAnonymousEnumType()
+{
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- gd->setAnonymousEnumType();
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
+ {
+ cdm->setAnonymousEnumType();
+ }
}
-#endif
}
//----------------------------------------------------------------------------
static void countMembers()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- cd->countMembers();
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
+ {
+ cdm->countMembers();
+ }
}
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd=0;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- nd->countMembers();
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm)
+ {
+ ndm->countMembers();
+ }
}
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
fd->countMembers();
}
}
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
gd->countMembers();
}
@@ -7935,12 +8147,11 @@ static void countMembers()
//----------------------------------------------------------------------------
// generate the documentation of all classes
-static void generateClassList(ClassSDict &classSDict)
+static void generateClassList(const ClassLinkedMap &classList)
{
- ClassSDict::Iterator cli(classSDict);
- for ( ; cli.current() ; ++cli )
+ for (const auto &cdi : classList)
{
- ClassDef *cd=cli.current();
+ ClassDefMutable *cd=toClassDefMutable(cdi.get());
//printf("cd=%s getOuterScope=%p global=%p\n",cd->name().data(),cd->getOuterScope(),Doxygen::globalScope);
if (cd &&
@@ -7966,25 +8177,22 @@ static void generateClassList(ClassSDict &classSDict)
static void generateClassDocs()
{
- generateClassList(*Doxygen::classSDict);
- generateClassList(*Doxygen::hiddenClasses);
+ generateClassList(*Doxygen::classLinkedMap);
+ generateClassList(*Doxygen::hiddenClassLinkedMap);
}
//----------------------------------------------------------------------------
static void inheritDocumentation()
{
- MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
- MemberName *mn;
- //int count=0;
- for (;(mn=mnli.current());++mnli)
+ for (const auto &mn : *Doxygen::memberNameLinkedMap)
{
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (;(md=mni.current());++mni)
+ for (const auto &imd : *mn)
{
- //printf("%04d Member '%s'\n",count++,md->name().data());
- if (md->documentation().isEmpty() && md->briefDescription().isEmpty())
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ //static int count=0;
+ //printf("%04d Member '%s'\n",count++,md->qualifiedName().data());
+ if (md && md->documentation().isEmpty() && md->briefDescription().isEmpty())
{ // no documentation yet
MemberDef *bmd = md->reimplements();
while (bmd && bmd->documentation().isEmpty() &&
@@ -8013,37 +8221,23 @@ static void inheritDocumentation()
static void combineUsingRelations()
{
// for each file
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
- {
- fd->setVisited(FALSE);
- }
- }
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
fd->combineUsingRelations();
}
}
// for each namespace
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for (nli.toFirst() ; (nd=nli.current()) ; ++nli )
+ NamespaceDefSet visitedNamespaces;
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- nd->setVisited(FALSE);
- }
- for (nli.toFirst() ; (nd=nli.current()) ; ++nli )
- {
- nd->combineUsingRelations();
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm)
+ {
+ ndm->combineUsingRelations(visitedNamespaces);
+ }
}
}
@@ -8052,35 +8246,33 @@ static void combineUsingRelations()
static void addMembersToMemberGroup()
{
// for each class
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- cd->addMembersToMemberGroup();
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
+ {
+ cdm->addMembersToMemberGroup();
+ }
}
// for each file
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
fd->addMembersToMemberGroup();
}
}
// for each namespace
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for ( ; (nd=nli.current()) ; ++nli )
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- nd->addMembersToMemberGroup();
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm)
+ {
+ ndm->addMembersToMemberGroup();
+ }
}
// for each group
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
gd->addMembersToMemberGroup();
}
@@ -8091,35 +8283,33 @@ static void addMembersToMemberGroup()
static void distributeMemberGroupDocumentation()
{
// for each class
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- cd->distributeMemberGroupDocumentation();
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
+ {
+ cdm->distributeMemberGroupDocumentation();
+ }
}
// for each file
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
fd->distributeMemberGroupDocumentation();
}
}
// for each namespace
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for ( ; (nd=nli.current()) ; ++nli )
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- nd->distributeMemberGroupDocumentation();
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm)
+ {
+ ndm->distributeMemberGroupDocumentation();
+ }
}
// for each group
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
gd->distributeMemberGroupDocumentation();
}
@@ -8130,42 +8320,38 @@ static void distributeMemberGroupDocumentation()
static void findSectionsInDocumentation()
{
// for each class
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- cd->findSectionsInDocumentation();
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm)
+ {
+ cdm->findSectionsInDocumentation();
+ }
}
// for each file
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
fd->findSectionsInDocumentation();
}
}
// for each namespace
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for ( ; (nd=nli.current()) ; ++nli )
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- nd->findSectionsInDocumentation();
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm)
+ {
+ ndm->findSectionsInDocumentation();
+ }
}
// for each group
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
gd->findSectionsInDocumentation();
}
// for each page
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
pd->findSectionsInDocumentation();
}
@@ -8178,43 +8364,47 @@ static void flushCachedTemplateRelations()
// as there can be new template instances in the inheritance path
// to this class. Optimization: only remove those classes that
// have inheritance instances as direct or indirect sub classes.
- QCacheIterator<LookupInfo> ci(*Doxygen::lookupCache);
- LookupInfo *li=0;
- for (ci.toFirst();(li=ci.current());++ci)
+ StringVector elementsToRemove;
+ for (const auto &ci : *Doxygen::lookupCache)
{
- if (li->classDef)
+ const LookupInfo &li = ci.second;
+ if (li.classDef)
{
- Doxygen::lookupCache->remove(ci.currentKey());
+ elementsToRemove.push_back(ci.first);
}
}
+ for (const auto &k : elementsToRemove)
+ {
+ Doxygen::lookupCache->remove(k);
+ }
+
// remove all cached typedef resolutions whose target is a
// template class as this may now be a template instance
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
- MemberName *fn;
- for (;(fn=fnli.current());++fnli) // for each global function name
+ // for each global function name
+ for (const auto &fn : *Doxygen::functionNameLinkedMap)
{
- MemberNameIterator fni(*fn);
- MemberDef *fmd;
- for (;(fmd=fni.current());++fni) // for each function with that name
+ // for each function with that name
+ for (const auto &ifmd : *fn)
{
- if (fmd->isTypedefValCached())
+ MemberDefMutable *fmd = toMemberDefMutable(ifmd.get());
+ if (fmd && fmd->isTypedefValCached())
{
const ClassDef *cd = fmd->getCachedTypedefVal();
if (cd->isTemplate()) fmd->invalidateTypedefValCache();
}
}
}
- MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
- for (;(fn=mnli.current());++mnli) // for each class method name
+ // for each class method name
+ for (const auto &nm : *Doxygen::memberNameLinkedMap)
{
- MemberNameIterator mni(*fn);
- MemberDef *fmd;
- for (;(fmd=mni.current());++mni) // for each function with that name
+ // for each function with that name
+ for (const auto &imd : *nm)
{
- if (fmd->isTypedefValCached())
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md && md->isTypedefValCached())
{
- const ClassDef *cd = fmd->getCachedTypedefVal();
- if (cd->isTemplate()) fmd->invalidateTypedefValCache();
+ const ClassDef *cd = md->getCachedTypedefVal();
+ if (cd->isTemplate()) md->invalidateTypedefValCache();
}
}
}
@@ -8233,36 +8423,45 @@ static void flushUnresolvedRelations()
// class A { class I {} };
// class B : public A {};
// class C : public B::I {};
- //
- QCacheIterator<LookupInfo> ci(*Doxygen::lookupCache);
- LookupInfo *li=0;
- for (ci.toFirst();(li=ci.current());++ci)
+
+ StringVector elementsToRemove;
+ for (const auto &ci : *Doxygen::lookupCache)
{
- if (li->classDef==0 && li->typeDef==0)
+ const LookupInfo &li = ci.second;
+ if (li.classDef==0 && li.typeDef==0)
{
- Doxygen::lookupCache->remove(ci.currentKey());
+ elementsToRemove.push_back(ci.first);
}
}
+ for (const auto &k : elementsToRemove)
+ {
+ Doxygen::lookupCache->remove(k);
+ }
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
- MemberName *fn;
- for (;(fn=fnli.current());++fnli) // for each global function name
+ // for each global function name
+ for (const auto &fn : *Doxygen::functionNameLinkedMap)
{
- MemberNameIterator fni(*fn);
- MemberDef *fmd;
- for (;(fmd=fni.current());++fni) // for each function with that name
+ // for each function with that name
+ for (const auto &ifmd : *fn)
{
- fmd->invalidateCachedArgumentTypes();
+ MemberDefMutable *fmd = toMemberDefMutable(ifmd.get());
+ if (fmd)
+ {
+ fmd->invalidateCachedArgumentTypes();
+ }
}
}
- MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
- for (;(fn=mnli.current());++mnli) // for each class method name
+ // for each class method name
+ for (const auto &nm : *Doxygen::memberNameLinkedMap)
{
- MemberNameIterator mni(*fn);
- MemberDef *fmd;
- for (;(fmd=mni.current());++mni) // for each function with that name
+ // for each function with that name
+ for (const auto &imd : *nm)
{
- fmd->invalidateCachedArgumentTypes();
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md)
+ {
+ md->invalidateCachedArgumentTypes();
+ }
}
}
@@ -8281,42 +8480,32 @@ static void findDefineDocumentation(Entry *root)
if (root->tagInfo() && !root->name.isEmpty()) // define read from a tag file
{
- MemberDef *md=createMemberDef(root->tagInfo()->tagName,1,1,
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(root->tagInfo()->tagName,1,1,
"#define",root->name,root->args,0,
Public,Normal,FALSE,Member,MemberType_Define,
- ArgumentList(),ArgumentList(),"");
+ ArgumentList(),ArgumentList(),"") };
md->setTagInfo(root->tagInfo());
md->setLanguage(root->lang);
//printf("Searching for '%s' fd=%p\n",filePathName.data(),fd);
md->setFileDef(root->parent()->fileDef());
//printf("Adding member=%s\n",md->name().data());
- MemberName *mn;
- if ((mn=Doxygen::functionNameSDict->find(root->name)))
- {
- mn->append(md);
- }
- else
- {
- mn = new MemberName(root->name);
- mn->append(md);
- Doxygen::functionNameSDict->append(root->name,mn);
- }
+ MemberName *mn = Doxygen::functionNameLinkedMap->add(root->name);
+ mn->push_back(std::move(md));
}
- MemberName *mn=Doxygen::functionNameSDict->find(root->name);
+ MemberName *mn=Doxygen::functionNameLinkedMap->find(root->name);
if (mn)
{
- MemberNameIterator mni(*mn);
- MemberDef *md;
int count=0;
- for (;(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
if (md->memberType()==MemberType_Define) count++;
}
if (count==1)
{
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &imd : *mn)
{
- if (md->memberType()==MemberType_Define)
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md && md->memberType()==MemberType_Define)
{
md->setDocumentation(root->doc,root->docFile,root->docLine);
md->setDocsForDefinition(!root->proto);
@@ -8325,7 +8514,7 @@ static void findDefineDocumentation(Entry *root)
{
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
}
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setBodyDef(root->fileDef());
md->addSectionsToDefinition(root->anchors);
md->setMaxInitLines(root->initLines);
@@ -8344,32 +8533,23 @@ static void findDefineDocumentation(Entry *root)
// multiple defines don't know where to add docs
// but maybe they are in different files together with their documentation
{
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &imd : *mn)
{
- if (md->memberType()==MemberType_Define)
+ MemberDefMutable *md = toMemberDefMutable(imd.get());
+ if (md && md->memberType()==MemberType_Define)
{
const FileDef *fd=md->getFileDef();
if (fd && fd->absFilePath()==root->fileName)
// doc and define in the same file assume they belong together.
{
-#if 0
- if (md->documentation().isEmpty())
-#endif
- {
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setDocsForDefinition(!root->proto);
- }
-#if 0
- if (md->briefDescription().isEmpty())
-#endif
- {
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- }
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
if (md->inbodyDocumentation().isEmpty())
{
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
}
- md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
md->setBodyDef(root->fileDef());
md->addSectionsToDefinition(root->anchors);
md->setRefItems(root->sli);
@@ -8398,7 +8578,7 @@ static void findDefineDocumentation(Entry *root)
else
{
warn(root->fileName,root->startLine,
- "found documented #define but ignoring it because "
+ "found documented #define %s but ignoring it because "
"ENABLE_PREPROCESSING is NO.\n",
root->name.data()
);
@@ -8430,9 +8610,8 @@ static void findDirDocumentation(const Entry *root)
{
normalizedName+='/';
}
- DirDef *dir,*matchingDir=0;
- SDict<DirDef>::Iterator sdi(*Doxygen::directories);
- for (sdi.toFirst();(dir=sdi.current());++sdi)
+ DirDef *matchingDir=0;
+ for (const auto &dir : *Doxygen::dirLinkedMap)
{
//printf("Dir: %s<->%s\n",dir->name().data(),normalizedName.data());
if (dir->name().right(normalizedName.length())==normalizedName)
@@ -8448,7 +8627,7 @@ static void findDirDocumentation(const Entry *root)
}
else
{
- matchingDir=dir;
+ matchingDir=dir.get();
}
}
}
@@ -8506,48 +8685,52 @@ static void findMainPage(Entry *root)
{
if (Doxygen::mainPage==0 && root->tagInfo()==0)
{
+ //printf("mainpage: docLine=%d startLine=%d\n",root->docLine,root->startLine);
//printf("Found main page! \n======\n%s\n=======\n",root->doc.data());
QCString title=root->args.stripWhiteSpace();
//QCString indexName=Config_getBool(GENERATE_TREEVIEW)?"main":"index";
QCString indexName="index";
- Doxygen::mainPage = createPageDef(root->docFile,root->docLine,
- indexName, root->brief+root->doc+root->inbodyDocs,title);
+ Doxygen::mainPage.reset(createPageDef(root->docFile,root->docLine,
+ indexName, root->brief+root->doc+root->inbodyDocs,title));
//setFileNameForSections(root->anchors,"index",Doxygen::mainPage);
Doxygen::mainPage->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ Doxygen::mainPage->setBodySegment(root->startLine,root->startLine,-1);
Doxygen::mainPage->setFileName(indexName);
Doxygen::mainPage->setLocalToc(root->localToc);
- addPageToContext(Doxygen::mainPage,root);
+ addPageToContext(Doxygen::mainPage.get(),root);
- SectionInfo *si = Doxygen::sectionDict->find(Doxygen::mainPage->name());
+ const SectionInfo *si = SectionManager::instance().find(Doxygen::mainPage->name());
if (si)
{
- if (si->lineNr != -1)
+ if (si->lineNr() != -1)
{
- warn(root->fileName,root->startLine,"multiple use of section label '%s' for main page, (first occurrence: %s, line %d)",Doxygen::mainPage->name().data(),si->fileName.data(),si->lineNr);
+ warn(root->fileName,root->startLine,"multiple use of section label '%s' for main page, (first occurrence: %s, line %d)",
+ Doxygen::mainPage->name().data(),si->fileName().data(),si->lineNr());
}
else
{
- warn(root->fileName,root->startLine,"multiple use of section label '%s' for main page, (first occurrence: %s)",Doxygen::mainPage->name().data(),si->fileName.data());
+ warn(root->fileName,root->startLine,"multiple use of section label '%s' for main page, (first occurrence: %s)",
+ Doxygen::mainPage->name().data(),si->fileName().data());
}
}
else
{
// a page name is a label as well! but should no be double either
- si=new SectionInfo(
- indexName, root->startLine,
+ SectionManager::instance().add(
Doxygen::mainPage->name(),
+ indexName,
+ root->startLine,
Doxygen::mainPage->title(),
- SectionInfo::Page,
+ SectionType::Page,
0); // level 0
- Doxygen::sectionDict->append(indexName,si);
- Doxygen::mainPage->addSectionsToDefinition(root->anchors);
}
+ Doxygen::mainPage->addSectionsToDefinition(root->anchors);
}
else if (root->tagInfo()==0)
{
warn(root->fileName,root->startLine,
"found more than one \\mainpage comment block! (first occurrence: %s, line %d), Skipping current block!",
- Doxygen::mainPage->docFile().data(),Doxygen::mainPage->docLine());
+ Doxygen::mainPage->docFile().data(),Doxygen::mainPage->getStartBodyLine());
}
}
for (const auto &e : root->children()) findMainPage(e.get());
@@ -8575,13 +8758,13 @@ static void computePageRelations(Entry *root)
)
{
PageDef *pd = root->section==Entry::PAGEDOC_SEC ?
- Doxygen::pageSDict->find(root->name) :
- Doxygen::mainPage;
+ Doxygen::pageLinkedMap->find(root->name) :
+ Doxygen::mainPage.get();
if (pd)
{
for (const BaseInfo &bi : root->extends)
{
- PageDef *subPd = Doxygen::pageSDict->find(bi.name);
+ PageDef *subPd = Doxygen::pageLinkedMap->find(bi.name);
if (pd==subPd)
{
term("page defined at line %d of file %s with label %s is a direct "
@@ -8602,14 +8785,12 @@ static void computePageRelations(Entry *root)
static void checkPageRelations()
{
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
Definition *ppd = pd->getOuterScope();
while (ppd)
{
- if (ppd==pd)
+ if (ppd==pd.get())
{
term("page defined at line %d of file %s with label %s is a subpage "
"of itself! Please remove this cyclic dependency.\n",
@@ -8624,9 +8805,7 @@ static void checkPageRelations()
static void resolveUserReferences()
{
- SDict<SectionInfo>::Iterator sdi(*Doxygen::sectionDict);
- SectionInfo *si;
- for (;(si=sdi.current());++sdi)
+ for (const auto &si : SectionManager::instance())
{
//printf("si->label='%s' si->definition=%s si->fileName='%s'\n",
// si->label.data(),si->definition?si->definition->name().data():"<none>",
@@ -8638,44 +8817,42 @@ static void resolveUserReferences()
// name (not from the todo/test/bug/deprecated list, but from the file in
// which they are defined). We correct this here by looking at the
// generated section labels!
- QDictIterator<RefList> rli(*Doxygen::xrefLists);
- RefList *rl;
- for (rli.toFirst();(rl=rli.current());++rli)
+ for (const RefListManager::Ptr &rl : RefListManager::instance())
{
QCString label="_"+rl->listName(); // "_todo", "_test", ...
- if (si->label.left(label.length())==label)
+ if (si->label().left(label.length())==label)
{
- si->fileName=rl->listName();
- si->generated=TRUE;
+ si->setFileName(rl->listName());
+ si->setGenerated(TRUE);
break;
}
}
//printf("start: si->label=%s si->fileName=%s\n",si->label.data(),si->fileName.data());
- if (!si->generated)
+ if (!si->generated())
{
// if this section is in a page and the page is in a group, then we
// have to adjust the link file name to point to the group.
- if (!si->fileName.isEmpty() &&
- (pd=Doxygen::pageSDict->find(si->fileName)) &&
+ if (!si->fileName().isEmpty() &&
+ (pd=Doxygen::pageLinkedMap->find(si->fileName())) &&
pd->getGroupDef())
{
- si->fileName=pd->getGroupDef()->getOutputFileBase().copy();
+ si->setFileName(pd->getGroupDef()->getOutputFileBase());
}
- if (si->definition)
+ if (si->definition())
{
// TODO: there should be one function in Definition that returns
// the file to link to, so we can avoid the following tests.
const GroupDef *gd=0;
- if (si->definition->definitionType()==Definition::TypeMember)
+ if (si->definition()->definitionType()==Definition::TypeMember)
{
- gd = (dynamic_cast<MemberDef *>(si->definition))->getGroupDef();
+ gd = (toMemberDef(si->definition()))->getGroupDef();
}
if (gd)
{
- si->fileName=gd->getOutputFileBase().copy();
+ si->setFileName(gd->getOutputFileBase());
}
else
{
@@ -8696,11 +8873,9 @@ static void resolveUserReferences()
static void generatePageDocs()
{
- //printf("documentedPages=%d real=%d\n",documentedPages,Doxygen::pageSDict->count());
+ //printf("documentedPages=%d real=%d\n",documentedPages,Doxygen::pageLinkedMap->count());
if (documentedPages==0) return;
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
if (!pd->getGroupDef() && !pd->isReference())
{
@@ -8719,7 +8894,7 @@ static void buildExampleList(Entry *root)
{
if ((root->section==Entry::EXAMPLE_SEC || root->section==Entry::EXAMPLE_LINENO_SEC) && !root->name.isEmpty())
{
- if (Doxygen::exampleSDict->find(root->name))
+ if (Doxygen::exampleLinkedMap->find(root->name))
{
warn(root->fileName,root->startLine,
"Example %s was already documented. Ignoring "
@@ -8729,15 +8904,16 @@ static void buildExampleList(Entry *root)
}
else
{
- PageDef *pd=createPageDef(root->fileName,root->startLine,
- root->name,root->brief+root->doc+root->inbodyDocs,root->args);
+ PageDef *pd = Doxygen::exampleLinkedMap->add(root->name,
+ std::unique_ptr<PageDef>(
+ createPageDef(root->fileName,root->startLine,
+ root->name,root->brief+root->doc+root->inbodyDocs,root->args)));
pd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
pd->setFileName(convertNameToFile(pd->name()+"-example",FALSE,TRUE));
pd->addSectionsToDefinition(root->anchors);
pd->setLanguage(root->lang);
pd->setShowLineNo(root->section==Entry::EXAMPLE_LINENO_SEC);
- Doxygen::exampleSDict->inSort(root->name,pd);
//we don't add example to groups
//addExampleToGroups(root,pd);
}
@@ -8769,13 +8945,11 @@ void printNavTree(Entry *root,int indent)
static void generateExampleDocs()
{
g_outputList->disable(OutputGenerator::Man);
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::exampleLinkedMap)
{
msg("Generating docs for example %s...\n",pd->name().data());
- CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(".c"); // TODO: do this on code type
- intf.resetCodeParserState();
+ auto intf = Doxygen::parserManager->getCodeParser(".c"); // TODO: do this on code type
+ intf->resetCodeParserState();
QCString n=pd->getOutputFileBase();
startFile(*g_outputList,n,n,pd->name());
startTitle(*g_outputList,n);
@@ -8787,14 +8961,17 @@ static void generateExampleDocs()
{
lineNoOptStr="{lineno}";
}
- g_outputList->generateDoc(pd->docFile(), // file
+ g_outputList->generateDoc(pd->docFile(), // file
pd->docLine(), // startLine
- pd, // context
+ pd.get(), // context
0, // memberDef
pd->documentation()+"\n\n\\include"+lineNoOptStr+" "+pd->name(), // docs
TRUE, // index words
TRUE, // is example
- pd->name()
+ pd->name(),
+ FALSE,
+ FALSE,
+ Config_getBool(MARKDOWN_SUPPORT)
);
endFile(*g_outputList); // contains g_outputList->endContents()
}
@@ -8806,9 +8983,7 @@ static void generateExampleDocs()
static void generateGroupDocs()
{
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (!gd->isReference())
{
@@ -8837,26 +9012,28 @@ static void generateGroupDocs()
//----------------------------------------------------------------------------
// generate module pages
-static void generateNamespaceClassDocs(ClassSDict *d)
+static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
{
// for each class in the namespace...
- ClassSDict::Iterator cli(*d);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
- {
- if ( ( cd->isLinkableInProject() &&
- cd->templateMaster()==0
- ) // skip external references, anonymous compounds and
- // template instances and nested classes
- && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
- )
+ for (const auto &cd : classList)
+ {
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm)
{
- msg("Generating docs for compound %s...\n",cd->name().data());
+ if ( ( cd->isLinkableInProject() &&
+ cd->templateMaster()==0
+ ) // skip external references, anonymous compounds and
+ // template instances and nested classes
+ && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
+ )
+ {
+ msg("Generating docs for compound %s...\n",cd->name().data());
- cd->writeDocumentation(*g_outputList);
- cd->writeMemberList(*g_outputList);
+ cdm->writeDocumentation(*g_outputList);
+ cdm->writeMemberList(*g_outputList);
+ }
+ cdm->writeDocumentationForInnerClasses(*g_outputList);
}
- cd->writeDocumentationForInnerClasses(*g_outputList);
}
}
@@ -8866,24 +9043,25 @@ static void generateNamespaceDocs()
//writeNamespaceIndex(*g_outputList);
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
// for each namespace...
- for (;(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
-
if (nd->isLinkableInProject())
{
- msg("Generating docs for namespace %s\n",nd->name().data());
- nd->writeDocumentation(*g_outputList);
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm)
+ {
+ msg("Generating docs for namespace %s\n",nd->name().data());
+ ndm->writeDocumentation(*g_outputList);
+ }
}
- generateNamespaceClassDocs(nd->getClassSDict());
+ generateNamespaceClassDocs(nd->getClasses());
if (sliceOpt)
{
- generateNamespaceClassDocs(nd->getInterfaceSDict());
- generateNamespaceClassDocs(nd->getStructSDict());
- generateNamespaceClassDocs(nd->getExceptionSDict());
+ generateNamespaceClassDocs(nd->getInterfaces());
+ generateNamespaceClassDocs(nd->getStructs());
+ generateNamespaceClassDocs(nd->getExceptions());
}
}
}
@@ -9018,10 +9196,10 @@ static void readTagFile(const std::shared_ptr<Entry> &root,const char *tl)
//----------------------------------------------------------------------------
static void copyLatexStyleSheet()
{
- QStrList latexExtraStyleSheet = Config_getList(LATEX_EXTRA_STYLESHEET);
- for (uint i=0; i<latexExtraStyleSheet.count(); ++i)
+ const StringVector &latexExtraStyleSheet = Config_getList(LATEX_EXTRA_STYLESHEET);
+ for (const auto &sheet : latexExtraStyleSheet)
{
- QCString fileName(latexExtraStyleSheet.at(i));
+ QCString fileName = sheet.c_str();
if (!fileName.isEmpty())
{
QFileInfo fi(fileName);
@@ -9032,9 +9210,9 @@ static void copyLatexStyleSheet()
else
{
QCString destFileName = Config_getString(LATEX_OUTPUT)+"/"+fi.fileName().data();
- if (!checkExtension(fi.fileName().data(), latexStyleExtension))
+ if (!checkExtension(fi.fileName().data(), LATEX_STYLE_EXTENSION))
{
- destFileName += latexStyleExtension;
+ destFileName += LATEX_STYLE_EXTENSION;
}
copyFile(fileName, destFileName);
}
@@ -9045,14 +9223,14 @@ static void copyLatexStyleSheet()
//----------------------------------------------------------------------------
static void copyStyleSheet()
{
- QCString &htmlStyleSheet = Config_getString(HTML_STYLESHEET);
+ QCString htmlStyleSheet = Config_getString(HTML_STYLESHEET);
if (!htmlStyleSheet.isEmpty())
{
QFileInfo fi(htmlStyleSheet);
if (!fi.exists())
{
err("Style sheet '%s' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet.data());
- htmlStyleSheet.resize(0); // revert to the default
+ htmlStyleSheet = Config_updateString(HTML_STYLESHEET,""); // revert to the default
}
else
{
@@ -9060,10 +9238,10 @@ static void copyStyleSheet()
copyFile(htmlStyleSheet,destFileName);
}
}
- QStrList htmlExtraStyleSheet = Config_getList(HTML_EXTRA_STYLESHEET);
- for (uint i=0; i<htmlExtraStyleSheet.count(); ++i)
+ const StringVector &htmlExtraStyleSheet = Config_getList(HTML_EXTRA_STYLESHEET);
+ for (const auto &sheet : htmlExtraStyleSheet)
{
- QCString fileName(htmlExtraStyleSheet.at(i));
+ QCString fileName = sheet.c_str();
if (!fileName.isEmpty())
{
QFileInfo fi(fileName);
@@ -9086,14 +9264,14 @@ static void copyStyleSheet()
static void copyLogo(const QCString &outputOption)
{
- QCString &projectLogo = Config_getString(PROJECT_LOGO);
+ QCString projectLogo = Config_getString(PROJECT_LOGO);
if (!projectLogo.isEmpty())
{
QFileInfo fi(projectLogo);
if (!fi.exists())
{
err("Project logo '%s' specified by PROJECT_LOGO does not exist!\n",projectLogo.data());
- projectLogo.resize(0); // revert to the default
+ projectLogo = Config_updateString(PROJECT_LOGO,""); // revert to the default
}
else
{
@@ -9104,13 +9282,11 @@ static void copyLogo(const QCString &outputOption)
}
}
-static void copyExtraFiles(QStrList files,const QCString &filesOption,const QCString &outputOption)
+static void copyExtraFiles(const StringVector &files,const QCString &filesOption,const QCString &outputOption)
{
- uint i;
- for (i=0; i<files.count(); ++i)
+ for (const auto &file : files)
{
- QCString fileName(files.at(i));
-
+ QCString fileName = file.c_str();
if (!fileName.isEmpty())
{
QFileInfo fi(fileName);
@@ -9130,7 +9306,84 @@ static void copyExtraFiles(QStrList files,const QCString &filesOption,const QCSt
//----------------------------------------------------------------------------
-static OutlineParserInterface &getParserForFile(const char *fn)
+static void generateDiskNames()
+{
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
+ {
+ struct FileEntry
+ {
+ FileEntry(const QCString &p,FileDef *fd) : path(p), fileDef(fd) {}
+ QCString path;
+ FileDef *fileDef;
+ };
+
+ // collect the entry for which to compute the longest common prefix (LCP) of the path
+ std::vector<FileEntry> fileEntries;
+ for (const auto &fd : *fn)
+ {
+ if (!fd->isReference()) // skip external references
+ {
+ fileEntries.emplace_back(fd->getPath(),fd.get());
+ }
+ }
+
+ size_t size = fileEntries.size();
+
+ if (size==1) // name if unique, so diskname is simply the name
+ {
+ FileDef *fd = fileEntries[0].fileDef;
+ fd->setDiskName(fn->fileName());
+ }
+ else if (size>1) // multiple occurrences of the same file name
+ {
+ // sort the array
+ std::sort(fileEntries.begin(),
+ fileEntries.end(),
+ [](const FileEntry &fe1,const FileEntry &fe2)
+ { return qstrcmp(fe1.path.data(),fe2.path.data())<0; }
+ );
+
+ // since the entries are sorted, the common prefix of the whole array is same
+ // as the common prefix between the first and last entry
+ const FileEntry &first = fileEntries[0];
+ const FileEntry &last = fileEntries[size-1];
+ int first_path_size = static_cast<int>(first.path.size())-1; // -1 to skip trailing slash
+ int last_path_size = static_cast<int>(last.path.size())-1; // -1 to skip trailing slash
+ int j=0;
+ int i=0;
+ for (i=0;i<first_path_size && i<last_path_size;i++)
+ {
+ if (first.path[i]=='/') j=i;
+ if (first.path[i]!=last.path[i]) break;
+ }
+ if (i==first_path_size && i<last_path_size && last.path[i]=='/')
+ {
+ // case first='some/path' and last='some/path/more' => match is 'some/path'
+ j=first_path_size;
+ }
+ else if (i==last_path_size && i<first_path_size && first.path[i]=='/')
+ {
+ // case first='some/path/more' and last='some/path' => match is 'some/path'
+ j=last_path_size;
+ }
+
+ // add non-common part of the path to the name
+ for (auto &fileEntry : fileEntries)
+ {
+ QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
+ fileEntry.fileDef->setName(prefix+fn->fileName());
+ //printf("!!!!!!!! non unique disk name=%s:%s\n",prefix.data(),fn->fileName());
+ fileEntry.fileDef->setDiskName(prefix+fn->fileName());
+ }
+ }
+ }
+}
+
+
+
+//----------------------------------------------------------------------------
+
+static std::unique_ptr<OutlineParserInterface> getParserForFile(const char *fn)
{
QCString fileName=fn;
QCString extension;
@@ -9148,15 +9401,10 @@ static OutlineParserInterface &getParserForFile(const char *fn)
return Doxygen::parserManager->getOutlineParser(extension);
}
-static void parseFile(OutlineParserInterface &parser,
- const std::shared_ptr<Entry> &root,FileDef *fd,const char *fn,
- bool sameTu,QStrList &filesInSameTu)
+static std::shared_ptr<Entry> parseFile(OutlineParserInterface &parser,
+ FileDef *fd,const char *fn,
+ ClangTUParser *clangParser,bool newTU)
{
-#if USE_LIBCLANG
- static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
-#else
- static bool clangAssistedParsing = FALSE;
-#endif
QCString fileName=fn;
QCString extension;
int ei = fileName.findRev('.');
@@ -9175,10 +9423,16 @@ static void parseFile(OutlineParserInterface &parser,
if (Config_getBool(ENABLE_PREPROCESSING) &&
parser.needsPreprocessing(extension))
{
+ Preprocessor preprocessor;
+ const StringVector &includePath = Config_getList(INCLUDE_PATH);
+ for (const auto &s : includePath)
+ {
+ preprocessor.addSearchDir(QFileInfo(s.c_str()).absFilePath().utf8());
+ }
BufStr inBuf(fi.size()+4096);
msg("Preprocessing %s...\n",fn);
readInputFile(fileName,inBuf);
- Doxygen::preprocessor->processFile(fileName,inBuf,preBuf);
+ preprocessor.processFile(fileName,inBuf,preBuf);
}
else // no preprocessing
{
@@ -9197,103 +9451,235 @@ static void parseFile(OutlineParserInterface &parser,
convBuf.addChar('\0');
- if (clangAssistedParsing && !sameTu)
- {
- fd->getAllIncludeFilesRecursively(filesInSameTu);
- }
-
std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
// use language parse to parse the file
- parser.parseInput(fileName,convBuf.data(),fileRoot,sameTu,filesInSameTu);
+ if (clangParser)
+ {
+ if (newTU) clangParser->parse();
+ clangParser->switchToFile(fd);
+ }
+ parser.parseInput(fileName,convBuf.data(),fileRoot,clangParser);
fileRoot->setFileDef(fd);
- root->moveToSubEntryAndKeep(fileRoot);
+ return fileRoot;
+}
+
+//! parse the list of input files
+static void parseFilesMultiThreading(const std::shared_ptr<Entry> &root)
+{
+#if USE_LIBCLANG
+ if (Doxygen::clangAssistedParsing)
+ {
+ StringUnorderedSet processedFiles;
+
+ // create a dictionary with files to process
+ StringUnorderedSet filesToProcess;
+ for (const auto &s : g_inputFiles)
+ {
+ filesToProcess.insert(s);
+ }
+
+ std::mutex processedFilesLock;
+ // process source files (and their include dependencies)
+ std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
+ if (numThreads==0)
+ {
+ numThreads = std::thread::hardware_concurrency();
+ }
+ msg("Processing input using %zu threads.\n",numThreads);
+ ThreadPool threadPool(numThreads);
+ using FutureType = std::vector< std::shared_ptr<Entry> >;
+ std::vector< std::future< FutureType > > results;
+ for (const auto &s : g_inputFiles)
+ {
+ bool ambig;
+ FileDef *fd=findFileDef(Doxygen::inputNameLinkedMap,s.c_str(),ambig);
+ ASSERT(fd!=0);
+ if (fd->isSource() && !fd->isReference()) // this is a source file
+ {
+ // lambda representing the work to executed by a thread
+ auto processFile = [s,&filesToProcess,&processedFilesLock,&processedFiles]() {
+ bool ambig_l;
+ std::vector< std::shared_ptr<Entry> > roots;
+ FileDef *fd_l = findFileDef(Doxygen::inputNameLinkedMap,s.c_str(),ambig_l);
+ auto clangParser = ClangParser::instance()->createTUParser(fd_l);
+ auto parser = getParserForFile(s.c_str());
+ auto fileRoot { parseFile(*parser.get(),fd_l,s.c_str(),clangParser.get(),true) };
+ roots.push_back(fileRoot);
+
+ // Now process any include files in the same translation unit
+ // first. When libclang is used this is much more efficient.
+ for (auto incFile : clangParser->filesInSameTU())
+ {
+ if (filesToProcess.find(incFile)!=filesToProcess.end())
+ {
+ bool needsToBeProcessed;
+ {
+ std::lock_guard<std::mutex> lock(processedFilesLock);
+ needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
+ if (needsToBeProcessed) processedFiles.insert(incFile);
+ }
+ if (incFile!=s && needsToBeProcessed)
+ {
+ FileDef *ifd=findFileDef(Doxygen::inputNameLinkedMap,incFile.c_str(),ambig_l);
+ if (ifd && !ifd->isReference())
+ {
+ //printf(" Processing %s in same translation unit as %s\n",incFile,s->c_str());
+ fileRoot = parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),false);
+ roots.push_back(fileRoot);
+ }
+ }
+ }
+ }
+ return roots;
+ };
+ // dispatch the work and collect the future results
+ results.emplace_back(threadPool.queue(processFile));
+ }
+ }
+ // synchronise with the Entry result lists produced and add them to the root
+ for (auto &f : results)
+ {
+ auto l = f.get();
+ for (auto &e : l)
+ {
+ root->moveToSubEntryAndKeep(e);
+ }
+ }
+ // process remaining files
+ results.clear();
+ for (const auto &s : g_inputFiles)
+ {
+ if (processedFiles.find(s)==processedFiles.end()) // not yet processed
+ {
+ // lambda representing the work to executed by a thread
+ auto processFile = [s]() {
+ bool ambig;
+ std::vector< std::shared_ptr<Entry> > roots;
+ FileDef *fd=findFileDef(Doxygen::inputNameLinkedMap,s.c_str(),ambig);
+ auto clangParser = ClangParser::instance()->createTUParser(fd);
+ auto parser { getParserForFile(s.c_str()) };
+ auto fileRoot = parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),true);
+ roots.push_back(fileRoot);
+ return roots;
+ };
+ // dispatch the work and collect the future results
+ results.emplace_back(threadPool.queue(processFile));
+ }
+ }
+ // synchronise with the Entry result lists produced and add them to the root
+ for (auto &f : results)
+ {
+ auto l = f.get();
+ for (auto &e : l)
+ {
+ root->moveToSubEntryAndKeep(e);
+ }
+ }
+ }
+ else // normal processing
+#endif
+ {
+ std::size_t numThreads = std::thread::hardware_concurrency();
+ msg("Processing input using %zu threads.\n",numThreads);
+ ThreadPool threadPool(numThreads);
+ using FutureType = std::shared_ptr<Entry>;
+ std::vector< std::future< FutureType > > results;
+ for (const auto &s : g_inputFiles)
+ {
+ // lambda representing the work to executed by a thread
+ auto processFile = [s]() {
+ bool ambig;
+ FileDef *fd=findFileDef(Doxygen::inputNameLinkedMap,s.c_str(),ambig);
+ auto parser = getParserForFile(s.c_str());
+ auto fileRoot = parseFile(*parser.get(),fd,s.c_str(),nullptr,true);
+ return fileRoot;
+ };
+ // dispatch the work and collect the future results
+ results.emplace_back(threadPool.queue(processFile));
+ }
+ // synchronise with the Entry results produced and add them to the root
+ for (auto &f : results)
+ {
+ root->moveToSubEntryAndKeep(f.get());
+ }
+ }
}
//! parse the list of input files
-static void parseFiles(const std::shared_ptr<Entry> &root)
+static void parseFilesSingleThreading(const std::shared_ptr<Entry> &root)
{
#if USE_LIBCLANG
- static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
- if (clangAssistedParsing)
+ if (Doxygen::clangAssistedParsing)
{
- QDict<void> g_processedFiles(10007);
+ StringUnorderedSet processedFiles;
// create a dictionary with files to process
- QDict<void> g_filesToProcess(10007);
- StringListIterator it(g_inputFiles);
- QCString *s;
- for (;(s=it.current());++it)
+ StringUnorderedSet filesToProcess;
+ for (const auto &s : g_inputFiles)
{
- g_filesToProcess.insert(*s,(void*)0x8);
+ filesToProcess.insert(s);
}
// process source files (and their include dependencies)
- for (it.toFirst();(s=it.current());++it)
+ for (const auto &s : g_inputFiles)
{
bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
+ FileDef *fd=findFileDef(Doxygen::inputNameLinkedMap,s.c_str(),ambig);
ASSERT(fd!=0);
if (fd->isSource() && !fd->isReference()) // this is a source file
{
- QStrList filesInSameTu;
- OutlineParserInterface &parser = getParserForFile(s->data());
- parser.startTranslationUnit(s->data());
- parseFile(parser,root,fd,s->data(),FALSE,filesInSameTu);
- //printf(" got %d extra files in tu\n",filesInSameTu.count());
+ auto clangParser = ClangParser::instance()->createTUParser(fd);
+ auto parser { getParserForFile(s.c_str()) };
+ auto fileRoot = parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),true);
+ root->moveToSubEntryAndKeep(fileRoot);
+ processedFiles.insert(s);
// Now process any include files in the same translation unit
// first. When libclang is used this is much more efficient.
- char *incFile = filesInSameTu.first();
- while (incFile && g_filesToProcess.find(incFile))
+ for (auto incFile : clangParser->filesInSameTU())
{
- if (qstrcmp(incFile,s->data()) && !g_processedFiles.find(incFile))
+ //printf(" file %s\n",incFile.c_str());
+ if (filesToProcess.find(incFile)!=filesToProcess.end() && // file need to be processed
+ processedFiles.find(incFile)==processedFiles.end()) // and is not processed already
{
- FileDef *ifd=findFileDef(Doxygen::inputNameDict,incFile,ambig);
+ FileDef *ifd=findFileDef(Doxygen::inputNameLinkedMap,incFile.c_str(),ambig);
if (ifd && !ifd->isReference())
{
- QStrList moreFiles;
- //printf(" Processing %s in same translation unit as %s\n",incFile,s->data());
- parseFile(parser,root,ifd,incFile,TRUE,moreFiles);
- g_processedFiles.insert(incFile,(void*)0x8);
+ //printf(" Processing %s in same translation unit as %s\n",incFile.c_str(),s.c_str());
+ fileRoot = parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),false);
+ root->moveToSubEntryAndKeep(fileRoot);
+ processedFiles.insert(incFile);
}
}
- incFile = filesInSameTu.next();
}
- parser.finishTranslationUnit();
- g_processedFiles.insert(*s,(void*)0x8);
}
}
// process remaining files
- for (it.toFirst();(s=it.current());++it)
+ for (const auto &s : g_inputFiles)
{
- if (!g_processedFiles.find(*s)) // not yet processed
+ if (processedFiles.find(s)==processedFiles.end()) // not yet processed
{
bool ambig;
- QStrList filesInSameTu;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
- ASSERT(fd!=0);
- OutlineParserInterface &parser = getParserForFile(s->data());
- parser.startTranslationUnit(s->data());
- parseFile(parser,root,fd,s->data(),FALSE,filesInSameTu);
- parser.finishTranslationUnit();
- g_processedFiles.insert(*s,(void*)0x8);
+ FileDef *fd=findFileDef(Doxygen::inputNameLinkedMap,s.c_str(),ambig);
+ auto clangParser = ClangParser::instance()->createTUParser(fd);
+ auto parser { getParserForFile(s.c_str()) };
+ auto fileRoot = parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),true);
+ root->moveToSubEntryAndKeep(fileRoot);
+ processedFiles.insert(s);
}
}
}
else // normal processing
#endif
{
- StringListIterator it(g_inputFiles);
- QCString *s;
- for (;(s=it.current());++it)
+ for (const auto &s : g_inputFiles)
{
bool ambig;
- QStrList filesInSameTu;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
+ FileDef *fd=findFileDef(Doxygen::inputNameLinkedMap,s.c_str(),ambig);
ASSERT(fd!=0);
- OutlineParserInterface &parser = getParserForFile(s->data());
- parser.startTranslationUnit(s->data());
- parseFile(parser,root,fd,s->data(),FALSE,filesInSameTu);
+ std::unique_ptr<OutlineParserInterface> parser { getParserForFile(s.c_str()) };
+ std::shared_ptr<Entry> fileRoot = parseFile(*parser.get(),fd,s.c_str(),nullptr,true);
+ root->moveToSubEntryAndKeep(fileRoot);
}
}
}
@@ -9366,7 +9752,8 @@ static QCString resolveSymlink(QCString path)
return QDir::cleanDirPath(result).data();
}
-static QDict<void> g_pathsVisited(1009);
+static std::mutex g_pathsVisitedMutex;
+static StringUnorderedSet g_pathsVisited(1009);
//----------------------------------------------------------------------------
// Read all files matching at least one pattern in 'patList' in the
@@ -9374,37 +9761,38 @@ static QDict<void> g_pathsVisited(1009);
// The directory is read iff the recursiveFlag is set.
// The contents of all files is append to the input string
-int readDir(QFileInfo *fi,
- FileNameList *fnList,
- FileNameDict *fnDict,
- StringDict *exclDict,
- QStrList *patList,
- QStrList *exclPatList,
- StringList *resultList,
- StringDict *resultDict,
+static int readDir(QFileInfo *fi,
+ FileNameLinkedMap *fnMap,
+ StringUnorderedSet *exclSet,
+ const StringVector *patList,
+ const StringVector *exclPatList,
+ StringVector *resultList,
+ StringUnorderedSet *resultSet,
bool errorIfNotExist,
bool recursive,
- QDict<void> *killDict,
- QDict<void> *paths
+ StringUnorderedSet *killSet,
+ StringSet *paths
)
{
QCString dirName = fi->absFilePath().utf8();
- if (paths && paths->find(dirName)==0)
+ if (paths && !dirName.isEmpty())
{
- paths->insert(dirName,(void*)0x8);
+ paths->insert(dirName.data());
}
if (fi->isSymLink())
{
dirName = resolveSymlink(dirName.data());
if (dirName.isEmpty()) return 0; // recursive symlink
- if (g_pathsVisited.find(dirName)) return 0; // already visited path
- g_pathsVisited.insert(dirName,(void*)0x8);
+
+ std::lock_guard<std::mutex> lock(g_pathsVisitedMutex);
+ if (g_pathsVisited.find(dirName.str())!=g_pathsVisited.end()) return 0; // already visited path
+ g_pathsVisited.insert(dirName.str());
}
QDir dir(dirName);
dir.setFilter( QDir::Files | QDir::Dirs | QDir::Hidden );
int totalSize=0;
msg("Searching for files in directory %s\n", fi->absFilePath().data());
- //printf("killDict=%p count=%d\n",killDict,killDict->count());
+ //printf("killSet=%p count=%d\n",killSet,killSet ? (int)killSet->count() : -1);
const QFileInfoList *list = dir.entryInfoList();
if (list)
@@ -9414,61 +9802,50 @@ int readDir(QFileInfo *fi,
while ((cfi=it.current()))
{
- if (exclDict==0 || exclDict->find(cfi->absFilePath().utf8())==0)
+ if (exclSet==0 || exclSet->find(cfi->absFilePath().utf8().data())==exclSet->end())
{ // file should not be excluded
- //printf("killDict->find(%s)\n",cfi->absFilePath().data());
+ //printf("killSet->find(%s)\n",cfi->absFilePath().data());
if (!cfi->exists() || !cfi->isReadable())
{
if (errorIfNotExist)
{
- warn_uncond("source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
+ warn_uncond("source '%s' is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
}
}
else if (cfi->isFile() &&
(!Config_getBool(EXCLUDE_SYMLINKS) || !cfi->isSymLink()) &&
- (patList==0 || patternMatch(*cfi,patList)) &&
- !patternMatch(*cfi,exclPatList) &&
- (killDict==0 || killDict->find(cfi->absFilePath().utf8())==0)
+ (patList==0 || patternMatch(*cfi,*patList)) &&
+ (exclPatList==0 || !patternMatch(*cfi,*exclPatList)) &&
+ (killSet==0 || killSet->find(cfi->absFilePath().utf8().data())==killSet->end())
)
{
totalSize+=cfi->size()+cfi->absFilePath().length()+4;
QCString name=cfi->fileName().utf8();
//printf("New file %s\n",name.data());
- if (fnDict)
+ if (fnMap)
{
- FileDef *fd=createFileDef(cfi->dirPath().utf8()+"/",name);
+ std::unique_ptr<FileDef> fd { createFileDef(cfi->dirPath().utf8()+"/",name) };
FileName *fn=0;
- if (!name.isEmpty() && (fn=(*fnDict)[name]))
+ if (!name.isEmpty())
{
- fn->append(fd);
+ fn = fnMap->add(name,cfi->absFilePath().utf8());
+ fn->push_back(std::move(fd));
}
- else
- {
- fn = new FileName(cfi->absFilePath().utf8(),name);
- fn->append(fd);
- if (fnList) fnList->append(fn);
- fnDict->insert(name,fn);
- }
- }
- QCString *rs=0;
- if (resultList || resultDict)
- {
- rs=new QCString(cfi->absFilePath().utf8());
}
- if (resultList) resultList->append(rs);
- if (resultDict) resultDict->insert(cfi->absFilePath().utf8(),rs);
- if (killDict) killDict->insert(cfi->absFilePath().utf8(),(void *)0x8);
+ if (resultList) resultList->push_back(cfi->absFilePath().utf8().data());
+ if (resultSet) resultSet->insert(cfi->absFilePath().utf8().data());
+ if (killSet) killSet->insert(cfi->absFilePath().utf8().data());
}
else if (recursive &&
(!Config_getBool(EXCLUDE_SYMLINKS) || !cfi->isSymLink()) &&
cfi->isDir() &&
- !patternMatch(*cfi,exclPatList) &&
+ (exclPatList==0 || !patternMatch(*cfi,*exclPatList)) &&
cfi->fileName().at(0)!='.') // skip "." ".." and ".dir"
{
cfi->setFile(cfi->absFilePath());
- totalSize+=readDir(cfi,fnList,fnDict,exclDict,
- patList,exclPatList,resultList,resultDict,errorIfNotExist,
- recursive,killDict,paths);
+ totalSize+=readDir(cfi,fnMap,exclSet,
+ patList,exclPatList,resultList,resultSet,errorIfNotExist,
+ recursive,killSet,paths);
}
}
++it;
@@ -9483,20 +9860,19 @@ int readDir(QFileInfo *fi,
// input string. The names of the files are appended to the 'fiList' list.
int readFileOrDirectory(const char *s,
- FileNameList *fnList,
- FileNameDict *fnDict,
- StringDict *exclDict,
- QStrList *patList,
- QStrList *exclPatList,
- StringList *resultList,
- StringDict *resultDict,
+ FileNameLinkedMap *fnMap,
+ StringUnorderedSet *exclSet,
+ const StringVector *patList,
+ const StringVector *exclPatList,
+ StringVector *resultList,
+ StringUnorderedSet *resultSet,
bool recursive,
bool errorIfNotExist,
- QDict<void> *killDict,
- QDict<void> *paths
+ StringUnorderedSet *killSet,
+ StringSet *paths
)
{
- //printf("killDict=%p count=%d\n",killDict,killDict->count());
+ //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
// strip trailing slashes
if (s==0) return 0;
QCString fs = s;
@@ -9507,13 +9883,13 @@ int readFileOrDirectory(const char *s,
//printf("readFileOrDirectory(%s)\n",s);
int totalSize=0;
{
- if (exclDict==0 || exclDict->find(fi.absFilePath().utf8())==0)
+ if (exclSet==0 || exclSet->find(fi.absFilePath().utf8().data())==exclSet->end())
{
if (!fi.exists() || !fi.isReadable())
{
if (errorIfNotExist)
{
- warn_uncond("source %s is not a readable file or directory... skipping.\n",s);
+ warn_uncond("source '%s' is not a readable file or directory... skipping.\n",s);
}
}
else if (!Config_getBool(EXCLUDE_SYMLINKS) || !fi.isSymLink())
@@ -9522,49 +9898,40 @@ int readFileOrDirectory(const char *s,
{
QCString dirPath = fi.dirPath(TRUE).utf8();
QCString filePath = fi.absFilePath().utf8();
- if (paths && paths->find(dirPath))
+ if (paths && !dirPath.isEmpty())
{
- paths->insert(dirPath,(void*)0x8);
+ paths->insert(dirPath.data());
}
- //printf("killDict->find(%s)\n",fi.absFilePath().data());
- if (killDict==0 || killDict->find(filePath)==0)
+ //printf("killSet.find(%s)=%d\n",fi.absFilePath().data(),killSet.find(fi.absFilePath())!=killSet.end());
+ if (killSet==0 || killSet->find(filePath.data())==killSet->end())
{
totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
//fiList->inSort(new FileInfo(fi));
QCString name=fi.fileName().utf8();
//printf("New file %s\n",name.data());
- if (fnDict)
+ if (fnMap)
{
- FileDef *fd=createFileDef(dirPath+"/",name);
- FileName *fn=0;
- if (!name.isEmpty() && (fn=(*fnDict)[name]))
- {
- fn->append(fd);
- }
- else
+ std::unique_ptr<FileDef> fd { createFileDef(dirPath+"/",name) };
+ if (!name.isEmpty())
{
- fn = new FileName(filePath,name);
- fn->append(fd);
- if (fnList) fnList->append(fn);
- fnDict->insert(name,fn);
+ FileName *fn = fnMap->add(name,filePath);
+ fn->push_back(std::move(fd));
}
}
- QCString *rs=0;
- if (resultList || resultDict)
+ if (resultList || resultSet)
{
- rs=new QCString(filePath);
- if (resultList) resultList->append(rs);
- if (resultDict) resultDict->insert(filePath,rs);
+ if (resultList) resultList->push_back(filePath.data());
+ if (resultSet) resultSet->insert(filePath.data());
}
- if (killDict) killDict->insert(fi.absFilePath().utf8(),(void *)0x8);
+ if (killSet) killSet->insert(fi.absFilePath().utf8().data());
}
}
else if (fi.isDir()) // readable dir
{
- totalSize+=readDir(&fi,fnList,fnDict,exclDict,patList,
- exclPatList,resultList,resultDict,errorIfNotExist,
- recursive,killDict,paths);
+ totalSize+=readDir(&fi,fnMap,exclSet,patList,
+ exclPatList,resultList,resultSet,errorIfNotExist,
+ recursive,killSet,paths);
}
}
}
@@ -9574,66 +9941,6 @@ int readFileOrDirectory(const char *s,
//----------------------------------------------------------------------------
-void readFormulaRepository(QCString dir, bool cmp)
-{
- static int current_repository = 0;
- int new_repository = 0;
- QFile f(dir+"/formula.repository");
- if (f.open(IO_ReadOnly)) // open repository
- {
- msg("Reading formula repository...\n");
- QTextStream t(&f);
- QCString line;
- Formula *f;
- while (!t.eof())
- {
- line=t.readLine().utf8();
- int se=line.find(':'); // find name and text separator.
- if (se==-1)
- {
- warn_uncond("formula.repository is corrupted!\n");
- break;
- }
- else
- {
- QCString formName = line.left(se);
- QCString formText = line.right(line.length()-se-1);
- if (cmp)
- {
- if ((f=Doxygen::formulaDict->find(formText))==0)
- {
- term("discrepancy between formula repositories! Remove "
- "formula.repository and from_* files from output directories.");
- }
- QCString formLabel;
- formLabel.sprintf("\\_form#%d",f->getId());
- if (formLabel != formName)
- {
- term("discrepancy between formula repositories! Remove "
- "formula.repository and from_* files from output directories.");
- }
- new_repository++;
- }
- else
- {
- f=new Formula(formText);
- Doxygen::formulaList->append(f);
- Doxygen::formulaDict->insert(formText,f);
- Doxygen::formulaNameDict->insert(formName,f);
- current_repository++;
- }
- }
- }
- }
- if (cmp && (current_repository != new_repository))
- {
- term("size discrepancy between formula repositories! Remove "
- "formula.repository and from_* files from output directories.");
- }
-}
-
-//----------------------------------------------------------------------------
-
static void expandAliases()
{
QDictIterator<QCString> adi(Doxygen::aliasDict);
@@ -9660,12 +9967,13 @@ static void escapeAliases()
newValue+=value.mid(p,in-p);
// expand \n's except if \n is part of a built-in command.
if (value.mid(in,5)!="\\note" &&
+ value.mid(in,5)!="\\noop" &&
value.mid(in,5)!="\\name" &&
value.mid(in,10)!="\\namespace" &&
value.mid(in,14)!="\\nosubgrouping"
)
{
- newValue+="\\_linebr ";
+ newValue+="\\ilinebr ";
}
else
{
@@ -9680,7 +9988,7 @@ static void escapeAliases()
while ((in=value.find("^^",p))!=-1)
{
newValue+=value.mid(p,in-p);
- newValue+="\\\\_linebr ";
+ newValue+="\\ilinebr ";
p=in+2;
}
newValue+=value.mid(p,value.length()-p);
@@ -9695,13 +10003,12 @@ void readAliases()
{
// add aliases to a dictionary
Doxygen::aliasDict.setAutoDelete(TRUE);
- QStrList &aliasList = Config_getList(ALIASES);
- const char *s=aliasList.first();
- while (s)
+ const StringVector &aliasList = Config_getList(ALIASES);
+ for (const auto &s : aliasList)
{
- if (Doxygen::aliasDict[s]==0)
+ QCString alias=s.c_str();
+ if (Doxygen::aliasDict[alias]==0)
{
- QCString alias=s;
int i=alias.find('=');
if (i>0)
{
@@ -9722,7 +10029,6 @@ void readAliases()
}
}
}
- s=aliasList.next();
}
expandAliases();
escapeAliases();
@@ -9735,7 +10041,7 @@ static void dumpSymbol(FTextStream &t,Definition *d)
QCString anchor;
if (d->definitionType()==Definition::TypeMember)
{
- MemberDef *md = dynamic_cast<MemberDef *>(d);
+ MemberDef *md = toMemberDef(d);
anchor=":"+md->anchor();
}
QCString scope;
@@ -9758,25 +10064,9 @@ static void dumpSymbolMap()
if (f.open(IO_WriteOnly))
{
FTextStream t(&f);
- QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
- DefinitionIntf *intf;
- for (;(intf=di.current());++di)
+ for (const auto &kv : Doxygen::symbolMap)
{
- if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
- {
- DefinitionListIterator dli(*(DefinitionList*)intf);
- Definition *d;
- // for each symbol
- for (dli.toFirst();(d=dli.current());++dli)
- {
- dumpSymbol(t,d);
- }
- }
- else // single symbol
- {
- Definition *d = (Definition *)intf;
- if (d!=Doxygen::globalScope) dumpSymbol(t,d);
- }
+ dumpSymbol(t,kv.second);
}
}
}
@@ -9850,14 +10140,16 @@ static const char *getArg(int argc,char **argv,int &optind)
class NullOutlineParser : public OutlineParserInterface
{
public:
- void startTranslationUnit(const char *) {}
- void finishTranslationUnit() {}
- void parseInput(const char *, const char *,const std::shared_ptr<Entry> &, bool, QStrList &) {}
+ void parseInput(const char *, const char *,const std::shared_ptr<Entry> &, ClangTUParser*) {}
bool needsPreprocessing(const QCString &) const { return FALSE; }
void parsePrototype(const char *) {}
};
+template<class T> std::function< std::unique_ptr<T>() > make_parser_factory()
+{
+ return []() { return std::make_unique<T>(); };
+}
void initDoxygen()
{
@@ -9870,31 +10162,27 @@ void initDoxygen()
Portable::correct_path();
- Doxygen::runningTime.start();
- Doxygen::preprocessor = new Preprocessor();
-
- Doxygen::parserManager = new ParserManager( std::make_unique<NullOutlineParser>(),
- std::make_unique<FileCodeParser>());
- Doxygen::parserManager->registerParser("c", std::make_unique<COutlineParser>(),
- std::make_unique<CCodeParser>());
- Doxygen::parserManager->registerParser("python", std::make_unique<PythonOutlineParser>(),
- std::make_unique<PythonCodeParser>());
- Doxygen::parserManager->registerParser("fortran", std::make_unique<FortranOutlineParser>(),
- std::make_unique<FortranCodeParser>());
- Doxygen::parserManager->registerParser("fortranfree", std::make_unique<FortranOutlineParserFree>(),
- std::make_unique<FortranCodeParserFree>());
- Doxygen::parserManager->registerParser("fortranfixed", std::make_unique<FortranOutlineParserFixed>(),
- std::make_unique<FortranCodeParserFixed>());
- Doxygen::parserManager->registerParser("vhdl", std::make_unique<VHDLOutlineParser>(),
- std::make_unique<VHDLCodeParser>());
- Doxygen::parserManager->registerParser("xml", std::make_unique<NullOutlineParser>(),
- std::make_unique<XMLCodeParser>());
- Doxygen::parserManager->registerParser("sql", std::make_unique<NullOutlineParser>(),
- std::make_unique<SQLCodeParser>());
- Doxygen::parserManager->registerParser("tcl", std::make_unique<TclOutlineParser>(),
- std::make_unique<TclCodeParser>());
- Doxygen::parserManager->registerParser("md", std::make_unique<MarkdownOutlineParser>(),
- std::make_unique<FileCodeParser>());
+ Debug::startTimer();
+ Doxygen::parserManager = new ParserManager( make_parser_factory<NullOutlineParser>(),
+ make_parser_factory<FileCodeParser>());
+ Doxygen::parserManager->registerParser("c", make_parser_factory<COutlineParser>(),
+ make_parser_factory<CCodeParser>());
+ Doxygen::parserManager->registerParser("python", make_parser_factory<PythonOutlineParser>(),
+ make_parser_factory<PythonCodeParser>());
+ Doxygen::parserManager->registerParser("fortran", make_parser_factory<FortranOutlineParser>(),
+ make_parser_factory<FortranCodeParser>());
+ Doxygen::parserManager->registerParser("fortranfree", make_parser_factory<FortranOutlineParserFree>(),
+ make_parser_factory<FortranCodeParserFree>());
+ Doxygen::parserManager->registerParser("fortranfixed", make_parser_factory<FortranOutlineParserFixed>(),
+ make_parser_factory<FortranCodeParserFixed>());
+ Doxygen::parserManager->registerParser("vhdl", make_parser_factory<VHDLOutlineParser>(),
+ make_parser_factory<VHDLCodeParser>());
+ Doxygen::parserManager->registerParser("xml", make_parser_factory<NullOutlineParser>(),
+ make_parser_factory<XMLCodeParser>());
+ Doxygen::parserManager->registerParser("sql", make_parser_factory<NullOutlineParser>(),
+ make_parser_factory<SQLCodeParser>());
+ Doxygen::parserManager->registerParser("md", make_parser_factory<MarkdownOutlineParser>(),
+ make_parser_factory<FileCodeParser>());
// register any additional parsers here...
@@ -9903,53 +10191,31 @@ void initDoxygen()
initNamespaceMemberIndices();
initFileMemberIndices();
- Doxygen::symbolMap = new QDict<DefinitionIntf>(50177);
#ifdef USE_LIBCLANG
- Doxygen::clangUsrMap = new QDict<Definition>(50177);
+ Doxygen::clangUsrMap = new ClangUsrMap;
#endif
- Doxygen::inputNameList = new FileNameList;
- Doxygen::inputNameList->setAutoDelete(TRUE);
- Doxygen::memberNameSDict = new MemberNameSDict(10000);
- Doxygen::memberNameSDict->setAutoDelete(TRUE);
- Doxygen::functionNameSDict = new MemberNameSDict(10000);
- Doxygen::functionNameSDict->setAutoDelete(TRUE);
- Doxygen::groupSDict = new GroupSDict(17);
- Doxygen::groupSDict->setAutoDelete(TRUE);
- Doxygen::namespaceSDict = new NamespaceSDict(20);
- Doxygen::namespaceSDict->setAutoDelete(TRUE);
- Doxygen::classSDict = new ClassSDict(1009);
- Doxygen::classSDict->setAutoDelete(TRUE);
- Doxygen::hiddenClasses = new ClassSDict(257);
- Doxygen::hiddenClasses->setAutoDelete(TRUE);
- Doxygen::directories = new DirSDict(17);
- Doxygen::directories->setAutoDelete(TRUE);
- Doxygen::pageSDict = new PageSDict(1009); // all doc pages
- Doxygen::pageSDict->setAutoDelete(TRUE);
- Doxygen::exampleSDict = new PageSDict(1009); // all examples
- Doxygen::exampleSDict->setAutoDelete(TRUE);
- Doxygen::memGrpInfoDict.setAutoDelete(TRUE);
+ Doxygen::memberNameLinkedMap = new MemberNameLinkedMap;
+ Doxygen::functionNameLinkedMap = new MemberNameLinkedMap;
+ Doxygen::groupLinkedMap = new GroupLinkedMap;
+ Doxygen::namespaceLinkedMap = new NamespaceLinkedMap;
+ Doxygen::classLinkedMap = new ClassLinkedMap;
+ Doxygen::hiddenClassLinkedMap = new ClassLinkedMap;
+ Doxygen::dirLinkedMap = new DirLinkedMap;
+ Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
+ Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
Doxygen::tagDestinationDict.setAutoDelete(TRUE);
- Doxygen::dirRelations.setAutoDelete(TRUE);
- Doxygen::citeDict = new CiteDict(257);
- Doxygen::genericsDict = new GenericsSDict;
Doxygen::indexList = new IndexList;
- Doxygen::formulaList = new FormulaList;
- Doxygen::formulaList->setAutoDelete(TRUE);
- Doxygen::formulaDict = new FormulaDict(1009);
- Doxygen::formulaNameDict = new FormulaDict(1009);
- Doxygen::sectionDict = new SectionDict(257);
- Doxygen::sectionDict->setAutoDelete(TRUE);
// initialisation of these globals depends on
// configuration switches so we need to postpone these
Doxygen::globalScope = 0;
- Doxygen::inputNameDict = 0;
- Doxygen::includeNameDict = 0;
- Doxygen::exampleNameDict = 0;
- Doxygen::imageNameDict = 0;
- Doxygen::dotFileNameDict = 0;
- Doxygen::mscFileNameDict = 0;
- Doxygen::diaFileNameDict = 0;
+ Doxygen::inputNameLinkedMap = 0;
+ Doxygen::includeNameLinkedMap = 0;
+ Doxygen::exampleNameLinkedMap = 0;
+ Doxygen::imageNameLinkedMap = 0;
+ Doxygen::dotFileNameLinkedMap = 0;
+ Doxygen::mscFileNameLinkedMap = 0;
+ Doxygen::diaFileNameLinkedMap = 0;
/**************************************************************************
* Initialize some global constants
@@ -9966,63 +10232,33 @@ void initDoxygen()
void cleanUpDoxygen()
{
- delete Doxygen::sectionDict;
- delete Doxygen::formulaNameDict;
- delete Doxygen::formulaDict;
- delete Doxygen::formulaList;
+ FormulaManager::instance().clear();
+ SectionManager::instance().clear();
+
delete Doxygen::indexList;
- delete Doxygen::genericsDict;
- delete Doxygen::inputNameDict;
- delete Doxygen::includeNameDict;
- delete Doxygen::exampleNameDict;
- delete Doxygen::imageNameDict;
- delete Doxygen::dotFileNameDict;
- delete Doxygen::mscFileNameDict;
- delete Doxygen::diaFileNameDict;
- delete Doxygen::mainPage;
- delete Doxygen::pageSDict;
- delete Doxygen::exampleSDict;
+ delete Doxygen::inputNameLinkedMap;
+ delete Doxygen::includeNameLinkedMap;
+ delete Doxygen::exampleNameLinkedMap;
+ delete Doxygen::imageNameLinkedMap;
+ delete Doxygen::dotFileNameLinkedMap;
+ delete Doxygen::mscFileNameLinkedMap;
+ delete Doxygen::diaFileNameLinkedMap;
+ Doxygen::mainPage.reset();
+ delete Doxygen::pageLinkedMap;
+ delete Doxygen::exampleLinkedMap;
delete Doxygen::globalScope;
- delete Doxygen::xrefLists;
delete Doxygen::parserManager;
- delete Doxygen::preprocessor;
delete theTranslator;
delete g_outputList;
Mappers::freeMappers();
- if (Doxygen::symbolMap)
- {
- // iterate through Doxygen::symbolMap and delete all
- // DefinitionList objects, since they have no owner
- QDictIterator<DefinitionIntf> dli(*Doxygen::symbolMap);
- DefinitionIntf *di;
- for (dli.toFirst();(di=dli.current());)
- {
- if (di->definitionType()==DefinitionIntf::TypeSymbolList)
- {
- DefinitionIntf *tmp = Doxygen::symbolMap->take(dli.currentKey());
- delete (DefinitionList *)tmp;
- }
- else
- {
- ++dli;
- }
- }
- }
-
- delete Doxygen::inputNameList;
- delete Doxygen::memberNameSDict;
- delete Doxygen::functionNameSDict;
- delete Doxygen::groupSDict;
- delete Doxygen::classSDict;
- delete Doxygen::hiddenClasses;
- delete Doxygen::namespaceSDict;
- delete Doxygen::directories;
+ delete Doxygen::memberNameLinkedMap;
+ delete Doxygen::functionNameLinkedMap;
+ delete Doxygen::groupLinkedMap;
+ delete Doxygen::namespaceLinkedMap;
+ delete Doxygen::dirLinkedMap;
- //delete Doxygen::symbolMap; <- we cannot do this unless all static lists
- // (such as Doxygen::namespaceSDict)
- // with objects based on Definition are made
- // dynamic first
+ DotManager::deleteInstance();
}
static int computeIdealCacheParam(uint v)
@@ -10039,15 +10275,7 @@ static int computeIdealCacheParam(uint v)
void readConfiguration(int argc, char **argv)
{
- QCString versionString;
- if (strlen(getGitVersion())>0)
- {
- versionString = QCString(getVersion())+" ("+getGitVersion()+")";
- }
- else
- {
- versionString = getVersion();
- }
+ QCString versionString = getFullVersion();
/**************************************************************************
* Handle arguments *
@@ -10091,15 +10319,15 @@ void readConfiguration(int argc, char **argv)
debugLabel=getArg(argc,argv,optind);
if (!debugLabel)
{
- err("option \"-d\" is missing debug specifier.\n");
devUsage();
cleanUpDoxygen();
- exit(1);
+ exit(0);
}
retVal = Debug::setFlag(debugLabel);
if (!retVal)
{
err("option \"-d\" has unknown debug specifier: \"%s\".\n",debugLabel);
+ devUsage();
cleanUpDoxygen();
exit(1);
}
@@ -10440,18 +10668,13 @@ void checkConfiguration()
void adjustConfiguration()
{
Doxygen::globalScope = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
- Doxygen::inputNameDict = new FileNameDict(10007);
- Doxygen::includeNameDict = new FileNameDict(10007);
- Doxygen::exampleNameDict = new FileNameDict(1009);
- Doxygen::exampleNameDict->setAutoDelete(TRUE);
- Doxygen::imageNameDict = new FileNameDict(257);
- Doxygen::imageNameDict->setAutoDelete(TRUE);
- Doxygen::dotFileNameDict = new FileNameDict(257);
- Doxygen::dotFileNameDict->setAutoDelete(TRUE);
- Doxygen::mscFileNameDict = new FileNameDict(257);
- Doxygen::mscFileNameDict->setAutoDelete(TRUE);
- Doxygen::diaFileNameDict = new FileNameDict(257);
- Doxygen::diaFileNameDict->setAutoDelete(TRUE);
+ Doxygen::inputNameLinkedMap = new FileNameLinkedMap;
+ Doxygen::includeNameLinkedMap = new FileNameLinkedMap;
+ Doxygen::exampleNameLinkedMap = new FileNameLinkedMap;
+ Doxygen::imageNameLinkedMap = new FileNameLinkedMap;
+ Doxygen::dotFileNameLinkedMap = new FileNameLinkedMap;
+ Doxygen::mscFileNameLinkedMap = new FileNameLinkedMap;
+ Doxygen::diaFileNameLinkedMap = new FileNameLinkedMap;
QCString outputLanguage=Config_getEnum(OUTPUT_LANGUAGE);
if (!setTranslator(outputLanguage))
@@ -10459,41 +10682,27 @@ void adjustConfiguration()
warn_uncond("Output language %s not supported! Using English instead.\n",
outputLanguage.data());
}
- QStrList &includePath = Config_getList(INCLUDE_PATH);
- char *s=includePath.first();
- while (s)
- {
- QFileInfo fi(s);
- Doxygen::preprocessor->addSearchDir(fi.absFilePath().utf8());
- s=includePath.next();
- }
/* Set the global html file extension. */
Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
- Doxygen::xrefLists->setAutoDelete(TRUE);
-
Doxygen::parseSourcesNeeded = Config_getBool(CALL_GRAPH) ||
Config_getBool(CALLER_GRAPH) ||
Config_getBool(REFERENCES_RELATION) ||
Config_getBool(REFERENCED_BY_RELATION);
- Doxygen::markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
-
/**************************************************************************
* Add custom extension mappings
**************************************************************************/
- QStrList &extMaps = Config_getList(EXTENSION_MAPPING);
- char *mapping = extMaps.first();
- while (mapping)
+ const StringVector &extMaps = Config_getList(EXTENSION_MAPPING);
+ for (const auto &mapping : extMaps)
{
- QCString mapStr = mapping;
+ QCString mapStr = mapping.c_str();
int i=mapStr.find('=');
if (i==-1)
{
- mapping = extMaps.next();
continue;
}
else
@@ -10502,7 +10711,6 @@ void adjustConfiguration()
QCString language = mapStr.mid(i+1).stripWhiteSpace().lower();
if (ext.isEmpty() || language.isEmpty())
{
- mapping = extMaps.next();
continue;
}
@@ -10514,30 +10722,24 @@ void adjustConfiguration()
}
else
{
- msg("Adding custom extension mapping: .%s will be treated as language %s\n",
+ msg("Adding custom extension mapping: '%s' will be treated as language '%s'\n",
ext.data(),language.data());
}
}
- mapping = extMaps.next();
}
// add predefined macro name to a dictionary
- QStrList &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
- s=expandAsDefinedList.first();
- while (s)
+ const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
+ for (const auto &s : expandAsDefinedList)
{
- if (Doxygen::expandAsDefinedDict[s]==0)
- {
- Doxygen::expandAsDefinedDict.insert(s,(void *)666);
- }
- s=expandAsDefinedList.next();
+ Doxygen::expandAsDefinedSet.insert(s.c_str());
}
// read aliases and store them in a dictionary
readAliases();
// store number of spaces in a tab into Doxygen::spaces
- int &tabSize = Config_getInt(TAB_SIZE);
+ int tabSize = Config_getInt(TAB_SIZE);
Doxygen::spaces.resize(tabSize+1);
int sp;for (sp=0;sp<tabSize;sp++) Doxygen::spaces.at(sp)=' ';
Doxygen::spaces.at(tabSize)='\0';
@@ -10548,14 +10750,6 @@ static void stopDoxygen(int)
{
QDir thisDir;
msg("Cleaning up...\n");
- if (!Doxygen::entryDBFileName.isEmpty())
- {
- thisDir.remove(Doxygen::entryDBFileName);
- }
- if (!Doxygen::objDBFileName.isEmpty())
- {
- thisDir.remove(Doxygen::objDBFileName);
- }
if (!Doxygen::filterDBFileName.isEmpty())
{
thisDir.remove(Doxygen::filterDBFileName);
@@ -10567,7 +10761,7 @@ static void stopDoxygen(int)
static void writeTagFile()
{
- QCString &generateTagFile = Config_getString(GENERATE_TAGFILE);
+ QCString generateTagFile = Config_getString(GENERATE_TAGFILE);
if (generateTagFile.isEmpty()) return;
QFile tag(generateTagFile);
@@ -10580,45 +10774,46 @@ static void writeTagFile()
}
FTextStream tagFile(&tag);
tagFile << "<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>" << endl;
- tagFile << "<tagfile>" << endl;
+ tagFile << "<tagfile doxygen_version=\"" << getDoxygenVersion() << "\"";
+ if (strlen(getGitVersion())>0)
+ {
+ tagFile << " doxygen_gitid=\"" << getGitVersion() << "\"";
+ }
+ tagFile << ">" << endl;
// for each file
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
}
}
// for each class
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- if (cd->isLinkableInProject()) cd->writeTagFile(tagFile);
+ ClassDefMutable *cdm = toClassDefMutable(cd.get());
+ if (cdm && cdm->isLinkableInProject())
+ {
+ cdm->writeTagFile(tagFile);
+ }
}
// for each namespace
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for ( ; (nd=nli.current()) ; ++nli )
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- if (nd->isLinkableInProject()) nd->writeTagFile(tagFile);
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get());
+ if (ndm && nd->isLinkableInProject())
+ {
+ ndm->writeTagFile(tagFile);
+ }
}
// for each group
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
}
// for each page
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
}
@@ -10636,6 +10831,7 @@ static void writeTagFile()
<< "</title>" << endl
<< " <filename>"
<< convertToXML(Doxygen::mainPage->getOutputFileBase())
+ << Doxygen::htmlFileExtension
<< "</filename>" << endl;
mainPage->writeDocAnchorsToTagFile();
@@ -10652,14 +10848,6 @@ static void exitDoxygen()
{
QDir thisDir;
msg("Exiting...\n");
- if (!Doxygen::entryDBFileName.isEmpty())
- {
- thisDir.remove(Doxygen::entryDBFileName);
- }
- if (!Doxygen::objDBFileName.isEmpty())
- {
- thisDir.remove(Doxygen::objDBFileName);
- }
if (!Doxygen::filterDBFileName.isEmpty())
{
thisDir.remove(Doxygen::filterDBFileName);
@@ -10668,26 +10856,26 @@ static void exitDoxygen()
}
static QCString createOutputDirectory(const QCString &baseDirName,
- QCString &formatDirName,
+ const QCString &formatDirName,
const char *defaultDirName)
{
- // Note the & on the next line, we modify the formatDirOption!
- if (formatDirName.isEmpty())
+ QCString result = formatDirName;
+ if (result.isEmpty())
{
- formatDirName = baseDirName + defaultDirName;
+ result = baseDirName + defaultDirName;
}
else if (formatDirName[0]!='/' && (formatDirName.length()==1 || formatDirName[1]!=':'))
{
- formatDirName.prepend(baseDirName+'/');
+ result.prepend(baseDirName+'/');
}
- QDir formatDir(formatDirName);
- if (!formatDir.exists() && !formatDir.mkdir(formatDirName))
+ QDir formatDir(result);
+ if (!formatDir.exists() && !formatDir.mkdir(result))
{
- err("Could not create output directory %s\n", formatDirName.data());
+ err("Could not create output directory %s\n", result.data());
cleanUpDoxygen();
exit(1);
}
- return formatDirName;
+ return result;
}
static QCString getQchFileName()
@@ -10709,114 +10897,137 @@ static QCString getQchFileName()
void searchInputFiles()
{
- QDict<void> *killDict = new QDict<void>(10007);
+ StringUnorderedSet killSet;
- QStrList &exclPatterns = Config_getList(EXCLUDE_PATTERNS);
+ const StringVector &exclPatterns = Config_getList(EXCLUDE_PATTERNS);
bool alwaysRecursive = Config_getBool(RECURSIVE);
- StringDict excludeNameDict(1009);
- excludeNameDict.setAutoDelete(TRUE);
+ StringUnorderedSet excludeNameSet;
// gather names of all files in the include path
g_s.begin("Searching for include files...\n");
- killDict->clear();
- QStrList &includePathList = Config_getList(INCLUDE_PATH);
- char *s=includePathList.first();
- while (s)
- {
- QStrList &pl = Config_getList(INCLUDE_FILE_PATTERNS);
- if (pl.count()==0)
- {
- pl = Config_getList(FILE_PATTERNS);
- }
- readFileOrDirectory(s,0,Doxygen::includeNameDict,0,&pl,
- &exclPatterns,0,0,
- alwaysRecursive,
- TRUE,killDict);
- s=includePathList.next();
+ killSet.clear();
+ const StringVector &includePathList = Config_getList(INCLUDE_PATH);
+ for (const auto &s : includePathList)
+ {
+ size_t plSize = Config_getList(INCLUDE_FILE_PATTERNS).size();
+ const StringVector &pl = plSize==0 ? Config_getList(FILE_PATTERNS) :
+ Config_getList(INCLUDE_FILE_PATTERNS);
+ readFileOrDirectory(s.c_str(), // s
+ Doxygen::includeNameLinkedMap, // fnDict
+ 0, // exclSet
+ &pl, // patList
+ &exclPatterns, // exclPatList
+ 0, // resultList
+ 0, // resultSet
+ alwaysRecursive, // recursive
+ TRUE, // errorIfNotExist
+ &killSet); // killSet
}
g_s.end();
g_s.begin("Searching for example files...\n");
- killDict->clear();
- QStrList &examplePathList = Config_getList(EXAMPLE_PATH);
- s=examplePathList.first();
- while (s)
- {
- readFileOrDirectory(s,0,Doxygen::exampleNameDict,0,
- &Config_getList(EXAMPLE_PATTERNS),
- 0,0,0,
- (alwaysRecursive || Config_getBool(EXAMPLE_RECURSIVE)),
- TRUE,killDict);
- s=examplePathList.next();
+ killSet.clear();
+ const StringVector &examplePathList = Config_getList(EXAMPLE_PATH);
+ for (const auto &s : examplePathList)
+ {
+ readFileOrDirectory(s.c_str(), // s
+ Doxygen::exampleNameLinkedMap, // fnDict
+ 0, // exclSet
+ &Config_getList(EXAMPLE_PATTERNS), // patList
+ 0, // exclPatList
+ 0, // resultList
+ 0, // resultSet
+ (alwaysRecursive || Config_getBool(EXAMPLE_RECURSIVE)), // recursive
+ TRUE, // errorIfNotExist
+ &killSet); // killSet
}
g_s.end();
g_s.begin("Searching for images...\n");
- killDict->clear();
- QStrList &imagePathList=Config_getList(IMAGE_PATH);
- s=imagePathList.first();
- while (s)
- {
- readFileOrDirectory(s,0,Doxygen::imageNameDict,0,0,
- 0,0,0,
- alwaysRecursive,
- TRUE,killDict);
- s=imagePathList.next();
+ killSet.clear();
+ const StringVector &imagePathList=Config_getList(IMAGE_PATH);
+ for (const auto &s : imagePathList)
+ {
+ readFileOrDirectory(s.c_str(), // s
+ Doxygen::imageNameLinkedMap, // fnDict
+ 0, // exclSet
+ 0, // patList
+ 0, // exclPatList
+ 0, // resultList
+ 0, // resultSet
+ alwaysRecursive, // recursive
+ TRUE, // errorIfNotExist
+ &killSet); // killSet
}
g_s.end();
g_s.begin("Searching for dot files...\n");
- killDict->clear();
- QStrList &dotFileList=Config_getList(DOTFILE_DIRS);
- s=dotFileList.first();
- while (s)
- {
- readFileOrDirectory(s,0,Doxygen::dotFileNameDict,0,0,
- 0,0,0,
- alwaysRecursive,
- TRUE,killDict);
- s=dotFileList.next();
+ killSet.clear();
+ const StringVector &dotFileList=Config_getList(DOTFILE_DIRS);
+ for (const auto &s : dotFileList)
+ {
+ readFileOrDirectory(s.c_str(), // s
+ Doxygen::dotFileNameLinkedMap, // fnDict
+ 0, // exclSet
+ 0, // patList
+ 0, // exclPatList
+ 0, // resultList
+ 0, // resultSet
+ alwaysRecursive, // recursive
+ TRUE, // errorIfNotExist
+ &killSet); // killSet
}
g_s.end();
g_s.begin("Searching for msc files...\n");
- killDict->clear();
- QStrList &mscFileList=Config_getList(MSCFILE_DIRS);
- s=mscFileList.first();
- while (s)
- {
- readFileOrDirectory(s,0,Doxygen::mscFileNameDict,0,0,
- 0,0,0,
- alwaysRecursive,
- TRUE,killDict);
- s=mscFileList.next();
+ killSet.clear();
+ const StringVector &mscFileList=Config_getList(MSCFILE_DIRS);
+ for (const auto &s : mscFileList)
+ {
+ readFileOrDirectory(s.c_str(), // s
+ Doxygen::mscFileNameLinkedMap, // fnDict
+ 0, // exclSet
+ 0, // patList
+ 0, // exclPatList
+ 0, // resultList
+ 0, // resultSet
+ alwaysRecursive, // recursive
+ TRUE, // errorIfNotExist
+ &killSet); // killSet
}
g_s.end();
g_s.begin("Searching for dia files...\n");
- killDict->clear();
- QStrList &diaFileList=Config_getList(DIAFILE_DIRS);
- s=diaFileList.first();
- while (s)
- {
- readFileOrDirectory(s,0,Doxygen::diaFileNameDict,0,0,
- 0,0,0,
- alwaysRecursive,
- TRUE,killDict);
- s=diaFileList.next();
+ killSet.clear();
+ const StringVector &diaFileList=Config_getList(DIAFILE_DIRS);
+ for (const auto &s : diaFileList)
+ {
+ readFileOrDirectory(s.c_str(), // s
+ Doxygen::diaFileNameLinkedMap, // fnDict
+ 0, // exclSet
+ 0, // patList
+ 0, // exclPatList
+ 0, // resultList
+ 0, // resultSet
+ alwaysRecursive, // recursive
+ TRUE, // errorIfNotExist
+ &killSet); // killSet
}
g_s.end();
g_s.begin("Searching for files to exclude\n");
- QStrList &excludeList = Config_getList(EXCLUDE);
- s=excludeList.first();
- while (s)
- {
- readFileOrDirectory(s,0,0,0,&Config_getList(FILE_PATTERNS),
- 0,0,&excludeNameDict,
- alwaysRecursive,
- FALSE);
- s=excludeList.next();
+ const StringVector &excludeList = Config_getList(EXCLUDE);
+ for (const auto &s : excludeList)
+ {
+ readFileOrDirectory(s.c_str(), // s
+ 0, // fnDict
+ 0, // exclSet
+ &Config_getList(FILE_PATTERNS), // patList
+ 0, // exclPatList
+ 0, // resultList
+ &excludeNameSet, // resultSet
+ alwaysRecursive, // recursive
+ FALSE); // errorIfNotExist
}
g_s.end();
@@ -10825,13 +11036,12 @@ void searchInputFiles()
**************************************************************************/
g_s.begin("Searching INPUT for files to process...\n");
- killDict->clear();
- QStrList &inputList=Config_getList(INPUT);
- g_inputFiles.setAutoDelete(TRUE);
- s=inputList.first();
- while (s)
+ killSet.clear();
+ Doxygen::inputPaths.clear();
+ const StringVector &inputList=Config_getList(INPUT);
+ for (const auto &s : inputList)
{
- QCString path=s;
+ QCString path=s.c_str();
uint l = path.length();
if (l>0)
{
@@ -10839,24 +11049,28 @@ void searchInputFiles()
if (path.at(l-1)=='\\' || path.at(l-1)=='/') path=path.left(l-1);
readFileOrDirectory(
- path,
- Doxygen::inputNameList,
- Doxygen::inputNameDict,
- &excludeNameDict,
- &Config_getList(FILE_PATTERNS),
- &exclPatterns,
- &g_inputFiles,0,
- alwaysRecursive,
- TRUE,
- killDict,
- &Doxygen::inputPaths);
- }
- s=inputList.next();
- }
- Doxygen::inputNameList->sort();
+ path, // s
+ Doxygen::inputNameLinkedMap, // fnDict
+ &excludeNameSet, // exclSet
+ &Config_getList(FILE_PATTERNS), // patList
+ &exclPatterns, // exclPatList
+ &g_inputFiles, // resultList
+ 0, // resultSet
+ alwaysRecursive, // recursive
+ TRUE, // errorIfNotExist
+ &killSet, // killSet
+ &Doxygen::inputPaths); // paths
+ }
+ }
+ std::sort(Doxygen::inputNameLinkedMap->begin(),
+ Doxygen::inputNameLinkedMap->end(),
+ [](const auto &f1,const auto &f2)
+ {
+ return Config_getBool(FULL_PATH_NAMES) ?
+ qstricmp(f1->fullName(),f2->fullName())<0 :
+ qstricmp(f1->fileName(),f2->fileName())<0;
+ });
g_s.end();
-
- delete killDict;
}
@@ -10864,14 +11078,22 @@ void parseInput()
{
atexit(exitDoxygen);
+#if USE_LIBCLANG
+ Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
+#endif
+
+ // we would like to show the versionString earlier, but we first have to handle the configuration file
+ // to know the value of the QUIET setting.
+ QCString versionString = getFullVersion();
+ msg("Doxygen version used: %s\n",versionString.data());
/**************************************************************************
* Make sure the output directory exists
**************************************************************************/
- QCString &outputDirectory = Config_getString(OUTPUT_DIRECTORY);
+ QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
if (outputDirectory.isEmpty())
{
- outputDirectory=QDir::currentDirPath().utf8();
+ outputDirectory = Config_updateString(OUTPUT_DIRECTORY,QDir::currentDirPath().utf8());
}
else
{
@@ -10882,92 +11104,100 @@ void parseInput()
if (!dir.mkdir(outputDirectory))
{
err("tag OUTPUT_DIRECTORY: Output directory '%s' does not "
- "exist and cannot be created\n",outputDirectory.data());
+ "exist and cannot be created\n",outputDirectory.data());
cleanUpDoxygen();
exit(1);
}
else
{
- msg("Notice: Output directory '%s' does not exist. "
- "I have created it for you.\n", outputDirectory.data());
+ msg("Notice: Output directory '%s' does not exist. "
+ "I have created it for you.\n", outputDirectory.data());
}
dir.cd(outputDirectory);
}
- outputDirectory=dir.absPath().utf8();
+ outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath().utf8());
}
/**************************************************************************
* Initialize global lists and dictionaries
**************************************************************************/
- //Doxygen::symbolStorage = new Store;
-
// also scale lookup cache with SYMBOL_CACHE_SIZE
int cacheSize = Config_getInt(LOOKUP_CACHE_SIZE);
if (cacheSize<0) cacheSize=0;
if (cacheSize>9) cacheSize=9;
uint lookupSize = 65536 << cacheSize;
- Doxygen::lookupCache = new QCache<LookupInfo>(lookupSize,lookupSize);
- Doxygen::lookupCache->setAutoDelete(TRUE);
+ Doxygen::lookupCache = new Cache<std::string,LookupInfo>(lookupSize);
#ifdef HAS_SIGNALS
signal(SIGINT, stopDoxygen);
#endif
uint pid = Portable::pid();
- Doxygen::objDBFileName.sprintf("doxygen_objdb_%d.tmp",pid);
- Doxygen::objDBFileName.prepend(outputDirectory+"/");
- Doxygen::entryDBFileName.sprintf("doxygen_entrydb_%d.tmp",pid);
- Doxygen::entryDBFileName.prepend(outputDirectory+"/");
Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
Doxygen::filterDBFileName.prepend(outputDirectory+"/");
-// if (Doxygen::symbolStorage->open(Doxygen::objDBFileName)==-1)
-// {
-// err("Failed to open temporary file %s\n",Doxygen::objDBFileName.data());
-// exit(1);
-// }
-
-
-
/**************************************************************************
* Check/create output directories *
**************************************************************************/
QCString htmlOutput;
- bool &generateHtml = Config_getBool(GENERATE_HTML);
+ bool generateHtml = Config_getBool(GENERATE_HTML);
if (generateHtml || g_useOutputTemplate /* TODO: temp hack */)
+ {
htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
+ Config_updateString(HTML_OUTPUT,htmlOutput);
+ }
QCString docbookOutput;
- bool &generateDocbook = Config_getBool(GENERATE_DOCBOOK);
+ bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
if (generateDocbook)
+ {
docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
+ Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
+ }
QCString xmlOutput;
- bool &generateXml = Config_getBool(GENERATE_XML);
+ bool generateXml = Config_getBool(GENERATE_XML);
if (generateXml)
+ {
xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
+ Config_updateString(XML_OUTPUT,xmlOutput);
+ }
QCString latexOutput;
- bool &generateLatex = Config_getBool(GENERATE_LATEX);
+ bool generateLatex = Config_getBool(GENERATE_LATEX);
if (generateLatex)
- latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT),"/latex");
+ {
+ latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
+ Config_updateString(LATEX_OUTPUT,latexOutput);
+ }
QCString rtfOutput;
- bool &generateRtf = Config_getBool(GENERATE_RTF);
+ bool generateRtf = Config_getBool(GENERATE_RTF);
if (generateRtf)
+ {
rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
+ Config_updateString(RTF_OUTPUT,rtfOutput);
+ }
QCString manOutput;
- bool &generateMan = Config_getBool(GENERATE_MAN);
+ bool generateMan = Config_getBool(GENERATE_MAN);
if (generateMan)
+ {
manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
+ Config_updateString(MAN_OUTPUT,manOutput);
+ }
- //QCString sqlOutput;
- //bool &generateSql = Config_getBool(GENERATE_SQLITE3);
- //if (generateSql)
- // sqlOutput = createOutputDirectory(outputDirectory,"SQLITE3_OUTPUT","/sqlite3");
+#if USE_SQLITE3
+ QCString sqlOutput;
+ bool generateSql = Config_getBool(GENERATE_SQLITE3);
+ if (generateSql)
+ {
+ sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
+ Config_updateString(SQLITE3_OUTPUT,sqlOutput);
+ }
+#endif
if (Config_getBool(HAVE_DOT))
{
@@ -10996,11 +11226,11 @@ void parseInput()
**************************************************************************/
LayoutDocManager::instance().init();
- QCString &layoutFileName = Config_getString(LAYOUT_FILE);
+ QCString layoutFileName = Config_getString(LAYOUT_FILE);
bool defaultLayoutUsed = FALSE;
if (layoutFileName.isEmpty())
{
- layoutFileName = "DoxygenLayout.xml";
+ layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
defaultLayoutUsed = TRUE;
}
@@ -11020,13 +11250,14 @@ void parseInput()
**************************************************************************/
// prevent search in the output directories
- QStrList &exclPatterns = Config_getList(EXCLUDE_PATTERNS);
- if (generateHtml) exclPatterns.append(htmlOutput);
- if (generateDocbook) exclPatterns.append(docbookOutput);
- if (generateXml) exclPatterns.append(xmlOutput);
- if (generateLatex) exclPatterns.append(latexOutput);
- if (generateRtf) exclPatterns.append(rtfOutput);
- if (generateMan) exclPatterns.append(manOutput);
+ StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
+ if (generateHtml) exclPatterns.push_back(htmlOutput.data());
+ if (generateDocbook) exclPatterns.push_back(docbookOutput.data());
+ if (generateXml) exclPatterns.push_back(xmlOutput.data());
+ if (generateLatex) exclPatterns.push_back(latexOutput.data());
+ if (generateRtf) exclPatterns.push_back(rtfOutput.data());
+ if (generateMan) exclPatterns.push_back(manOutput.data());
+ Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
searchInputFiles();
@@ -11034,18 +11265,22 @@ void parseInput()
if (Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX))
{
- readFormulaRepository(Config_getString(HTML_OUTPUT));
+ FormulaManager::instance().readFormulas(Config_getString(HTML_OUTPUT));
}
if (Config_getBool(GENERATE_RTF))
{
// in case GENERRATE_HTML is set we just have to compare, both repositories should be identical
- readFormulaRepository(Config_getString(RTF_OUTPUT),Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX));
+ FormulaManager::instance().readFormulas(Config_getString(RTF_OUTPUT),
+ Config_getBool(GENERATE_HTML) &&
+ !Config_getBool(USE_MATHJAX));
}
if (Config_getBool(GENERATE_DOCBOOK))
{
// in case GENERRATE_HTML is set we just have to compare, both repositories should be identical
- readFormulaRepository(Config_getString(DOCBOOK_OUTPUT),
- (Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX)) || Config_getBool(GENERATE_RTF));
+ FormulaManager::instance().readFormulas(Config_getString(DOCBOOK_OUTPUT),
+ (Config_getBool(GENERATE_HTML) &&
+ !Config_getBool(USE_MATHJAX)) ||
+ Config_getBool(GENERATE_RTF));
}
/**************************************************************************
@@ -11055,12 +11290,10 @@ void parseInput()
std::shared_ptr<Entry> root = std::make_shared<Entry>();
msg("Reading and parsing tag files\n");
- QStrList &tagFileList = Config_getList(TAGFILES);
- char *s=tagFileList.first();
- while (s)
+ const StringVector &tagFileList = Config_getList(TAGFILES);
+ for (const auto &s : tagFileList)
{
- readTagFile(root,s);
- s=tagFileList.next();
+ readTagFile(root,s.c_str());
}
/**************************************************************************
@@ -11070,13 +11303,24 @@ void parseInput()
addSTLSupport(root);
g_s.begin("Parsing files\n");
- parseFiles(root);
+ if (Config_getInt(NUM_PROC_THREADS)==1)
+ {
+ parseFilesSingleThreading(root);
+ }
+ else
+ {
+ parseFilesMultiThreading(root);
+ }
g_s.end();
/**************************************************************************
* Gather information *
**************************************************************************/
+ g_s.begin("Building macro definition list...\n");
+ buildDefineList();
+ g_s.end();
+
g_s.begin("Building group list...\n");
buildGroupList(root.get());
organizeSubGroups(root.get());
@@ -11246,15 +11490,50 @@ void parseInput()
findGroupScope(root.get());
g_s.end();
+ auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
+ {
+ return qstricmp(n1->memberName()+getPrefixIndex(n1->memberName()),
+ n2->memberName()+getPrefixIndex(n2->memberName())
+ )<0;
+ };
+
+ auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
+ {
+ if (Config_getBool(SORT_BY_SCOPE_NAME))
+ {
+ return qstricmp(c1->name(), c2->name())<0;
+ }
+ else
+ {
+ int i = qstricmp(c1->className(), c2->className());
+ return i==0 ? qstricmp(c1->name(), c2->name())<0 : i<0;
+ }
+ };
+
+ auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
+ {
+ return qstricmp(n1->name(),n2->name())<0;
+ };
+
g_s.begin("Sorting lists...\n");
- Doxygen::memberNameSDict->sort();
- Doxygen::functionNameSDict->sort();
- Doxygen::hiddenClasses->sort();
- Doxygen::classSDict->sort();
+ std::sort(Doxygen::memberNameLinkedMap->begin(),
+ Doxygen::memberNameLinkedMap->end(),
+ memberNameComp);
+ std::sort(Doxygen::functionNameLinkedMap->begin(),
+ Doxygen::functionNameLinkedMap->end(),
+ memberNameComp);
+ std::sort(Doxygen::hiddenClassLinkedMap->begin(),
+ Doxygen::hiddenClassLinkedMap->end(),
+ classComp);
+ std::sort(Doxygen::classLinkedMap->begin(),
+ Doxygen::classLinkedMap->end(),
+ classComp);
+ std::sort(Doxygen::namespaceLinkedMap->begin(),
+ Doxygen::namespaceLinkedMap->end(),
+ namespaceComp);
g_s.end();
QDir thisDir;
- thisDir.remove(Doxygen::entryDBFileName);
g_s.begin("Determining which enums are documented\n");
findDocumentedEnumValues();
@@ -11294,7 +11573,7 @@ void parseInput()
// compute the shortest possible names of all files
// without losing the uniqueness of the file names.
g_s.begin("Generating disk names...\n");
- Doxygen::inputNameList->generateDiskNames();
+ generateDiskNames();
g_s.end();
g_s.begin("Adding source references...\n");
@@ -11321,11 +11600,8 @@ void parseInput()
g_s.end();
}
- //g_s.begin("Resolving citations...\n");
- //Doxygen::citeDict->resolve();
-
g_s.begin("Generating citations page...\n");
- Doxygen::citeDict->generatePage();
+ CitationManager::instance().generatePage();
g_s.end();
g_s.begin("Counting members...\n");
@@ -11360,6 +11636,23 @@ void parseInput()
vhdlCorrectMemberProperties();
g_s.end();
+ g_s.begin("Computing tooltip texts...\n");
+ computeTooltipTexts();
+ g_s.end();
+
+ if (Config_getBool(SORT_GROUP_NAMES))
+ {
+ std::sort(Doxygen::groupLinkedMap->begin(),
+ Doxygen::groupLinkedMap->end(),
+ [](const auto &g1,const auto &g2)
+ { return qstrcmp(g1->groupTitle(),g2->groupTitle())<0; });
+
+ for (const auto &gd : *Doxygen::groupLinkedMap)
+ {
+ gd->sortSubGroups();
+ }
+ }
+
}
void generateOutput()
@@ -11387,10 +11680,10 @@ void generateOutput()
bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
- g_outputList = new OutputList(TRUE);
+ g_outputList = new OutputList;
if (generateHtml)
{
- g_outputList->add(new HtmlGenerator);
+ g_outputList->add<HtmlGenerator>();
HtmlGenerator::init();
// add HTML indexers that are enabled
@@ -11409,22 +11702,22 @@ void generateOutput()
}
if (generateLatex)
{
- g_outputList->add(new LatexGenerator);
+ g_outputList->add<LatexGenerator>();
LatexGenerator::init();
}
if (generateDocbook)
{
- g_outputList->add(new DocbookGenerator);
+ g_outputList->add<DocbookGenerator>();
DocbookGenerator::init();
}
if (generateMan)
{
- g_outputList->add(new ManGenerator);
+ g_outputList->add<ManGenerator>();
ManGenerator::init();
}
if (generateRtf)
{
- g_outputList->add(new RTFGenerator);
+ g_outputList->add<RTFGenerator>();
RTFGenerator::init();
}
if (Config_getBool(USE_HTAGS))
@@ -11475,10 +11768,35 @@ void generateOutput()
}
g_s.end();
+ const FormulaManager &fm = FormulaManager::instance();
+ if (fm.hasFormulas() && generateHtml
+ && !Config_getBool(USE_MATHJAX))
+ {
+ g_s.begin("Generating images for formulas in HTML...\n");
+ fm.generateImages(Config_getString(HTML_OUTPUT), Config_getEnum(HTML_FORMULA_FORMAT)=="svg" ?
+ FormulaManager::Format::Vector : FormulaManager::Format::Bitmap, FormulaManager::HighDPI::On);
+ g_s.end();
+ }
+ if (fm.hasFormulas() && generateRtf)
+ {
+ g_s.begin("Generating images for formulas in RTF...\n");
+ fm.generateImages(Config_getString(RTF_OUTPUT),FormulaManager::Format::Bitmap);
+ g_s.end();
+ }
+
+ if (fm.hasFormulas() && generateDocbook)
+ {
+ g_s.begin("Generating images for formulas in Docbook...\n");
+ fm.generateImages(Config_getString(DOCBOOK_OUTPUT),FormulaManager::Format::Bitmap);
+ g_s.end();
+ }
+
g_s.begin("Generating example documentation...\n");
generateExampleDocs();
g_s.end();
+ warn_flush();
+
g_s.begin("Generating file sources...\n");
generateFileSources();
g_s.end();
@@ -11514,39 +11832,7 @@ void generateOutput()
generateDirDocs(*g_outputList);
g_s.end();
- if (Doxygen::formulaList->count()>0 && generateHtml
- && !Config_getBool(USE_MATHJAX))
- {
- g_s.begin("Generating bitmaps for formulas in HTML...\n");
- Doxygen::formulaList->generateBitmaps(Config_getString(HTML_OUTPUT));
- g_s.end();
- }
- if (Doxygen::formulaList->count()>0 && generateRtf)
- {
- g_s.begin("Generating bitmaps for formulas in RTF...\n");
- Doxygen::formulaList->generateBitmaps(Config_getString(RTF_OUTPUT));
- g_s.end();
- }
-
- if (Doxygen::formulaList->count()>0 && generateDocbook)
- {
- g_s.begin("Generating bitmaps for formulas in Docbook...\n");
- Doxygen::formulaList->generateBitmaps(Config_getString(DOCBOOK_OUTPUT));
- g_s.end();
- }
-
- if (Config_getBool(SORT_GROUP_NAMES))
- {
- Doxygen::groupSDict->sort();
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- gd->sortSubGroups();
- }
- }
-
- if (g_outputList->count()>0)
+ if (g_outputList->size()>0)
{
writeIndexHierarchy(*g_outputList);
}
@@ -11567,12 +11853,14 @@ void generateOutput()
Doxygen::generatingXmlOutput=FALSE;
g_s.end();
}
- if (USE_SQLITE3)
+#if USE_SQLITE3
+ if (Config_getBool(GENERATE_SQLITE3))
{
g_s.begin("Generating SQLITE3 output...\n");
generateSqlite3();
g_s.end();
}
+#endif
if (Config_getBool(GENERATE_AUTOGEN_DEF))
{
@@ -11613,6 +11901,8 @@ void generateOutput()
if (g_useOutputTemplate) generateOutputViaTemplate();
+ warn_flush();
+
if (generateRtf)
{
g_s.begin("Combining RTF output...\n");
@@ -11623,10 +11913,14 @@ void generateOutput()
g_s.end();
}
+ warn_flush();
+
g_s.begin("Running plantuml with JAVA...\n");
PlantumlManager::instance()->run();
g_s.end();
+ warn_flush();
+
if (Config_getBool(HAVE_DOT))
{
g_s.begin("Running dot...\n");
@@ -11674,6 +11968,9 @@ void generateOutput()
QDir::setCurrent(oldDir);
g_s.end();
}
+
+ warn_flush();
+
if ( generateHtml &&
Config_getBool(GENERATE_QHP) &&
!Config_getString(QHG_LOCATION).isEmpty())
@@ -11696,9 +11993,9 @@ void generateOutput()
}
int cacheParam;
- msg("lookup cache used %d/%d hits=%d misses=%d\n",
- Doxygen::lookupCache->count(),
+ msg("lookup cache used %zu/%zu hits=%" PRIu64 " misses=%" PRIu64 "\n",
Doxygen::lookupCache->size(),
+ Doxygen::lookupCache->capacity(),
Doxygen::lookupCache->hits(),
Doxygen::lookupCache->misses());
cacheParam = computeIdealCacheParam(Doxygen::lookupCache->misses()*2/3); // part of the cache is flushed, hence the 2/3 correction factor
@@ -11710,7 +12007,7 @@ void generateOutput()
if (Debug::isFlagSet(Debug::Time))
{
msg("Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n",
- ((double)Doxygen::runningTime.elapsed())/1000.0,
+ ((double)Debug::elapsedTime()),
Portable::getSysElapsedTime()
);
g_s.print();
@@ -11728,15 +12025,11 @@ void generateOutput()
cleanUpDoxygen();
finalizeSearchIndexer();
-// Doxygen::symbolStorage->close();
QDir thisDir;
- thisDir.remove(Doxygen::objDBFileName);
thisDir.remove(Doxygen::filterDBFileName);
+ finishWarnExit();
Config::deinit();
QTextCodec::deleteAllCodecs();
- delete Doxygen::symbolMap;
delete Doxygen::clangUsrMap;
-// delete Doxygen::symbolStorage;
g_successfulRun=TRUE;
}
-
diff --git a/src/doxygen.h b/src/doxygen.h
index a23a678..1886c0e 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -17,56 +17,53 @@
#define DOXYGEN_H
#include <qdatetime.h>
-#include <qcache.h>
#include <qstrlist.h>
#include <qdict.h>
#include <qintdict.h>
+#include "containers.h"
#include "ftextstream.h"
#include "sortdict.h"
#include "membergroup.h"
#include "dirdef.h"
#include "memberlist.h"
-#include "docgroup.h"
+#include "define.h"
+#include "cache.h"
+#include "symbolmap.h"
+
+#define THREAD_LOCAL thread_local
+#define AtomicInt std::atomic_int
+#define AtomicBool std::atomic_bool
class RefList;
-class PageSList;
-class PageSDict;
+class PageLinkedMap;
class PageDef;
class SearchIndexIntf;
class ParserManager;
-class ObjCache;
-class Store;
class QFileInfo;
class BufStr;
class CiteDict;
class MemberDef;
class GroupDef;
-class GroupSDict;
+class GroupLinkedMap;
class FileDef;
class ClassDef;
-class ClassSDict;
-class GenericsSDict;
-class MemberNameSDict;
-class FileNameDict;
-class FileNameList;
-class NamespaceSDict;
+class ClassLinkedMap;
+class MemberNameLinkedMap;
+class FileNameLinkedMap;
+class NamespaceLinkedMap;
class NamespaceDef;
-class DefinitionIntf;
-class DirSDict;
-class DirRelation;
+class DirRelationLinkedMap;
class IndexList;
class FormulaList;
class FormulaDict;
class FormulaNameDict;
-class SectionDict;
class Preprocessor;
struct MemberGroupInfo;
+class NamespaceDefMutable;
typedef QList<QCString> StringList;
typedef QListIterator<QCString> StringListIterator;
-//typedef QDict<FileDef> FileDict;
-//typedef QDict<GroupDef> GroupDict;
class StringDict : public QDict<QCString>
{
@@ -77,16 +74,16 @@ class StringDict : public QDict<QCString>
struct LookupInfo
{
- LookupInfo() : classDef(0), typeDef(0) {}
+ LookupInfo() = default;
LookupInfo(const ClassDef *cd,const MemberDef *td,QCString ts,QCString rt)
: classDef(cd), typeDef(td), templSpec(ts),resolvedType(rt) {}
- const ClassDef *classDef;
- const MemberDef *typeDef;
+ const ClassDef *classDef = 0;
+ const MemberDef *typeDef = 0;
QCString templSpec;
QCString resolvedType;
};
-extern QCString g_spaces;
+using ClangUsrMap = std::unordered_map<std::string,const Definition *>;
/*! \brief This class serves as a namespace for global variables used by doxygen.
*
@@ -95,102 +92,72 @@ extern QCString g_spaces;
class Doxygen
{
public:
- static ClassSDict *classSDict;
- static ClassSDict *hiddenClasses;
- static PageSDict *exampleSDict;
- static PageSDict *pageSDict;
- static PageDef *mainPage;
+ static ClassLinkedMap *classLinkedMap;
+ static ClassLinkedMap *hiddenClassLinkedMap;
+ static PageLinkedMap *exampleLinkedMap;
+ static PageLinkedMap *pageLinkedMap;
+ static std::unique_ptr<PageDef> mainPage;
static bool insideMainPage;
- static FileNameDict *includeNameDict;
- static FileNameDict *exampleNameDict;
- static QDict<void> inputPaths;
- static FileNameDict *inputNameDict;
- static FileNameList *inputNameList;
- static FileNameDict *imageNameDict;
- static FileNameDict *dotFileNameDict;
- static FileNameDict *mscFileNameDict;
- static FileNameDict *diaFileNameDict;
- static QStrList tagfileList;
- static MemberNameSDict *memberNameSDict;
- static MemberNameSDict *functionNameSDict;
- static SectionDict *sectionDict;
- static StringDict namespaceAliasDict;
- static GroupSDict *groupSDict;
- static NamespaceSDict *namespaceSDict;
- static FormulaList *formulaList;
- static FormulaDict *formulaDict;
- static FormulaDict *formulaNameDict;
+ static FileNameLinkedMap *includeNameLinkedMap;
+ static FileNameLinkedMap *exampleNameLinkedMap;
+ static StringSet inputPaths;
+ static FileNameLinkedMap *inputNameLinkedMap;
+ static FileNameLinkedMap *imageNameLinkedMap;
+ static FileNameLinkedMap *dotFileNameLinkedMap;
+ static FileNameLinkedMap *mscFileNameLinkedMap;
+ static FileNameLinkedMap *diaFileNameLinkedMap;
+ static MemberNameLinkedMap *memberNameLinkedMap;
+ static MemberNameLinkedMap *functionNameLinkedMap;
+ static StringUnorderedMap namespaceAliasMap;
+ static GroupLinkedMap *groupLinkedMap;
+ static NamespaceLinkedMap *namespaceLinkedMap;
static StringDict tagDestinationDict;
static StringDict aliasDict;
- static QIntDict<MemberGroupInfo> memGrpInfoDict;
- static QDict<void> expandAsDefinedDict;
- static NamespaceDef *globalScope;
- static QDict<RefList> *xrefLists; // array of xref lists: todo, test, bug, deprecated ...
+ static MemberGroupInfoMap memberGroupInfoMap;
+ static StringUnorderedSet expandAsDefinedSet;
+ static NamespaceDefMutable *globalScope;
static QCString htmlFileExtension;
static bool parseSourcesNeeded;
- static QTime runningTime;
static SearchIndexIntf *searchIndex;
- static QDict<DefinitionIntf> *symbolMap;
- static QDict<Definition> *clangUsrMap;
+ static SymbolMap<Definition> symbolMap;
+ static ClangUsrMap *clangUsrMap;
static bool outputToWizard;
- static QDict<int> *htmlDirMap;
- static QCache<LookupInfo> *lookupCache;
- static DirSDict *directories;
- static SDict<DirRelation> dirRelations;
+ static Cache<std::string,LookupInfo> *lookupCache;
+ static DirLinkedMap *dirLinkedMap;
+ static DirRelationLinkedMap dirRelations;
static ParserManager *parserManager;
static bool suppressDocWarnings;
- static Store *symbolStorage;
- static QCString objDBFileName;
- static QCString entryDBFileName;
static QCString filterDBFileName;
- static CiteDict *citeDict;
- static bool gatherDefines;
static bool userComments;
static IndexList *indexList;
static int subpageNestingLevel;
static QCString spaces;
static bool generatingXmlOutput;
- static bool markdownSupport;
- static GenericsSDict *genericsDict;
- static DocGroup docGroup;
- static Preprocessor *preprocessor;
+ static DefinesPerFileList macroDefinitions;
+ static bool clangAssistedParsing;
};
void initDoxygen();
void readConfiguration(int argc, char **argv);
void checkConfiguration();
void adjustConfiguration();
-void searchInputFiles(StringList &inputFiles);
void parseInput();
void generateOutput();
void readAliases();
void readFormulaRepository(QCString dir, bool cmp = FALSE);
void cleanUpDoxygen();
int readFileOrDirectory(const char *s,
- FileNameList *fnList,
- FileNameDict *fnDict,
- StringDict *exclDict,
- QStrList *patList,
- QStrList *exclPatList,
- StringList *resultList,
- StringDict *resultDict,
+ FileNameLinkedMap *fnDict,
+ StringUnorderedSet *exclSet,
+ const StringVector *patList,
+ const StringVector *exclPatList,
+ StringVector *resultList,
+ StringUnorderedSet *resultSet,
bool recursive,
bool errorIfNotExist=TRUE,
- QDict<void> *killDict = 0,
- QDict<void> *paths = 0
+ StringUnorderedSet *killSet = 0,
+ StringSet *paths = 0
);
-int readDir(QFileInfo *fi,
- FileNameList *fnList,
- FileNameDict *fnDict,
- StringDict *exclDict,
- QStrList *patList,
- QStrList *exclPatList,
- StringList *resultList,
- StringDict *resultDict,
- bool errorIfNotExist,
- bool recursive,
- QDict<void> *killDict
- );
void copyAndFilterFile(const char *fileName,BufStr &dest);
#endif
diff --git a/src/doxygen.md b/src/doxygen.md
index c124e09..e3db534 100644
--- a/src/doxygen.md
+++ b/src/doxygen.md
@@ -7,7 +7,7 @@ Introduction
This page provides a high-level overview of the internals of doxygen, with
links to the relevant parts of the code. This document is intended for
developers who want to work on doxygen. Users of doxygen are referred to the
-[User Manual](http://www.doxygen.nl/manual/index.html).
+[User Manual](https://www.doxygen.nl/manual/index.html).
The generic starting point of the application is of course the main() function.
@@ -15,13 +15,13 @@ Configuration options
=====================
Configuration file data is stored in singleton class Config and can be
-accessed using wrapper macros
+accessed using wrapper macros
Config_getString(), Config_getInt(), Config_getList(),
Config_getEnum(), and Config_getBool() depending on the type of the
-option.
+option.
The format of the configuration file (options and types) is defined
-by the file `config.xml`. As part of the build process,
+by the file `config.xml`. As part of the build process,
the python script `configgen.py` will create a file `configoptions.cpp`
from this, which serves as the input for the configuration file parser
that is invoked using Config::parse(). The script `configgen.py` will also
@@ -43,18 +43,18 @@ for each file. Each parser implements the abstract interface ParserInterface.
If the parser indicates it needs preprocessing
via ParserInterface::needsPreprocessing(), doxygen will call preprocessFile()
-on the file.
+on the file.
A second step is to convert multiline C++-style comments into C style comments
-for easier processing later on. As side effect of this step also
-aliases (ALIASES option) are resolved. The function that performs these
+for easier processing later on. As side effect of this step also
+aliases (ALIASES option) are resolved. The function that performs these
2 tasks is called convertCppComments().
*Note:* Alias resolution should better be done in a separate step as it is
now coupled to C/C++ code and does not work automatically for other languages!
-The third step is the actual language parsing and is done by calling
-ParserInterface::parseInput() on the parser interface returned by
+The third step is the actual language parsing and is done by calling
+ParserInterface::parseInput() on the parser interface returned by
the ParserManager.
The result of parsing is a tree of Entry objects.
@@ -67,19 +67,19 @@ converted into a Definition object.
When a parser finds a special comment block in the input, it will do a first
pass parsing via parseCommentBlock(). During this pass the comment block
is split into multiple parts if needed. Some data that is later needed is
-extracted like section labels, xref items, and formulas.
+extracted like section labels, xref items, and formulas.
Also Markdown markup is processed using processMarkdown() during this pass.
Resolving relations
===================
-The Entry objects created and filled during parsing are stored on disk
-(to keep memory needs low). The name, parent/child relation, and
-location on disk of each Entry is stored as a tree of EntryNav nodes, which is
+The Entry objects created and filled during parsing are stored on disk
+(to keep memory needs low). The name, parent/child relation, and
+location on disk of each Entry is stored as a tree of EntryNav nodes, which is
kept in memory.
Doxygen does a number of tree walks over the EntryNav nodes in the tree to
-build up the data structures needed to produce the output.
+build up the data structures needed to produce the output.
The resulting data structures are all children of the generic base class
called Definition which holds all non-specific data for a symbol definition.
@@ -141,9 +141,9 @@ easy ways to get debug information.
- classes<br>
Gives of classes en modules its scope and other relevant information.
- preprocessor<br>
- Shows the results of the preprocessing phase, i.e. results from include files,
+ Shows the results of the preprocessing phase, i.e. results from include files,
<tt>\#define</tt> statements etc., definitions in the doxygen configuration file like:
- `EXPAND_ONLY_PREDEF`, `PREDEFINED` and `MACRO_EXPANSION`.
+ `EXPAND_ONLY_PREDEF`, `PREDEFINED` and `MACRO_EXPANSION`.
- commentcnv<br>
Shows the results of the comment conversion, the comment conversion does the
following:
@@ -216,14 +216,13 @@ Topics TODO
- perlmod
- i18n via Translator and language.cpp
- Customizing the layout via LayoutDocManager
-- Parsers
- - C Preprocessing
+- Parsers
+ - C Preprocessing
- const expression evaluation
- C link languages
- Python
- Fortran
- VHDL
- - TCL
- Tag files
- Marshaling to/from disk
- Portability functions
diff --git a/src/entry.cpp b/src/entry.cpp
index cc8cd1f..6e343b0 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -24,18 +24,15 @@
#include "doxygen.h"
#include "arguments.h"
#include "config.h"
-//------------------------------------------------------------------
-
-#define HEADER ('D'<<24)+('O'<<16)+('X'<<8)+'!'
//------------------------------------------------------------------
-int Entry::num=0;
+static AtomicInt g_num;
Entry::Entry()
{
//printf("Entry::Entry(%p)\n",this);
- num++;
+ g_num++;
m_parent=0;
section = EMPTY_SEC;
//printf("Entry::Entry() tArgList=0\n");
@@ -50,7 +47,7 @@ Entry::Entry()
Entry::Entry(const Entry &e)
{
//printf("Entry::Entry(%p):copy\n",this);
- num++;
+ g_num++;
section = e.section;
type = e.type;
name = e.name;
@@ -95,6 +92,7 @@ Entry::Entry(const Entry &e)
exception = e.exception;
typeConstr = e.typeConstr;
bodyLine = e.bodyLine;
+ bodyColumn = e.bodyColumn;
endBodyLine = e.endBodyLine;
mGrpId = e.mGrpId;
anchors = e.anchors;
@@ -122,11 +120,11 @@ Entry::Entry(const Entry &e)
Entry::~Entry()
{
- //printf("Entry::~Entry(%p) num=%d\n",this,num);
+ //printf("Entry::~Entry(%p) num=%d\n",this,g_num);
//printf("Deleting entry %d name %s type %x children %d\n",
// num,name.data(),section,sublist->count());
- num--;
+ g_num--;
}
void Entry::moveToSubEntryAndRefresh(Entry *&current)
@@ -149,7 +147,7 @@ void Entry::moveToSubEntryAndKeep(Entry *current)
m_sublist.emplace_back(current);
}
-void Entry::moveToSubEntryAndKeep(std::shared_ptr<Entry> &current)
+void Entry::moveToSubEntryAndKeep(std::shared_ptr<Entry> current)
{
current->m_parent=this;
m_sublist.push_back(current);
@@ -169,21 +167,6 @@ void Entry::copyToSubEntry(const std::shared_ptr<Entry> &current)
m_sublist.push_back(copy);
}
-void Entry::moveFromSubEntry(const Entry *child,std::shared_ptr<Entry> &moveTo)
-{
- auto it = std::find_if(m_sublist.begin(),m_sublist.end(),
- [child](const std::shared_ptr<Entry>&elem) { return elem.get()==child; });
- if (it!=m_sublist.end())
- {
- moveTo = *it;
- m_sublist.erase(it);
- }
- else
- {
- moveTo.reset();
- }
-}
-
void Entry::removeSubEntry(const Entry *e)
{
auto it = std::find_if(m_sublist.begin(),m_sublist.end(),
@@ -197,10 +180,10 @@ void Entry::removeSubEntry(const Entry *e)
void Entry::reset()
{
- static bool entryCallGraph = Config_getBool(CALL_GRAPH);
- static bool entryCallerGraph = Config_getBool(CALLER_GRAPH);
- static bool entryReferencedByRelation = Config_getBool(REFERENCED_BY_RELATION);
- static bool entryReferencesRelation = Config_getBool(REFERENCES_RELATION);
+ bool entryCallGraph = Config_getBool(CALL_GRAPH);
+ bool entryCallerGraph = Config_getBool(CALLER_GRAPH);
+ bool entryReferencedByRelation = Config_getBool(REFERENCED_BY_RELATION);
+ bool entryReferencesRelation = Config_getBool(REFERENCES_RELATION);
//printf("Entry::reset()\n");
name.resize(0);
type.resize(0);
@@ -228,6 +211,7 @@ void Entry::reset()
startLine = 1;
startColumn = 1;
bodyLine = -1;
+ bodyColumn = 1;
endBodyLine = -1;
mGrpId = -1;
callGraph = entryCallGraph;
@@ -253,9 +237,8 @@ void Entry::reset()
extends.clear();
groups.clear();
anchors.clear();
- argList.clear();
- tArgLists.clear();
argList.reset();
+ tArgLists.clear();
typeConstr.reset();
sli.clear();
m_fileDef = 0;
@@ -270,13 +253,4 @@ void Entry::setFileDef(FileDef *fd)
}
}
-void Entry::addSpecialListItem(const char *listName,int itemId)
-{
- ListItemInfo ili;
- ili.type = listName;
- ili.itemId = itemId;
- sli.push_back(ili);
-}
-
-
//------------------------------------------------------------------
diff --git a/src/entry.h b/src/entry.h
index 802a212..d6c0936 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -25,11 +25,11 @@
#include "types.h"
#include "arguments.h"
+#include "reflist.h"
-struct SectionInfo;
+class SectionInfo;
class QFile;
class FileDef;
-struct ListItemInfo;
/** This class stores information about an inheritance relation
*/
@@ -194,8 +194,6 @@ class Entry
Entry(const Entry &);
~Entry();
- void addSpecialListItem(const char *listName,int index);
-
/*! Returns the parent for this Entry or 0 if this entry has no parent. */
Entry *parent() const { return m_parent; }
@@ -205,20 +203,17 @@ class Entry
const std::vector< std::shared_ptr<Entry> > &children() const { return m_sublist; }
/*! @name add entry as a child and pass ownership.
- * @note This makes the entry passed invalid! (TODO: tclscanner.l still has use after move!)
+ * @note This makes the entry passed invalid!
* @{
*/
void moveToSubEntryAndKeep(Entry* e);
- void moveToSubEntryAndKeep(std::shared_ptr<Entry> &e);
+ void moveToSubEntryAndKeep(std::shared_ptr<Entry> e);
/*! @} */
/*! @name add entry as a child, pass ownership and reinitialize entry */
void moveToSubEntryAndRefresh(Entry* &e);
void moveToSubEntryAndRefresh(std::shared_ptr<Entry> &e);
- /*! take \a child of of to list of children and move it into \a moveTo */
- void moveFromSubEntry(const Entry *child,std::shared_ptr<Entry> &moveTo);
-
/*! make a copy of \a e and add it as a child to this entry */
void copyToSubEntry (Entry* e);
void copyToSubEntry (const std::shared_ptr<Entry> &e);
@@ -262,7 +257,7 @@ class Entry
QCString args; //!< member argument string
QCString bitfields; //!< member's bit fields
ArgumentList argList; //!< member arguments as a list
- std::vector<ArgumentList> tArgLists; //!< template argument declarations
+ ArgumentLists tArgLists; //!< template argument declarations
QGString program; //!< the program text
QGString initializer; //!< initial value (for variables)
QCString includeFile; //!< include file (2 arg of \\class, must be unique)
@@ -283,7 +278,8 @@ class Entry
QCString inside; //!< name of the class in which documents are found
QCString exception; //!< throw specification
ArgumentList typeConstr; //!< where clause (C#) for type constraints
- int bodyLine; //!< line number of the definition in the source
+ int bodyLine; //!< line number of the body in the source
+ int bodyColumn; //!< column of the body in the source
int endBodyLine; //!< line number where the definition ends
int mGrpId; //!< member group id
std::vector<BaseInfo> extends; //!< list of base classes
@@ -292,7 +288,7 @@ class Entry
QCString fileName; //!< file this entry was extracted from
int startLine; //!< start line of entry in the source
int startColumn; //!< start column of entry in the source
- std::vector<ListItemInfo> sli; //!< special lists (test/todo/bug/deprecated/..) this entry is in
+ RefItemVector sli; //!< special lists (test/todo/bug/deprecated/..) this entry is in
SrcLangExt lang; //!< programming language in which this entry was found
bool hidden; //!< does this represent an entity that is hidden from the output
bool artificial; //!< Artificially introduced item
@@ -301,9 +297,6 @@ class Entry
LocalToc localToc;
QCString metaData; //!< Slice metadata
-
- static int num; //!< counts the total number of entries
-
/// return the command name used to define GROUPDOC_SEC
const char *groupDocCmd() const
{
diff --git a/src/example.h b/src/example.h
index 321982b..7929c24 100644
--- a/src/example.h
+++ b/src/example.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2021 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,8 +16,10 @@
#ifndef EXAMPLE_H
#define EXAMPLE_H
+#include <algorithm>
+#include <vector>
+
#include <qcstring.h>
-#include "sortdict.h"
class ClassDef;
class MemberName;
@@ -27,21 +27,27 @@ class MemberName;
/** Data associated with an example. */
struct Example
{
+ Example(const QCString &a,const QCString &n,const QCString &f) : anchor(a), name(n), file(f) {}
QCString anchor;
QCString name;
QCString file;
};
-/** A sorted dictionary of Example objects. */
-class ExampleSDict : public SDict<Example>
+class ExampleList : public std::vector<Example>
{
public:
- ExampleSDict(int size=17) : SDict<Example>(size) { setAutoDelete(TRUE); }
- ~ExampleSDict() {}
- private:
- int compareValues(const Example *item1,const Example *item2) const
+ bool inSort( const Example& ex )
{
- return qstricmp(item1->name,item2->name);
+ auto it = std::find_if(begin(),end(),[&ex](const Example &e) { return e.name==ex.name; });
+ if (it==end())
+ {
+ insert( std::upper_bound( begin(), end(), ex,
+ [](const auto &e1,const auto &e2) { return e1.name < e2.name; }
+ ), ex
+ );
+ return true;
+ }
+ return false;
}
};
diff --git a/src/filedef.cpp b/src/filedef.cpp
index fb0e290..2fb2af7 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -48,7 +48,10 @@
//---------------------------------------------------------------------------
-class FileDefImpl : public DefinitionImpl, public FileDef
+using DefinitionLineMap = std::unordered_map<int,const Definition *>;
+using MemberDefLineMap = std::unordered_map<int,const MemberDef *>;
+
+class FileDefImpl : public DefinitionMixin<FileDef>
{
public:
FileDefImpl(const char *p,const char *n,const char *ref=0,const char *dn=0);
@@ -56,6 +59,7 @@ class FileDefImpl : public DefinitionImpl, public FileDef
virtual DefType definitionType() const { return TypeFile; }
virtual QCString name() const;
+
virtual QCString displayName(bool=TRUE) const { return name(); }
virtual QCString fileName() const { return m_fileName; }
virtual QCString getOutputFileBase() const;
@@ -68,8 +72,8 @@ class FileDefImpl : public DefinitionImpl, public FileDef
virtual const QCString &docName() const { return m_docname; }
virtual bool isSource() const { return m_isSource; }
virtual bool isDocumentationFile() const;
- virtual Definition *getSourceDefinition(int lineNr) const;
- virtual MemberDef *getSourceMember(int lineNr) const;
+ virtual const Definition *getSourceDefinition(int lineNr) const;
+ virtual const MemberDef *getSourceMember(int lineNr) const;
virtual QCString getPath() const { return m_path; }
virtual QCString getVersion() const { return m_fileVersion; }
virtual bool isLinkableInProject() const;
@@ -77,16 +81,16 @@ class FileDefImpl : public DefinitionImpl, public FileDef
virtual bool isIncluded(const QCString &name) const;
virtual PackageDef *packageDef() const { return m_package; }
virtual DirDef *getDirDef() const { return m_dir; }
- virtual NamespaceSDict *getUsedNamespaces() const;
- virtual SDict<Definition> *getUsedClasses() const { return m_usingDeclList; }
+ virtual LinkedRefMap<const NamespaceDef> getUsedNamespaces() const;
+ virtual LinkedRefMap<const ClassDef> getUsedClasses() const { return m_usingDeclList; }
virtual QList<IncludeInfo> *includeFileList() const { return m_includeList; }
virtual QList<IncludeInfo> *includedByFileList() const { return m_includedByList; }
- virtual void getAllIncludeFilesRecursively(QStrList &incFiles) const;
+ virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const;
virtual MemberList *getMemberList(MemberListType lt) const;
- virtual const QList<MemberList> &getMemberLists() const { return m_memberLists; }
- virtual MemberGroupSDict *getMemberGroupSDict() const { return m_memberGroupSDict; }
- virtual NamespaceSDict *getNamespaceSDict() const { return m_namespaceSDict; }
- virtual ClassSDict *getClassSDict() const { return m_classSDict; }
+ virtual const MemberLists &getMemberLists() const { return m_memberLists; }
+ virtual const MemberGroupList &getMemberGroups() const { return m_memberGroups; }
+ virtual NamespaceLinkedRefMap getNamespaces() const { return m_namespaces; }
+ virtual ClassLinkedRefMap getClasses() const { return m_classes; }
virtual QCString title() const;
virtual bool hasDetailedDescription() const;
virtual QCString fileVersion() const;
@@ -94,42 +98,38 @@ class FileDefImpl : public DefinitionImpl, public FileDef
virtual void countMembers();
virtual int numDocMembers() const;
virtual int numDecMembers() const;
- virtual void addSourceRef(int line,Definition *d,MemberDef *md);
+ virtual void addSourceRef(int line,const Definition *d,const MemberDef *md);
virtual void writeDocumentation(OutputList &ol);
virtual void writeMemberPages(OutputList &ol);
virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const;
virtual void writeSummaryLinks(OutputList &ol) const;
virtual void writeTagFile(FTextStream &t);
- virtual void startParsing();
- virtual void writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu);
- virtual void parseSource(bool sameTu,QStrList &filesInSameTu);
- virtual void finishParsing();
+ virtual void writeSourceHeader(OutputList &ol);
+ virtual void writeSourceBody(OutputList &ol,ClangTUParser *clangParser);
+ virtual void writeSourceFooter(OutputList &ol);
+ virtual void parseSource(ClangTUParser *clangParser);
virtual void setDiskName(const QCString &name);
virtual void insertMember(MemberDef *md);
- virtual void insertClass(ClassDef *cd);
- virtual void insertNamespace(NamespaceDef *nd);
+ virtual void insertClass(const ClassDef *cd);
+ virtual void insertNamespace(const NamespaceDef *nd);
virtual void computeAnchors();
virtual void setPackageDef(PackageDef *pd) { m_package=pd; }
virtual void setDirDef(DirDef *dd) { m_dir=dd; }
virtual void addUsingDirective(const NamespaceDef *nd);
- virtual void addUsingDeclaration(Definition *def);
+ virtual void addUsingDeclaration(const ClassDef *cd);
virtual void combineUsingRelations();
virtual bool generateSourceFile() const;
virtual void sortMemberLists();
- virtual void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported,bool indirect);
+ virtual void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported);
virtual void addIncludedByDependency(FileDef *fd,const char *incName,bool local,bool imported);
virtual void addMembersToMemberGroup();
virtual void distributeMemberGroupDocumentation();
virtual void findSectionsInDocumentation();
- virtual void addIncludedUsingDirectives();
+ virtual void addIncludedUsingDirectives(FileDefSet &visitedFiles);
virtual void addListReferences();
- virtual void setVisited(bool v) { m_visited = v; }
- virtual bool isVisited() const { return m_visited; }
private:
- bool m_visited;
void acquireFileVersion();
- MemberList *createMemberList(MemberListType lt);
void addMemberToList(MemberListType lt,MemberDef *md);
void writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCString &title);
void writeMemberDocumentation(OutputList &ol,MemberListType lt,const QCString &title);
@@ -141,7 +141,7 @@ class FileDefImpl : public DefinitionImpl, public FileDef
void writeSourceLink(OutputList &ol);
void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
bool isConstantGroup);
- void writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d);
+ void writeClassDeclarations(OutputList &ol,const QCString &title,const ClassLinkedRefMap &list);
void writeInlineClasses(OutputList &ol);
void startMemberDeclarations(OutputList &ol);
void endMemberDeclarations(OutputList &ol);
@@ -149,14 +149,14 @@ class FileDefImpl : public DefinitionImpl, public FileDef
void endMemberDocumentation(OutputList &ol);
void writeDetailedDescription(OutputList &ol,const QCString &title);
void writeBriefDescription(OutputList &ol);
- void writeClassesToTagFile(FTextStream &t,ClassSDict *d);
+ void writeClassesToTagFile(FTextStream &t,const ClassLinkedRefMap &list);
QDict<IncludeInfo> *m_includeDict;
QList<IncludeInfo> *m_includeList;
QDict<IncludeInfo> *m_includedByDict;
QList<IncludeInfo> *m_includedByList;
- NamespaceSDict *m_usingDirList;
- SDict<Definition> *m_usingDeclList;
+ LinkedRefMap<const NamespaceDef> m_usingDirList;
+ LinkedRefMap<const ClassDef> m_usingDeclList;
QCString m_path;
QCString m_filePath;
QCString m_inclDepFileName;
@@ -164,19 +164,19 @@ class FileDefImpl : public DefinitionImpl, public FileDef
QCString m_outputDiskName;
QCString m_fileName;
QCString m_docname;
- QIntDict<Definition> *m_srcDefDict;
- QIntDict<MemberDef> *m_srcMemberDict;
+ DefinitionLineMap m_srcDefMap;
+ MemberDefLineMap m_srcMemberMap;
bool m_isSource;
QCString m_fileVersion;
PackageDef *m_package;
DirDef *m_dir;
- QList<MemberList> m_memberLists;
- MemberGroupSDict *m_memberGroupSDict;
- NamespaceSDict *m_namespaceSDict;
- ClassSDict *m_classSDict;
- ClassSDict *m_interfaceSDict;
- ClassSDict *m_structSDict;
- ClassSDict *m_exceptionSDict;
+ MemberLists m_memberLists;
+ MemberGroupList m_memberGroups;
+ NamespaceLinkedRefMap m_namespaces;
+ ClassLinkedRefMap m_classes;
+ ClassLinkedRefMap m_interfaces;
+ ClassLinkedRefMap m_structs;
+ ClassLinkedRefMap m_exceptions;
bool m_subGrouping;
};
@@ -209,47 +209,38 @@ class DevNullCodeDocInterface : public CodeOutputInterface
virtual void linkableSymbol(int, const char *,Definition *,Definition *) {}
virtual void setCurrentDoc(const Definition *,const char *,bool) {}
virtual void addWord(const char *,bool) {}
+ virtual void startCodeFragment(const char *) {}
+ virtual void endCodeFragment(const char *) {}
};
//---------------------------------------------------------------------------
-/*! create a new file definition, where \a p is the file path,
+/*! create a new file definition, where \a p is the file path,
\a nm the file name, and \a lref is an HTML anchor name if the
file was read from a tag file or 0 otherwise
*/
FileDefImpl::FileDefImpl(const char *p,const char *nm,
const char *lref,const char *dn)
- : DefinitionImpl((QCString)p+nm,1,1,nm)
+ : DefinitionMixin((QCString)p+nm,1,1,nm)
{
m_path=p;
m_filePath=m_path+nm;
m_fileName=nm;
setReference(lref);
setDiskName(dn?dn:nm);
- m_classSDict = 0;
- m_interfaceSDict = 0;
- m_structSDict = 0;
- m_exceptionSDict = 0;
m_includeList = 0;
- m_includeDict = 0;
+ m_includeDict = 0;
m_includedByList = 0;
- m_includedByDict = 0;
- m_namespaceSDict = 0;
- m_srcDefDict = 0;
- m_srcMemberDict = 0;
- m_usingDirList = 0;
- m_usingDeclList = 0;
+ m_includedByDict = 0;
m_package = 0;
- m_isSource = guessSection(nm)==Entry::SOURCE_SEC;
+ m_isSource = guessSection(nm)==Entry::SOURCE_SEC;
m_docname = nm;
m_dir = 0;
- m_visited = FALSE;
if (Config_getBool(FULL_PATH_NAMES))
{
m_docname.prepend(stripFromPath(m_path.copy()));
}
setLanguage(getLanguageFromFileName(name()));
- m_memberGroupSDict = 0;
acquireFileVersion();
m_subGrouping=Config_getBool(SUBGROUPING);
}
@@ -257,20 +248,10 @@ FileDefImpl::FileDefImpl(const char *p,const char *nm,
/*! destroy the file definition */
FileDefImpl::~FileDefImpl()
{
- delete m_classSDict;
- delete m_interfaceSDict;
- delete m_structSDict;
- delete m_exceptionSDict;
delete m_includeDict;
delete m_includeList;
delete m_includedByDict;
delete m_includedByList;
- delete m_namespaceSDict;
- delete m_srcDefDict;
- delete m_srcMemberDict;
- delete m_usingDirList;
- delete m_usingDeclList;
- delete m_memberGroupSDict;
}
void FileDefImpl::setDiskName(const QCString &name)
@@ -289,43 +270,32 @@ void FileDefImpl::setDiskName(const QCString &name)
}
}
-/*! Compute the HTML anchor names for all members in the class */
+/*! Compute the HTML anchor names for all members in the class */
void FileDefImpl::computeAnchors()
{
MemberList *ml = getMemberList(MemberListType_allMembersList);
- if (ml) setAnchors(ml);
+ if (ml) ml->setAnchors();
}
void FileDefImpl::distributeMemberGroupDocumentation()
{
//printf("FileDefImpl::distributeMemberGroupDocumentation()\n");
- if (m_memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->distributeMemberGroupDocumentation();
- }
+ mg->distributeMemberGroupDocumentation();
}
}
void FileDefImpl::findSectionsInDocumentation()
{
+ docFindSections(briefDescription(),this,docFile());
docFindSections(documentation(),this,docFile());
- if (m_memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->findSectionsInDocumentation(this);
- }
+ mg->findSectionsInDocumentation(this);
}
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_declarationLists)
{
@@ -338,7 +308,7 @@ bool FileDefImpl::hasDetailedDescription() const
{
static bool repeatBrief = Config_getBool(REPEAT_BRIEF);
static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
- return ((!briefDescription().isEmpty() && repeatBrief) ||
+ return ((!briefDescription().isEmpty() && repeatBrief) ||
!documentation().stripWhiteSpace().isEmpty() || // avail empty section
(sourceBrowser && getStartBodyLine()!=-1 && getBodyDef())
);
@@ -349,32 +319,29 @@ void FileDefImpl::writeTagFile(FTextStream &tagFile)
tagFile << " <compound kind=\"file\">" << endl;
tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
tagFile << " <path>" << convertToXML(getPath()) << "</path>" << endl;
- tagFile << " <filename>" << convertToXML(addHtmlExtensionIfMissing(getOutputFileBase())) << "</filename>" << endl;
+ tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
if (m_includeList && m_includeList->count()>0)
{
QListIterator<IncludeInfo> ili(*m_includeList);
IncludeInfo *ii;
for (;(ii=ili.current());++ili)
{
- if (!ii->indirect)
+ FileDef *fd=ii->fileDef;
+ if (fd && fd->isLinkable() && !fd->isReference())
{
- FileDef *fd=ii->fileDef;
- if (fd && fd->isLinkable() && !fd->isReference())
- {
- bool isIDLorJava = FALSE;
- SrcLangExt lang = fd->getLanguage();
- isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java;
- const char *locStr = (ii->local || isIDLorJava) ? "yes" : "no";
- const char *impStr = (ii->imported || isIDLorJava) ? "yes" : "no";
- tagFile << " <includes id=\""
- << convertToXML(fd->getOutputFileBase()) << "\" "
- << "name=\"" << convertToXML(fd->name()) << "\" "
- << "local=\"" << locStr << "\" "
- << "imported=\"" << impStr << "\">"
- << convertToXML(ii->includeName)
- << "</includes>"
- << endl;
- }
+ bool isIDLorJava = FALSE;
+ SrcLangExt lang = fd->getLanguage();
+ isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java;
+ const char *locStr = (ii->local || isIDLorJava) ? "yes" : "no";
+ const char *impStr = (ii->imported || isIDLorJava) ? "yes" : "no";
+ tagFile << " <includes id=\""
+ << convertToXML(fd->getOutputFileBase()) << "\" "
+ << "name=\"" << convertToXML(fd->name()) << "\" "
+ << "local=\"" << locStr << "\" "
+ << "imported=\"" << impStr << "\">"
+ << convertToXML(ii->includeName)
+ << "</includes>"
+ << endl;
}
}
}
@@ -387,40 +354,31 @@ void FileDefImpl::writeTagFile(FTextStream &tagFile)
{
case LayoutDocEntry::FileClasses:
{
- if (m_classSDict)
- writeClassesToTagFile(tagFile, m_classSDict);
+ writeClassesToTagFile(tagFile, m_classes);
}
break;
case LayoutDocEntry::FileInterfaces:
{
- if (m_interfaceSDict)
- writeClassesToTagFile(tagFile, m_interfaceSDict);
+ writeClassesToTagFile(tagFile, m_interfaces);
}
break;
case LayoutDocEntry::FileStructs:
{
- if (m_structSDict)
- writeClassesToTagFile(tagFile, m_structSDict);
+ writeClassesToTagFile(tagFile, m_structs);
}
break;
case LayoutDocEntry::FileExceptions:
{
- if (m_exceptionSDict)
- writeClassesToTagFile(tagFile, m_exceptionSDict);
+ writeClassesToTagFile(tagFile, m_exceptions);
}
break;
case LayoutDocEntry::FileNamespaces:
{
- if (m_namespaceSDict)
+ for (const auto *nd : m_namespaces)
{
- SDict<NamespaceDef>::Iterator ni(*m_namespaceSDict);
- NamespaceDef *nd;
- for (ni.toFirst();(nd=ni.current());++ni)
+ if (nd->isLinkableInProject())
{
- if (nd->isLinkableInProject())
- {
- tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
- }
+ tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
}
}
}
@@ -437,14 +395,9 @@ void FileDefImpl::writeTagFile(FTextStream &tagFile)
break;
case LayoutDocEntry::MemberGroups:
{
- if (m_memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeTagFile(tagFile);
- }
+ mg->writeTagFile(tagFile);
}
}
break;
@@ -467,7 +420,7 @@ void FileDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title)
ol.popGeneratorState();
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
- ol.writeAnchor(0,"details");
+ ol.writeAnchor(0,"details");
ol.popGeneratorState();
ol.startGroupHeader();
ol.parseText(title);
@@ -476,9 +429,10 @@ void FileDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title)
ol.startTextBlock();
if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
{
- ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
- if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
+ if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
!documentation().isEmpty())
{
ol.pushGeneratorState();
@@ -493,23 +447,24 @@ void FileDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title)
}
if (!documentation().isEmpty())
{
- ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
//printf("Writing source ref for file %s\n",name().data());
- if (Config_getBool(SOURCE_BROWSER))
+ if (Config_getBool(SOURCE_BROWSER))
{
//if Latex enabled and LATEX_SOURCE_CODE isn't -> skip, bug_738548
ol.pushGeneratorState();
if (ol.isEnabled(OutputGenerator::Latex) && !Config_getBool(LATEX_SOURCE_CODE))
- {
+ {
ol.disable(OutputGenerator::Latex);
}
if (ol.isEnabled(OutputGenerator::Docbook) && !Config_getBool(DOCBOOK_PROGRAMLISTING))
- {
+ {
ol.disable(OutputGenerator::Docbook);
}
if (ol.isEnabled(OutputGenerator::RTF) && !Config_getBool(RTF_SOURCE_CODE))
- {
+ {
ol.disable(OutputGenerator::RTF);
}
@@ -541,7 +496,8 @@ void FileDefImpl::writeBriefDescription(OutputList &ol)
if (hasBriefDescription())
{
DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
- briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ briefDescription(),TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
if (rootNode && !rootNode->isEmpty())
{
@@ -573,11 +529,9 @@ void FileDefImpl::writeBriefDescription(OutputList &ol)
ol.writeSynopsis();
}
-void FileDefImpl::writeClassesToTagFile(FTextStream &tagFile, ClassSDict *d)
+void FileDefImpl::writeClassesToTagFile(FTextStream &tagFile, const ClassLinkedRefMap &list)
{
- SDict<ClassDef>::Iterator ci(*d);
- ClassDef *cd;
- for (ci.toFirst();(cd=ci.current());++ci)
+ for (const auto &cd : list)
{
if (cd->isLinkableInProject())
{
@@ -596,61 +550,58 @@ void FileDefImpl::writeIncludeFiles(OutputList &ol)
IncludeInfo *ii;
for (;(ii=ili.current());++ili)
{
- if (!ii->indirect)
+ FileDef *fd=ii->fileDef;
+ bool isIDLorJava = FALSE;
+ if (fd)
+ {
+ SrcLangExt lang = fd->getLanguage();
+ isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java;
+ }
+ ol.startTypewriter();
+ if (isIDLorJava) // IDL/Java include
+ {
+ ol.docify("import ");
+ }
+ else if (ii->imported) // Objective-C include
+ {
+ ol.docify("#import ");
+ }
+ else // C/C++ include
+ {
+ ol.docify("#include ");
+ }
+ if (ii->local || isIDLorJava)
+ ol.docify("\"");
+ else
+ ol.docify("<");
+ ol.disable(OutputGenerator::Html);
+ ol.docify(ii->includeName);
+ ol.enableAll();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ // Here we use the include file name as it appears in the file.
+ // we could also we the name as it is used within doxygen,
+ // then we should have used fd->docName() instead of ii->includeName
+ if (fd && fd->isLinkable())
+ {
+ ol.writeObjectLink(fd->getReference(),
+ fd->generateSourceFile() ? fd->includeName() : fd->getOutputFileBase(),
+ 0,ii->includeName);
+ }
+ else
{
- FileDef *fd=ii->fileDef;
- bool isIDLorJava = FALSE;
- if (fd)
- {
- SrcLangExt lang = fd->getLanguage();
- isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java;
- }
- ol.startTypewriter();
- if (isIDLorJava) // IDL/Java include
- {
- ol.docify("import ");
- }
- else if (ii->imported) // Objective-C include
- {
- ol.docify("#import ");
- }
- else // C/C++ include
- {
- ol.docify("#include ");
- }
- if (ii->local || isIDLorJava)
- ol.docify("\"");
- else
- ol.docify("<");
- ol.disable(OutputGenerator::Html);
ol.docify(ii->includeName);
- ol.enableAll();
- ol.disableAllBut(OutputGenerator::Html);
-
- // Here we use the include file name as it appears in the file.
- // we could also we the name as it is used within doxygen,
- // then we should have used fd->docName() instead of ii->includeName
- if (fd && fd->isLinkable())
- {
- ol.writeObjectLink(fd->getReference(),
- fd->generateSourceFile() ? fd->includeName() : fd->getOutputFileBase(),
- 0,ii->includeName);
- }
- else
- {
- ol.docify(ii->includeName);
- }
-
- ol.enableAll();
- if (ii->local || isIDLorJava)
- ol.docify("\"");
- else
- ol.docify(">");
- if (isIDLorJava)
- ol.docify(";");
- ol.endTypewriter();
- ol.lineBreak();
}
+
+ ol.enableAll();
+ if (ii->local || isIDLorJava)
+ ol.docify("\"");
+ else
+ ol.docify(">");
+ if (isIDLorJava)
+ ol.docify(";");
+ ol.endTypewriter();
+ ol.lineBreak();
}
ol.endTextBlock();
}
@@ -669,7 +620,7 @@ void FileDefImpl::writeIncludeGraph(OutputList &ol)
}
else if (!incDepGraph.isTrivial())
{
- ol.startTextBlock();
+ ol.startTextBlock();
ol.disable(OutputGenerator::Man);
ol.startInclDepGraph();
ol.parseText(theTranslator->trInclDepGraph(name()));
@@ -694,7 +645,7 @@ void FileDefImpl::writeIncludedByGraph(OutputList &ol)
}
else if (!incDepGraph.isTrivial())
{
- ol.startTextBlock();
+ ol.startTextBlock();
ol.disable(OutputGenerator::Man);
ol.startInclDepGraph();
ol.parseText(theTranslator->trInclByDepGraph());
@@ -726,13 +677,13 @@ void FileDefImpl::writeNamespaceDeclarations(OutputList &ol,const QCString &titl
bool const isConstantGroup)
{
// write list of namespaces
- if (m_namespaceSDict) m_namespaceSDict->writeDeclaration(ol,title,isConstantGroup);
+ m_namespaces.writeDeclaration(ol,title,isConstantGroup);
}
-void FileDefImpl::writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d)
+void FileDefImpl::writeClassDeclarations(OutputList &ol,const QCString &title,const ClassLinkedRefMap &list)
{
// write list of classes
- if (d) d->writeDeclaration(ol,0,title,FALSE);
+ list.writeDeclaration(ol,0,title,FALSE);
}
void FileDefImpl::writeInlineClasses(OutputList &ol)
@@ -742,7 +693,7 @@ void FileDefImpl::writeInlineClasses(OutputList &ol)
bool isEnabled = ol.isEnabled(OutputGenerator::Html);
ol.enable(OutputGenerator::Html);
- if (m_classSDict) m_classSDict->writeDocumentation(ol,this);
+ m_classes.writeDocumentation(ol,this);
// restore the initial state if needed
if (!isEnabled) ol.disable(OutputGenerator::Html);
@@ -779,18 +730,12 @@ void FileDefImpl::endMemberDocumentation(OutputList &ol)
void FileDefImpl::writeMemberGroups(OutputList &ol)
{
/* write user defined member groups */
- if (m_memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- m_memberGroupSDict->sort();
- MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ if ((!mg->allMembersInSameSection() || !m_subGrouping)
+ && mg->header()!="[NOHEADER]")
{
- if ((!mg->allMembersInSameSection() || !m_subGrouping)
- && mg->header()!="[NOHEADER]")
- {
- mg->writeDeclarations(ol,0,0,this,0);
- }
+ mg->writeDeclarations(ol,0,0,this,0);
}
}
}
@@ -818,35 +763,35 @@ void FileDefImpl::writeSummaryLinks(OutputList &ol) const
SrcLangExt lang=getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if (lde->kind()==LayoutDocEntry::FileClasses && m_classSDict && m_classSDict->declVisible())
+ if (lde->kind()==LayoutDocEntry::FileClasses && m_classes.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "nested-classes";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::FileInterfaces && m_interfaceSDict && m_interfaceSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::FileInterfaces && m_interfaces.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "interfaces";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::FileStructs && m_structSDict && m_structSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::FileStructs && m_structs.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "structs";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::FileExceptions && m_exceptionSDict && m_exceptionSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::FileExceptions && m_exceptions.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "exceptions";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::FileNamespaces && m_namespaceSDict && m_namespaceSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::FileNamespaces && m_namespaces.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "namespaces";
@@ -872,13 +817,13 @@ void FileDefImpl::writeSummaryLinks(OutputList &ol) const
}
/*! Write the documentation page for this file to the file of output
- generators \a ol.
+ generators \a ol.
*/
void FileDefImpl::writeDocumentation(OutputList &ol)
{
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
//funcList->countDecMembers();
-
+
//QCString fn = name();
//if (Config_getBool(FULL_PATH_NAMES))
//{
@@ -886,7 +831,7 @@ void FileDefImpl::writeDocumentation(OutputList &ol)
//}
//printf("WriteDocumentation diskname=%s\n",diskname.data());
-
+
QCString versionTitle;
if (!m_fileVersion.isEmpty())
{
@@ -938,16 +883,16 @@ void FileDefImpl::writeDocumentation(OutputList &ol)
ol.endProjectNumber();
ol.enableAll();
}
-
+
if (Doxygen::searchIndex)
{
Doxygen::searchIndex->setCurrentDoc(this,anchor(),FALSE);
Doxygen::searchIndex->addWord(localName(),TRUE);
}
-
+
//---------------------------------------- start flexible part -------------------------------
-
+
SrcLangExt lang = getLanguage();
QListIterator<LayoutDocEntry> eli(
LayoutDocManager::instance().docEntries(LayoutDocManager::File));
@@ -956,12 +901,12 @@ void FileDefImpl::writeDocumentation(OutputList &ol)
{
switch (lde->kind())
{
- case LayoutDocEntry::BriefDesc:
+ case LayoutDocEntry::BriefDesc:
writeBriefDescription(ol);
- break;
- case LayoutDocEntry::MemberDeclStart:
+ break;
+ case LayoutDocEntry::MemberDeclStart:
startMemberDeclarations(ol);
- break;
+ break;
case LayoutDocEntry::FileIncludes:
writeIncludeFiles(ol);
break;
@@ -974,76 +919,76 @@ void FileDefImpl::writeDocumentation(OutputList &ol)
case LayoutDocEntry::FileSourceLink:
writeSourceLink(ol);
break;
- case LayoutDocEntry::FileClasses:
+ case LayoutDocEntry::FileClasses:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),m_classSDict);
+ writeClassDeclarations(ol,ls->title(lang),m_classes);
}
break;
- case LayoutDocEntry::FileInterfaces:
+ case LayoutDocEntry::FileInterfaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),m_interfaceSDict);
+ writeClassDeclarations(ol,ls->title(lang),m_interfaces);
}
break;
- case LayoutDocEntry::FileStructs:
+ case LayoutDocEntry::FileStructs:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),m_structSDict);
+ writeClassDeclarations(ol,ls->title(lang),m_structs);
}
break;
- case LayoutDocEntry::FileExceptions:
+ case LayoutDocEntry::FileExceptions:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),m_exceptionSDict);
+ writeClassDeclarations(ol,ls->title(lang),m_exceptions);
}
break;
- case LayoutDocEntry::FileNamespaces:
+ case LayoutDocEntry::FileNamespaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeNamespaceDeclarations(ol,ls->title(lang),false);
}
- break;
+ break;
case LayoutDocEntry::FileConstantGroups:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeNamespaceDeclarations(ol,ls->title(lang),true);
}
break;
- case LayoutDocEntry::MemberGroups:
+ case LayoutDocEntry::MemberGroups:
writeMemberGroups(ol);
- break;
- case LayoutDocEntry::MemberDecl:
+ break;
+ case LayoutDocEntry::MemberDecl:
{
LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
}
- break;
- case LayoutDocEntry::MemberDeclEnd:
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
endMemberDeclarations(ol);
break;
- case LayoutDocEntry::DetailedDesc:
+ case LayoutDocEntry::DetailedDesc:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeDetailedDescription(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::MemberDefStart:
+ case LayoutDocEntry::MemberDefStart:
startMemberDocumentation(ol);
- break;
+ break;
case LayoutDocEntry::FileInlineClasses:
writeInlineClasses(ol);
break;
- case LayoutDocEntry::MemberDef:
+ case LayoutDocEntry::MemberDef:
{
LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
}
break;
- case LayoutDocEntry::MemberDefEnd:
+ case LayoutDocEntry::MemberDefEnd:
endMemberDocumentation(ol);
break;
- case LayoutDocEntry::AuthorSection:
+ case LayoutDocEntry::AuthorSection:
writeAuthorSection(ol);
break;
case LayoutDocEntry::ClassIncludes:
@@ -1060,13 +1005,13 @@ void FileDefImpl::writeDocumentation(OutputList &ol)
case LayoutDocEntry::NamespaceStructs:
case LayoutDocEntry::NamespaceExceptions:
case LayoutDocEntry::NamespaceInlineClasses:
- case LayoutDocEntry::GroupClasses:
- case LayoutDocEntry::GroupInlineClasses:
+ case LayoutDocEntry::GroupClasses:
+ case LayoutDocEntry::GroupInlineClasses:
case LayoutDocEntry::GroupNamespaces:
- case LayoutDocEntry::GroupDirs:
- case LayoutDocEntry::GroupNestedGroups:
+ case LayoutDocEntry::GroupDirs:
+ case LayoutDocEntry::GroupNestedGroups:
case LayoutDocEntry::GroupFiles:
- case LayoutDocEntry::GroupGraph:
+ case LayoutDocEntry::GroupGraph:
case LayoutDocEntry::GroupPageDocs:
case LayoutDocEntry::DirSubDirs:
case LayoutDocEntry::DirFiles:
@@ -1095,10 +1040,8 @@ void FileDefImpl::writeMemberPages(OutputList &ol)
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
-
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+
+ for (const auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_documentationLists)
{
@@ -1125,25 +1068,25 @@ void FileDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *currentM
{
if (md->getFileDef()==this && md->getNamespaceDef()==0 && md->isLinkable() && !md->isEnumValue())
{
- ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
{
if (md==currentMd) // selected item => highlight
{
- ol.writeString("<a class=\"qindexHL\" ");
+ ol.writeString(" <tr><td class=\"navtabHL\">");
}
else
{
- ol.writeString("<a class=\"qindex\" ");
+ ol.writeString(" <tr><td class=\"navtab\">");
}
+ ol.writeString("<a class=\"navtab\" ");
ol.writeString("href=\"");
if (createSubDirs) ol.writeString("../../");
ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
ol.writeString("\">");
ol.writeString(convertToHtml(md->localName()));
ol.writeString("</a>");
+ ol.writeString("</td></tr>\n");
}
- ol.writeString("</td></tr>\n");
}
}
}
@@ -1153,14 +1096,12 @@ void FileDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *currentM
}
/*! Write a source listing of this file to the output */
-void FileDefImpl::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu)
+void FileDefImpl::writeSourceHeader(OutputList &ol)
{
- static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
- static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
- static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
- static bool docbookSourceCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
- static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE);
- DevNullCodeDocInterface devNullIntf;
+ bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
+ bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
+ bool docbookSourceCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
+ bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE);
QCString title = m_docname;
if (!m_fileVersion.isEmpty())
{
@@ -1210,33 +1151,28 @@ void FileDefImpl::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu
ol.endTextLink();
ol.popGeneratorState();
}
+}
- (void)sameTu;
- (void)filesInSameTu;
+void FileDefImpl::writeSourceBody(OutputList &ol,ClangTUParser *clangParser)
+{
+ bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
+ DevNullCodeDocInterface devNullIntf;
#if USE_LIBCLANG
- static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
- if (clangAssistedParsing &&
+ if (Doxygen::clangAssistedParsing && clangParser &&
(getLanguage()==SrcLangExt_Cpp || getLanguage()==SrcLangExt_ObjC))
{
- ol.startCodeFragment();
- if (!sameTu)
- {
- ClangParser::instance()->start(absFilePath(),filesInSameTu);
- }
- else
- {
- ClangParser::instance()->switchToFile(absFilePath());
- }
- ClangParser::instance()->writeSources(ol,this);
- ol.endCodeFragment();
+ ol.startCodeFragment("DoxyCode");
+ clangParser->switchToFile(this);
+ clangParser->writeSources(ol,this);
+ ol.endCodeFragment("DoxyCode");
}
else
#endif
{
- CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
- intf.resetCodeParserState();
- ol.startCodeFragment();
- bool needs2PassParsing =
+ auto intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
+ intf->resetCodeParserState();
+ ol.startCodeFragment("DoxyCode");
+ bool needs2PassParsing =
Doxygen::parseSourcesNeeded && // we need to parse (filtered) sources for cross-references
!filterSourceFiles && // but user wants to show sources as-is
!getFileFilter(absFilePath(),TRUE).isEmpty(); // and there is a filter used while parsing
@@ -1244,13 +1180,13 @@ void FileDefImpl::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu
if (needs2PassParsing)
{
// parse code for cross-references only (see bug707641)
- intf.parseCode(devNullIntf,0,
+ intf->parseCode(devNullIntf,0,
fileToString(absFilePath(),TRUE,TRUE),
getLanguage(),
FALSE,0,this
);
}
- intf.parseCode(ol,0,
+ intf->parseCode(ol,0,
fileToString(absFilePath(),filterSourceFiles,TRUE),
getLanguage(), // lang
FALSE, // isExampleBlock
@@ -1264,40 +1200,34 @@ void FileDefImpl::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu
0, // searchCtx
!needs2PassParsing // collectXRefs
);
- ol.endCodeFragment();
+ ol.endCodeFragment("DoxyCode");
}
+}
+
+void FileDefImpl::writeSourceFooter(OutputList &ol)
+{
ol.endContents();
endFileWithNavPath(this,ol);
ol.enableAll();
}
-void FileDefImpl::parseSource(bool sameTu,QStrList &filesInSameTu)
+void FileDefImpl::parseSource(ClangTUParser *clangParser)
{
static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
DevNullCodeDocInterface devNullIntf;
- (void)sameTu;
- (void)filesInSameTu;
#if USE_LIBCLANG
- static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
- if (clangAssistedParsing &&
+ if (Doxygen::clangAssistedParsing && clangParser &&
(getLanguage()==SrcLangExt_Cpp || getLanguage()==SrcLangExt_ObjC))
{
- if (!sameTu)
- {
- ClangParser::instance()->start(absFilePath(),filesInSameTu);
- }
- else
- {
- ClangParser::instance()->switchToFile(absFilePath());
- }
- ClangParser::instance()->writeSources(devNullIntf,this);
+ clangParser->switchToFile(this);
+ clangParser->writeSources(devNullIntf,this);
}
else
#endif
{
- CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
- intf.resetCodeParserState();
- intf.parseCode(
+ auto intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
+ intf->resetCodeParserState();
+ intf->parseCode(
devNullIntf,0,
fileToString(absFilePath(),filterSourceFiles,TRUE),
getLanguage(),
@@ -1306,39 +1236,23 @@ void FileDefImpl::parseSource(bool sameTu,QStrList &filesInSameTu)
}
}
-void FileDefImpl::startParsing()
-{
-}
-
-void FileDefImpl::finishParsing()
-{
- ClangParser::instance()->finish();
-}
-
void FileDefImpl::addMembersToMemberGroup()
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_declarationLists)
{
- ::addMembersToMemberGroup(ml,&m_memberGroupSDict,this);
+ ::addMembersToMemberGroup(ml.get(),&m_memberGroups,this);
}
}
// add members inside sections to their groups
- if (m_memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ if (mg->allMembersInSameSection() && m_subGrouping)
{
- if (mg->allMembersInSameSection() && m_subGrouping)
- {
- //printf("----> addToDeclarationSection(%s)\n",mg->header().data());
- mg->addToDeclarationSection();
- }
+ //printf("----> addToDeclarationSection(%s)\n",mg->header().data());
+ mg->addToDeclarationSection();
}
}
}
@@ -1351,47 +1265,47 @@ void FileDefImpl::insertMember(MemberDef *md)
// name().data(),md->name().data(),md,allMemberList.count());
MemberList *allMemberList = getMemberList(MemberListType_allMembersList);
if (allMemberList && allMemberList->findRef(md)!=-1) // TODO optimize the findRef!
- {
+ {
return;
}
if (allMemberList==0)
{
- allMemberList = new MemberList(MemberListType_allMembersList);
- m_memberLists.append(allMemberList);
+ m_memberLists.emplace_back(std::make_unique<MemberList>(MemberListType_allMembersList));
+ allMemberList = m_memberLists.back().get();
}
- allMemberList->append(md);
+ allMemberList->append(md);
//::addFileMemberNameToIndex(md);
switch (md->memberType())
{
- case MemberType_Variable:
- case MemberType_Property:
+ case MemberType_Variable:
+ case MemberType_Property:
addMemberToList(MemberListType_decVarMembers,md);
addMemberToList(MemberListType_docVarMembers,md);
break;
- case MemberType_Function:
+ case MemberType_Function:
addMemberToList(MemberListType_decFuncMembers,md);
addMemberToList(MemberListType_docFuncMembers,md);
break;
- case MemberType_Typedef:
+ case MemberType_Typedef:
addMemberToList(MemberListType_decTypedefMembers,md);
addMemberToList(MemberListType_docTypedefMembers,md);
break;
- case MemberType_Sequence:
+ case MemberType_Sequence:
addMemberToList(MemberListType_decSequenceMembers,md);
addMemberToList(MemberListType_docSequenceMembers,md);
break;
- case MemberType_Dictionary:
+ case MemberType_Dictionary:
addMemberToList(MemberListType_decDictionaryMembers,md);
addMemberToList(MemberListType_docDictionaryMembers,md);
break;
- case MemberType_Enumeration:
+ case MemberType_Enumeration:
addMemberToList(MemberListType_decEnumMembers,md);
addMemberToList(MemberListType_docEnumMembers,md);
break;
case MemberType_EnumValue: // enum values are shown inside their enums
break;
- case MemberType_Define:
+ case MemberType_Define:
addMemberToList(MemberListType_decDefineMembers,md);
addMemberToList(MemberListType_docDefineMembers,md);
break;
@@ -1406,142 +1320,91 @@ void FileDefImpl::insertMember(MemberDef *md)
}
/*! Adds compound definition \a cd to the list of all compounds of this file */
-void FileDefImpl::insertClass(ClassDef *cd)
+void FileDefImpl::insertClass(const ClassDef *cd)
{
if (cd->isHidden()) return;
- ClassSDict *d=0;
- ClassSDict **dd=&m_classSDict;
+ ClassLinkedRefMap &list = m_classes;
if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
{
if (cd->compoundType()==ClassDef::Interface)
{
- dd = &m_interfaceSDict;
+ list = m_interfaces;
}
else if (cd->compoundType()==ClassDef::Struct)
{
- dd = &m_structSDict;
+ list = m_structs;
}
else if (cd->compoundType()==ClassDef::Exception)
{
- dd = &m_exceptionSDict;
+ list = m_exceptions;
}
}
- if (*dd==0) *dd = new ClassSDict(17);
- d = *dd;
-
- if (Config_getBool(SORT_BRIEF_DOCS))
- {
- d->inSort(cd->name(),cd);
- }
- else
- {
- d->append(cd->name(),cd);
- }
+ list.add(cd->name(),cd);
}
/*! Adds namespace definition \a nd to the list of all compounds of this file */
-void FileDefImpl::insertNamespace(NamespaceDef *nd)
+void FileDefImpl::insertNamespace(const NamespaceDef *nd)
{
if (nd->isHidden()) return;
- if (!nd->name().isEmpty() &&
- (m_namespaceSDict==0 || m_namespaceSDict->find(nd->name())==0))
- {
- if (m_namespaceSDict==0)
- {
- m_namespaceSDict = new NamespaceSDict;
- }
- if (Config_getBool(SORT_BRIEF_DOCS))
- {
- m_namespaceSDict->inSort(nd->name(),nd);
- }
- else
- {
- m_namespaceSDict->append(nd->name(),nd);
- }
- }
+ m_namespaces.add(nd->name(),nd);
}
-QCString FileDefImpl::name() const
-{
- if (Config_getBool(FULL_PATH_NAMES))
- return m_fileName;
- else
- return DefinitionImpl::name();
-}
+QCString FileDefImpl::name() const
+{
+ if (Config_getBool(FULL_PATH_NAMES))
+ return m_fileName;
+ else
+ return DefinitionMixin::name();
+}
-void FileDefImpl::addSourceRef(int line,Definition *d,MemberDef *md)
+void FileDefImpl::addSourceRef(int line,const Definition *d,const MemberDef *md)
{
//printf("FileDefImpl::addSourceDef(%d,%p,%p)\n",line,d,md);
if (d)
{
- if (m_srcDefDict==0) m_srcDefDict = new QIntDict<Definition>(257);
- if (m_srcMemberDict==0) m_srcMemberDict = new QIntDict<MemberDef>(257);
- m_srcDefDict->insert(line,d);
- if (md) m_srcMemberDict->insert(line,md);
+ m_srcDefMap.insert(std::make_pair(line,d));
+ if (md) m_srcMemberMap.insert(std::make_pair(line,md));
//printf("Adding member %s with anchor %s at line %d to file %s\n",
// md?md->name().data():"<none>",md?md->anchor().data():"<none>",line,name().data());
}
}
-Definition *FileDefImpl::getSourceDefinition(int lineNr) const
+const Definition *FileDefImpl::getSourceDefinition(int lineNr) const
{
- Definition *result=0;
- if (m_srcDefDict)
- {
- result = m_srcDefDict->find(lineNr);
- }
- //printf("%s::getSourceDefinition(%d)=%s\n",name().data(),lineNr,result?result->name().data():"none");
- return result;
+ auto it = m_srcDefMap.find(lineNr);
+ //printf("%s::getSourceDefinition(%d)=%s\n",name().data(),lineNr,it!=m_srcDefMap.end()?it->second->name().data():"none");
+ return it!=m_srcDefMap.end() ? it->second : 0;
}
-MemberDef *FileDefImpl::getSourceMember(int lineNr) const
+const MemberDef *FileDefImpl::getSourceMember(int lineNr) const
{
- MemberDef *result=0;
- if (m_srcMemberDict)
- {
- result = m_srcMemberDict->find(lineNr);
- }
- //printf("%s::getSourceMember(%d)=%s\n",name().data(),lineNr,result?result->name().data():"none");
- return result;
+ auto it = m_srcMemberMap.find(lineNr);
+ //printf("%s::getSourceMember(%d)=%s\n",name().data(),lineNr,it!=m_srcMemberMap.end()?it->second->name().data():"none");
+ return it!=m_srcMemberMap.end() ? it->second : 0;
}
void FileDefImpl::addUsingDirective(const NamespaceDef *nd)
{
- if (m_usingDirList==0)
- {
- m_usingDirList = new NamespaceSDict;
- }
- if (m_usingDirList->find(nd->qualifiedName())==0)
- {
- m_usingDirList->append(nd->qualifiedName(),nd);
- }
+ m_usingDirList.add(nd->qualifiedName(),nd);
//printf("%p: FileDefImpl::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count());
}
-NamespaceSDict *FileDefImpl::getUsedNamespaces() const
-{
+LinkedRefMap<const NamespaceDef> FileDefImpl::getUsedNamespaces() const
+{
//printf("%p: FileDefImpl::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0);
- return m_usingDirList;
+ return m_usingDirList;
}
-void FileDefImpl::addUsingDeclaration(Definition *d)
+void FileDefImpl::addUsingDeclaration(const ClassDef *cd)
{
- if (m_usingDeclList==0)
- {
- m_usingDeclList = new SDict<Definition>(17);
- }
- if (m_usingDeclList->find(d->qualifiedName())==0)
- {
- m_usingDeclList->append(d->qualifiedName(),d);
- }
+ m_usingDeclList.add(cd->qualifiedName(),cd);
}
-void FileDefImpl::addIncludeDependency(FileDef *fd,const char *incName,bool local,
- bool imported,bool indirect)
+void FileDefImpl::addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported)
{
//printf("FileDefImpl::addIncludeDependency(%p,%s,%d)\n",fd,incName,local);
QCString iName = fd ? fd->absFilePath().data() : incName;
@@ -1558,16 +1421,15 @@ void FileDefImpl::addIncludeDependency(FileDef *fd,const char *incName,bool loca
ii->includeName = incName;
ii->local = local;
ii->imported = imported;
- ii->indirect = indirect;
m_includeList->append(ii);
m_includeDict->insert(iName,ii);
}
}
-void FileDefImpl::addIncludedUsingDirectives()
+void FileDefImpl::addIncludedUsingDirectives(FileDefSet &visitedFiles)
{
- if (m_visited) return;
- m_visited=TRUE;
+ if (visitedFiles.find(this)!=visitedFiles.end()) return; // file already processed
+ visitedFiles.insert(this);
//printf("( FileDefImpl::addIncludedUsingDirectives for file %s\n",name().data());
if (m_includeList) // file contains #includes
@@ -1577,10 +1439,10 @@ void FileDefImpl::addIncludedUsingDirectives()
IncludeInfo *ii;
for (iii.toFirst();(ii=iii.current());++iii) // foreach #include...
{
- if (ii->fileDef && !ii->fileDef->isVisited()) // ...that is a known file
+ if (ii->fileDef) // ...that is a known file
{
// recurse into this file
- ii->fileDef->addIncludedUsingDirectives();
+ ii->fileDef->addIncludedUsingDirectives(visitedFiles);
}
}
}
@@ -1593,41 +1455,18 @@ void FileDefImpl::addIncludedUsingDirectives()
if (ii->fileDef && ii->fileDef!=this)
{
// add using directives
- NamespaceSDict *unl = ii->fileDef->getUsedNamespaces();
- if (unl)
+ auto unl = ii->fileDef->getUsedNamespaces();
+ for (auto it = unl.rbegin(); it!=unl.rend(); ++it)
{
- NamespaceSDict::Iterator nli(*unl);
- NamespaceDef *nd;
- for (nli.toLast();(nd=nli.current());--nli)
- {
- // append each using directive found in a #include file
- if (m_usingDirList==0) m_usingDirList = new NamespaceSDict;
- //printf("Prepending used namespace %s to the list of file %s\n",
- // nd->name().data(),name().data());
- if (m_usingDirList->find(nd->qualifiedName())==0) // not yet added
- {
- m_usingDirList->prepend(nd->qualifiedName(),nd);
- }
- }
+ const auto *nd = *it;
+ m_usingDirList.prepend(nd->qualifiedName(),nd);
}
// add using declarations
- SDict<Definition> *udl = ii->fileDef->getUsedClasses();
- if (udl)
+ auto udl = ii->fileDef->getUsedClasses();
+ for (auto it = udl.rbegin(); it!=udl.rend(); ++it)
{
- SDict<Definition>::Iterator udi(*udl);
- Definition *d;
- for (udi.toLast();(d=udi.current());--udi)
- {
- //printf("Adding using declaration %s\n",d->name().data());
- if (m_usingDeclList==0)
- {
- m_usingDeclList = new SDict<Definition>(17);
- }
- if (m_usingDeclList->find(d->qualifiedName())==0)
- {
- m_usingDeclList->prepend(d->qualifiedName(),d);
- }
- }
+ const auto *cd = *it;
+ m_usingDeclList.prepend(cd->qualifiedName(),cd);
}
}
}
@@ -1655,7 +1494,6 @@ void FileDefImpl::addIncludedByDependency(FileDef *fd,const char *incName,
ii->includeName = incName;
ii->local = local;
ii->imported = imported;
- ii->indirect = FALSE;
m_includedByList->append(ii);
m_includedByDict->insert(iName,ii);
}
@@ -1667,13 +1505,13 @@ bool FileDefImpl::isIncluded(const QCString &name) const
return m_includeDict!=0 && m_includeDict->find(name)!=0;
}
-bool FileDefImpl::generateSourceFile() const
-{
+bool FileDefImpl::generateSourceFile() const
+{
static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
static bool verbatimHeaders = Config_getBool(VERBATIM_HEADERS);
- return !isReference() &&
- (sourceBrowser ||
- (verbatimHeaders && guessSection(name())==Entry::HEADER_SEC)
+ return !isReference() &&
+ (sourceBrowser ||
+ (verbatimHeaders && guessSection(name())==Entry::HEADER_SEC)
) &&
!isDocumentationFile();
}
@@ -1682,7 +1520,7 @@ bool FileDefImpl::generateSourceFile() const
void FileDefImpl::addListReferences()
{
{
- const std::vector<ListItemInfo> &xrefItems = xrefListItems();
+ const RefItemVector &xrefItems = xrefListItems();
addRefItem(xrefItems,
getOutputFileBase(),
theTranslator->trFile(TRUE,TRUE),
@@ -1691,18 +1529,11 @@ void FileDefImpl::addListReferences()
0
);
}
- if (m_memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->addListReferences(this);
- }
+ mg->addListReferences(this);
}
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_documentationLists)
{
@@ -1754,7 +1585,7 @@ static Directory *findDirNode(Directory *root,const QCString &name)
{
// recurse into the directory
return findDirNode(dir,name.mid(dirName.length()+1));
- }
+ }
else // partial match => we need to split the path into three parts
{
QCString baseName =dirName.left(sp);
@@ -1784,7 +1615,7 @@ static Directory *findDirNode(Directory *root,const QCString &name)
// add new branch to the root
if (!root->children().isEmpty())
{
- root->children().getLast()->setLast(FALSE);
+ root->children().getLast()->setLast(FALSE);
}
root->addChild(base);
return newBranch;
@@ -1797,14 +1628,14 @@ static Directory *findDirNode(Directory *root,const QCString &name)
{
return root; // put the file under the root node.
}
- else // need to create a subdir
+ else // need to create a subdir
{
QCString baseName = name.left(si);
//printf("new subdir %s\n",baseName.data());
Directory *newBranch = new Directory(root,baseName);
if (!root->children().isEmpty())
{
- root->children().getLast()->setLast(FALSE);
+ root->children().getLast()->setLast(FALSE);
}
root->addChild(newBranch);
return newBranch;
@@ -1818,7 +1649,7 @@ static void mergeFileDef(Directory *root,FileDef *fd)
Directory *dirNode = findDirNode(root,filePath);
if (!dirNode->children().isEmpty())
{
- dirNode->children().getLast()->setLast(FALSE);
+ dirNode->children().getLast()->setLast(FALSE);
}
DirEntry *e=new DirEntry(dirNode,fd);
dirNode->addChild(e);
@@ -1907,20 +1738,18 @@ static void addDirsAsGroups(Directory *root,GroupDef *parent,int level)
GroupDef *gd=0;
if (root->kind()==DirEntry::Dir)
{
- gd = createGroupDef("[generated]",
+ gd = Doxygen::groupLinkedMap->add(root->path(),
+ std::unique_ptr<GroupDef>(
+ createGroupDef("[generated]",
1,
root->path(), // name
root->name() // title
- );
- if (parent)
+ )));
+ if (parent)
{
parent->addGroup(gd);
gd->makePartOfGroup(parent);
}
- else
- {
- Doxygen::groupSDict->append(root->path(),gd);
- }
}
QListIterator<DirEntry> dli(root->children());
DirEntry *de;
@@ -1937,15 +1766,11 @@ void generateFileTree()
{
Directory *root=new Directory(0,"root");
root->setLast(TRUE);
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
- mergeFileDef(root,fd);
+ mergeFileDef(root,fd.get());
}
}
//t << "<div class=\"directory\">\n";
@@ -1959,40 +1784,28 @@ void generateFileTree()
void FileDefImpl::combineUsingRelations()
{
- if (m_visited) return; // already done
- m_visited=TRUE;
- if (m_usingDirList)
+ LinkedRefMap<const NamespaceDef> usingDirList = m_usingDirList;
+ NamespaceDefSet visitedNamespaces;
+ for (auto &nd : usingDirList)
{
- NamespaceSDict::Iterator nli(*m_usingDirList);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd);
+ if (ndm)
{
- nd->combineUsingRelations();
+ ndm->combineUsingRelations(visitedNamespaces);
}
- for (nli.toFirst();(nd=nli.current());++nli)
+ }
+
+ for (auto &nd : usingDirList)
+ {
+ // add used namespaces of namespace nd to this namespace
+ for (const auto &und : nd->getUsedNamespaces())
{
- // add used namespaces of namespace nd to this namespace
- if (nd->getUsedNamespaces())
- {
- NamespaceSDict::Iterator unli(*nd->getUsedNamespaces());
- NamespaceDef *und;
- for (unli.toFirst();(und=unli.current());++unli)
- {
- //printf("Adding namespace %s to the using list of %s\n",und->qualifiedName().data(),qualifiedName().data());
- addUsingDirective(und);
- }
- }
- // add used classes of namespace nd to this namespace
- if (nd->getUsedClasses())
- {
- SDict<Definition>::Iterator cli(*nd->getUsedClasses());
- Definition *ucd;
- for (cli.toFirst();(ucd=cli.current());++cli)
- {
- //printf("Adding class %s to the using list of %s\n",cd->qualifiedName().data(),qualifiedName().data());
- addUsingDeclaration(ucd);
- }
- }
+ addUsingDirective(und);
+ }
+ // add used classes of namespace nd to this namespace
+ for (const auto &ucd : nd->getUsedClasses())
+ {
+ addUsingDeclaration(ucd);
}
}
}
@@ -2003,7 +1816,8 @@ bool FileDefImpl::isDocumentationFile() const
name().right(4)==".txt" ||
name().right(4)==".dox" ||
name().right(3)==".md" ||
- name().right(9)==".markdown";
+ name().right(9)==".markdown" ||
+ getLanguageFromFileName(getFileNameExtension(name())) == SrcLangExt_Markdown;
}
void FileDefImpl::acquireFileVersion()
@@ -2058,82 +1872,77 @@ QCString FileDefImpl::getOutputFileBase() const
}
/*! Returns the name of the verbatim copy of this file (if any). */
-QCString FileDefImpl::includeName() const
-{
- return getSourceFileBase();
-}
-
-MemberList *FileDefImpl::createMemberList(MemberListType lt)
+QCString FileDefImpl::includeName() const
{
- m_memberLists.setAutoDelete(TRUE);
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
- {
- if (ml->listType()==lt)
- {
- return ml;
- }
- }
- // not found, create a new member list
- ml = new MemberList(lt);
- m_memberLists.append(ml);
- return ml;
+ return getSourceFileBase();
}
void FileDefImpl::addMemberToList(MemberListType lt,MemberDef *md)
{
static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
static bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
- MemberList *ml = createMemberList(lt);
+ const auto &ml = m_memberLists.get(lt);
ml->setNeedsSorting(
((ml->listType()&MemberListType_declarationLists) && sortBriefDocs) ||
((ml->listType()&MemberListType_documentationLists) && sortMemberDocs));
ml->append(md);
-#if 0
- if (ml->needsSorting())
- ml->inSort(md);
- else
- ml->append(md);
-#endif
if (lt&MemberListType_documentationLists)
{
ml->setInFile(TRUE);
}
- if (ml->listType()&MemberListType_declarationLists) md->setSectionList(ml);
+ if (ml->listType()&MemberListType_declarationLists)
+ {
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm)
+ {
+ mdm->setSectionList(this,ml.get());
+ }
+ }
}
void FileDefImpl::sortMemberLists()
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (;(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
}
- if (m_memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- MemberList *mlg = mg->members();
- if (mlg->needsSorting()) { mlg->sort(); mlg->setNeedsSorting(FALSE); }
- }
+ MemberList *mlg = mg->members();
+ if (mlg->needsSorting()) { mlg->sort(); mlg->setNeedsSorting(FALSE); }
}
+ if (Config_getBool(SORT_BRIEF_DOCS))
+ {
+ auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
+ {
+ return Config_getBool(SORT_BY_SCOPE_NAME) ?
+ qstricmp(c1->name(), c2->name())<0 :
+ qstricmp(c1->className(), c2->className())<0;
+ };
+
+ std::sort(m_classes.begin(), m_classes.end(), classComp);
+ std::sort(m_interfaces.begin(),m_interfaces.end(),classComp);
+ std::sort(m_structs.begin(), m_structs.end(), classComp);
+ std::sort(m_exceptions.begin(),m_exceptions.end(),classComp);
+
+ auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
+ {
+ return qstricmp(n1->name(),n2->name())<0;
+ };
+
+ std::sort(m_namespaces.begin(),m_namespaces.end(),namespaceComp);
+ }
}
MemberList *FileDefImpl::getMemberList(MemberListType lt) const
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (;(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()==lt)
{
- return ml;
+ return ml.get();
}
}
return 0;
@@ -2143,7 +1952,7 @@ void FileDefImpl::writeMemberDeclarations(OutputList &ol,MemberListType lt,const
{
static bool optVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
MemberList * ml = getMemberList(lt);
- if (ml)
+ if (ml)
{
if (optVhdl) // use specific declarations function
{
@@ -2170,7 +1979,7 @@ bool FileDefImpl::isLinkableInProject() const
}
static void getAllIncludeFilesRecursively(
- QDict<void> *filesVisited,const FileDef *fd,QStrList &incFiles)
+ StringUnorderedSet &filesVisited,const FileDef *fd,StringVector &incFiles)
{
if (fd->includeFileList())
{
@@ -2179,21 +1988,21 @@ static void getAllIncludeFilesRecursively(
for (iii.toFirst();(ii=iii.current());++iii)
{
if (ii->fileDef && !ii->fileDef->isReference() &&
- !filesVisited->find(ii->fileDef->absFilePath()))
+ filesVisited.find(ii->fileDef->absFilePath().str())==filesVisited.end())
{
//printf("FileDefImpl::addIncludeDependency(%s)\n",ii->fileDef->absFilePath().data());
- incFiles.append(ii->fileDef->absFilePath());
- filesVisited->insert(ii->fileDef->absFilePath(),(void*)0x8);
+ incFiles.push_back(ii->fileDef->absFilePath().str());
+ filesVisited.insert(ii->fileDef->absFilePath().str());
getAllIncludeFilesRecursively(filesVisited,ii->fileDef,incFiles);
}
}
}
}
-void FileDefImpl::getAllIncludeFilesRecursively(QStrList &incFiles) const
+void FileDefImpl::getAllIncludeFilesRecursively(StringVector &incFiles) const
{
- QDict<void> includes(257);
- ::getAllIncludeFilesRecursively(&includes,this,incFiles);
+ StringUnorderedSet includes;
+ ::getAllIncludeFilesRecursively(includes,this,incFiles);
}
QCString FileDefImpl::title() const
@@ -2218,22 +2027,15 @@ QCString FileDefImpl::includedByDependencyGraphFileName() const
void FileDefImpl::countMembers()
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
ml->countDecMembers();
ml->countDocMembers();
}
- if (m_memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->countDecMembers();
- mg->countDocMembers();
- }
+ mg->countDecMembers();
+ mg->countDocMembers();
}
}
@@ -2249,3 +2051,31 @@ int FileDefImpl::numDecMembers() const
return ml ? ml->numDecMembers() : 0;
}
+// --- Cast functions
+
+FileDef *toFileDef(Definition *d)
+{
+ if (d==0) return 0;
+ if (d && typeid(*d)==typeid(FileDefImpl))
+ {
+ return static_cast<FileDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+const FileDef *toFileDef(const Definition *d)
+{
+ if (d==0) return 0;
+ if (d && typeid(*d)==typeid(FileDefImpl))
+ {
+ return static_cast<const FileDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
diff --git a/src/filedef.h b/src/filedef.h
index b66d7be..ba18c2b 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,6 +18,8 @@
#ifndef FILEDEF_H
#define FILEDEF_H
+#include <set>
+
#include "index.h"
#include <qlist.h>
#include <qintdict.h>
@@ -25,43 +27,46 @@
#include "definition.h"
#include "sortdict.h"
#include "memberlist.h"
+#include "containers.h"
+#include "classlist.h"
class MemberList;
class FileDef;
class FileList;
-class ClassSDict;
class ClassDef;
-class ClassList;
class MemberDef;
class OutputList;
class NamespaceDef;
-class NamespaceSDict;
-class MemberGroupSDict;
+class NamespaceLinkedRefMap;
class PackageDef;
class DirDef;
class FTextStream;
+class ClangTUParser;
+
+// --- Set of files
+
+using FileDefSet = std::set<const FileDef*>;
/** Class representing the data associated with a \#include statement. */
struct IncludeInfo
{
- IncludeInfo() : fileDef(0), local(FALSE), imported(FALSE), indirect(FALSE) {}
+ IncludeInfo() : fileDef(0), local(FALSE), imported(FALSE) {}
~IncludeInfo() {}
FileDef *fileDef;
QCString includeName;
bool local;
bool imported;
- bool indirect;
};
-/** A model of a file symbol.
- *
+/** A model of a file symbol.
+ *
* An object of this class contains all file information that is gathered.
* This includes the members and compounds defined in the file.
- *
+ *
* The member writeDocumentation() can be used to generate the page of
* documentation to HTML and LaTeX.
*/
-class FileDef : virtual public Definition
+class FileDef : public DefinitionMutable, public Definition
{
public:
~FileDef() {}
@@ -99,8 +104,8 @@ class FileDef : virtual public Definition
virtual bool isDocumentationFile() const = 0;
- virtual Definition *getSourceDefinition(int lineNr) const = 0;
- virtual MemberDef *getSourceMember(int lineNr) const = 0;
+ virtual const Definition *getSourceDefinition(int lineNr) const = 0;
+ virtual const MemberDef *getSourceMember(int lineNr) const = 0;
/*! Returns the absolute path of this file. */
virtual QCString getPath() const = 0;
@@ -115,19 +120,19 @@ class FileDef : virtual public Definition
virtual PackageDef *packageDef() const = 0;
virtual DirDef *getDirDef() const = 0;
- virtual NamespaceSDict *getUsedNamespaces() const = 0;
- virtual SDict<Definition> *getUsedClasses() const = 0;
+ virtual LinkedRefMap<const NamespaceDef> getUsedNamespaces() const = 0;
+ virtual LinkedRefMap<const ClassDef> getUsedClasses() const = 0;
virtual QList<IncludeInfo> *includeFileList() const = 0;
virtual QList<IncludeInfo> *includedByFileList() const = 0;
- virtual void getAllIncludeFilesRecursively(QStrList &incFiles) const = 0;
+ virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const = 0;
virtual MemberList *getMemberList(MemberListType lt) const = 0;
- virtual const QList<MemberList> &getMemberLists() const = 0;
+ virtual const MemberLists &getMemberLists() const = 0;
/* user defined member groups */
- virtual MemberGroupSDict *getMemberGroupSDict() const = 0;
- virtual NamespaceSDict *getNamespaceSDict() const = 0;
- virtual ClassSDict *getClassSDict() const = 0;
+ virtual const MemberGroupList &getMemberGroups() const = 0;
+ virtual NamespaceLinkedRefMap getNamespaces() const = 0;
+ virtual ClassLinkedRefMap getClasses() const = 0;
virtual QCString title() const = 0;
virtual bool hasDetailedDescription() const = 0;
@@ -141,7 +146,7 @@ class FileDef : virtual public Definition
//---------------------------------
- virtual void addSourceRef(int line,Definition *d,MemberDef *md) = 0;
+ virtual void addSourceRef(int line,const Definition *d,const MemberDef *md) = 0;
virtual void writeDocumentation(OutputList &ol) = 0;
virtual void writeMemberPages(OutputList &ol) = 0;
@@ -149,43 +154,48 @@ class FileDef : virtual public Definition
virtual void writeSummaryLinks(OutputList &ol) const = 0;
virtual void writeTagFile(FTextStream &t) = 0;
- virtual void startParsing() = 0;
- virtual void writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu) = 0;
- virtual void parseSource(bool sameTu,QStrList &filesInSameTu) = 0;
- virtual void finishParsing() = 0;
+ virtual void writeSourceHeader(OutputList &ol) = 0;
+ virtual void writeSourceBody(OutputList &ol,ClangTUParser *clangParser) = 0;
+ virtual void writeSourceFooter(OutputList &ol) = 0;
+ virtual void parseSource(ClangTUParser *clangParser) = 0;
virtual void setDiskName(const QCString &name) = 0;
virtual void insertMember(MemberDef *md) = 0;
- virtual void insertClass(ClassDef *cd) = 0;
- virtual void insertNamespace(NamespaceDef *nd) = 0;
+ virtual void insertClass(const ClassDef *cd) = 0;
+ virtual void insertNamespace(const NamespaceDef *nd) = 0;
virtual void computeAnchors() = 0;
virtual void setPackageDef(PackageDef *pd) = 0;
virtual void setDirDef(DirDef *dd) = 0;
virtual void addUsingDirective(const NamespaceDef *nd) = 0;
- virtual void addUsingDeclaration(Definition *def) = 0;
+ virtual void addUsingDeclaration(const ClassDef *cd) = 0;
virtual void combineUsingRelations() = 0;
virtual bool generateSourceFile() const = 0;
virtual void sortMemberLists() = 0;
- virtual void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported,bool indirect) = 0;
+ virtual void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported) = 0;
virtual void addIncludedByDependency(FileDef *fd,const char *incName,bool local,bool imported) = 0;
virtual void addMembersToMemberGroup() = 0;
virtual void distributeMemberGroupDocumentation() = 0;
virtual void findSectionsInDocumentation() = 0;
- virtual void addIncludedUsingDirectives() = 0;
+ virtual void addIncludedUsingDirectives(FileDefSet &visitedFiles) = 0;
virtual void addListReferences() = 0;
-
- virtual void setVisited(bool v) = 0;
- virtual bool isVisited() const = 0;
};
FileDef *createFileDef(const char *p,const char *n,const char *ref=0,const char *dn=0);
+
+// --- Cast functions
+
+FileDef *toFileDef(Definition *d);
+const FileDef *toFileDef(const Definition *d);
+
+// ------------------
+
/** Class representing a list of FileDef objects. */
class FileList : public QList<FileDef>
{
@@ -217,7 +227,7 @@ class OutputNameList : public QList<FileList>
class OutputNameDict : public QDict<FileList>
{
public:
- OutputNameDict(int size) : QDict<FileList>(size) {}
+ OutputNameDict(uint size) : QDict<FileList>(size) {}
~OutputNameDict() {}
};
@@ -228,11 +238,11 @@ class DirEntry
{
public:
enum EntryKind { Dir, File };
- DirEntry(DirEntry *parent,FileDef *fd)
- : m_parent(parent), m_name(fd->name()), m_kind(File), m_fd(fd),
+ DirEntry(DirEntry *parent,FileDef *fd)
+ : m_parent(parent), m_name(fd->name()), m_kind(File), m_fd(fd),
m_isLast(FALSE) { }
- DirEntry(DirEntry *parent,QCString name)
- : m_parent(parent), m_name(name), m_kind(Dir),
+ DirEntry(DirEntry *parent,QCString name)
+ : m_parent(parent), m_name(name), m_kind(Dir),
m_fd(0), m_isLast(FALSE) { }
virtual ~DirEntry() { }
EntryKind kind() const { return m_kind; }
@@ -257,7 +267,7 @@ class DirEntry
class Directory : public DirEntry
{
public:
- Directory(Directory *parent,const QCString &name)
+ Directory(Directory *parent,const QCString &name)
: DirEntry(parent,name)
{ m_children.setAutoDelete(TRUE); }
virtual ~Directory() {}
diff --git a/src/filename.cpp b/src/filename.cpp
deleted file mode 100644
index 637fe33..0000000
--- a/src/filename.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include "filename.h"
-#include "util.h"
-#include "config.h"
-
-FileName::FileName(const char *fn,const char *n) : FileList()
-{
- setAutoDelete(TRUE);
- fName=fn;
- name=n;
-}
-
-FileName::~FileName()
-{
-}
-
-
-void FileName::generateDiskNames()
-{
- //QCString commonPrefix;
- QListIterator<FileDef> it(*this);
- FileDef *fd;
- int count=0;
- for (;(fd=it.current());++it)
- {
- if (!fd->isReference()) count++;
- }
- if (count==1)
- {
- // skip references
- for (it.toFirst();(fd=it.current()) && fd->isReference();++it) { }
- if (fd)
- {
- // name if unique, so diskname is simply the name
- //printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
- fd->setDiskName(name);
- }
- }
- else if (count>1) // multiple occurrences of the same file name
- {
- //printf("Multiple occurrences of %s\n",name.data());
- int i=0,j=0;
- bool found=FALSE;
- while (!found) // search for the common prefix of all paths
- {
- for (it.toFirst();(fd=it.current()) && fd->isReference();++it) { }
- if (fd)
- {
- char c=fd->getPath().at(i);
- if (c=='/') j=i; // remember last position of dirname
- ++it;
- while ((fd=it.current()) && !found)
- {
- QCString path = fd->getPath();
- if (!fd->isReference())
- {
- //printf("i=%d j=%d fd->path='%s' fd->name='%s'\n",i,j,fd->path.left(i).data(),fd->name().data());
- if (i==(int)path.length())
- {
- //warning("Input file %s found multiple times!\n"
- // " The generated documentation for this file may not be correct!\n",fd->absFilePath().data());
- found=TRUE;
- }
- else if (path[i]!=c)
- {
- found=TRUE;
- }
- }
- ++it;
- }
- i++;
- }
- }
- for (it.toFirst();(fd=it.current());++it)
- {
- //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
- if (!fd->isReference())
- {
- QCString path = fd->getPath();
- QCString prefix = path.right(path.length()-j-1);
- fd->setName(prefix+name);
- //printf("!!!!!!!! non unique disk name=%s:%s\n",prefix.data(),name.data());
- fd->setDiskName(prefix+name);
- }
- }
- }
-}
-
-int FileName::compareValues(const FileDef *f1, const FileDef *f2) const
-{
- return qstricmp(f1->fileName(),f2->fileName());
-}
-
-FileNameIterator::FileNameIterator(const FileName &fname) :
- QListIterator<FileDef>(fname)
-{
-}
-
-FileNameList::FileNameList() : QList<FileName>()
-{
-}
-
-FileNameList::~FileNameList()
-{
-}
-
-void FileNameList::generateDiskNames()
-{
- FileNameListIterator it(*this);
- FileName *fn;
- for (;(fn=it.current());++it)
- {
- fn->generateDiskNames();
- }
-}
-
-int FileNameList::compareValues(const FileName *f1, const FileName *f2) const
-{
- return Config_getBool(FULL_PATH_NAMES) ?
- qstricmp(f1->fullName(),f2->fullName()) :
- qstricmp(f1->fileName(),f2->fileName());
-}
-
-FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) :
- QListIterator<FileName>(fnlist)
-{
-}
-
-static bool getCaseSenseNames()
-{
- static bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
- return caseSenseNames;
-}
-
-FileNameDict::FileNameDict(uint size) : QDict<FileName>(size,getCaseSenseNames())
-{
-}
-
diff --git a/src/filename.h b/src/filename.h
index fbee0e1..d236046 100644
--- a/src/filename.h
+++ b/src/filename.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,57 +16,62 @@
#ifndef FILENAME_H
#define FILENAME_H
-#include <qdict.h>
-#include <qlist.h>
-#include "filedef.h"
+#include <memory>
+#include <vector>
-/** Class representing all files with a certain base name */
-class FileName : public FileList
-{
- public:
- FileName(const char *fn,const char *name);
- ~FileName();
- const char *fileName() const { return name; }
- const char *fullName() const { return fName; }
- void generateDiskNames();
+#include "linkedmap.h"
+#include "config.h"
- private:
- int compareValues(const FileDef *item1,const FileDef *item2) const;
- QCString name;
- QCString fName;
-};
+class FileDef;
-/** Iterator for FileDef objects in a FileName list. */
-class FileNameIterator : public QListIterator<FileDef>
+/** Class representing all files with a certain base name */
+class FileName : public std::vector< std::unique_ptr<FileDef> >
{
public:
- FileNameIterator(const FileName &list);
-};
+ FileName(const char *nm,const char *fn) : m_name(nm), m_fName(fn), m_pathName("tmp") {}
+ const char *fileName() const { return m_name; }
+ const char *fullName() const { return m_fName; }
+ const char *path() const { return m_pathName; }
-/** Class representing a list of FileName objects. */
-class FileNameList : public QList<FileName>
-{
- public:
- FileNameList();
- ~FileNameList();
- void generateDiskNames();
private:
- int compareValues(const FileName *item1,const FileName *item2) const;
+ QCString m_name;
+ QCString m_fName;
+ QCString m_pathName;
};
-/** Iterator for FileName objects in a FileNameList. */
-class FileNameListIterator : public QListIterator<FileName>
+//! Custom combined key compare and hash functor that uses a lower case string in
+//! case CASE_SENSE_NAMES is set to NO.
+class FileNameFn
{
public:
- FileNameListIterator( const FileNameList &list );
+ //! used as hash function
+ std::size_t operator()(const std::string& input) const noexcept
+ {
+ return std::hash<std::string>()(searchKey(input));
+ }
+ //! used as equal operator
+ bool operator() (const std::string &t1, const std::string &t2) const
+ {
+ return searchKey(t1) == searchKey(t2);
+ }
+ private:
+ std::string searchKey(std::string input) const
+ {
+ std::string key = input;
+ if (!Config_getBool(CASE_SENSE_NAMES))
+ {
+ // convert key to lower case
+ std::transform(key.begin(),key.end(),key.begin(),
+ [](char c){ return (char)std::tolower(c); });
+ }
+ return key;
+ }
};
-/** Unsorted dictionary of FileName objects. */
-class FileNameDict : public QDict<FileName>
+/** Ordered dictionary of FileName objects. */
+class FileNameLinkedMap : public LinkedMap<FileName,FileNameFn,FileNameFn,
+ std::unordered_multimap<std::string,FileName*,FileNameFn,FileNameFn> >
{
- public:
- FileNameDict(uint size);
- ~FileNameDict() {}
};
#endif
diff --git a/src/formula.cpp b/src/formula.cpp
index 64555c9..8ba9729 100644
--- a/src/formula.cpp
+++ b/src/formula.cpp
@@ -1,11 +1,10 @@
/******************************************************************************
- *
*
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -14,46 +13,142 @@
*
*/
-#include <stdlib.h>
-#include <qfile.h>
-#include <qfileinfo.h>
-#include <qtextstream.h>
-#include <qdir.h>
-
#include "formula.h"
-#include "image.h"
-#include "util.h"
#include "message.h"
#include "config.h"
-#include "portable.h"
-#include "index.h"
-#include "doxygen.h"
#include "ftextstream.h"
+#include "util.h"
+#include "portable.h"
+#include "image.h"
-Formula::Formula(const char *text)
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qdir.h>
+
+#include <map>
+#include <vector>
+#include <string>
+#include <utility>
+
+// TODO: remove these dependencies
+#include "doxygen.h" // for Doxygen::indexList
+#include "index.h" // for Doxygen::indexList
+
+static int determineInkscapeVersion(QDir &thisDir);
+
+// Remove the temporary files
+#define RM_TMP_FILES (true)
+//#define RM_TMP_FILES (false)
+
+struct FormulaManager::Private
+{
+ void storeDisplaySize(int id,int w,int h)
+ {
+ displaySizeMap.insert(std::make_pair(id,DisplaySize(w,h)));
+ }
+ DisplaySize getDisplaySize(int id)
+ {
+ auto it = displaySizeMap.find(id);
+ if (it!=displaySizeMap.end())
+ {
+ return it->second;
+ }
+ return DisplaySize(-1,-1);
+ }
+ StringVector formulas;
+ IntMap formulaMap;
+ std::map<int,DisplaySize> displaySizeMap;
+};
+
+FormulaManager::FormulaManager() : p(new Private)
{
- static int count=0;
- number = count++;
- form=text;
}
-Formula::~Formula()
+FormulaManager &FormulaManager::instance()
{
+ static FormulaManager fm;
+ return fm;
}
-int Formula::getId()
+void FormulaManager::readFormulas(const char *dir,bool doCompare)
{
- return number;
+ QFile f(QCString(dir)+"/formula.repository");
+ if (f.open(IO_ReadOnly)) // open repository
+ {
+ uint formulaCount=0;
+ msg("Reading formula repository...\n");
+ QTextStream t(&f);
+ QCString line;
+ int lineNr=1;
+ while (!t.eof())
+ {
+ line=t.readLine().utf8();
+ // old format: \_form#<digits>:formula
+ // new format: \_form#<digits>=<digits>x<digits>:formula
+ int hi=line.find('#');
+ int ei=line.find('=');
+ int se=line.find(':'); // find name and text separator.
+ if (hi==-1 || se==-1 || hi>se)
+ {
+ warn_uncond("%s/formula.repository is corrupted at line %d!\n",dir,lineNr);
+ break;
+ }
+ else
+ {
+ QCString formName = line.left(se);
+ QCString formText = line.right(line.length()-se-1);
+ int w=-1,h=-1;
+ if (ei!=-1 && ei>hi && ei<se) // new format
+ {
+ int xi=formName.find('x',ei);
+ if (xi!=-1)
+ {
+ w=formName.mid(ei+1,xi-ei-1).toInt();
+ h=formName.mid(xi+1).toInt();
+ }
+ formName = formName.left(ei);
+ }
+ else
+ {
+ ei=formName.length();
+ }
+ if (doCompare)
+ {
+ int formId = formName.mid(hi+1,ei-hi-1).toInt();
+ QCString storedFormText = FormulaManager::instance().findFormula(formId);
+ if (storedFormText!=formText)
+ {
+ term("discrepancy between formula repositories! Remove "
+ "formula.repository and from_* files from output directories.\n");
+ }
+ formulaCount++;
+ }
+ else
+ {
+ int id = addFormula(formText);
+ if (w!=-1 && h!=-1)
+ {
+ p->storeDisplaySize(id,w,h);
+ }
+ }
+ }
+ lineNr++;
+ }
+ if (doCompare && formulaCount!=p->formulas.size())
+ {
+ term("size discrepancy between formula repositories! Remove "
+ "formula.repository and from_* files from output directories.\n");
+ }
+ }
}
-void FormulaList::generateBitmaps(const char *path)
+void FormulaManager::generateImages(const char *path,Format format,HighDPI hd) const
{
- int x1,y1,x2,y2;
QDir d(path);
// store the original directory
if (!d.exists())
{
- term("Output dir %s does not exist!\n",path);
+ term("Output directory '%s' does not exist!\n",path);
}
QCString oldDir = QDir::currentDirPath().utf8();
QCString macroFile = Config_getString(FORMULA_MACROFILE);
@@ -70,12 +165,8 @@ void FormulaList::generateBitmaps(const char *path)
QDir thisDir;
// generate a latex file containing one formula per page.
QCString texName="_formulas.tex";
- QList<int> pagesToGenerate;
- pagesToGenerate.setAutoDelete(TRUE);
- FormulaListIterator fli(*this);
- Formula *formula;
+ IntVector formulasToGenerate;
QFile f(texName);
- bool formulaError=FALSE;
if (f.open(IO_WriteOnly))
{
FTextStream t(&f);
@@ -91,59 +182,55 @@ void FormulaList::generateBitmaps(const char *path)
copyFile(macroFile,stripMacroFile);
t << "\\input{" << stripMacroFile << "}" << endl;
}
- t << "\\pagestyle{empty}" << endl;
+ t << "\\pagestyle{empty}" << endl;
t << "\\begin{document}" << endl;
- int page=0;
- for (fli.toFirst();(formula=fli.current());++fli)
+ for (int i=0; i<(int)p->formulas.size(); i++)
{
QCString resultName;
- resultName.sprintf("form_%d.png",formula->getId());
+ resultName.sprintf("form_%d.%s",i,format==Format::Vector?"svg":"png");
// only formulas for which no image exists are generated
QFileInfo fi(resultName);
if (!fi.exists())
{
// we force a pagebreak after each formula
- t << formula->getFormulaText() << endl << "\\pagebreak\n\n";
- pagesToGenerate.append(new int(page));
+ t << p->formulas[i].c_str() << endl << "\\pagebreak\n\n";
+ formulasToGenerate.push_back(i);
}
Doxygen::indexList->addImageFile(resultName);
- page++;
}
t << "\\end{document}" << endl;
f.close();
}
- if (pagesToGenerate.count()>0) // there are new formulas
+ if (!formulasToGenerate.empty()) // there are new formulas
{
//printf("Running latex...\n");
//system("latex _formulas.tex </dev/null >/dev/null");
QCString latexCmd = "latex";
Portable::sysTimerStart();
- if (Portable::system(latexCmd,"_formulas.tex")!=0)
+ char args[4096];
+ sprintf(args,"-interaction=batchmode _formulas.tex >%s",Portable::devNull());
+ if (Portable::system(latexCmd,args)!=0)
{
err("Problems running latex. Check your installation or look "
"for typos in _formulas.tex and check _formulas.log!\n");
- formulaError=TRUE;
- //return;
+ Portable::sysTimerStop();
+ QDir::setCurrent(oldDir);
+ return;
}
Portable::sysTimerStop();
//printf("Running dvips...\n");
- QListIterator<int> pli(pagesToGenerate);
- int *pagePtr;
int pageIndex=1;
- for (;(pagePtr=pli.current());++pli,++pageIndex)
+ for (int pageNum : formulasToGenerate)
{
- int pageNum=*pagePtr;
- msg("Generating image form_%d.png for formula\n",pageNum);
- char dviArgs[4096];
- char psArgs[4096];
+ msg("Generating image form_%d.%s for formula\n",pageNum,(format==Format::Vector) ? "svg" : "png");
QCString formBase;
formBase.sprintf("_form%d",pageNum);
// run dvips to convert the page with number pageIndex to an
// postscript file.
- sprintf(dviArgs,"-q -D 600 -n 1 -p %d -o %s_tmp.ps _formulas.dvi",
+ sprintf(args,"-q -D 600 -n 1 -p %d -o %s_tmp.ps _formulas.dvi",
pageIndex,formBase.data());
Portable::sysTimerStart();
- if (Portable::system("dvips",dviArgs)!=0)
+ if (Portable::system("dvips",args)!=0)
{
err("Problems running dvips. Check your installation!\n");
Portable::sysTimerStop();
@@ -151,180 +238,215 @@ void FormulaList::generateBitmaps(const char *path)
return;
}
Portable::sysTimerStop();
- // run ps2epsi to convert to an encapsulated postscript file with
- // boundingbox (dvips with -E has some problems here).
- sprintf(psArgs,"%s_tmp.ps %s.eps",formBase.data(),formBase.data());
+
+ // extract the bounding box for the postscript file
+ sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=bbox %s_tmp.ps 2>%s_tmp.epsi",
+ formBase.data(),formBase.data());
Portable::sysTimerStart();
- if (Portable::system("ps2epsi",psArgs)!=0)
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
{
- err("Problems running ps2epsi. Check your installation!\n");
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
Portable::sysTimerStop();
QDir::setCurrent(oldDir);
return;
}
Portable::sysTimerStop();
- // now we read the generated postscript file to extract the bounding box
- QFileInfo fi(formBase+".eps");
+
+ // extract the bounding box info from the generate .epsi file
+ int x1=0,y1=0,x2=0,y2=0;
+ QFileInfo fi(formBase+"_tmp.epsi");
if (fi.exists())
{
- QCString eps = fileToString(formBase+".eps");
- int i=eps.find("%%BoundingBox:");
+ QString eps = fileToString(formBase+"_tmp.epsi");
+ int i = eps.find("%%BoundingBox:");
if (i!=-1)
{
sscanf(eps.data()+i,"%%%%BoundingBox:%d %d %d %d",&x1,&y1,&x2,&y2);
}
else
{
- err("Couldn't extract bounding box!\n");
+ err("Couldn't extract bounding box from %s_tmp.epsi",formBase.data());
}
- }
- // next we generate a postscript file which contains the eps
- // and displays it in the right colors and the right bounding box
- f.setName(formBase+".ps");
- if (f.open(IO_WriteOnly))
- {
- FTextStream t(&f);
- t << "1 1 1 setrgbcolor" << endl; // anti-alias to white background
- t << "newpath" << endl;
- t << "-1 -1 moveto" << endl;
- t << (x2-x1+2) << " -1 lineto" << endl;
- t << (x2-x1+2) << " " << (y2-y1+2) << " lineto" << endl;
- t << "-1 " << (y2-y1+2) << " lineto" <<endl;
- t << "closepath" << endl;
- t << "fill" << endl;
- t << -x1 << " " << -y1 << " translate" << endl;
- t << "0 0 0 setrgbcolor" << endl;
- t << "(" << formBase << ".eps) run" << endl;
- f.close();
}
- // scale the image so that it is four times larger than needed.
- // and the sizes are a multiple of four.
- double scaleFactor = 16.0/3.0;
+ //printf("Bounding box [%d %d %d %d]\n",x1,y1,x2,y2);
+
+ // convert the corrected EPS to a bitmap
+ double scaleFactor = 1.25;
int zoomFactor = Config_getInt(FORMULA_FONTSIZE);
if (zoomFactor<8 || zoomFactor>50) zoomFactor=10;
scaleFactor *= zoomFactor/10.0;
- int gx = (((int)((x2-x1)*scaleFactor))+3)&~1;
- int gy = (((int)((y2-y1)*scaleFactor))+3)&~1;
- // Then we run ghostscript to convert the postscript to a pixmap
- // The pixmap is a truecolor image, where only black and white are
- // used.
- char gsArgs[4096];
- sprintf(gsArgs,"-q -g%dx%d -r%dx%d -sDEVICE=ppmraw "
- "-sOutputFile=%s.pnm -dNOPAUSE -dBATCH -dNOSAFER %s.ps",
- gx,gy,(int)(scaleFactor*72),(int)(scaleFactor*72),
- formBase.data(),formBase.data()
- );
- Portable::sysTimerStart();
- if (Portable::system(Portable::ghostScriptCommand(),gsArgs)!=0)
+ int width = (int)((x2-x1)*scaleFactor+0.5);
+ int height = (int)((y2-y1)*scaleFactor+0.5);
+ p->storeDisplaySize(pageNum,width,height);
+
+ if (format==Format::Vector)
{
- err("Problem running ghostscript %s %s. Check your installation!\n",Portable::ghostScriptCommand(),gsArgs);
+ // crop the image to its bounding box
+ sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=pdfwrite"
+ " -o %s_tmp.pdf -c \"[/CropBox [%d %d %d %d] /PAGES pdfmark\" -f %s_tmp.ps",
+ formBase.data(),x1,y1,x2,y2,formBase.data());
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
+ Portable::sysTimerStop();
+ QDir::setCurrent(oldDir);
+ return;
+ }
Portable::sysTimerStop();
- QDir::setCurrent(oldDir);
- return;
+
+ // if we have pdf2svg available use it to create a SVG image
+ if (Portable::checkForExecutable("pdf2svg"))
+ {
+ sprintf(args,"%s_tmp.pdf form_%d.svg",formBase.data(),pageNum);
+ Portable::sysTimerStart();
+ if (Portable::system("pdf2svg",args)!=0)
+ {
+ err("Problems running pdf2svg. Check your installation!\n");
+ Portable::sysTimerStop();
+ QDir::setCurrent(oldDir);
+ return;
+ }
+ Portable::sysTimerStop();
+ }
+ else if (Portable::checkForExecutable("inkscape")) // alternative is to use inkscape
+ {
+ int inkscapeVersion = determineInkscapeVersion(thisDir);
+ if (inkscapeVersion == -1)
+ {
+ err("Problems determining the version of inkscape. Check your installation!\n");
+ QDir::setCurrent(oldDir);
+ return;
+ }
+ else if (inkscapeVersion == 0)
+ {
+ sprintf(args,"-l form_%d.svg -z %s_tmp.pdf 2>%s",pageNum,formBase.data(),Portable::devNull());
+ }
+ else // inkscapeVersion >= 1
+ {
+ sprintf(args,"--export-type=svg --export-filename=form_%d.svg %s_tmp.pdf 2>%s",pageNum,formBase.data(),Portable::devNull());
+ }
+ Portable::sysTimerStart();
+ if (Portable::system("inkscape",args)!=0)
+ {
+ err("Problems running inkscape. Check your installation!\n");
+ Portable::sysTimerStop();
+ QDir::setCurrent(oldDir);
+ return;
+ }
+ Portable::sysTimerStop();
+ }
+ else
+ {
+ err("Neither 'pdf2svg' nor 'inkscape' present for conversion of formula to 'svg'\n");
+ return;
+ }
+
+ if (RM_TMP_FILES)
+ {
+ thisDir.remove(formBase+"_tmp.pdf");
+ }
}
- Portable::sysTimerStop();
- f.setName(formBase+".pnm");
- uint imageX=0,imageY=0;
- // we read the generated image again, to obtain the pixel data.
- if (f.open(IO_ReadOnly))
+ else // format==Format::Bitmap
{
- QTextStream t(&f);
- QCString s;
- if (!t.eof())
- s=t.readLine().utf8();
- if (s.length()<2 || s.left(2)!="P6")
- err("ghostscript produced an illegal image format!");
- else
+ // crop the image to its bounding box
+ sprintf(args,"-q -dBATCH -dNOPAUSE -P- -dNOSAFER -sDEVICE=eps2write"
+ " -o %s_tmp.eps -f %s_tmp.ps",formBase.data(),formBase.data());
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
{
- // assume the size is after the first line that does not start with
- // # excluding the first line of the file.
- while (!t.eof() && (s=t.readLine().utf8()) && !s.isEmpty() && s.at(0)=='#') { }
- sscanf(s,"%d %d",&imageX,&imageY);
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
+ Portable::sysTimerStop();
+ QDir::setCurrent(oldDir);
+ return;
}
- if (imageX>0 && imageY>0)
+
+ // read back %s_tmp.eps and replace
+ // bounding box values with x1,y1,x2,y2 and remove the HiResBoundingBox
+ QFile epsIn(formBase+"_tmp.eps");
+ QFile epsOut(formBase+"_tmp_corr.eps");
+ if (epsIn.open(IO_ReadOnly) && epsOut.open(IO_WriteOnly))
{
- //printf("Converting image...\n");
- char *data = new char[imageX*imageY*3]; // rgb 8:8:8 format
- uint i,x,y,ix,iy;
- f.readBlock(data,imageX*imageY*3);
- Image srcImage(imageX,imageY),
- filteredImage(imageX,imageY),
- dstImage(imageX/4,imageY/4);
- uchar *ps=srcImage.getData();
- // convert image to black (1) and white (0) index.
- for (i=0;i<imageX*imageY;i++) *ps++= (data[i*3]==0 ? 1 : 0);
- // apply a simple box filter to the image
- static int filterMask[]={1,2,1,2,8,2,1,2,1};
- for (y=0;y<srcImage.getHeight();y++)
+ int maxLineLen=100*1024;
+ while (!epsIn.atEnd())
{
- for (x=0;x<srcImage.getWidth();x++)
+ QCString buf(maxLineLen);
+ FTextStream t(&epsOut);
+ int numBytes = epsIn.readLine(buf.rawData(),maxLineLen);
+ if (numBytes>0)
{
- int s=0;
- for (iy=0;iy<2;iy++)
+ buf.resize(numBytes+1);
+ if (buf.startsWith("%%BoundingBox"))
{
- for (ix=0;ix<2;ix++)
- {
- s+=srcImage.getPixel(x+ix-1,y+iy-1)*filterMask[iy*3+ix];
- }
+ t << "%%BoundingBox: " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
+ }
+ else if (buf.startsWith("%%HiResBoundingBox")) // skip this one
+ {
+ }
+ else
+ {
+ t << buf;
}
- filteredImage.setPixel(x,y,s);
- }
- }
- // down-sample the image to 1/16th of the area using 16 gray scale
- // colors.
- // TODO: optimize this code.
- for (y=0;y<dstImage.getHeight();y++)
- {
- for (x=0;x<dstImage.getWidth();x++)
- {
- int xp=x<<2;
- int yp=y<<2;
- int c=filteredImage.getPixel(xp+0,yp+0)+
- filteredImage.getPixel(xp+1,yp+0)+
- filteredImage.getPixel(xp+2,yp+0)+
- filteredImage.getPixel(xp+3,yp+0)+
- filteredImage.getPixel(xp+0,yp+1)+
- filteredImage.getPixel(xp+1,yp+1)+
- filteredImage.getPixel(xp+2,yp+1)+
- filteredImage.getPixel(xp+3,yp+1)+
- filteredImage.getPixel(xp+0,yp+2)+
- filteredImage.getPixel(xp+1,yp+2)+
- filteredImage.getPixel(xp+2,yp+2)+
- filteredImage.getPixel(xp+3,yp+2)+
- filteredImage.getPixel(xp+0,yp+3)+
- filteredImage.getPixel(xp+1,yp+3)+
- filteredImage.getPixel(xp+2,yp+3)+
- filteredImage.getPixel(xp+3,yp+3);
- // here we scale and clip the color value so the
- // resulting image has a reasonable contrast
- dstImage.setPixel(x,y,QMIN(15,(c*15)/(16*10)));
}
}
- // save the result as a bitmap
- QCString resultName;
- resultName.sprintf("form_%d.png",pageNum);
- // the option parameter 1 is used here as a temporary hack
- // to select the right color palette!
- dstImage.save(resultName,1);
- delete[] data;
+ epsIn.close();
+ epsOut.close();
+ }
+ else
+ {
+ err("Problems correcting the eps files from %s_tmp.eps to %s_tmp_corr.eps\n",
+ formBase.data(),formBase.data());
+ QDir::setCurrent(oldDir);
+ return;
}
- f.close();
- }
+
+ if (hd==HighDPI::On) // for high DPI display it looks much better if the
+ // image resolution is higher than the display resolution
+ {
+ scaleFactor*=2;
+ }
+
+ Portable::sysTimerStop();
+ sprintf(args,"-q -dNOSAFER -dBATCH -dNOPAUSE -dEPSCrop -sDEVICE=pnggray -dGraphicsAlphaBits=4 -dTextAlphaBits=4 "
+ "-r%d -sOutputFile=form_%d.png %s_tmp_corr.eps",(int)(scaleFactor*72),pageNum,formBase.data());
+ Portable::sysTimerStart();
+ if (Portable::system(Portable::ghostScriptCommand(),args)!=0)
+ {
+ err("Problems running %s. Check your installation!\n",Portable::ghostScriptCommand());
+ Portable::sysTimerStop();
+ QDir::setCurrent(oldDir);
+ return;
+ }
+ Portable::sysTimerStop();
+
+ if (RM_TMP_FILES)
+ {
+ thisDir.remove(formBase+"_tmp.eps");
+ thisDir.remove(formBase+"_tmp_corr.eps");
+ }
+ }
+
// remove intermediate image files
- thisDir.remove(formBase+"_tmp.ps");
- thisDir.remove(formBase+".eps");
- thisDir.remove(formBase+".pnm");
- thisDir.remove(formBase+".ps");
+ if (RM_TMP_FILES)
+ {
+ thisDir.remove(formBase+"_tmp.ps");
+ thisDir.remove(formBase+"_tmp.epsi");
+ }
+ pageIndex++;
}
// remove intermediate files produced by latex
- thisDir.remove("_formulas.dvi");
- if (!formulaError) thisDir.remove("_formulas.log"); // keep file in case of errors
- thisDir.remove("_formulas.aux");
+ if (RM_TMP_FILES)
+ {
+ thisDir.remove("_formulas.dvi");
+ thisDir.remove("_formulas.log"); // keep file in case of errors
+ thisDir.remove("_formulas.aux");
+ }
}
// remove the latex file itself
- if (!formulaError) thisDir.remove("_formulas.tex");
- // write/update the formula repository so we know what text the
+ if (RM_TMP_FILES) thisDir.remove("_formulas.tex");
+
+ // write/update the formula repository so we know what text the
// generated images represent (we use this next time to avoid regeneration
// of the images, and to avoid forcing the user to delete all images in order
// to let a browser refresh the images).
@@ -332,9 +454,15 @@ void FormulaList::generateBitmaps(const char *path)
if (f.open(IO_WriteOnly))
{
FTextStream t(&f);
- for (fli.toFirst();(formula=fli.current());++fli)
+ for (int i=0; i<(int)p->formulas.size(); i++)
{
- t << "\\_form#" << formula->getId() << ":" << formula->getFormulaText() << endl;
+ DisplaySize size = p->getDisplaySize(i);
+ t << "\\_form#" << i;
+ if (size.width!=-1 && size.height!=-1)
+ {
+ t << "=" << size.width << "x" << size.height;
+ }
+ t << ":" << p->formulas[i].c_str() << endl;
}
f.close();
}
@@ -342,15 +470,115 @@ void FormulaList::generateBitmaps(const char *path)
QDir::setCurrent(oldDir);
}
+void FormulaManager::clear()
+{
+ p->formulas.clear();
+ p->formulaMap.clear();
+}
-#ifdef FORMULA_TEST
-int main()
+int FormulaManager::addFormula(const char *formulaText)
{
- FormulaList fl;
- fl.append(new Formula("$x^2$"));
- fl.append(new Formula("$y^2$"));
- fl.append(new Formula("$\\sqrt{x_0^2+x_1^2+x_2^2}$"));
- fl.generateBitmaps("dest");
- return 0;
+ std::string key = toStdString(formulaText);
+ auto it = p->formulaMap.find(key);
+ if (it!=p->formulaMap.end()) // already stored
+ {
+ return it->second;
+ }
+ // store new formula
+ int id = (int)p->formulas.size();
+ p->formulaMap.insert(std::pair<std::string,int>(key,id));
+ p->formulas.push_back(key);
+ return id;
+}
+
+QCString FormulaManager::findFormula(int formulaId) const
+{
+ if (formulaId>=0 && formulaId<(int)p->formulas.size())
+ {
+ return p->formulas[formulaId].c_str();
+ }
+ return QCString();
+}
+
+bool FormulaManager::hasFormulas() const
+{
+ return !p->formulas.empty();
+}
+
+FormulaManager::DisplaySize FormulaManager::displaySize(int formulaId) const
+{
+ return p->getDisplaySize(formulaId);
+}
+
+// helper function to detect and return the major version of inkscape.
+// return -1 if the version cannot be determined.
+static int determineInkscapeVersion(QDir &thisDir)
+{
+ // The command line interface (CLI) of Inkscape 1.0 has changed in comparison to
+ // previous versions. In order to invokine Inkscape, the used version is detected
+ // and based on the version the right syntax of the CLI is chosen.
+ static int inkscapeVersion = -2;
+ if (inkscapeVersion == -2) // initial one time version check
+ {
+ QCString inkscapeVersionFile = "inkscape_version" ;
+ inkscapeVersion = -1;
+ QCString args = "-z --version >"+inkscapeVersionFile+" 2>"+Portable::devNull();
+ Portable::sysTimerStart();
+ if (Portable::system("inkscape",args)!=0)
+ {
+ // looks like the old syntax gave problems, lets try the new syntax
+ args = " --version >"+inkscapeVersionFile+" 2>"+Portable::devNull();
+ if (Portable::system("inkscape",args)!=0)
+ {
+ Portable::sysTimerStop();
+ return -1;
+ }
+ }
+ // read version file and determine major version
+ QFile inkscapeVersionIn(inkscapeVersionFile);
+ if (inkscapeVersionIn.open(IO_ReadOnly))
+ {
+ int maxLineLen=1024;
+ while (!inkscapeVersionIn.atEnd())
+ {
+ QCString buf(maxLineLen);
+ int numBytes = inkscapeVersionIn.readLine(buf.rawData(),maxLineLen);
+ if (numBytes>0)
+ {
+ buf.resize(numBytes+1);
+ int dotPos = buf.find('.');
+ if (buf.startsWith("Inkscape ") && dotPos>0)
+ {
+ // get major version
+ bool ok;
+ int version = buf.mid(9,dotPos-9).toInt(&ok);
+ if (!ok)
+ {
+ Portable::sysTimerStop();
+ return -1;
+ }
+ inkscapeVersion = version;
+ break;
+ }
+ }
+ else
+ {
+ Portable::sysTimerStop();
+ return -1;
+ }
+ }
+ inkscapeVersionIn.close();
+ }
+ else // failed to open version file
+ {
+ Portable::sysTimerStop();
+ return -1;
+ }
+ if (RM_TMP_FILES)
+ {
+ thisDir.remove(inkscapeVersionFile);
+ }
+ Portable::sysTimerStop();
+ }
+ return inkscapeVersion;
}
-#endif
diff --git a/src/formula.h b/src/formula.h
index 422030c..4bd90af 100644
--- a/src/formula.h
+++ b/src/formula.h
@@ -18,45 +18,33 @@
#ifndef FORMULA_H
#define FORMULA_H
-#include <qlist.h>
-#include <qdict.h>
+#include <memory>
+#include <qcstring.h>
-/** Class representing a formula in the output. */
-class Formula
+/*! Manager class to handle formulas */
+class FormulaManager
{
public:
- Formula(const char *text);
- ~Formula();
- int getId();
- QCString getFormulaText() const { return form; }
-
+ struct DisplaySize
+ {
+ DisplaySize(int w,int h) : width(w), height(h) {}
+ int width;
+ int height;
+ };
+ enum class Format { Bitmap, Vector };
+ enum class HighDPI { On, Off };
+ static FormulaManager &instance();
+ void readFormulas(const char *dir,bool doCompare=false);
+ void clear();
+ int addFormula(const char *formulaText);
+ void generateImages(const char *outputDir,Format format,HighDPI hd = HighDPI::Off) const;
+ QCString findFormula(int formulaId) const;
+ bool hasFormulas() const;
+ DisplaySize displaySize(int formulaId) const;
private:
- int number;
- QCString form;
-};
-
-/** A list of Formula objects. */
-class FormulaList : public QList<Formula>
-{
- public:
- void generateBitmaps(const char *path);
-};
-
-/** Iterator for Formula objects in a FormulaList. */
-class FormulaListIterator : public QListIterator<Formula>
-{
- public:
- FormulaListIterator(const FormulaList &l) :
- QListIterator<Formula>(l) {}
-};
-
-/** Unsorted dictionary of Formula objects. */
-class FormulaDict : public QDict<Formula>
-{
- public:
- FormulaDict(uint size) :
- QDict<Formula>(size) {}
- ~FormulaDict() {}
+ FormulaManager();
+ struct Private;
+ std::unique_ptr<Private> p;
};
#endif
diff --git a/src/fortrancode.h b/src/fortrancode.h
index 8391a0b..b8cac31 100644
--- a/src/fortrancode.h
+++ b/src/fortrancode.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -26,14 +26,11 @@ class MemberDef;
class QCString;
class Definition;
-void codeFreeScanner();
-
-const int fixedCommentAfter = 72;
-
class FortranCodeParser : public CodeParserInterface
{
public:
- FortranCodeParser(FortranFormat format=FortranFormat_Unknown) : m_format(format) { }
+ FortranCodeParser(FortranFormat format=FortranFormat_Unknown);
+ virtual ~FortranCodeParser();
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
const QCString &input,
@@ -52,7 +49,8 @@ class FortranCodeParser : public CodeParserInterface
void resetCodeParserState();
private:
- FortranFormat m_format;
+ struct Private;
+ std::unique_ptr<Private> p;
};
class FortranCodeParserFree : public FortranCodeParser
diff --git a/src/fortrancode.l b/src/fortrancode.l
index c4532f3..df6acf4 100644
--- a/src/fortrancode.l
+++ b/src/fortrancode.l
@@ -4,10 +4,11 @@
*
* Copyright (C) by Anke Visser
* based on the work of Dimitri van Heesch.
+ * Copyright (C) 2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -20,17 +21,23 @@
@todo - continuation lines not always recognized
- merging of use-statements with same module name and different only-names
- rename part of use-statement
- - links to interface functions
+ - links to interface functions
- references to variables
**/
%option never-interactive
%option case-insensitive
+%option reentrant
%option prefix="fortrancodeYY"
+%option extra-type="struct fortrancodeYY_state *"
+%option noyy_top_state
+%top{
+#include <stdint.h>
+}
%{
/*
- * includes
+ * includes
*/
#include <stdio.h>
#include <assert.h>
@@ -54,6 +61,10 @@
#include "namespacedef.h"
#include "tooltip.h"
#include "fortrancode.h"
+#include "fortranscanner.h"
+#include "containers.h"
+
+const int fixedCommentAfter = 72;
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
@@ -63,6 +74,8 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
+#define USE_STATE2STRING 0
+
/*
* For fixed formatted code position 6 is of importance (continuation character).
* The following variables and macros keep track of the column number
@@ -73,18 +86,18 @@
int yy_old_start = 0;
int yy_my_start = 0;
int yy_end = 1;
-#define YY_USER_ACTION {yy_old_start = yy_my_start; yy_my_start = yy_end; yy_end += yyleng;}
+#define YY_USER_ACTION {yy_old_start = yy_my_start; yy_my_start = yy_end; yy_end += static_cast<int>(yyleng);}
#define YY_FTN_RESET {yy_old_start = 0; yy_my_start = 0; yy_end = 1;}
#define YY_FTN_REJECT {yy_end = yy_my_start; yy_my_start = yy_old_start; REJECT;}
-
+
//--------------------------------------------------------------------------------
/**
data of an use-statement
*/
-class UseEntry
+class UseEntry
{
- public:
+ public:
QCString module; // just for debug
QCStringList onlyNames; /* entries of the ONLY-part */
};
@@ -93,7 +106,7 @@ class UseEntry
module name -> list of ONLY/remote entries
(module name = name of the module, which can be accessed via use-directive)
*/
-class UseSDict : public SDict<UseEntry>
+class UseSDict : public SDict<UseEntry>
{
public:
UseSDict() : SDict<UseEntry>(17) {}
@@ -102,233 +115,918 @@ class UseSDict : public SDict<UseEntry>
/**
Contains names of used modules and names of local variables.
*/
-class Scope
+class Scope
{
public:
QCStringList useNames; //!< contains names of used modules
- QDict<void> localVars; //!< contains names of local variables
- QDict<void> externalVars; //!< contains names of external entities
-
- Scope() : localVars(7, FALSE /*caseSensitive*/), externalVars(7, FALSE /*caseSensitive*/) {}
+ StringUnorderedSet localVars; //!< contains names of local variables
+ StringUnorderedSet externalVars; //!< contains names of external entities
};
/*===================================================================*/
-/*
- * statics
+/*
+ * statics
*/
-
-static QCString docBlock; //!< contents of all lines of a documentation block
-static QCString currentModule=0; //!< name of the current enclosing module
-static QCString currentClass=0; //!< name of the current enclosing class
-static UseSDict *useMembers= new UseSDict; //!< info about used modules
-static UseEntry *useEntry = 0; //!< current use statement info
-static QList<Scope> scopeStack;
-static bool g_isExternal = false;
-// static QCStringList *currentUseNames= new QCStringList; //! contains names of used modules of current program unit
-static QCString str=""; //!> contents of fortran string
-
-static CodeOutputInterface * g_code;
-
-// TODO: is this still needed? if so, make it work
-static QCString g_parmType;
-static QCString g_parmName;
-
-static const char * g_inputString; //!< the code fragment as text
-static int g_inputPosition; //!< read offset during parsing
-static int g_inputLines; //!< number of line in the code fragment
-static int g_yyLineNr; //!< current line number
-static int g_contLineNr; //!< current, local, line number for continuation determination
-static int *g_hasContLine = NULL; //!< signals whether or not a line has a continuation line (fixed source form)
-static bool g_needsTermination;
-static const Definition *g_searchCtx;
-static bool g_collectXRefs;
-static bool g_isFixedForm;
-
-static bool g_insideBody; //!< inside subprog/program body? => create links
-static const char * g_currentFontClass;
-
-static bool g_exampleBlock;
-static QCString g_exampleName;
-static QCString g_exampleFile;
-
-static FileDef * g_sourceFileDef;
-static Definition * g_currentDefinition;
-static MemberDef * g_currentMemberDef;
-static bool g_includeCodeFragment;
-
-static char stringStartSymbol; // single or double quote
+
+struct fortrancodeYY_state
+{
+ QCString docBlock; //!< contents of all lines of a documentation block
+ QCString currentModule=0; //!< name of the current enclosing module
+ UseSDict * useMembers= 0; //!< info about used modules
+ UseEntry * useEntry = 0; //!< current use statement info
+ QList<Scope> scopeStack;
+ bool isExternal = false;
+ QCString str=""; //!> contents of fortran string
+
+ CodeOutputInterface * code = 0;
+
+ const char * inputString = 0; //!< the code fragment as text
+ yy_size_t inputPosition = 0; //!< read offset during parsing
+ int inputLines = 0; //!< number of line in the code fragment
+ int yyLineNr = 0; //!< current line number
+ int contLineNr = 0; //!< current, local, line number for continuation determination
+ int *hasContLine = 0; //!< signals whether or not a line has a continuation line (fixed source form)
+ bool needsTermination = false;
+ const Definition *searchCtx = 0;
+ bool collectXRefs = false;
+ bool isFixedForm = false;
+
+ bool insideBody = false; //!< inside subprog/program body? => create links
+ const char * currentFontClass = 0;
+
+ bool exampleBlock = false;
+ QCString exampleName;
+ QCString exampleFile;
+
+ FileDef * sourceFileDef = 0;
+ const Definition * currentDefinition = 0;
+ const MemberDef * currentMemberDef = 0;
+ bool includeCodeFragment = false;
+
+ char stringStartSymbol = '\0'; // single or double quote
// count in variable declaration to filter out
// declared from referenced names
-static int bracketCount = 0;
+ int bracketCount = 0;
// signal when in type / class /procedure declaration
-static int inTypeDecl = 0;
+ int inTypeDecl = 0;
-static bool g_endComment;
+ bool endComment = false;
+};
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
+
+static bool getFortranNamespaceDefs(const QCString &mname,
+ NamespaceDef *&cd);
+static bool getFortranTypeDefs(const QCString &tname, const QCString &moduleName,
+ ClassDef *&cd, UseSDict *usedict=0);
+
+//----------------------------------------------------------------------------
+
+static void endFontClass(yyscan_t yyscanner);
+static void startFontClass(yyscan_t yyscanner,const char *s);
+static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor);
+static void addToSearchIndex(yyscan_t yyscanner,const char *text);
+static void startCodeLine(yyscan_t yyscanner);
+static void endCodeLine(yyscan_t yyscanner);
+static void nextCodeLine(yyscan_t yyscanner);
+static void codifyLines(yyscan_t yyscanner,const char *text);
+static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
+ Definition *d,const char *text);
+static bool getGenericProcedureLink(yyscan_t yyscanner,const ClassDef *cd,
+ const char *memberText,
+ CodeOutputInterface &ol);
+static bool getLink(yyscan_t yyscanner,UseSDict *usedict, // dictionary with used modules
+ const char *memberText, // exact member text
+ CodeOutputInterface &ol,
+ const char *text);
+static void generateLink(yyscan_t yyscanner,CodeOutputInterface &ol, char *lname);
+static int countLines(yyscan_t yyscanner);
+static void startScope(yyscan_t yyscanner);
+static void endScope(yyscan_t yyscanner);
+static void addUse(yyscan_t yyscanner,const QCString &moduleName);
+static void addLocalVar(yyscan_t yyscanner,const QCString &varName);
+static MemberDef *getFortranDefs(yyscan_t yyscanner,const QCString &memberName, const QCString &moduleName,
+ UseSDict *usedict=0);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+
+
+//-------------------------------------------------------------------
+
+static std::mutex g_docCrossReferenceMutex;
+static std::mutex g_countFlowKeywordsMutex;
+
+/* -----------------------------------------------------------------*/
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
+
+%}
+
+IDSYM [a-z_A-Z0-9]
+ID [a-z_A-Z]+{IDSYM}*
+SUBPROG (subroutine|function)
+B [ \t]
+BS [ \t]*
+BS_ [ \t]+
+COMMA {BS},{BS}
+ARGS_L0 ("("[^)]*")")
+ARGS_L1a [^()]*"("[^)]*")"[^)]*
+ARGS_L1 ("("{ARGS_L1a}*")")
+ARGS_L2 "("({ARGS_L0}|[^()]|{ARGS_L1a}|{ARGS_L1})*")"
+ARGS {BS}({ARGS_L0}|{ARGS_L1}|{ARGS_L2})
+
+NUM_TYPE (complex|integer|logical|real)
+LOG_OPER (\.and\.|\.eq\.|\.eqv\.|\.ge\.|\.gt\.|\.le\.|\.lt\.|\.ne\.|\.neqv\.|\.or\.|\.not\.)
+KIND {ARGS}
+CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
+TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}|TYPE|CLASS|PROCEDURE|ENUMERATOR)
+
+INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
+ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|(NON_)?RECURSIVE|PURE|IMPURE|ELEMENTAL|VALUE|NOPASS|DEFERRED|CONTIGUOUS|VOLATILE)
+ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC)
+/* Assume that attribute statements are almost the same as attributes. */
+ATTR_STMT {ATTR_SPEC}|DIMENSION
+FLOW (DO|SELECT|CASE|SELECT{BS}(CASE|TYPE)|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT|GO{BS}TO)
+COMMANDS (FORMAT|CONTAINS|MODULE{BS_}PROCEDURE|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|PRESENT|DEALLOCATE|NULLIFY|SIZE|INQUIRE|OPEN|CLOSE|FLUSH|DATA|COMMON)
+IGNORE (CALL)
+PREFIX ((NON_)?RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,4}((NON_)?RECURSIVE|IMPURE|PURE|ELEMENTAL)?0
+LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")"
+
+/* | */
+
+%option noyywrap
+%option stack
+%option caseless
+/*%option debug*/
+
+%x Start
+%x SubCall
+%x FuncDef
+%x ClassName
+%x ClassVar
+%x Subprog
+%x DocBlock
+%x Use
+%x UseOnly
+%x Import
+%x Declaration
+%x DeclarationBinding
+%x DeclContLine
+%x Parameterlist
+%x String
+%x Subprogend
+
+%%
+ /*==================================================================*/
+
+ /*-------- ignore ------------------------------------------------------------*/
+
+<Start>{IGNORE}/{BS}"(" { // do not search keywords, intrinsics... TODO: complete list
+ codifyLines(yyscanner,yytext);
+ }
+ /*-------- inner construct ---------------------------------------------------*/
+
+<Start>{COMMANDS}/{BS}[,( \t\n] { // highlight
+ /* font class is defined e.g. in doxygen.css */
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Start>{FLOW}/{BS}[,( \t\n] {
+ if (yyextra->isFixedForm)
+ {
+ if ((yy_my_start == 1) && ((yytext[0] == 'c') || (yytext[0] == 'C'))) YY_FTN_REJECT;
+ }
+ if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction())
+ {
+ std::lock_guard<std::mutex> lock(g_countFlowKeywordsMutex);
+ MemberDefMutable *mdm = toMemberDefMutable(yyextra->currentMemberDef);
+ if (mdm)
+ {
+ mdm->incrementFlowKeyWordCount();
+ }
+ }
+ /* font class is defined e.g. in doxygen.css */
+ startFontClass(yyscanner,"keywordflow");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Start>{BS}(CASE|CLASS|TYPE){BS_}(IS|DEFAULT) {
+ startFontClass(yyscanner,"keywordflow");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Start>{BS}"end"({BS}{FLOW})/[ \t\n] { // list is a bit long as not all have possible end
+ startFontClass(yyscanner,"keywordflow");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Start>"implicit"{BS}("none"|{TYPE_SPEC}) {
+ startFontClass(yyscanner,"keywordtype");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Start>^{BS}"namelist"/[//] { // Namelist specification
+ startFontClass(yyscanner,"keywordtype");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ /*-------- use statement -------------------------------------------*/
+<Start>"use"{BS_} {
+ startFontClass(yyscanner,"keywordtype");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(Use);
+ }
+<Use>"ONLY" { // TODO: rename
+ startFontClass(yyscanner,"keywordtype");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(UseOnly);
+ }
+<Use>{ID} {
+ QCString tmp = yytext;
+ tmp = tmp.lower();
+ yyextra->insideBody=TRUE;
+ generateLink(yyscanner,*yyextra->code, yytext);
+ yyextra->insideBody=FALSE;
+
+ /* append module name to use dict */
+ yyextra->useEntry = new UseEntry();
+ //yyextra->useEntry->module = yytext;
+ //yyextra->useMembers->append(yytext, yyextra->useEntry);
+ //addUse(yytext);
+ yyextra->useEntry->module = tmp;
+ yyextra->useMembers->append(tmp, yyextra->useEntry);
+ addUse(yyscanner,tmp);
+ }
+<Use,UseOnly,Import>{BS},{BS} { codifyLines(yyscanner,yytext); }
+<UseOnly,Import>{BS}&{BS}"\n" { codifyLines(yyscanner,yytext);
+ yyextra->contLineNr++;
+ YY_FTN_RESET}
+<UseOnly>{ID} {
+ QCString tmp = yytext;
+ tmp = tmp.lower();
+ yyextra->useEntry->onlyNames.append(tmp);
+ yyextra->insideBody=TRUE;
+ generateLink(yyscanner,*yyextra->code, yytext);
+ yyextra->insideBody=FALSE;
+ }
+<Use,UseOnly,Import>"\n" {
+ unput(*yytext);
+ yy_pop_state(yyscanner);
+ YY_FTN_RESET
+ }
+<*>"import"{BS}/"\n" |
+<*>"import"{BS_} {
+ startFontClass(yyscanner,"keywordtype");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(Import);
+ }
+<Import>{ID} {
+ yyextra->insideBody=TRUE;
+ generateLink(yyscanner,*yyextra->code, yytext);
+ yyextra->insideBody=FALSE;
+ }
+<Import>("ONLY"|"NONE"|"ALL") {
+ startFontClass(yyscanner,"keywordtype");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ /*-------- fortran module -----------------------------------------*/
+<Start>("block"{BS}"data"|"program"|"module"|"interface")/{BS_}|({COMMA}{ACCESS_SPEC})|\n { //
+ startScope(yyscanner);
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(ClassName);
+ if (!qstricmp(yytext,"module")) yyextra->currentModule="module";
+ }
+<Start>("enum")/{BS_}|{BS}{COMMA}{BS}{LANGUAGE_BIND_SPEC}|\n { //
+ startScope(yyscanner);
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(ClassName);
+ }
+<*>{LANGUAGE_BIND_SPEC} { //
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Start>("type")/{BS_}|({COMMA}({ACCESS_SPEC}|ABSTRACT|EXTENDS))|\n { //
+ startScope(yyscanner);
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(ClassName);
+ }
+<ClassName>{ID} {
+ if (yyextra->currentModule == "module")
+ {
+ yyextra->currentModule=yytext;
+ yyextra->currentModule = yyextra->currentModule.lower();
+ }
+ generateLink(yyscanner,*yyextra->code,yytext);
+ yy_pop_state(yyscanner);
+ }
+<ClassName>({ACCESS_SPEC}|ABSTRACT|EXTENDS)/[,:( ] { //| variable declaration
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+<ClassName>\n { // interface may be without name
+ yy_pop_state(yyscanner);
+ YY_FTN_REJECT;
+ }
+<Start>^{BS}"end"({BS_}"enum").* {
+ YY_FTN_REJECT;
+ }
+<Start>^{BS}"end"({BS_}"type").* {
+ YY_FTN_REJECT;
+ }
+<Start>^{BS}"end"({BS_}"module").* { // just reset yyextra->currentModule, rest is done in following rule
+ yyextra->currentModule=0;
+ YY_FTN_REJECT;
+ }
+ /*-------- subprog definition -------------------------------------*/
+<Start>({PREFIX}{BS_})?{TYPE_SPEC}{BS_}({PREFIX}{BS_})?{BS}/{SUBPROG}{BS_} { // TYPE_SPEC is for old function style function result
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Start>({PREFIX}{BS_})?{SUBPROG}{BS_} { // Fortran subroutine or function found
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(Subprog);
+ }
+<Subprog>{ID} { // subroutine/function name
+ DBG_CTX((stderr, "===> start subprogram %s\n", yytext));
+ startScope(yyscanner);
+ generateLink(yyscanner,*yyextra->code,yytext);
+ }
+<Subprog>"result"/{BS}"("[^)]*")" {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<Subprog>"("[^)]*")" { // ignore rest of line
+ codifyLines(yyscanner,yytext);
+ }
+<Subprog,Subprogend>"\n" { codifyLines(yyscanner,yytext);
+ yyextra->contLineNr++;
+ yy_pop_state(yyscanner);
+ YY_FTN_RESET
+ }
+<Start>"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface")?{BS} { // Fortran subroutine or function ends
+ //cout << "===> end function " << yytext << endl;
+ endScope(yyscanner);
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(Subprogend);
+ }
+<Subprogend>{ID}/{BS}(\n|!|;) {
+ generateLink(yyscanner,*yyextra->code,yytext);
+ yy_pop_state(yyscanner);
+ }
+<Start>"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface"){BS}/(\n|!|;) { // Fortran subroutine or function ends
+ //cout << "===> end function " << yytext << endl;
+ endScope(yyscanner);
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ /*-------- variable declaration ----------------------------------*/
+<Start>^{BS}"real"/[,:( ] { // real is a bit tricky as it is a data type but also a function.
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(Declaration);
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+<Start>{TYPE_SPEC}/[,:( ] {
+ QCString typ = yytext;
+ typ = removeRedundantWhiteSpace(typ.lower());
+ if (typ.startsWith("real")) YY_FTN_REJECT;
+ if (typ == "type" || typ == "class" || typ == "procedure") yyextra->inTypeDecl = 1;
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(Declaration);
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+<Start>{ATTR_SPEC} {
+ if (QCString(yytext) == "external")
+ {
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(Declaration);
+ yyextra->isExternal = true;
+ }
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+<Declaration>({TYPE_SPEC}|{ATTR_SPEC})/[,:( ] { //| variable declaration
+ if (QCString(yytext) == "external") yyextra->isExternal = true;
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+<Declaration>{ID} { // local var
+ if (yyextra->isFixedForm && yy_my_start == 1)
+ {
+ startFontClass(yyscanner,"comment");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+ else if (yyextra->currentMemberDef &&
+ ((yyextra->currentMemberDef->isFunction() && (yyextra->currentMemberDef->typeString()!=QCString("subroutine") || yyextra->inTypeDecl)) ||
+ yyextra->currentMemberDef->isVariable() || yyextra->currentMemberDef->isEnumValue()
+ )
+ )
+ {
+ generateLink(yyscanner,*yyextra->code, yytext);
+ }
+ else
+ {
+ yyextra->code->codify(yytext);
+ addLocalVar(yyscanner,yytext);
+ }
+ }
+<Declaration>{BS}("=>"|"="){BS} { // Procedure binding
+ BEGIN(DeclarationBinding);
+ yyextra->code->codify(yytext);
+ }
+<DeclarationBinding>{ID} { // Type bound procedure link
+ generateLink(yyscanner,*yyextra->code, yytext);
+ yy_pop_state(yyscanner);
+ }
+<Declaration>[(] { // start of array or type / class specification
+ yyextra->bracketCount++;
+ yyextra->code->codify(yytext);
+ }
+
+<Declaration>[)] { // end array specification
+ yyextra->bracketCount--;
+ if (!yyextra->bracketCount) yyextra->inTypeDecl = 0;
+ yyextra->code->codify(yytext);
+ }
+
+<Declaration,DeclarationBinding>"&" { // continuation line
+ yyextra->code->codify(yytext);
+ if (!yyextra->isFixedForm)
+ {
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(DeclContLine);
+ }
+ }
+<DeclContLine>"\n" { // declaration not yet finished
+ yyextra->contLineNr++;
+ codifyLines(yyscanner,yytext);
+ yyextra->bracketCount = 0;
+ yy_pop_state(yyscanner);
+ YY_FTN_RESET
+ }
+<Declaration,DeclarationBinding>"\n" { // end declaration line (?)
+ if (yyextra->endComment)
+ {
+ yyextra->endComment=FALSE;
+ }
+ else
+ {
+ codifyLines(yyscanner,yytext);
+ }
+ yyextra->bracketCount = 0;
+ yyextra->contLineNr++;
+ if (!(yyextra->hasContLine && yyextra->hasContLine[yyextra->contLineNr - 1]))
+ {
+ yyextra->isExternal = false;
+ yy_pop_state(yyscanner);
+ }
+ YY_FTN_RESET
+ }
+
+ /*-------- subprog calls -----------------------------------------*/
+
+<Start>"call"{BS_} {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(SubCall);
+ }
+<SubCall>{ID} { // subroutine call
+ yyextra->insideBody=TRUE;
+ generateLink(yyscanner,*yyextra->code, yytext);
+ yyextra->insideBody=FALSE;
+ yy_pop_state(yyscanner);
+ }
+<Start>{ID}{BS}/"(" { // function call
+ if (yyextra->isFixedForm && yy_my_start == 6)
+ {
+ // fixed form continuation line
+ YY_FTN_REJECT;
+ }
+ else if (QCString(yytext).stripWhiteSpace().lower() == "type")
+ {
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(Declaration);
+ startFontClass(yyscanner,"keywordtype");
+ yyextra->code->codify(QCString(yytext).stripWhiteSpace());
+ endFontClass(yyscanner);
+ yyextra->code->codify(yytext + 4);
+ }
+ else
+ {
+ yyextra->insideBody=TRUE;
+ generateLink(yyscanner,*yyextra->code, yytext);
+ yyextra->insideBody=FALSE;
+ }
+ }
+
+ /*-------- comments ---------------------------------------------------*/
+<Start,Declaration,DeclarationBinding>\n?{BS}"!>"|"!<" { // start comment line or comment block
+ if (yytext[0] == '\n')
+ {
+ yyextra->contLineNr++;
+ yy_old_start = 0;
+ yy_my_start = 1;
+ yy_end = static_cast<int>(yyleng);
+ }
+ // Actually we should see if ! on position 6, can be continuation
+ // but the chance is very unlikely, so no effort to solve it here
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(DocBlock);
+ yyextra->docBlock=yytext;
+ }
+<Declaration,DeclarationBinding>{BS}"!<" { // start comment line or comment block
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(DocBlock);
+ yyextra->docBlock=yytext;
+ }
+
+<DocBlock>.* { // contents of current comment line
+ yyextra->docBlock+=yytext;
+ }
+<DocBlock>"\n"{BS}("!>"|"!<"|"!!") { // comment block (next line is also comment line)
+ yyextra->contLineNr++;
+ yy_old_start = 0;
+ yy_my_start = 1;
+ yy_end = static_cast<int>(yyleng);
+ // Actually we should see if ! on position 6, can be continuation
+ // but the chance is very unlikely, so no effort to solve it here
+ yyextra->docBlock+=yytext;
+ }
+<DocBlock>"\n" { // comment block ends at the end of this line
+ // remove special comment (default config)
+ yyextra->contLineNr++;
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ yyextra->yyLineNr+=((QCString)yyextra->docBlock).contains('\n');
+ yyextra->yyLineNr+=1;
+ nextCodeLine(yyscanner);
+ yyextra->endComment=TRUE;
+ }
+ else // do not remove comment
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yyextra->docBlock);
+ endFontClass(yyscanner);
+ }
+ unput(*yytext);
+ yyextra->contLineNr--;
+ yy_pop_state(yyscanner);
+ YY_FTN_RESET
+ }
+
+<*>"!"[^><\n].*|"!"$ { // normal comment
+ if(YY_START == String) YY_FTN_REJECT; // ignore in strings
+ if (yyextra->isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+
+<*>^[Cc*].* { // normal comment
+ if(! yyextra->isFixedForm) YY_FTN_REJECT;
+
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<*>"assignment"/{BS}"("{BS}"="{BS}")" {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<*>"operator"/{BS}"("[^)]*")" {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+
+ /*------ preprocessor --------------------------------------------*/
+<Start>"#".*\n {
+ if (yyextra->isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
+ yyextra->contLineNr++;
+ startFontClass(yyscanner,"preprocessor");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ YY_FTN_RESET
+ }
+ /*------ variable references? -------------------------------------*/
+
+<Start>"%"{BS}{ID} { // ignore references to elements
+ yyextra->code->codify(yytext);
+ }
+<Start>{ID} {
+ yyextra->insideBody=TRUE;
+ generateLink(yyscanner,*yyextra->code, yytext);
+ yyextra->insideBody=FALSE;
+ }
+ /*------ strings --------------------------------------------------*/
+<String>\n { // string with \n inside
+ yyextra->contLineNr++;
+ yyextra->str+=yytext;
+ startFontClass(yyscanner,"stringliteral");
+ codifyLines(yyscanner,yyextra->str);
+ endFontClass(yyscanner);
+ yyextra->str = "";
+ YY_FTN_RESET
+ }
+<String>\"|\' { // string ends with next quote without previous backspace
+ if(yytext[0]!=yyextra->stringStartSymbol) YY_FTN_REJECT; // single vs double quote
+ yyextra->str+=yytext;
+ startFontClass(yyscanner,"stringliteral");
+ codifyLines(yyscanner,yyextra->str);
+ endFontClass(yyscanner);
+ yy_pop_state(yyscanner);
+ }
+<String>. {yyextra->str+=yytext;}
+
+<*>\"|\' { /* string starts */
+ /* if(YY_START == StrIgnore) YY_FTN_REJECT; // ignore in simple comments */
+ if (yyextra->isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
+ yy_push_state(YY_START,yyscanner);
+ yyextra->stringStartSymbol=yytext[0]; // single or double quote
+ BEGIN(String);
+ yyextra->str=yytext;
+ }
+ /*-----------------------------------------------------------------------------*/
+
+<*>\n {
+ if (yyextra->endComment)
+ {
+ yyextra->endComment=FALSE;
+ }
+ else
+ {
+ codifyLines(yyscanner,yytext);
+ // comment cannot extend over the end of a line so should always be terminated at the end of the line.
+ if (yyextra->currentFontClass && !strcmp(yyextra->currentFontClass,"comment")) endFontClass(yyscanner);
+ }
+ yyextra->contLineNr++;
+ YY_FTN_RESET
+ }
+<*>^{BS}"type"{BS}"=" { yyextra->code->codify(yytext); }
+
+<*>[\x80-\xFF]* { // keep utf8 characters together...
+ if (yyextra->isFixedForm && yy_my_start > fixedCommentAfter)
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ }
+ else
+ {
+ yyextra->code->codify(yytext);
+ }
+ }
+<*>. {
+ if (yyextra->isFixedForm && yy_my_start > fixedCommentAfter)
+ {
+ //yy_push_state(YY_START,yyscanner);
+ //BEGIN(DocBlock);
+ //yyextra->docBlock=yytext;
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ }
+ else
+ {
+ yyextra->code->codify(yytext);
+ }
+ }
+<*>{LOG_OPER} { // Fortran logical comparison keywords
+ yyextra->code->codify(yytext);
+ }
+<*><<EOF>> {
+ if (YY_START == DocBlock) {
+ if (!Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yyextra->docBlock);
+ endFontClass(yyscanner);
+ }
+ }
+ yyterminate();
+ }
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
-static void endFontClass()
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
- if (g_currentFontClass)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yy_size_t inputPosition = yyextra->inputPosition;
+ const char *s = yyextra->inputString + inputPosition;
+ yy_size_t c=0;
+ while( c < max_size && *s)
{
- g_code->endFontClass();
- g_currentFontClass=0;
+ *buf++ = *s++;
+ c++;
}
+ yyextra->inputPosition += c;
+ return c;
}
-static void startFontClass(const char *s)
+static void endFontClass(yyscan_t yyscanner)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yyextra->currentFontClass)
+ {
+ yyextra->code->endFontClass();
+ yyextra->currentFontClass=0;
+ }
+}
+
+static void startFontClass(yyscan_t yyscanner,const char *s)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
// if font class is already set don't stop and start it.
// strcmp does not like null pointers as input.
- if (!g_currentFontClass || !s || strcmp(g_currentFontClass,s))
+ if (!yyextra->currentFontClass || !s || strcmp(yyextra->currentFontClass,s))
{
- endFontClass();
- g_code->startFontClass(s);
- g_currentFontClass=s;
+ endFontClass(yyscanner);
+ yyextra->code->startFontClass(s);
+ yyextra->currentFontClass=s;
}
}
-static void setCurrentDoc(const QCString &anchor)
+static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
- if (g_searchCtx)
+ if (yyextra->searchCtx)
{
- Doxygen::searchIndex->setCurrentDoc(g_searchCtx,g_searchCtx->anchor(),FALSE);
+ yyextra->code->setCurrentDoc(yyextra->searchCtx,yyextra->searchCtx->anchor(),FALSE);
}
else
{
- Doxygen::searchIndex->setCurrentDoc(g_sourceFileDef,anchor,TRUE);
+ yyextra->code->setCurrentDoc(yyextra->sourceFileDef,anchor,TRUE);
}
}
}
-static void addToSearchIndex(const char *text)
+static void addToSearchIndex(yyscan_t yyscanner,const char *text)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
- Doxygen::searchIndex->addWord(text,FALSE);
+ yyextra->code->addWord(text,FALSE);
}
}
-/*! start a new line of code, inserting a line number if g_sourceFileDef
+/*! start a new line of code, inserting a line number if yyextra->sourceFileDef
* is TRUE. If a definition starts at the current line, then the line
* number is linked to the documentation of that definition.
*/
-static void startCodeLine()
+static void startCodeLine(yyscan_t yyscanner)
{
- if (g_sourceFileDef)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yyextra->sourceFileDef)
{
//QCString lineNumber,lineAnchor;
- //lineNumber.sprintf("%05d",g_yyLineNr);
- //lineAnchor.sprintf("l%05d",g_yyLineNr);
-
- Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
- //printf("startCodeLine %d d=%s\n", g_yyLineNr,d ? d->name().data() : "<null>");
- if (!g_includeCodeFragment && d)
+ //lineNumber.sprintf("%05d",yyextra->yyLineNr);
+ //lineAnchor.sprintf("l%05d",yyextra->yyLineNr);
+
+ const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr);
+ //printf("startCodeLine %d d=%s\n", yyextra->yyLineNr,d ? d->name().data() : "<null>");
+ if (!yyextra->includeCodeFragment && d)
{
- g_currentDefinition = d;
- g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
- g_insideBody = FALSE;
- g_endComment = FALSE;
- g_parmType.resize(0);
- g_parmName.resize(0);
+ yyextra->currentDefinition = d;
+ yyextra->currentMemberDef = yyextra->sourceFileDef->getSourceMember(yyextra->yyLineNr);
+ yyextra->insideBody = FALSE;
+ yyextra->endComment = FALSE;
QCString lineAnchor;
- lineAnchor.sprintf("l%05d",g_yyLineNr);
- if (g_currentMemberDef)
+ lineAnchor.sprintf("l%05d",yyextra->yyLineNr);
+ if (yyextra->currentMemberDef)
{
- g_code->writeLineNumber(g_currentMemberDef->getReference(),
- g_currentMemberDef->getOutputFileBase(),
- g_currentMemberDef->anchor(),g_yyLineNr);
- setCurrentDoc(lineAnchor);
+ yyextra->code->writeLineNumber(yyextra->currentMemberDef->getReference(),
+ yyextra->currentMemberDef->getOutputFileBase(),
+ yyextra->currentMemberDef->anchor(),yyextra->yyLineNr);
+ setCurrentDoc(yyscanner,lineAnchor);
}
else if (d->isLinkableInProject())
{
- g_code->writeLineNumber(d->getReference(),
- d->getOutputFileBase(),
- 0,g_yyLineNr);
- setCurrentDoc(lineAnchor);
+ yyextra->code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,yyextra->yyLineNr);
+ setCurrentDoc(yyscanner,lineAnchor);
}
}
else
{
- g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ yyextra->code->writeLineNumber(0,0,0,yyextra->yyLineNr);
}
}
- g_code->startCodeLine(g_sourceFileDef);
- if (g_currentFontClass)
+ yyextra->code->startCodeLine(yyextra->sourceFileDef);
+ if (yyextra->currentFontClass)
{
- g_code->startFontClass(g_currentFontClass);
+ yyextra->code->startFontClass(yyextra->currentFontClass);
}
}
-static void endFontClass();
-static void endCodeLine()
+static void endCodeLine(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ endFontClass(yyscanner);
+ yyextra->code->endCodeLine();
+}
+
+static void nextCodeLine(yyscan_t yyscanner)
{
- endFontClass();
- g_code->endCodeLine();
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ const char * fc = yyextra->currentFontClass;
+ endCodeLine(yyscanner);
+ if (yyextra->yyLineNr<yyextra->inputLines)
+ {
+ yyextra->currentFontClass = fc;
+ startCodeLine(yyscanner);
+ }
}
/*! write a code fragment 'text' that may span multiple lines, inserting
* line numbers for each line.
*/
-static void codifyLines(char *text)
+static void codifyLines(yyscan_t yyscanner,const char *text)
{
- //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
- char *p=text,*sp=p;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ //printf("codifyLines(%d,\"%s\")\n",yyextra->yyLineNr,text);
+ const char *p=text,*sp=p;
char c;
bool done=FALSE;
- const char * tmp_currentFontClass = g_currentFontClass;
while (!done)
{
sp=p;
while ((c=*p++) && c!='\n') { }
if (c=='\n')
{
- g_yyLineNr++;
- *(p-1)='\0';
- g_code->codify(sp);
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- if (tmp_currentFontClass)
- {
- startFontClass(tmp_currentFontClass);
- }
+ yyextra->yyLineNr++;
+ int l = (int)(p-sp-1);
+ char *tmp = (char*)malloc(l+1);
+ memcpy(tmp,sp,l);
+ tmp[l]='\0';
+ yyextra->code->codify(tmp);
+ free(tmp);
+ nextCodeLine(yyscanner);
}
else
{
- g_code->codify(sp);
+ yyextra->code->codify(sp);
done=TRUE;
}
}
}
-static void codifyLines(QCString str)
-{
- char *tmp= (char *) malloc(str.length()+1);
- strcpy(tmp, str);
- codifyLines(tmp);
- free(tmp);
-}
-
/*! writes a link to a fragment \a text that may span multiple lines, inserting
- * line numbers for each line. If \a text contains newlines, the link will be
+ * line numbers for each line. If \a text contains newlines, the link will be
* split into multiple links with the same destination, one for each line.
*/
-static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
Definition *d,const char *text)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
- TooltipManager::instance()->addTooltip(d);
+ TooltipManager::instance().addTooltip(ol,d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
- QCString tooltip;
+ QCString tooltip;
if (!sourceTooltips) // fall back to simple "title" tooltips
{
tooltip = d->briefDescriptionAsTooltip();
@@ -342,15 +1040,11 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
while ((c=*p++) && c!='\n') { }
if (c=='\n')
{
- g_yyLineNr++;
+ yyextra->yyLineNr++;
*(p-1)='\0';
//printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
ol.writeCodeLink(ref,file,anchor,sp,tooltip);
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
+ nextCodeLine(yyscanner);
}
else
{
@@ -373,7 +1067,7 @@ static bool getFortranNamespaceDefs(const QCString &mname,
if (mname.isEmpty()) return FALSE; /* empty name => nothing to link */
// search for module
- if ((cd=Doxygen::namespaceSDict->find(mname))) return TRUE;
+ if ((cd=Doxygen::namespaceLinkedMap->find(mname))) return TRUE;
return FALSE;
}
@@ -384,34 +1078,34 @@ static bool getFortranNamespaceDefs(const QCString &mname,
@param moduleName name of enclosing module or null, if global entry
@param cd the entry, if found or null
@param usedict dictionary of data of USE-statement
- @returns true, if type is found
+ @returns true, if type is found
*/
-static bool getFortranTypeDefs(const QCString &tname, const QCString &moduleName,
- ClassDef *&cd, UseSDict *usedict=0)
+static bool getFortranTypeDefs(const QCString &tname, const QCString &moduleName,
+ ClassDef *&cd, UseSDict *usedict)
{
if (tname.isEmpty()) return FALSE; /* empty name => nothing to link */
//cout << "=== search for type: " << tname << endl;
- // search for type
- if ((cd=Doxygen::classSDict->find(tname)))
+ // search for type
+ if ((cd=Doxygen::classLinkedMap->find(tname)))
{
//cout << "=== type found in global module" << endl;
return TRUE;
}
- else if (moduleName && (cd= Doxygen::classSDict->find(moduleName+"::"+tname)))
+ else if (moduleName && (cd= Doxygen::classLinkedMap->find(moduleName+"::"+tname)))
{
//cout << "=== type found in local module" << endl;
return TRUE;
}
- else
+ else
{
UseEntry *use;
for (UseSDict::Iterator di(*usedict); (use=di.current()); ++di)
{
- if ((cd= Doxygen::classSDict->find(use->module+"::"+tname)))
+ if ((cd= Doxygen::classLinkedMap->find(use->module+"::"+tname)))
{
- //cout << "=== type found in used module" << endl;
+ //cout << "=== type found in used module" << endl;
return TRUE;
}
}
@@ -424,96 +1118,101 @@ static bool getFortranTypeDefs(const QCString &tname, const QCString &moduleName
searches for definition of function memberName
@param memberName the name of the function/variable
@param moduleName name of enclosing module or null, if global entry
- @param md the entry, if found or null
@param usedict array of data of USE-statement
- @returns true, if found
+ @returns MemberDef pointer, if found, or nullptr otherwise
*/
-static bool getFortranDefs(const QCString &memberName, const QCString &moduleName,
- MemberDef *&md, UseSDict *usedict=0)
+static MemberDef *getFortranDefs(yyscan_t yyscanner,const QCString &memberName, const QCString &moduleName,
+ UseSDict *usedict)
{
- if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (memberName.isEmpty()) return nullptr; /* empty name => nothing to link */
// look in local variables
- QListIterator<Scope> it(scopeStack);
+ QListIterator<Scope> it(yyextra->scopeStack);
Scope *scope;
for (it.toLast();(scope=it.current());--it)
{
- if (scope->localVars.find(memberName) && (!scope->externalVars.find(memberName)))
- return FALSE;
+ std::string lowMemName = memberName.lower().str();
+ if (scope->localVars.find(lowMemName)!=std::end(scope->localVars) && // local var
+ scope->externalVars.find(lowMemName)==std::end(scope->externalVars)) // and not external
+ {
+ return nullptr;
+ }
}
// search for function
- MemberName *mn = Doxygen::functionNameSDict->find(memberName);
+ MemberName *mn = Doxygen::functionNameLinkedMap->find(memberName);
if (!mn)
{
- mn = Doxygen::memberNameSDict->find(memberName);
+ mn = Doxygen::memberNameLinkedMap->find(memberName);
}
if (mn) // name is known
{
- MemberNameIterator mli(*mn);
- for (mli.toFirst();(md=mli.current());++mli) // all found functions with given name
- {
- const FileDef *fd=md->getFileDef();
- const GroupDef *gd=md->getGroupDef();
- const ClassDef *cd=md->getClassDef();
-
- //cout << "found link with same name: " << fd->fileName() << " " << memberName;
- //if (md->getNamespaceDef() != 0) cout << " in namespace " << md->getNamespaceDef()->name();cout << endl;
+ // all found functions with given name
+ for (const auto &md : *mn)
+ {
+ const FileDef *fd=md->getFileDef();
+ const GroupDef *gd=md->getGroupDef();
+ const ClassDef *cd=md->getClassDef();
- if ((gd && gd->isLinkable()) || (fd && fd->isLinkable()))
- {
- const NamespaceDef *nspace= md->getNamespaceDef();
+ //cout << "found link with same name: " << fd->fileName() << " " << memberName;
+ //if (md->getNamespaceDef() != 0) cout << " in namespace " << md->getNamespaceDef()->name();cout << endl;
- if (nspace == 0)
- { // found function in global scope
- if(cd == 0) { // Skip if bound to type
- return TRUE;
+ if ((gd && gd->isLinkable()) || (fd && fd->isLinkable()))
+ {
+ const NamespaceDef *nspace= md->getNamespaceDef();
+
+ if (nspace == 0)
+ { // found function in global scope
+ if(cd == 0)
+ { // Skip if bound to type
+ return md.get();
+ }
+ }
+ else if (moduleName == nspace->name())
+ { // found in local scope
+ return md.get();
+ }
+ else
+ { // else search in used modules
+ QCString usedModuleName= nspace->name();
+ UseEntry *ue= usedict->find(usedModuleName);
+ if (ue)
+ {
+ // check if only-list exists and if current entry exists is this list
+ QCStringList &only= ue->onlyNames;
+ if (only.isEmpty())
+ {
+ //cout << " found in module " << usedModuleName << " entry " << memberName << endl;
+ return md.get(); // whole module used
+ }
+ else
+ {
+ for ( QCStringList::Iterator lit = only.begin(); lit != only.end(); ++lit)
+ {
+ //cout << " search in only: " << usedModuleName << ":: " << memberName << "==" << (*it)<< endl;
+ if (memberName == *lit)
+ {
+ return md.get(); // found in ONLY-part of use list
+ }
}
- }
- else if (moduleName == nspace->name())
- { // found in local scope
- return TRUE;
- }
- else
- { // else search in used modules
- QCString moduleName= nspace->name();
- UseEntry *ue= usedict->find(moduleName);
- if (ue)
- {
- // check if only-list exists and if current entry exists is this list
- QCStringList &only= ue->onlyNames;
- if (only.isEmpty())
- {
- //cout << " found in module " << moduleName << " entry " << memberName << endl;
- return TRUE; // whole module used
- }
- else
- {
- for ( QCStringList::Iterator it = only.begin(); it != only.end(); ++it)
- {
- //cout << " search in only: " << moduleName << ":: " << memberName << "==" << (*it)<< endl;
- if (memberName == *it)
- {
- return TRUE; // found in ONLY-part of use list
- }
- }
- }
- }
- }
- } // if linkable
- } // for
+ }
+ }
+ }
+ } // if linkable
+ } // for
}
- return FALSE;
+ return nullptr;
}
/**
gets the link to a generic procedure which depends not on the name, but on the parameter list
@todo implementation
*/
-static bool getGenericProcedureLink(const ClassDef *cd,
- const char *memberText,
- CodeOutputInterface &ol)
+static bool getGenericProcedureLink(yyscan_t yyscanner,const ClassDef *cd,
+ const char *memberText,
+ CodeOutputInterface &ol)
{
(void)cd;
(void)memberText;
@@ -521,787 +1220,159 @@ static bool getGenericProcedureLink(const ClassDef *cd,
return FALSE;
}
-static bool getLink(UseSDict *usedict, // dictionary with used modules
+static bool getLink(yyscan_t yyscanner,UseSDict *usedict, // dictionary with used modules
const char *memberText, // exact member text
- CodeOutputInterface &ol,
- const char *text)
+ CodeOutputInterface &ol,
+ const char *text)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
MemberDef *md=0;
QCString memberName= removeRedundantWhiteSpace(memberText);
- if (getFortranDefs(memberName, currentModule, md, usedict) && md->isLinkable())
- {
+ if ((md=getFortranDefs(yyscanner,memberName, yyextra->currentModule, usedict)) && md->isLinkable())
+ {
if (md->isVariable() && (md->getLanguage()!=SrcLangExt_Fortran)) return FALSE; // Non Fortran variables aren't handled yet,
// see also linkifyText in util.cpp
const Definition *d = md->getOuterScope()==Doxygen::globalScope ?
- md->getBodyDef() : md->getOuterScope();
+ md->getBodyDef() : md->getOuterScope();
if (md->getGroupDef()) d = md->getGroupDef();
if (d && d->isLinkable())
{
- if (g_currentDefinition && g_currentMemberDef &&
- md!=g_currentMemberDef && g_insideBody && g_collectXRefs)
- {
- addDocCrossReference(g_currentMemberDef,md);
- }
- writeMultiLineCodeLink(ol,md,text ? text : memberText);
- addToSearchIndex(text ? text : memberText);
+ if (yyextra->currentDefinition && yyextra->currentMemberDef &&
+ md!=yyextra->currentMemberDef && yyextra->insideBody && yyextra->collectXRefs)
+ {
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(md));
+ }
+ writeMultiLineCodeLink(yyscanner,ol,md,text ? text : memberText);
+ addToSearchIndex(yyscanner, text ? text : memberText);
return TRUE;
- }
+ }
}
return FALSE;
}
-static void generateLink(CodeOutputInterface &ol, char *lname)
+static void generateLink(yyscan_t yyscanner,CodeOutputInterface &ol, char *lname)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
ClassDef *cd=0;
NamespaceDef *nsd=0;
QCString tmp = lname;
tmp = removeRedundantWhiteSpace(tmp.lower());
-
+
// check if lowercase lname is a linkable type or interface
- if ( (getFortranTypeDefs(tmp, currentModule, cd, useMembers)) && cd->isLinkable() )
+ if ( (getFortranTypeDefs(tmp, yyextra->currentModule, cd, yyextra->useMembers)) && cd->isLinkable() )
{
if ( (cd->compoundType() == ClassDef::Class) && // was Entry::INTERFACE_SEC) &&
- (getGenericProcedureLink(cd, tmp, ol)) )
+ (getGenericProcedureLink(yyscanner, cd, tmp, ol)) )
{
- //cout << "=== generic procedure resolved" << endl;
- }
- else
+ //cout << "=== generic procedure resolved" << endl;
+ }
+ else
{ // write type or interface link
- writeMultiLineCodeLink(ol,cd,tmp);
- addToSearchIndex(tmp.data());
+ writeMultiLineCodeLink(yyscanner, ol,cd,tmp);
+ addToSearchIndex(yyscanner, tmp);
}
}
// check for module
else if ( (getFortranNamespaceDefs(tmp, nsd)) && nsd->isLinkable() )
{ // write module link
- writeMultiLineCodeLink(ol,nsd,tmp);
- addToSearchIndex(tmp.data());
+ writeMultiLineCodeLink(yyscanner,ol,nsd,tmp);
+ addToSearchIndex(yyscanner,tmp);
}
// check for function/variable
- else if (getLink(useMembers, tmp, ol, tmp))
+ else if (getLink(yyscanner,yyextra->useMembers, tmp, ol, tmp))
{
//cout << "=== found link for lowercase " << lname << endl;
}
- else
+ else
{
// nothing found, just write out the word
//startFontClass("charliteral"); //test
- codifyLines(tmp);
- //endFontClass(); //test
- addToSearchIndex(tmp.data());
+ codifyLines(yyscanner,tmp);
+ //endFontClass(yyscanner); //test
+ addToSearchIndex(yyscanner,tmp);
}
}
/*! counts the number of lines in the input */
-static int countLines()
+static int countLines(yyscan_t yyscanner)
{
- const char *p=g_inputString;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ const char *p=yyextra->inputString;
char c;
int count=1;
- while ((c=*p))
- {
- p++ ;
- if (c=='\n') count++;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
}
- if (p>g_inputString && *(p-1)!='\n')
+ if (p>yyextra->inputString && *(p-1)!='\n')
{ // last line does not end with a \n, so we add an extra
// line and explicitly terminate the line after parsing.
- count++,
- g_needsTermination=TRUE;
- }
+ count++,
+ yyextra->needsTermination=TRUE;
+ }
return count;
}
//----------------------------------------------------------------------------
/** start scope */
-static void startScope()
+static void startScope(yyscan_t yyscanner)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
DBG_CTX((stderr, "===> startScope %s",yytext));
Scope *scope = new Scope;
- scopeStack.append(scope);
+ yyextra->scopeStack.append(scope);
}
/** end scope */
-static void endScope()
+static void endScope(yyscan_t yyscanner)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
DBG_CTX((stderr,"===> endScope %s",yytext));
- if (scopeStack.isEmpty())
+ if (yyextra->scopeStack.isEmpty())
{
- DBG_CTX((stderr,"WARNING: fortrancode.l: stack empty!\n"));
+ DBG_CTX((stderr,"WARNING: fortrancode.l: stack empty!\n"));
return;
}
- Scope *scope = scopeStack.getLast();
- scopeStack.removeLast();
- for ( QCStringList::Iterator it = scope->useNames.begin(); it != scope->useNames.end(); ++it)
+ Scope *scope = yyextra->scopeStack.getLast();
+ yyextra->scopeStack.removeLast();
+ for ( QCStringList::Iterator it = scope->useNames.begin(); it != scope->useNames.end(); ++it)
{
- useMembers->remove(*it);
+ yyextra->useMembers->remove(*it);
}
delete scope;
}
-static void addUse(const QCString &moduleName)
+static void addUse(yyscan_t yyscanner,const QCString &moduleName)
{
- if (!scopeStack.isEmpty())
- scopeStack.getLast()->useNames.append(moduleName);
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (!yyextra->scopeStack.isEmpty())
+ yyextra->scopeStack.getLast()->useNames.append(moduleName);
}
-static void addLocalVar(const QCString &varName)
+static void addLocalVar(yyscan_t yyscanner,const QCString &varName)
{
- if (!scopeStack.isEmpty())
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (!yyextra->scopeStack.isEmpty())
{
- scopeStack.getLast()->localVars.insert(varName, (void*)1);
- if (g_isExternal) scopeStack.getLast()->externalVars.insert(varName, (void*)1);
+ std::string lowVarName = varName.lower().str();
+ yyextra->scopeStack.getLast()->localVars.insert(lowVarName);
+ if (yyextra->isExternal) yyextra->scopeStack.getLast()->externalVars.insert(lowVarName);
}
}
-//----------------------------------------------------------------------------
-
-/* -----------------------------------------------------------------*/
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-
-static int yyread(char *buf,int max_size)
-{
- int c=0;
- while( c < max_size && g_inputString[g_inputPosition] )
- {
- *buf = g_inputString[g_inputPosition++] ;
- c++; buf++;
- }
- return c;
-}
-
-%}
-
-IDSYM [a-z_A-Z0-9]
-ID [a-z_A-Z]+{IDSYM}*
-SUBPROG (subroutine|function)
-B [ \t]
-BS [ \t]*
-BS_ [ \t]+
-COMMA {BS},{BS}
-ARGS_L0 ("("[^)]*")")
-ARGS_L1a [^()]*"("[^)]*")"[^)]*
-ARGS_L1 ("("{ARGS_L1a}*")")
-ARGS_L2 "("({ARGS_L0}|[^()]|{ARGS_L1a}|{ARGS_L1})*")"
-ARGS {BS}({ARGS_L0}|{ARGS_L1}|{ARGS_L2})
-
-NUM_TYPE (complex|integer|logical|real)
-LOG_OPER (\.and\.|\.eq\.|\.eqv\.|\.ge\.|\.gt\.|\.le\.|\.lt\.|\.ne\.|\.neqv\.|\.or\.|\.not\.)
-KIND {ARGS}
-CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
-TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}|TYPE|CLASS|PROCEDURE|ENUMERATOR)
-
-INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
-ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|(NON_)?RECURSIVE|PURE|IMPURE|ELEMENTAL|VALUE|NOPASS|DEFERRED|CONTIGUOUS|VOLATILE)
-ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC)
-/* Assume that attribute statements are almost the same as attributes. */
-ATTR_STMT {ATTR_SPEC}|DIMENSION
-FLOW (DO|SELECT|CASE|SELECT{BS}(CASE|TYPE)|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT|GO{BS}TO)
-COMMANDS (FORMAT|CONTAINS|MODULE{BS_}PROCEDURE|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|PRESENT|DEALLOCATE|NULLIFY|SIZE|INQUIRE|OPEN|CLOSE|FLUSH|DATA|COMMON)
-IGNORE (CALL)
-PREFIX ((NON_)?RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,4}((NON_)?RECURSIVE|IMPURE|PURE|ELEMENTAL)?0
-LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")"
-
-/* | */
-
-%option noyywrap
-%option stack
-%option caseless
-/*%option debug*/
-
-%x Start
-%x SubCall
-%x FuncDef
-%x ClassName
-%x ClassVar
-%x Subprog
-%x DocBlock
-%x Use
-%x UseOnly
-%x Import
-%x Declaration
-%x DeclarationBinding
-%x DeclContLine
-%x Parameterlist
-%x String
-%x Subprogend
-
-%%
- /*==================================================================*/
-
- /*-------- ignore ------------------------------------------------------------*/
-
-<Start>{IGNORE}/{BS}"(" { // do not search keywords, intrinsics... TODO: complete list
- codifyLines(yytext);
- }
- /*-------- inner construct ---------------------------------------------------*/
-
-<Start>{COMMANDS}/{BS}[,( \t\n] { // highlight
- /* font class is defined e.g. in doxygen.css */
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
-<Start>{FLOW}/{BS}[,( \t\n] {
- if (g_isFixedForm)
- {
- if ((yy_my_start == 1) && ((yytext[0] == 'c') || (yytext[0] == 'C'))) YY_FTN_REJECT;
- }
- if (g_currentMemberDef && g_currentMemberDef->isFunction())
- {
- g_currentMemberDef->incrementFlowKeyWordCount();
- }
- /* font class is defined e.g. in doxygen.css */
- startFontClass("keywordflow");
- codifyLines(yytext);
- endFontClass();
- }
-<Start>{BS}(CASE|CLASS|TYPE){BS_}(IS|DEFAULT) {
- startFontClass("keywordflow");
- codifyLines(yytext);
- endFontClass();
- }
-<Start>{BS}"end"({BS}{FLOW})/[ \t\n] { // list is a bit long as not all have possible end
- startFontClass("keywordflow");
- codifyLines(yytext);
- endFontClass();
- }
-<Start>"implicit"{BS}("none"|{TYPE_SPEC}) {
- startFontClass("keywordtype");
- codifyLines(yytext);
- endFontClass();
- }
-<Start>^{BS}"namelist"/[//] { // Namelist specification
- startFontClass("keywordtype");
- codifyLines(yytext);
- endFontClass();
- }
- /*-------- use statement -------------------------------------------*/
-<Start>"use"{BS_} {
- startFontClass("keywordtype");
- codifyLines(yytext);
- endFontClass();
- yy_push_state(YY_START);
- BEGIN(Use);
- }
-<Use>"ONLY" { // TODO: rename
- startFontClass("keywordtype");
- codifyLines(yytext);
- endFontClass();
- yy_push_state(YY_START);
- BEGIN(UseOnly);
- }
-<Use>{ID} {
- QCString tmp = yytext;
- tmp = tmp.lower();
- g_insideBody=TRUE;
- generateLink(*g_code, yytext);
- g_insideBody=FALSE;
-
- /* append module name to use dict */
- useEntry = new UseEntry();
- //useEntry->module = yytext;
- //useMembers->append(yytext, useEntry);
- //addUse(yytext);
- useEntry->module = tmp;
- useMembers->append(tmp, useEntry);
- addUse(tmp);
- }
-<Use,UseOnly,Import>{BS},{BS} { codifyLines(yytext); }
-<UseOnly,Import>{BS}&{BS}"\n" { codifyLines(yytext);
- g_contLineNr++;
- YY_FTN_RESET}
-<UseOnly>{ID} {
- QCString tmp = yytext;
- tmp = tmp.lower();
- useEntry->onlyNames.append(tmp);
- g_insideBody=TRUE;
- generateLink(*g_code, yytext);
- g_insideBody=FALSE;
- }
-<Use,UseOnly,Import>"\n" {
- unput(*yytext);
- yy_pop_state();YY_FTN_RESET
- }
-<*>"import"{BS}/"\n" |
-<*>"import"{BS_} {
- startFontClass("keywordtype");
- codifyLines(yytext);
- endFontClass();
- yy_push_state(YY_START);
- BEGIN(Import);
- }
-<Import>{ID} {
- g_insideBody=TRUE;
- generateLink(*g_code, yytext);
- g_insideBody=FALSE;
- }
-<Import>("ONLY"|"NONE"|"ALL") {
- startFontClass("keywordtype");
- codifyLines(yytext);
- endFontClass();
- }
- /*-------- fortran module -----------------------------------------*/
-<Start>("block"{BS}"data"|"program"|"module"|"interface")/{BS_}|({COMMA}{ACCESS_SPEC})|\n { //
- startScope();
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- yy_push_state(YY_START);
- BEGIN(ClassName);
- if (!qstricmp(yytext,"module")) currentModule="module";
- }
-<Start>("enum")/{BS_}|{BS}{COMMA}{BS}{LANGUAGE_BIND_SPEC}|\n { //
- startScope();
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- yy_push_state(YY_START);
- BEGIN(ClassName);
- currentClass="class";
- }
-<*>{LANGUAGE_BIND_SPEC} { //
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
-<Start>("type")/{BS_}|({COMMA}({ACCESS_SPEC}|ABSTRACT|EXTENDS))|\n { //
- startScope();
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- yy_push_state(YY_START);
- BEGIN(ClassName);
- currentClass="class";
- }
-<ClassName>{ID} {
- if (currentModule == "module")
- {
- currentModule=yytext;
- currentModule = currentModule.lower();
- }
- generateLink(*g_code,yytext);
- yy_pop_state();
- }
-<ClassName>({ACCESS_SPEC}|ABSTRACT|EXTENDS)/[,:( ] { //| variable declaration
- startFontClass("keyword");
- g_code->codify(yytext);
- endFontClass();
- }
-<ClassName>\n { // interface may be without name
- yy_pop_state();
- YY_FTN_REJECT;
- }
-<Start>^{BS}"end"({BS_}"enum").* { // just reset currentClass, rest is done in following rule
- currentClass=0;
- YY_FTN_REJECT;
- }
-<Start>^{BS}"end"({BS_}"type").* { // just reset currentClass, rest is done in following rule
- currentClass=0;
- YY_FTN_REJECT;
- }
-<Start>^{BS}"end"({BS_}"module").* { // just reset currentModule, rest is done in following rule
- currentModule=0;
- YY_FTN_REJECT;
- }
- /*-------- subprog definition -------------------------------------*/
-<Start>({PREFIX}{BS_})?{TYPE_SPEC}{BS_}({PREFIX}{BS_})?{BS}/{SUBPROG}{BS_} { // TYPE_SPEC is for old function style function result
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
-<Start>({PREFIX}{BS_})?{SUBPROG}{BS_} { // Fortran subroutine or function found
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- yy_push_state(YY_START);
- BEGIN(Subprog);
- }
-<Subprog>{ID} { // subroutine/function name
- DBG_CTX((stderr, "===> start subprogram %s\n", yytext));
- startScope();
- generateLink(*g_code,yytext);
- }
-<Subprog>"result"/{BS}"("[^)]*")" {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
-<Subprog>"("[^)]*")" { // ignore rest of line
- codifyLines(yytext);
- }
-<Subprog,Subprogend>"\n" { codifyLines(yytext);
- g_contLineNr++;
- yy_pop_state();
- YY_FTN_RESET
- }
-<Start>"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface")?{BS} { // Fortran subroutine or function ends
- //cout << "===> end function " << yytext << endl;
- endScope();
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- yy_push_state(YY_START);
- BEGIN(Subprogend);
- }
-<Subprogend>{ID}/{BS}(\n|!|;) {
- generateLink(*g_code,yytext);
- yy_pop_state();
- }
-<Start>"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"enum"|"type"|"interface"){BS}/(\n|!|;) { // Fortran subroutine or function ends
- //cout << "===> end function " << yytext << endl;
- endScope();
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
- /*-------- variable declaration ----------------------------------*/
-<Start>^{BS}"real"/[,:( ] { // real is a bit tricky as it is a data type but also a function.
- yy_push_state(YY_START);
- BEGIN(Declaration);
- startFontClass("keywordtype");
- g_code->codify(yytext);
- endFontClass();
- }
-<Start>{TYPE_SPEC}/[,:( ] {
- QCString typ = yytext;
- typ = removeRedundantWhiteSpace(typ.lower());
- if (typ.startsWith("real")) YY_FTN_REJECT;
- if (typ == "type" || typ == "class" || typ == "procedure") inTypeDecl = 1;
- yy_push_state(YY_START);
- BEGIN(Declaration);
- startFontClass("keywordtype");
- g_code->codify(yytext);
- endFontClass();
- }
-<Start>{ATTR_SPEC} {
- if (QCString(yytext) == "external")
- {
- yy_push_state(YY_START);
- BEGIN(Declaration);
- g_isExternal = true;
- }
- startFontClass("keywordtype");
- g_code->codify(yytext);
- endFontClass();
- }
-<Declaration>({TYPE_SPEC}|{ATTR_SPEC})/[,:( ] { //| variable declaration
- if (QCString(yytext) == "external") g_isExternal = true;
- startFontClass("keywordtype");
- g_code->codify(yytext);
- endFontClass();
- }
-<Declaration>{ID} { // local var
- if (g_isFixedForm && yy_my_start == 1)
- {
- startFontClass("comment");
- g_code->codify(yytext);
- endFontClass();
- }
- else if (g_currentMemberDef &&
- ((g_currentMemberDef->isFunction() && (g_currentMemberDef->typeString()!=QCString("subroutine") || inTypeDecl)) ||
- g_currentMemberDef->isVariable() || g_currentMemberDef->isEnumValue()
- )
- )
- {
- generateLink(*g_code, yytext);
- }
- else
- {
- g_code->codify(yytext);
- addLocalVar(yytext);
- }
- }
-<Declaration>{BS}("=>"|"="){BS} { // Procedure binding
- BEGIN(DeclarationBinding);
- g_code->codify(yytext);
- }
-<DeclarationBinding>{ID} { // Type bound procedure link
- generateLink(*g_code, yytext);
- yy_pop_state();
- }
-<Declaration>[(] { // start of array or type / class specification
- bracketCount++;
- g_code->codify(yytext);
- }
-
-<Declaration>[)] { // end array specification
- bracketCount--;
- if (!bracketCount) inTypeDecl = 0;
- g_code->codify(yytext);
- }
-
-<Declaration,DeclarationBinding>"&" { // continuation line
- g_code->codify(yytext);
- if (!g_isFixedForm)
- {
- yy_push_state(YY_START);
- BEGIN(DeclContLine);
- }
- }
-<DeclContLine>"\n" { // declaration not yet finished
- g_contLineNr++;
- codifyLines(yytext);
- bracketCount = 0;
- yy_pop_state();
- YY_FTN_RESET
- }
-<Declaration,DeclarationBinding>"\n" { // end declaration line (?)
- if (g_endComment)
- {
- g_endComment=FALSE;
- }
- else
- {
- codifyLines(yytext);
- }
- bracketCount = 0;
- g_contLineNr++;
- if (!(g_hasContLine && g_hasContLine[g_contLineNr - 1]))
- {
- g_isExternal = false;
- yy_pop_state();
- }
- YY_FTN_RESET
- }
-
- /*-------- subprog calls -----------------------------------------*/
-
-<Start>"call"{BS_} {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- yy_push_state(YY_START);
- BEGIN(SubCall);
- }
-<SubCall>{ID} { // subroutine call
- g_insideBody=TRUE;
- generateLink(*g_code, yytext);
- g_insideBody=FALSE;
- yy_pop_state();
- }
-<Start>{ID}{BS}/"(" { // function call
- if (g_isFixedForm && yy_my_start == 6)
- {
- // fixed form continuation line
- YY_FTN_REJECT;
- }
- else if (QCString(yytext).stripWhiteSpace().lower() == "type")
- {
- yy_push_state(YY_START);
- BEGIN(Declaration);
- startFontClass("keywordtype");
- g_code->codify(QCString(yytext).stripWhiteSpace());
- endFontClass();
- g_code->codify(yytext + 4);
- }
- else
- {
- g_insideBody=TRUE;
- generateLink(*g_code, yytext);
- g_insideBody=FALSE;
- }
- }
-
- /*-------- comments ---------------------------------------------------*/
-<Start,Declaration,DeclarationBinding>\n?{BS}"!>"|"!<" { // start comment line or comment block
- if (yytext[0] == '\n')
- {
- g_contLineNr++;
- yy_old_start = 0;
- yy_my_start = 1;
- yy_end = yyleng;
- }
- // Actually we should see if ! on position 6, can be continuation
- // but the chance is very unlikely, so no effort to solve it here
- yy_push_state(YY_START);
- BEGIN(DocBlock);
- docBlock=yytext;
- }
-<Declaration,DeclarationBinding>{BS}"!<" { // start comment line or comment block
- yy_push_state(YY_START);
- BEGIN(DocBlock);
- docBlock=yytext;
- }
-
-<DocBlock>.* { // contents of current comment line
- docBlock+=yytext;
- }
-<DocBlock>"\n"{BS}("!>"|"!<"|"!!") { // comment block (next line is also comment line)
- g_contLineNr++;
- yy_old_start = 0;
- yy_my_start = 1;
- yy_end = yyleng;
- // Actually we should see if ! on position 6, can be continuation
- // but the chance is very unlikely, so no effort to solve it here
- docBlock+=yytext;
- }
-<DocBlock>"\n" { // comment block ends at the end of this line
- // remove special comment (default config)
- g_contLineNr++;
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- g_yyLineNr+=((QCString)docBlock).contains('\n');
- g_yyLineNr+=1;
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- g_endComment=TRUE;
- }
- else // do not remove comment
- {
- startFontClass("comment");
- codifyLines(docBlock);
- endFontClass();
- }
- unput(*yytext);
- g_contLineNr--;
- yy_pop_state();
- YY_FTN_RESET
- }
-
-<*>"!"[^><\n].*|"!"$ { // normal comment
- if(YY_START == String) YY_FTN_REJECT; // ignore in strings
- if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
-
-<*>^[Cc*].* { // normal comment
- if(! g_isFixedForm) YY_FTN_REJECT;
-
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
-<*>"assignment"/{BS}"("{BS}"="{BS}")" {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
-<*>"operator"/{BS}"("[^)]*")" {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
-
- /*------ preprocessor --------------------------------------------*/
-<Start>"#".*\n {
- if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
- g_contLineNr++;
- startFontClass("preprocessor");
- codifyLines(yytext);
- endFontClass();
- YY_FTN_RESET
- }
- /*------ variable references? -------------------------------------*/
-
-<Start>"%"{BS}{ID} { // ignore references to elements
- g_code->codify(yytext);
- }
-<Start>{ID} {
- g_insideBody=TRUE;
- generateLink(*g_code, yytext);
- g_insideBody=FALSE;
- }
- /*------ strings --------------------------------------------------*/
-<String>\n { // string with \n inside
- g_contLineNr++;
- str+=yytext;
- startFontClass("stringliteral");
- codifyLines(str);
- endFontClass();
- str = "";
- YY_FTN_RESET
- }
-<String>\"|\' { // string ends with next quote without previous backspace
- if(yytext[0]!=stringStartSymbol) YY_FTN_REJECT; // single vs double quote
- str+=yytext;
- startFontClass("stringliteral");
- codifyLines(str);
- endFontClass();
- yy_pop_state();
- }
-<String>. {str+=yytext;}
-
-<*>\"|\' { /* string starts */
- /* if(YY_START == StrIgnore) YY_FTN_REJECT; // ignore in simple comments */
- if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
- yy_push_state(YY_START);
- stringStartSymbol=yytext[0]; // single or double quote
- BEGIN(String);
- str=yytext;
- }
- /*-----------------------------------------------------------------------------*/
-
-<*>\n {
- if (g_endComment)
- {
- g_endComment=FALSE;
- }
- else
- {
- codifyLines(yytext);
- // comment cannot extend over the end of a line so should always be terminated at the end of the line.
- if (g_currentFontClass && !strcmp(g_currentFontClass,"comment")) endFontClass();
- }
- g_contLineNr++;
- YY_FTN_RESET
- }
-<*>^{BS}"type"{BS}"=" { g_code->codify(yytext); }
-
-<*>. {
- if (g_isFixedForm && yy_my_start > fixedCommentAfter)
- {
- //yy_push_state(YY_START);
- //BEGIN(DocBlock);
- //docBlock=yytext;
- startFontClass("comment");
- codifyLines(yytext);
- }
- else
- {
- g_code->codify(yytext);
- }
- }
-<*>{LOG_OPER} { // Fortran logical comparison keywords
- g_code->codify(yytext);
- }
-<*><<EOF>> {
- if (YY_START == DocBlock) {
- if (!Config_getBool(STRIP_CODE_COMMENTS))
- {
- startFontClass("comment");
- codifyLines(docBlock);
- endFontClass();
- }
- }
- yyterminate();
- }
-%%
-
-/*@ ----------------------------------------------------------------------------
- */
-
/*===================================================================*/
-void resetFortranCodeParserState() {}
-
-bool recognizeFixedForm(const char* contents, FortranFormat format); /* prototype, implementation in fortranscanner.l */
-const char* prepassFixedForm(const char* contents, int *hasContLine); /* prototype, implementation in fortranscanner.l */
-static void checkContLines(const char *s)
+static void checkContLines(yyscan_t yyscanner,const char *s)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
int numLines = 0;
- int curLine = 0;
int i = 0;
const char *p = s;
@@ -1312,117 +1383,157 @@ static void checkContLines(const char *s)
p++;
}
- g_hasContLine = (int *) malloc((numLines) * sizeof(int));
+ yyextra->hasContLine = (int *) malloc((numLines) * sizeof(int));
for (i = 0; i < numLines; i++)
- g_hasContLine[i] = 0;
- p = prepassFixedForm(s, g_hasContLine);
- g_hasContLine[0] = 0;
+ yyextra->hasContLine[i] = 0;
+ p = prepassFixedForm(s, yyextra->hasContLine);
+ yyextra->hasContLine[0] = 0;
}
-void parseFortranCode(CodeOutputInterface &od,const char *,const QCString &s,
+void parseFortranCode(CodeOutputInterface &od,const char *,const QCString &s,
bool exBlock, const char *exName,FileDef *fd,
- int startLine,int endLine,bool inlineFragment,
- const MemberDef *,bool,const Definition *searchCtx,
+ int startLine,int endLine,bool inlineFragment,
+ const MemberDef *,bool,const Definition *searchCtx,
bool collectXRefs, FortranFormat format)
{
//printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd);
- if (s.isEmpty()) return;
- printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
- g_code = &od;
- g_inputString = s;
- g_inputPosition = 0;
- g_isFixedForm = recognizeFixedForm((const char*)s,format);
- g_contLineNr = 1;
- g_hasContLine = NULL;
- if (g_isFixedForm)
+ return;
+}
+
+//---------------------------------------------------------
+
+struct FortranCodeParser::Private
+{
+ yyscan_t yyscanner;
+ fortrancodeYY_state state;
+ FortranFormat format;
+};
+
+FortranCodeParser::FortranCodeParser(FortranFormat format) : p(std::make_unique<Private>())
+{
+ p->format = format;
+ fortrancodeYYlex_init_extra(&p->state,&p->yyscanner);
+#ifdef FLEX_DEBUG
+ fortrancodeYYset_debug(1,p->yyscanner);
+#endif
+ resetCodeParserState();
+ p->state.useMembers = new UseSDict;
+}
+
+FortranCodeParser::~FortranCodeParser()
+{
+ delete p->state.useMembers;
+ fortrancodeYYlex_destroy(p->yyscanner);
+}
+
+void FortranCodeParser::resetCodeParserState()
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->currentDefinition = 0;
+ yyextra->currentMemberDef = 0;
+ yyextra->currentFontClass = 0;
+ yyextra->needsTermination = FALSE;
+ BEGIN( Start );
+}
+
+void FortranCodeParser::parseCode(CodeOutputInterface & codeOutIntf,
+ const char * scopeName,
+ const QCString & input,
+ SrcLangExt /*lang*/,
+ bool isExampleBlock,
+ const char * exampleName,
+ FileDef * fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ const MemberDef *memberDef,
+ bool showLineNumbers,
+ const Definition *searchCtx,
+ bool collectXRefs
+ )
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ //::parseFortranCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
+ // fileDef,startLine,endLine,inlineFragment,memberDef,
+ // showLineNumbers,searchCtx,collectXRefs,m_format);
+ // parseFortranCode(CodeOutputInterface &od,const char *,const QCString &s,
+ // bool exBlock, const char *exName,FileDef *fd,
+ // int startLine,int endLine,bool inlineFragment,
+ // const MemberDef *,bool,const Definition *searchCtx,
+ // bool collectXRefs, FortranFormat format)
+ if (input.isEmpty()) return;
+ printlex(yy_flex_debug, TRUE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
+ yyextra->code = &codeOutIntf;
+ yyextra->inputString = input;
+ yyextra->inputPosition = 0;
+ yyextra->isFixedForm = recognizeFixedForm(input,p->format);
+ yyextra->contLineNr = 1;
+ yyextra->hasContLine = NULL;
+ if (yyextra->isFixedForm)
{
- checkContLines(g_inputString);
+ checkContLines(yyscanner,yyextra->inputString);
}
- g_currentFontClass = 0;
- g_needsTermination = FALSE;
- g_searchCtx = searchCtx;
- g_collectXRefs = collectXRefs;
+ yyextra->currentFontClass = 0;
+ yyextra->needsTermination = FALSE;
+ yyextra->searchCtx = searchCtx;
+ yyextra->collectXRefs = collectXRefs;
if (startLine!=-1)
- g_yyLineNr = startLine;
+ yyextra->yyLineNr = startLine;
else
- g_yyLineNr = 1;
+ yyextra->yyLineNr = 1;
if (endLine!=-1)
- g_inputLines = endLine+1;
+ yyextra->inputLines = endLine+1;
else
- g_inputLines = g_yyLineNr + countLines() - 1;
+ yyextra->inputLines = yyextra->yyLineNr + countLines(yyscanner) - 1;
- g_exampleBlock = exBlock;
- g_exampleName = exName;
- g_sourceFileDef = fd;
- if (exBlock && fd==0)
+ yyextra->exampleBlock = isExampleBlock;
+ yyextra->exampleName = exampleName;
+ yyextra->sourceFileDef = fileDef;
+ if (isExampleBlock && fileDef==0)
{
// create a dummy filedef for the example
- g_sourceFileDef = createFileDef("",exName);
+ yyextra->sourceFileDef = createFileDef("",exampleName);
}
- if (g_sourceFileDef)
+ if (yyextra->sourceFileDef)
{
- setCurrentDoc("l00001");
+ setCurrentDoc(yyscanner,"l00001");
}
- g_currentDefinition = 0;
- g_currentMemberDef = 0;
- if (!g_exampleName.isEmpty())
+ yyextra->currentDefinition = 0;
+ yyextra->currentMemberDef = 0;
+ if (!yyextra->exampleName.isEmpty())
{
- g_exampleFile = convertNameToFile(g_exampleName+"-example");
+ yyextra->exampleFile = convertNameToFile(yyextra->exampleName+"-example");
}
- g_includeCodeFragment = inlineFragment;
- startCodeLine();
- g_parmName.resize(0);
- g_parmType.resize(0);
- fortrancodeYYrestart( fortrancodeYYin );
+ yyextra->includeCodeFragment = inlineFragment;
+ startCodeLine(yyscanner);
+ fortrancodeYYrestart(0, yyscanner);
BEGIN( Start );
- fortrancodeYYlex();
- if (g_needsTermination)
+ fortrancodeYYlex(yyscanner);
+ if (yyextra->needsTermination)
{
- endFontClass();
- g_code->endCodeLine();
+ endFontClass(yyscanner);
+ yyextra->code->endCodeLine();
}
- if (exBlock && g_sourceFileDef)
+ if (isExampleBlock && yyextra->sourceFileDef)
{
// delete the temporary file definition used for this example
- delete g_sourceFileDef;
- g_sourceFileDef=0;
+ delete yyextra->sourceFileDef;
+ yyextra->sourceFileDef=0;
}
- if (g_hasContLine) free(g_hasContLine);
- g_hasContLine = NULL;
- printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
- return;
-}
-
-//---------------------------------------------------------
+ if (yyextra->hasContLine) free(yyextra->hasContLine);
+ yyextra->hasContLine = NULL;
-void FortranCodeParser::parseCode(CodeOutputInterface & codeOutIntf,
- const char * scopeName,
- const QCString & input,
- SrcLangExt /*lang*/,
- bool isExampleBlock,
- const char * exampleName,
- FileDef * fileDef,
- int startLine,
- int endLine,
- bool inlineFragment,
- const MemberDef *memberDef,
- bool showLineNumbers,
- const Definition *searchCtx,
- bool collectXRefs
- )
-{
- ::parseFortranCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
- fileDef,startLine,endLine,inlineFragment,memberDef,
- showLineNumbers,searchCtx,collectXRefs,m_format);
-}
+ // write the tooltips
+ TooltipManager::instance().writeTooltips(codeOutIntf);
-void FortranCodeParser::resetCodeParserState()
-{
- ::resetFortranCodeParserState();
+ printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
}
//---------------------------------------------------------
+#if USE_STATE2STRING
#include "fortrancode.l.h"
+#endif
diff --git a/src/fortranscanner.h b/src/fortranscanner.h
index 6ffcb1f..0fbba89 100644
--- a/src/fortranscanner.h
+++ b/src/fortranscanner.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -29,13 +29,10 @@ class FortranOutlineParser : public OutlineParserInterface
public:
FortranOutlineParser(FortranFormat format=FortranFormat_Unknown);
~FortranOutlineParser();
- void startTranslationUnit(const char *) {}
- void finishTranslationUnit() {}
void parseInput(const char *fileName,
const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool sameTranslationUnit,
- QStrList &filesInSameTranslationUnit);
+ ClangTUParser *clangParser);
bool needsPreprocessing(const QCString &extension) const;
void parsePrototype(const char *text);
@@ -56,5 +53,6 @@ class FortranOutlineParserFixed : public FortranOutlineParser
FortranOutlineParserFixed() : FortranOutlineParser(FortranFormat_Fixed) { }
};
+const char* prepassFixedForm(const char* contents, int *hasContLine);
#endif
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
index d0ca22d..99e1f9a 100644
--- a/src/fortranscanner.l
+++ b/src/fortranscanner.l
@@ -42,9 +42,14 @@
%option prefix="fortranscannerYY"
%option reentrant
%option extra-type="struct fortranscannerYY_state *"
+%top{
+#include <stdint.h>
+}
%{
+#include <map>
+
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
@@ -65,12 +70,13 @@
#include "defargs.h"
#include "language.h"
#include "commentscan.h"
-#include "fortrancode.h"
#include "pre.h"
#include "arguments.h"
#include "debug.h"
#include "markdown.h"
+const int fixedCommentAfter = 72;
+
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
#define DBG_CTX(x) do { } while(0)
@@ -140,7 +146,7 @@ struct CommentInPrepass
{
int column;
QCString str;
- CommentInPrepass(int column, QCString str) : column(column), str(str) {}
+ CommentInPrepass(int col, QCString s) : column(col), str(s) {}
};
/* -----------------------------------------------------------------
@@ -198,7 +204,7 @@ struct fortranscannerYY_state
//! Accumulated modifiers of current statement, eg variable declaration.
SymbolModifiers currentModifiers;
//! Holds program scope->symbol name->symbol modifiers.
- QMap<Entry*,QMap<QCString,SymbolModifiers> > modifiers;
+ std::map<Entry*,std::map<std::string,SymbolModifiers> > modifiers;
int anonCount = 0 ;
};
@@ -209,7 +215,7 @@ static QCString extractFromParens(const QCString name);
static QCString extractBind(const QCString name);
-static int yyread(yyscan_t yyscanner,char *buf,int max_size);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
static void startCommentBlock(yyscan_t yyscanner,bool);
static void handleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool brief);
static void subrHandleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool brief);
@@ -463,6 +469,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
<Use>{ID} {
DBG_CTX((stderr,"using dir %s\n",yytext));
yyextra->current->name=yytext;
+ yyextra->current->name=yyextra->current->name.lower();
yyextra->current->fileName = yyextra->fileName;
yyextra->current->section=Entry::USINGDIR_SEC;
yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
@@ -471,12 +478,14 @@ SCOPENAME ({ID}{BS}"::"{BS})*
}
<Use>{ID}/, {
yyextra->useModuleName=yytext;
+ yyextra->useModuleName=yyextra->useModuleName.lower();
}
<Use>,{BS}"ONLY" { BEGIN(UseOnly);
}
<UseOnly>{BS},{BS} {}
<UseOnly>{ID} {
yyextra->current->name= yyextra->useModuleName+"::"+yytext;
+ yyextra->current->name=yyextra->current->name.lower();
yyextra->current->fileName = yyextra->fileName;
yyextra->current->section=Entry::USINGDECL_SEC;
yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
@@ -705,7 +714,7 @@ private {
}
{ID} {
QCString name = yytext;
- yyextra->modifiers[yyextra->current_root][name.lower()] |= yyextra->currentModifiers;
+ yyextra->modifiers[yyextra->current_root][name.lower().str()] |= yyextra->currentModifiers;
yyextra->current->section = Entry::FUNCTION_SEC;
yyextra->current->name = name;
yyextra->current->fileName = yyextra->fileName;
@@ -767,6 +776,7 @@ private {
yyterminate();
}
yyextra->subrCurrent.pop_back();
+ yyextra->vtype = V_IGNORE;
yy_pop_state(yyscanner) ;
}
<BlockData>{
@@ -864,7 +874,7 @@ private {
QCString name=yytext;
name = name.lower();
/* remember attributes for the symbol */
- yyextra->modifiers[yyextra->current_root][name.lower()] |= yyextra->currentModifiers;
+ yyextra->modifiers[yyextra->current_root][name.lower().str()] |= yyextra->currentModifiers;
yyextra->argName= name;
yyextra->vtype= V_IGNORE;
@@ -905,12 +915,12 @@ private {
// save, it may be function return type
if (parameter)
{
- yyextra->modifiers[yyextra->current_root][name.lower()].type = yyextra->argType;
+ yyextra->modifiers[yyextra->current_root][name.lower().str()].type = yyextra->argType;
}
else
{
if ((yyextra->current_root->name.lower() == yyextra->argName.lower()) ||
- (yyextra->modifiers[yyextra->current_root->parent()][yyextra->current_root->name.lower()].returnName.lower() == yyextra->argName.lower()))
+ (yyextra->modifiers[yyextra->current_root->parent()][yyextra->current_root->name.lower().str()].returnName.lower() == yyextra->argName.lower()))
{
int strt = yyextra->current_root->type.find("function");
QCString lft;
@@ -923,7 +933,7 @@ private {
if (strt != 0) lft = yyextra->current_root->type.left(strt).stripWhiteSpace();
if ((yyextra->current_root->type.length() - strt - strlen("function"))!= 0)
{
- rght = yyextra->current_root->type.right(yyextra->current_root->type.length() - strt - strlen("function")).stripWhiteSpace();
+ rght = yyextra->current_root->type.right(yyextra->current_root->type.length() - strt - (int)strlen("function")).stripWhiteSpace();
}
yyextra->current_root->type = lft;
if (rght.length() > 0)
@@ -948,11 +958,11 @@ private {
yyextra->current_root->type += " " + yyextra->argType.stripWhiteSpace();
}
yyextra->current_root->type = yyextra->current_root->type.stripWhiteSpace();
- yyextra->modifiers[yyextra->current_root][name.lower()].type = yyextra->current_root->type;
+ yyextra->modifiers[yyextra->current_root][name.lower().str()].type = yyextra->current_root->type;
}
else
{
- yyextra->modifiers[yyextra->current_root][name.lower()].type = yyextra->argType;
+ yyextra->modifiers[yyextra->current_root][name.lower().str()].type = yyextra->argType;
}
}
// any accumulated doc for argument should be emptied,
@@ -966,7 +976,7 @@ private {
QCString name(yyextra->argName);
QCString attr("dimension");
attr += yytext;
- yyextra->modifiers[yyextra->current_root][name.lower()] |= attr;
+ yyextra->modifiers[yyextra->current_root][name.lower().str()] |= attr;
}
<Variable>{COMMA} { //printf("COMMA: %d<=..<=%d\n", yyextra->colNr-(int)yyleng, yyextra->colNr);
// locate !< comment
@@ -1140,7 +1150,7 @@ private {
<Subprog>{BS} { /* ignore white space */ }
<Subprog>{ID} { yyextra->current->name = yytext;
//cout << "1a==========> got " << yyextra->current->type << " " << yytext << " " << yyextra->lineNr << endl;
- yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower()].returnName = yyextra->current->name.lower();
+ yyextra->modifiers[yyextra->current_root][yyextra->current->name.lower().str()].returnName = yyextra->current->name.lower();
if (yyextra->ifType == IF_ABSTRACT || yyextra->ifType == IF_SPECIFIC)
{
@@ -1189,7 +1199,7 @@ private {
QCString result= yytext;
result= result.right(result.length()-result.find("(")-1);
result= result.stripWhiteSpace();
- yyextra->modifiers[yyextra->current_root->parent()][yyextra->current_root->name.lower()].returnName = result;
+ yyextra->modifiers[yyextra->current_root->parent()][yyextra->current_root->name.lower().str()].returnName = result;
}
//cout << "=====> got result " << result << endl;
}
@@ -1491,50 +1501,6 @@ void truncatePrepass(yyscan_t yyscanner,int index)
yyextra->inputStringPrepass.truncate(index);
}
-// simplified way to know if this is fixed form
-// duplicate in fortrancode.l
-bool recognizeFixedForm(const char* contents, FortranFormat format)
-{
- int column=0;
- bool skipLine=FALSE;
-
- if (format == FortranFormat_Fixed) return TRUE;
- if (format == FortranFormat_Free) return FALSE;
-
- for(int i=0;;i++) {
- column++;
-
- switch(contents[i]) {
- case '\n':
- column=0;
- skipLine=FALSE;
- break;
- case ' ':
- break;
- case '\000':
- return FALSE;
- case '#':
- skipLine=TRUE;
- break;
- case 'C':
- case 'c':
- case '*':
- if (column==1) return TRUE;
- if (skipLine) break;
- return FALSE;
- case '!':
- if (column>1 && column<7) return FALSE;
- skipLine=TRUE;
- break;
- default:
- if (skipLine) break;
- if (column==7) return TRUE;
- return FALSE;
- }
- }
- return FALSE;
-}
-
/* This function assumes that contents has at least size=length+1 */
static void insertCharacter(char *contents, int length, int pos, char c)
{
@@ -1563,7 +1529,7 @@ const char* prepassFixedForm(const char* contents, int *hasContLine)
bool fullCommentLine=TRUE;
bool artificialComment=FALSE;
bool spaces=TRUE;
- int newContentsSize = strlen(contents)+3; // \000, \n (when necessary) and one spare character (to avoid reallocation)
+ int newContentsSize = (int)strlen(contents)+3; // \000, \n (when necessary) and one spare character (to avoid reallocation)
char* newContents = (char*)malloc(newContentsSize);
int curLine = 1;
@@ -1639,7 +1605,7 @@ const char* prepassFixedForm(const char* contents, int *hasContLine)
return NULL;
}
newContents[j]='\000';
- newContentsSize = strlen(newContents);
+ newContentsSize = (int)strlen(newContents);
if (newContents[newContentsSize - 1] != '\n')
{
// to be on the safe side
@@ -1782,7 +1748,7 @@ const char* prepassFixedForm(const char* contents, int *hasContLine)
free(newContents);
return NULL;
}
- newContentsSize = strlen(newContents);
+ newContentsSize = (int)strlen(newContents);
if (newContents[newContentsSize - 1] != '\n')
{
// to be on the safe side
@@ -2055,7 +2021,7 @@ static Argument *findArgument(Entry* subprog, QCString name, bool byTypeName = F
/*! Apply yyextra->modifiers stored in \a mdfs to the \a typeName string. */
-static QCString applyModifiers(QCString typeName, SymbolModifiers& mdfs)
+static QCString applyModifiers(QCString typeName, const SymbolModifiers& mdfs)
{
if (!mdfs.dimension.isNull())
{
@@ -2172,14 +2138,14 @@ static QCString applyModifiers(QCString typeName, SymbolModifiers& mdfs)
}
/*! Apply yyextra->modifiers stored in \a mdfs to the \a arg argument. */
-static void applyModifiers(Argument *arg, SymbolModifiers& mdfs)
+static void applyModifiers(Argument *arg, const SymbolModifiers& mdfs)
{
QCString tmp = arg->type;
arg->type = applyModifiers(tmp, mdfs);
}
/*! Apply yyextra->modifiers stored in \a mdfs to the \a ent entry. */
-static void applyModifiers(Entry *ent, SymbolModifiers& mdfs)
+static void applyModifiers(Entry *ent, const SymbolModifiers& mdfs)
{
QCString tmp = ent->type;
ent->type = applyModifiers(tmp, mdfs);
@@ -2200,8 +2166,7 @@ static void startScope(yyscan_t yyscanner,Entry *scope)
//cout<<"start scope: "<<scope->name<<endl;
yyextra->current_root= scope; /* start substructure */
- QMap<QCString,SymbolModifiers> mdfMap;
- yyextra->modifiers.insert(scope, mdfMap);
+ yyextra->modifiers.insert(std::make_pair(scope, std::map<std::string,SymbolModifiers>()));
}
/*! Ends scope in fortran program: may update subprogram arguments or module variable attributes.
@@ -2232,32 +2197,32 @@ static bool endScope(yyscan_t yyscanner,Entry *scope, bool isGlobalRoot)
}
// update variables or subprogram arguments with yyextra->modifiers
- QMap<QCString,SymbolModifiers>& mdfsMap = yyextra->modifiers[scope];
+ std::map<std::string,SymbolModifiers>& mdfsMap = yyextra->modifiers[scope];
if (scope->section == Entry::FUNCTION_SEC)
{
// iterate all symbol yyextra->modifiers of the scope
- for (QMap<QCString,SymbolModifiers>::Iterator it=mdfsMap.begin(); it!=mdfsMap.end(); it++)
+ for (const auto &kv : mdfsMap)
{
//cout<<it.key()<<": "<<it.data()<<endl;
- Argument *arg = findArgument(scope, it.key());
+ Argument *arg = findArgument(scope, kv.first);
if (arg)
{
- applyModifiers(arg, it.data());
+ applyModifiers(arg, kv.second);
}
}
// find return type for function
//cout<<"RETURN NAME "<<yyextra->modifiers[yyextra->current_root][scope->name.lower()].returnName<<endl;
- QCString returnName = yyextra->modifiers[yyextra->current_root][scope->name.lower()].returnName.lower();
- if (yyextra->modifiers[scope].contains(returnName))
+ QCString returnName = yyextra->modifiers[yyextra->current_root][scope->name.lower().str()].returnName.lower();
+ if (yyextra->modifiers[scope].find(returnName.str())!=yyextra->modifiers[scope].end())
{
- scope->type = yyextra->modifiers[scope][returnName].type; // returning type works
- applyModifiers(scope, yyextra->modifiers[scope][returnName]); // returning array works
+ scope->type = yyextra->modifiers[scope][returnName.str()].type; // returning type works
+ applyModifiers(scope, yyextra->modifiers[scope][returnName.str()]); // returning array works
}
- }
+ }
if (scope->section == Entry::CLASS_SEC)
{ // was INTERFACE_SEC
if (scope->parent()->section == Entry::FUNCTION_SEC)
@@ -2285,7 +2250,7 @@ static bool endScope(yyscan_t yyscanner,Entry *scope, bool isGlobalRoot)
if ((count == 1) && found)
{
// clear all yyextra->modifiers of the scope
- yyextra->modifiers.remove(scope);
+ yyextra->modifiers.erase(scope);
scope->parent()->removeSubEntry(scope);
scope = 0;
return TRUE;
@@ -2301,21 +2266,21 @@ static bool endScope(yyscan_t yyscanner,Entry *scope, bool isGlobalRoot)
continue;
//cout<<ce->name<<", "<<mdfsMap.contains(ce->name.lower())<<mdfsMap.count()<<endl;
- if (mdfsMap.contains(ce->name.lower()))
- applyModifiers(ce.get(), mdfsMap[ce->name.lower()]);
+ if (mdfsMap.find(ce->name.lower().str())!=mdfsMap.end())
+ applyModifiers(ce.get(), mdfsMap[ce->name.lower().str()]);
}
}
// clear all yyextra->modifiers of the scope
- yyextra->modifiers.remove(scope);
+ yyextra->modifiers.erase(scope);
return TRUE;
}
-static int yyread(yyscan_t yyscanner,char *buf,int max_size)
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- int c=0;
+ yy_size_t c=0;
while ( c < max_size && yyextra->inputString[yyextra->inputPosition] )
{
*buf = yyextra->inputString[yyextra->inputPosition++] ;
@@ -2345,7 +2310,7 @@ static void initEntry(yyscan_t yyscanner)
yyextra->current->virt = Normal;
yyextra->current->stat = FALSE;
yyextra->current->lang = SrcLangExt_Fortran;
- Doxygen::docGroup.initGroupInfo(yyextra->current.get());
+ yyextra->commentScanner.initGroupInfo(yyextra->current.get());
}
/**
@@ -2511,7 +2476,8 @@ static void handleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool brief
int lineNr = brief ? yyextra->current->briefLine : yyextra->current->docLine;
int position=0;
bool needsEntry = FALSE;
- QCString processedDoc = processMarkdownForCommentBlock(doc,yyextra->fileName,lineNr);
+ Markdown markdown(yyextra->fileName,lineNr);
+ QCString processedDoc = Config_getBool(MARKDOWN_SUPPORT) ? markdown.process(doc,lineNr) : doc;
while (yyextra->commentScanner.parseCommentBlock(
yyextra->thisParser,
yyextra->docBlockInBody ? yyextra->subrCurrent.back().get() : yyextra->current.get(),
@@ -2523,8 +2489,9 @@ static void handleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool brief
yyextra->docBlockInBody,
yyextra->defaultProtection,
position,
- needsEntry
- ))
+ needsEntry,
+ Config_getBool(MARKDOWN_SUPPORT)
+ ))
{
DBG_CTX((stderr,"parseCommentBlock position=%d [%s] needsEntry=%d\n",position,doc.data()+position,needsEntry));
if (needsEntry) addCurrentEntry(yyscanner,false);
@@ -2556,7 +2523,7 @@ static void subrHandleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool b
loc_doc.stripWhiteSpace();
// direction as defined with the declaration of the parameter
- int dir1 = yyextra->modifiers[yyextra->current_root][yyextra->argName.lower()].direction;
+ int dir1 = yyextra->modifiers[yyextra->current_root][yyextra->argName.lower().str()].direction;
// in description [in] is specified
if (loc_doc.lower().find(directionParam[SymbolModifiers::IN]) == 0)
{
@@ -2565,7 +2532,7 @@ static void subrHandleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool b
(directionParam[dir1] == directionParam[SymbolModifiers::IN]))
{
// strip direction
- loc_doc = loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::IN]));
+ loc_doc = loc_doc.right(loc_doc.length()-(int)strlen(directionParam[SymbolModifiers::IN]));
loc_doc.stripWhiteSpace();
// in case of empty documentation or (now) just name, consider it as no documentation
if (!loc_doc.isEmpty() && (loc_doc.lower() != yyextra->argName.lower()))
@@ -2577,8 +2544,8 @@ static void subrHandleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool b
else
{
// something different specified, give warning and leave error.
- warn(yyextra->fileName,yyextra->lineNr, "Routine: " + yyextra->current->name + yyextra->current->args +
- " inconsistency between intent attribute and documentation for parameter: " + yyextra->argName);
+ warn(yyextra->fileName,yyextra->lineNr, "%s", ("Routine: " + yyextra->current->name + yyextra->current->args +
+ " inconsistency between intent attribute and documentation for parameter: " + yyextra->argName).data());
handleCommentBlock(yyscanner,QCString("\n\n@param ") + directionParam[dir1] + " " +
yyextra->argName + " " + loc_doc,brief);
}
@@ -2589,7 +2556,7 @@ static void subrHandleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool b
if ((directionParam[dir1] == directionParam[SymbolModifiers::NONE_D]) ||
(directionParam[dir1] == directionParam[SymbolModifiers::OUT]))
{
- loc_doc = loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::OUT]));
+ loc_doc = loc_doc.right(loc_doc.length()-(int)strlen(directionParam[SymbolModifiers::OUT]));
loc_doc.stripWhiteSpace();
if (loc_doc.isEmpty() || (loc_doc.lower() == yyextra->argName.lower()))
{
@@ -2601,8 +2568,8 @@ static void subrHandleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool b
}
else
{
- warn(yyextra->fileName,yyextra->lineNr, "Routine: " + yyextra->current->name + yyextra->current->args +
- " inconsistency between intent attribute and documentation for parameter: " + yyextra->argName);
+ warn(yyextra->fileName,yyextra->lineNr, "%s", ("Routine: " + yyextra->current->name + yyextra->current->args +
+ " inconsistency between intent attribute and documentation for parameter: " + yyextra->argName).data());
handleCommentBlock(yyscanner,QCString("\n\n@param ") + directionParam[dir1] + " " +
yyextra->argName + " " + loc_doc,brief);
}
@@ -2613,7 +2580,7 @@ static void subrHandleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool b
if ((directionParam[dir1] == directionParam[SymbolModifiers::NONE_D]) ||
(directionParam[dir1] == directionParam[SymbolModifiers::INOUT]))
{
- loc_doc = loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::INOUT]));
+ loc_doc = loc_doc.right(loc_doc.length()-(int)strlen(directionParam[SymbolModifiers::INOUT]));
loc_doc.stripWhiteSpace();
if (!loc_doc.isEmpty() && (loc_doc.lower() != yyextra->argName.lower()))
{
@@ -2623,8 +2590,8 @@ static void subrHandleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool b
}
else
{
- warn(yyextra->fileName,yyextra->lineNr, "Routine: " + yyextra->current->name + yyextra->current->args +
- " inconsistency between intent attribute and documentation for parameter: " + yyextra->argName);
+ warn(yyextra->fileName,yyextra->lineNr, "%s", ("Routine: " + yyextra->current->name + yyextra->current->args +
+ " inconsistency between intent attribute and documentation for parameter: " + yyextra->argName).data());
handleCommentBlock(yyscanner,QCString("\n\n@param ") + directionParam[dir1] + " " +
yyextra->argName + " " + loc_doc,brief);
}
@@ -2679,6 +2646,9 @@ static void parseMain(yyscan_t yyscanner, const char *fileName,const char *fileB
char *tmpBuf = NULL;
initParser(yyscanner);
+
+ if (fileBuf==0 || fileBuf[0]=='\0') return;
+
yyextra->defaultProtection = Public;
yyextra->inputString = fileBuf;
yyextra->inputPosition = 0;
@@ -2724,7 +2694,7 @@ static void parseMain(yyscan_t yyscanner, const char *fileName,const char *fileB
yyextra->global_scope = rt.get();
startScope(yyscanner,rt.get()); // implies yyextra->current_root = rt
initParser(yyscanner);
- Doxygen::docGroup.enterFile(yyextra->fileName,yyextra->lineNr);
+ yyextra->commentScanner.enterFile(yyextra->fileName,yyextra->lineNr);
// add entry for the file
yyextra->current = std::make_shared<Entry>();
@@ -2741,7 +2711,7 @@ static void parseMain(yyscan_t yyscanner, const char *fileName,const char *fileB
}
fortranscannerYYlex(yyscanner);
- Doxygen::docGroup.leaveFile(yyextra->fileName,yyextra->lineNr);
+ yyextra->commentScanner.leaveFile(yyextra->fileName,yyextra->lineNr);
if (yyextra->global_scope && yyextra->global_scope != INVALID_ENTRY)
{
@@ -2798,8 +2768,7 @@ FortranOutlineParser::~FortranOutlineParser()
void FortranOutlineParser::parseInput(const char *fileName,
const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool /*sameTranslationUnit*/,
- QStrList & /*filesInSameTranslationUnit*/)
+ ClangTUParser * /*clangParser*/)
{
struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
yyextra->thisParser = this;
diff --git a/src/ftextstream.h b/src/ftextstream.h
index bfc5bd5..5b6a9ca 100644
--- a/src/ftextstream.h
+++ b/src/ftextstream.h
@@ -60,7 +60,8 @@ inline FTextStream &FTextStream::operator<<( const char* s)
inline FTextStream &FTextStream::operator<<( const QCString &s)
{
- return operator<<(s.data());
+ if (m_dev) m_dev->writeBlock( s, s.length() );
+ return *this;
}
typedef FTextStream & (*FTSFUNC)(FTextStream &);// manipulator function
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
index 149f43c..c8edeb2 100644
--- a/src/ftvhelp.cpp
+++ b/src/ftvhelp.cpp
@@ -43,6 +43,32 @@
static int folderId=1;
+const char *JAVASCRIPT_LICENSE_TEXT = R"LIC(/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+*/
+)LIC";
+
struct FTVNode
{
FTVNode(bool dir,const char *r,const char *f,const char *a,
@@ -141,7 +167,7 @@ void FTVHelp::finalize()
*/
void FTVHelp::incContentsDepth()
{
- //printf("incContentsDepth() indent=%d\n",m_indent);
+ //printf("%p: incContentsDepth() indent=%d\n",this,m_indent);
m_indent++;
ASSERT(m_indent<MAX_INDENT);
}
@@ -152,7 +178,7 @@ void FTVHelp::incContentsDepth()
*/
void FTVHelp::decContentsDepth()
{
- //printf("decContentsDepth() indent=%d\n",m_indent);
+ //printf("%p: decContentsDepth() indent=%d\n",this,m_indent);
ASSERT(m_indent>0);
if (m_indent>0)
{
@@ -223,7 +249,7 @@ static QCString node2URL(const FTVNode *n,bool overruleFile=FALSE,bool srcLink=F
{
if (overruleFile && n->def && n->def->definitionType()==Definition::TypeFile)
{
- const FileDef *fd = dynamic_cast<const FileDef*>(n->def);
+ const FileDef *fd = toFileDef(n->def);
if (srcLink)
{
url = fd->getSourceFileBase();
@@ -233,7 +259,7 @@ static QCString node2URL(const FTVNode *n,bool overruleFile=FALSE,bool srcLink=F
url = fd->getOutputFileBase();
}
}
- url+=Doxygen::htmlFileExtension;
+ url = addHtmlExtensionIfMissing(url);
if (!n->anchor.isEmpty()) url+="#"+n->anchor;
}
return url;
@@ -322,7 +348,8 @@ static void generateBriefDoc(FTextStream &t,const Definition *def)
if (!brief.isEmpty())
{
DocNode *root = validatingParseDoc(def->briefFile(),def->briefLine(),
- def,0,brief,FALSE,FALSE,0,TRUE,TRUE);
+ def,0,brief,FALSE,FALSE,
+ 0,TRUE,TRUE,Config_getBool(MARKDOWN_SUPPORT));
QCString relPath = relativePathToRoot(def->getOutputFileBase());
HtmlCodeGenerator htmlGen(t,relPath);
HtmlDocVisitor *visitor = new HtmlDocVisitor(t,htmlGen,def);
@@ -392,7 +419,7 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
}
else if (n->def && n->def->definitionType()==Definition::TypeClass)
{
- char icon=compoundIcon(dynamic_cast<const ClassDef*>(n->def));
+ char icon=compoundIcon(toClassDef(n->def));
t << "<span class=\"icona\"><span class=\"icon\">" << icon << "</span></span>";
}
else
@@ -417,9 +444,9 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
{
const FileDef *srcRef=0;
if (n->def && n->def->definitionType()==Definition::TypeFile &&
- (dynamic_cast<const FileDef*>(n->def))->generateSourceFile())
+ (toFileDef(n->def))->generateSourceFile())
{
- srcRef = dynamic_cast<const FileDef*>(n->def);
+ srcRef = toFileDef(n->def);
}
if (srcRef)
{
@@ -448,9 +475,13 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
}
else if (n->def && n->def->definitionType()==Definition::TypeClass)
{
- char icon=compoundIcon(dynamic_cast<const ClassDef*>(n->def));
+ char icon=compoundIcon(toClassDef(n->def));
t << "<span class=\"icona\"><span class=\"icon\">" << icon << "</span></span>";
}
+ else if (n->def && n->def->definitionType()==Definition::TypeDir)
+ {
+ t << "<span class=\"iconfclosed\"></span>";
+ }
else
{
t << "<span class=\"icondoc\"></span>";
@@ -560,7 +591,7 @@ static bool generateJSTree(NavIndexEntryList &navIndex,FTextStream &t,
{
if (n->def && n->def->definitionType()==Definition::TypeFile)
{
- const FileDef *fd = dynamic_cast<const FileDef*>(n->def);
+ const FileDef *fd = toFileDef(n->def);
bool doc,src;
doc = fileVisibleInIndex(fd,src);
if (doc)
@@ -639,7 +670,7 @@ static void generateJSNavTree(const QList<FTVNode> &nodeList)
t << "var NAVTREE =" << endl;
t << "[" << endl;
t << " [ ";
- QCString &projName = Config_getString(PROJECT_NAME);
+ QCString projName = Config_getString(PROJECT_NAME);
if (projName.isEmpty())
{
if (mainPageHasTitle()) // Use title of main page as root
@@ -689,7 +720,7 @@ static void generateJSNavTree(const QList<FTVNode> &nodeList)
tsidx << "{" << endl;
QListIterator<NavIndexEntry> li(navIndex);
NavIndexEntry *e;
- bool first=TRUE;
+ first=TRUE;
for (li.toFirst();(e=li.current());) // for each entry
{
if (elemCount==0)
@@ -781,8 +812,7 @@ void FTVHelp::generateTreeViewInline(FTextStream &t)
t << "<div class=\"levels\">[";
t << theTranslator->trDetailLevel();
t << " ";
- int i;
- for (i=1;i<=depth;i++)
+ for (int i=1;i<=depth;i++)
{
t << "<span onclick=\"javascript:toggleLevel(" << i << ");\">" << i << "</span>";
}
@@ -794,9 +824,7 @@ void FTVHelp::generateTreeViewInline(FTextStream &t)
for (int i=1;i<=depth;i++)
{
int num=0;
- QListIterator<FTVNode> li(m_indentNodes[0]);
- FTVNode *n;
- for (;(n=li.current());++li)
+ for (li.toFirst();(n=li.current());++li)
{
num+=n->numNodesAtLevel(0,i);
}
diff --git a/src/ftvhelp.h b/src/ftvhelp.h
index 9bcaa5b..42fe707 100644
--- a/src/ftvhelp.h
+++ b/src/ftvhelp.h
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -72,22 +72,7 @@ class FTVHelp : public IndexIntf
bool m_topLevelIndex;
};
-#define JAVASCRIPT_LICENSE_TEXT \
- "/*\n@licstart The following is the entire license notice for the\n" \
- "JavaScript code in this file.\n\nCopyright (C) 1997-2019 by Dimitri van Heesch\n\n" \
- "This program is free software; you can redistribute it and/or modify\n" \
- "it under the terms of version 2 of the GNU General Public License as published by\n" \
- "the Free Software Foundation\n\n" \
- "This program is distributed in the hope that it will be useful,\n" \
- "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
- "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" \
- "GNU General Public License for more details.\n\n" \
- "You should have received a copy of the GNU General Public License along\n" \
- "with this program; if not, write to the Free Software Foundation, Inc.,\n" \
- "51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\n" \
- "@licend The above is the entire license notice\n" \
- "for the JavaScript code in this file\n" \
- "*/\n"
+extern const char *JAVASCRIPT_LICENSE_TEXT;
#endif /* FTVHELP_H */
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 0d6d43f..d8526d9 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -15,8 +15,12 @@
*
*/
+#include <algorithm>
+#include <vector>
+
#include <ctype.h>
#include <qregexp.h>
+
#include "groupdef.h"
#include "classdef.h"
#include "filedef.h"
@@ -45,7 +49,7 @@
//---------------------------------------------------------------------------
-class GroupDefImpl : public DefinitionImpl, public GroupDef
+class GroupDefImpl : public DefinitionMixin<GroupDef>
{
public:
GroupDefImpl(const char *fileName,int line,const char *name,const char *title,const char *refFileName=0);
@@ -54,17 +58,17 @@ class GroupDefImpl : public DefinitionImpl, public GroupDef
virtual DefType definitionType() const { return TypeGroup; }
virtual QCString getOutputFileBase() const;
virtual QCString anchor() const { return QCString(); }
- virtual QCString displayName(bool=TRUE) const { return hasGroupTitle() ? title : DefinitionImpl::name(); }
- virtual const char *groupTitle() const { return title; }
+ virtual QCString displayName(bool=TRUE) const { return hasGroupTitle() ? m_title : DefinitionMixin::name(); }
+ virtual const char *groupTitle() const { return m_title; }
virtual void setGroupTitle( const char *newtitle );
- virtual bool hasGroupTitle( ) const { return titleSet; }
- virtual void addFile(const FileDef *def);
+ virtual bool hasGroupTitle( ) const { return m_titleSet; }
+ virtual void addFile(const FileDef *def);
virtual bool addClass(const ClassDef *def);
virtual bool addNamespace(const NamespaceDef *def);
virtual void addGroup(const GroupDef *def);
- virtual void addPage(PageDef *def);
+ virtual void addPage(const PageDef *def);
virtual void addExample(const PageDef *def);
- virtual void addDir(const DirDef *dd);
+ virtual void addDir(DirDef *dd);
virtual bool insertMember(MemberDef *def,bool docOnly=FALSE);
virtual void removeMember(MemberDef *md);
virtual bool findGroup(const GroupDef *def) const; // true if def is a subgroup of this group
@@ -72,7 +76,7 @@ class GroupDefImpl : public DefinitionImpl, public GroupDef
virtual void writeMemberPages(OutputList &ol);
virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const;
virtual void writeTagFile(FTextStream &);
- virtual int numDocMembers() const;
+ virtual size_t numDocMembers() const;
virtual bool isLinkableInProject() const;
virtual bool isLinkable() const;
virtual bool isASubGroup() const;
@@ -87,28 +91,27 @@ class GroupDefImpl : public DefinitionImpl, public GroupDef
virtual void sortMemberLists();
virtual bool subGrouping() const { return m_subGrouping; }
- virtual void setGroupScope(Definition *d) { groupScope = d; }
- virtual Definition *getGroupScope() const { return groupScope; }
+ virtual void setGroupScope(Definition *d) { m_groupScope = d; }
+ virtual Definition *getGroupScope() const { return m_groupScope; }
virtual MemberList *getMemberList(MemberListType lt) const;
- virtual const QList<MemberList> &getMemberLists() const { return m_memberLists; }
+ virtual const MemberLists &getMemberLists() const { return m_memberLists; }
/* user defined member groups */
- virtual MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
-
- virtual FileList * getFiles() const { return fileList; }
- virtual ClassSDict * getClasses() const { return classSDict; }
- virtual NamespaceSDict * getNamespaces() const { return namespaceSDict; }
- virtual GroupList * getSubGroups() const { return groupList; }
- virtual PageSDict * getPages() const { return pageDict; }
- virtual DirList * getDirs() const { return dirList; }
- virtual PageSDict * getExamples() const { return exampleDict; }
+ virtual const MemberGroupList &getMemberGroups() const { return m_memberGroups; }
+
+ virtual FileList * getFiles() const { return m_fileList; }
+ virtual const ClassLinkedRefMap &getClasses() const { return m_classes; }
+ virtual const NamespaceLinkedRefMap &getNamespaces() const { return m_namespaces; }
+ virtual const GroupList &getSubGroups() const { return m_groups; }
+ virtual const PageLinkedRefMap &getPages() const { return m_pages; }
+ virtual const DirList & getDirs() const { return m_dirList; }
+ virtual const PageLinkedRefMap &getExamples() const { return m_examples; }
virtual bool hasDetailedDescription() const;
virtual void sortSubGroups();
-
- private:
+
+ private:
void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
- MemberList *createMemberList(MemberListType lt);
void addMemberToList(MemberListType lt,MemberDef *md);
void writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCString &title);
void writeMemberDocumentation(OutputList &ol,MemberListType lt,const QCString &title);
@@ -132,25 +135,22 @@ class GroupDefImpl : public DefinitionImpl, public GroupDef
void writeSummaryLinks(OutputList &ol) const;
void updateLanguage(const Definition *);
- QCString title; // title of the group
- bool titleSet; // true if title is not the same as the name
- QCString fileName; // base name of the generated file
- FileList *fileList; // list of files in the group
- ClassSDict *classSDict; // list of classes in the group
- NamespaceSDict *namespaceSDict; // list of namespaces in the group
- GroupList *groupList; // list of sub groups.
- PageSDict *pageDict; // list of pages in the group
- PageSDict *exampleDict; // list of examples in the group
- DirList *dirList; // list of directories in the group
-
- MemberList *allMemberList;
- MemberNameInfoSDict *allMemberNameInfoSDict;
-
- Definition *groupScope;
-
- QList<MemberList> m_memberLists;
- MemberGroupSDict *memberGroupSDict;
- bool m_subGrouping;
+ QCString m_title; // title of the group
+ bool m_titleSet; // true if title is not the same as the name
+ QCString m_fileName; // base name of the generated file
+ FileList * m_fileList; // list of files in the group
+ ClassLinkedRefMap m_classes; // list of classes in the group
+ NamespaceLinkedRefMap m_namespaces; // list of namespaces in the group
+ GroupList m_groups; // list of sub groups.
+ PageLinkedRefMap m_pages; // list of pages in the group
+ PageLinkedRefMap m_examples; // list of examples in the group
+ DirList m_dirList; // list of directories in the group
+ MemberList * m_allMemberList;
+ MemberNameInfoLinkedMap m_allMemberNameInfoLinkedMap;
+ Definition * m_groupScope;
+ MemberLists m_memberLists;
+ MemberGroupList m_memberGroups;
+ bool m_subGrouping;
};
@@ -164,71 +164,51 @@ GroupDef *createGroupDef(const char *fileName,int line,const char *name,
//---------------------------------------------------------------------------
GroupDefImpl::GroupDefImpl(const char *df,int dl,const char *na,const char *t,
- const char *refFileName) : DefinitionImpl(df,dl,1,na)
-{
- fileList = new FileList;
- classSDict = new ClassSDict(17);
- groupList = new GroupList;
- namespaceSDict = new NamespaceSDict(17);
- pageDict = new PageSDict(17);
- exampleDict = new PageSDict(17);
- dirList = new DirList;
- allMemberNameInfoSDict = new MemberNameInfoSDict(17);
- allMemberNameInfoSDict->setAutoDelete(TRUE);
+ const char *refFileName) : DefinitionMixin(df,dl,1,na)
+{
+ m_fileList = new FileList;
if (refFileName)
{
- fileName=stripExtension(refFileName);
+ m_fileName=stripExtension(refFileName);
}
else
{
- fileName = convertNameToFile(QCString("group_")+na);
+ m_fileName = convertNameToFile(QCString("group_")+na);
}
setGroupTitle( t );
- memberGroupSDict = new MemberGroupSDict;
- memberGroupSDict->setAutoDelete(TRUE);
- allMemberList = new MemberList(MemberListType_allMembersList);
+ m_allMemberList = new MemberList(MemberListType_allMembersList);
//visited = 0;
- groupScope = 0;
+ m_groupScope = 0;
m_subGrouping=Config_getBool(SUBGROUPING);
}
GroupDefImpl::~GroupDefImpl()
{
- delete fileList;
- delete classSDict;
- delete groupList;
- delete namespaceSDict;
- delete pageDict;
- delete exampleDict;
- delete allMemberList;
- delete allMemberNameInfoSDict;
- delete memberGroupSDict;
- delete dirList;
+ delete m_fileList;
+ delete m_allMemberList;
}
void GroupDefImpl::setGroupTitle( const char *t )
{
- if ( t && qstrlen(t) )
+ if ( t && *t )
{
- title = t;
- titleSet = TRUE;
+ m_title = t;
+ m_titleSet = TRUE;
}
else
{
- title = name();
- title.at(0)=toupper(title.at(0));
- titleSet = FALSE;
+ m_title = name();
+ m_title[0]=(char)toupper(m_title[0]);
+ m_titleSet = FALSE;
}
}
void GroupDefImpl::distributeMemberGroupDocumentation()
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ for (const auto &mg : m_memberGroups)
{
mg->distributeMemberGroupDocumentation();
}
@@ -236,17 +216,15 @@ void GroupDefImpl::distributeMemberGroupDocumentation()
void GroupDefImpl::findSectionsInDocumentation()
{
+ docFindSections(briefDescription(),this,docFile());
docFindSections(documentation(),this,docFile());
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+
+ for (const auto &mg : m_memberGroups)
{
mg->findSectionsInDocumentation(this);
}
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_declarationLists)
{
@@ -261,54 +239,19 @@ void GroupDefImpl::addFile(const FileDef *def)
if (def->isHidden()) return;
updateLanguage(def);
if (sortBriefDocs)
- fileList->inSort(def);
+ m_fileList->inSort(def);
else
- fileList->append(def);
+ m_fileList->append(def);
}
bool GroupDefImpl::addClass(const ClassDef *cd)
{
- static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
if (cd->isHidden()) return FALSE;
updateLanguage(cd);
QCString qn = cd->name();
- if (classSDict->find(qn)==0)
+ if (m_classes.find(qn)==0)
{
- //printf("--- addClass %s sort=%d\n",qn.data(),sortBriefDocs);
- if (sortBriefDocs)
- {
- classSDict->inSort(qn,cd);
- }
- else
- {
- int i=qn.findRev("::");
- if (i==-1) i=qn.find('.');
- bool found=FALSE;
- //printf("i=%d\n",i);
- if (i>0)
- {
- // add nested classes (e.g. A::B, A::C) after their parent (A) in
- // order of insertion
- QCString scope = qn.left(i);
- int j=classSDict->findAt(scope);
- if (j!=-1)
- {
- while (j<(int)classSDict->count() &&
- classSDict->at(j)->qualifiedName().left(i)==scope)
- {
- //printf("skipping over %s\n",classSDict->at(j)->qualifiedName().data());
- j++;
- }
- //printf("Found scope at index %d\n",j);
- classSDict->insertAt(j,qn,cd);
- found=TRUE;
- }
- }
- if (!found) // no insertion point found -> just append
- {
- classSDict->append(qn,cd);
- }
- }
+ m_classes.add(qn,cd);
return TRUE;
}
return FALSE;
@@ -316,60 +259,49 @@ bool GroupDefImpl::addClass(const ClassDef *cd)
bool GroupDefImpl::addNamespace(const NamespaceDef *def)
{
- static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
- if (def->isHidden()) return FALSE;
- updateLanguage(def);
- if (namespaceSDict->find(def->name())==0)
+ if (def->isHidden()) return false;
+ if (m_namespaces.find(def->name())!=0)
{
- if (sortBriefDocs)
- namespaceSDict->inSort(def->name(),def);
- else
- namespaceSDict->append(def->name(),def);
- return TRUE;
+ updateLanguage(def);
+ m_namespaces.add(def->name(),def);
+ return true;
}
- return FALSE;
+ return false;
}
-void GroupDefImpl::addDir(const DirDef *def)
+void GroupDefImpl::addDir(DirDef *def)
{
if (def->isHidden()) return;
- if (Config_getBool(SORT_BRIEF_DOCS))
- dirList->inSort(def);
- else
- dirList->append(def);
+ m_dirList.push_back(def);
}
-void GroupDefImpl::addPage(PageDef *def)
+void GroupDefImpl::addPage(const PageDef *def)
{
if (def->isHidden()) return;
//printf("Making page %s part of a group\n",def->name.data());
- pageDict->append(def->name(),def);
- def->makePartOfGroup(this);
+ m_pages.add(def->name(),def);
+ const_cast<PageDef*>(def)->makePartOfGroup(this);
}
void GroupDefImpl::addExample(const PageDef *def)
{
if (def->isHidden()) return;
- exampleDict->append(def->name(),def);
+ m_examples.add(def->name(),def);
}
void GroupDefImpl::addMembersToMemberGroup()
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_declarationLists)
{
- ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
+ ::addMembersToMemberGroup(ml.get(),&m_memberGroups,this);
}
}
//printf("GroupDefImpl::addMembersToMemberGroup() memberGroupList=%d\n",memberGroupList->count());
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ for (const auto &mg : m_memberGroups)
{
mg->setInGroup(TRUE);
}
@@ -381,108 +313,98 @@ bool GroupDefImpl::insertMember(MemberDef *md,bool docOnly)
if (md->isHidden()) return FALSE;
updateLanguage(md);
//printf("GroupDef(%s)::insertMember(%s)\n", title.data(), md->name().data());
- MemberNameInfo *mni=0;
- if ((mni=(*allMemberNameInfoSDict)[md->name()]))
- { // member with this name already found
- MemberNameInfoIterator srcMnii(*mni);
- const MemberInfo *srcMi;
- for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
+ MemberNameInfo *mni = m_allMemberNameInfoLinkedMap.add(md->name());
+ for (auto &srcMi : *mni)
+ {
+ const MemberDef *srcMd = srcMi->memberDef();
+ if (srcMd==md) return FALSE; // already added before!
+
+ bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
+ // both inside a file => definition and declaration do not have to be in the same file
+ (srcMd->getOuterScope()->definitionType()==Definition::TypeFile &&
+ md->getOuterScope()->definitionType()==Definition::TypeFile);
+
+ const ArgumentList &srcMdAl = srcMd->argumentList();
+ const ArgumentList &mdAl = md->argumentList();
+ const ArgumentList &tSrcMdAl = srcMd->templateArguments();
+ const ArgumentList &tMdAl = md->templateArguments();
+
+ if (srcMd->isFunction() && md->isFunction() && // both are a function
+ (tSrcMdAl.size()==tMdAl.size()) && // same number of template arguments
+ matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),&srcMdAl,
+ md->getOuterScope(),md->getFileDef(),&mdAl,
+ TRUE
+ ) && // matching parameters
+ sameScope // both are found in the same scope
+ )
{
- const MemberDef *srcMd = srcMi->memberDef;
- if (srcMd==md) return FALSE; // already added before!
-
- bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
- // both inside a file => definition and declaration do not have to be in the same file
- (srcMd->getOuterScope()->definitionType()==Definition::TypeFile &&
- md->getOuterScope()->definitionType()==Definition::TypeFile);
-
- const ArgumentList &srcMdAl = srcMd->argumentList();
- const ArgumentList &mdAl = md->argumentList();
- const ArgumentList &tSrcMdAl = srcMd->templateArguments();
- const ArgumentList &tMdAl = md->templateArguments();
-
- if (srcMd->isFunction() && md->isFunction() && // both are a function
- (tSrcMdAl.size()==tMdAl.size()) && // same number of template arguments
- matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl,
- md->getOuterScope(),md->getFileDef(),mdAl,
- TRUE
- ) && // matching parameters
- sameScope // both are found in the same scope
- )
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm && srcMd->getGroupAlias()==0)
{
- if (srcMd->getGroupAlias()==0)
- {
- md->setGroupAlias(srcMd);
- }
- else if (md!=srcMd->getGroupAlias())
- {
- md->setGroupAlias(srcMd->getGroupAlias());
- }
- return FALSE; // member is the same as one that is already added
+ mdm->setGroupAlias(srcMd);
+ }
+ else if (mdm && md!=srcMd->getGroupAlias())
+ {
+ mdm->setGroupAlias(srcMd->getGroupAlias());
}
+ return FALSE; // member is the same as one that is already added
}
- mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
- }
- else
- {
- mni = new MemberNameInfo(md->name());
- mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
- allMemberNameInfoSDict->append(mni->memberName(),mni);
}
+ mni->push_back(std::make_unique<MemberInfo>(md,md->protection(),md->virtualness(),FALSE));
//printf("Added member!\n");
- allMemberList->append(md);
+ m_allMemberList->append(md);
switch(md->memberType())
{
- case MemberType_Variable:
+ case MemberType_Variable:
if (!docOnly)
{
addMemberToList(MemberListType_decVarMembers,md);
}
addMemberToList(MemberListType_docVarMembers,md);
break;
- case MemberType_Function:
+ case MemberType_Function:
if (!docOnly)
{
addMemberToList(MemberListType_decFuncMembers,md);
}
addMemberToList(MemberListType_docFuncMembers,md);
break;
- case MemberType_Typedef:
+ case MemberType_Typedef:
if (!docOnly)
{
addMemberToList(MemberListType_decTypedefMembers,md);
}
addMemberToList(MemberListType_docTypedefMembers,md);
break;
- case MemberType_Enumeration:
+ case MemberType_Enumeration:
if (!docOnly)
{
addMemberToList(MemberListType_decEnumMembers,md);
}
addMemberToList(MemberListType_docEnumMembers,md);
break;
- case MemberType_EnumValue:
+ case MemberType_EnumValue:
if (!docOnly)
{
addMemberToList(MemberListType_decEnumValMembers,md);
}
addMemberToList(MemberListType_docEnumValMembers,md);
break;
- case MemberType_Define:
+ case MemberType_Define:
if (!docOnly)
{
addMemberToList(MemberListType_decDefineMembers,md);
}
addMemberToList(MemberListType_docDefineMembers,md);
break;
- case MemberType_Signal:
+ case MemberType_Signal:
if (!docOnly)
{
addMemberToList(MemberListType_decSignalMembers,md);
}
addMemberToList(MemberListType_docSignalMembers,md);
break;
- case MemberType_Slot:
+ case MemberType_Slot:
if (md->protection()==Public)
{
if (!docOnly)
@@ -508,21 +430,21 @@ bool GroupDefImpl::insertMember(MemberDef *md,bool docOnly)
addMemberToList(MemberListType_docPriSlotMembers,md);
}
break;
- case MemberType_Event:
+ case MemberType_Event:
if (!docOnly)
{
addMemberToList(MemberListType_decEventMembers,md);
}
addMemberToList(MemberListType_docEventMembers,md);
break;
- case MemberType_Property:
+ case MemberType_Property:
if (!docOnly)
{
addMemberToList(MemberListType_decPropMembers,md);
}
addMemberToList(MemberListType_docPropMembers,md);
break;
- case MemberType_Friend:
+ case MemberType_Friend:
if (!docOnly)
{
addMemberToList(MemberListType_decFriendMembers,md);
@@ -542,23 +464,10 @@ bool GroupDefImpl::insertMember(MemberDef *md,bool docOnly)
void GroupDefImpl::removeMember(MemberDef *md)
{
// fprintf(stderr, "GroupDef(%s)::removeMember( %s )\n", title.data(), md->name().data());
- MemberNameInfo *mni = allMemberNameInfoSDict->find(md->name());
+ MemberNameInfo *mni = m_allMemberNameInfoLinkedMap.find(md->name());
if (mni)
{
- MemberNameInfoIterator mnii(*mni);
- while( mnii.current() )
- {
- if( mnii.current()->memberDef == md )
- {
- mni->remove(mnii.current());
- break;
- }
- ++mnii;
- }
- if( mni->isEmpty() )
- {
- allMemberNameInfoSDict->remove(md->name());
- }
+ m_allMemberNameInfoLinkedMap.del(md->name());
removeMemberFromList(MemberListType_allMembersList,md);
switch(md->memberType())
@@ -567,31 +476,31 @@ void GroupDefImpl::removeMember(MemberDef *md)
removeMemberFromList(MemberListType_decVarMembers,md);
removeMemberFromList(MemberListType_docVarMembers,md);
break;
- case MemberType_Function:
+ case MemberType_Function:
removeMemberFromList(MemberListType_decFuncMembers,md);
removeMemberFromList(MemberListType_docFuncMembers,md);
break;
- case MemberType_Typedef:
+ case MemberType_Typedef:
removeMemberFromList(MemberListType_decTypedefMembers,md);
removeMemberFromList(MemberListType_docTypedefMembers,md);
break;
- case MemberType_Enumeration:
+ case MemberType_Enumeration:
removeMemberFromList(MemberListType_decEnumMembers,md);
removeMemberFromList(MemberListType_docEnumMembers,md);
break;
- case MemberType_EnumValue:
+ case MemberType_EnumValue:
removeMemberFromList(MemberListType_decEnumValMembers,md);
removeMemberFromList(MemberListType_docEnumValMembers,md);
break;
- case MemberType_Define:
+ case MemberType_Define:
removeMemberFromList(MemberListType_decDefineMembers,md);
removeMemberFromList(MemberListType_docDefineMembers,md);
break;
- case MemberType_Signal:
+ case MemberType_Signal:
removeMemberFromList(MemberListType_decSignalMembers,md);
removeMemberFromList(MemberListType_docSignalMembers,md);
break;
- case MemberType_Slot:
+ case MemberType_Slot:
if (md->protection()==Public)
{
removeMemberFromList(MemberListType_decPubSlotMembers,md);
@@ -608,15 +517,15 @@ void GroupDefImpl::removeMember(MemberDef *md)
removeMemberFromList(MemberListType_docPriSlotMembers,md);
}
break;
- case MemberType_Event:
+ case MemberType_Event:
removeMemberFromList(MemberListType_decEventMembers,md);
removeMemberFromList(MemberListType_docEventMembers,md);
break;
- case MemberType_Property:
+ case MemberType_Property:
removeMemberFromList(MemberListType_decPropMembers,md);
removeMemberFromList(MemberListType_docPropMembers,md);
break;
- case MemberType_Friend:
+ case MemberType_Friend:
removeMemberFromList(MemberListType_decFriendMembers,md);
removeMemberFromList(MemberListType_docFriendMembers,md);
break;
@@ -632,16 +541,11 @@ bool GroupDefImpl::findGroup(const GroupDef *def) const
{
return TRUE;
}
- else if (groupList)
+ for (const auto &gd : m_groups)
{
- GroupListIterator it(*groupList);
- GroupDef *gd;
- for (;(gd=it.current());++it)
+ if (gd->findGroup(def))
{
- if (gd->findGroup(def))
- {
- return TRUE;
- }
+ return TRUE;
}
}
return FALSE;
@@ -653,59 +557,51 @@ void GroupDefImpl::addGroup(const GroupDef *def)
//if (Config_getBool(SORT_MEMBER_DOCS))
// groupList->inSort(def);
//else
- groupList->append(def);
+ m_groups.push_back(def);
}
bool GroupDefImpl::isASubGroup() const
{
- GroupList *groups = partOfGroups();
- return groups!=0 && groups->count()!=0;
+ return !partOfGroups().empty();
}
void GroupDefImpl::countMembers()
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (;(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
ml->countDecMembers();
ml->countDocMembers();
}
- if (memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->countDecMembers();
- mg->countDocMembers();
- }
+ mg->countDecMembers();
+ mg->countDocMembers();
}
}
-int GroupDefImpl::numDocMembers() const
+size_t GroupDefImpl::numDocMembers() const
{
- return fileList->count()+
- classSDict->count()+
- namespaceSDict->count()+
- groupList->count()+
- allMemberList->count()+
- pageDict->count()+
- exampleDict->count();
+ return m_fileList->count()+
+ m_classes.size()+
+ m_namespaces.size()+
+ m_groups.size()+
+ m_allMemberList->count()+
+ m_pages.size()+
+ m_examples.size();
}
-/*! Compute the HTML anchor names for all members in the group */
+/*! Compute the HTML anchor names for all members in the group */
void GroupDefImpl::computeAnchors()
{
//printf("GroupDefImpl::computeAnchors()\n");
- setAnchors(allMemberList);
+ m_allMemberList->setAnchors();
}
void GroupDefImpl::writeTagFile(FTextStream &tagFile)
{
tagFile << " <compound kind=\"group\">" << endl;
tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
- tagFile << " <title>" << convertToXML(title) << "</title>" << endl;
+ tagFile << " <title>" << convertToXML(m_title) << "</title>" << endl;
tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
QListIterator<LayoutDocEntry> eli(
LayoutDocManager::instance().docEntries(LayoutDocManager::Group));
@@ -716,43 +612,33 @@ void GroupDefImpl::writeTagFile(FTextStream &tagFile)
{
case LayoutDocEntry::GroupClasses:
{
- if (classSDict)
+ for (const auto &cd : m_classes)
{
- SDict<ClassDef>::Iterator ci(*classSDict);
- ClassDef *cd;
- for (ci.toFirst();(cd=ci.current());++ci)
+ if (cd->isLinkableInProject())
{
- if (cd->isLinkableInProject())
- {
- tagFile << " <class kind=\"" << cd->compoundTypeString()
- << "\">" << convertToXML(cd->name()) << "</class>" << endl;
- }
+ tagFile << " <class kind=\"" << cd->compoundTypeString()
+ << "\">" << convertToXML(cd->name()) << "</class>" << endl;
}
}
}
break;
case LayoutDocEntry::GroupNamespaces:
{
- if (namespaceSDict)
+ for (const auto &nd : m_namespaces)
{
- SDict<NamespaceDef>::Iterator ni(*namespaceSDict);
- NamespaceDef *nd;
- for (ni.toFirst();(nd=ni.current());++ni)
+ if (nd->isLinkableInProject())
{
- if (nd->isLinkableInProject())
- {
- tagFile << " <namespace>" << convertToXML(nd->name())
- << "</namespace>" << endl;
- }
+ tagFile << " <namespace>" << convertToXML(nd->name())
+ << "</namespace>" << endl;
}
}
}
break;
case LayoutDocEntry::GroupFiles:
{
- if (fileList)
+ if (m_fileList)
{
- QListIterator<FileDef> it(*fileList);
+ QListIterator<FileDef> it(*m_fileList);
FileDef *fd;
for (;(fd=it.current());++it)
{
@@ -766,49 +652,34 @@ void GroupDefImpl::writeTagFile(FTextStream &tagFile)
break;
case LayoutDocEntry::GroupPageDocs:
{
- if (pageDict)
+ for (const auto &pd : m_pages)
{
- PageSDict::Iterator pdi(*pageDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ QCString pageName = pd->getOutputFileBase();
+ if (pd->isLinkableInProject())
{
- QCString pageName = pd->getOutputFileBase();
- if (pd->isLinkableInProject())
- {
- tagFile << " <page>" << convertToXML(pageName) << "</page>" << endl;
- }
+ tagFile << " <page>" << convertToXML(pageName) << "</page>" << endl;
}
}
}
break;
case LayoutDocEntry::GroupDirs:
{
- if (dirList)
+ for (const auto &dd : m_dirList)
{
- QListIterator<DirDef> it(*dirList);
- DirDef *dd;
- for (;(dd=it.current());++it)
+ if (dd->isLinkableInProject())
{
- if (dd->isLinkableInProject())
- {
- tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
- }
+ tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
}
}
}
break;
case LayoutDocEntry::GroupNestedGroups:
{
- if (groupList)
+ for (const auto &gd : m_groups)
{
- QListIterator<GroupDef> it(*groupList);
- GroupDef *gd;
- for (;(gd=it.current());++it)
+ if (gd->isVisible())
{
- if (gd->isVisible())
- {
- tagFile << " <subgroup>" << convertToXML(gd->name()) << "</subgroup>" << endl;
- }
+ tagFile << " <subgroup>" << convertToXML(gd->name()) << "</subgroup>" << endl;
}
}
}
@@ -825,14 +696,9 @@ void GroupDefImpl::writeTagFile(FTextStream &tagFile)
break;
case LayoutDocEntry::MemberGroups:
{
- if (memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeTagFile(tagFile);
- }
+ mg->writeTagFile(tagFile);
}
}
break;
@@ -846,12 +712,12 @@ void GroupDefImpl::writeTagFile(FTextStream &tagFile)
void GroupDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title)
{
- if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
+ if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
|| !documentation().isEmpty() || !inbodyDocumentation().isEmpty()
)
{
ol.pushGeneratorState();
- if (pageDict->count()!=numDocMembers()) // not only pages -> classical layout
+ if (m_pages.size()!=numDocMembers()) // not only pages -> classical layout
{
ol.pushGeneratorState();
ol.disable(OutputGenerator::Html);
@@ -874,7 +740,8 @@ void GroupDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title
// repeat brief description
if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
{
- ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
// write separator between brief and details
if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
@@ -894,13 +761,15 @@ void GroupDefImpl::writeDetailedDescription(OutputList &ol,const QCString &title
// write detailed documentation
if (!documentation().isEmpty())
{
- ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
// write inbody documentation
if (!inbodyDocumentation().isEmpty())
{
- ol.generateDoc(inbodyFile(),inbodyLine(),this,0,inbodyDocumentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(inbodyFile(),inbodyLine(),this,0,inbodyDocumentation()+"\n",TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
}
}
@@ -910,7 +779,8 @@ void GroupDefImpl::writeBriefDescription(OutputList &ol)
if (hasBriefDescription())
{
DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
- briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ briefDescription(),TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
if (rootNode && !rootNode->isEmpty())
{
ol.startParagraph();
@@ -924,9 +794,7 @@ void GroupDefImpl::writeBriefDescription(OutputList &ol)
ol.writeString(" \n");
ol.enable(OutputGenerator::RTF);
- if (Config_getBool(REPEAT_BRIEF) ||
- !documentation().isEmpty()
- )
+ if (hasDetailedDescription())
{
ol.disableAllBut(OutputGenerator::Html);
ol.startTextLink(0,"details");
@@ -953,7 +821,7 @@ void GroupDefImpl::writeGroupGraph(OutputList &ol)
ol.disable(OutputGenerator::Man);
//ol.startParagraph();
ol.startGroupCollaboration();
- ol.parseText(theTranslator->trCollaborationDiagram(title));
+ ol.parseText(theTranslator->trCollaborationDiagram(m_title));
ol.endGroupCollaboration(graph);
//ol.endParagraph();
ol.popGeneratorState();
@@ -964,13 +832,13 @@ void GroupDefImpl::writeGroupGraph(OutputList &ol)
void GroupDefImpl::writeFiles(OutputList &ol,const QCString &title)
{
// write list of files
- if (fileList->count()>0)
+ if (m_fileList->count()>0)
{
ol.startMemberHeader("files");
ol.parseText(title);
ol.endMemberHeader();
ol.startMemberList();
- QListIterator<FileDef> it(*fileList);
+ QListIterator<FileDef> it(*m_fileList);
FileDef *fd;
for (;(fd=it.current());++it)
{
@@ -984,7 +852,8 @@ void GroupDefImpl::writeFiles(OutputList &ol,const QCString &title)
if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
{
ol.startMemberDescription(fd->getOutputFileBase());
- ol.generateDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
@@ -996,21 +865,16 @@ void GroupDefImpl::writeFiles(OutputList &ol,const QCString &title)
void GroupDefImpl::writeNamespaces(OutputList &ol,const QCString &title)
{
// write list of namespaces
- namespaceSDict->writeDeclaration(ol,title);
+ m_namespaces.writeDeclaration(ol,title);
}
void GroupDefImpl::writeNestedGroups(OutputList &ol,const QCString &title)
{
// write list of groups
int count=0;
- if (groupList->count()>0)
+ for (const auto &gd : m_groups)
{
- QListIterator<GroupDef> it(*groupList);
- GroupDef *gd;
- for (;(gd=it.current());++it)
- {
- if (gd->isVisible()) count++;
- }
+ if (gd->isVisible()) count++;
}
if (count>0)
{
@@ -1018,13 +882,7 @@ void GroupDefImpl::writeNestedGroups(OutputList &ol,const QCString &title)
ol.parseText(title);
ol.endMemberHeader();
ol.startMemberList();
- if (Config_getBool(SORT_GROUP_NAMES))
- {
- groupList->sort();
- }
- QListIterator<GroupDef> it(*groupList);
- GroupDef *gd;
- for (;(gd=it.current());++it)
+ for (const auto &gd : m_groups)
{
if (gd->isVisible())
{
@@ -1039,7 +897,8 @@ void GroupDefImpl::writeNestedGroups(OutputList &ol,const QCString &title)
if (!gd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
{
ol.startMemberDescription(gd->getOutputFileBase());
- ol.generateDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
@@ -1052,15 +911,13 @@ void GroupDefImpl::writeNestedGroups(OutputList &ol,const QCString &title)
void GroupDefImpl::writeDirs(OutputList &ol,const QCString &title)
{
// write list of directories
- if (dirList->count()>0)
+ if (!m_dirList.empty())
{
ol.startMemberHeader("dirs");
ol.parseText(title);
ol.endMemberHeader();
ol.startMemberList();
- QListIterator<DirDef> it(*dirList);
- DirDef *dd;
- for (;(dd=it.current());++it)
+ for(const auto dd : m_dirList)
{
if (!dd->hasDocumentation()) continue;
ol.startMemberDeclaration();
@@ -1072,7 +929,8 @@ void GroupDefImpl::writeDirs(OutputList &ol,const QCString &title)
if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
{
ol.startMemberDescription(dd->getOutputFileBase());
- ol.generateDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
@@ -1085,32 +943,31 @@ void GroupDefImpl::writeDirs(OutputList &ol,const QCString &title)
void GroupDefImpl::writeClasses(OutputList &ol,const QCString &title)
{
// write list of classes
- classSDict->writeDeclaration(ol,0,title,FALSE);
+ m_classes.writeDeclaration(ol,0,title,FALSE);
}
void GroupDefImpl::writeInlineClasses(OutputList &ol)
{
- classSDict->writeDocumentation(ol);
+ m_classes.writeDocumentation(ol);
}
void GroupDefImpl::writePageDocumentation(OutputList &ol)
{
- PageDef *pd=0;
- PageSDict::Iterator pdi(*pageDict);
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto *pd : m_pages)
{
if (!pd->isReference())
{
- SectionInfo *si=0;
+ const SectionInfo *si=0;
if (pd->hasTitle() && !pd->name().isEmpty() &&
- (si=Doxygen::sectionDict->find(pd->name()))!=0)
+ (si=SectionManager::instance().find(pd->name()))!=0)
{
- ol.startSection(si->label,si->title,SectionInfo::Subsection);
- ol.docify(si->title);
- ol.endSection(si->label,SectionInfo::Subsection);
+ ol.startSection(si->label(),si->title(),SectionType::Subsection);
+ ol.docify(si->title());
+ ol.endSection(si->label(),SectionType::Subsection);
}
ol.startTextBlock();
- ol.generateDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endTextBlock();
}
}
@@ -1119,16 +976,9 @@ void GroupDefImpl::writePageDocumentation(OutputList &ol)
void GroupDefImpl::writeMemberGroups(OutputList &ol)
{
/* write user defined member groups */
- if (memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- memberGroupSDict->sort();
- /* write user defined member groups */
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeDeclarations(ol,0,0,0,this);
- }
+ mg->writeDeclarations(ol,0,0,0,this);
}
}
@@ -1186,15 +1036,15 @@ void GroupDefImpl::writeSummaryLinks(OutputList &ol) const
SrcLangExt lang = getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if ((lde->kind()==LayoutDocEntry::GroupClasses && classSDict->declVisible()) ||
- (lde->kind()==LayoutDocEntry::GroupNamespaces && namespaceSDict->declVisible()) ||
- (lde->kind()==LayoutDocEntry::GroupFiles && fileList->count()>0) ||
- (lde->kind()==LayoutDocEntry::GroupNestedGroups && groupList->count()>0) ||
- (lde->kind()==LayoutDocEntry::GroupDirs && dirList->count()>0)
+ if ((lde->kind()==LayoutDocEntry::GroupClasses && m_classes.declVisible()) ||
+ (lde->kind()==LayoutDocEntry::GroupNamespaces && m_namespaces.declVisible()) ||
+ (lde->kind()==LayoutDocEntry::GroupFiles && m_fileList->count()>0) ||
+ (lde->kind()==LayoutDocEntry::GroupNestedGroups && !m_groups.empty()) ||
+ (lde->kind()==LayoutDocEntry::GroupDirs && !m_dirList.empty())
)
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
+ QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
lde->kind()==LayoutDocEntry::GroupNamespaces ? "namespaces" :
lde->kind()==LayoutDocEntry::GroupFiles ? "files" :
lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups" :
@@ -1224,23 +1074,28 @@ void GroupDefImpl::writeDocumentation(OutputList &ol)
{
//static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
ol.pushGeneratorState();
- startFile(ol,getOutputFileBase(),name(),title,HLI_Modules);
+ startFile(ol,getOutputFileBase(),name(),m_title,HLI_Modules);
ol.startHeaderSection();
writeSummaryLinks(ol);
ol.startTitleHead(getOutputFileBase());
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
- ol.parseText(title);
+ ol.parseText(m_title);
ol.popGeneratorState();
addGroupListToTitle(ol,this);
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
- ol.endTitleHead(getOutputFileBase(),title);
+ ol.endTitleHead(getOutputFileBase(),m_title);
ol.popGeneratorState();
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Man);
ol.endTitleHead(getOutputFileBase(),name());
+ if (!m_title.isEmpty())
+ {
+ ol.writeString(" - ");
+ ol.parseText(m_title);
+ }
ol.popGeneratorState();
ol.endHeaderSection();
ol.startContents();
@@ -1250,14 +1105,14 @@ void GroupDefImpl::writeDocumentation(OutputList &ol)
Doxygen::searchIndex->setCurrentDoc(this,anchor(),FALSE);
static QRegExp we("[a-zA-Z_][-a-zA-Z_0-9]*");
int i=0,p=0,l=0;
- while ((i=we.match(title,p,&l))!=-1) // foreach word in the title
+ while ((i=we.match(m_title,p,&l))!=-1) // foreach word in the title
{
- Doxygen::searchIndex->addWord(title.mid(i,l),TRUE);
+ Doxygen::searchIndex->addWord(m_title.mid(i,l),TRUE);
p=i+l;
}
}
- Doxygen::indexList->addIndexItem(this,0,0,title);
+ Doxygen::indexList->addIndexItem(this,0,0,m_title);
//---------------------------------------- start flexible part -------------------------------
@@ -1269,84 +1124,84 @@ void GroupDefImpl::writeDocumentation(OutputList &ol)
{
switch (lde->kind())
{
- case LayoutDocEntry::BriefDesc:
+ case LayoutDocEntry::BriefDesc:
writeBriefDescription(ol);
- break;
- case LayoutDocEntry::MemberDeclStart:
+ break;
+ case LayoutDocEntry::MemberDeclStart:
startMemberDeclarations(ol);
- break;
- case LayoutDocEntry::GroupClasses:
+ break;
+ case LayoutDocEntry::GroupClasses:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeClasses(ol,ls->title(lang));
}
- break;
- case LayoutDocEntry::GroupInlineClasses:
+ break;
+ case LayoutDocEntry::GroupInlineClasses:
{
writeInlineClasses(ol);
}
break;
- case LayoutDocEntry::GroupNamespaces:
+ case LayoutDocEntry::GroupNamespaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeNamespaces(ol,ls->title(lang));
}
- break;
- case LayoutDocEntry::MemberGroups:
+ break;
+ case LayoutDocEntry::MemberGroups:
writeMemberGroups(ol);
- break;
- case LayoutDocEntry::MemberDecl:
+ break;
+ case LayoutDocEntry::MemberDecl:
{
LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
}
- break;
- case LayoutDocEntry::MemberDeclEnd:
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
endMemberDeclarations(ol);
break;
- case LayoutDocEntry::DetailedDesc:
+ case LayoutDocEntry::DetailedDesc:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeDetailedDescription(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::MemberDefStart:
+ case LayoutDocEntry::MemberDefStart:
startMemberDocumentation(ol);
- break;
- case LayoutDocEntry::MemberDef:
+ break;
+ case LayoutDocEntry::MemberDef:
{
LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
}
break;
- case LayoutDocEntry::MemberDefEnd:
+ case LayoutDocEntry::MemberDefEnd:
endMemberDocumentation(ol);
break;
- case LayoutDocEntry::GroupNestedGroups:
+ case LayoutDocEntry::GroupNestedGroups:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeNestedGroups(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::GroupPageDocs:
+ case LayoutDocEntry::GroupPageDocs:
writePageDocumentation(ol);
break;
- case LayoutDocEntry::GroupDirs:
+ case LayoutDocEntry::GroupDirs:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeDirs(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::GroupFiles:
+ case LayoutDocEntry::GroupFiles:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeFiles(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::GroupGraph:
+ case LayoutDocEntry::GroupGraph:
writeGroupGraph(ol);
break;
- case LayoutDocEntry::AuthorSection:
+ case LayoutDocEntry::AuthorSection:
writeAuthorSection(ol);
break;
case LayoutDocEntry::ClassIncludes:
@@ -1371,7 +1226,7 @@ void GroupDefImpl::writeDocumentation(OutputList &ol)
case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
case LayoutDocEntry::FileIncludeGraph:
- case LayoutDocEntry::FileIncludedByGraph:
+ case LayoutDocEntry::FileIncludedByGraph:
case LayoutDocEntry::FileSourceLink:
case LayoutDocEntry::FileInlineClasses:
case LayoutDocEntry::DirSubDirs:
@@ -1385,13 +1240,13 @@ void GroupDefImpl::writeDocumentation(OutputList &ol)
//---------------------------------------- end flexible part -------------------------------
- endFile(ol);
+ endFile(ol);
ol.popGeneratorState();
if (Config_getBool(SEPARATE_MEMBER_PAGES))
{
- allMemberList->sort();
+ m_allMemberList->sort();
writeMemberPages(ol);
}
@@ -1401,10 +1256,8 @@ void GroupDefImpl::writeMemberPages(OutputList &ol)
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
-
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+
+ for (const auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_documentationLists)
{
@@ -1422,34 +1275,33 @@ void GroupDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *current
ol.writeString(" <div class=\"navtab\">\n");
ol.writeString(" <table>\n");
- MemberListIterator mli(*allMemberList);
+ MemberListIterator mli(*m_allMemberList);
MemberDef *md;
for (mli.toFirst();(md=mli.current());++mli)
{
if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
{
- ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
{
if (md==currentMd) // selected item => highlight
{
- ol.writeString("<a class=\"qindexHL\" ");
+ ol.writeString(" <tr><td class=\"navtabHL\">");
}
else
{
- ol.writeString("<a class=\"qindex\" ");
+ ol.writeString(" <tr><td class=\"navtab\">");
}
+ ol.writeString("<a class=\"navtab\" ");
ol.writeString("href=\"");
if (createSubDirs) ol.writeString("../../");
ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
ol.writeString("\">");
ol.writeString(convertToHtml(md->localName()));
ol.writeString("</a>");
+ ol.writeString("</td></tr>\n");
}
- ol.writeString("</td></tr>\n");
}
}
-
ol.writeString(" </table>\n");
ol.writeString(" </div>\n");
}
@@ -1462,12 +1314,13 @@ void addClassToGroups(const Entry *root,ClassDef *cd)
{
for (const Grouping &g : root->groups)
{
- GroupDef *gd=0;
- if (!g.groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g.groupname)))
+ GroupDef *gd = Doxygen::groupLinkedMap->find(g.groupname);
+ if (gd && gd->addClass(cd))
{
- if (gd->addClass(cd))
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm)
{
- cd->makePartOfGroup(gd);
+ cdm->makePartOfGroup(gd);
}
//printf("Compound %s: in group %s\n",cd->name().data(),gd->groupTitle());
}
@@ -1479,11 +1332,15 @@ void addNamespaceToGroups(const Entry *root,NamespaceDef *nd)
//printf("root->groups.size()=%d\n",root->groups.size());
for (const Grouping &g : root->groups)
{
- GroupDef *gd=0;
+ GroupDef *gd = Doxygen::groupLinkedMap->find(g.groupname);
//printf("group '%s'\n",s->data());
- if (!g.groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g.groupname)))
+ if (gd && gd->addNamespace(nd))
{
- if (gd->addNamespace(nd)) nd->makePartOfGroup(gd);
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd);
+ if (ndm)
+ {
+ ndm->makePartOfGroup(gd);
+ }
//printf("Namespace %s: in group %s\n",nd->name().data(),s->data());
}
}
@@ -1494,9 +1351,9 @@ void addDirToGroups(const Entry *root,DirDef *dd)
//printf("*** root->groups.size()=%d\n",root->groups.size());
for (const Grouping &g : root->groups)
{
- GroupDef *gd=0;
+ GroupDef *gd = Doxygen::groupLinkedMap->find(g.groupname);
//printf("group '%s'\n",g->groupname.data());
- if (!g.groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g.groupname)))
+ if (gd)
{
gd->addDir(dd);
dd->makePartOfGroup(gd);
@@ -1510,8 +1367,8 @@ void addGroupToGroups(const Entry *root,GroupDef *subGroup)
//printf("addGroupToGroups for %s groups=%d\n",root->name.data(),root->groups.size());
for (const Grouping &g : root->groups)
{
- GroupDef *gd=0;
- if (!g.groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g.groupname)))
+ GroupDef *gd = Doxygen::groupLinkedMap->find(g.groupname);
+ if (gd)
{
if (gd==subGroup)
{
@@ -1535,7 +1392,7 @@ void addGroupToGroups(const Entry *root,GroupDef *subGroup)
/*! Add a member to the group with the highest priority */
void addMemberToGroups(const Entry *root,MemberDef *md)
{
- //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%d\n",
+ //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%d\n",
// root, root->name.data(), md, md->name().data(), root->groups->count() );
// Search entry's group list for group with highest pri.
@@ -1545,10 +1402,10 @@ void addMemberToGroups(const Entry *root,MemberDef *md)
{
GroupDef *gd=0;
if (!g.groupname.isEmpty() &&
- (gd=Doxygen::groupSDict->find(g.groupname)) &&
+ (gd=Doxygen::groupLinkedMap->find(g.groupname)) &&
g.pri >= pri)
{
- if (fgd && gd!=fgd && g.pri==pri)
+ if (fgd && gd!=fgd && g.pri==pri)
{
warn(root->fileName.data(), root->startLine,
"Member %s found in multiple %s groups! "
@@ -1578,7 +1435,7 @@ void addMemberToGroups(const Entry *root,MemberDef *md)
{
bool moveit = FALSE;
- // move member from one group to another if
+ // move member from one group to another if
// - the new one has a higher priority
// - the new entry has the same priority, but with docs where the old one had no docs
if (md->getGroupPri()<pri)
@@ -1623,13 +1480,16 @@ void addMemberToGroups(const Entry *root,MemberDef *md)
bool success = fgd->insertMember(md);
if (success)
{
- //printf("insertMember successful\n");
- md->setGroupDef(fgd,pri,root->fileName,root->startLine,
- !root->doc.isEmpty());
- ClassDef *cd = md->getClassDefOfAnonymousType();
- if (cd)
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm)
{
- cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
+ //printf("insertMember successful\n");
+ mdm->setGroupDef(fgd,pri,root->fileName,root->startLine,!root->doc.isEmpty());
+ ClassDefMutable *cdm = toClassDefMutable(mdm->getClassDefOfAnonymousType());
+ if (cdm)
+ {
+ cdm->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
+ }
}
}
}
@@ -1641,8 +1501,8 @@ void addExampleToGroups(const Entry *root,PageDef *eg)
{
for (const Grouping &g : root->groups)
{
- GroupDef *gd=0;
- if (!g.groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g.groupname)))
+ GroupDef *gd = Doxygen::groupLinkedMap->find(g.groupname);
+ if (gd)
{
gd->addExample(eg);
eg->makePartOfGroup(gd);
@@ -1653,13 +1513,13 @@ void addExampleToGroups(const Entry *root,PageDef *eg)
QCString GroupDefImpl::getOutputFileBase() const
{
- return fileName;
+ return m_fileName;
}
void GroupDefImpl::addListReferences()
{
{
- const std::vector<ListItemInfo> &xrefItems = xrefListItems();
+ const RefItemVector &xrefItems = xrefListItems();
addRefItem(xrefItems,
getOutputFileBase(),
theTranslator->trGroup(TRUE,TRUE),
@@ -1668,15 +1528,11 @@ void GroupDefImpl::addListReferences()
0
);
}
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ for (const auto &mg : m_memberGroups)
{
mg->addListReferences(this);
}
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_documentationLists)
{
@@ -1685,55 +1541,117 @@ void GroupDefImpl::addListReferences()
}
}
-MemberList *GroupDefImpl::createMemberList(MemberListType lt)
-{
- m_memberLists.setAutoDelete(TRUE);
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
- {
- if (ml->listType()==lt)
- {
- return ml;
- }
- }
- // not found, create a new member list
- ml = new MemberList(lt);
- m_memberLists.append(ml);
- ml->setInGroup(TRUE);
- return ml;
-}
-
void GroupDefImpl::addMemberToList(MemberListType lt,MemberDef *md)
{
static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
static bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
- MemberList *ml = createMemberList(lt);
+ const auto &ml = m_memberLists.get(lt);
+ ml->setInGroup(true);
ml->setNeedsSorting(
((ml->listType()&MemberListType_declarationLists) && sortBriefDocs) ||
((ml->listType()&MemberListType_documentationLists) && sortMemberDocs));
ml->append(md);
}
+// performs a partial reordering to group elements together with the same scope
+template<class Vec>
+static void groupClassesWithSameScope(Vec &vec)
+{
+ bool done=false;
+ while (!done) // for each iteration
+ {
+ done=true;
+ for (size_t i=0; i<vec.size(); i++) // go through all items
+ {
+ std::string qni = vec[i]->name().str();
+ size_t posi = qni.rfind("::");
+ if (posi!=std::string::npos)
+ {
+ std::string scope = qni.substr(0,posi);
+ auto it = std::find_if( vec.begin(), vec.end(),
+ [&](typename Vec::Ptr &cd)
+ { return cd->name().str()==scope; });
+ if (it!=vec.end())
+ {
+ size_t idx = std::distance(vec.begin(),it);
+ if (i<idx) // parent scope located after child scope
+ {
+ // to avoid reordering elements with the same parent
+ // we skip to the last one with the same scope
+ size_t k = idx;
+ while (k<vec.size() && vec[k]->name().str().substr(0,posi)==scope)
+ {
+ idx = k;
+ k++;
+ }
+ // swap the items such that i is inserted after idx
+ for (size_t j=i; j<idx; j++)
+ {
+ std::swap(vec[j],vec[j+1]);
+ }
+ done=false;
+ }
+ else if (idx<i && vec[i-1]->name().str().substr(0,posi)!=scope)
+ {
+ // parent scope is found before the item, and the item
+ // has some other item with a different scope in front of it
+ // move idx to the end of range with the same scope
+ while (idx<i && vec[idx]->name().str().substr(0,posi)==scope)
+ {
+ idx++;
+ }
+ // swap the items such that i is just after idx
+ for (size_t j=idx; j<i; j++)
+ {
+ std::swap(vec[j],vec[j+1]);
+ }
+ done=false;
+ }
+ }
+ }
+ }
+ }
+}
+
void GroupDefImpl::sortMemberLists()
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (;(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
}
+ if (Config_getBool(SORT_BRIEF_DOCS))
+ {
+ std::sort(m_dirList.begin(), m_dirList.end(), compareDirDefs);
+
+ auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
+ {
+ return Config_getBool(SORT_BY_SCOPE_NAME) ?
+ qstricmp(c1->name(), c2->name())<0 :
+ qstricmp(c1->className(), c2->className())<0;
+ };
+ std::sort(m_classes.begin(), m_classes.end(), classComp);
+
+ auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
+ {
+ return qstricmp(n1->name(),n2->name())<0;
+ };
+
+ std::sort(m_namespaces.begin(),m_namespaces.end(),namespaceComp);
+ }
+ else
+ {
+ groupClassesWithSameScope(m_classes);
+ groupClassesWithSameScope(m_namespaces);
+ }
}
MemberList *GroupDefImpl::getMemberList(MemberListType lt) const
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (;(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()==lt)
{
- return ml;
+ return ml.get();
}
}
return 0;
@@ -1744,12 +1662,12 @@ void GroupDefImpl::writeMemberDeclarations(OutputList &ol,MemberListType lt,cons
static bool optimizeVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
MemberList * ml = getMemberList(lt);
- if (optimizeVhdl && ml)
+ if (optimizeVhdl && ml)
{
VhdlDocGen::writeVhdlDeclarations(ml,ol,this,0,0,0);
return;
}
- if (ml)
+ if (ml)
{
ml->writeDeclarations(ol,0,0,0,this,title,0);
}
@@ -1763,13 +1681,16 @@ void GroupDefImpl::writeMemberDocumentation(OutputList &ol,MemberListType lt,con
void GroupDefImpl::removeMemberFromList(MemberListType lt,MemberDef *md)
{
- MemberList *ml = getMemberList(lt);
- if (ml) ml->remove(md);
+ MemberList *ml = getMemberList(lt);
+ if (ml) ml->remove(md);
}
-void GroupDefImpl::sortSubGroups()
-{
- groupList->sort();
+void GroupDefImpl::sortSubGroups()
+{
+ std::sort(m_groups.begin(),
+ m_groups.end(),
+ [](const auto &g1,const auto &g2)
+ { return qstrcmp(g1->groupTitle(),g2->groupTitle())<0; });
}
bool GroupDefImpl::isLinkableInProject() const
@@ -1796,6 +1717,37 @@ bool GroupDefImpl::hasDetailedDescription() const
{
static bool repeatBrief = Config_getBool(REPEAT_BRIEF);
return ((!briefDescription().isEmpty() && repeatBrief) ||
- !documentation().isEmpty());
+ !documentation().isEmpty() ||
+ !inbodyDocumentation().isEmpty()) &&
+ (m_pages.size()!=numDocMembers());
+}
+
+// --- Cast functions
+
+GroupDef *toGroupDef(Definition *d)
+{
+ if (d==0) return 0;
+ if (d && typeid(*d)==typeid(GroupDefImpl))
+ {
+ return static_cast<GroupDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
}
+const GroupDef *toGroupDef(const Definition *d)
+{
+ if (d==0) return 0;
+ if (d && typeid(*d)==typeid(GroupDefImpl))
+ {
+ return static_cast<const GroupDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
diff --git a/src/groupdef.h b/src/groupdef.h
index 8a84a98..624a680 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -22,29 +22,32 @@
#include "sortdict.h"
#include "definition.h"
+#include "dirdef.h"
+#include "layout.h"
+#include "membergroup.h"
+#include "linkedmap.h"
class MemberList;
+class MemberLists;
class FileList;
-class ClassSDict;
+class ClassLinkedRefMap;
+class NamespaceLinkedRefMap;
class FileDef;
class ClassDef;
class NamespaceDef;
class GroupList;
class OutputList;
class NamespaceSDict;
-class MemberGroupSDict;
-class MemberNameInfoSDict;
-class PageSDict;
+class PageLinkedRefMap;
class PageDef;
class DirDef;
-class DirList;
class FTVHelp;
class Entry;
class MemberDef;
class FTextStream;
/** A model of a group of symbols. */
-class GroupDef : virtual public Definition
+class GroupDef : public DefinitionMutable, public Definition
{
public:
~GroupDef() {}
@@ -60,9 +63,9 @@ class GroupDef : virtual public Definition
virtual bool addClass(const ClassDef *def) = 0;
virtual bool addNamespace(const NamespaceDef *def) = 0;
virtual void addGroup(const GroupDef *def) = 0;
- virtual void addPage(PageDef *def) = 0;
+ virtual void addPage(const PageDef *def) = 0;
virtual void addExample(const PageDef *def) = 0;
- virtual void addDir(const DirDef *dd) = 0;
+ virtual void addDir(DirDef *dd) = 0;
virtual bool insertMember(MemberDef *def,bool docOnly=FALSE) = 0;
virtual void removeMember(MemberDef *md) = 0;
virtual bool findGroup(const GroupDef *def) const = 0;
@@ -70,7 +73,7 @@ class GroupDef : virtual public Definition
virtual void writeMemberPages(OutputList &ol) = 0;
virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const = 0;
virtual void writeTagFile(FTextStream &) = 0;
- virtual int numDocMembers() const = 0;
+ virtual size_t numDocMembers() const = 0;
virtual bool isLinkableInProject() const = 0;
virtual bool isLinkable() const = 0;
virtual bool isASubGroup() const = 0;
@@ -89,18 +92,18 @@ class GroupDef : virtual public Definition
virtual Definition *getGroupScope() const = 0;
virtual MemberList *getMemberList(MemberListType lt) const = 0;
- virtual const QList<MemberList> &getMemberLists() const = 0;
+ virtual const MemberLists &getMemberLists() const = 0;
/* user defined member groups */
- virtual MemberGroupSDict *getMemberGroupSDict() const = 0;
+ virtual const MemberGroupList &getMemberGroups() const = 0;
virtual FileList * getFiles() const = 0;
- virtual ClassSDict * getClasses() const = 0;
- virtual NamespaceSDict * getNamespaces() const = 0;
- virtual GroupList * getSubGroups() const = 0;
- virtual PageSDict * getPages() const = 0;
- virtual DirList * getDirs() const = 0;
- virtual PageSDict * getExamples() const = 0;
+ virtual const ClassLinkedRefMap &getClasses() const = 0;
+ virtual const NamespaceLinkedRefMap &getNamespaces() const = 0;
+ virtual const GroupList &getSubGroups() const = 0;
+ virtual const PageLinkedRefMap &getPages() const = 0;
+ virtual const DirList & getDirs() const = 0;
+ virtual const PageLinkedRefMap &getExamples() const = 0;
virtual bool hasDetailedDescription() const = 0;
virtual void sortSubGroups() = 0;
@@ -109,35 +112,19 @@ class GroupDef : virtual public Definition
GroupDef *createGroupDef(const char *fileName,int line,const char *name,
const char *title,const char *refFileName=0);
-/** A sorted dictionary of GroupDef objects. */
-class GroupSDict : public SDict<GroupDef>
-{
- public:
- GroupSDict(uint size) : SDict<GroupDef>(size) {}
- virtual ~GroupSDict() {}
- private:
- int compareValues(const GroupDef *item1,const GroupDef *item2) const
- {
- return qstrcmp(item1->groupTitle(),item2->groupTitle());
- }
-};
+// --- Cast functions
-/** A list of GroupDef objects. */
-class GroupList : public QList<GroupDef>
+GroupDef *toGroupDef(Definition *d);
+const GroupDef *toGroupDef(const Definition *d);
+
+// ------------------
+
+class GroupLinkedMap : public LinkedMap<GroupDef>
{
- public:
- int compareValues(const GroupDef *item1,const GroupDef *item2) const
- {
- return qstrcmp(item1->groupTitle(),item2->groupTitle());
- }
};
-/** An iterator for GroupDef objects in a GroupList. */
-class GroupListIterator : public QListIterator<GroupDef>
+class GroupList : public std::vector<const GroupDef *>
{
- public:
- GroupListIterator(const GroupList &l) : QListIterator<GroupDef>(l) {}
- virtual ~GroupListIterator() {}
};
void addClassToGroups (const Entry *root,ClassDef *cd);
diff --git a/src/growbuf.h b/src/growbuf.h
index bf6d74e..2f8075b 100644
--- a/src/growbuf.h
+++ b/src/growbuf.h
@@ -10,49 +10,50 @@
class GrowBuf
{
public:
- GrowBuf() : str(0), pos(0), len(0) {}
- GrowBuf(int initialSize) : pos(0), len(initialSize) { str=(char*)malloc(len); }
- ~GrowBuf() { free(str); str=0; pos=0; len=0; }
- void clear() { pos=0; }
- void addChar(char c) { if (pos>=len) { len+=GROW_AMOUNT; str = (char*)realloc(str,len); }
- str[pos++]=c;
+ GrowBuf() : m_str(0), m_pos(0), m_len(0) {}
+ GrowBuf(uint initialSize) : m_pos(0), m_len(initialSize) { m_str=(char*)malloc(m_len); }
+ ~GrowBuf() { free(m_str); }
+ void reserve(uint size) { if (m_len<size) { m_len = size; m_str = (char*)realloc(m_str,m_len); } }
+ void clear() { m_pos=0; }
+ void addChar(char c) { if (m_pos>=m_len) { m_len+=GROW_AMOUNT; m_str = (char*)realloc(m_str,m_len); }
+ m_str[m_pos++]=c;
}
void addStr(const QCString &s) {
if (!s.isEmpty())
{
- int l=s.length();
- if (pos+l>=len) { len+=l+GROW_AMOUNT; str = (char*)realloc(str,len); }
- strcpy(&str[pos],s.data());
- pos+=l;
+ uint l=s.length();
+ if (m_pos+l>=m_len) { m_len+=l+GROW_AMOUNT; m_str = (char*)realloc(m_str,m_len); }
+ strcpy(&m_str[m_pos],s.data());
+ m_pos+=l;
}
}
void addStr(const char *s) {
if (s)
{
- int l=strlen(s);
- if (pos+l>=len) { len+=l+GROW_AMOUNT; str = (char*)realloc(str,len); }
- strcpy(&str[pos],s);
- pos+=l;
+ uint l=(uint)strlen(s);
+ if (m_pos+l>=m_len) { m_len+=l+GROW_AMOUNT; m_str = (char*)realloc(m_str,m_len); }
+ strcpy(&m_str[m_pos],s);
+ m_pos+=l;
}
}
- void addStr(const char *s,int n) {
+ void addStr(const char *s,uint n) {
if (s)
{
- int l=strlen(s);
+ uint l=(uint)strlen(s);
if (n<l) l=n;
- if (pos+l>=len) { len+=l+GROW_AMOUNT; str = (char*)realloc(str,len); }
- strncpy(&str[pos],s,n);
- pos+=l;
+ if (m_pos+l>=m_len) { m_len+=l+GROW_AMOUNT; m_str = (char*)realloc(m_str,m_len); }
+ strncpy(&m_str[m_pos],s,n);
+ m_pos+=l;
}
}
- const char *get() { return str; }
- int getPos() const { return pos; }
- void setPos(const int newPos) { pos = newPos; }
- char at(int i) const { return str[i]; }
+ const char *get() { return m_str; }
+ uint getPos() const { return m_pos; }
+ void setPos(uint newPos) { m_pos = newPos; }
+ char at(uint i) const { return m_str[i]; }
private:
- char *str;
- int pos;
- int len;
+ char *m_str;
+ uint m_pos;
+ uint m_len;
};
#endif
diff --git a/src/htags.cpp b/src/htags.cpp
index 1a240b1..0c3a9af 100644
--- a/src/htags.cpp
+++ b/src/htags.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -36,25 +36,25 @@ static QDict<QCString> g_symbolDict(10007);
*/
bool Htags::execute(const QCString &htmldir)
{
- static QStrList &inputSource = Config_getList(INPUT);
- static bool quiet = Config_getBool(QUIET);
- static bool warnings = Config_getBool(WARNINGS);
- static QCString htagsOptions = ""; //Config_getString(HTAGS_OPTIONS);
- static QCString projectName = Config_getString(PROJECT_NAME);
- static QCString projectNumber = Config_getString(PROJECT_NUMBER);
+ const StringVector &inputSource = Config_getList(INPUT);
+ bool quiet = Config_getBool(QUIET);
+ bool warnings = Config_getBool(WARNINGS);
+ QCString htagsOptions = ""; //Config_getString(HTAGS_OPTIONS);
+ QCString projectName = Config_getString(PROJECT_NAME);
+ QCString projectNumber = Config_getString(PROJECT_NUMBER);
QCString cwd = QDir::currentDirPath().utf8();
- if (inputSource.isEmpty())
+ if (inputSource.empty())
{
g_inputDir.setPath(cwd);
}
- else if (inputSource.count()==1)
+ else if (inputSource.size()==1)
{
- g_inputDir.setPath(inputSource.first());
+ g_inputDir.setPath(inputSource.back().c_str());
if (!g_inputDir.exists())
err("Cannot find directory %s. "
"Check the value of the INPUT tag in the configuration file.\n",
- inputSource.first()
+ inputSource.back().c_str()
);
}
else
@@ -69,16 +69,16 @@ bool Htags::execute(const QCString &htmldir)
QCString commandLine = " -g -s -a -n ";
if (!quiet) commandLine += "-v ";
if (warnings) commandLine += "-w ";
- if (!htagsOptions.isEmpty())
+ if (!htagsOptions.isEmpty())
{
commandLine += ' ';
commandLine += htagsOptions;
}
- if (!projectName.isEmpty())
+ if (!projectName.isEmpty())
{
commandLine += "-t \"";
commandLine += projectName;
- if (!projectNumber.isEmpty())
+ if (!projectNumber.isEmpty())
{
commandLine += '-';
commandLine += projectNumber;
@@ -150,7 +150,7 @@ bool Htags::loadFilemap(const QCString &htmlDir)
}
else
{
- err("file %s cannot be opened\n",fileMapName.data());
+ err("file %s cannot be opened\n",fileMapName.data());
}
}
return FALSE;
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 424fead..b93a2c4 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -36,6 +33,7 @@
#include "htmlentity.h"
#include "emoji.h"
#include "plantuml.h"
+#include "formula.h"
static const int NUM_HTML_LIST_TYPES = 4;
static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
@@ -52,7 +50,7 @@ enum contexts_t
INTERDD, // 8
INTERTD // 9
};
-static const char *contexts[10] =
+static const char *contexts[10] =
{ "", // 0
"startli", // 1
"startdd", // 2
@@ -64,10 +62,10 @@ static const char *contexts[10] =
"interdd", // 8
"intertd" // 9
};
+static const char *hex="0123456789ABCDEF";
static QCString convertIndexWordToAnchor(const QCString &word)
{
- static char hex[] = "0123456789abcdef";
static int cnt = 0;
QCString result="a";
QCString cntStr;
@@ -180,6 +178,10 @@ static bool isDocIncludeVisible(DocInclude *s)
{
case DocInclude::DontInclude:
case DocInclude::LatexInclude:
+ case DocInclude::RtfInclude:
+ case DocInclude::ManInclude:
+ case DocInclude::XmlInclude:
+ case DocInclude::DocbookInclude:
return FALSE;
default:
return TRUE;
@@ -276,8 +278,8 @@ static QCString htmlAttribsToString(const HtmlAttribList &attribs, QCString *pAl
//-------------------------------------------------------------------------
HtmlDocVisitor::HtmlDocVisitor(FTextStream &t,CodeOutputInterface &ci,
- const Definition *ctx)
- : DocVisitor(DocVisitor_Html), m_t(t), m_ci(ci), m_insidePre(FALSE),
+ const Definition *ctx)
+ : DocVisitor(DocVisitor_Html), m_t(t), m_ci(ci), m_insidePre(FALSE),
m_hide(FALSE), m_ctx(ctx)
{
if (ctx) m_langExt=ctx->getDefFileExtension();
@@ -336,7 +338,7 @@ void HtmlDocVisitor::visit(DocEmoji *s)
const char *res = EmojiEntityMapper::instance()->unicode(s->index());
if (res)
{
- m_t << res;
+ m_t << "<span class=\"emoji\">"<<res<<"</span>";
}
else
{
@@ -434,12 +436,12 @@ void HtmlDocVisitor::visit(DocStyleChange *s)
if (s->enable()) m_t << "<sup" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</sup>";
break;
case DocStyleChange::Center:
- if (s->enable())
+ if (s->enable())
{
forceEndParagraph(s);
- m_t << "<center" << htmlAttribsToString(s->attribs()) << ">";
+ m_t << "<center" << htmlAttribsToString(s->attribs()) << ">";
}
- else
+ else
{
m_t << "</center>";
forceStartParagraph(s);
@@ -463,12 +465,12 @@ void HtmlDocVisitor::visit(DocStyleChange *s)
}
break;
case DocStyleChange::Div:
- if (s->enable())
+ if (s->enable())
{
forceEndParagraph(s);
- m_t << "<div" << htmlAttribsToString(s->attribs()) << ">";
+ m_t << "<div" << htmlAttribsToString(s->attribs()) << ">";
}
- else
+ else
{
m_t << "</div>";
forceStartParagraph(s);
@@ -485,7 +487,7 @@ void HtmlDocVisitor::visit(DocStyleChange *s)
static void visitPreCaption(FTextStream &t, DocVerbatim *s)
{
if (s->hasCaption())
- {
+ {
t << "<div class=\"caption\">" << endl;
}
}
@@ -518,11 +520,10 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
SrcLangExt langExt = getLanguageFromFileName(lang);
switch(s->type())
{
- case DocVerbatim::Code:
+ case DocVerbatim::Code:
forceEndParagraph(s);
- m_t << PREFRAG_START;
- Doxygen::parserManager->getCodeParser(lang)
- .parseCode(m_ci,
+ m_ci.startCodeFragment("DoxyCode");
+ getCodeParser(lang).parseCode(m_ci,
s->context(),
s->text(),
langExt,
@@ -536,14 +537,14 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
TRUE, // show line numbers
m_ctx // search context
);
- m_t << PREFRAG_END;
+ m_ci.endCodeFragment("DoxyCode");
forceStartParagraph(s);
break;
- case DocVerbatim::Verbatim:
+ case DocVerbatim::Verbatim:
forceEndParagraph(s);
- m_t << /*PREFRAG_START <<*/ "<pre class=\"fragment\">";
+ m_t << "<pre class=\"fragment\">";
filter(s->text());
- m_t << "</pre>" /*<< PREFRAG_END*/;
+ m_t << "</pre>";
forceStartParagraph(s);
break;
case DocVerbatim::HtmlOnly:
@@ -553,12 +554,12 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
if (s->isBlock()) forceStartParagraph(s);
}
break;
- case DocVerbatim::ManOnly:
- case DocVerbatim::LatexOnly:
- case DocVerbatim::XmlOnly:
+ case DocVerbatim::ManOnly:
+ case DocVerbatim::LatexOnly:
+ case DocVerbatim::XmlOnly:
case DocVerbatim::RtfOnly:
case DocVerbatim::DocbookOnly:
- /* nothing */
+ /* nothing */
break;
case DocVerbatim::Dot:
@@ -567,8 +568,8 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
QCString fileName(4096);
forceEndParagraph(s);
- fileName.sprintf("%s%d%s",
- (Config_getString(HTML_OUTPUT)+"/inline_dotgraph_").data(),
+ fileName.sprintf("%s%d%s",
+ (Config_getString(HTML_OUTPUT)+"/inline_dotgraph_").data(),
dotindex++,
".dot"
);
@@ -601,8 +602,8 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
static int mscindex = 1;
QCString baseName(4096);
- baseName.sprintf("%s%d",
- (Config_getString(HTML_OUTPUT)+"/inline_mscgraph_").data(),
+ baseName.sprintf("%s%d",
+ (Config_getString(HTML_OUTPUT)+"/inline_mscgraph_").data(),
mscindex++
);
QFile file(baseName+".msc");
@@ -666,11 +667,10 @@ void HtmlDocVisitor::visit(DocInclude *inc)
SrcLangExt langExt = getLanguageFromFileName(inc->extension());
switch(inc->type())
{
- case DocInclude::Include:
+ case DocInclude::Include:
forceEndParagraph(inc);
- m_t << PREFRAG_START;
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ m_ci.startCodeFragment("DoxyCode");
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
inc->text(),
langExt,
@@ -682,24 +682,23 @@ void HtmlDocVisitor::visit(DocInclude *inc)
TRUE, // inlineFragment
0, // memberDef
FALSE, // show line numbers
- m_ctx // search context
+ m_ctx // search context
);
- m_t << PREFRAG_END;
+ m_ci.endCodeFragment("DoxyCode");
forceStartParagraph(inc);
break;
case DocInclude::IncWithLines:
- {
+ {
forceEndParagraph(inc);
- m_t << PREFRAG_START;
+ m_ci.startCodeFragment("DoxyCode");
QFileInfo cfi( inc->file() );
FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
inc->text(),
langExt,
inc->isExample(),
- inc->exampleFile(),
+ inc->exampleFile(),
fd, // fileDef,
-1, // start line
-1, // end line
@@ -709,12 +708,16 @@ void HtmlDocVisitor::visit(DocInclude *inc)
m_ctx // search context
);
delete fd;
- m_t << PREFRAG_END;
+ m_ci.endCodeFragment("DoxyCode");
forceStartParagraph(inc);
}
break;
case DocInclude::DontInclude:
case DocInclude::LatexInclude:
+ case DocInclude::RtfInclude:
+ case DocInclude::ManInclude:
+ case DocInclude::XmlInclude:
+ case DocInclude::DocbookInclude:
case DocInclude::DontIncWithLines:
break;
case DocInclude::HtmlInclude:
@@ -724,24 +727,23 @@ void HtmlDocVisitor::visit(DocInclude *inc)
if (inc->isBlock()) forceStartParagraph(inc);
}
break;
- case DocInclude::VerbInclude:
+ case DocInclude::VerbInclude:
forceEndParagraph(inc);
- m_t << /*PREFRAG_START <<*/ "<pre class=\"fragment\">";
+ m_t << "<pre class=\"fragment\">";
filter(inc->text());
- m_t << "</pre>" /*<< PREFRAG_END*/;
+ m_t << "</pre>";
forceStartParagraph(inc);
break;
case DocInclude::Snippet:
{
forceEndParagraph(inc);
- m_t << PREFRAG_START;
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ m_ci.startCodeFragment("DoxyCode");
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
extractBlock(inc->text(),inc->blockId()),
langExt,
inc->isExample(),
- inc->exampleFile(),
+ inc->exampleFile(),
0,
-1, // startLine
-1, // endLine
@@ -750,23 +752,22 @@ void HtmlDocVisitor::visit(DocInclude *inc)
FALSE, // show line number
m_ctx // search context
);
- m_t << PREFRAG_END;
+ m_ci.endCodeFragment("DoxyCode");
forceStartParagraph(inc);
}
break;
case DocInclude::SnipWithLines:
{
forceEndParagraph(inc);
- m_t << PREFRAG_START;
+ m_ci.startCodeFragment("DoxyCode");
QFileInfo cfi( inc->file() );
FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
extractBlock(inc->text(),inc->blockId()),
langExt,
inc->isExample(),
- inc->exampleFile(),
+ inc->exampleFile(),
fd,
lineBlock(inc->text(),inc->blockId()),
-1, // endLine
@@ -776,12 +777,12 @@ void HtmlDocVisitor::visit(DocInclude *inc)
m_ctx // search context
);
delete fd;
- m_t << PREFRAG_END;
+ m_ci.endCodeFragment("DoxyCode");
forceStartParagraph(inc);
}
break;
- case DocInclude::SnippetDoc:
- case DocInclude::IncludeDoc:
+ case DocInclude::SnippetDoc:
+ case DocInclude::IncludeDoc:
err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
"Please create a bug report\n",__FILE__);
break;
@@ -792,20 +793,20 @@ void HtmlDocVisitor::visit(DocIncOperator *op)
{
//printf("DocIncOperator: type=%d first=%d, last=%d text='%s'\n",
// op->type(),op->isFirst(),op->isLast(),op->text().data());
- if (op->isFirst())
+ if (op->isFirst())
{
forceEndParagraph(op);
- if (!m_hide) m_t << PREFRAG_START;
+ if (!m_hide) m_ci.startCodeFragment("DoxyCode");
pushEnabled();
m_hide=TRUE;
}
QCString locLangExt = getFileNameExtension(op->includeFileName());
if (locLangExt.isEmpty()) locLangExt = m_langExt;
SrcLangExt langExt = getLanguageFromFileName(locLangExt);
- if (op->type()!=DocIncOperator::Skip)
+ if (op->type()!=DocIncOperator::Skip)
{
popEnabled();
- if (!m_hide)
+ if (!m_hide)
{
FileDef *fd = 0;
if (!op->includeFileName().isEmpty())
@@ -813,8 +814,7 @@ void HtmlDocVisitor::visit(DocIncOperator *op)
QFileInfo cfi( op->includeFileName() );
fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
}
- Doxygen::parserManager->getCodeParser(locLangExt)
- .parseCode(
+ getCodeParser(locLangExt).parseCode(
m_ci,
op->context(),
op->text(),
@@ -834,10 +834,10 @@ void HtmlDocVisitor::visit(DocIncOperator *op)
pushEnabled();
m_hide=TRUE;
}
- if (op->isLast())
+ if (op->isLast())
{
popEnabled();
- if (!m_hide) m_t << PREFRAG_END;
+ if (!m_hide) m_ci.endCodeFragment("DoxyCode");
forceStartParagraph(op);
}
else
@@ -850,7 +850,7 @@ void HtmlDocVisitor::visit(DocFormula *f)
{
if (m_hide) return;
bool bDisplay = !f->isInline();
- if (bDisplay)
+ if (bDisplay)
{
forceEndParagraph(f);
m_t << "<p class=\"formulaDsp\">" << endl;
@@ -860,7 +860,7 @@ void HtmlDocVisitor::visit(DocFormula *f)
{
QCString text = f->text();
bool closeInline = FALSE;
- if (!bDisplay && !text.isEmpty() && text.at(0)=='$' &&
+ if (!bDisplay && !text.isEmpty() && text.at(0)=='$' &&
text.at(text.length()-1)=='$')
{
closeInline=TRUE;
@@ -875,15 +875,30 @@ void HtmlDocVisitor::visit(DocFormula *f)
}
else
{
- m_t << "<img class=\"formula"
+ m_t << "<img class=\"formula"
<< (bDisplay ? "Dsp" : "Inl");
m_t << "\" alt=\"";
filterQuotedCdataAttr(f->text());
m_t << "\"";
- // TODO: cache image dimensions on formula generation and give height/width
- // for faster preloading and better rendering of the page
- m_t << " src=\"" << f->relPath() << f->name() << ".png\"/>";
-
+ m_t << " src=\"" << f->relPath() << f->name();
+ if (Config_getEnum(HTML_FORMULA_FORMAT)=="svg")
+ {
+ m_t << ".svg";
+ }
+ else
+ {
+ m_t << ".png";
+ }
+ FormulaManager::DisplaySize size = FormulaManager::instance().displaySize(f->id());
+ if (size.width!=-1)
+ {
+ m_t << "\" width=\"" << size.width;
+ }
+ if (size.height!=-1)
+ {
+ m_t << "\" height=\"" << size.height;
+ }
+ m_t << "\"/>";
}
if (bDisplay)
{
@@ -895,7 +910,7 @@ void HtmlDocVisitor::visit(DocFormula *f)
void HtmlDocVisitor::visit(DocIndexEntry *e)
{
QCString anchor = convertIndexWordToAnchor(e->entry());
- if (e->member())
+ if (e->member())
{
anchor.prepend(e->member()->anchor()+"_");
}
@@ -917,7 +932,7 @@ void HtmlDocVisitor::visit(DocSimpleSectSep *)
void HtmlDocVisitor::visit(DocCite *cite)
{
if (m_hide) return;
- if (!cite->file().isEmpty())
+ if (!cite->file().isEmpty())
{
startLink(cite->ref(),cite->file(),cite->relPath(),cite->anchor());
}
@@ -926,7 +941,7 @@ void HtmlDocVisitor::visit(DocCite *cite)
m_t << "<b>[";
}
filter(cite->text());
- if (!cite->file().isEmpty())
+ if (!cite->file().isEmpty())
{
endLink();
}
@@ -954,7 +969,7 @@ void HtmlDocVisitor::visitPre(DocAutoList *l)
// 1.
// a.
// i.
- // A.
+ // A.
// 1. (repeat)...
//
m_t << "<ol type=\"" << types[l->depth() % NUM_HTML_LIST_TYPES] << "\"";
@@ -989,20 +1004,20 @@ void HtmlDocVisitor::visitPre(DocAutoListItem *)
m_t << "<li>";
}
-void HtmlDocVisitor::visitPost(DocAutoListItem *li)
+void HtmlDocVisitor::visitPost(DocAutoListItem *li)
{
if (m_hide) return;
m_t << "</li>";
if (!li->isPreformatted()) m_t << "\n";
}
-template<class T>
+template<class T>
bool isFirstChildNode(T *parent, DocNode *node)
{
return parent->children().getFirst()==node;
}
-template<class T>
+template<class T>
bool isLastChildNode(T *parent, DocNode *node)
{
return parent->children().getLast()==node;
@@ -1046,7 +1061,7 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast)
isLast=FALSE;
if (p && p->parent())
{
- switch (p->parent()->kind())
+ switch (p->parent()->kind())
{
case DocNode::Kind_ParBlock:
{ // hierarchy: node N -> para -> parblock -> para
@@ -1191,7 +1206,7 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast)
return t;
}
-void HtmlDocVisitor::visitPre(DocPara *p)
+void HtmlDocVisitor::visitPre(DocPara *p)
{
if (m_hide) return;
@@ -1199,9 +1214,9 @@ void HtmlDocVisitor::visitPre(DocPara *p)
// p->parent() ? p->parent()->kind() : -1);
bool needsTag = FALSE;
- if (p && p->parent())
+ if (p && p->parent())
{
- switch (p->parent()->kind())
+ switch (p->parent()->kind())
{
case DocNode::Kind_Section:
case DocNode::Kind_Internal:
@@ -1226,7 +1241,7 @@ void HtmlDocVisitor::visitPre(DocPara *p)
}
// if the first element of a paragraph is something that should be outside of
- // the paragraph (<ul>,<dl>,<table>,..) then that will already started the
+ // the paragraph (<ul>,<dl>,<table>,..) then that will already started the
// paragraph and we don't need to do it here
bool paragraphAlreadyStarted = false;
uint nodeIndex = 0;
@@ -1272,9 +1287,9 @@ void HtmlDocVisitor::visitPost(DocPara *p)
// p->parent() ? p->parent()->kind() : -1);
bool needsTag = FALSE;
- if (p->parent())
+ if (p->parent())
{
- switch (p->parent()->kind())
+ switch (p->parent()->kind())
{
case DocNode::Kind_Section:
case DocNode::Kind_Internal:
@@ -1299,7 +1314,7 @@ void HtmlDocVisitor::visitPost(DocPara *p)
}
// if the last element of a paragraph is something that should be outside of
- // the paragraph (<ul>,<dl>,<table>) then that will already have ended the
+ // the paragraph (<ul>,<dl>,<table>) then that will already have ended the
// paragraph and we don't need to do it here
int nodeIndex = p->children().count()-1;
if (nodeIndex>=0)
@@ -1348,21 +1363,21 @@ void HtmlDocVisitor::visitPre(DocSimpleSect *s)
m_t << "<dl class=\"section " << s->typeString() << "\"><dt>";
switch(s->type())
{
- case DocSimpleSect::See:
+ case DocSimpleSect::See:
m_t << theTranslator->trSeeAlso(); break;
- case DocSimpleSect::Return:
+ case DocSimpleSect::Return:
m_t << theTranslator->trReturns(); break;
- case DocSimpleSect::Author:
+ case DocSimpleSect::Author:
m_t << theTranslator->trAuthor(TRUE,TRUE); break;
- case DocSimpleSect::Authors:
+ case DocSimpleSect::Authors:
m_t << theTranslator->trAuthor(TRUE,FALSE); break;
- case DocSimpleSect::Version:
+ case DocSimpleSect::Version:
m_t << theTranslator->trVersion(); break;
- case DocSimpleSect::Since:
+ case DocSimpleSect::Since:
m_t << theTranslator->trSince(); break;
- case DocSimpleSect::Date:
+ case DocSimpleSect::Date:
m_t << theTranslator->trDate(); break;
- case DocSimpleSect::Note:
+ case DocSimpleSect::Note:
m_t << theTranslator->trNote(); break;
case DocSimpleSect::Warning:
m_t << theTranslator->trWarning(); break;
@@ -1430,7 +1445,7 @@ void HtmlDocVisitor::visitPre(DocSimpleListItem *)
m_t << "<li>";
}
-void HtmlDocVisitor::visitPost(DocSimpleListItem *li)
+void HtmlDocVisitor::visitPost(DocSimpleListItem *li)
{
if (m_hide) return;
m_t << "</li>";
@@ -1448,7 +1463,7 @@ void HtmlDocVisitor::visitPre(DocSection *s)
m_t << "</h" << s->level() << ">\n";
}
-void HtmlDocVisitor::visitPost(DocSection *s)
+void HtmlDocVisitor::visitPost(DocSection *s)
{
forceStartParagraph(s);
}
@@ -1457,26 +1472,26 @@ void HtmlDocVisitor::visitPre(DocHtmlList *s)
{
if (m_hide) return;
forceEndParagraph(s);
- if (s->type()==DocHtmlList::Ordered)
+ if (s->type()==DocHtmlList::Ordered)
{
- m_t << "<ol" << htmlAttribsToString(s->attribs());
+ m_t << "<ol" << htmlAttribsToString(s->attribs());
}
- else
+ else
{
m_t << "<ul" << htmlAttribsToString(s->attribs());
}
m_t << getDirHtmlClassOfNode(getTextDirByConfig(s)) << ">\n";
}
-void HtmlDocVisitor::visitPost(DocHtmlList *s)
+void HtmlDocVisitor::visitPost(DocHtmlList *s)
{
if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
+ if (s->type()==DocHtmlList::Ordered)
{
- m_t << "</ol>";
+ m_t << "</ol>";
}
else
- {
+ {
m_t << "</ul>";
}
if (!s->isPreformatted()) m_t << "\n";
@@ -1490,7 +1505,7 @@ void HtmlDocVisitor::visitPre(DocHtmlListItem *i)
if (!i->isPreformatted()) m_t << "\n";
}
-void HtmlDocVisitor::visitPost(DocHtmlListItem *)
+void HtmlDocVisitor::visitPost(DocHtmlListItem *)
{
if (m_hide) return;
m_t << "</li>\n";
@@ -1503,7 +1518,7 @@ void HtmlDocVisitor::visitPre(DocHtmlDescList *dl)
m_t << "<dl" << htmlAttribsToString(dl->attribs()) << ">\n";
}
-void HtmlDocVisitor::visitPost(DocHtmlDescList *dl)
+void HtmlDocVisitor::visitPost(DocHtmlDescList *dl)
{
if (m_hide) return;
m_t << "</dl>\n";
@@ -1518,7 +1533,7 @@ void HtmlDocVisitor::visitPre(DocHtmlDescTitle *dt)
<< ">";
}
-void HtmlDocVisitor::visitPost(DocHtmlDescTitle *)
+void HtmlDocVisitor::visitPost(DocHtmlDescTitle *)
{
if (m_hide) return;
m_t << "</dt>\n";
@@ -1527,12 +1542,12 @@ void HtmlDocVisitor::visitPost(DocHtmlDescTitle *)
void HtmlDocVisitor::visitPre(DocHtmlDescData *dd)
{
if (m_hide) return;
- m_t << "<dd" << htmlAttribsToString(dd->attribs())
+ m_t << "<dd" << htmlAttribsToString(dd->attribs())
<< getDirHtmlClassOfNode(getTextDirByConfig(dd))
<< ">";
}
-void HtmlDocVisitor::visitPost(DocHtmlDescData *)
+void HtmlDocVisitor::visitPost(DocHtmlDescData *)
{
if (m_hide) return;
m_t << "</dd>\n";
@@ -1574,7 +1589,7 @@ void HtmlDocVisitor::visitPre(DocHtmlTable *t)
}
}
-void HtmlDocVisitor::visitPost(DocHtmlTable *t)
+void HtmlDocVisitor::visitPost(DocHtmlTable *t)
{
if (m_hide) return;
m_t << "</table>\n";
@@ -1587,7 +1602,7 @@ void HtmlDocVisitor::visitPre(DocHtmlRow *tr)
m_t << "<tr" << htmlAttribsToString(tr->attribs()) << ">\n";
}
-void HtmlDocVisitor::visitPost(DocHtmlRow *)
+void HtmlDocVisitor::visitPost(DocHtmlRow *)
{
if (m_hide) return;
m_t << "</tr>\n";
@@ -1596,17 +1611,17 @@ void HtmlDocVisitor::visitPost(DocHtmlRow *)
void HtmlDocVisitor::visitPre(DocHtmlCell *c)
{
if (m_hide) return;
- if (c->isHeading())
+ if (c->isHeading())
{
- m_t << "<th" << htmlAttribsToString(c->attribs()) << ">";
+ m_t << "<th" << htmlAttribsToString(c->attribs()) << ">";
}
- else
+ else
{
m_t << "<td" << htmlAttribsToString(c->attribs()) << ">";
}
}
-void HtmlDocVisitor::visitPost(DocHtmlCell *c)
+void HtmlDocVisitor::visitPost(DocHtmlCell *c)
{
if (m_hide) return;
if (c->isHeading()) m_t << "</th>"; else m_t << "</td>";
@@ -1618,7 +1633,7 @@ void HtmlDocVisitor::visitPre(DocHtmlCaption *c)
m_t << "<caption" << htmlAttribsToString(c->attribs()) << ">";
}
-void HtmlDocVisitor::visitPost(DocHtmlCaption *)
+void HtmlDocVisitor::visitPost(DocHtmlCaption *)
{
if (m_hide) return;
m_t << "</caption>\n";
@@ -1631,7 +1646,7 @@ void HtmlDocVisitor::visitPre(DocInternal *)
//m_t << "<p><b>" << theTranslator->trForInternalUseOnly() << "</b></p>" << endl;
}
-void HtmlDocVisitor::visitPost(DocInternal *)
+void HtmlDocVisitor::visitPost(DocInternal *)
{
if (m_hide) return;
//forceStartParagraph(i);
@@ -1652,7 +1667,7 @@ void HtmlDocVisitor::visitPre(DocHRef *href)
}
}
-void HtmlDocVisitor::visitPost(DocHRef *)
+void HtmlDocVisitor::visitPost(DocHRef *)
{
if (m_hide) return;
m_t << "</a>";
@@ -1662,13 +1677,13 @@ void HtmlDocVisitor::visitPre(DocHtmlHeader *header)
{
if (m_hide) return;
forceEndParagraph(header);
- m_t << "<h" << header->level()
- << htmlAttribsToString(header->attribs())
+ m_t << "<h" << header->level()
+ << htmlAttribsToString(header->attribs())
<< getDirHtmlClassOfNode(getTextDirByConfig(header))
<< ">";
}
-void HtmlDocVisitor::visitPost(DocHtmlHeader *header)
+void HtmlDocVisitor::visitPost(DocHtmlHeader *header)
{
if (m_hide) return;
m_t << "</h" << header->level() << ">\n";
@@ -1726,7 +1741,7 @@ void HtmlDocVisitor::visitPre(DocImage *img)
{
src = correctURL(url,img->relPath());
}
- if (typeSVG)
+ if (typeSVG && !inlineImage)
{
m_t << "<object type=\"image/svg+xml\" data=\"" << convertToHtml(src)
<< "\"" << sizeAttribs << attrs;
@@ -1765,14 +1780,7 @@ void HtmlDocVisitor::visitPre(DocImage *img)
}
else if (inlineImage)
{
- if (typeSVG)
- {
- m_t << ">" << alt << "</object>";
- }
- else
- {
- m_t << "/>";
- }
+ m_t << "/>";
}
}
else // other format -> skip
@@ -1792,16 +1800,7 @@ void HtmlDocVisitor::visitPost(DocImage *img)
{
if (inlineImage)
{
- if (img->isSVG())
- {
- QCString alt;
- QCString attrs = htmlAttribsToString(img->attribs(),&alt);
- m_t << "\">" << alt << "</object>";
- }
- else
- {
- m_t << "\"/>";
- }
+ m_t << "\"/>";
}
else // end <div class="caption">
{
@@ -1826,12 +1825,12 @@ void HtmlDocVisitor::visitPre(DocDotFile *df)
m_t << "<div class=\"dotgraph\">" << endl;
writeDotFile(df->file(),df->relPath(),df->context());
if (df->hasCaption())
- {
+ {
m_t << "<div class=\"caption\">" << endl;
}
}
-void HtmlDocVisitor::visitPost(DocDotFile *df)
+void HtmlDocVisitor::visitPost(DocDotFile *df)
{
if (m_hide) return;
if (df->hasCaption())
@@ -1847,11 +1846,11 @@ void HtmlDocVisitor::visitPre(DocMscFile *df)
m_t << "<div class=\"mscgraph\">" << endl;
writeMscFile(df->file(),df->relPath(),df->context());
if (df->hasCaption())
- {
+ {
m_t << "<div class=\"caption\">" << endl;
}
}
-void HtmlDocVisitor::visitPost(DocMscFile *df)
+void HtmlDocVisitor::visitPost(DocMscFile *df)
{
if (m_hide) return;
if (df->hasCaption())
@@ -1887,7 +1886,7 @@ void HtmlDocVisitor::visitPre(DocLink *lnk)
startLink(lnk->ref(),lnk->file(),lnk->relPath(),lnk->anchor());
}
-void HtmlDocVisitor::visitPost(DocLink *)
+void HtmlDocVisitor::visitPost(DocLink *)
{
if (m_hide) return;
endLink();
@@ -1896,7 +1895,7 @@ void HtmlDocVisitor::visitPost(DocLink *)
void HtmlDocVisitor::visitPre(DocRef *ref)
{
if (m_hide) return;
- if (!ref->file().isEmpty())
+ if (!ref->file().isEmpty())
{
// when ref->isSubPage()==TRUE we use ref->file() for HTML and
// ref->anchor() for LaTeX/RTF
@@ -1905,7 +1904,7 @@ void HtmlDocVisitor::visitPre(DocRef *ref)
if (!ref->hasLinkText()) filter(ref->targetTitle());
}
-void HtmlDocVisitor::visitPost(DocRef *ref)
+void HtmlDocVisitor::visitPost(DocRef *ref)
{
if (m_hide) return;
if (!ref->file().isEmpty()) endLink();
@@ -1920,7 +1919,7 @@ void HtmlDocVisitor::visitPre(DocSecRefItem *ref)
}
-void HtmlDocVisitor::visitPost(DocSecRefItem *)
+void HtmlDocVisitor::visitPost(DocSecRefItem *)
{
if (m_hide) return;
m_t << "</a></li>\n";
@@ -1934,7 +1933,7 @@ void HtmlDocVisitor::visitPre(DocSecRefList *s)
m_t << "<ul class=\"multicol\">" << endl;
}
-void HtmlDocVisitor::visitPost(DocSecRefList *s)
+void HtmlDocVisitor::visitPost(DocSecRefList *s)
{
if (m_hide) return;
m_t << "</ul>" << endl;
@@ -1952,7 +1951,7 @@ void HtmlDocVisitor::visitPost(DocSecRefList *s)
// }
//}
//
-//void HtmlDocVisitor::visitPost(DocLanguage *l)
+//void HtmlDocVisitor::visitPost(DocLanguage *l)
//{
// QCString langId = Config_getEnum(OUTPUT_LANGUAGE);
// if (l->id().lower()!=langId.lower())
@@ -1969,19 +1968,19 @@ void HtmlDocVisitor::visitPre(DocParamSect *s)
QCString heading;
switch(s->type())
{
- case DocParamSect::Param:
- heading=theTranslator->trParameters();
+ case DocParamSect::Param:
+ heading=theTranslator->trParameters();
className="params";
break;
- case DocParamSect::RetVal:
- heading=theTranslator->trReturnValues();
+ case DocParamSect::RetVal:
+ heading=theTranslator->trReturnValues();
className="retval";
break;
- case DocParamSect::Exception:
- heading=theTranslator->trExceptions();
+ case DocParamSect::Exception:
+ heading=theTranslator->trExceptions();
className="exception";
break;
- case DocParamSect::TemplateParam:
+ case DocParamSect::TemplateParam:
heading=theTranslator->trTemplateParameters();
className="tparams";
break;
@@ -2044,11 +2043,11 @@ void HtmlDocVisitor::visitPre(DocParamList *pl)
{
if (type->kind()==DocNode::Kind_Word)
{
- visit((DocWord*)type);
+ visit((DocWord*)type);
}
else if (type->kind()==DocNode::Kind_LinkedWord)
{
- visit((DocLinkedWord*)type);
+ visit((DocLinkedWord*)type);
}
else if (type->kind()==DocNode::Kind_Sep)
{
@@ -2068,11 +2067,11 @@ void HtmlDocVisitor::visitPre(DocParamList *pl)
if (!first) m_t << ","; else first=FALSE;
if (param->kind()==DocNode::Kind_Word)
{
- visit((DocWord*)param);
+ visit((DocWord*)param);
}
else if (param->kind()==DocNode::Kind_LinkedWord)
{
- visit((DocLinkedWord*)param);
+ visit((DocLinkedWord*)param);
}
}
m_t << "</td><td>";
@@ -2094,12 +2093,12 @@ void HtmlDocVisitor::visitPre(DocXRefItem *x)
bool anonymousEnum = x->file()=="@";
if (!anonymousEnum)
{
- m_t << "<dl" << getDirHtmlClassOfNode(getTextDirByConfig(x), x->key())
+ m_t << "<dl" << getDirHtmlClassOfNode(getTextDirByConfig(x), x->key())
<< "><dt><b><a class=\"el\" href=\""
<< x->relPath() << addHtmlExtensionIfMissing(x->file())
<< "#" << x->anchor() << "\">";
}
- else
+ else
{
m_t << "<dl class=\"" << x->key() << "\"><dt><b>";
}
@@ -2123,7 +2122,7 @@ void HtmlDocVisitor::visitPre(DocInternalRef *ref)
startLink(0,ref->file(),ref->relPath(),ref->anchor());
}
-void HtmlDocVisitor::visitPost(DocInternalRef *)
+void HtmlDocVisitor::visitPost(DocInternalRef *)
{
if (m_hide) return;
endLink();
@@ -2172,7 +2171,7 @@ void HtmlDocVisitor::visitPre(DocVhdlFlow *vf)
m_t << "<p>";
m_t << "flowchart: " ; // TODO: translate me
m_t << "<a href=\"";
- m_t << fname.data();
+ m_t << fname.data();
m_t << ".svg\">";
m_t << VhdlDocGen::getFlowMember()->name().data();
m_t << "</a>";
@@ -2206,7 +2205,7 @@ void HtmlDocVisitor::visitPost(DocParBlock *)
void HtmlDocVisitor::filter(const char *str)
-{
+{
if (str==0) return;
const char *p=str;
char c;
@@ -2218,7 +2217,24 @@ void HtmlDocVisitor::filter(const char *str)
case '<': m_t << "&lt;"; break;
case '>': m_t << "&gt;"; break;
case '&': m_t << "&amp;"; break;
- default: m_t << c;
+ case '\\': if ((*p == '(') || (*p == ')'))
+ m_t << "\\&zwj;" << *p++;
+ else
+ m_t << c;
+ break;
+ default:
+ {
+ uchar uc = static_cast<uchar>(c);
+ if (uc<32 && !isspace(c)) // non-printable control characters
+ {
+ m_t << "&#x24" << hex[uc>>4] << hex[uc&0xF] << ";";
+ }
+ else
+ {
+ m_t << c;
+ }
+ }
+ break;
}
}
}
@@ -2239,7 +2255,24 @@ void HtmlDocVisitor::filterQuotedCdataAttr(const char* str)
case '"': m_t << "&quot;"; break;
case '<': m_t << "&lt;"; break;
case '>': m_t << "&gt;"; break;
- default: m_t << c;
+ case '\\': if ((*p == '(') || (*p == ')'))
+ m_t << "\\&zwj;" << *p++;
+ else
+ m_t << c;
+ break;
+ default:
+ {
+ uchar uc = static_cast<uchar>(c);
+ if (uc<32 && !isspace(c)) // non-printable control characters
+ {
+ m_t << "&#x24" << hex[uc>>4] << hex[uc&0xF] << ";";
+ }
+ else
+ {
+ m_t << c;
+ }
+ }
+ break;
}
}
}
@@ -2437,7 +2470,7 @@ void HtmlDocVisitor::forceEndParagraph(DocNode *n)
nodeIndex--;
}
if (nodeIndex<0) return; // first visible node in paragraph
- DocNode *n = para->children().at(nodeIndex);
+ n = para->children().at(nodeIndex);
if (mustBeOutsideParagraph(n)) return; // previous node already outside paragraph context
nodeIndex--;
bool styleOutsideParagraph=insideStyleChangeThatIsOutsideParagraph(para,nodeIndex);
@@ -2474,7 +2507,7 @@ void HtmlDocVisitor::forceStartParagraph(DocNode *n)
}
if (nodeIndex<numNodes)
{
- DocNode *n = para->children().at(nodeIndex);
+ n = para->children().at(nodeIndex);
if (mustBeOutsideParagraph(n)) return; // next element also outside paragraph
}
else
diff --git a/src/htmlentity.cpp b/src/htmlentity.cpp
index 543f86b..ae2d8f1 100644
--- a/src/htmlentity.cpp
+++ b/src/htmlentity.cpp
@@ -263,7 +263,7 @@ static struct htmlEntityInfo
{ SYM(clubs), "\xe2\x99\xa3", "&clubs;", "<clubs/>", "&#9827;", "{$\\clubsuit$}", NULL, "\\u9827?", { NULL, DocSymbol::Perl_unknown }},
{ SYM(hearts), "\xe2\x99\xa5", "&hearts;", "<hearts/>", "&#9829;", "{$\\heartsuit$}", NULL, "\\u9829?", { NULL, DocSymbol::Perl_unknown }},
{ SYM(diams), "\xe2\x99\xa6", "&diams;", "<diams/>", "&#9830;", "{$\\diamondsuit$}", NULL, "\\u9830?", { NULL, DocSymbol::Perl_unknown }},
- { SYM(quot), "\"", "&quot;", "\"", "&quot;", "\"", "\"", "\"", { "\"", DocSymbol::Perl_char }},
+ { SYM(quot), "\"", "&quot;", "\"", "&quot;", "\"{}", "\"", "\"", { "\"", DocSymbol::Perl_char }},
{ SYM(amp), "&", "&amp;", "&amp;", "&amp;", "\\&", "&", "&", { "&", DocSymbol::Perl_char }},
{ SYM(lt), "<", "&lt;", "&lt;", "&lt;", "<", "<", "<", { "<", DocSymbol::Perl_char }},
{ SYM(gt), ">", "&gt;", "&gt;", "&gt;", ">", ">", ">", { ">", DocSymbol::Perl_char }},
@@ -311,7 +311,7 @@ static struct htmlEntityInfo
{ SYM(DoubleColon), "::", "::", "::", "::", "::", "::", "::", { "::", DocSymbol::Perl_string }},
{ SYM(Percent), "%", "%", "%", "%", "\\%", "%", "%", { "%", DocSymbol::Perl_char }},
{ SYM(Pipe), "|", "|", "|", "|", "$|$", "|", "|", { "|", DocSymbol::Perl_char }},
- { SYM(Quot), "\"", "\"", "\"", "&quot;", "\"", "\"", "\"", { "\"", DocSymbol::Perl_char }},
+ { SYM(Quot), "\"", "\"", "\"", "&quot;", "\"{}", "\"", "\"", { "\"", DocSymbol::Perl_char }},
{ SYM(Minus), "-", "-", "-", "-", "-\\/", "-", "-", { "-", DocSymbol::Perl_char }},
{ SYM(Plus), "+", "+", "+", "+", "+", "+", "+", { "+", DocSymbol::Perl_char }},
{ SYM(Dot), ".", ".", ".", ".", ".", ".", ".", { ".", DocSymbol::Perl_char }},
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index bf52eed..e186c37 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -16,8 +16,10 @@
*/
#include <stdlib.h>
-
#include <assert.h>
+
+#include <mutex>
+
#include <qdir.h>
#include <qregexp.h>
#include "message.h"
@@ -58,8 +60,7 @@ static QCString g_header;
static QCString g_footer;
static QCString g_mathjax_code;
static QCString g_latex_macro;
-
-static bool DoxyCodeLineOpen = FALSE;
+static const char *hex="0123456789ABCDEF";
// note: this is only active if DISABLE_INDEX=YES, if DISABLE_INDEX is disabled, this
// part will be rendered inside menu.js
@@ -67,7 +68,7 @@ static void writeClientSearchBox(FTextStream &t,const char *relPath)
{
t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
t << " <span class=\"left\">\n";
- t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag_sel.png\"\n";
+ t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag_sel.svg\"\n";
t << " onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
t << " onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
t << " alt=\"\"/>\n";
@@ -78,7 +79,7 @@ static void writeClientSearchBox(FTextStream &t,const char *relPath)
t << " onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n";
t << " </span><span class=\"right\">\n";
t << " <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\">"
- << "<img id=\"MSearchCloseImg\" border=\"0\" src=\"" << relPath << "search/close.png\" alt=\"\"/></a>\n";
+ << "<img id=\"MSearchCloseImg\" border=\"0\" src=\"" << relPath << "search/close.svg\" alt=\"\"/></a>\n";
t << " </span>\n";
t << " </div>\n";
}
@@ -87,7 +88,7 @@ static void writeClientSearchBox(FTextStream &t,const char *relPath)
// part will be rendered inside menu.js
static void writeServerSearchBox(FTextStream &t,const char *relPath,bool highlightSearch)
{
- static bool externalSearch = Config_getBool(EXTERNAL_SEARCH);
+ bool externalSearch = Config_getBool(EXTERNAL_SEARCH);
t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
t << " <div class=\"left\">\n";
t << " <form id=\"FSearchBox\" action=\"" << relPath;
@@ -100,7 +101,7 @@ static void writeServerSearchBox(FTextStream &t,const char *relPath,bool highlig
t << "search.php";
}
t << "\" method=\"get\">\n";
- t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag.png\" alt=\"\"/>\n";
+ t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag.svg\" alt=\"\"/>\n";
if (!highlightSearch)
{
t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\""
@@ -114,20 +115,28 @@ static void writeServerSearchBox(FTextStream &t,const char *relPath,bool highlig
}
//------------------------------------------------------------------------
-/// Convert a set of LaTeX `\(re)newcommand` to a form readable by MathJax
+/// Convert a set of LaTeX commands `\(re)newcommand` to a form readable by MathJax
/// LaTeX syntax:
+/// ```
/// \newcommand{\cmd}{replacement}
/// or
/// \renewcommand{\cmd}{replacement}
+/// ```
/// MathJax syntax:
+/// ```
/// cmd: "{replacement}"
+/// ```
///
/// LaTeX syntax:
+/// ```
/// \newcommand{\cmd}[nr]{replacement}
/// or
/// \renewcommand{\cmd}[nr]{replacement}
+/// ```
/// MathJax syntax:
+/// ```
/// cmd: ["{replacement}",nr]
+/// ```
static QCString getConvertLatexMacro()
{
QCString macrofile = Config_getString(FORMULA_MACROFILE);
@@ -158,8 +167,14 @@ static QCString getConvertLatexMacro()
return "";
}
i++;
- if (!qstrncmp(data + i, "newcommand", strlen("newcommand"))) i += strlen("newcommand");
- else if (!qstrncmp(data + i, "renewcommand", strlen("renewcommand"))) i += strlen("renewcommand");
+ if (!qstrncmp(data + i, "newcommand", (uint)strlen("newcommand")))
+ {
+ i += (int)strlen("newcommand");
+ }
+ else if (!qstrncmp(data + i, "renewcommand", (uint)strlen("renewcommand")))
+ {
+ i += (int)strlen("renewcommand");
+ }
else
{
warn(macrofile,line, "file contains non valid code, expected 'newcommand' or 'renewcommand'");
@@ -394,14 +409,13 @@ static QCString removeEmptyLines(const QCString &s)
return out.data();
}
-static QCString substituteHtmlKeywords(const QCString &s,
+static QCString substituteHtmlKeywords(const QCString &str,
const QCString &title,
const QCString &relPath,
const QCString &navPath=QCString())
{
// Build CSS/JavaScript tags depending on treeview, search engine settings
QCString cssFile;
- QStrList extraCssFile;
QCString generatedBy;
QCString treeViewCssJs;
QCString searchCssJs;
@@ -409,18 +423,18 @@ static QCString substituteHtmlKeywords(const QCString &s,
QCString mathJaxJs;
QCString extraCssText;
- static QCString projectName = Config_getString(PROJECT_NAME);
- static bool timeStamp = Config_getBool(HTML_TIMESTAMP);
- static bool treeView = Config_getBool(GENERATE_TREEVIEW);
- static bool searchEngine = Config_getBool(SEARCHENGINE);
- static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
- static bool mathJax = Config_getBool(USE_MATHJAX);
- static QCString mathJaxFormat = Config_getEnum(MATHJAX_FORMAT);
- static bool disableIndex = Config_getBool(DISABLE_INDEX);
- static bool hasProjectName = !projectName.isEmpty();
- static bool hasProjectNumber = !Config_getString(PROJECT_NUMBER).isEmpty();
- static bool hasProjectBrief = !Config_getString(PROJECT_BRIEF).isEmpty();
- static bool hasProjectLogo = !Config_getString(PROJECT_LOGO).isEmpty();
+ QCString projectName = Config_getString(PROJECT_NAME);
+ bool timeStamp = Config_getBool(HTML_TIMESTAMP);
+ bool treeView = Config_getBool(GENERATE_TREEVIEW);
+ bool searchEngine = Config_getBool(SEARCHENGINE);
+ bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
+ bool mathJax = Config_getBool(USE_MATHJAX);
+ QCString mathJaxFormat = Config_getEnum(MATHJAX_FORMAT);
+ bool disableIndex = Config_getBool(DISABLE_INDEX);
+ bool hasProjectName = !projectName.isEmpty();
+ bool hasProjectNumber = !Config_getString(PROJECT_NUMBER).isEmpty();
+ bool hasProjectBrief = !Config_getString(PROJECT_BRIEF).isEmpty();
+ bool hasProjectLogo = !Config_getString(PROJECT_LOGO).isEmpty();
static bool titleArea = (hasProjectName || hasProjectBrief || hasProjectLogo || (disableIndex && searchEngine));
cssFile = Config_getString(HTML_STYLESHEET);
@@ -442,10 +456,10 @@ static QCString substituteHtmlKeywords(const QCString &s,
}
extraCssText = "";
- extraCssFile = Config_getList(HTML_EXTRA_STYLESHEET);
- for (uint i=0; i<extraCssFile.count(); ++i)
+ const StringVector &extraCssFile = Config_getList(HTML_EXTRA_STYLESHEET);
+ for (const auto &extraFile : extraCssFile)
{
- QCString fileName(extraCssFile.at(i));
+ QCString fileName = extraFile.c_str();
if (!fileName.isEmpty())
{
QFileInfo fi(fileName);
@@ -527,12 +541,10 @@ static QCString substituteHtmlKeywords(const QCString &s,
mathJaxJs = "<script type=\"text/x-mathjax-config\">\n"
" MathJax.Hub.Config({\n"
" extensions: [\"tex2jax.js\"";
- QStrList &mathJaxExtensions = Config_getList(MATHJAX_EXTENSIONS);
- const char *s = mathJaxExtensions.first();
- while (s)
+ const StringVector &mathJaxExtensions = Config_getList(MATHJAX_EXTENSIONS);
+ for (const auto &s : mathJaxExtensions)
{
- mathJaxJs+= ", \""+QCString(s)+".js\"";
- s = mathJaxExtensions.next();
+ mathJaxJs+= ", \""+QCString(s.c_str())+".js\"";
}
if (mathJaxFormat.isEmpty())
{
@@ -562,7 +574,7 @@ static QCString substituteHtmlKeywords(const QCString &s,
}
// first substitute generic keywords
- QCString result = substituteKeywords(s,title,
+ QCString result = substituteKeywords(str,title,
convertToHtml(Config_getString(PROJECT_NAME)),
convertToHtml(Config_getString(PROJECT_NUMBER)),
convertToHtml(Config_getString(PROJECT_BRIEF)));
@@ -597,12 +609,11 @@ static QCString substituteHtmlKeywords(const QCString &s,
//--------------------------------------------------------------------------
HtmlCodeGenerator::HtmlCodeGenerator()
- : m_streamSet(FALSE), m_col(0)
{
}
HtmlCodeGenerator::HtmlCodeGenerator(FTextStream &t,const QCString &relPath)
- : m_col(0), m_relPath(relPath)
+ : m_relPath(relPath)
{
setTextStream(t);
}
@@ -620,7 +631,7 @@ void HtmlCodeGenerator::setRelativePath(const QCString &path)
void HtmlCodeGenerator::codify(const char *str)
{
- static int tabSize = Config_getInt(TAB_SIZE);
+ int tabSize = Config_getInt(TAB_SIZE);
if (str && m_streamSet)
{
const char *p=str;
@@ -654,13 +665,29 @@ void HtmlCodeGenerator::codify(const char *str)
{ m_t << "&lt;"; p++; }
else if (*p=='>')
{ m_t << "&gt;"; p++; }
+ else if (*p=='(')
+ { m_t << "\\&zwj;("; m_col++;p++; }
+ else if (*p==')')
+ { m_t << "\\&zwj;)"; m_col++;p++; }
else
m_t << "\\";
m_col++;
break;
- default: p=writeUtf8Char(m_t,p-1);
- m_col++;
- break;
+ default:
+ {
+ uchar uc = static_cast<uchar>(c);
+ if (uc<32)
+ {
+ m_t << "&#x24" << hex[uc>>4] << hex[uc&0xF] << ";";
+ m_col++;
+ }
+ else
+ {
+ p=writeUtf8Char(m_t,p-1);
+ m_col++;
+ }
+ }
+ break;
}
}
}
@@ -668,7 +695,7 @@ void HtmlCodeGenerator::codify(const char *str)
void HtmlCodeGenerator::docify(const char *str)
{
- m_t << getHtmlDirEmbeddingChar(getTextDirByConfig(str));
+ //m_t << getHtmlDirEmbeddingChar(getTextDirByConfig(str));
if (str && m_streamSet)
{
@@ -684,14 +711,30 @@ void HtmlCodeGenerator::docify(const char *str)
case '&': m_t << "&amp;"; break;
case '"': m_t << "&quot;"; break;
case '\\':
- if (*p=='<')
- { m_t << "&lt;"; p++; }
- else if (*p=='>')
- { m_t << "&gt;"; p++; }
- else
- m_t << "\\";
- break;
- default: m_t << c;
+ if (*p=='<')
+ { m_t << "&lt;"; p++; }
+ else if (*p=='>')
+ { m_t << "&gt;"; p++; }
+ else if (*p=='(')
+ { m_t << "\\&zwj;("; p++; }
+ else if (*p==')')
+ { m_t << "\\&zwj;)"; p++; }
+ else
+ m_t << "\\";
+ break;
+ default:
+ {
+ uchar uc = static_cast<uchar>(c);
+ if (uc<32 && !isspace(c))
+ {
+ m_t << "&#x24" << hex[uc>>4] << hex[uc&0xF] << ";";
+ }
+ else
+ {
+ m_t << c;
+ }
+ }
+ break;
}
}
}
@@ -707,10 +750,10 @@ void HtmlCodeGenerator::writeLineNumber(const char *ref,const char *filename,
qsnprintf(lineNumber,maxLineNrStr,"%5d",l);
qsnprintf(lineAnchor,maxLineNrStr,"l%05d",l);
- if (!DoxyCodeLineOpen)
+ if (!m_lineOpen)
{
m_t << "<div class=\"line\">";
- DoxyCodeLineOpen = TRUE;
+ m_lineOpen = TRUE;
}
m_t << "<a name=\"" << lineAnchor << "\"></a><span class=\"lineno\">";
@@ -849,10 +892,10 @@ void HtmlCodeGenerator::startCodeLine(bool)
if (m_streamSet)
{
m_col=0;
- if (!DoxyCodeLineOpen)
+ if (!m_lineOpen)
{
m_t << "<div class=\"line\">";
- DoxyCodeLineOpen = TRUE;
+ m_lineOpen = TRUE;
}
}
}
@@ -866,10 +909,10 @@ void HtmlCodeGenerator::endCodeLine()
m_t << " ";
m_col++;
}
- if (DoxyCodeLineOpen)
+ if (m_lineOpen)
{
m_t << "</div>\n";
- DoxyCodeLineOpen = FALSE;
+ m_lineOpen = FALSE;
}
}
}
@@ -889,13 +932,39 @@ void HtmlCodeGenerator::writeCodeAnchor(const char *anchor)
if (m_streamSet) m_t << "<a name=\"" << anchor << "\"></a>";
}
+void HtmlCodeGenerator::startCodeFragment(const char *)
+{
+ if (m_streamSet) m_t << "<div class=\"fragment\">";
+}
+
+void HtmlCodeGenerator::endCodeFragment(const char *)
+{
+ //endCodeLine checks is there is still an open code line, if so closes it.
+ endCodeLine();
+
+ if (m_streamSet) m_t << "</div><!-- fragment -->";
+}
+
+
//--------------------------------------------------------------------------
-HtmlGenerator::HtmlGenerator() : OutputGenerator()
+HtmlGenerator::HtmlGenerator() : OutputGenerator(Config_getString(HTML_OUTPUT))
{
- m_dir=Config_getString(HTML_OUTPUT);
- m_emptySection=FALSE;
- m_sectionCount=0;
+}
+
+HtmlGenerator::HtmlGenerator(const HtmlGenerator &og) : OutputGenerator(og)
+{
+}
+
+HtmlGenerator &HtmlGenerator::operator=(const HtmlGenerator &og)
+{
+ OutputGenerator::operator=(og);
+ return *this;
+}
+
+std::unique_ptr<OutputGenerator> HtmlGenerator::clone() const
+{
+ return std::make_unique<HtmlGenerator>(*this);
}
HtmlGenerator::~HtmlGenerator()
@@ -903,9 +972,10 @@ HtmlGenerator::~HtmlGenerator()
//printf("HtmlGenerator::~HtmlGenerator()\n");
}
+
void HtmlGenerator::init()
{
- QCString dname=Config_getString(HTML_OUTPUT);
+ QCString dname = Config_getString(HTML_OUTPUT);
QDir d(dname);
if (!d.exists() && !d.mkdir(dname))
{
@@ -997,7 +1067,7 @@ void HtmlGenerator::writeTabData()
mgr.copyResource("nav_h.lum",dname);
mgr.copyResource("nav_f.lum",dname);
mgr.copyResource("bc_s.luma",dname);
- mgr.copyResource("doxygen.luma",dname);
+ mgr.copyResource("doxygen.svg",dname);
mgr.copyResource("closed.luma",dname);
mgr.copyResource("open.luma",dname);
mgr.copyResource("bdwn.luma",dname);
@@ -1013,32 +1083,32 @@ void HtmlGenerator::writeTabData()
mgr.copyResource("nav_g.png",dname);
}
-void HtmlGenerator::writeSearchData(const char *dir)
+void HtmlGenerator::writeSearchData(const char *dname)
{
- static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
- //writeImgData(dir,serverBasedSearch ? search_server_data : search_client_data);
+ bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
+ //writeImgData(dname,serverBasedSearch ? search_server_data : search_client_data);
ResourceMgr &mgr = ResourceMgr::instance();
- mgr.copyResource("search_l.png",dir);
+ mgr.copyResource("search_l.png",dname);
Doxygen::indexList->addImageFile("search/search_l.png");
- mgr.copyResource("search_m.png",dir);
+ mgr.copyResource("search_m.png",dname);
Doxygen::indexList->addImageFile("search/search_m.png");
- mgr.copyResource("search_r.png",dir);
+ mgr.copyResource("search_r.png",dname);
Doxygen::indexList->addImageFile("search/search_r.png");
if (serverBasedSearch)
{
- mgr.copyResource("mag.png",dir);
- Doxygen::indexList->addImageFile("search/mag.png");
+ mgr.copyResource("mag.svg",dname);
+ Doxygen::indexList->addImageFile("search/mag.svg");
}
else
{
- mgr.copyResource("close.png",dir);
- Doxygen::indexList->addImageFile("search/close.png");
- mgr.copyResource("mag_sel.png",dir);
- Doxygen::indexList->addImageFile("search/mag_sel.png");
+ mgr.copyResource("close.svg",dname);
+ Doxygen::indexList->addImageFile("search/close.svg");
+ mgr.copyResource("mag_sel.svg",dname);
+ Doxygen::indexList->addImageFile("search/mag_sel.svg");
}
- QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
+ QCString searchDirName = dname;
QFile f(searchDirName+"/search.css");
if (f.open(IO_WriteOnly))
{
@@ -1056,7 +1126,7 @@ void HtmlGenerator::writeSearchData(const char *dir)
{
searchCss = mgr.getAsString("search.css");
}
- searchCss = substitute(replaceColorMarkers(searchCss),"$doxygenversion",getVersion());
+ searchCss = substitute(replaceColorMarkers(searchCss),"$doxygenversion",getDoxygenVersion());
t << searchCss;
Doxygen::indexList->addStyleSheetFile("search/search.css");
}
@@ -1065,25 +1135,27 @@ void HtmlGenerator::writeSearchData(const char *dir)
void HtmlGenerator::writeStyleSheetFile(QFile &file)
{
FTextStream t(&file);
- t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",getVersion()));
+ t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",getDoxygenVersion()));
}
void HtmlGenerator::writeHeaderFile(QFile &file, const char * /*cssname*/)
{
FTextStream t(&file);
- t << "<!-- HTML header for doxygen " << getVersion() << "-->" << endl;
+ t << "<!-- HTML header for doxygen " << getDoxygenVersion() << "-->" << endl;
t << ResourceMgr::instance().getAsString("header.html");
}
void HtmlGenerator::writeFooterFile(QFile &file)
{
FTextStream t(&file);
- t << "<!-- HTML footer for doxygen " << getVersion() << "-->" << endl;
+ t << "<!-- HTML footer for doxygen " << getDoxygenVersion() << "-->" << endl;
t << ResourceMgr::instance().getAsString("footer.html");
}
+static std::mutex g_indexLock;
+
void HtmlGenerator::startFile(const char *name,const char *,
- const char *title)
+ const char *title,int id)
{
//printf("HtmlGenerator::startFile(%s)\n",name);
m_relPath = relativePathToRoot(name);
@@ -1091,23 +1163,27 @@ void HtmlGenerator::startFile(const char *name,const char *,
m_lastTitle=title;
startPlainFile(fileName);
+ m_codeGen.setId(id);
m_codeGen.setTextStream(t);
m_codeGen.setRelativePath(m_relPath);
- Doxygen::indexList->addIndexFile(fileName);
+ {
+ std::lock_guard<std::mutex> lock(g_indexLock);
+ Doxygen::indexList->addIndexFile(fileName);
+ }
m_lastFile = fileName;
t << substituteHtmlKeywords(g_header,convertToHtml(filterTitle(title)),m_relPath);
t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
- << getVersion() << " -->" << endl;
- //static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
- static bool searchEngine = Config_getBool(SEARCHENGINE);
+ << getDoxygenVersion() << " -->" << endl;
+ //bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
+ bool searchEngine = Config_getBool(SEARCHENGINE);
if (searchEngine /*&& !generateTreeView*/)
{
t << "<script type=\"text/javascript\">\n";
t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */\n";
t << "var searchBox = new SearchBox(\"searchBox\", \""
- << m_relPath<< "search\",false,'" << theTranslator->trSearch() << "');\n";
+ << m_relPath<< "search\",false,'" << theTranslator->trSearch() << "','" << Doxygen::htmlFileExtension << "');\n";
t << "/* @license-end */\n";
t << "</script>\n";
}
@@ -1117,8 +1193,8 @@ void HtmlGenerator::startFile(const char *name,const char *,
void HtmlGenerator::writeSearchInfo(FTextStream &t,const QCString &)
{
- static bool searchEngine = Config_getBool(SEARCHENGINE);
- static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
+ bool searchEngine = Config_getBool(SEARCHENGINE);
+ bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
if (searchEngine && !serverBasedSearch)
{
t << "<!-- window showing the filter options -->\n";
@@ -1146,7 +1222,7 @@ void HtmlGenerator::writeSearchInfo()
QCString HtmlGenerator::writeLogoAsString(const char *path)
{
- static bool timeStamp = Config_getBool(HTML_TIMESTAMP);
+ bool timeStamp = Config_getBool(HTML_TIMESTAMP);
QCString result;
if (timeStamp)
{
@@ -1159,11 +1235,11 @@ QCString HtmlGenerator::writeLogoAsString(const char *path)
{
result += theTranslator->trGeneratedBy();
}
- result += "&#160;\n<a href=\"http://www.doxygen.org/index.html\">\n"
+ result += "&#160;\n<a href=\"https://www.doxygen.org/index.html\">\n"
"<img class=\"footer\" src=\"";
result += path;
- result += "doxygen.png\" alt=\"doxygen\"/></a> ";
- result += getVersion();
+ result += "doxygen.svg\" width=\"104\" height=\"31\" alt=\"doxygen\"/></a> ";
+ result += getDoxygenVersion();
result += " ";
return result;
}
@@ -1181,9 +1257,6 @@ void HtmlGenerator::writePageFooter(FTextStream &t,const QCString &lastTitle,
void HtmlGenerator::writeFooter(const char *navPath)
{
- // Currently only tooltips in HTML
- TooltipManager::instance()->writeTooltips(m_codeGen);
-
writePageFooter(t,m_lastTitle,m_relPath,navPath);
}
@@ -1216,7 +1289,7 @@ void HtmlGenerator::writeStyleInfo(int part)
//t << "H1 { text-align: center; border-width: thin none thin none;" << endl;
//t << " border-style : double; border-color : blue; padding-left : 1em; padding-right : 1em }" << endl;
- t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",getVersion()));
+ t << replaceColorMarkers(substitute(ResourceMgr::instance().getAsString("doxygen.css"),"$doxygenversion",getDoxygenVersion()));
endPlainFile();
Doxygen::indexList->addStyleSheetFile("doxygen.css");
}
@@ -1239,10 +1312,10 @@ void HtmlGenerator::writeStyleInfo(int part)
}
Doxygen::indexList->addStyleSheetFile(cssfi.fileName().utf8());
}
- static QStrList extraCssFile = Config_getList(HTML_EXTRA_STYLESHEET);
- for (uint i=0; i<extraCssFile.count(); ++i)
+ const StringVector &extraCssFiles = Config_getList(HTML_EXTRA_STYLESHEET);
+ for (const auto &extraCss : extraCssFiles)
{
- QCString fileName(extraCssFile.at(i));
+ QCString fileName = extraCss.c_str();
if (!fileName.isEmpty())
{
QFileInfo fi(fileName);
@@ -1390,7 +1463,7 @@ void HtmlGenerator::endTextLink()
void HtmlGenerator::startHtmlLink(const char *url)
{
- static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
+ bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
t << "<a ";
if (generateTreeView) t << "target=\"top\" ";
t << "href=\"";
@@ -1435,29 +1508,29 @@ void HtmlGenerator::endGroupHeader(int extraIndentLevel)
}
}
-void HtmlGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type)
+void HtmlGenerator::startSection(const char *lab,const char *,SectionType type)
{
switch(type)
{
- case SectionInfo::Page: t << "\n\n<h1>"; break;
- case SectionInfo::Section: t << "\n\n<h2>"; break;
- case SectionInfo::Subsection: t << "\n\n<h3>"; break;
- case SectionInfo::Subsubsection: t << "\n\n<h4>"; break;
- case SectionInfo::Paragraph: t << "\n\n<h5>"; break;
+ case SectionType::Page: t << "\n\n<h1>"; break;
+ case SectionType::Section: t << "\n\n<h2>"; break;
+ case SectionType::Subsection: t << "\n\n<h3>"; break;
+ case SectionType::Subsubsection: t << "\n\n<h4>"; break;
+ case SectionType::Paragraph: t << "\n\n<h5>"; break;
default: ASSERT(0); break;
}
t << "<a id=\"" << lab << "\"></a>";
}
-void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type)
+void HtmlGenerator::endSection(const char *,SectionType type)
{
switch(type)
{
- case SectionInfo::Page: t << "</h1>"; break;
- case SectionInfo::Section: t << "</h2>"; break;
- case SectionInfo::Subsection: t << "</h3>"; break;
- case SectionInfo::Subsubsection: t << "</h4>"; break;
- case SectionInfo::Paragraph: t << "</h5>"; break;
+ case SectionType::Page: t << "</h1>"; break;
+ case SectionType::Section: t << "</h2>"; break;
+ case SectionType::Subsection: t << "</h3>"; break;
+ case SectionType::Subsubsection: t << "</h4>"; break;
+ case SectionType::Paragraph: t << "</h5>"; break;
default: ASSERT(0); break;
}
}
@@ -1488,6 +1561,10 @@ void HtmlGenerator::docify(const char *str,bool inHtmlComment)
{ t << "&lt;"; p++; }
else if (*p=='>')
{ t << "&gt;"; p++; }
+ else if (*p=='(')
+ { t << "\\&zwj;("; p++; }
+ else if (*p==')')
+ { t << "\\&zwj;)"; p++; }
else
t << "\\";
break;
@@ -1511,7 +1588,7 @@ static void startSectionHeader(FTextStream &t,
const QCString &relPath,int sectionCount)
{
//t << "<!-- startSectionHeader -->";
- static bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
+ bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
if (dynamicSections)
{
t << "<div id=\"dynsection-" << sectionCount << "\" "
@@ -1536,7 +1613,7 @@ static void endSectionHeader(FTextStream &t)
static void startSectionSummary(FTextStream &t,int sectionCount)
{
//t << "<!-- startSectionSummary -->";
- static bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
+ bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
if (dynamicSections)
{
t << "<div id=\"dynsection-" << sectionCount << "-summary\" "
@@ -1548,7 +1625,7 @@ static void startSectionSummary(FTextStream &t,int sectionCount)
static void endSectionSummary(FTextStream &t)
{
//t << "<!-- endSectionSummary -->";
- static bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
+ bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
if (dynamicSections)
{
t << "</div>" << endl;
@@ -1558,7 +1635,7 @@ static void endSectionSummary(FTextStream &t)
static void startSectionContent(FTextStream &t,int sectionCount)
{
//t << "<!-- startSectionContent -->";
- static bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
+ bool dynamicSections = Config_getBool(HTML_DYNAMIC_SECTIONS);
if (dynamicSections)
{
t << "<div id=\"dynsection-" << sectionCount << "-content\" "
@@ -1594,7 +1671,7 @@ void HtmlGenerator::endClassDiagram(const ClassDiagram &d,
startSectionSummary(t,m_sectionCount);
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- d.writeImage(tt,m_dir,m_relPath,fileName);
+ d.writeImage(tt,dir(),m_relPath,fileName);
if (!result.isEmpty())
{
t << " <div class=\"center\">" << endl;
@@ -1977,7 +2054,7 @@ void HtmlGenerator::endDotGraph(DotClassGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,GOF_BITMAP,EOF_Html,m_dir,m_fileName,m_relPath,TRUE,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir(),fileName(),m_relPath,TRUE,TRUE,m_sectionCount);
if (generateLegend && !umlLook)
{
t << "<center><span class=\"legend\">[";
@@ -2003,7 +2080,7 @@ void HtmlGenerator::endInclDepGraph(DotInclDepGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,GOF_BITMAP,EOF_Html,m_dir,m_fileName,m_relPath,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir(),fileName(),m_relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
@@ -2021,7 +2098,7 @@ void HtmlGenerator::endGroupCollaboration(DotGroupCollaboration &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,GOF_BITMAP,EOF_Html,m_dir,m_fileName,m_relPath,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir(),fileName(),m_relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
@@ -2039,7 +2116,7 @@ void HtmlGenerator::endCallGraph(DotCallGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,GOF_BITMAP,EOF_Html,m_dir,m_fileName,m_relPath,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir(),fileName(),m_relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
@@ -2057,7 +2134,7 @@ void HtmlGenerator::endDirDepGraph(DotDirDeps &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,GOF_BITMAP,EOF_Html,m_dir,m_fileName,m_relPath,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir(),fileName(),m_relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
@@ -2065,7 +2142,7 @@ void HtmlGenerator::endDirDepGraph(DotDirDeps &g)
void HtmlGenerator::writeGraphicalHierarchy(DotGfxHierarchyTable &g)
{
- g.writeGraph(t,m_dir,m_fileName);
+ g.writeGraph(t,dir(),fileName());
}
void HtmlGenerator::startMemberGroupHeader(bool)
@@ -2187,8 +2264,9 @@ void HtmlGenerator::endParamList()
t << "</dl>";
}
-void HtmlGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *)
+void HtmlGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *,int id)
{
+ m_codeGen.setId(id);
HtmlDocVisitor *visitor = new HtmlDocVisitor(t,m_codeGen,ctx);
n->accept(visitor);
delete visitor;
@@ -2252,8 +2330,8 @@ static void endQuickIndexItem(FTextStream &t,const char *l)
static bool quickLinkVisible(LayoutNavEntry::Kind kind)
{
- static bool showFiles = Config_getBool(SHOW_FILES);
- static bool showNamespaces = Config_getBool(SHOW_NAMESPACES);
+ bool showFiles = Config_getBool(SHOW_FILES);
+ bool showNamespaces = Config_getBool(SHOW_NAMESPACES);
switch (kind)
{
case LayoutNavEntry::MainPage: return TRUE;
@@ -2272,7 +2350,7 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind)
case LayoutNavEntry::Files: return documentedHtmlFiles>0 && showFiles;
case LayoutNavEntry::FileList: return documentedHtmlFiles>0 && showFiles;
case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0;
- case LayoutNavEntry::Examples: return Doxygen::exampleSDict->count()>0;
+ case LayoutNavEntry::Examples: return !Doxygen::exampleLinkedMap->empty();
case LayoutNavEntry::Interfaces: return annotatedInterfaces>0;
case LayoutNavEntry::InterfaceList: return annotatedInterfaces>0;
case LayoutNavEntry::InterfaceIndex: return annotatedInterfaces>0;
@@ -2361,8 +2439,8 @@ static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath,
}
if (hlEntry->parent()==LayoutDocManager::instance().rootNavEntry()) // first row is special as it contains the search box
{
- static bool searchEngine = Config_getBool(SEARCHENGINE);
- static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
+ bool searchEngine = Config_getBool(SEARCHENGINE);
+ bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
if (searchEngine)
{
t << " <li>\n";
@@ -2399,9 +2477,9 @@ static void writeDefaultQuickLinks(FTextStream &t,bool compact,
const char *file,
const QCString &relPath)
{
- static bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
- static bool searchEngine = Config_getBool(SEARCHENGINE);
- static bool externalSearch = Config_getBool(EXTERNAL_SEARCH);
+ bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
+ bool searchEngine = Config_getBool(SEARCHENGINE);
+ bool externalSearch = Config_getBool(EXTERNAL_SEARCH);
LayoutNavEntry *root = LayoutDocManager::instance().rootNavEntry();
LayoutNavEntry::Kind kind = (LayoutNavEntry::Kind)-1;
LayoutNavEntry::Kind altKind = (LayoutNavEntry::Kind)-1; // fall back for the old layout file
@@ -2523,7 +2601,7 @@ void HtmlGenerator::endQuickIndices()
QCString HtmlGenerator::writeSplitBarAsString(const char *name,const char *relpath)
{
- static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
+ bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
QCString result;
// write split bar
if (generateTreeView)
@@ -2590,10 +2668,10 @@ void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli,const char
// PHP based search script
void HtmlGenerator::writeSearchPage()
{
- static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
- static bool disableIndex = Config_getBool(DISABLE_INDEX);
- static QCString projectName = Config_getString(PROJECT_NAME);
- static QCString htmlOutput = Config_getString(HTML_OUTPUT);
+ bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
+ bool disableIndex = Config_getBool(DISABLE_INDEX);
+ QCString projectName = Config_getString(PROJECT_NAME);
+ QCString htmlOutput = Config_getString(HTML_OUTPUT);
// OPENSEARCH_PROVIDER {
QCString configFileName = htmlOutput+"/search_config.php";
@@ -2634,11 +2712,11 @@ void HtmlGenerator::writeSearchPage()
t << substituteHtmlKeywords(g_header,"Search","");
t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
- << getVersion() << " -->" << endl;
+ << getDoxygenVersion() << " -->" << endl;
t << "<script type=\"text/javascript\">\n";
t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */\n";
t << "var searchBox = new SearchBox(\"searchBox\", \""
- << "search\",false,'" << theTranslator->trSearch() << "');\n";
+ << "search\",false,'" << theTranslator->trSearch() << "','" << Doxygen::htmlFileExtension << "');\n";
t << "/* @license-end */\n";
t << "</script>\n";
if (!Config_getBool(DISABLE_INDEX))
@@ -2678,9 +2756,9 @@ void HtmlGenerator::writeSearchPage()
void HtmlGenerator::writeExternalSearchPage()
{
- static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
- static bool disableIndex = Config_getBool(DISABLE_INDEX);
- QCString fileName = Config_getString(HTML_OUTPUT)+"/search"+Doxygen::htmlFileExtension;
+ bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
+ QCString dname = Config_getString(HTML_OUTPUT);
+ QCString fileName = dname+"/search"+Doxygen::htmlFileExtension;
QFile f(fileName);
if (f.open(IO_WriteOnly))
{
@@ -2688,11 +2766,11 @@ void HtmlGenerator::writeExternalSearchPage()
t << substituteHtmlKeywords(g_header,"Search","");
t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
- << getVersion() << " -->" << endl;
+ << getDoxygenVersion() << " -->" << endl;
t << "<script type=\"text/javascript\">\n";
t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */\n";
t << "var searchBox = new SearchBox(\"searchBox\", \""
- << "search\",false,'" << theTranslator->trSearch() << "');\n";
+ << "search\",false,'" << theTranslator->trSearch() << "','" << Doxygen::htmlFileExtension << "');\n";
t << "/* @license-end */\n";
t << "</script>\n";
if (!Config_getBool(DISABLE_INDEX))
@@ -2730,7 +2808,7 @@ void HtmlGenerator::writeExternalSearchPage()
writePageFooter(t,"Search","","");
}
- QCString scriptName = Config_getString(HTML_OUTPUT)+"/search/search.js";
+ QCString scriptName = dname+"/search/search.js";
QFile sf(scriptName);
if (sf.open(IO_WriteOnly))
{
@@ -2743,11 +2821,10 @@ void HtmlGenerator::writeExternalSearchPage()
t << "var tagMap = {" << endl;
bool first=TRUE;
// add search mappings
- QStrList &extraSearchMappings = Config_getList(EXTRA_SEARCH_MAPPINGS);
- char *ml=extraSearchMappings.first();
- while (ml)
+ const StringVector &extraSearchMappings = Config_getList(EXTRA_SEARCH_MAPPINGS);
+ for (const auto &ml : extraSearchMappings)
{
- QCString mapLine = ml;
+ QCString mapLine = ml.c_str();
int eqPos = mapLine.find('=');
if (eqPos!=-1) // tag command contains a destination
{
@@ -2760,7 +2837,6 @@ void HtmlGenerator::writeExternalSearchPage()
first=FALSE;
}
}
- ml=extraSearchMappings.next();
}
if (!first) t << endl;
t << "};" << endl << endl;
@@ -2827,19 +2903,6 @@ void HtmlGenerator::endConstraintList()
t << "</div>" << endl;
}
-void HtmlGenerator::startCodeFragment()
-{
- t << PREFRAG_START;
-}
-
-void HtmlGenerator::endCodeFragment()
-{
- //endCodeLine checks is there is still an open code line, if so closes it.
- endCodeLine();
-
- t << PREFRAG_END;
-}
-
void HtmlGenerator::lineBreak(const char *style)
{
if (style)
diff --git a/src/htmlgen.h b/src/htmlgen.h
index fe84061..659a69e 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -21,11 +19,6 @@
#include "outputgen.h"
#include "ftextstream.h"
-//#define PREFRAG_START "<div class=\"fragment\"><pre class=\"fragment\">"
-//#define PREFRAG_END "</pre></div>"
-#define PREFRAG_START "<div class=\"fragment\">"
-#define PREFRAG_END "</div><!-- fragment -->"
-
class QFile;
class HtmlCodeGenerator : public CodeOutputInterface
@@ -33,13 +26,15 @@ class HtmlCodeGenerator : public CodeOutputInterface
public:
HtmlCodeGenerator(FTextStream &t,const QCString &relPath);
HtmlCodeGenerator();
+ int id() const { return m_id; }
+ void setId(int id) { m_id = id; }
void setTextStream(FTextStream &t);
void setRelativePath(const QCString &path);
void codify(const char *text);
void writeCodeLink(const char *ref,const char *file,
const char *anchor,const char *name,
const char *tooltip);
- void writeTooltip(const char *id,
+ void writeTooltip(const char *id,
const DocLinkInfo &docInfo,
const char *decl,
const char *desc,
@@ -54,6 +49,8 @@ class HtmlCodeGenerator : public CodeOutputInterface
void writeCodeAnchor(const char *anchor);
void setCurrentDoc(const Definition *,const char *,bool) {}
void addWord(const char *,bool) {}
+ void startCodeFragment(const char *style);
+ void endCodeFragment(const char *);
private:
void _writeCodeLink(const char *className,
@@ -61,10 +58,12 @@ class HtmlCodeGenerator : public CodeOutputInterface
const char *anchor,const char *name,
const char *tooltip);
void docify(const char *str);
- bool m_streamSet;
+ bool m_streamSet = false;
FTextStream m_t;
- int m_col;
+ int m_col = 0;
QCString m_relPath;
+ bool m_lineOpen = false;
+ int m_id = 0;
};
/** Generator for HTML output */
@@ -72,7 +71,12 @@ class HtmlGenerator : public OutputGenerator
{
public:
HtmlGenerator();
+ HtmlGenerator &operator=(const HtmlGenerator &g);
+ HtmlGenerator(const HtmlGenerator &g);
virtual ~HtmlGenerator();
+ virtual std::unique_ptr<OutputGenerator> clone() const;
+
+ virtual OutputType type() const { return Html; }
static void init();
static void writeStyleSheetFile(QFile &f);
static void writeHeaderFile(QFile &f, const char *cssname);
@@ -84,18 +88,9 @@ class HtmlGenerator : public OutputGenerator
static void writeExternalSearchPage();
static QCString writeLogoAsString(const char *path);
static QCString writeSplitBarAsString(const char *name,const char *relpath);
-
- void enable()
- { if (m_genStack->top()) m_active=*m_genStack->top(); else m_active=TRUE; }
- void disable() { m_active=FALSE; }
- void enableIf(OutputType o) { if (o==Html) enable(); }
- void disableIf(OutputType o) { if (o==Html) disable(); }
- void disableIfNot(OutputType o) { if (o!=Html) disable(); }
- bool isEnabled(OutputType o) { return (o==Html && m_active); }
- OutputGenerator *get(OutputType o) { return (o==Html) ? this : 0; }
// ---- CodeOutputInterface
- void codify(const char *text)
+ void codify(const char *text)
{ m_codeGen.codify(text); }
void writeCodeLink(const char *ref,const char *file,
const char *anchor,const char *name,
@@ -111,19 +106,23 @@ class HtmlGenerator : public OutputGenerator
{ m_codeGen.startCodeLine(hasLineNumbers); }
void endCodeLine()
{ m_codeGen.endCodeLine(); }
- void startFontClass(const char *s)
+ void startFontClass(const char *s)
{ m_codeGen.startFontClass(s); }
- void endFontClass()
+ void endFontClass()
{ m_codeGen.endFontClass(); }
- void writeCodeAnchor(const char *anchor)
+ void writeCodeAnchor(const char *anchor)
{ m_codeGen.writeCodeAnchor(anchor); }
+ void startCodeFragment(const char *style)
+ { m_codeGen.startCodeFragment(style); }
+ void endCodeFragment(const char *style)
+ { m_codeGen.endCodeFragment(style); }
// ---------------------------
void setCurrentDoc(const Definition *context,const char *anchor,bool isSourceFile);
void addWord(const char *word,bool hiPriority);
- void writeDoc(DocNode *,const Definition *,const MemberDef *);
+ void writeDoc(DocNode *,const Definition *,const MemberDef *,int id);
- void startFile(const char *name,const char *manName,const char *title);
+ void startFile(const char *name,const char *manName,const char *title,int id);
void writeFooter(const char *navPath);
void endFile();
void clearBuffer();
@@ -139,7 +138,7 @@ class HtmlGenerator : public OutputGenerator
void endTitleHead(const char *,const char *);
void startTitle() { t << "<div class=\"title\">"; }
void endTitle() { t << "</div>"; }
-
+
void startParagraph(const char *classDef);
void endParagraph();
void writeString(const char *text);
@@ -210,10 +209,8 @@ class HtmlGenerator : public OutputGenerator
const char *title,const char *name);
void writeRuler() { t << "<hr/>"; }
- void writeAnchor(const char *,const char *name)
+ void writeAnchor(const char *,const char *name)
{ t << "<a name=\"" << name <<"\" id=\"" << name << "\"></a>"; }
- void startCodeFragment();
- void endCodeFragment();
void startEmphasis() { t << "<em>"; }
void endEmphasis() { t << "</em>"; }
void startBold() { t << "<b>"; }
@@ -226,10 +223,10 @@ class HtmlGenerator : public OutputGenerator
void endDescForItem() { t << "</dd>\n"; }
void lineBreak(const char *style);
void writeChar(char c);
- void startMemberDoc(const char *clName, const char *memName,
- const char *anchor, const char *title,
+ void startMemberDoc(const char *clName, const char *memName,
+ const char *anchor, const char *title,
int memCount, int memTotal, bool showInline);
- void endMemberDoc(bool);
+ void endMemberDoc(bool);
void startDoxyAnchor(const char *fName,const char *manName,
const char *anchor,const char *name,
const char *args);
@@ -250,8 +247,8 @@ class HtmlGenerator : public OutputGenerator
void endExamples();
void startParamList(ParamListTypes,const char *);
void endParamList();
- void startSection(const char *,const char *,SectionInfo::SectionType);
- void endSection(const char *,SectionInfo::SectionType);
+ void startSection(const char *,const char *,SectionType);
+ void endSection(const char *,SectionType);
void addIndexItem(const char *,const char *);
void startIndent();
void endIndent();
@@ -294,9 +291,9 @@ class HtmlGenerator : public OutputGenerator
void endDirDepGraph(DotDirDeps &g);
void writeGraphicalHierarchy(DotGfxHierarchyTable &g);
- void startTextBlock(bool)
+ void startTextBlock(bool)
{ t << "<div class=\"textblock\">"; }
- void endTextBlock(bool)
+ void endTextBlock(bool)
{ t << "</div>"; }
void lastIndexPage() {}
@@ -334,9 +331,6 @@ class HtmlGenerator : public OutputGenerator
void writeLabel(const char *l,bool isLast);
void endLabels();
-
- //static void generateSectionImages();
-
private:
static void writePageFooter(FTextStream &t,const QCString &,const QCString &,const QCString &);
QCString m_lastTitle;
@@ -344,11 +338,8 @@ class HtmlGenerator : public OutputGenerator
QCString m_relPath;
void docify(const char *text,bool inHtmlComment);
- HtmlGenerator &operator=(const HtmlGenerator &g);
- HtmlGenerator(const HtmlGenerator &g);
-
- int m_sectionCount;
- bool m_emptySection;
+ int m_sectionCount = 0;
+ bool m_emptySection = false;
HtmlCodeGenerator m_codeGen;
};
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
index 066e6f7..af511bb 100644
--- a/src/htmlhelp.cpp
+++ b/src/htmlhelp.cpp
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -17,15 +15,14 @@
* Harm van der Heijden.
*/
+#include <algorithm>
+
#include <stdio.h>
#include <stdlib.h>
-#include <qlist.h>
-#include <qdict.h>
#include <qregexp.h>
#include <qfile.h>
+#include <qfileinfo.h>
-#include "qtextcodec.h"
-#include "sortdict.h"
#include "htmlhelp.h"
#include "config.h"
#include "message.h"
@@ -36,12 +33,75 @@
#include "memberdef.h"
#include "filedef.h"
#include "util.h"
+#include "linkedmap.h"
+
+//----------------------------------------------------------------------------
+
+/** Helper class to deal with recoding the UTF8 encoded text back to the native encoding
+ * specified by CHM_INDEX_ENCODING.
+ */
+class HtmlHelpRecoder
+{
+ public:
+ HtmlHelpRecoder() {}
+ ~HtmlHelpRecoder() { finalize(); }
+ HtmlHelpRecoder(const HtmlHelpRecoder &) = delete;
+ HtmlHelpRecoder &operator=(const HtmlHelpRecoder &) = delete;
+
+ void initialize()
+ {
+ const char *str = Config_getString(CHM_INDEX_ENCODING);
+ if (!str) str = "CP1250"; // use safe and likely default
+ m_fromUtf8 = portable_iconv_open(str,"UTF-8");
+ if (m_fromUtf8==m_iconv_null)
+ {
+ term("unsupported character conversion for CHM_INDEX_ENCODING: '%s'->'UTF-8'\n", str);
+ }
+ }
+ void finalize()
+ {
+ if (m_fromUtf8!=m_iconv_null)
+ {
+ portable_iconv_close(m_fromUtf8);
+ m_fromUtf8 = m_iconv_null;
+ }
+ }
+
+ QCString recode(const QCString &s)
+ {
+ int iSize = s.length();
+ int oSize = iSize*4+1;
+ QCString output(oSize);
+ size_t iLeft = iSize;
+ size_t oLeft = oSize;
+ char *iPtr = s.rawData();
+ char *oPtr = output.rawData();
+ if (!portable_iconv(m_fromUtf8,&iPtr,&iLeft,&oPtr,&oLeft))
+ {
+ oSize -= (int)oLeft;
+ output.resize(oSize+1);
+ output.at(oSize)='\0';
+ return output;
+ }
+ else
+ {
+ return s;
+ }
+ }
+ private:
+ void *m_iconv_null = (void*)(-1);
+ void *m_fromUtf8 = m_iconv_null;
+
+};
//----------------------------------------------------------------------------
/** Class representing a field in the HTML help index. */
struct IndexField
{
+ IndexField(const char *k,const char *n,const char *u,const char *a,bool l,bool r) :
+ key(k), name(n), url(u), anchor(a), link(l), reversed(r) {}
+ QCString key;
QCString name;
QCString url;
QCString anchor;
@@ -49,50 +109,35 @@ struct IndexField
bool reversed;
};
-/** Sorted dictionary of IndexField objects. */
-class IndexFieldSDict : public SDict<IndexField>
-{
- public:
- IndexFieldSDict() : SDict<IndexField>(17) {}
- ~IndexFieldSDict() {}
- private:
- int compareValues(const IndexField *item1, const IndexField *item2) const
- {
- return qstricmp(item1->name,item2->name);
- }
-};
-
-/** A helper class for HtmlHelp that manages a two level index in
+/** A helper class for HtmlHelp that manages a two level index in
* alphabetical order.
*/
class HtmlHelpIndex
{
public:
- HtmlHelpIndex(HtmlHelp *help);
+ HtmlHelpIndex(HtmlHelpRecoder &recoder);
~HtmlHelpIndex();
- void addItem(const char *first,const char *second,
+ void addItem(const char *first,const char *second,
const char *url, const char *anchor,
bool hasLink,bool reversed);
void writeFields(FTextStream &t);
+ size_t size() const { return m_map.size(); }
private:
- IndexFieldSDict *dict;
- HtmlHelp *m_help;
+ LinkedMap<IndexField> m_map;
+ HtmlHelpRecoder &m_recoder;
};
/*! Constructs a new HtmlHelp index */
-HtmlHelpIndex::HtmlHelpIndex(HtmlHelp *help) : m_help(help)
+HtmlHelpIndex::HtmlHelpIndex(HtmlHelpRecoder &recoder) : m_recoder(recoder)
{
- dict = new IndexFieldSDict;
- dict->setAutoDelete(TRUE);
}
/*! Destroys the HtmlHelp index */
HtmlHelpIndex::~HtmlHelpIndex()
{
- delete dict;
}
-/*! Stores an item in the index if it is not already present.
+/*! Stores an item in the index if it is not already present.
* Items are stored in alphabetical order, by sorting on the
* concatenation of \a level1 and \a level2 (if present).
*
@@ -100,7 +145,7 @@ HtmlHelpIndex::~HtmlHelpIndex()
* \param level2 the string at level 2 in the index (or 0 if not applicable).
* \param url the url of the documentation (without .html extension).
* \param anchor the anchor of the documentation within the page.
- * \param hasLink if true, the url (without anchor) can be used in the
+ * \param hasLink if true, the url (without anchor) can be used in the
* level1 item, when writing the header of a list of level2 items.
* \param reversed TRUE if level1 is the member name and level2 the compound
* name.
@@ -109,30 +154,19 @@ void HtmlHelpIndex::addItem(const char *level1,const char *level2,
const char *url,const char *anchor,bool hasLink,
bool reversed)
{
- QCString key = level1;
+ QCString key = level1;
if (level2) key+= (QCString)"?" + level2;
if (key.find(QRegExp("@[0-9]+"))!=-1) // skip anonymous stuff
{
return;
}
- if (dict->find(key+anchor)==0) // new key
- {
- //printf(">>>>>>>>> HtmlHelpIndex::addItem(%s,%s,%s,%s)\n",
- // level1,level2,url,anchor);
- IndexField *f = new IndexField;
- f->name = key;
- f->url = url;
- f->anchor = anchor;
- f->link = hasLink;
- f->reversed = reversed;
- dict->append(key+anchor,f);
- }
+ m_map.add(key+anchor,key,url,anchor,hasLink,reversed);
}
static QCString field2URL(const IndexField *f,bool checkReversed)
{
QCString result = f->url + Doxygen::htmlFileExtension;
- if (!f->anchor.isEmpty() && (!checkReversed || f->reversed))
+ if (!f->anchor.isEmpty() && (!checkReversed || f->reversed))
{
// HTML Help needs colons in link anchors to be escaped in the .hhk file.
result+="#"+substitute(f->anchor,":","%3A");
@@ -163,31 +197,32 @@ static QCString field2URL(const IndexField *f,bool checkReversed)
* b2 -> link to url#anchor
* a3 -> link to url if hasLink==TRUE
* a4 -> link to url if hasLink==TRUE
- * b1 -> link to url#anchor
+ * b1 -> link to url#anchor
* </pre>
*/
void HtmlHelpIndex::writeFields(FTextStream &t)
{
- dict->sort();
- IndexFieldSDict::Iterator ifli(*dict);
- IndexField *f;
- QCString lastLevel1;
+ std::sort(std::begin(m_map),
+ std::end(m_map),
+ [](const auto &e1,const auto &e2) { return e1->name < e2->name; }
+ );
+ QCString prevLevel1;
bool level2Started=FALSE;
- for (;(f=ifli.current());++ifli)
+ for (auto it = std::begin(m_map); it!=std::end(m_map); ++it)
{
+ auto &f = *it;
QCString level1,level2;
int i;
if ((i=f->name.find('?'))!=-1)
{
level1 = f->name.left(i);
- level2 = f->name.right(f->name.length()-i-1);
+ level2 = f->name.right(f->name.length()-i-1);
}
else
{
- level1 = f->name.copy();
+ level1 = f->name;
}
- //if (level1!=lastLevel1)
{ // finish old list at level 2
if (level2Started) t << " </UL>" << endl;
level2Started=FALSE;
@@ -200,24 +235,25 @@ void HtmlHelpIndex::writeFields(FTextStream &t)
// a2, b2
// a2, b3
QCString nextLevel1;
- IndexField* fnext = ++ifli;
- if (fnext)
+ auto it_next = std::next(it);
+ if (it_next!=std::end(m_map))
{
+ auto &fnext = *it_next;
nextLevel1 = fnext->name.left(fnext->name.find('?'));
- --ifli;
}
- if (level1 != nextLevel1)
+ if (!(level1 == prevLevel1 || level1 == nextLevel1))
{
level2 = "";
}
+ prevLevel1 = level1;
// </Antony>
if (level2.isEmpty())
{
t << " <LI><OBJECT type=\"text/sitemap\">";
- t << "<param name=\"Local\" value=\"" << field2URL(f,FALSE);
+ t << "<param name=\"Local\" value=\"" << field2URL(f.get(),FALSE);
t << "\">";
- t << "<param name=\"Name\" value=\"" << m_help->recode(level1) << "\">"
+ t << "<param name=\"Name\" value=\"" << m_recoder.recode(level1) << "\">"
"</OBJECT>\n";
}
else
@@ -225,16 +261,16 @@ void HtmlHelpIndex::writeFields(FTextStream &t)
if (f->link)
{
t << " <LI><OBJECT type=\"text/sitemap\">";
- t << "<param name=\"Local\" value=\"" << field2URL(f,TRUE);
+ t << "<param name=\"Local\" value=\"" << field2URL(f.get(),TRUE);
t << "\">";
- t << "<param name=\"Name\" value=\"" << m_help->recode(level1) << "\">"
+ t << "<param name=\"Name\" value=\"" << m_recoder.recode(level1) << "\">"
"</OBJECT>\n";
}
else
{
t << " <LI><OBJECT type=\"text/sitemap\">";
- t << "<param name=\"See Also\" value=\"" << m_help->recode(level1) << "\">";
- t << "<param name=\"Name\" value=\"" << m_help->recode(level1) << "\">"
+ t << "<param name=\"See Also\" value=\"" << m_recoder.recode(level1) << "\">";
+ t << "<param name=\"Name\" value=\"" << m_recoder.recode(level1) << "\">"
"</OBJECT>\n";
}
}
@@ -252,195 +288,185 @@ void HtmlHelpIndex::writeFields(FTextStream &t)
if (level2Started)
{
t << " <LI><OBJECT type=\"text/sitemap\">";
- t << "<param name=\"Local\" value=\"" << field2URL(f,FALSE);
+ t << "<param name=\"Local\" value=\"" << field2URL(f.get(),FALSE);
t << "\">";
- t << "<param name=\"Name\" value=\"" << m_help->recode(level2) << "\">"
+ t << "<param name=\"Name\" value=\"" << m_recoder.recode(level2) << "\">"
"</OBJECT>\n";
}
- lastLevel1 = level1.copy();
- }
+ }
if (level2Started) t << " </UL>" << endl;
}
//----------------------------------------------------------------------------
+//
+class HtmlHelp::Private
+{
+ public:
+ Private() : index(recoder) {}
+ void createProjectFile();
+ QFile cf;
+ QFile kf;
+ FTextStream cts,kts;
+ bool ctsItemPresent = false;
+ int dc = 0;
+ StringSet indexFiles;
+ StringSet imageFiles;
+ HtmlHelpIndex index;
+ HtmlHelpRecoder recoder;
+};
-HtmlHelp *HtmlHelp::theInstance = 0;
-/*! Constructs an html object.
- * The object has to be \link initialize() initialized\endlink before it can
+/*! Constructs an html object.
+ * The object has to be \link initialize() initialized\endlink before it can
* be used.
*/
-HtmlHelp::HtmlHelp() : indexFileDict(1009)
+HtmlHelp::HtmlHelp() : p(std::make_unique<Private>())
{
- /* initial depth */
- dc = 0;
- cf = kf = 0;
- index = new HtmlHelpIndex(this);
- m_fromUtf8 = (void *)(-1);
}
HtmlHelp::~HtmlHelp()
{
- if (m_fromUtf8!=(void *)(-1)) portable_iconv_close(m_fromUtf8);
- delete index;
-}
-#if 0
-/*! return a reference to the one and only instance of this class.
- */
-HtmlHelp *HtmlHelp::getInstance()
-{
- if (theInstance==0) theInstance = new HtmlHelp;
- return theInstance;
}
-#endif
-static QDict<QCString> s_languageDict;
+/* language codes for Html help
+ 0x405 Czech
+ 0x406 Danish
+ 0x413 Dutch
+ 0xC09 English (Australia)
+ 0x809 English (Britain)
+ 0x1009 English (Canada)
+ 0x1809 English (Ireland)
+ 0x1409 English (New Zealand)
+ 0x1C09 English (South Africa)
+ 0x409 English (United States)
+ 0x40B Finnish
+ 0x40C French
+ 0x407 German
+ 0x408 Greece
+ 0x40E Hungarian
+ 0x410 Italian
+ 0x814 Norwegian
+ 0x415 Polish
+ 0x816 Portuguese(Portugal)
+ 0x416 Portuguese(Brazil)
+ 0x419 Russian
+ 0x80A Spanish(Mexico)
+ 0xC0A Spanish(Modern Sort)
+ 0x40A Spanish(Traditional Sort)
+ 0x41D Swedish
+ 0x41F Turkey
+ 0x411 Japanese
+ 0x412 Korean
+ 0x804 Chinese (PRC)
+ 0x404 Chinese (Taiwan)
+
+ New LCIDs:
+ 0x421 Indonesian
+ 0x41A Croatian
+ 0x418 Romanian
+ 0x424 Slovenian
+ 0x41B Slovak
+ 0x422 Ukrainian
+ 0x81A Serbian (Serbia, Latin)
+ 0x403 Catalan
+ 0x426 Latvian
+ 0x427 Lithuanian
+ 0x436 Afrikaans
+ 0x42A Vietnamese
+ 0x429 Persian (Iran)
+ 0xC01 Arabic (Egypt) - I don't know which version of arabic is used inside translator_ar.h ,
+ so I have chosen Egypt at random
+
+*/
+static StringUnorderedMap s_languageDict =
+{
+ { "czech", "0x405 Czech" },
+ { "danish", "0x406 Danish" },
+ { "dutch", "0x413 Dutch" },
+ { "finnish", "0x40B Finnish" },
+ { "french", "0x40C French" },
+ { "german", "0x407 German" },
+ { "greek", "0x408 Greece" },
+ { "hungarian", "0x40E Hungarian" },
+ { "italian", "0x410 Italian" },
+ { "norwegian", "0x814 Norwegian" },
+ { "polish", "0x415 Polish" },
+ { "portuguese", "0x816 Portuguese(Portugal)" },
+ { "brazilian", "0x416 Portuguese(Brazil)" },
+ { "russian", "0x419 Russian" },
+ { "spanish", "0x40A Spanish(Traditional Sort)" },
+ { "swedish", "0x41D Swedish" },
+ { "turkish", "0x41F Turkey" },
+ { "japanese", "0x411 Japanese" },
+ { "japanese-en", "0x411 Japanese" },
+ { "korean", "0x412 Korean" },
+ { "korean-en", "0x412 Korean" },
+ { "chinese", "0x804 Chinese (PRC)" },
+ { "chinese-traditional", "0x404 Chinese (Taiwan)" },
+ { "indonesian", "0x421 Indonesian" },
+ { "croatian", "0x41A Croatian" },
+ { "romanian", "0x418 Romanian" },
+ { "slovene", "0x424 Slovenian" },
+ { "slovak", "0x41B Slovak" },
+ { "ukrainian", "0x422 Ukrainian" },
+ { "serbian", "0x81A Serbian (Serbia, Latin)" },
+ { "catalan", "0x403 Catalan" },
+ { "lithuanian", "0x427 Lithuanian" },
+ { "afrikaans", "0x436 Afrikaans" },
+ { "vietnamese", "0x42A Vietnamese" },
+ { "persian", "0x429 Persian (Iran)" },
+ { "arabic", "0xC01 Arabic (Egypt)" },
+ { "latvian", "0x426 Latvian" },
+ { "macedonian", "0x042f Macedonian (Former Yugoslav Republic of Macedonia)" },
+ { "armenian", "0x42b Armenian" },
+ //Code for Esperanto should be as shown below but the htmlhelp compiler 1.3 does not support this
+ // (and no newer version is available).
+ //So do a fallback to the default language (see getLanguageString())
+ //{ "esperanto", "0x48f Esperanto" },
+ { "serbian-cyrillic", "0xC1A Serbian (Serbia, Cyrillic)" }
+};
/*! This will create a contents file (index.hhc) and a index file (index.hhk)
- * and write the header of those files.
+ * and write the header of those files.
* It also creates a project file (index.hhp)
* \sa finalize()
*/
void HtmlHelp::initialize()
{
- const char *str = Config_getString(CHM_INDEX_ENCODING);
- if (!str) str = "CP1250"; // use safe and likely default
- m_fromUtf8 = portable_iconv_open(str,"UTF-8");
- if (m_fromUtf8==(void *)(-1))
- {
- term("unsupported character conversion for CHM_INDEX_ENCODING: '%s'->'UTF-8'\n", str);
- }
+ p->recoder.initialize();
/* open the contents file */
QCString fName = Config_getString(HTML_OUTPUT) + "/index.hhc";
- cf = new QFile(fName);
- if (!cf->open(IO_WriteOnly))
+ p->cf.setName(fName);
+ if (!p->cf.open(IO_WriteOnly))
{
term("Could not open file %s for writing\n",fName.data());
}
/* Write the header of the contents file */
- cts.setDevice(cf);
- cts << "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n"
+ p->cts.setDevice(&p->cf);
+ p->cts << "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n"
"<HTML><HEAD></HEAD><BODY>\n"
"<OBJECT type=\"text/site properties\">\n"
"<param name=\"FrameName\" value=\"right\">\n"
"</OBJECT>\n"
"<UL>\n";
-
+
/* open the contents file */
fName = Config_getString(HTML_OUTPUT) + "/index.hhk";
- kf = new QFile(fName);
- if (!kf->open(IO_WriteOnly))
+ p->kf.setName(fName);
+ if (!p->kf.open(IO_WriteOnly))
{
term("Could not open file %s for writing\n",fName.data());
}
/* Write the header of the contents file */
- kts.setDevice(kf);
- kts << "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n"
+ p->kts.setDevice(&p->kf);
+ p->kts << "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n"
"<HTML><HEAD></HEAD><BODY>\n"
"<OBJECT type=\"text/site properties\">\n"
"<param name=\"FrameName\" value=\"right\">\n"
"</OBJECT>\n"
"<UL>\n";
- /* language codes for Html help
- 0x405 Czech
- 0x406 Danish
- 0x413 Dutch
- 0xC09 English (Australia)
- 0x809 English (Britain)
- 0x1009 English (Canada)
- 0x1809 English (Ireland)
- 0x1409 English (New Zealand)
- 0x1C09 English (South Africa)
- 0x409 English (United States)
- 0x40B Finnish
- 0x40C French
- 0x407 German
- 0x408 Greece
- 0x40E Hungarian
- 0x410 Italian
- 0x814 Norwegian
- 0x415 Polish
- 0x816 Portuguese(Portugal)
- 0x416 Portuguese(Brazil)
- 0x419 Russian
- 0x80A Spanish(Mexico)
- 0xC0A Spanish(Modern Sort)
- 0x40A Spanish(Traditional Sort)
- 0x41D Swedish
- 0x41F Turkey
- 0x411 Japanese
- 0x412 Korean
- 0x804 Chinese (PRC)
- 0x404 Chinese (Taiwan)
-
- New LCIDs:
- 0x421 Indonesian
- 0x41A Croatian
- 0x418 Romanian
- 0x424 Slovenian
- 0x41B Slovak
- 0x422 Ukrainian
- 0x81A Serbian (Serbia, Latin)
- 0x403 Catalan
- 0x426 Latvian
- 0x427 Lithuanian
- 0x436 Afrikaans
- 0x42A Vietnamese
- 0x429 Persian (Iran)
- 0xC01 Arabic (Egypt) - I don't know which version of arabic is used inside translator_ar.h ,
- so I have chosen Egypt at random
-
- */
- s_languageDict.setAutoDelete(TRUE);
- s_languageDict.clear();
- s_languageDict.insert("czech", new QCString("0x405 Czech"));
- s_languageDict.insert("danish", new QCString("0x406 Danish"));
- s_languageDict.insert("dutch", new QCString("0x413 Dutch"));
- s_languageDict.insert("finnish", new QCString("0x40B Finnish"));
- s_languageDict.insert("french", new QCString("0x40C French"));
- s_languageDict.insert("german", new QCString("0x407 German"));
- s_languageDict.insert("greek", new QCString("0x408 Greece"));
- s_languageDict.insert("hungarian", new QCString("0x40E Hungarian"));
- s_languageDict.insert("italian", new QCString("0x410 Italian"));
- s_languageDict.insert("norwegian", new QCString("0x814 Norwegian"));
- s_languageDict.insert("polish", new QCString("0x415 Polish"));
- s_languageDict.insert("portuguese", new QCString("0x816 Portuguese(Portugal)"));
- s_languageDict.insert("brazilian", new QCString("0x416 Portuguese(Brazil)"));
- s_languageDict.insert("russian", new QCString("0x419 Russian"));
- s_languageDict.insert("spanish", new QCString("0x40A Spanish(Traditional Sort)"));
- s_languageDict.insert("swedish", new QCString("0x41D Swedish"));
- s_languageDict.insert("turkish", new QCString("0x41F Turkey"));
- s_languageDict.insert("japanese", new QCString("0x411 Japanese"));
- s_languageDict.insert("japanese-en", new QCString("0x411 Japanese"));
- s_languageDict.insert("korean", new QCString("0x412 Korean"));
- s_languageDict.insert("korean-en", new QCString("0x412 Korean"));
- s_languageDict.insert("chinese", new QCString("0x804 Chinese (PRC)"));
- s_languageDict.insert("chinese-traditional", new QCString("0x404 Chinese (Taiwan)"));
-
- // new LCIDs
- s_languageDict.insert("indonesian", new QCString("0x412 Indonesian"));
- s_languageDict.insert("croatian", new QCString("0x41A Croatian"));
- s_languageDict.insert("romanian", new QCString("0x418 Romanian"));
- s_languageDict.insert("slovene", new QCString("0x424 Slovenian"));
- s_languageDict.insert("slovak", new QCString("0x41B Slovak"));
- s_languageDict.insert("ukrainian", new QCString("0x422 Ukrainian"));
- s_languageDict.insert("serbian", new QCString("0x81A Serbian (Serbia, Latin)"));
- s_languageDict.insert("catalan", new QCString("0x403 Catalan"));
- s_languageDict.insert("lithuanian", new QCString("0x427 Lithuanian"));
- s_languageDict.insert("afrikaans", new QCString("0x436 Afrikaans"));
- s_languageDict.insert("vietnamese", new QCString("0x42A Vietnamese"));
- s_languageDict.insert("persian", new QCString("0x429 Persian (Iran)"));
- s_languageDict.insert("arabic", new QCString("0xC01 Arabic (Egypt)"));
- s_languageDict.insert("latvian", new QCString("0x426 Latvian"));
- s_languageDict.insert("macedonian", new QCString("0x042f Macedonian (Former Yugoslav Republic of Macedonia)"));
- s_languageDict.insert("armenian", new QCString("0x42b Armenian"));
- //Code for Esperanto should be as shown below but the htmlhelp compiler 1.3 does not support this
- // (and no newer version is available).
- //So do a fallback to the default language (see getLanguageString())
- //s_languageDict.insert("esperanto", new QCString("0x48f Esperanto"));
- s_languageDict.insert("serbian-cyrillic", new QCString("0xC1A Serbian (Serbia, Cyrillic)"));
}
@@ -448,19 +474,19 @@ QCString HtmlHelp::getLanguageString()
{
if (!theTranslator->idLanguage().isEmpty())
{
- QCString *s = s_languageDict[theTranslator->idLanguage()];
- if (s)
+ auto it = s_languageDict.find(theTranslator->idLanguage().str());
+ if (it!=s_languageDict.end())
{
- return *s;
+ return it->second;
}
}
// default language
return "0x409 English (United States)";
}
-
-void HtmlHelp::createProjectFile()
+
+void HtmlHelp::Private::createProjectFile()
{
/* Write the project file */
QCString fName = Config_getString(HTML_OUTPUT) + "/index.hhp";
@@ -468,7 +494,13 @@ void HtmlHelp::createProjectFile()
if (f.open(IO_WriteOnly))
{
FTextStream t(&f);
-
+
+ const char *hhcFile = "\"index.hhc\"";
+ const char *hhkFile = "\"index.hhk\"";
+ bool hhkPresent = index.size()>0;
+ if (!ctsItemPresent) hhcFile = "";
+ if (!hhkPresent) hhkFile = "";
+
QCString indexName="index"+Doxygen::htmlFileExtension;
t << "[OPTIONS]\n";
if (!Config_getString(CHM_FILE).isEmpty())
@@ -476,16 +508,16 @@ void HtmlHelp::createProjectFile()
t << "Compiled file=" << Config_getString(CHM_FILE) << "\n";
}
t << "Compatibility=1.1\n"
- "Full-text search=Yes\n"
- "Contents file=index.hhc\n"
- "Default Window=main\n"
- "Default topic=" << indexName << "\n"
- "Index file=index.hhk\n"
- "Language=" << getLanguageString() << endl;
+ "Full-text search=Yes\n";
+ if (ctsItemPresent) t << "Contents file=index.hhc\n";
+ t << "Default Window=main\n"
+ "Default topic=" << indexName << "\n";
+ if (hhkPresent) t << "Index file=index.hhk\n";
+ t << "Language=" << getLanguageString() << endl;
if (Config_getBool(BINARY_TOC)) t << "Binary TOC=YES\n";
if (Config_getBool(GENERATE_CHI)) t << "Create CHI file=YES\n";
- t << "Title=" << recode(Config_getString(PROJECT_NAME)) << endl << endl;
-
+ t << "Title=" << recoder.recode(Config_getString(PROJECT_NAME)) << endl << endl;
+
t << "[WINDOWS]" << endl;
// NOTE: the 0x10387e number is a set of bits specifying the buttons
@@ -500,28 +532,25 @@ void HtmlHelp::createProjectFile()
// Value has been taken from htmlhelp.h file of the HTML Help Workshop
if (Config_getBool(BINARY_TOC))
{
- t << "main=\"" << recode(Config_getString(PROJECT_NAME)) << "\",\"index.hhc\","
- "\"index.hhk\",\"" << indexName << "\",\"" <<
+ t << "main=\"" << recoder.recode(Config_getString(PROJECT_NAME)) << "\"," << hhcFile << ","
+ << hhkFile << ",\"" << indexName << "\",\"" <<
indexName << "\",,,,,0x23520,,0x70387e,,,,,,,,0" << endl << endl;
}
else
{
- t << "main=\"" << recode(Config_getString(PROJECT_NAME)) << "\",\"index.hhc\","
- "\"index.hhk\",\"" << indexName << "\",\"" <<
+ t << "main=\"" << recoder.recode(Config_getString(PROJECT_NAME)) << "\"," << hhcFile << ","
+ << hhkFile << ",\"" << indexName << "\",\"" <<
indexName << "\",,,,,0x23520,,0x10387e,,,,,,,,0" << endl << endl;
}
-
+
t << "[FILES]" << endl;
- char *s = indexFiles.first();
- while (s)
+ for (auto &s : indexFiles)
{
- t << s << endl;
- s = indexFiles.next();
+ t << s.c_str() << endl;
}
- uint i;
- for (i=0;i<imageFiles.count();i++)
+ for (auto &s : imageFiles)
{
- t << imageFiles.at(i) << endl;
+ t << QFileInfo(s.c_str()).fileName().data() << endl;
}
f.close();
}
@@ -533,11 +562,7 @@ void HtmlHelp::createProjectFile()
void HtmlHelp::addIndexFile(const char *s)
{
- if (indexFileDict.find(s)==0)
- {
- indexFiles.append(s);
- indexFileDict.insert(s,(void *)0x8);
- }
+ p->indexFiles.insert(s);
}
/*! Finalizes the HTML help. This will finish and close the
@@ -547,36 +572,35 @@ void HtmlHelp::addIndexFile(const char *s)
void HtmlHelp::finalize()
{
// end the contents file
- cts << "</UL>\n";
- cts << "</BODY>\n";
- cts << "</HTML>\n";
- cts.unsetDevice();
- cf->close();
- delete cf;
-
- index->writeFields(kts);
-
+ p->cts << "</UL>\n";
+ p->cts << "</BODY>\n";
+ p->cts << "</HTML>\n";
+ p->cts.unsetDevice();
+ p->cf.close();
+
+ p->index.writeFields(p->kts);
+
// end the index file
- kts << "</UL>\n";
- kts << "</BODY>\n";
- kts << "</HTML>\n";
- kts.unsetDevice();
- kf->close();
- delete kf;
-
- createProjectFile();
- s_languageDict.clear();
+ p->kts << "</UL>\n";
+ p->kts << "</BODY>\n";
+ p->kts << "</HTML>\n";
+ p->kts.unsetDevice();
+ p->kf.close();
+
+ p->createProjectFile();
+
+ p->recoder.finalize();
}
-/*! Increase the level of the contents hierarchy.
+/*! Increase the level of the contents hierarchy.
* This will start a new unnumbered HTML list in contents file.
* \sa decContentsDepth()
*/
void HtmlHelp::incContentsDepth()
{
- int i; for (i=0;i<dc+1;i++) cts << " ";
- cts << "<UL>\n";
- ++dc;
+ int i; for (i=0;i<p->dc+1;i++) p->cts << " ";
+ p->cts << "<UL>\n";
+ ++p->dc;
}
/*! Decrease the level of the contents hierarchy.
@@ -585,31 +609,9 @@ void HtmlHelp::incContentsDepth()
*/
void HtmlHelp::decContentsDepth()
{
- int i; for (i=0;i<dc;i++) cts << " ";
- cts << "</UL>\n";
- --dc;
-}
-
-QCString HtmlHelp::recode(const QCString &s)
-{
- int iSize = s.length();
- int oSize = iSize*4+1;
- QCString output(oSize);
- size_t iLeft = iSize;
- size_t oLeft = oSize;
- char *iPtr = s.rawData();
- char *oPtr = output.rawData();
- if (!portable_iconv(m_fromUtf8,&iPtr,&iLeft,&oPtr,&oLeft))
- {
- oSize -= (int)oLeft;
- output.resize(oSize+1);
- output.at(oSize)='\0';
- return output;
- }
- else
- {
- return s;
- }
+ int i; for (i=0;i<p->dc;i++) p->cts << " ";
+ p->cts << "</UL>\n";
+ --p->dc;
}
/*! Add an list item to the contents file.
@@ -624,53 +626,54 @@ QCString HtmlHelp::recode(const QCString &s)
*/
void HtmlHelp::addContentsItem(bool isDir,
const char *name,
- const char * /*ref*/,
+ const char * /*ref*/,
const char *file,
const char *anchor,
bool /* separateIndex */,
bool /* addToNavIndex */,
const Definition * /* def */)
{
- // If we're using a binary toc then folders cannot have links.
+ // If we're using a binary toc then folders cannot have links.
// Tried this and I didn't see any problems, when not using
// the resetting of file and anchor the TOC works better
// (prev / next button)
- //if(Config_getBool(BINARY_TOC) && isDir)
+ //if(Config_getBool(BINARY_TOC) && isDir)
//{
//file = 0;
//anchor = 0;
//}
- int i; for (i=0;i<dc;i++) cts << " ";
- cts << "<LI><OBJECT type=\"text/sitemap\">";
- cts << "<param name=\"Name\" value=\"" << convertToHtml(recode(name),TRUE) << "\">";
+ p->ctsItemPresent = true;
+ int i; for (i=0;i<p->dc;i++) p->cts << " ";
+ p->cts << "<LI><OBJECT type=\"text/sitemap\">";
+ p->cts << "<param name=\"Name\" value=\"" << convertToHtml(p->recoder.recode(name),TRUE) << "\">";
if (file) // made file optional param - KPW
{
if (file && (file[0]=='!' || file[0]=='^')) // special markers for user defined URLs
{
- cts << "<param name=\"";
- if (file[0]=='^') cts << "URL"; else cts << "Local";
- cts << "\" value=\"";
- cts << &file[1];
+ p->cts << "<param name=\"";
+ if (file[0]=='^') p->cts << "URL"; else p->cts << "Local";
+ p->cts << "\" value=\"";
+ p->cts << &file[1];
}
else
{
- cts << "<param name=\"Local\" value=\"";
- cts << file << Doxygen::htmlFileExtension;
- if (anchor) cts << "#" << anchor;
+ p->cts << "<param name=\"Local\" value=\"";
+ p->cts << file << Doxygen::htmlFileExtension;
+ if (anchor) p->cts << "#" << anchor;
}
- cts << "\">";
+ p->cts << "\">";
}
- cts << "<param name=\"ImageNumber\" value=\"";
+ p->cts << "<param name=\"ImageNumber\" value=\"";
if (isDir) // added - KPW
{
- cts << (int)BOOK_CLOSED ;
+ p->cts << (int)BOOK_CLOSED ;
}
else
{
- cts << (int)TEXT;
+ p->cts << (int)TEXT;
}
- cts << "\">";
- cts << "</OBJECT>\n";
+ p->cts << "\">";
+ p->cts << "</OBJECT>\n";
}
@@ -696,18 +699,18 @@ void HtmlHelp::addIndexItem(const Definition *context,const MemberDef *md,
QCString contRef = separateMemberPages ? cfname : cfiname;
QCString memRef = cfname;
QCString anchor = sectionAnchor ? QCString(sectionAnchor) : md->anchor();
- index->addItem(level1,level2,contRef,anchor,TRUE,FALSE);
- index->addItem(level2,level1,memRef,anchor,TRUE,TRUE);
+ p->index.addItem(level1,level2,contRef,anchor,TRUE,FALSE);
+ p->index.addItem(level2,level1,memRef,anchor,TRUE,TRUE);
}
else if (context)
{
QCString level1 = word ? QCString(word) : context->name();
- index->addItem(level1,0,context->getOutputFileBase(),sectionAnchor,TRUE,FALSE);
+ p->index.addItem(level1,0,context->getOutputFileBase(),sectionAnchor,TRUE,FALSE);
}
}
void HtmlHelp::addImageFile(const char *fileName)
{
- if (!imageFiles.contains(fileName)) imageFiles.append(fileName);
+ p->imageFiles.insert(fileName);
}
diff --git a/src/htmlhelp.h b/src/htmlhelp.h
index 184b929..421320e 100644
--- a/src/htmlhelp.h
+++ b/src/htmlhelp.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -21,14 +19,10 @@
#ifndef HTMLHELP_H
#define HTMLHELP_H
-#include <qstrlist.h>
-#include <qdict.h>
+#include <memory>
#include "index.h"
-#include "ftextstream.h"
-class QFile;
class Definition;
-class HtmlHelpIndex;
/** A class that generated the HTML Help specific files.
*
@@ -37,10 +31,10 @@ class HtmlHelpIndex;
*/
class HtmlHelp : public IndexIntf
{
- /*! used in imageNumber param of HTMLHelp::addContentsItem() function
- to specify document icon in tree view.
+ /*! used in imageNumber param of HTMLHelp::addContentsItem() function
+ to specify document icon in tree view.
Writes \<param name="ImageNumber" value="xx"\> in .HHC file. */
- enum ImageNumber {
+ enum ImageNumber {
BOOK_CLOSED=1, BOOK_OPEN,
BOOK_CLOSED_NEW, BOOK_OPEN_NEW,
FOLDER_CLOSED, FOLDER_OPEN,
@@ -72,8 +66,8 @@ class HtmlHelp : public IndexIntf
void incContentsDepth();
void decContentsDepth();
void addContentsItem(bool isDir,
- const char *name,
- const char *ref,
+ const char *name,
+ const char *ref,
const char *file,
const char *anchor,
bool separateIndex,
@@ -87,19 +81,10 @@ class HtmlHelp : public IndexIntf
static QCString getLanguageString();
private:
- friend class HtmlHelpIndex;
- void createProjectFile();
-
- QFile *cf,*kf;
- FTextStream cts,kts;
- HtmlHelpIndex *index;
- int dc;
- QStrList indexFiles;
- QStrList imageFiles;
- QDict<void> indexFileDict;
- static HtmlHelp *theInstance;
+ class Private;
+ std::unique_ptr<Private> p;
QCString recode(const QCString &s);
- void *m_fromUtf8;
+
};
#endif /* HTMLHELP_H */
diff --git a/src/image.cpp b/src/image.cpp
index afc67ef..2a8108b 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -207,7 +207,7 @@ static Color palette3[] =
};
-Image::Image(int w,int h)
+Image::Image(uint w,uint h)
{
static int hue = Config_getInt(HTML_COLORSTYLE_HUE);
static int sat = Config_getInt(HTML_COLORSTYLE_SAT);
@@ -236,49 +236,49 @@ Image::Image(int w,int h)
palette[3].green = (int)(green2 * 255.0);
palette[3].blue = (int)(blue2 * 255.0);
- data = new uchar[w*h];
- memset(data,0,w*h);
- width = w;
- height = h;
+ m_data = new uchar[w*h];
+ memset(m_data,0,w*h);
+ m_width = w;
+ m_height = h;
}
Image::~Image()
{
- delete[] data;
+ delete[] m_data;
}
-void Image::setPixel(int x,int y,uchar val)
+void Image::setPixel(uint x,uint y,uchar val)
{
- if (x>=0 && x<width && y>=0 && y<height)
- data[y*width+x] = val;
+ if (x<m_width && y<m_height)
+ m_data[y*m_width+x] = val;
}
-uchar Image::getPixel(int x,int y) const
+uchar Image::getPixel(uint x,uint y) const
{
- if (x>=0 && x<width && y>=0 && y<height)
- return data[y*width+x];
+ if (x<m_width && y<m_height)
+ return m_data[y*m_width+x];
else
return 0;
}
-void Image::writeChar(int x,int y,char c,uchar fg)
+void Image::writeChar(uint x,uint y,char c,uchar fg)
{
if (c>=' ')
{
- int xf,yf,ci=c-' ';
- int rowOffset=0;
- int cw = charWidth[ci];
- int cp = charPos[ci];
+ uint xf,yf,ci=c-' ';
+ uint rowOffset=0;
+ uint cw = charWidth[ci];
+ uint cp = charPos[ci];
for (yf=0;yf<charHeight;yf++)
{
unsigned short bitPattern=0;
- int bitsLeft=cw;
- int byteOffset = rowOffset+(cp>>3);
- int bitOffset = cp&7;
+ uint bitsLeft=cw;
+ uint byteOffset = rowOffset+(cp>>3);
+ uint bitOffset = cp&7;
// get the bit pattern for row yf of the character from the font data
while (bitsLeft>0)
{
- int bits=8-bitOffset;
+ uint bits=8-bitOffset;
if (bits>bitsLeft) bits=bitsLeft;
bitPattern<<=bits;
bitPattern|=((fontRaw[byteOffset]<<bitOffset)&0xff)>>(8-bits);
@@ -286,7 +286,7 @@ void Image::writeChar(int x,int y,char c,uchar fg)
bitOffset=0;
byteOffset++;
}
- int mask=1<<(cw-1);
+ uint mask=1<<(cw-1);
// draw character row yf
for (xf=0;xf<cw;xf++)
{
@@ -298,7 +298,7 @@ void Image::writeChar(int x,int y,char c,uchar fg)
}
}
-void Image::writeString(int x,int y,const char *s,uchar fg)
+void Image::writeString(uint x,uint y,const char *s,uchar fg)
{
if (s)
{
@@ -313,7 +313,7 @@ void Image::writeString(int x,int y,const char *s,uchar fg)
uint Image::stringLength(const char *s)
{
- int w=0;
+ uint w=0;
if (s)
{
char c;
@@ -322,9 +322,9 @@ uint Image::stringLength(const char *s)
return w;
}
-void Image::drawHorzLine(int y,int xs,int xe,uchar colIndex,uint mask)
+void Image::drawHorzLine(uint y,uint xs,uint xe,uchar colIndex,uint mask)
{
- int x,i=0,j=0;
+ uint x,i=0,j=0;
for (x=xs;x<=xe;x++,j++)
{
if (j&1) i++;
@@ -332,38 +332,38 @@ void Image::drawHorzLine(int y,int xs,int xe,uchar colIndex,uint mask)
}
}
-void Image::drawHorzArrow(int y,int xs,int xe,uchar colIndex,uint mask)
+void Image::drawHorzArrow(uint y,uint xs,uint xe,uchar colIndex,uint mask)
{
drawHorzLine(y,xs,xe,colIndex,mask);
- int i;
+ uint i;
for (i=0;i<6;i++)
{
- int h=i>>1;
+ uint h=i>>1;
drawVertLine(xe-i,y-h,y+h,colIndex,0xffffffff);
}
}
-void Image::drawVertLine(int x,int ys,int ye,uchar colIndex,uint mask)
+void Image::drawVertLine(uint x,uint ys,uint ye,uchar colIndex,uint mask)
{
- int y,i=0;
+ uint y,i=0;
for (y=ys;y<=ye;y++,i++)
{
if (mask&(1<<(i&0x1f))) setPixel(x,y,colIndex);
}
}
-void Image::drawVertArrow(int x,int ys,int ye,uchar colIndex,uint mask)
+void Image::drawVertArrow(uint x,uint ys,uint ye,uchar colIndex,uint mask)
{
drawVertLine(x,ys,ye,colIndex,mask);
- int i;
+ uint i;
for (i=0;i<6;i++)
{
- int h=i>>1;
+ uint h=i>>1;
drawHorzLine(ys+i,x-h,x+h,colIndex,0xffffffff);
}
}
-void Image::drawRect(int x,int y,int w,int h,uchar colIndex,uint mask)
+void Image::drawRect(uint x,uint y,uint w,uint h,uchar colIndex,uint mask)
{
drawHorzLine(y,x,x+w-1,colIndex,mask);
drawHorzLine(y+h-1,x,x+w-1,colIndex,mask);
@@ -371,44 +371,27 @@ void Image::drawRect(int x,int y,int w,int h,uchar colIndex,uint mask)
drawVertLine(x+w-1,y,y+h-1,colIndex,mask);
}
-void Image::fillRect(int x,int y,int lwidth,int lheight,uchar colIndex,uint mask)
+void Image::fillRect(uint x,uint y,uint width,uint height,uchar colIndex,uint mask)
{
- int xp,yp,xi,yi;
- for (yp=y,yi=0;yp<y+lheight;yp++,yi++)
- for (xp=x,xi=0;xp<x+lwidth;xp++,xi++)
+ uint xp,yp,xi,yi;
+ for (yp=y,yi=0;yp<y+height;yp++,yi++)
+ for (xp=x,xi=0;xp<x+width;xp++,xi++)
if (mask&(1<<((xi+yi)&0x1f)))
setPixel(xp,yp,colIndex);
}
bool Image::save(const char *fileName,int mode)
{
-#if 0
- GifEncoder gifenc(data,
- mode==0 ? palette : palette2,
- width,height,
- mode==0 ? 3 : 4,
- 0);
- QFile file(fileName);
- if (file.open(IO_WriteOnly))
- {
- gifenc.writeGIF(file);
- return TRUE;
- }
- else
- {
- return FALSE;
- }
-#endif
static bool useTransparency = Config_getBool(FORMULA_TRANSPARENT);
uchar* buffer;
size_t bufferSize;
LodePNG_Encoder encoder;
LodePNG_Encoder_init(&encoder);
- int numCols = mode==0 ? 8 : 16;
+ uint numCols = mode==0 ? 8 : 16;
Color *pPal = mode==0 ? palette :
useTransparency ? palette2 :
palette3 ;
- int i;
+ uint i;
for (i=0;i<numCols;i++,pPal++)
{
LodePNG_InfoColor_addPalette(&encoder.infoPng.color,
@@ -416,7 +399,7 @@ bool Image::save(const char *fileName,int mode)
}
encoder.infoPng.color.colorType = 3;
encoder.infoRaw.color.colorType = 3;
- LodePNG_encode(&encoder, &buffer, &bufferSize, data, width, height);
+ LodePNG_encode(&encoder, &buffer, &bufferSize, m_data, m_width, m_height);
LodePNG_saveFile(buffer, bufferSize, fileName);
free(buffer);
LodePNG_Encoder_cleanup(&encoder);
@@ -489,7 +472,7 @@ void ColoredImage::hsl2rgb(double h,double s,double l,
*pBlue = b;
}
-ColoredImage::ColoredImage(int width,int height,
+ColoredImage::ColoredImage(uint width,uint height,
const uchar *greyLevels,const uchar *alphaLevels,
int saturation,int hue,int gamma)
{
@@ -497,7 +480,7 @@ ColoredImage::ColoredImage(int width,int height,
m_width = width;
m_height = height;
m_data = (uchar*)malloc(width*height*4);
- int i;
+ uint i;
for (i=0;i<width*height;i++)
{
uchar r,g,b,a;
diff --git a/src/image.h b/src/image.h
index 35e6ae3..435321a 100644
--- a/src/image.h
+++ b/src/image.h
@@ -24,37 +24,37 @@
class Image
{
public:
- Image(int w,int h);
+ Image(uint w,uint h);
~Image();
- void setPixel(int x,int y,uchar val);
- uchar getPixel(int x,int y) const;
- void writeChar(int x,int y,char c,uchar fg);
- void writeString(int x,int y,const char *s,uchar fg);
- void drawHorzLine(int y,int xs,int xe,uchar colIndex,uint mask);
- void drawHorzArrow(int y,int xs,int xe,uchar colIndex,uint mask);
- void drawVertLine(int x,int ys,int ye,uchar colIndex,uint mask);
- void drawVertArrow(int x,int ys,int ye,uchar colIndex,uint mask);
- void drawRect(int x,int y,int width,int height,uchar colIndex,uint mask);
- void fillRect(int x,int y,int width,int height,uchar colIndex,uint mask);
+ void setPixel(uint x,uint y,uchar val);
+ uchar getPixel(uint x,uint y) const;
+ void writeChar(uint x,uint y,char c,uchar fg);
+ void writeString(uint x,uint y,const char *s,uchar fg);
+ void drawHorzLine(uint y,uint xs,uint xe,uchar colIndex,uint mask);
+ void drawHorzArrow(uint y,uint xs,uint xe,uchar colIndex,uint mask);
+ void drawVertLine(uint x,uint ys,uint ye,uchar colIndex,uint mask);
+ void drawVertArrow(uint x,uint ys,uint ye,uchar colIndex,uint mask);
+ void drawRect(uint x,uint y,uint width,uint height,uchar colIndex,uint mask);
+ void fillRect(uint x,uint y,uint width,uint height,uchar colIndex,uint mask);
bool save(const char *fileName,int mode=0);
friend uint stringLength(const char *s);
- uint getWidth() const { return width; }
- uint getHeight() const { return height; }
- uchar *getData() const { return data; }
+ uint width() const { return m_width; }
+ uint height() const { return m_height; }
+ uchar *data() const { return m_data; }
static uint stringLength(const char *s);
private:
- int width;
- int height;
- uchar *data;
+ uint m_width;
+ uint m_height;
+ uchar *m_data;
};
/** Class representing a bitmap image colored based on hue/sat/gamma settings. */
class ColoredImage
{
public:
- ColoredImage(int width,int height,
+ ColoredImage(uint width,uint height,
const uchar *greyLevels,const uchar *alphaLevels,
int saturation,int hue,int gamma);
~ColoredImage();
@@ -62,8 +62,8 @@ class ColoredImage
static void hsl2rgb(double h,double s,double l,
double *pRed,double *pGreen,double *pBlue);
private:
- int m_width;
- int m_height;
+ uint m_width;
+ uint m_height;
uchar *m_data;
bool m_hasAlpha;
};
diff --git a/src/index.cpp b/src/index.cpp
index edc302b..e2e5ea1 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -21,6 +21,8 @@
#include <stdlib.h>
+#include <array>
+
#include <assert.h>
#include <qtextstream.h>
#include <qdatetime.h>
@@ -145,29 +147,25 @@ static void endIndexHierarchy(OutputList &ol,int level)
//----------------------------------------------------------------------------
-class MemberIndexList : public QList<MemberDef>
-{
- public:
- typedef const MemberDef ElementType;
- MemberIndexList(uint letter) : QList<MemberDef>(), m_letter(letter) {}
- ~MemberIndexList() {}
- int compareValues(const MemberDef *md1, const MemberDef *md2) const
- {
- int result = qstricmp(md1->name(),md2->name());
- if (result==0)
- {
- result = qstricmp(md1->qualifiedName(),md2->qualifiedName());
- }
- return result;
- }
- uint letter() const { return m_letter; }
- private:
- uint m_letter;
-};
+using MemberIndexList = std::vector<const MemberDef *>;
+using MemberIndexMap = std::map<std::string,MemberIndexList>;
-static LetterToIndexMap<MemberIndexList> g_memberIndexLetterUsed[CMHL_Total];
-static LetterToIndexMap<MemberIndexList> g_fileIndexLetterUsed[FMHL_Total];
-static LetterToIndexMap<MemberIndexList> g_namespaceIndexLetterUsed[NMHL_Total];
+static std::array<MemberIndexMap,CMHL_Total> g_classIndexLetterUsed;
+static std::array<MemberIndexMap,FMHL_Total> g_fileIndexLetterUsed;
+static std::array<MemberIndexMap,NMHL_Total> g_namespaceIndexLetterUsed;
+
+void MemberIndexMap_add(MemberIndexMap &map,const std::string &letter,const MemberDef *md)
+{
+ auto it = map.find(letter);
+ if (it!=map.end())
+ {
+ it->second.push_back(md);
+ }
+ else
+ {
+ map.insert(std::make_pair(letter,std::vector<const MemberDef*>({md})));
+ }
+}
const int maxItemsBeforeQuickIndex = MAX_ITEMS_BEFORE_QUICK_INDEX;
@@ -177,74 +175,41 @@ const int maxItemsBeforeQuickIndex = MAX_ITEMS_BEFORE_QUICK_INDEX;
static void startQuickIndexList(OutputList &ol,bool letterTabs=FALSE)
{
- bool fancyTabs = TRUE;
- if (fancyTabs)
+ if (letterTabs)
{
- if (letterTabs)
- {
- ol.writeString(" <div id=\"navrow4\" class=\"tabs3\">\n");
- }
- else
- {
- ol.writeString(" <div id=\"navrow3\" class=\"tabs2\">\n");
- }
- ol.writeString(" <ul class=\"tablist\">\n");
+ ol.writeString(" <div id=\"navrow4\" class=\"tabs3\">\n");
}
else
{
- ol.writeString(" <div class=\"qindex\">");
+ ol.writeString(" <div id=\"navrow3\" class=\"tabs2\">\n");
}
+ ol.writeString(" <ul class=\"tablist\">\n");
}
static void endQuickIndexList(OutputList &ol)
{
- bool fancyTabs = TRUE;
- if (fancyTabs)
- {
- ol.writeString(" </ul>\n");
- }
+ ol.writeString(" </ul>\n");
ol.writeString(" </div>\n");
}
static void startQuickIndexItem(OutputList &ol,const char *l,
bool hl,bool compact,bool &first)
{
- bool fancyTabs = TRUE;
- if (!first && compact && !fancyTabs) ol.writeString(" | ");
first=FALSE;
- if (fancyTabs)
- {
- ol.writeString(" <li");
- if (hl) ol.writeString(" class=\"current\"");
- ol.writeString("><a ");
- }
- else
- {
- if (!compact) ol.writeString("<li>");
- if (hl && compact)
- {
- ol.writeString("<a class=\"qindexHL\" ");
- }
- else
- {
- ol.writeString("<a class=\"qindex\" ");
- }
- }
+ ol.writeString(" <li");
+ if (hl) ol.writeString(" class=\"current\"");
+ ol.writeString("><a ");
ol.writeString("href=\"");
ol.writeString(l);
ol.writeString("\">");
- if (fancyTabs)
- {
- ol.writeString("<span>");
- }
+ ol.writeString("<span>");
}
static void endQuickIndexItem(OutputList &ol)
{
- bool fancyTabs=TRUE;
- if (fancyTabs) ol.writeString("</span>");
+ ol.writeString("</span>");
ol.writeString("</a>");
- if (fancyTabs) ol.writeString("</li>\n");
+ ol.writeString("</li>\n");
}
// don't make this static as it is called from a template function and some
@@ -254,7 +219,7 @@ QCString fixSpaces(const QCString &s)
return substitute(s," ","&#160;");
}
-void startTitle(OutputList &ol,const char *fileName,const Definition *def)
+void startTitle(OutputList &ol,const char *fileName,const DefinitionMutable *def)
{
ol.startHeaderSection();
if (def) def->writeSummaryLinks(ol);
@@ -307,7 +272,6 @@ void endFile(OutputList &ol,bool skipNavIndex,bool skipEndContents,
ol.writeFooter(navPath); // write the footer
ol.popGeneratorState();
ol.endFile();
- TooltipManager::instance()->clearTooltips(); // Only clear after the last is written
}
void endFileWithNavPath(const Definition *d,OutputList &ol)
@@ -326,27 +290,81 @@ void endFileWithNavPath(const Definition *d,OutputList &ol)
}
//----------------------------------------------------------------------
+
+static bool memberVisibleInIndex(const MemberDef *md)
+{
+ bool isAnonymous = md->isAnonymous();
+ bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
+ bool extractStatic = Config_getBool(EXTRACT_STATIC);
+ return (!isAnonymous &&
+ (!hideUndocMembers || md->hasDocumentation()) &&
+ (!md->isStatic() || extractStatic)
+ );
+}
+
+static void writeMemberToIndex(const Definition *def,const MemberDef *md,bool addToIndex)
+{
+ bool isAnonymous = md->isAnonymous();
+ bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
+ const MemberList *enumList = md->enumFieldList();
+ bool isDir = enumList!=0 && md->isEnumerate();
+ if (md->getOuterScope()==def || md->getOuterScope()==Doxygen::globalScope)
+ {
+ Doxygen::indexList->addContentsItem(isDir,
+ md->name(),md->getReference(),md->getOutputFileBase(),md->anchor(),FALSE,addToIndex);
+ }
+ else // inherited member
+ {
+ Doxygen::indexList->addContentsItem(isDir,
+ md->name(),def->getReference(),def->getOutputFileBase(),md->anchor(),FALSE,addToIndex);
+ }
+ if (isDir)
+ {
+ if (!isAnonymous)
+ {
+ Doxygen::indexList->incContentsDepth();
+ }
+ MemberListIterator emli(*enumList);
+ MemberDef *emd;
+ for (emli.toFirst();(emd=emli.current());++emli)
+ {
+ if (!hideUndocMembers || emd->hasDocumentation())
+ {
+ if (emd->getOuterScope()==def || emd->getOuterScope()==Doxygen::globalScope)
+ {
+ Doxygen::indexList->addContentsItem(FALSE,
+ emd->name(),emd->getReference(),emd->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
+ }
+ else // inherited member
+ {
+ Doxygen::indexList->addContentsItem(FALSE,
+ emd->name(),def->getReference(),def->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
+ }
+ }
+ }
+ if (!isAnonymous)
+ {
+ Doxygen::indexList->decContentsDepth();
+ }
+ }
+}
+
+//----------------------------------------------------------------------
template<class T>
void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
const QCString &name,const QCString &anchor,
bool addToIndex=TRUE,bool preventSeparateIndex=FALSE)
{
- bool hasMembers = def->getMemberLists().count()>0 || def->getMemberGroupSDict()!=0;
+ bool hasMembers = !def->getMemberLists().empty() || !def->getMemberGroups().empty();
Doxygen::indexList->addContentsItem(hasMembers,name,
def->getReference(),def->getOutputFileBase(),anchor,
hasMembers && !preventSeparateIndex,
addToIndex,
def);
int numClasses=0;
- ClassSDict *classes = def->getClassSDict();
- if (classes)
+ for (const auto &cd : def->getClasses())
{
- ClassDef *cd;
- ClassSDict::Iterator it(*classes);
- for (;(cd=it.current());++it)
- {
- if (cd->isLinkable()) numClasses++;
- }
+ if (cd->isLinkable()) numClasses++;
}
//printf("addMembersToIndex(def=%s hasMembers=%d numClasses=%d)\n",def->name().data(),hasMembers,numClasses);
if (hasMembers || numClasses>0)
@@ -366,55 +384,9 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
MemberDef *md;
for (mi.toFirst();(md=mi.current());++mi)
{
- const MemberList *enumList = md->enumFieldList();
- bool isDir = enumList!=0 && md->isEnumerate();
- bool isAnonymous = md->isAnonymous();
- static bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
- static bool extractStatic = Config_getBool(EXTRACT_STATIC);
- if (!isAnonymous &&
- (!hideUndocMembers || md->hasDocumentation()) &&
- (!md->isStatic() || extractStatic)
- )
+ if (memberVisibleInIndex(md))
{
- if (md->getOuterScope()==def || md->getOuterScope()==Doxygen::globalScope)
- {
- Doxygen::indexList->addContentsItem(isDir,
- md->name(),md->getReference(),md->getOutputFileBase(),md->anchor(),FALSE,addToIndex);
- }
- else // inherited member
- {
- Doxygen::indexList->addContentsItem(isDir,
- md->name(),def->getReference(),def->getOutputFileBase(),md->anchor(),FALSE,addToIndex);
- }
- }
- if (isDir)
- {
- if (!isAnonymous)
- {
- Doxygen::indexList->incContentsDepth();
- }
- MemberListIterator emli(*enumList);
- MemberDef *emd;
- for (emli.toFirst();(emd=emli.current());++emli)
- {
- if (!hideUndocMembers || emd->hasDocumentation())
- {
- if (emd->getOuterScope()==def || emd->getOuterScope()==Doxygen::globalScope)
- {
- Doxygen::indexList->addContentsItem(FALSE,
- emd->name(),emd->getReference(),emd->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
- }
- else // inherited member
- {
- Doxygen::indexList->addContentsItem(FALSE,
- emd->name(),def->getReference(),def->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
- }
- }
- }
- if (!isAnonymous)
- {
- Doxygen::indexList->decContentsDepth();
- }
+ writeMemberToIndex(def,md,addToIndex);
}
}
}
@@ -424,20 +396,15 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
lde->kind()==LayoutDocEntry::ClassNestedClasses
)
{
- if (classes)
+ for (const auto &cd : def->getClasses())
{
- ClassDef *cd;
- ClassSDict::Iterator it(*classes);
- for (;(cd=it.current());++it)
+ if (cd->isLinkable() && (cd->partOfGroups().empty() || def->definitionType()==Definition::TypeGroup))
{
- if (cd->isLinkable() && (cd->partOfGroups()==0 || def->definitionType()==Definition::TypeGroup))
- {
- static bool inlineSimpleStructs = Config_getBool(INLINE_SIMPLE_STRUCTS);
- bool isNestedClass = def->definitionType()==Definition::TypeClass;
- addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),
- addToIndex && (isNestedClass || (cd->isSimple() && inlineSimpleStructs)),
- preventSeparateIndex || cd->isEmbeddedInOuterScope());
- }
+ static bool inlineSimpleStructs = Config_getBool(INLINE_SIMPLE_STRUCTS);
+ bool isNestedClass = def->definitionType()==Definition::TypeClass;
+ addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),
+ addToIndex && (isNestedClass || (cd->isSimple() && inlineSimpleStructs)),
+ preventSeparateIndex || cd->isEmbeddedInOuterScope());
}
}
}
@@ -451,14 +418,13 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
//----------------------------------------------------------------------------
/*! Generates HTML Help tree of classes */
-static void writeClassTree(OutputList &ol,const BaseClassList *bcl,bool hideSuper,int level,FTVHelp* ftv,bool addToIndex)
+static void writeClassTreeToOutput(OutputList &ol,const BaseClassList &bcl,int level,FTVHelp* ftv,bool addToIndex,ClassDefSet &visitedClasses)
{
- if (bcl==0) return;
- BaseClassListIterator bcli(*bcl);
+ if (bcl.empty()) return;
bool started=FALSE;
- for ( ; bcli.current() ; ++bcli)
+ for (const auto &bcd : bcl)
{
- ClassDef *cd=bcli.current()->classDef;
+ ClassDef *cd=bcd.classDef;
if (cd->getLanguage()==SrcLangExt_VHDL && (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
{
continue;
@@ -491,7 +457,8 @@ static void writeClassTree(OutputList &ol,const BaseClassList *bcl,bool hideSupe
}
ol.startIndexListItem();
//printf("Passed...\n");
- bool hasChildren = !cd->isVisited() && !hideSuper && classHasVisibleChildren(cd);
+ bool hasChildren = visitedClasses.find(cd)==visitedClasses.end() &&
+ classHasVisibleChildren(cd);
//printf("tree4: Has children %s: %d\n",cd->name().data(),hasChildren);
if (cd->isLinkable())
{
@@ -513,7 +480,7 @@ static void writeClassTree(OutputList &ol,const BaseClassList *bcl,bool hideSupe
{
if (cd->getLanguage()==SrcLangExt_VHDL)
{
- ftv->addContentsItem(hasChildren,bcli.current()->usedName,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd);
+ ftv->addContentsItem(hasChildren,bcd.usedName,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd);
}
else
{
@@ -538,15 +505,14 @@ static void writeClassTree(OutputList &ol,const BaseClassList *bcl,bool hideSupe
if (hasChildren)
{
//printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited);
- bool wasVisited=cd->isVisited();
- cd->setVisited(TRUE);
+ visitedClasses.insert(cd);
if (cd->getLanguage()==SrcLangExt_VHDL)
{
- writeClassTree(ol,cd->baseClasses(),wasVisited,level+1,ftv,addToIndex);
+ writeClassTreeToOutput(ol,cd->baseClasses(),level+1,ftv,addToIndex,visitedClasses);
}
else
{
- writeClassTree(ol,cd->subClasses(),wasVisited,level+1,ftv,addToIndex);
+ writeClassTreeToOutput(ol,cd->subClasses(),level+1,ftv,addToIndex,visitedClasses);
}
}
ol.endIndexListItem();
@@ -568,7 +534,7 @@ static void writeClassTree(OutputList &ol,const BaseClassList *bcl,bool hideSupe
//----------------------------------------------------------------------------
-static bool dirHasVisibleChildren(DirDef *dd)
+static bool dirHasVisibleChildren(const DirDef *dd)
{
if (dd->hasDocumentation()) return TRUE;
@@ -587,9 +553,7 @@ static bool dirHasVisibleChildren(DirDef *dd)
}
}
- QListIterator<DirDef> dli(dd->subDirs());
- DirDef *subdd;
- for (dli.toFirst();(subdd=dli.current());++dli)
+ for(const auto &subdd : dd->subDirs())
{
if (dirHasVisibleChildren(subdd))
{
@@ -600,7 +564,7 @@ static bool dirHasVisibleChildren(DirDef *dd)
}
//----------------------------------------------------------------------------
-static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv,bool addToIndex)
+static void writeDirTreeNode(OutputList &ol, const DirDef *dd, int level, FTVHelp* ftv,bool addToIndex)
{
if (level>20)
{
@@ -617,7 +581,7 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
}
static bool tocExpand = TRUE; //Config_getBool(TOC_EXPAND);
- bool isDir = dd->subDirs().count()>0 || // there are subdirs
+ bool isDir = dd->subDirs().size()>0 || // there are subdirs
(tocExpand && // or toc expand and
dd->getFiles() && dd->getFiles()->count()>0 // there are files
);
@@ -646,12 +610,10 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
}
// write sub directories
- if (dd->subDirs().count()>0)
+ if (dd->subDirs().size()>0)
{
startIndexHierarchy(ol,level+1);
- QListIterator<DirDef> dli(dd->subDirs());
- DirDef *subdd = 0;
- for (dli.toFirst();(subdd=dli.current());++dli)
+ for(const auto &subdd : dd->subDirs())
{
writeDirTreeNode(ol,subdd,level+1,ftv,addToIndex);
}
@@ -735,7 +697,7 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
else if (src)
{
Doxygen::indexList->addContentsItem(
- FALSE, convertToHtml(fd->name(),TRUE), 0,
+ FALSE, fd->name(), 0,
fd->getSourceFileBase(), 0, FALSE, TRUE, fd);
}
}
@@ -760,35 +722,28 @@ static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
ol.pushGeneratorState();
ol.disable(OutputGenerator::Html);
}
- static bool fullPathNames = Config_getBool(FULL_PATH_NAMES);
+ bool fullPathNames = Config_getBool(FULL_PATH_NAMES);
startIndexHierarchy(ol,0);
if (fullPathNames)
{
- SDict<DirDef>::Iterator dli(*Doxygen::directories);
- DirDef *dd;
- for (dli.toFirst();(dd=dli.current());++dli)
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
if (dd->getOuterScope()==Doxygen::globalScope)
{
- writeDirTreeNode(ol,dd,0,ftv,addToIndex);
+ writeDirTreeNode(ol,dd.get(),0,ftv,addToIndex);
}
}
}
if (ftv)
{
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
- static bool fullPathNames = Config_getBool(FULL_PATH_NAMES);
if (!fullPathNames || fd->getDirDef()==0) // top level file
{
- bool doc,src;
- doc = fileVisibleInIndex(fd,src);
+ bool src;
+ bool doc = fileVisibleInIndex(fd.get(),src);
QCString reference, outputBase;
if (doc)
{
@@ -799,19 +754,19 @@ static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
{
ftv->addContentsItem(FALSE,fd->displayName(),
reference, outputBase, 0,
- FALSE,FALSE,fd);
+ FALSE,FALSE,fd.get());
}
if (addToIndex)
{
if (doc)
{
- addMembersToIndex(fd,LayoutDocManager::File,fd->displayName(),QCString(),TRUE);
+ addMembersToIndex(fd.get(),LayoutDocManager::File,fd->displayName(),QCString(),TRUE);
}
else if (src)
{
Doxygen::indexList->addContentsItem(
- FALSE, convertToHtml(fd->name(),TRUE), 0,
- fd->getSourceFileBase(), 0, FALSE, TRUE, fd);
+ FALSE, fd->name(), 0,
+ fd->getSourceFileBase(), 0, FALSE, TRUE, fd.get());
}
}
}
@@ -828,13 +783,11 @@ static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
//----------------------------------------------------------------------------
-static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FTVHelp* ftv,bool addToIndex,
- ClassDef::CompoundType ct)
+static void writeClassTreeForList(OutputList &ol,const ClassLinkedMap &cl,bool &started,FTVHelp* ftv,bool addToIndex,
+ ClassDef::CompoundType ct,ClassDefSet &visitedClasses)
{
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : cl)
{
//printf("class %s hasVisibleRoot=%d isVisibleInHierarchy=%d\n",
// cd->name().data(),
@@ -873,7 +826,8 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
started=TRUE;
}
ol.startIndexListItem();
- bool hasChildren = !cd->isVisited() && classHasVisibleChildren(cd);
+ bool hasChildren = visitedClasses.find(cd.get())==visitedClasses.end() &&
+ classHasVisibleChildren(cd.get());
//printf("list: Has children %s: %d\n",cd->name().data(),hasChildren);
if (cd->isLinkable())
{
@@ -895,7 +849,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
}
if (ftv)
{
- ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd);
+ ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd.get());
}
}
else
@@ -909,18 +863,18 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
}
if (ftv)
{
- ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0,FALSE,FALSE,cd);
+ ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0,FALSE,FALSE,cd.get());
}
}
if (cd->getLanguage()==SrcLangExt_VHDL && hasChildren)
{
- writeClassTree(ol,cd->baseClasses(),cd->isVisited(),1,ftv,addToIndex);
- cd->setVisited(TRUE);
+ writeClassTreeToOutput(ol,cd->baseClasses(),1,ftv,addToIndex,visitedClasses);
+ visitedClasses.insert(cd.get());
}
else if (hasChildren)
{
- writeClassTree(ol,cd->subClasses(),cd->isVisited(),1,ftv,addToIndex);
- cd->setVisited(TRUE);
+ writeClassTreeToOutput(ol,cd->subClasses(),1,ftv,addToIndex,visitedClasses);
+ visitedClasses.insert(cd.get());
}
ol.endIndexListItem();
}
@@ -930,16 +884,15 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex,ClassDef::CompoundType ct)
{
- initClassHierarchy(Doxygen::classSDict);
- initClassHierarchy(Doxygen::hiddenClasses);
+ ClassDefSet visitedClasses;
if (ftv)
{
ol.pushGeneratorState();
ol.disable(OutputGenerator::Html);
}
bool started=FALSE;
- writeClassTreeForList(ol,Doxygen::classSDict,started,ftv,addToIndex,ct);
- writeClassTreeForList(ol,Doxygen::hiddenClasses,started,ftv,addToIndex,ct);
+ writeClassTreeForList(ol,*Doxygen::classLinkedMap,started,ftv,addToIndex,ct,visitedClasses);
+ writeClassTreeForList(ol,*Doxygen::hiddenClassLinkedMap,started,ftv,addToIndex,ct,visitedClasses);
if (started)
{
endIndexHierarchy(ol,0);
@@ -956,13 +909,11 @@ static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex,Cla
//----------------------------------------------------------------------------
-static int countClassesInTreeList(const ClassSDict &cl, ClassDef::CompoundType ct)
+static int countClassesInTreeList(const ClassLinkedMap &cl, ClassDef::CompoundType ct)
{
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
int count=0;
- ClassSDict::Iterator cli(cl);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : cl)
{
if (sliceOpt && cd->compoundType() != ct)
{
@@ -972,7 +923,7 @@ static int countClassesInTreeList(const ClassSDict &cl, ClassDef::CompoundType c
{
if (cd->isVisibleInHierarchy()) // should it be visible
{
- if (cd->subClasses()) // should have sub classes
+ if (!cd->subClasses().empty()) // should have sub classes
{
count++;
}
@@ -985,10 +936,8 @@ static int countClassesInTreeList(const ClassSDict &cl, ClassDef::CompoundType c
static int countClassHierarchy(ClassDef::CompoundType ct)
{
int count=0;
- initClassHierarchy(Doxygen::classSDict);
- initClassHierarchy(Doxygen::hiddenClasses);
- count+=countClassesInTreeList(*Doxygen::classSDict, ct);
- count+=countClassesInTreeList(*Doxygen::hiddenClasses, ct);
+ count+=countClassesInTreeList(*Doxygen::classLinkedMap, ct);
+ count+=countClassesInTreeList(*Doxygen::hiddenClassLinkedMap, ct);
return count;
}
@@ -1321,16 +1270,12 @@ static void countFiles(int &htmlFiles,int &files)
{
htmlFiles=0;
files=0;
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd: *fn)
{
bool doc,src;
- doc = fileVisibleInIndex(fd,src);
+ doc = fileVisibleInIndex(fd.get(),src);
if (doc || src)
{
htmlFiles++;
@@ -1409,7 +1354,8 @@ static void writeSingleFileIndex(OutputList &ol,FileDef *fd)
FALSE, // isExample
0, // example name
TRUE, // single line
- TRUE // link from index
+ TRUE, // link from index
+ Config_getBool(MARKDOWN_SUPPORT)
);
//ol.docify(")");
}
@@ -1470,27 +1416,23 @@ static void writeFileIndex(OutputList &ol)
if (Config_getBool(FULL_PATH_NAMES))
{
// re-sort input files in (dir,file) output order instead of (file,dir) input order
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
QCString path=fd->getPath();
if (path.isEmpty()) path="[external]";
FileList *fl = outputNameDict.find(path);
if (fl)
{
- fl->append(fd);
+ fl->append(fd.get());
//printf("+ inserting %s---%s\n",fd->getPath().data(),fd->name().data());
}
else
{
//printf("o inserting %s---%s\n",fd->getPath().data(),fd->name().data());
fl = new FileList(path);
- fl->append(fd);
+ fl->append(fd.get());
outputNameList.append(fl);
outputNameDict.insert(path,fl);
}
@@ -1517,15 +1459,11 @@ static void writeFileIndex(OutputList &ol)
}
else
{
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
- writeSingleFileIndex(ol,fd);
+ writeSingleFileIndex(ol,fd.get());
}
}
}
@@ -1564,9 +1502,7 @@ static void writeFileIndex(OutputList &ol)
static int countNamespaces()
{
int count=0;
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for (;(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
if (nd->isLinkableInProject()) count++;
}
@@ -1574,75 +1510,124 @@ static int countNamespaces()
}
//----------------------------------------------------------------------------
+template<typename Ptr> const ClassDef *get_pointer(const Ptr &p);
+template<> const ClassDef *get_pointer(const ClassLinkedMap::Ptr &p) { return p.get(); }
+template<> const ClassDef *get_pointer(const ClassLinkedRefMap::Ptr &p) { return p; }
-void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalOnly,ClassDef::CompoundType ct)
+template<class ListType>
+static void writeClassTree(const ListType &cl,FTVHelp *ftv,bool addToIndex,bool globalOnly,ClassDef::CompoundType ct)
{
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
- if (clDict)
+ for (const auto &cdi : cl)
{
- ClassSDict::Iterator cli(*clDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ const ClassDef *cd = get_pointer(cdi);
+ ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm && cd->getLanguage()==SrcLangExt_VHDL)
{
- if (cd->getLanguage()==SrcLangExt_VHDL)
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
+ (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
+ )// no architecture
{
- if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
- (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
- )// no architecture
- {
- continue;
- }
- if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS)
+ continue;
+ }
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS)
+ {
+ QCString n=cd->name();
+ cdm->setClassName(n.data());
+ }
+ }
+
+ if (sliceOpt && cd->compoundType() != ct)
+ {
+ continue;
+ }
+
+ if (!globalOnly ||
+ cd->getOuterScope()==0 ||
+ cd->getOuterScope()==Doxygen::globalScope
+ )
+ {
+ int count=0;
+ for (const auto &ccd : cd->getClasses())
+ {
+ if (ccd->isLinkableInProject() && ccd->templateMaster()==0)
{
- QCString n=cd->name();
- cd->setClassName(n.data());
+ count++;
}
}
-
- if (sliceOpt && cd->compoundType() != ct)
+ if (classVisibleInIndex(cd) && cd->templateMaster()==0)
{
- continue;
+ ftv->addContentsItem(count>0,cd->displayName(FALSE),cd->getReference(),
+ cd->getOutputFileBase(),cd->anchor(),FALSE,TRUE,cd);
+ if ((cd->getOuterScope()==0 ||
+ cd->getOuterScope()->definitionType()!=Definition::TypeClass
+ )
+ )
+ {
+ addMembersToIndex(cd,LayoutDocManager::Class,
+ cd->displayName(FALSE),
+ cd->anchor(),
+ addToIndex && cd->partOfGroups().empty() && !cd->isSimple());
+ }
+ if (count>0)
+ {
+ ftv->incContentsDepth();
+ writeClassTree(cd->getClasses(),ftv,addToIndex,FALSE,ct);
+ ftv->decContentsDepth();
+ }
}
+ }
+ }
+}
- if (!globalOnly ||
- cd->getOuterScope()==0 ||
- cd->getOuterScope()==Doxygen::globalScope
- )
+static int countVisibleMembers(const NamespaceDef *nd)
+{
+ int count=0;
+ QListIterator<LayoutDocEntry> eli(LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace));
+ LayoutDocEntry *lde;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ if (lde->kind()==LayoutDocEntry::MemberDef)
+ {
+ LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+ MemberList *ml = nd->getMemberList(lmd->type);
+ if (ml)
{
- int count=0;
- if (cd->getClassSDict())
+ MemberListIterator mi(*ml);
+ MemberDef *md;
+ for (mi.toFirst();(md=mi.current());++mi)
{
- ClassSDict::Iterator ccit(*cd->getClassSDict());
- ClassDef *ccd;
- for (;(ccd=ccit.current());++ccit)
+ if (memberVisibleInIndex(md))
{
- if (ccd->isLinkableInProject() && ccd->templateMaster()==0)
- {
- count++;
- }
+ count++;
}
}
- if (classVisibleInIndex(cd) && cd->templateMaster()==0)
+ }
+ }
+ }
+ return count;
+}
+
+static void writeNamespaceMembers(const NamespaceDef *nd,bool addToIndex)
+{
+ QListIterator<LayoutDocEntry> eli(LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace));
+ LayoutDocEntry *lde;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ if (lde->kind()==LayoutDocEntry::MemberDef)
+ {
+ LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+ MemberList *ml = nd->getMemberList(lmd->type);
+ if (ml)
+ {
+ MemberListIterator mi(*ml);
+ MemberDef *md;
+ for (mi.toFirst();(md=mi.current());++mi)
{
- ftv->addContentsItem(count>0,cd->displayName(FALSE),cd->getReference(),
- cd->getOutputFileBase(),cd->anchor(),FALSE,TRUE,cd);
- if (addToIndex &&
- /*cd->partOfGroups()==0 &&*/
- (cd->getOuterScope()==0 ||
- cd->getOuterScope()->definitionType()!=Definition::TypeClass
- )
- )
- {
- addMembersToIndex(cd,LayoutDocManager::Class,
- cd->displayName(FALSE),
- cd->anchor(),
- cd->partOfGroups()==0 && !cd->isSimple());
- }
- if (count>0)
+ //printf(" member %s visible=%d\n",md->name().data(),memberVisibleInIndex(md));
+ if (memberVisibleInIndex(md))
{
- ftv->incContentsDepth();
- writeClassTree(cd->getClassSDict(),ftv,addToIndex,FALSE,ct);
- ftv->decContentsDepth();
+ writeMemberToIndex(nd,md,addToIndex);
}
}
}
@@ -1650,81 +1635,178 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO
}
}
-static void writeNamespaceTree(const NamespaceSDict *nsDict,FTVHelp *ftv,
- bool rootOnly,bool showClasses,bool addToIndex,ClassDef::CompoundType ct)
+static void writeNamespaceTree(const NamespaceLinkedRefMap &nsLinkedMap,FTVHelp *ftv,
+ bool rootOnly,bool addToIndex);
+
+static void writeNamespaceTreeElement(const NamespaceDef *nd,FTVHelp *ftv,
+ bool rootOnly,bool addToIndex)
+{
+ if (!nd->isAnonymous() &&
+ (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
+ {
+
+ bool hasChildren = namespaceHasNestedNamespace(nd) ||
+ namespaceHasNestedClass(nd,false,ClassDef::Class);
+ bool isLinkable = nd->isLinkableInProject();
+ int visibleMembers = countVisibleMembers(nd);
+
+ //printf("namespace %s hasChildren=%d visibleMembers=%d\n",nd->name().data(),hasChildren,visibleMembers);
+
+ QCString ref;
+ QCString file;
+ if (isLinkable)
+ {
+ ref = nd->getReference();
+ file = nd->getOutputFileBase();
+ if (nd->getLanguage()==SrcLangExt_VHDL) // UGLY HACK
+ {
+ file=file.replace(0,qstrlen("namespace"),"class");
+ }
+ }
+
+ bool isDir = hasChildren || visibleMembers>0;
+ if ((isLinkable) || isDir)
+ {
+ ftv->addContentsItem(hasChildren,nd->localName(),ref,file,0,FALSE,TRUE,nd);
+
+ if (addToIndex)
+ {
+ Doxygen::indexList->addContentsItem(isDir,nd->localName(),ref,file,QCString(),
+ hasChildren && !file.isEmpty(),addToIndex);
+ }
+ if (addToIndex && isDir)
+ {
+ Doxygen::indexList->incContentsDepth();
+ }
+
+ //printf("*** writeNamespaceTree count=%d addToIndex=%d false=%d classCount=%d\n",
+ // count,addToIndex,false,classCount);
+ if (isDir)
+ {
+ ftv->incContentsDepth();
+ writeNamespaceTree(nd->getNamespaces(),ftv,FALSE,addToIndex);
+ writeClassTree(nd->getClasses(),ftv,FALSE,FALSE,ClassDef::Class);
+ writeNamespaceMembers(nd,addToIndex);
+ ftv->decContentsDepth();
+ }
+ if (addToIndex && isDir)
+ {
+ Doxygen::indexList->decContentsDepth();
+ }
+ }
+ }
+}
+
+static void writeNamespaceTree(const NamespaceLinkedRefMap &nsLinkedMap,FTVHelp *ftv,
+ bool rootOnly,bool addToIndex)
+{
+ for (const auto &nd : nsLinkedMap)
+ {
+ writeNamespaceTreeElement(nd,ftv,rootOnly,addToIndex);
+ }
+}
+
+static void writeNamespaceTree(const NamespaceLinkedMap &nsLinkedMap,FTVHelp *ftv,
+ bool rootOnly,bool addToIndex)
+{
+ for (const auto &nd : nsLinkedMap)
+ {
+ writeNamespaceTreeElement(nd.get(),ftv,rootOnly,addToIndex);
+ }
+}
+
+static void writeClassTreeInsideNamespace(const NamespaceLinkedRefMap &nsLinkedMap,FTVHelp *ftv,
+ bool rootOnly,bool addToIndex,ClassDef::CompoundType ct);
+
+static void writeClassTreeInsideNamespaceElement(const NamespaceDef *nd,FTVHelp *ftv,
+ bool rootOnly,bool addToIndex,ClassDef::CompoundType ct)
{
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
- if (nsDict)
+ if (!nd->isAnonymous() &&
+ (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
{
- NamespaceSDict::Iterator nli(*nsDict);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ bool isDir = namespaceHasNestedClass(nd,sliceOpt,ct);
+ bool isLinkable = nd->isLinkableInProject();
+
+ //printf("namespace %s isDir=%d\n",nd->name().data(),isDir);
+
+ QCString ref;
+ QCString file;
+ if (isLinkable)
{
- if (!nd->isAnonymous() &&
- (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
+ ref = nd->getReference();
+ file = nd->getOutputFileBase();
+ if (nd->getLanguage()==SrcLangExt_VHDL) // UGLY HACK
{
+ file=file.replace(0,qstrlen("namespace"),"class");
+ }
+ }
- bool hasChildren = namespaceHasVisibleChild(nd,showClasses,sliceOpt,ct);
- bool isLinkable = nd->isLinkableInProject();
+ if (isDir)
+ {
+ ftv->addContentsItem(isDir,nd->localName(),ref,file,0,FALSE,TRUE,nd);
+
+ if (addToIndex)
+ {
+ // the namespace entry is already shown under the namespace list so don't
+ // add it to the nav index and don't create a separate index file for it otherwise
+ // it will overwrite the one written for the namespace list.
+ Doxygen::indexList->addContentsItem(isDir,nd->localName(),ref,file,QCString(),
+ false, // separateIndex
+ false // addToNavIndex
+ );
+ }
+ if (addToIndex)
+ {
+ Doxygen::indexList->incContentsDepth();
+ }
- QCString ref;
- QCString file;
- if (isLinkable)
+ ftv->incContentsDepth();
+ writeClassTreeInsideNamespace(nd->getNamespaces(),ftv,FALSE,addToIndex,ct);
+ ClassLinkedRefMap d = nd->getClasses();
+ if (sliceOpt)
+ {
+ if (ct == ClassDef::Interface)
{
- ref = nd->getReference();
- file = nd->getOutputFileBase();
- if (nd->getLanguage()==SrcLangExt_VHDL) // UGLY HACK
- {
- file=file.replace(0,qstrlen("namespace"),"class");
- }
+ d = nd->getInterfaces();
}
-
- if ((isLinkable && !showClasses) || hasChildren)
+ else if (ct == ClassDef::Struct)
{
- ftv->addContentsItem(hasChildren,nd->localName(),ref,file,0,FALSE,TRUE,nd);
-
- if (addToIndex)
- {
- Doxygen::indexList->addContentsItem(hasChildren,nd->localName(),ref,file,QCString(),
- hasChildren && !file.isEmpty(),addToIndex);
- }
-
- //printf("*** writeNamespaceTree count=%d addToIndex=%d showClasses=%d classCount=%d\n",
- // count,addToIndex,showClasses,classCount);
- if (hasChildren)
- {
- if (addToIndex) Doxygen::indexList->incContentsDepth();
- ftv->incContentsDepth();
- writeNamespaceTree(nd->getNamespaceSDict(),ftv,FALSE,showClasses,addToIndex,ct);
- if (showClasses)
- {
- ClassSDict *d = nd->getClassSDict();
- if (sliceOpt)
- {
- if (ct == ClassDef::Interface)
- {
- d = nd->getInterfaceSDict();
- }
- else if (ct == ClassDef::Struct)
- {
- d = nd->getStructSDict();
- }
- else if (ct == ClassDef::Exception)
- {
- d = nd->getExceptionSDict();
- }
- }
- writeClassTree(d,ftv,addToIndex,FALSE,ct);
- }
- ftv->decContentsDepth();
- if (addToIndex) Doxygen::indexList->decContentsDepth();
- }
+ d = nd->getStructs();
+ }
+ else if (ct == ClassDef::Exception)
+ {
+ d = nd->getExceptions();
}
}
+ writeClassTree(d,ftv,addToIndex,FALSE,ct);
+ ftv->decContentsDepth();
+
+ if (addToIndex)
+ {
+ Doxygen::indexList->decContentsDepth();
+ }
}
}
}
+static void writeClassTreeInsideNamespace(const NamespaceLinkedRefMap &nsLinkedMap,FTVHelp *ftv,
+ bool rootOnly,bool addToIndex,ClassDef::CompoundType ct)
+{
+ for (const auto &nd : nsLinkedMap)
+ {
+ writeClassTreeInsideNamespaceElement(nd,ftv,rootOnly,addToIndex,ct);
+ }
+}
+
+static void writeClassTreeInsideNamespace(const NamespaceLinkedMap &nsLinkedMap,FTVHelp *ftv,
+ bool rootOnly,bool addToIndex,ClassDef::CompoundType ct)
+{
+ for (const auto &nd : nsLinkedMap)
+ {
+ writeClassTreeInsideNamespaceElement(nd.get(),ftv,rootOnly,addToIndex,ct);
+ }
+}
static void writeNamespaceIndex(OutputList &ol)
{
@@ -1753,9 +1835,7 @@ static void writeNamespaceIndex(OutputList &ol)
ol.pushGeneratorState();
ol.disable(OutputGenerator::Html);
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
if (nd->isLinkableInProject())
{
@@ -1783,13 +1863,14 @@ static void writeNamespaceIndex(OutputList &ol)
//ol.docify(" (");
ol.generateDoc(
nd->briefFile(),nd->briefLine(),
- nd,0,
+ nd.get(),0,
nd->briefDescription(TRUE),
FALSE, // index words
FALSE, // isExample
0, // example name
TRUE, // single line
- TRUE // link from index
+ TRUE, // link from index
+ Config_getBool(MARKDOWN_SUPPORT)
);
//ol.docify(")");
}
@@ -1814,7 +1895,7 @@ static void writeNamespaceIndex(OutputList &ol)
Doxygen::indexList->incContentsDepth();
}
FTVHelp* ftv = new FTVHelp(FALSE);
- writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,FALSE,addToIndex,ClassDef::Class);
+ writeNamespaceTree(*Doxygen::namespaceLinkedMap,ftv,TRUE,addToIndex);
QGString outStr;
FTextStream t(&outStr);
ftv->generateTreeViewInline(t);
@@ -1840,9 +1921,7 @@ static int countAnnotatedClasses(int *cp, ClassDef::CompoundType ct)
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
int count=0;
int countPrinted=0;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (sliceOpt && cd->compoundType() != ct)
{
@@ -1870,10 +1949,7 @@ static void writeAnnotatedClassList(OutputList &ol,ClassDef::CompoundType ct)
static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
-
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (cd->getLanguage()==SrcLangExt_VHDL &&
((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
@@ -1917,13 +1993,14 @@ static void writeAnnotatedClassList(OutputList &ol,ClassDef::CompoundType ct)
{
ol.generateDoc(
cd->briefFile(),cd->briefLine(),
- cd,0,
+ cd.get(),0,
cd->briefDescription(TRUE),
FALSE, // indexWords
FALSE, // isExample
0, // example name
TRUE, // single line
- TRUE // link from index
+ TRUE, // link from index
+ Config_getBool(MARKDOWN_SUPPORT)
);
}
ol.endIndexValue(cd->getOutputFileBase(),hasBrief);
@@ -1943,129 +2020,53 @@ inline bool isId1(int c)
return (c<127 && c>31); // printable ASCII character
}
-static QCString letterToString(uint letter)
+static QCString letterToLabel(const char *startLetter)
{
- return QString(QChar(letter)).utf8();
-}
-
-static QCString letterToLabel(uint startLetter)
-{
- char s[11]; // max 0x12345678 + '\0'
- if (isId1(startLetter)) // printable ASCII character
+ const char *p = startLetter;
+ if (startLetter==0 || *startLetter==0) return "";
+ char c = *p;
+ QCString result;
+ if (isId1(c))
{
- s[0]=(char)startLetter;
- s[1]=0;
+ result+=c;
}
else
{
+ result="0x";
const char hex[]="0123456789abcdef";
- int i=0;
- s[i++]='0';
- s[i++]='x';
- if (startLetter>(1<<24)) // 4 byte character
- {
- s[i++]=hex[(startLetter>>28)&0xf];
- s[i++]=hex[(startLetter>>24)&0xf];
- }
- if (startLetter>(1<<16)) // 3 byte character
+ while ((c=*p++))
{
- s[i++]=hex[(startLetter>>20)&0xf];
- s[i++]=hex[(startLetter>>16)&0xf];
+ result+=hex[((unsigned char)c)>>4];
+ result+=hex[((unsigned char)c)&0xf];
}
- if (startLetter>(1<<8)) // 2 byte character
- {
- s[i++]=hex[(startLetter>>12)&0xf];
- s[i++]=hex[(startLetter>>8)&0xf];
- }
- // one byte character
- s[i++]=hex[(startLetter>>4)&0xf];
- s[i++]=hex[(startLetter>>0)&0xf];
- s[i++]=0;
}
- return s;
+ return result;
}
//----------------------------------------------------------------------------
-/** Special class list where sorting takes IGNORE_PREFIX into account. */
-class PrefixIgnoreClassList : public ClassList
-{
- public:
- typedef const ClassDef ElementType;
- PrefixIgnoreClassList(uint letter) : m_letter(letter) {}
- uint letter() const { return m_letter; }
- private:
- virtual int compareValue(const ClassDef *c1, const ClassDef *c2) const
- {
- QCString n1 = c1->className();
- QCString n2 = c2->className();
- return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
- }
- uint m_letter;
-};
-
/** Class representing a cell in the alphabetical class index. */
class AlphaIndexTableCell
{
public:
- AlphaIndexTableCell(int row,int col,uint letter,ClassDef *cd) :
+ AlphaIndexTableCell(int row,int col,const std::string &letter,const ClassDef *cd) :
m_letter(letter), m_class(cd), m_row(row), m_col(col)
- { //printf("AlphaIndexTableCell(%d,%d,%c,%s)\n",row,col,letter!=0 ? letter: '-',
- // cd!=(ClassDef*)0x8 ? cd->name().data() : "<null>");
+ {
}
- ClassDef *classDef() const { return m_class; }
- uint letter() const { return m_letter; }
- int row() const { return m_row; }
- int column() const { return m_col; }
+ const ClassDef *classDef() const { return m_class; }
+ std::string letter() const { return m_letter; }
+ int row() const { return m_row; }
+ int column() const { return m_col; }
private:
- uint m_letter;
- ClassDef *m_class;
+ std::string m_letter;
+ const ClassDef *m_class;
int m_row;
int m_col;
};
-/** Class representing a row in the alphabetical class index. */
-class AlphaIndexTableRows : public QList<AlphaIndexTableCell>
-{
- public:
- AlphaIndexTableRows() { setAutoDelete(TRUE); }
-};
-
-/** Iterator for the cells in a row of the alphabetical class index. */
-class AlphaIndexTableRowsIterator : public QListIterator<AlphaIndexTableCell>
-{
- public:
- AlphaIndexTableRowsIterator(const AlphaIndexTableRows &list) :
- QListIterator<AlphaIndexTableCell>(list) {}
-};
-
-/** Class representing the columns in the alphabetical class index. */
-class AlphaIndexTableColumns : public QList<AlphaIndexTableRows>
-{
- public:
- AlphaIndexTableColumns() { setAutoDelete(TRUE); }
-};
-
-class UsedIndexLetters : public SIntDict<uint>
-{
- public:
- UsedIndexLetters() : SIntDict<uint>(257) { setAutoDelete(TRUE); }
- void add(uint letter)
- {
- uint *v = find(letter);
- if (v==0)
- {
- append(letter,new uint(letter));
- }
- }
- private:
- int compareValues( const uint *p1, const uint *p2) const
- {
- return (int)*p1 - (int)*p2; // subtracting is done by int not uint.
- }
-};
+using UsedIndexLetters = std::set<std::string>;
// write an alphabetical index of all class with a header for each letter
static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct, int annotatedCount)
@@ -2076,11 +2077,7 @@ static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct
UsedIndexLetters indexLettersUsed;
// first count the number of headers
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- uint startLetter=0;
- int headerItems=0;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (sliceOpt && cd->compoundType() != ct)
continue;
@@ -2091,50 +2088,36 @@ static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct
int index = getPrefixIndex(cd->className());
//printf("name=%s index=%d %d\n",cd->className().data(),index,cd->protection());
- startLetter=getUtf8CodeToLower(cd->className(),index);
- indexLettersUsed.add(startLetter);
+ char charStr[MAX_UTF8_CHAR_SIZE];
+ if (getUtf8Char(cd->className().data()+index,charStr,CaseModifier::ToUpper)>0)
+ // get the first UTF8 character (after the part that should be ignored)
+ {
+ indexLettersUsed.insert(charStr);
+ }
}
}
- indexLettersUsed.sort();
// write quick link index (row of letters)
QCString alphaLinks = "<div class=\"qindex\">";
- SIntDict<uint>::Iterator it(indexLettersUsed);
- uint *pLetter;
- for (it.toFirst();(pLetter=it.current());++it)
- {
- if (headerItems) alphaLinks += "&#160;|&#160;";
- headerItems++;
- QCString li = letterToLabel(*pLetter);
- QCString ls = letterToString(*pLetter);
+ bool first=true;
+ for (const auto &letter : indexLettersUsed)
+ {
+ if (!first) alphaLinks += "&#160;|&#160;";
+ first=false;
+ QCString li = letterToLabel(letter.c_str());
alphaLinks += (QCString)"<a class=\"qindex\" href=\"#letter_" +
li + "\">" +
- ls + "</a>";
+ letter + "</a>";
}
alphaLinks += "</div>\n";
ol.writeString(alphaLinks);
-
- // the number of columns in the table
- const int columns = Config_getInt(COLS_IN_ALPHA_INDEX);
-
- int i,j;
- int totalItems = headerItems*2 + annotatedCount; // number of items in the table (headers span 2 items)
- int rows = (totalItems + columns - 1)/columns; // number of rows in the table
-
- //printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n",
- // headerItems,totalItems,columns,rows,itemsInLastRow);
-
- // Keep a list of classes for each starting letter
- LetterToIndexMap<PrefixIgnoreClassList> classesByLetter;
- AlphaIndexTableColumns tableColumns;
+ std::map<std::string, std::vector<const ClassDef*> > classesByLetter;
// fill the columns with the class list (row elements in each column,
// expect for the columns with number >= itemsInLastRow, which get one
// item less.
- //int icount=0;
- startLetter=0;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if (sliceOpt && cd->compoundType() != ct)
continue;
@@ -2144,185 +2127,100 @@ static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct
if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
int index = getPrefixIndex(cd->className());
- startLetter=getUtf8CodeToLower(cd->className(),index);
- // Do some sorting again, since the classes are sorted by name with
- // prefix, which should be ignored really.
- if (cd->getLanguage()==SrcLangExt_VHDL)
+ char charStr[MAX_UTF8_CHAR_SIZE];
+ if (getUtf8Char(cd->className().data()+index,charStr,CaseModifier::ToUpper)>0)
+ // get the first UTF8 character (after the part that should be ignored)
{
- if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS )// no architecture
+ auto it = classesByLetter.find(charStr);
+ if (it!=classesByLetter.end()) // add class to the existing list
{
- classesByLetter.append(startLetter,cd);
+ it->second.push_back(cd.get());
+ }
+ else // new entry
+ {
+ classesByLetter.insert(
+ std::make_pair(std::string(charStr),
+ std::vector<const ClassDef*>({ cd.get() })));
}
- }
- else
- {
- classesByLetter.append(startLetter,cd);
}
}
}
- #define NEXT_ROW() \
- do \
- { \
- if (row>maxRows) maxRows=row; \
- if (row>=rows && col<columns) \
- { \
- col++; \
- row=0; \
- tableRows = new AlphaIndexTableRows; \
- tableColumns.append(tableRows); \
- } \
- } \
- while(0) \
-
- AlphaIndexTableRows *tableRows = new AlphaIndexTableRows;
- tableColumns.append(tableRows);
- int col=0,row=0,maxRows=0;
- PrefixIgnoreClassList *cl;
- SIntDict<PrefixIgnoreClassList>::Iterator lit(classesByLetter);
- for (lit.toFirst();(cl=lit.current());++lit)
+ // sort the class lists per letter while ignoring the prefix
+ for (auto &kv : classesByLetter)
{
- uint l = cl->letter();
- // add special header cell
- tableRows->append(new AlphaIndexTableCell(row,col,l,(ClassDef*)0x8));
- row++;
- tableRows->append(new AlphaIndexTableCell(row,col,0,(ClassDef*)0x8));
- row++;
- ClassListIterator cit(*cl);
- cit.toFirst();
- ClassDef *cd = cit.current();
- ++cit;
- tableRows->append(new AlphaIndexTableCell(row,col,0,cd));
- row++;
- NEXT_ROW();
- for (;(cd=cit.current()); ++cit)
- {
- // add normal cell
- tableRows->append(new AlphaIndexTableCell(row,col,0,cd));
- row++;
- NEXT_ROW();
- }
- }
-
- // create row iterators for each column
- AlphaIndexTableRowsIterator **colIterators = new AlphaIndexTableRowsIterator*[columns];
- for (i=0;i<columns;i++)
- {
- if (i<(int)tableColumns.count())
- {
- colIterators[i] = new AlphaIndexTableRowsIterator(*tableColumns.at(i));
- }
- else // empty column
- {
- colIterators[i] = 0;
- }
+ std::sort(kv.second.begin(), kv.second.end(),
+ [](const auto &c1,const auto &c2)
+ {
+ QCString n1 = c1->className();
+ QCString n2 = c2->className();
+ return qstricmp(n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2))<0;
+ });
}
- ol.writeString("<table class=\"classindex\">\n");
// generate table
- for (i=0;i<=maxRows;i++) // foreach table row
- {
- //printf("writing row %d\n",i);
- //ol.nextTableRow();
- ol.writeString("<tr>");
- // the last column may contain less items then the others
- //int colsInRow = (i<rows-1) ? columns : itemsInLastRow;
- //printf("row [%d]\n",i);
- bool cellCont = false;
- for (j=0;j<columns;j++) // foreach table column
- {
- if (colIterators[j])
+ if (!classesByLetter.empty())
+ {
+ ol.writeString("<div class=\"classindex\">\n");
+ int counter=0;
+ for (const auto &cl : classesByLetter)
+ {
+ QCString parity = (counter++%2)==0 ? "even" : "odd";
+ ol.writeString("<dl class=\"classindex " + parity + "\">\n");
+
+ // write character heading
+ ol.writeString("<dt class=\"alphachar\">");
+ QCString s = letterToLabel(cl.first.c_str());
+ ol.writeString("<a name=\"letter_");
+ ol.writeString(s);
+ ol.writeString("\">");
+ ol.writeString(cl.first.c_str());
+ ol.writeString("</a>");
+ ol.writeString("</dt>\n");
+
+ // write class links
+ for (const auto &cd : cl.second)
{
- AlphaIndexTableCell *cell = colIterators[j]->current();
- if (cell)
+ ol.writeString("<dd>");
+ QCString namesp,cname;
+ extractNamespaceName(cd->name(),cname,namesp);
+ QCString nsDispName;
+ SrcLangExt lang = cd->getLanguage();
+ QCString sep = getLanguageSpecificSeparator(lang);
+ if (sep!="::")
{
- if (cell->row()==i)
- {
- if (cell->letter()!=0)
- {
- cellCont = true;
- QCString s = letterToLabel(cell->letter());
- ol.writeString("<td rowspan=\"2\" valign=\"bottom\">");
- ol.writeString("<a name=\"letter_");
- ol.writeString(s);
- ol.writeString("\"></a>");
- ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
- "<tr>"
- "<td><div class=\"ah\">&#160;&#160;");
- ol.writeString(letterToString(cell->letter()));
- ol.writeString( "&#160;&#160;</div>"
- "</td>"
- "</tr>"
- "</table>\n");
- }
- else if (cell->classDef()!=(ClassDef*)0x8)
- {
- cellCont = true;
- cd = cell->classDef();
- ol.writeString("<td valign=\"top\">");
- QCString namesp,cname;
- //if (cd->getNamespaceDef()) namesp=cd->getNamespaceDef()->displayName();
- //QCString cname=cd->className();
- extractNamespaceName(cd->name(),cname,namesp);
- QCString nsDispName;
- SrcLangExt lang = cd->getLanguage();
- QCString sep = getLanguageSpecificSeparator(lang);
- if (sep!="::")
- {
- nsDispName=substitute(namesp,"::",sep);
- cname=substitute(cname,"::",sep);
- }
- else
- {
- nsDispName=namesp;
- }
-
- ol.writeObjectLink(cd->getReference(),
- cd->getOutputFileBase(),cd->anchor(),cname);
- if (!namesp.isEmpty())
- {
- ol.docify(" (");
- NamespaceDef *nd = getResolvedNamespace(namesp);
- if (nd && nd->isLinkable())
- {
- ol.writeObjectLink(nd->getReference(),
- nd->getOutputFileBase(),0,nsDispName);
- }
- else
- {
- ol.docify(nsDispName);
- }
- ol.docify(")");
- }
- ol.writeNonBreakableSpace(3);
- }
- ++(*colIterators[j]);
- if (cell->letter()!=0 || cell->classDef()!=(ClassDef*)0x8)
- {
- ol.writeString("</td>\n");
- }
- }
+ nsDispName=substitute(namesp,"::",sep);
+ cname=substitute(cname,"::",sep);
}
else
{
- cellCont = true;
- ol.writeString("<td></td>");
+ nsDispName=namesp;
}
- }
- }
- if (!cellCont) ol.writeString("<td></td>"); // we need at least one cell in case of xhtml
- ol.writeString("</tr>\n");
- }
- ol.writeString("</table>\n");
- ol.writeString(alphaLinks);
+ ol.writeObjectLink(cd->getReference(),
+ cd->getOutputFileBase(),cd->anchor(),cname);
+ if (!namesp.isEmpty())
+ {
+ ol.writeString(" (");
+ NamespaceDef *nd = getResolvedNamespace(namesp);
+ if (nd && nd->isLinkable())
+ {
+ ol.writeObjectLink(nd->getReference(),
+ nd->getOutputFileBase(),0,nsDispName);
+ }
+ else
+ {
+ ol.docify(nsDispName);
+ }
+ ol.writeString(")");
+ }
+ ol.writeString("</dd>");
+ }
- // release the temporary memory
- for (i=0;i<columns;i++)
- {
- delete colIterators[i];
+ ol.writeString("</dl>\n");
+ }
+ ol.writeString("</div>\n");
}
- delete[] colIterators;
}
//----------------------------------------------------------------------------
@@ -2443,26 +2341,50 @@ static void writeAlphabeticalExceptionIndex(OutputList &ol)
//----------------------------------------------------------------------------
-static void writeAnnotatedIndex(OutputList &ol)
+struct AnnotatedIndexContext
+{
+ AnnotatedIndexContext(int numAnno,int numPrint,
+ LayoutNavEntry::Kind lk,LayoutNavEntry::Kind fk,
+ const QCString &title,const QCString &intro,
+ ClassDef::CompoundType ct,
+ const QCString &fn,
+ HighlightedItem hi) :
+ numAnnotated(numAnno), numPrinted(numPrint),
+ listKind(lk), fallbackKind(fk),
+ listDefaultTitleText(title), listDefaultIntroText(intro),
+ compoundType(ct),fileBaseName(fn),
+ hiItem(hi) { }
+
+ const int numAnnotated;
+ const int numPrinted;
+ const LayoutNavEntry::Kind listKind;
+ const LayoutNavEntry::Kind fallbackKind;
+ const QCString listDefaultTitleText;
+ const QCString listDefaultIntroText;
+ const ClassDef::CompoundType compoundType;
+ const QCString fileBaseName;
+ const HighlightedItem hiItem;
+};
+
+static void writeAnnotatedIndexGeneric(OutputList &ol,const AnnotatedIndexContext ctx)
{
//printf("writeAnnotatedIndex: count=%d printed=%d\n",
// annotatedClasses,annotatedClassesPrinted);
- if (annotatedClasses==0) return;
+ if (ctx.numAnnotated==0) return;
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
- if (annotatedClassesPrinted==0)
+ if (ctx.numPrinted==0)
{
ol.disable(OutputGenerator::Latex);
ol.disable(OutputGenerator::RTF);
}
- LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassList);
- if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Classes); // fall back
- QCString title = lne ? lne->title() : theTranslator->trCompoundList();
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(ctx.listKind);
+ if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(ctx.fallbackKind); // fall back
+ QCString title = lne ? lne->title() : ctx.listDefaultTitleText;
bool addToIndex = lne==0 || lne->visible();
-
- startFile(ol,"annotated",0,title,HLI_AnnotatedClasses);
+ startFile(ol,ctx.fileBaseName,0,title,ctx.hiItem);
startTitle(ol,0);
ol.parseText(title);
@@ -2471,7 +2393,7 @@ static void writeAnnotatedIndex(OutputList &ol)
ol.startContents();
ol.startTextBlock();
- ol.parseText(lne ? lne->intro() : theTranslator->trCompoundListDescription());
+ ol.parseText(lne ? lne->intro() : ctx.listDefaultIntroText);
ol.endTextBlock();
// ---------------
@@ -2481,7 +2403,7 @@ static void writeAnnotatedIndex(OutputList &ol)
ol.disable(OutputGenerator::Html);
Doxygen::indexList->disable();
- writeAnnotatedClassList(ol, ClassDef::Class);
+ writeAnnotatedClassList(ol, ctx.compoundType);
Doxygen::indexList->enable();
ol.popGeneratorState();
@@ -2495,17 +2417,16 @@ static void writeAnnotatedIndex(OutputList &ol)
{
if (addToIndex)
{
- Doxygen::indexList->addContentsItem(TRUE,title,0,"annotated",0,TRUE,TRUE);
+ Doxygen::indexList->addContentsItem(TRUE,title,0,ctx.fileBaseName,0,TRUE,TRUE);
Doxygen::indexList->incContentsDepth();
}
- FTVHelp* ftv = new FTVHelp(FALSE);
- writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,TRUE,addToIndex,ClassDef::Class);
- writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE,ClassDef::Class);
+ FTVHelp ftv(false);
+ writeClassTreeInsideNamespace(*Doxygen::namespaceLinkedMap,&ftv,TRUE,addToIndex,ctx.compoundType);
+ writeClassTree(*Doxygen::classLinkedMap,&ftv,addToIndex,TRUE,ctx.compoundType);
QGString outStr;
FTextStream t(&outStr);
- ftv->generateTreeViewInline(t);
+ ftv.generateTreeViewInline(t);
ol.writeString(outStr);
- delete ftv;
if (addToIndex)
{
Doxygen::indexList->decContentsDepth();
@@ -2521,237 +2442,62 @@ static void writeAnnotatedIndex(OutputList &ol)
//----------------------------------------------------------------------------
-static void writeAnnotatedInterfaceIndex(OutputList &ol)
+static void writeAnnotatedIndex(OutputList &ol)
{
- //printf("writeAnnotatedInterfaceIndex: count=%d printed=%d\n",
- // annotatedInterfaces,annotatedInterfacesPrinted);
- if (annotatedInterfaces==0) return;
+ writeAnnotatedIndexGeneric(ol,
+ AnnotatedIndexContext(annotatedClasses,annotatedClassesPrinted,
+ LayoutNavEntry::ClassList,LayoutNavEntry::Classes,
+ theTranslator->trCompoundList(),theTranslator->trCompoundListDescription(),
+ ClassDef::Class,
+ "annotated",
+ HLI_AnnotatedClasses));
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- if (annotatedInterfacesPrinted==0)
- {
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- }
- LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::InterfaceList);
- if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Interfaces); // fall back
- QCString title = lne ? lne->title() : theTranslator->trInterfaceList();
- bool addToIndex = lne==0 || lne->visible();
-
- startFile(ol,"annotatedinterfaces",0,title,HLI_AnnotatedInterfaces);
-
- startTitle(ol,0);
- ol.parseText(title);
- endTitle(ol,0,0);
-
- ol.startContents();
-
- ol.startTextBlock();
- ol.parseText(lne ? lne->intro() : theTranslator->trInterfaceListDescription());
- ol.endTextBlock();
-
- // ---------------
- // Linear interface index for Latex/RTF
- // ---------------
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Html);
- Doxygen::indexList->disable();
-
- writeAnnotatedClassList(ol, ClassDef::Interface);
-
- Doxygen::indexList->enable();
- ol.popGeneratorState();
-
- // ---------------
- // Hierarchical interface index for HTML
- // ---------------
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
+}
- {
- if (addToIndex)
- {
- Doxygen::indexList->addContentsItem(TRUE,title,0,"annotatedinterfaces",0,TRUE,TRUE);
- Doxygen::indexList->incContentsDepth();
- }
- FTVHelp* ftv = new FTVHelp(FALSE);
- writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,TRUE,addToIndex,ClassDef::Interface);
- writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE,ClassDef::Interface);
- QGString outStr;
- FTextStream t(&outStr);
- ftv->generateTreeViewInline(t);
- ol.writeString(outStr);
- delete ftv;
- if (addToIndex)
- {
- Doxygen::indexList->decContentsDepth();
- }
- }
+//----------------------------------------------------------------------------
- ol.popGeneratorState();
- // ------
+static void writeAnnotatedInterfaceIndex(OutputList &ol)
+{
+ writeAnnotatedIndexGeneric(ol,
+ AnnotatedIndexContext(annotatedInterfaces,annotatedInterfacesPrinted,
+ LayoutNavEntry::InterfaceList,LayoutNavEntry::Interfaces,
+ theTranslator->trInterfaceList(),theTranslator->trInterfaceListDescription(),
+ ClassDef::Interface,
+ "annotatedinterfaces",
+ HLI_AnnotatedInterfaces));
- endFile(ol); // contains ol.endContents()
- ol.popGeneratorState();
}
//----------------------------------------------------------------------------
static void writeAnnotatedStructIndex(OutputList &ol)
{
- //printf("writeAnnotatedStructIndex: count=%d printed=%d\n",
- // annotatedStructs,annotatedStructsPrinted);
- if (annotatedStructs==0) return;
-
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- if (annotatedStructsPrinted==0)
- {
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- }
- LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::StructList);
- if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Structs); // fall back
- QCString title = lne ? lne->title() : theTranslator->trStructList();
- bool addToIndex = lne==0 || lne->visible();
-
- startFile(ol,"annotatedstructs",0,title,HLI_AnnotatedStructs);
-
- startTitle(ol,0);
- ol.parseText(title);
- endTitle(ol,0,0);
-
- ol.startContents();
-
- ol.startTextBlock();
- ol.parseText(lne ? lne->intro() : theTranslator->trStructListDescription());
- ol.endTextBlock();
-
- // ---------------
- // Linear struct index for Latex/RTF
- // ---------------
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Html);
- Doxygen::indexList->disable();
-
- writeAnnotatedClassList(ol, ClassDef::Struct);
+ writeAnnotatedIndexGeneric(ol,
+ AnnotatedIndexContext(annotatedStructs,annotatedStructsPrinted,
+ LayoutNavEntry::StructList,LayoutNavEntry::Structs,
+ theTranslator->trStructList(),theTranslator->trStructListDescription(),
+ ClassDef::Struct,
+ "annotatedstructs",
+ HLI_AnnotatedStructs));
- Doxygen::indexList->enable();
- ol.popGeneratorState();
-
- // ---------------
- // Hierarchical struct index for HTML
- // ---------------
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- {
- if (addToIndex)
- {
- Doxygen::indexList->addContentsItem(TRUE,title,0,"annotatedstructs",0,TRUE,TRUE);
- Doxygen::indexList->incContentsDepth();
- }
- FTVHelp* ftv = new FTVHelp(FALSE);
- writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,TRUE,addToIndex,ClassDef::Struct);
- writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE,ClassDef::Struct);
- QGString outStr;
- FTextStream t(&outStr);
- ftv->generateTreeViewInline(t);
- ol.writeString(outStr);
- delete ftv;
- if (addToIndex)
- {
- Doxygen::indexList->decContentsDepth();
- }
- }
-
- ol.popGeneratorState();
- // ------
-
- endFile(ol); // contains ol.endContents()
- ol.popGeneratorState();
}
//----------------------------------------------------------------------------
static void writeAnnotatedExceptionIndex(OutputList &ol)
{
- //printf("writeAnnotatedExceptionIndex: count=%d printed=%d\n",
- // annotatedExceptions,annotatedExceptionsPrinted);
- if (annotatedExceptions==0) return;
-
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- if (annotatedExceptionsPrinted==0)
- {
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- }
- LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ExceptionList);
- if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Exceptions); // fall back
- QCString title = lne ? lne->title() : theTranslator->trExceptionList();
- bool addToIndex = lne==0 || lne->visible();
-
- startFile(ol,"annotatedexceptions",0,title,HLI_AnnotatedExceptions);
-
- startTitle(ol,0);
- ol.parseText(title);
- endTitle(ol,0,0);
-
- ol.startContents();
-
- ol.startTextBlock();
- ol.parseText(lne ? lne->intro() : theTranslator->trExceptionListDescription());
- ol.endTextBlock();
-
- // ---------------
- // Linear interface index for Latex/RTF
- // ---------------
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Html);
- Doxygen::indexList->disable();
-
- writeAnnotatedClassList(ol, ClassDef::Exception);
-
- Doxygen::indexList->enable();
- ol.popGeneratorState();
-
- // ---------------
- // Hierarchical interface index for HTML
- // ---------------
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- {
- if (addToIndex)
- {
- Doxygen::indexList->addContentsItem(TRUE,title,0,"annotatedexceptions",0,TRUE,TRUE);
- Doxygen::indexList->incContentsDepth();
- }
- FTVHelp* ftv = new FTVHelp(FALSE);
- writeNamespaceTree(Doxygen::namespaceSDict,ftv,TRUE,TRUE,addToIndex,ClassDef::Exception);
- writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE,ClassDef::Exception);
- QGString outStr;
- FTextStream t(&outStr);
- ftv->generateTreeViewInline(t);
- ol.writeString(outStr);
- delete ftv;
- if (addToIndex)
- {
- Doxygen::indexList->decContentsDepth();
- }
- }
+ writeAnnotatedIndexGeneric(ol,
+ AnnotatedIndexContext(annotatedExceptions,annotatedExceptionsPrinted,
+ LayoutNavEntry::ExceptionList,LayoutNavEntry::Exceptions,
+ theTranslator->trExceptionList(),theTranslator->trExceptionListDescription(),
+ ClassDef::Exception,
+ "annotatedexceptions",
+ HLI_AnnotatedExceptions));
- ol.popGeneratorState();
- // ------
-
- endFile(ol); // contains ol.endContents()
- ol.popGeneratorState();
}
//----------------------------------------------------------------------------
-static void writeClassLinkForMember(OutputList &ol,MemberDef *md,const char *separator,
+static void writeClassLinkForMember(OutputList &ol,const MemberDef *md,const char *separator,
QCString &prevClassName)
{
const ClassDef *cd=md->getClassDef();
@@ -2765,7 +2511,7 @@ static void writeClassLinkForMember(OutputList &ol,MemberDef *md,const char *sep
}
}
-static void writeFileLinkForMember(OutputList &ol,MemberDef *md,const char *separator,
+static void writeFileLinkForMember(OutputList &ol,const MemberDef *md,const char *separator,
QCString &prevFileName)
{
const FileDef *fd=md->getFileDef();
@@ -2779,7 +2525,7 @@ static void writeFileLinkForMember(OutputList &ol,MemberDef *md,const char *sepa
}
}
-static void writeNamespaceLinkForMember(OutputList &ol,MemberDef *md,const char *separator,
+static void writeNamespaceLinkForMember(OutputList &ol,const MemberDef *md,const char *separator,
QCString &prevNamespaceName)
{
const NamespaceDef *nd=md->getNamespaceDef();
@@ -2793,14 +2539,14 @@ static void writeNamespaceLinkForMember(OutputList &ol,MemberDef *md,const char
}
}
-static void writeMemberList(OutputList &ol,bool useSections,int page,
- const LetterToIndexMap<MemberIndexList> &memberLists,
- DefinitionIntf::DefType type)
+static void writeMemberList(OutputList &ol,bool useSections,const std::string &page,
+ const MemberIndexMap &memberIndexMap,
+ Definition::DefType type)
{
int index = (int)type;
ASSERT(index<3);
- typedef void (*writeLinkForMember_t)(OutputList &ol,MemberDef *md,const char *separator,
+ typedef void (*writeLinkForMember_t)(OutputList &ol,const MemberDef *md,const char *separator,
QCString &prevNamespaceName);
// each index tab has its own write function
@@ -2815,20 +2561,26 @@ static void writeMemberList(OutputList &ol,bool useSections,int page,
bool first=TRUE;
bool firstSection=TRUE;
bool firstItem=TRUE;
- MemberIndexList *ml;
- SIntDict<MemberIndexList>::Iterator it(memberLists);
- for (it.toFirst();(ml=it.current());++it)
+ const MemberIndexList *mil = 0;
+ std::string letter;
+ for (const auto &kv : memberIndexMap)
{
- if (page!=-1)
+ if (!page.empty()) // specific page mode
+ {
+ auto it = memberIndexMap.find(page);
+ if (it != memberIndexMap.end())
+ {
+ mil = &it->second;
+ letter = page;
+ }
+ }
+ else // do all pages
{
- ml = memberLists[page];
- it.toLast();
+ mil = &kv.second;
+ letter = kv.first;
}
- if (ml==0 || ml->count()==0) continue;
- ml->sort();
- QListIterator<MemberDef> mli(*ml);
- MemberDef *md;
- for (mli.toFirst();(md=mli.current());++mli)
+ if (mil==0 || mil->empty()) continue;
+ for (const auto &md : *mil)
{
const char *sep;
bool isFunc=!md->isObjCMethod() &&
@@ -2843,13 +2595,12 @@ static void writeMemberList(OutputList &ol,bool useSections,int page,
{
if (!firstItem) ol.endItemListItem();
if (!firstSection) ol.endItemList();
- QCString cs = letterToLabel(ml->letter());
- QCString cl = letterToString(ml->letter());
+ QCString cs = letterToLabel(letter.c_str());
QCString anchor=(QCString)"index_"+convertToId(cs);
- QCString title=(QCString)"- "+cl+" -";
- ol.startSection(anchor,title,SectionInfo::Subsection);
+ QCString title=(QCString)"- "+letter.c_str()+" -";
+ ol.startSection(anchor,title,SectionType::Subsection);
ol.docify(title);
- ol.endSection(anchor,SectionInfo::Subsection);
+ ol.endSection(anchor,SectionType::Subsection);
ol.startItemList();
firstSection=FALSE;
firstItem=TRUE;
@@ -2884,6 +2635,10 @@ static void writeMemberList(OutputList &ol,bool useSections,int page,
writeLinkForMemberMap[index](ol,md,sep,prevDefName);
}
}
+ if (!page.empty())
+ {
+ break;
+ }
}
if (!firstItem) ol.endItemListItem();
ol.endItemList();
@@ -2897,11 +2652,11 @@ void initClassMemberIndices()
for (j=0;j<CMHL_Total;j++)
{
documentedClassMembers[j]=0;
- g_memberIndexLetterUsed[j].clear();
+ g_classIndexLetterUsed[j].clear();
}
}
-void addClassMemberNameToIndex(MemberDef *md)
+void addClassMemberNameToIndex(const MemberDef *md)
{
static bool hideFriendCompounds = Config_getBool(HIDE_FRIEND_COMPOUNDS);
const ClassDef *cd=0;
@@ -2913,8 +2668,8 @@ void addClassMemberNameToIndex(MemberDef *md)
{
QCString n = md->name();
int index = getPrefixIndex(n);
- uint letter = getUtf8CodeToLower(n,index);
- if (!n.isEmpty())
+ char letter[MAX_UTF8_CHAR_SIZE];
+ if (getUtf8Char(n.data()+index,letter,CaseModifier::ToLower)>0)
{
bool isFriendToHide = hideFriendCompounds &&
(QCString(md->typeString())=="friend class" ||
@@ -2924,48 +2679,48 @@ void addClassMemberNameToIndex(MemberDef *md)
(!md->isEnumValue() || (md->getEnumScope() && !md->getEnumScope()->isStrong()))
)
{
- g_memberIndexLetterUsed[CMHL_All].append(letter,md);
+ MemberIndexMap_add(g_classIndexLetterUsed[CMHL_All],letter,md);
documentedClassMembers[CMHL_All]++;
}
if (md->isFunction() || md->isSlot() || md->isSignal())
{
- g_memberIndexLetterUsed[CMHL_Functions].append(letter,md);
+ MemberIndexMap_add(g_classIndexLetterUsed[CMHL_Functions],letter,md);
documentedClassMembers[CMHL_Functions]++;
}
else if (md->isVariable())
{
- g_memberIndexLetterUsed[CMHL_Variables].append(letter,md);
+ MemberIndexMap_add(g_classIndexLetterUsed[CMHL_Variables],letter,md);
documentedClassMembers[CMHL_Variables]++;
}
else if (md->isTypedef())
{
- g_memberIndexLetterUsed[CMHL_Typedefs].append(letter,md);
+ MemberIndexMap_add(g_classIndexLetterUsed[CMHL_Typedefs],letter,md);
documentedClassMembers[CMHL_Typedefs]++;
}
else if (md->isEnumerate())
{
- g_memberIndexLetterUsed[CMHL_Enums].append(letter,md);
+ MemberIndexMap_add(g_classIndexLetterUsed[CMHL_Enums],letter,md);
documentedClassMembers[CMHL_Enums]++;
}
else if (md->isEnumValue() && md->getEnumScope() && !md->getEnumScope()->isStrong())
{
- g_memberIndexLetterUsed[CMHL_EnumValues].append(letter,md);
+ MemberIndexMap_add(g_classIndexLetterUsed[CMHL_EnumValues],letter,md);
documentedClassMembers[CMHL_EnumValues]++;
}
else if (md->isProperty())
{
- g_memberIndexLetterUsed[CMHL_Properties].append(letter,md);
+ MemberIndexMap_add(g_classIndexLetterUsed[CMHL_Properties],letter,md);
documentedClassMembers[CMHL_Properties]++;
}
else if (md->isEvent())
{
- g_memberIndexLetterUsed[CMHL_Events].append(letter,md);
+ MemberIndexMap_add(g_classIndexLetterUsed[CMHL_Events],letter,md);
documentedClassMembers[CMHL_Events]++;
}
else if (md->isRelated() || md->isForeign() ||
(md->isFriend() && !isFriendToHide))
{
- g_memberIndexLetterUsed[CMHL_Related].append(letter,md);
+ MemberIndexMap_add(g_classIndexLetterUsed[CMHL_Related],letter,md);
documentedClassMembers[CMHL_Related]++;
}
}
@@ -2984,55 +2739,55 @@ void initNamespaceMemberIndices()
}
}
-void addNamespaceMemberNameToIndex(MemberDef *md)
+void addNamespaceMemberNameToIndex(const MemberDef *md)
{
const NamespaceDef *nd=md->getNamespaceDef();
if (nd && nd->isLinkableInProject() && md->isLinkableInProject())
{
QCString n = md->name();
int index = getPrefixIndex(n);
- uint letter = getUtf8CodeToLower(n,index);
- if (!n.isEmpty())
+ char letter[MAX_UTF8_CHAR_SIZE];
+ if (getUtf8Char(n.data()+index,letter,CaseModifier::ToLower)>0)
{
if (!md->isEnumValue() || (md->getEnumScope() && !md->getEnumScope()->isStrong()))
{
- g_namespaceIndexLetterUsed[NMHL_All].append(letter,md);
+ MemberIndexMap_add(g_namespaceIndexLetterUsed[NMHL_All],letter,md);
documentedNamespaceMembers[NMHL_All]++;
}
if (md->isFunction())
{
- g_namespaceIndexLetterUsed[NMHL_Functions].append(letter,md);
+ MemberIndexMap_add(g_namespaceIndexLetterUsed[NMHL_Functions],letter,md);
documentedNamespaceMembers[NMHL_Functions]++;
}
else if (md->isVariable())
{
- g_namespaceIndexLetterUsed[NMHL_Variables].append(letter,md);
+ MemberIndexMap_add(g_namespaceIndexLetterUsed[NMHL_Variables],letter,md);
documentedNamespaceMembers[NMHL_Variables]++;
}
else if (md->isTypedef())
{
- g_namespaceIndexLetterUsed[NMHL_Typedefs].append(letter,md);
+ MemberIndexMap_add(g_namespaceIndexLetterUsed[NMHL_Typedefs],letter,md);
documentedNamespaceMembers[NMHL_Typedefs]++;
}
else if (md->isSequence())
{
- g_namespaceIndexLetterUsed[NMHL_Sequences].append(letter,md);
+ MemberIndexMap_add(g_namespaceIndexLetterUsed[NMHL_Sequences],letter,md);
documentedNamespaceMembers[NMHL_Sequences]++;
}
else if (md->isDictionary())
{
- g_namespaceIndexLetterUsed[NMHL_Dictionaries].append(letter,md);
+ MemberIndexMap_add(g_namespaceIndexLetterUsed[NMHL_Dictionaries],letter,md);
documentedNamespaceMembers[NMHL_Dictionaries]++;
}
else if (md->isEnumerate())
{
- g_namespaceIndexLetterUsed[NMHL_Enums].append(letter,md);
+ MemberIndexMap_add(g_namespaceIndexLetterUsed[NMHL_Enums],letter,md);
documentedNamespaceMembers[NMHL_Enums]++;
}
else if (md->isEnumValue() && md->getEnumScope() && !md->getEnumScope()->isStrong())
{
- g_namespaceIndexLetterUsed[NMHL_EnumValues].append(letter,md);
+ MemberIndexMap_add(g_namespaceIndexLetterUsed[NMHL_EnumValues],letter,md);
documentedNamespaceMembers[NMHL_EnumValues]++;
}
}
@@ -3051,60 +2806,60 @@ void initFileMemberIndices()
}
}
-void addFileMemberNameToIndex(MemberDef *md)
+void addFileMemberNameToIndex(const MemberDef *md)
{
const FileDef *fd=md->getFileDef();
if (fd && fd->isLinkableInProject() && md->isLinkableInProject())
{
QCString n = md->name();
int index = getPrefixIndex(n);
- uint letter = getUtf8CodeToLower(n,index);
- if (!n.isEmpty())
+ char letter[MAX_UTF8_CHAR_SIZE];
+ if (getUtf8Char(n.data()+index,letter,CaseModifier::ToLower)>0)
{
if (!md->isEnumValue() || (md->getEnumScope() && !md->getEnumScope()->isStrong()))
{
- g_fileIndexLetterUsed[FMHL_All].append(letter,md);
+ MemberIndexMap_add(g_fileIndexLetterUsed[FMHL_All],letter,md);
documentedFileMembers[FMHL_All]++;
}
if (md->isFunction())
{
- g_fileIndexLetterUsed[FMHL_Functions].append(letter,md);
+ MemberIndexMap_add(g_fileIndexLetterUsed[FMHL_Functions],letter,md);
documentedFileMembers[FMHL_Functions]++;
}
else if (md->isVariable())
{
- g_fileIndexLetterUsed[FMHL_Variables].append(letter,md);
+ MemberIndexMap_add(g_fileIndexLetterUsed[FMHL_Variables],letter,md);
documentedFileMembers[FMHL_Variables]++;
}
else if (md->isTypedef())
{
- g_fileIndexLetterUsed[FMHL_Typedefs].append(letter,md);
+ MemberIndexMap_add(g_fileIndexLetterUsed[FMHL_Typedefs],letter,md);
documentedFileMembers[FMHL_Typedefs]++;
}
else if (md->isSequence())
{
- g_fileIndexLetterUsed[FMHL_Sequences].append(letter,md);
+ MemberIndexMap_add(g_fileIndexLetterUsed[FMHL_Sequences],letter,md);
documentedFileMembers[FMHL_Sequences]++;
}
else if (md->isDictionary())
{
- g_fileIndexLetterUsed[FMHL_Dictionaries].append(letter,md);
+ MemberIndexMap_add(g_fileIndexLetterUsed[FMHL_Dictionaries],letter,md);
documentedFileMembers[FMHL_Dictionaries]++;
}
else if (md->isEnumerate())
{
- g_fileIndexLetterUsed[FMHL_Enums].append(letter,md);
+ MemberIndexMap_add(g_fileIndexLetterUsed[FMHL_Enums],letter,md);
documentedFileMembers[FMHL_Enums]++;
}
else if (md->isEnumValue() && md->getEnumScope() && !md->getEnumScope()->isStrong())
{
- g_fileIndexLetterUsed[FMHL_EnumValues].append(letter,md);
+ MemberIndexMap_add(g_fileIndexLetterUsed[FMHL_EnumValues],letter,md);
documentedFileMembers[FMHL_EnumValues]++;
}
else if (md->isDefine())
{
- g_fileIndexLetterUsed[FMHL_Defines].append(letter,md);
+ MemberIndexMap_add(g_fileIndexLetterUsed[FMHL_Defines],letter,md);
documentedFileMembers[FMHL_Defines]++;
}
}
@@ -3113,19 +2868,47 @@ void addFileMemberNameToIndex(MemberDef *md)
//----------------------------------------------------------------------------
+static void sortMemberIndexList(MemberIndexMap &map)
+{
+ for (auto &kv : map)
+ {
+ std::sort(kv.second.begin(),kv.second.end(),
+ [](const MemberDef *md1,const MemberDef *md2)
+ {
+ int result = qstricmp(md1->name(),md2->name());
+ return result==0 ? qstricmp(md1->qualifiedName(),md2->qualifiedName())<0 : result<0;
+ });
+ }
+}
+
+void sortMemberIndexLists()
+{
+ for (auto &idx : g_classIndexLetterUsed)
+ {
+ sortMemberIndexList(idx);
+ }
+ for (auto &idx : g_fileIndexLetterUsed)
+ {
+ sortMemberIndexList(idx);
+ }
+ for (auto &idx : g_namespaceIndexLetterUsed)
+ {
+ sortMemberIndexList(idx);
+ }
+}
+
+//----------------------------------------------------------------------------
+
static void writeQuickMemberIndex(OutputList &ol,
- const LetterToIndexMap<MemberIndexList> &charUsed,uint page,
+ const MemberIndexMap &map,const std::string &page,
QCString fullName,bool multiPage)
{
bool first=TRUE;
startQuickIndexList(ol,TRUE);
- SIntDict<MemberIndexList>::Iterator it(charUsed);
- MemberIndexList *ml;
- for (it.toFirst();(ml=it.current());++it)
+ for (const auto &kv : map)
{
- uint i = ml->letter();
- QCString is = letterToLabel(i);
- QCString ci = letterToString(i);
+ QCString ci = kv.first.c_str();
+ QCString is = letterToLabel(ci);
QCString anchor;
QCString extension=Doxygen::htmlFileExtension;
if (!multiPage)
@@ -3133,8 +2916,8 @@ static void writeQuickMemberIndex(OutputList &ol,
else if (first)
anchor=fullName+extension+"#index_";
else
- anchor=fullName+"_"+letterToLabel(i)+extension+"#index_";
- startQuickIndexItem(ol,anchor+convertToId(is),i==page,TRUE,first);
+ anchor=fullName+"_"+is+extension+"#index_";
+ startQuickIndexItem(ol,anchor+convertToId(is),kv.first==page,TRUE,first);
ol.writeString(ci);
endQuickIndexItem(ol);
first=FALSE;
@@ -3152,7 +2935,7 @@ struct CmhlInfo
QCString title;
};
-static const CmhlInfo *getCmhlInfo(int hl)
+static const CmhlInfo *getCmhlInfo(size_t hl)
{
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
@@ -3203,19 +2986,17 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h
}
bool first=TRUE;
- SIntDict<MemberIndexList>::Iterator it(g_memberIndexLetterUsed[hl]);
- MemberIndexList *ml;
- for (it.toFirst();(ml=it.current());++it)
+ for (const auto &kv : g_classIndexLetterUsed[hl])
{
- uint page = ml->letter();
+ std::string page = kv.first;
QCString fileName = getCmhlInfo(hl)->fname;
if (multiPageIndex)
{
+ QCString cs = page;
if (!first)
{
- fileName+="_"+letterToLabel(page);
+ fileName+="_"+letterToLabel(cs);
}
- QCString cs = letterToString(page);
if (addToIndex)
{
Doxygen::indexList->addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE);
@@ -3258,7 +3039,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h
// quick alphabetical index
if (quickIndex)
{
- writeQuickMemberIndex(ol,g_memberIndexLetterUsed[hl],page,
+ writeQuickMemberIndex(ol,g_classIndexLetterUsed[hl],page,
getCmhlInfo(hl)->fname,multiPageIndex);
}
}
@@ -3283,8 +3064,8 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h
}
writeMemberList(ol,quickIndex,
- multiPageIndex?page:-1,
- g_memberIndexLetterUsed[hl],
+ multiPageIndex ? page : std::string(),
+ g_classIndexLetterUsed[hl],
Definition::TypeClass);
endFile(ol);
first=FALSE;
@@ -3331,7 +3112,7 @@ struct FmhlInfo
QCString title;
};
-static const FmhlInfo *getFmhlInfo(int hl)
+static const FmhlInfo *getFmhlInfo(size_t hl)
{
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
@@ -3382,19 +3163,17 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl)
}
bool first=TRUE;
- SIntDict<MemberIndexList>::Iterator it(g_fileIndexLetterUsed[hl]);
- MemberIndexList *ml;
- for (it.toFirst();(ml=it.current());++it)
+ for (const auto &kv : g_fileIndexLetterUsed[hl])
{
- uint page = ml->letter();
+ std::string page = kv.first;
QCString fileName = getFmhlInfo(hl)->fname;
if (multiPageIndex)
{
+ QCString cs = page;
if (!first)
{
- fileName+="_"+letterToLabel(page);
+ fileName+="_"+letterToLabel(cs);
}
- QCString cs = letterToString(page);
if (addToIndex)
{
Doxygen::indexList->addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE);
@@ -3459,7 +3238,7 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl)
}
writeMemberList(ol,quickIndex,
- multiPageIndex?page:-1,
+ multiPageIndex ? page : std::string(),
g_fileIndexLetterUsed[hl],
Definition::TypeFile);
endFile(ol);
@@ -3504,7 +3283,7 @@ struct NmhlInfo
QCString title;
};
-static const NmhlInfo *getNmhlInfo(int hl)
+static const NmhlInfo *getNmhlInfo(size_t hl)
{
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
@@ -3558,19 +3337,17 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol,
}
bool first=TRUE;
- SIntDict<MemberIndexList>::Iterator it(g_namespaceIndexLetterUsed[hl]);
- MemberIndexList *ml;
- for (it.toFirst();(ml=it.current());++it)
+ for (const auto &kv : g_namespaceIndexLetterUsed[hl])
{
- uint page = ml->letter();
+ std::string page = kv.first;
QCString fileName = getNmhlInfo(hl)->fname;
if (multiPageIndex)
{
+ QCString cs = page;
if (!first)
{
- fileName+="_"+letterToLabel(page);
+ fileName+="_"+letterToLabel(cs);
}
- QCString cs = letterToString(page);
if (addToIndex)
{
Doxygen::indexList->addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE);
@@ -3635,7 +3412,7 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol,
}
writeMemberList(ol,quickIndex,
- multiPageIndex?page:-1,
+ multiPageIndex ? page : std::string(),
g_namespaceIndexLetterUsed[hl],
Definition::TypeNamespace);
endFile(ol);
@@ -3676,7 +3453,7 @@ static void writeNamespaceMemberIndex(OutputList &ol)
static void writeExampleIndex(OutputList &ol)
{
- if (Doxygen::exampleSDict->count()==0) return;
+ if (Doxygen::exampleLinkedMap->empty()) return;
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Docbook);
@@ -3703,9 +3480,7 @@ static void writeExampleIndex(OutputList &ol)
ol.endTextBlock();
ol.startItemList();
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::exampleLinkedMap)
{
ol.startItemListItem();
QCString n=pd->getOutputFileBase();
@@ -3744,15 +3519,13 @@ static void writeExampleIndex(OutputList &ol)
static void countRelatedPages(int &docPages,int &indexPages)
{
docPages=indexPages=0;
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
- if ( pd->visibleInIndex())
+ if (pd->visibleInIndex())
{
indexPages++;
}
- if ( pd->documentedPage())
+ if (pd->documentedPage())
{
docPages++;
}
@@ -3772,7 +3545,7 @@ static bool mainPageHasOwnTitle()
return !projectName.isEmpty() && mainPageHasTitle() && qstricmp(title,projectName)!=0;
}
-static void writePages(PageDef *pd,FTVHelp *ftv)
+static void writePages(const PageDef *pd,FTVHelp *ftv)
{
//printf("writePages()=%s pd=%p mainpage=%p\n",pd->name().data(),pd,Doxygen::mainPage);
LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Pages);
@@ -3799,7 +3572,7 @@ static void writePages(PageDef *pd,FTVHelp *ftv)
pd->getReference(),pd->getOutputFileBase(),
0,hasSubPages,TRUE,pd);
}
- if (addToIndex && pd!=Doxygen::mainPage)
+ if (addToIndex && pd!=Doxygen::mainPage.get())
{
Doxygen::indexList->addContentsItem(
hasSubPages || hasSections,pageTitle,
@@ -3809,24 +3582,18 @@ static void writePages(PageDef *pd,FTVHelp *ftv)
}
if (hasSubPages && ftv) ftv->incContentsDepth();
bool doIndent = (hasSections || hasSubPages) &&
- (pd!=Doxygen::mainPage || mainPageHasOwnTitle());
+ (pd!=Doxygen::mainPage.get() || mainPageHasOwnTitle());
if (doIndent)
{
Doxygen::indexList->incContentsDepth();
}
if (hasSections)
{
- pd->addSectionsToIndex();
+ const_cast<PageDef*>(pd)->addSectionsToIndex();
}
- PageSDict *subPages = pd->getSubPages();
- if (subPages)
+ for (const auto &subPage : pd->getSubPages())
{
- PageSDict::Iterator pi(*subPages);
- PageDef *subPage;
- for (pi.toFirst();(subPage=pi.current());++pi)
- {
- writePages(subPage,ftv);
- }
+ writePages(subPage,ftv);
}
if (hasSubPages && ftv) ftv->decContentsDepth();
if (doIndent)
@@ -3856,16 +3623,14 @@ static void writePageIndex(OutputList &ol)
{
FTVHelp* ftv = new FTVHelp(FALSE);
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
if ((pd->getOuterScope()==0 ||
pd->getOuterScope()->definitionType()!=Definition::TypePage) && // not a sub page
!pd->isReference() // not an external page
)
{
- writePages(pd,ftv);
+ writePages(pd.get(),ftv);
}
}
QGString outStr;
@@ -3887,9 +3652,7 @@ static void writePageIndex(OutputList &ol)
static int countGroups()
{
int count=0;
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (!gd->isReference())
{
@@ -3905,9 +3668,7 @@ static int countGroups()
static int countDirs()
{
int count=0;
- SDict<DirDef>::Iterator dli(*Doxygen::directories);
- DirDef *dd;
- for (dli.toFirst();(dd=dli.current());++dli)
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
if (dd->isLinkableInProject())
{
@@ -3929,14 +3690,14 @@ void writeGraphInfo(OutputList &ol)
DotLegendGraph gd;
gd.writeGraph(Config_getString(HTML_OUTPUT));
- bool &stripCommentsStateRef = Config_getBool(STRIP_CODE_COMMENTS);
+ bool stripCommentsStateRef = Config_getBool(STRIP_CODE_COMMENTS);
bool oldStripCommentsState = stripCommentsStateRef;
- bool &createSubdirs = Config_getBool(CREATE_SUBDIRS);
+ bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
bool oldCreateSubdirs = createSubdirs;
// temporarily disable the stripping of comments for our own code example!
- stripCommentsStateRef = FALSE;
+ stripCommentsStateRef = Config_updateBool(STRIP_CODE_COMMENTS,FALSE);
// temporarily disable create subdirs for linking to our example
- createSubdirs = FALSE;
+ createSubdirs = Config_updateBool(CREATE_SUBDIRS,FALSE);
startFile(ol,"graph_legend",0,theTranslator->trLegendTitle().data());
startTitle(ol,0);
@@ -3953,12 +3714,13 @@ void writeGraphInfo(OutputList &ol)
//printf("legendDocs=%s\n",legendDocs.data());
}
FileDef *fd = createFileDef("","graph_legend.dox");
- ol.generateDoc("graph_legend",1,fd,0,legendDocs,FALSE,FALSE);
+ ol.generateDoc("graph_legend",1,fd,0,legendDocs,FALSE,FALSE,
+ 0,FALSE,FALSE,FALSE);
delete fd;
// restore config settings
- stripCommentsStateRef = oldStripCommentsState;
- createSubdirs = oldCreateSubdirs;
+ Config_updateBool(STRIP_CODE_COMMENTS,oldStripCommentsState);
+ Config_updateBool(CREATE_SUBDIRS,oldCreateSubdirs);
endFile(ol);
ol.popGeneratorState();
@@ -3970,7 +3732,7 @@ void writeGraphInfo(OutputList &ol)
/*!
* write groups as hierarchical trees
*/
-static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv, bool addToIndex)
+static void writeGroupTreeNode(OutputList &ol, const GroupDef *gd, int level, FTVHelp* ftv, bool addToIndex)
{
//bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
//bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
@@ -3992,25 +3754,23 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
{
//printf("gd->name()=%s #members=%d\n",gd->name().data(),gd->countMembers());
// write group info
- bool hasSubGroups = gd->getSubGroups()->count()>0;
- bool hasSubPages = gd->getPages()->count()>0;
- int numSubItems = 0;
+ bool hasSubGroups = !gd->getSubGroups().empty();
+ bool hasSubPages = !gd->getPages().empty();
+ size_t numSubItems = 0;
if (1 /*Config_getBool(TOC_EXPAND)*/)
{
- QListIterator<MemberList> mli(gd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : gd->getMemberLists())
{
if (ml->listType()&MemberListType_documentationLists)
{
numSubItems += ml->count();
}
}
- numSubItems += gd->getNamespaces()->count();
- numSubItems += gd->getClasses()->count();
+ numSubItems += gd->getNamespaces().size();
+ numSubItems += gd->getClasses().size();
numSubItems += gd->getFiles()->count();
- numSubItems += gd->getDirs()->count();
- numSubItems += gd->getPages()->count();
+ numSubItems += gd->getDirs().size();
+ numSubItems += gd->getPages().size();
}
bool isDir = hasSubGroups || hasSubPages || numSubItems>0;
@@ -4059,7 +3819,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
for (mi.toFirst();(md=mi.current());++mi)
{
const MemberList *enumList = md->enumFieldList();
- bool isDir = enumList!=0 && md->isEnumerate();
+ isDir = enumList!=0 && md->isEnumerate();
if (md->isVisible() && !md->isAnonymous())
{
Doxygen::indexList->addContentsItem(isDir,
@@ -4087,13 +3847,11 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
}
else if (lde->kind()==LayoutDocEntry::GroupClasses && addToIndex)
{
- ClassSDict::Iterator it(*gd->getClasses());
- ClassDef *cd;
- for (;(cd=it.current());++it)
+ for (const auto &cd : gd->getClasses())
{
//bool nestedClassInSameGroup =
// cd->getOuterScope() && cd->getOuterScope()->definitionType()==Definition::TypeClass &&
- // cd->getOuterScope()->partOfGroups()!=0 && cd->getOuterScope()->partOfGroups()->contains(gd);
+ // cd->getOuterScope()->partOfGroups().empty() && cd->getOuterScope()->partOfGroups()->contains(gd);
//printf("===== GroupClasses: %s visible=%d nestedClassInSameGroup=%d\n",cd->name().data(),cd->isVisible(),nestedClassInSameGroup);
if (cd->isVisible() /*&& !nestedClassInSameGroup*/)
{
@@ -4114,9 +3872,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
}
else if (lde->kind()==LayoutDocEntry::GroupNamespaces && addToIndex)
{
- NamespaceSDict::Iterator it(*gd->getNamespaces());
- NamespaceDef *nd;
- for (;(nd=it.current());++it)
+ for (const auto &nd : gd->getNamespaces())
{
if (nd->isVisible())
{
@@ -4142,9 +3898,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
}
else if (lde->kind()==LayoutDocEntry::GroupDirs && addToIndex)
{
- QListIterator<DirDef> it(*gd->getDirs());
- DirDef *dd;
- for (;(dd=it.current());++it)
+ for (const auto &dd : gd->getDirs())
{
if (dd->isVisible())
{
@@ -4156,20 +3910,18 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
}
else if (lde->kind()==LayoutDocEntry::GroupPageDocs && addToIndex)
{
- SDict<PageDef>::Iterator it(*gd->getPages());
- PageDef *pd;
- for (;(pd=it.current());++it)
+ for (const auto &pd : gd->getPages())
{
- SectionInfo *si=0;
- if (!pd->name().isEmpty()) si=Doxygen::sectionDict->find(pd->name());
- bool hasSubPages = pd->hasSubPages();
+ const SectionInfo *si=0;
+ if (!pd->name().isEmpty()) si=SectionManager::instance().find(pd->name());
+ hasSubPages = pd->hasSubPages();
bool hasSections = pd->hasSections();
Doxygen::indexList->addContentsItem(
hasSubPages || hasSections,
- convertToHtml(pd->title(),TRUE),
+ pd->title(),
gd->getReference(),
gd->getOutputFileBase(),
- si ? si->label.data() : 0,
+ si ? si->label().data() : 0,
hasSubPages || hasSections,
TRUE); // addToNavIndex
if (hasSections || hasSubPages)
@@ -4178,7 +3930,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
}
if (hasSections)
{
- pd->addSectionsToIndex();
+ const_cast<PageDef*>(pd)->addSectionsToIndex();
}
writePages(pd,0);
if (hasSections || hasSubPages)
@@ -4189,12 +3941,10 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
}
else if (lde->kind()==LayoutDocEntry::GroupNestedGroups)
{
- if (gd->getSubGroups()->count()>0)
+ if (!gd->getSubGroups().empty())
{
startIndexHierarchy(ol,level+1);
- QListIterator<GroupDef> gli(*gd->getSubGroups());
- GroupDef *subgd = 0;
- for (gli.toFirst();(subgd=gli.current());++gli)
+ for (const auto &subgd : gd->getSubGroups())
{
writeGroupTreeNode(ol,subgd,level+1,ftv,addToIndex);
}
@@ -4225,11 +3975,9 @@ static void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
ol.disable(OutputGenerator::Html);
}
startIndexHierarchy(ol,0);
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
- writeGroupTreeNode(ol,gd,0,ftv,addToIndex);
+ writeGroupTreeNode(ol,gd.get(),0,ftv,addToIndex);
}
endIndexHierarchy(ol,0);
if (ftv)
@@ -4238,41 +3986,6 @@ static void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
}
}
-#if 0
-static void writeGroupTree(GroupDef *gd,FTVHelp *ftv,int level,bool addToIndex)
-{
- static bool externalGroups = Config_getBool(EXTERNAL_GROUPS);
- /* Some groups should appear twice under different parent-groups.
- * That is why we should not check if it was visited
- */
- if ((!gd->isASubGroup() || level>0) &&
- gd->isVisible() &&
- (!gd->isReference() || externalGroups) // hide external groups by default
- )
- {
- if (ftv)
- {
- ftv->addContentsItem(hasSubGroups,gd->groupTitle(),gd->getReference(),gd->getOutputFileBase(),0);
- ftv->incContentsDepth();
- }
- if (ftv)
- {
- ftv->decContentsDepth();
- }
- }
-}
-
-static void writeGroupTree(FTVHelp *ftv,bool addToIndex)
-{
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- writeGroupTree(gd,ftv,0,addToIndex);
- }
-}
-#endif
-
//----------------------------------------------------------------------------
static void writeGroupIndex(OutputList &ol)
@@ -4345,62 +4058,6 @@ static void writeGroupIndex(OutputList &ol)
//----------------------------------------------------------------------------
-#if 0
-static void writeDirIndex(OutputList &ol)
-{
- if (documentedDirs==0) return;
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Dirs);
- QCString title = lne ? lne->title() : theTranslator->trDirectories();
- bool addToIndex=FALSE; //lne==0 || lne->visible();
-
- startFile(ol,"dirs",0,title,HLI_Directories);
- startTitle(ol,0);
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startContents();
- ol.startTextBlock();
-
- if (addToIndex)
- {
- Doxygen::indexList->addContentsItem(TRUE,title,0,"dirs",0,TRUE,TRUE);
- Doxygen::indexList->incContentsDepth();
- }
- ol.parseText(lne ? lne->intro() : theTranslator->trDirDescription());
- ol.endTextBlock();
-
- FTVHelp* ftv = 0;
- bool treeView=Config_getBool(USE_INLINE_TREES);
- if (treeView)
- {
- ftv = new FTVHelp(FALSE);
- }
-
- writeDirHierarchy(ol,ftv,addToIndex);
-
- if (ftv)
- {
- QGString outStr;
- FTextStream t(&outStr);
- ftv->generateTreeViewInline(t);
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.writeString(outStr);
- ol.popGeneratorState();
- delete ftv;
- }
- if (addToIndex)
- {
- Doxygen::indexList->decContentsDepth();
- }
- endFile(ol);
- ol.popGeneratorState();
-}
-#endif
-
-//----------------------------------------------------------------------------
-
static void writeUserGroupStubPage(OutputList &ol,LayoutNavEntry *lne)
{
if (lne->baseFile().left(9)=="usergroup")
@@ -4487,7 +4144,7 @@ static void writeIndex(OutputList &ol)
}
if (Doxygen::mainPage->hasSubPages() || Doxygen::mainPage->hasSections())
{
- writePages(Doxygen::mainPage,0);
+ writePages(Doxygen::mainPage.get(),0);
}
}
@@ -4518,9 +4175,9 @@ static void writeIndex(OutputList &ol)
{
ol.startHeaderSection();
ol.startTitleHead(0);
- ol.generateDoc(Doxygen::mainPage->docFile(),Doxygen::mainPage->docLine(),
- Doxygen::mainPage,0,Doxygen::mainPage->title(),
- TRUE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(Doxygen::mainPage->docFile(),Doxygen::mainPage->getStartBodyLine(),
+ Doxygen::mainPage.get(),0,Doxygen::mainPage->title(),TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
headerWritten = TRUE;
}
}
@@ -4555,9 +4212,9 @@ static void writeIndex(OutputList &ol)
}
ol.startTextBlock();
- ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,
- Doxygen::mainPage->documentation(),TRUE,FALSE
- /*,Doxygen::mainPage->sectionDict*/);
+ ol.generateDoc(defFileName,defLine,Doxygen::mainPage.get(),0,
+ Doxygen::mainPage->documentation(),TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endTextBlock();
ol.endPageDoc();
@@ -4594,7 +4251,8 @@ static void writeIndex(OutputList &ol)
if (!Config_getString(PROJECT_NUMBER).isEmpty())
{
ol.startProjectNumber();
- ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString(PROJECT_NUMBER),FALSE,FALSE);
+ ol.generateDoc(defFileName,defLine,Doxygen::mainPage.get(),0,Config_getString(PROJECT_NUMBER),FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endProjectNumber();
}
ol.endIndexSection(isTitlePageStart);
@@ -4622,14 +4280,12 @@ static void writeIndex(OutputList &ol)
{
//ol.parseText(projPrefix+theTranslator->trPageDocumentation());
//ol.endIndexSection(isPageDocumentation);
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=pdi.toFirst();
bool first=Doxygen::mainPage==0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
if (!pd->getGroupDef() && !pd->isReference() &&
(!pd->hasParentPage() || // not inside other page
- (Doxygen::mainPage==pd->getOuterScope())) // or inside main page
+ (Doxygen::mainPage.get()==pd->getOuterScope())) // or inside main page
)
{
bool isCitationPage = pd->name()=="citelist";
@@ -4639,7 +4295,7 @@ static void writeIndex(OutputList &ol)
ol.pushGeneratorState();
ol.disable(OutputGenerator::Latex);
}
- QCString title = pd->title();
+ title = pd->title();
if (title.isEmpty()) title=pd->name();
ol.disable(OutputGenerator::Docbook);
@@ -4790,7 +4446,7 @@ static void writeIndex(OutputList &ol)
ol.parseText(/*projPrefix+*/theTranslator->trFileDocumentation());
ol.endIndexSection(isFileDocumentation);
}
- if (Doxygen::exampleSDict->count()>0)
+ if (!Doxygen::exampleLinkedMap->empty())
{
ol.startIndexSection(isExampleDocumentation);
ol.parseText(/*projPrefix+*/theTranslator->trExampleDocumentation());
@@ -4806,8 +4462,9 @@ static void writeIndex(OutputList &ol)
startFile(ol,Doxygen::mainPage->name(),0,Doxygen::mainPage->title());
ol.startContents();
ol.startTextBlock();
- ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,
- Doxygen::mainPage->documentation(),FALSE,FALSE
+ ol.generateDoc(defFileName,defLine,Doxygen::mainPage.get(),0,
+ Doxygen::mainPage->documentation(),FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT)
);
ol.endTextBlock();
endFile(ol);
@@ -5158,7 +4815,7 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind)
case LayoutNavEntry::Files: return documentedHtmlFiles>0 && showFiles;
case LayoutNavEntry::FileList: return documentedHtmlFiles>0 && showFiles;
case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0;
- case LayoutNavEntry::Examples: return Doxygen::exampleSDict->count()>0;
+ case LayoutNavEntry::Examples: return !Doxygen::exampleLinkedMap->empty();
case LayoutNavEntry::None: // should never happen, means not properly initialized
assert(kind != LayoutNavEntry::None);
return FALSE;
@@ -5166,14 +4823,15 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind)
return FALSE;
}
-template<class T>
+template<class T,std::size_t total>
void renderMemberIndicesAsJs(FTextStream &t,
- int total,const int *numDocumented,const LetterToIndexMap<MemberIndexList> *memberLists,
- const T *(*getInfo)(int hl))
+ const int *numDocumented,
+ const std::array<MemberIndexMap,total> &memberLists,
+ const T *(*getInfo)(size_t hl))
{
// index items per category member lists
bool firstMember=TRUE;
- for (int i=0;i<total;i++)
+ for (std::size_t i=0;i<total;i++)
{
if (numDocumented[i]>0)
{
@@ -5198,14 +4856,12 @@ void renderMemberIndicesAsJs(FTextStream &t,
}
t << ",children:[" << endl;
bool firstLetter=TRUE;
- SIntDict<MemberIndexList>::Iterator it(memberLists[i]);
- MemberIndexList *ml;
- for (it.toFirst();(ml=it.current());++it)
+ for (const auto &kv : memberLists[i])
{
if (!firstLetter) t << "," << endl;
- uint letter = ml->letter();
- QCString is = letterToLabel(letter);
- QCString ci = letterToString(letter);
+ std::string letter = kv.first;
+ QCString ci = letter;
+ QCString is = letterToLabel(ci);
QCString anchor;
QCString extension=Doxygen::htmlFileExtension;
QCString fullName = getInfo(i)->fname;
@@ -5254,17 +4910,17 @@ static bool renderQuickLinksAsJs(FTextStream &t,LayoutNavEntry *root,bool first)
bool hasChildren=FALSE;
if (entry->kind()==LayoutNavEntry::NamespaceMembers)
{
- renderMemberIndicesAsJs(t,NMHL_Total,documentedNamespaceMembers,
+ renderMemberIndicesAsJs(t,documentedNamespaceMembers,
g_namespaceIndexLetterUsed,getNmhlInfo);
}
else if (entry->kind()==LayoutNavEntry::ClassMembers)
{
- renderMemberIndicesAsJs(t,CMHL_Total,documentedClassMembers,
- g_memberIndexLetterUsed,getCmhlInfo);
+ renderMemberIndicesAsJs(t,documentedClassMembers,
+ g_classIndexLetterUsed,getCmhlInfo);
}
else if (entry->kind()==LayoutNavEntry::FileGlobals)
{
- renderMemberIndicesAsJs(t,FMHL_Total,documentedFileMembers,
+ renderMemberIndicesAsJs(t,documentedFileMembers,
g_fileIndexLetterUsed,getFmhlInfo);
}
else // recursive into child list
diff --git a/src/index.h b/src/index.h
index f571375..5088c46 100644
--- a/src/index.h
+++ b/src/index.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -23,6 +23,7 @@
#include <qcstring.h>
class Definition;
+class DefinitionMutable;
class MemberDef;
class OutputList;
class FTextStream;
@@ -36,7 +37,7 @@ class IndexIntf
virtual void finalize() = 0;
virtual void incContentsDepth() = 0;
virtual void decContentsDepth() = 0;
- virtual void addContentsItem(bool isDir, const char *name, const char *ref,
+ virtual void addContentsItem(bool isDir, const char *name, const char *ref,
const char *file, const char *anchor, bool separateIndex,
bool addToNavIndex,const Definition *def) = 0;
virtual void addIndexItem(const Definition *context,const MemberDef *md,
@@ -73,7 +74,7 @@ class IndexList : public IndexIntf
/** Creates a list of indexes */
IndexList() { m_intfs.setAutoDelete(TRUE); m_enabled=TRUE; }
/** Add an index generator to the list */
- void addIndex(IndexIntf *intf)
+ void addIndex(IndexIntf *intf)
{ m_intfs.append(intf); }
void disable()
{ m_enabled = FALSE; }
@@ -83,25 +84,25 @@ class IndexList : public IndexIntf
{ return m_enabled; }
// IndexIntf implementation
- void initialize()
+ void initialize()
{ foreach(&IndexIntf::initialize); }
- void finalize()
+ void finalize()
{ foreach(&IndexIntf::finalize); }
void incContentsDepth()
{ if (m_enabled) foreach(&IndexIntf::incContentsDepth); }
void decContentsDepth()
{ if (m_enabled) foreach(&IndexIntf::decContentsDepth); }
- void addContentsItem(bool isDir, const char *name, const char *ref,
+ void addContentsItem(bool isDir, const char *name, const char *ref,
const char *file, const char *anchor,bool separateIndex=FALSE,bool addToNavIndex=FALSE,
const Definition *def=0)
{ if (m_enabled) foreach(&IndexIntf::addContentsItem,isDir,name,ref,file,anchor,separateIndex,addToNavIndex,def); }
void addIndexItem(const Definition *context,const MemberDef *md,const char *sectionAnchor=0,const char *title=0)
{ if (m_enabled) foreach(&IndexIntf::addIndexItem,context,md,sectionAnchor,title); }
- void addIndexFile(const char *name)
+ void addIndexFile(const char *name)
{ if (m_enabled) foreach(&IndexIntf::addIndexFile,name); }
- void addImageFile(const char *name)
+ void addImageFile(const char *name)
{ if (m_enabled) foreach(&IndexIntf::addImageFile,name); }
- void addStyleSheetFile(const char *name)
+ void addStyleSheetFile(const char *name)
{ if (m_enabled) foreach(&IndexIntf::addStyleSheetFile,name); }
private:
@@ -244,7 +245,7 @@ extern int documentedDirs;
extern int documentedHtmlFiles;
extern int documentedPages;
-void startTitle(OutputList &ol,const char *fileName,const Definition *def=0);
+void startTitle(OutputList &ol,const char *fileName,const DefinitionMutable *def=0);
void endTitle(OutputList &ol,const char *fileName,const char *name);
void startFile(OutputList &ol,const char *name,const char *manName,
const char *title,HighlightedItem hli=HLI_None,
@@ -256,9 +257,10 @@ void endFileWithNavPath(const Definition *d,OutputList &ol);
void initClassMemberIndices();
void initFileMemberIndices();
void initNamespaceMemberIndices();
-void addClassMemberNameToIndex(MemberDef *md);
-void addFileMemberNameToIndex(MemberDef *md);
-void addNamespaceMemberNameToIndex(MemberDef *md);
+void addClassMemberNameToIndex(const MemberDef *md);
+void addFileMemberNameToIndex(const MemberDef *md);
+void addNamespaceMemberNameToIndex(const MemberDef *md);
+void sortMemberIndexLists();
QCString fixSpaces(const QCString &s);
#endif
diff --git a/src/language.cpp b/src/language.cpp
index 7457676..299c452 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -417,6 +417,6 @@ bool setTranslator(const char *langName)
}
QCString msg = theTranslator->updateNeededMessage();
- if (!msg.isEmpty()) warn_uncond(msg);
+ if (!msg.isEmpty()) warn_uncond("%s", msg.data());
return TRUE;
}
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 730f083..e6c9363 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,7 +16,7 @@
*
*/
#include "htmlattrib.h"
-#include <qfileinfo.h>
+#include <qfileinfo.h>
#include "latexdocvisitor.h"
#include "latexgen.h"
#include "docparser.h"
@@ -37,7 +37,7 @@
#include "plantuml.h"
const int maxLevels=5;
-static const char *secLabels[maxLevels] =
+static const char *secLabels[maxLevels] =
{ "doxysection","doxysubsection","doxysubsubsection","doxyparagraph","doxysubparagraph" };
static const char *getSectionName(int level)
@@ -175,9 +175,9 @@ QCString LatexDocVisitor::escapeMakeIndexChars(const char *s)
}
-LatexDocVisitor::LatexDocVisitor(FTextStream &t,CodeOutputInterface &ci,
- const char *langExt,bool insideTabbing)
- : DocVisitor(DocVisitor_Latex), m_t(t), m_ci(ci), m_insidePre(FALSE),
+LatexDocVisitor::LatexDocVisitor(FTextStream &t,LatexCodeGenerator &ci,
+ const char *langExt,bool insideTabbing)
+ : DocVisitor(DocVisitor_Latex), m_t(t), m_ci(ci), m_insidePre(FALSE),
m_insideItem(FALSE), m_hide(FALSE), m_hideCaption(FALSE), m_insideTabbing(insideTabbing),
m_langExt(langExt)
{
@@ -322,7 +322,7 @@ void LatexDocVisitor::visit(DocStyleChange *s)
if (s->enable()) m_t << "\n\\footnotesize "; else m_t << "\n\\normalsize ";
break;
case DocStyleChange::Preformatted:
- if (s->enable())
+ if (s->enable())
{
m_t << "\n\\begin{DoxyPre}";
m_insidePre=TRUE;
@@ -349,39 +349,36 @@ void LatexDocVisitor::visit(DocVerbatim *s)
SrcLangExt langExt = getLanguageFromFileName(lang);
switch(s->type())
{
- case DocVerbatim::Code:
+ case DocVerbatim::Code:
{
- m_t << "\n\\begin{DoxyCode}{" << usedTableLevels() << "}\n";
- LatexCodeGenerator::setDoxyCodeOpen(TRUE);
- Doxygen::parserManager->getCodeParser(lang)
- .parseCode(m_ci,s->context(),s->text(),langExt,
- s->isExample(),s->exampleFile());
- LatexCodeGenerator::setDoxyCodeOpen(FALSE);
- m_t << "\\end{DoxyCode}\n";
+ m_ci.startCodeFragment("DoxyCode");
+ getCodeParser(lang).parseCode(m_ci,s->context(),s->text(),langExt,
+ s->isExample(),s->exampleFile());
+ m_ci.endCodeFragment("DoxyCode");
}
break;
- case DocVerbatim::Verbatim:
+ case DocVerbatim::Verbatim:
m_t << "\\begin{DoxyVerb}";
m_t << s->text();
m_t << "\\end{DoxyVerb}\n";
break;
- case DocVerbatim::HtmlOnly:
- case DocVerbatim::XmlOnly:
- case DocVerbatim::ManOnly:
+ case DocVerbatim::HtmlOnly:
+ case DocVerbatim::XmlOnly:
+ case DocVerbatim::ManOnly:
case DocVerbatim::RtfOnly:
case DocVerbatim::DocbookOnly:
- /* nothing */
+ /* nothing */
break;
- case DocVerbatim::LatexOnly:
- m_t << s->text();
+ case DocVerbatim::LatexOnly:
+ m_t << s->text();
break;
- case DocVerbatim::Dot:
+ case DocVerbatim::Dot:
{
static int dotindex = 1;
QCString fileName(4096);
- fileName.sprintf("%s%d%s",
- (Config_getString(LATEX_OUTPUT)+"/inline_dotgraph_").data(),
+ fileName.sprintf("%s%d%s",
+ (Config_getString(LATEX_OUTPUT)+"/inline_dotgraph_").data(),
dotindex++,
".dot"
);
@@ -403,13 +400,13 @@ void LatexDocVisitor::visit(DocVerbatim *s)
}
}
break;
- case DocVerbatim::Msc:
+ case DocVerbatim::Msc:
{
static int mscindex = 1;
QCString baseName(4096);
- baseName.sprintf("%s%d",
- (Config_getString(LATEX_OUTPUT)+"/inline_mscgraph_").data(),
+ baseName.sprintf("%s%d",
+ (Config_getString(LATEX_OUTPUT)+"/inline_mscgraph_").data(),
mscindex++
);
QFile file(baseName+".msc");
@@ -431,7 +428,7 @@ void LatexDocVisitor::visit(DocVerbatim *s)
}
}
break;
- case DocVerbatim::PlantUML:
+ case DocVerbatim::PlantUML:
{
QCString latexOutput = Config_getString(LATEX_OUTPUT);
QCString baseName = PlantumlManager::instance()->writePlantUMLSource(latexOutput,s->exampleFile(),s->text(),PlantumlManager::PUML_EPS);
@@ -446,11 +443,11 @@ void LatexDocVisitor::visit(DocAnchor *anc)
{
if (m_hide) return;
m_t << "\\label{" << stripPath(anc->file()) << "_" << anc->anchor() << "}%" << endl;
- if (!anc->file().isEmpty() && Config_getBool(PDF_HYPERLINKS))
+ if (!anc->file().isEmpty() && Config_getBool(PDF_HYPERLINKS))
{
- m_t << "\\Hypertarget{" << stripPath(anc->file()) << "_" << anc->anchor()
+ m_t << "\\Hypertarget{" << stripPath(anc->file()) << "_" << anc->anchor()
<< "}%" << endl;
- }
+ }
}
void LatexDocVisitor::visit(DocInclude *inc)
@@ -460,101 +457,95 @@ void LatexDocVisitor::visit(DocInclude *inc)
switch(inc->type())
{
case DocInclude::IncWithLines:
- {
- m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n";
- LatexCodeGenerator::setDoxyCodeOpen(TRUE);
- QFileInfo cfi( inc->file() );
- FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
- inc->text(),
- langExt,
- inc->isExample(),
- inc->exampleFile(),
- fd, // fileDef,
- -1, // start line
- -1, // end line
- FALSE, // inline fragment
- 0, // memberDef
- TRUE // show line numbers
- );
- delete fd;
- LatexCodeGenerator::setDoxyCodeOpen(FALSE);
- m_t << "\\end{DoxyCodeInclude}" << endl;
+ {
+ m_ci.startCodeFragment("DoxyCodeInclude");
+ QFileInfo cfi( inc->file() );
+ FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
+ inc->text(),
+ langExt,
+ inc->isExample(),
+ inc->exampleFile(),
+ fd, // fileDef,
+ -1, // start line
+ -1, // end line
+ FALSE, // inline fragment
+ 0, // memberDef
+ TRUE // show line numbers
+ );
+ delete fd;
+ m_ci.endCodeFragment("DoxyCodeInclude");
+ }
+ break;
+ case DocInclude::Include:
+ {
+ m_ci.startCodeFragment("DoxyCodeInclude");
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
+ inc->text(),langExt,inc->isExample(),
+ inc->exampleFile(),
+ 0, // fileDef
+ -1, // startLine
+ -1, // endLine
+ TRUE, // inlineFragment
+ 0, // memberDef
+ FALSE
+ );
+ m_ci.endCodeFragment("DoxyCodeInclude");
}
- break;
- case DocInclude::Include:
- m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n";
- LatexCodeGenerator::setDoxyCodeOpen(TRUE);
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
- inc->text(),langExt,inc->isExample(),
- inc->exampleFile(),
- 0, // fileDef
- -1, // startLine
- -1, // endLine
- TRUE, // inlineFragment
- 0, // memberDef
- FALSE
- );
- LatexCodeGenerator::setDoxyCodeOpen(FALSE);
- m_t << "\\end{DoxyCodeInclude}\n";
break;
case DocInclude::DontInclude:
case DocInclude::DontIncWithLines:
case DocInclude::HtmlInclude:
+ case DocInclude::RtfInclude:
+ case DocInclude::ManInclude:
+ case DocInclude::XmlInclude:
+ case DocInclude::DocbookInclude:
break;
case DocInclude::LatexInclude:
m_t << inc->text();
break;
- case DocInclude::VerbInclude:
+ case DocInclude::VerbInclude:
m_t << "\n\\begin{DoxyVerbInclude}\n";
m_t << inc->text();
m_t << "\\end{DoxyVerbInclude}\n";
break;
case DocInclude::Snippet:
{
- m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n";
- LatexCodeGenerator::setDoxyCodeOpen(TRUE);
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
- inc->context(),
- extractBlock(inc->text(),inc->blockId()),
- langExt,
- inc->isExample(),
- inc->exampleFile()
- );
- LatexCodeGenerator::setDoxyCodeOpen(FALSE);
- m_t << "\\end{DoxyCodeInclude}" << endl;
+ m_ci.startCodeFragment("DoxyCodeInclude");
+ getCodeParser(inc->extension()).parseCode(m_ci,
+ inc->context(),
+ extractBlock(inc->text(),inc->blockId()),
+ langExt,
+ inc->isExample(),
+ inc->exampleFile()
+ );
+ m_ci.endCodeFragment("DoxyCodeInclude");
}
break;
case DocInclude::SnipWithLines:
{
- QFileInfo cfi( inc->file() );
- FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n";
- LatexCodeGenerator::setDoxyCodeOpen(TRUE);
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
- inc->context(),
- extractBlock(inc->text(),inc->blockId()),
- langExt,
- inc->isExample(),
- inc->exampleFile(),
- fd,
- lineBlock(inc->text(),inc->blockId()),
- -1, // endLine
- FALSE, // inlineFragment
- 0, // memberDef
- TRUE // show line number
- );
- delete fd;
- LatexCodeGenerator::setDoxyCodeOpen(FALSE);
- m_t << "\\end{DoxyCodeInclude}" << endl;
+ QFileInfo cfi( inc->file() );
+ FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+ m_ci.startCodeFragment("DoxyCodeInclude");
+ getCodeParser(inc->extension()).parseCode(m_ci,
+ inc->context(),
+ extractBlock(inc->text(),inc->blockId()),
+ langExt,
+ inc->isExample(),
+ inc->exampleFile(),
+ fd,
+ lineBlock(inc->text(),inc->blockId()),
+ -1, // endLine
+ FALSE, // inlineFragment
+ 0, // memberDef
+ TRUE // show line number
+ );
+ delete fd;
+ m_ci.endCodeFragment("DoxyCodeInclude");
}
break;
- case DocInclude::SnippetDoc:
- case DocInclude::IncludeDoc:
+ case DocInclude::SnippetDoc:
+ case DocInclude::IncludeDoc:
err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
"Please create a bug report\n",__FILE__);
break;
@@ -565,20 +556,19 @@ 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());
- if (op->isFirst())
+ if (op->isFirst())
{
- if (!m_hide) m_t << "\n\\begin{DoxyCodeInclude}{" << usedTableLevels() << "}\n";
- LatexCodeGenerator::setDoxyCodeOpen(TRUE);
+ if (!m_hide) m_ci.startCodeFragment("DoxyCodeInclude");
pushEnabled();
m_hide = TRUE;
}
QCString locLangExt = getFileNameExtension(op->includeFileName());
if (locLangExt.isEmpty()) locLangExt = m_langExt;
SrcLangExt langExt = getLanguageFromFileName(locLangExt);
- if (op->type()!=DocIncOperator::Skip)
+ if (op->type()!=DocIncOperator::Skip)
{
popEnabled();
- if (!m_hide)
+ if (!m_hide)
{
FileDef *fd = 0;
if (!op->includeFileName().isEmpty())
@@ -587,26 +577,24 @@ void LatexDocVisitor::visit(DocIncOperator *op)
fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
}
- Doxygen::parserManager->getCodeParser(locLangExt)
- .parseCode(m_ci,op->context(),op->text(),langExt,
- op->isExample(),op->exampleFile(),
- fd, // fileDef
- op->line(), // startLine
- -1, // endLine
- FALSE, // inline fragment
- 0, // memberDef
- op->showLineNo() // show line numbers
- );
+ getCodeParser(locLangExt).parseCode(m_ci,op->context(),op->text(),langExt,
+ op->isExample(),op->exampleFile(),
+ fd, // fileDef
+ op->line(), // startLine
+ -1, // endLine
+ FALSE, // inline fragment
+ 0, // memberDef
+ op->showLineNo() // show line numbers
+ );
if (fd) delete fd;
}
pushEnabled();
m_hide=TRUE;
}
- if (op->isLast())
+ if (op->isLast())
{
popEnabled();
- LatexCodeGenerator::setDoxyCodeOpen(FALSE);
- if (!m_hide) m_t << "\n\\end{DoxyCodeInclude}\n";
+ if (!m_hide) m_ci.endCodeFragment("DoxyCodeInclude");
}
else
{
@@ -617,7 +605,8 @@ void LatexDocVisitor::visit(DocIncOperator *op)
void LatexDocVisitor::visit(DocFormula *f)
{
if (m_hide) return;
- const char *p=f->text();
+ QCString s = f->text();
+ const char *p = s.data();
char c;
if (p)
{
@@ -649,11 +638,12 @@ void LatexDocVisitor::visit(DocSimpleSectSep *)
void LatexDocVisitor::visit(DocCite *cite)
{
if (m_hide) return;
- if (!cite->file().isEmpty())
+ if (!cite->file().isEmpty())
{
//startLink(cite->ref(),cite->file(),cite->anchor());
QCString anchor = cite->anchor();
- anchor = anchor.mid(CiteConsts::anchorPrefix.length()); // strip prefix
+ QCString anchorPrefix = CitationManager::instance().anchorPrefix();
+ anchor = anchor.mid(anchorPrefix.length()); // strip prefix
m_t << "\\cite{" << anchor << "}";
}
else
@@ -700,11 +690,11 @@ void LatexDocVisitor::visitPre(DocAutoListItem *)
m_t << "\n\\item ";
}
-void LatexDocVisitor::visitPost(DocAutoListItem *)
+void LatexDocVisitor::visitPost(DocAutoListItem *)
{
}
-void LatexDocVisitor::visitPre(DocPara *)
+void LatexDocVisitor::visitPre(DocPara *)
{
}
@@ -794,7 +784,7 @@ void LatexDocVisitor::visitPre(DocSimpleSect *s)
case DocSimpleSect::User:
m_t << "\\begin{DoxyParagraph}{";
break;
- case DocSimpleSect::Rcs:
+ case DocSimpleSect::Rcs:
m_t << "\\begin{DoxyParagraph}{";
break;
case DocSimpleSect::Unknown: break;
@@ -864,7 +854,7 @@ void LatexDocVisitor::visitPost(DocSimpleSect *s)
case DocSimpleSect::User:
m_t << "\n\\end{DoxyParagraph}\n";
break;
- case DocSimpleSect::Rcs:
+ case DocSimpleSect::Rcs:
m_t << "\n\\end{DoxyParagraph}\n";
break;
default:
@@ -901,7 +891,7 @@ void LatexDocVisitor::visitPre(DocSimpleListItem *)
m_t << "\\item ";
}
-void LatexDocVisitor::visitPost(DocSimpleListItem *)
+void LatexDocVisitor::visitPost(DocSimpleListItem *)
{
}
@@ -917,25 +907,25 @@ void LatexDocVisitor::visitPre(DocSection *s)
m_t << "}\\label{" << stripPath(s->file()) << "_" << s->anchor() << "}" << endl;
}
-void LatexDocVisitor::visitPost(DocSection *)
+void LatexDocVisitor::visitPost(DocSection *)
{
}
void LatexDocVisitor::visitPre(DocHtmlList *s)
{
if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
+ if (s->type()==DocHtmlList::Ordered)
m_t << "\n\\begin{DoxyEnumerate}";
- else
+ else
m_t << "\n\\begin{DoxyItemize}";
}
-void LatexDocVisitor::visitPost(DocHtmlList *s)
+void LatexDocVisitor::visitPost(DocHtmlList *s)
{
if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
+ if (s->type()==DocHtmlList::Ordered)
m_t << "\n\\end{DoxyEnumerate}";
- else
+ else
m_t << "\n\\end{DoxyItemize}";
}
@@ -945,7 +935,7 @@ void LatexDocVisitor::visitPre(DocHtmlListItem *)
m_t << "\n\\item ";
}
-void LatexDocVisitor::visitPost(DocHtmlListItem *)
+void LatexDocVisitor::visitPost(DocHtmlListItem *)
{
}
@@ -955,12 +945,32 @@ void LatexDocVisitor::visitPost(DocHtmlListItem *)
// m_insidePre=TRUE;
//}
-//void LatexDocVisitor::visitPost(DocHtmlPre *)
+//void LatexDocVisitor::visitPost(DocHtmlPre *)
//{
// m_insidePre=FALSE;
// m_t << "\\end{alltt}\\normalsize " << endl;
//}
+static bool listIsNested(const DocNode *n)
+{
+ bool isNested=false;
+ if (n)
+ {
+ if (n->kind()==DocNode::Kind_HtmlDescList && ((DocHtmlDescList *)n)->attribs().find("class") == "reflist") return false;
+ n = n->parent();
+ }
+ while (n && !isNested)
+ {
+ if (n->kind()==DocNode::Kind_HtmlDescList)
+ {
+ QCString val = ((DocHtmlDescList *)n)->attribs().find("class");
+ isNested = (val!="reflist");
+ }
+ n = n->parent();
+ }
+ return isNested;
+}
+
void LatexDocVisitor::visitPre(DocHtmlDescList *dl)
{
if (m_hide) return;
@@ -971,11 +981,12 @@ void LatexDocVisitor::visitPre(DocHtmlDescList *dl)
}
else
{
+ if (listIsNested(dl)) m_t << "\n\\hfill";
m_t << "\n\\begin{DoxyDescription}";
}
}
-void LatexDocVisitor::visitPost(DocHtmlDescList *dl)
+void LatexDocVisitor::visitPost(DocHtmlDescList *dl)
{
if (m_hide) return;
QCString val = dl->attribs().find("class");
@@ -996,7 +1007,7 @@ void LatexDocVisitor::visitPre(DocHtmlDescTitle *)
m_insideItem=TRUE;
}
-void LatexDocVisitor::visitPost(DocHtmlDescTitle *)
+void LatexDocVisitor::visitPost(DocHtmlDescTitle *)
{
if (m_hide) return;
m_insideItem=FALSE;
@@ -1007,7 +1018,7 @@ void LatexDocVisitor::visitPre(DocHtmlDescData *)
{
}
-void LatexDocVisitor::visitPost(DocHtmlDescData *)
+void LatexDocVisitor::visitPost(DocHtmlDescData *)
{
}
@@ -1115,7 +1126,7 @@ void LatexDocVisitor::visitPre(DocHtmlRow *r)
setCurrentColumn(0);
}
-void LatexDocVisitor::visitPost(DocHtmlRow *row)
+void LatexDocVisitor::visitPost(DocHtmlRow *row)
{
if (m_hide) return;
@@ -1150,7 +1161,7 @@ void LatexDocVisitor::visitPost(DocHtmlRow *row)
}
m_t << "\\\\";
-
+
int col = 1;
uint i;
for (i=0;i<rowSpans().count();i++)
@@ -1284,7 +1295,7 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c)
}
}
-void LatexDocVisitor::visitPost(DocHtmlCell *c)
+void LatexDocVisitor::visitPost(DocHtmlCell *c)
{
if (m_hide) return;
if (c->isHeading())
@@ -1312,7 +1323,7 @@ void LatexDocVisitor::visitPre(DocInternal *)
//m_t << "}\n";
}
-void LatexDocVisitor::visitPost(DocInternal *)
+void LatexDocVisitor::visitPost(DocInternal *)
{
if (m_hide) return;
//m_t << "\\end{DoxyInternal}" << endl;
@@ -1330,7 +1341,7 @@ void LatexDocVisitor::visitPre(DocHRef *href)
m_t << "{\\texttt{ ";
}
-void LatexDocVisitor::visitPost(DocHRef *)
+void LatexDocVisitor::visitPost(DocHRef *)
{
if (m_hide) return;
m_t << "}}";
@@ -1342,7 +1353,7 @@ void LatexDocVisitor::visitPre(DocHtmlHeader *header)
m_t << "\\" << getSectionName(header->level()) << "*{";
}
-void LatexDocVisitor::visitPost(DocHtmlHeader *)
+void LatexDocVisitor::visitPost(DocHtmlHeader *)
{
if (m_hide) return;
m_t << "}";
@@ -1367,7 +1378,7 @@ void LatexDocVisitor::visitPre(DocImage *img)
}
}
-void LatexDocVisitor::visitPost(DocImage *img)
+void LatexDocVisitor::visitPost(DocImage *img)
{
if (img->type()==DocImage::Latex)
{
@@ -1386,7 +1397,7 @@ void LatexDocVisitor::visitPre(DocDotFile *df)
startDotFile(df->file(),df->width(),df->height(),df->hasCaption());
}
-void LatexDocVisitor::visitPost(DocDotFile *df)
+void LatexDocVisitor::visitPost(DocDotFile *df)
{
if (m_hide) return;
endDotFile(df->hasCaption());
@@ -1397,7 +1408,7 @@ void LatexDocVisitor::visitPre(DocMscFile *df)
startMscFile(df->file(),df->width(),df->height(),df->hasCaption());
}
-void LatexDocVisitor::visitPost(DocMscFile *df)
+void LatexDocVisitor::visitPost(DocMscFile *df)
{
if (m_hide) return;
endMscFile(df->hasCaption());
@@ -1420,7 +1431,7 @@ void LatexDocVisitor::visitPre(DocLink *lnk)
startLink(lnk->ref(),lnk->file(),lnk->anchor());
}
-void LatexDocVisitor::visitPost(DocLink *lnk)
+void LatexDocVisitor::visitPost(DocLink *lnk)
{
if (m_hide) return;
endLink(lnk->ref(),lnk->file(),lnk->anchor());
@@ -1442,7 +1453,7 @@ void LatexDocVisitor::visitPre(DocRef *ref)
if (!ref->hasLinkText()) filter(ref->targetTitle());
}
-void LatexDocVisitor::visitPost(DocRef *ref)
+void LatexDocVisitor::visitPost(DocRef *ref)
{
if (m_hide) return;
if (ref->isSubPage())
@@ -1466,7 +1477,7 @@ void LatexDocVisitor::visitPre(DocSecRefItem *ref)
}
}
-void LatexDocVisitor::visitPost(DocSecRefItem *ref)
+void LatexDocVisitor::visitPost(DocSecRefItem *ref)
{
if (m_hide) return;
static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
@@ -1485,7 +1496,7 @@ void LatexDocVisitor::visitPre(DocSecRefList *)
m_t << "\\begin{DoxyCompactList}" << endl;
}
-void LatexDocVisitor::visitPost(DocSecRefList *)
+void LatexDocVisitor::visitPost(DocSecRefList *)
{
if (m_hide) return;
m_t << "\\end{DoxyCompactList}" << endl;
@@ -1498,7 +1509,7 @@ void LatexDocVisitor::visitPre(DocParamSect *s)
if (m_hide) return;
bool hasInOutSpecs = s->hasInOutSpecifier();
bool hasTypeSpecs = s->hasTypeSpecifier();
- incUsedTableLevels();
+ m_ci.incUsedTableLevel();
switch(s->type())
{
case DocParamSect::Param:
@@ -1512,11 +1523,11 @@ void LatexDocVisitor::visitPre(DocParamSect *s)
m_t << "\n\\begin{DoxyRetVals}{";
filter(theTranslator->trReturnValues());
break;
- case DocParamSect::Exception:
+ case DocParamSect::Exception:
m_t << "\n\\begin{DoxyExceptions}{";
filter(theTranslator->trExceptions());
break;
- case DocParamSect::TemplateParam:
+ case DocParamSect::TemplateParam:
m_t << "\n\\begin{DoxyTemplParams}{";
filter(theTranslator->trTemplateParameters());
break;
@@ -1529,7 +1540,7 @@ void LatexDocVisitor::visitPre(DocParamSect *s)
void LatexDocVisitor::visitPost(DocParamSect *s)
{
if (m_hide) return;
- decUsedTableLevels();
+ m_ci.decUsedTableLevel();
switch(s->type())
{
case DocParamSect::Param:
@@ -1538,10 +1549,10 @@ void LatexDocVisitor::visitPost(DocParamSect *s)
case DocParamSect::RetVal:
m_t << "\\end{DoxyRetVals}\n";
break;
- case DocParamSect::Exception:
+ case DocParamSect::Exception:
m_t << "\\end{DoxyExceptions}\n";
break;
- case DocParamSect::TemplateParam:
+ case DocParamSect::TemplateParam:
m_t << "\\end{DoxyTemplParams}\n";
break;
default:
@@ -1596,11 +1607,11 @@ void LatexDocVisitor::visitPre(DocParamList *pl)
{
if (type->kind()==DocNode::Kind_Word)
{
- visit((DocWord*)type);
+ visit((DocWord*)type);
}
else if (type->kind()==DocNode::Kind_LinkedWord)
{
- visit((DocLinkedWord*)type);
+ visit((DocLinkedWord*)type);
}
else if (type->kind()==DocNode::Kind_Sep)
{
@@ -1621,11 +1632,11 @@ void LatexDocVisitor::visitPre(DocParamList *pl)
m_insideItem=TRUE;
if (param->kind()==DocNode::Kind_Word)
{
- visit((DocWord*)param);
+ visit((DocWord*)param);
}
else if (param->kind()==DocNode::Kind_LinkedWord)
{
- visit((DocLinkedWord*)param);
+ visit((DocLinkedWord*)param);
}
m_insideItem=FALSE;
}
@@ -1700,7 +1711,7 @@ void LatexDocVisitor::visitPre(DocInternalRef *ref)
startLink(0,ref->file(),ref->anchor());
}
-void LatexDocVisitor::visitPost(DocInternalRef *ref)
+void LatexDocVisitor::visitPost(DocInternalRef *ref)
{
if (m_hide) return;
endLink(0,ref->file(),ref->anchor());
@@ -1747,8 +1758,14 @@ void LatexDocVisitor::visitPost(DocParBlock *)
}
void LatexDocVisitor::filter(const char *str)
-{
- filterLatexString(m_t,str,m_insideTabbing,m_insidePre,m_insideItem);
+{
+ filterLatexString(m_t,str,
+ m_insideTabbing,
+ m_insidePre,
+ m_insideItem,
+ m_ci.usedTableLevel()>0, // insideTable
+ false // keepSpaces
+ );
}
void LatexDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor,bool refToTable)
@@ -1828,7 +1845,7 @@ void LatexDocVisitor::startDotFile(const QCString &fileName,
if ((i=baseName.findRev('/'))!=-1)
{
baseName=baseName.right(baseName.length()-i-1);
- }
+ }
if ((i=baseName.find('.'))!=-1)
{
baseName=baseName.left(i);
@@ -1857,7 +1874,7 @@ void LatexDocVisitor::startMscFile(const QCString &fileName,
if ((i=baseName.findRev('/'))!=-1)
{
baseName=baseName.right(baseName.length()-i-1);
- }
+ }
if ((i=baseName.find('.'))!=-1)
{
baseName=baseName.left(i);
@@ -1865,7 +1882,7 @@ void LatexDocVisitor::startMscFile(const QCString &fileName,
baseName.prepend("msc_");
QCString outDir = Config_getString(LATEX_OUTPUT);
- writeMscGraphFromFile(fileName,outDir,baseName,MSC_EPS);
+ writeMscGraphFromFile(fileName,outDir,baseName,MSC_EPS);
visitPreStart(m_t,hasCaption, baseName, width, height);
}
@@ -1883,7 +1900,7 @@ void LatexDocVisitor::writeMscFile(const QCString &baseName, DocVerbatim *s)
if ((i=shortName.findRev('/'))!=-1)
{
shortName=shortName.right(shortName.length()-i-1);
- }
+ }
QCString outDir = Config_getString(LATEX_OUTPUT);
writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_EPS);
visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height());
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
index 71fb5be..003d780 100644
--- a/src/latexdocvisitor.h
+++ b/src/latexdocvisitor.h
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -25,19 +25,19 @@
#include <qlist.h>
class FTextStream;
-class CodeOutputInterface;
+class LatexCodeGenerator;
/*! @brief Concrete visitor implementation for LaTeX output. */
class LatexDocVisitor : public DocVisitor
{
public:
- LatexDocVisitor(FTextStream &t,CodeOutputInterface &ci,
+ LatexDocVisitor(FTextStream &t,LatexCodeGenerator &ci,
const char *langExt,bool insideTabbing);
-
+
//--------------------------------------
// visitor functions for leaf nodes
//--------------------------------------
-
+
void visit(DocWord *);
void visit(DocLinkedWord *);
void visit(DocWhiteSpace *);
@@ -59,7 +59,7 @@ class LatexDocVisitor : public DocVisitor
//--------------------------------------
// visitor functions for compound nodes
//--------------------------------------
-
+
void visitPre(DocAutoList *);
void visitPost(DocAutoList *);
void visitPre(DocAutoListItem *);
@@ -141,7 +141,7 @@ class LatexDocVisitor : public DocVisitor
struct ActiveRowSpan
{
- ActiveRowSpan(DocHtmlCell *c,int rs,int cs,int col)
+ ActiveRowSpan(DocHtmlCell *c,int rs,int cs,int col)
: cell(c), rowSpan(rs), colSpan(cs), column(col) {}
DocHtmlCell *cell;
int rowSpan;
@@ -152,9 +152,9 @@ class LatexDocVisitor : public DocVisitor
typedef QList<ActiveRowSpan> RowSpanList;
//--------------------------------------
- // helper functions
+ // helper functions
//--------------------------------------
-
+
void filter(const char *str);
void startLink(const QCString &ref,const QCString &file,
const QCString &anchor,bool refToTable=FALSE);
@@ -184,7 +184,7 @@ class LatexDocVisitor : public DocVisitor
//--------------------------------------
FTextStream &m_t;
- CodeOutputInterface &m_ci;
+ LatexCodeGenerator &m_ci;
bool m_insidePre;
bool m_insideItem;
bool m_hide;
@@ -195,7 +195,7 @@ class LatexDocVisitor : public DocVisitor
struct TableState
{
- TableState() : numCols(0), currentColumn(0), inRowSpan(FALSE),
+ TableState() : numCols(0), currentColumn(0), inRowSpan(FALSE),
inColSpan(FALSE), firstRow(FALSE)
{ rowSpans.setAutoDelete(TRUE); }
RowSpanList rowSpans;
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index cdda22c..ece344f 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -42,19 +42,16 @@
#include "namespacedef.h"
#include "filename.h"
#include "resourcemgr.h"
-
-static bool DoxyCodeOpen = FALSE;
-static bool DoxyCodeLineOpen = FALSE;
-//-------------------------------
+#include "portable.h"
LatexCodeGenerator::LatexCodeGenerator(FTextStream &t,const QCString &relPath,const QCString &sourceFileName)
- : m_relPath(relPath), m_sourceFileName(sourceFileName), m_col(0)
+ : m_relPath(relPath), m_sourceFileName(sourceFileName)
{
m_prettyCode=Config_getBool(LATEX_SOURCE_CODE);
setTextStream(t);
}
-LatexCodeGenerator::LatexCodeGenerator() : m_streamSet(FALSE), m_col(0)
+LatexCodeGenerator::LatexCodeGenerator()
{
m_prettyCode=Config_getBool(LATEX_SOURCE_CODE);
}
@@ -79,13 +76,13 @@ void LatexCodeGenerator::codify(const char *str)
{
if (str)
{
- const char *p=str;
- char c;
+ const signed char *p=(const signed char*)str;
+ signed char c;
//char cs[5];
int spacesToNextTabStop;
- static int tabSize = Config_getInt(TAB_SIZE);
- static char *result = NULL;
- static int lresult = 0;
+ int tabSize = Config_getInt(TAB_SIZE);
+ static THREAD_LOCAL signed char *result = NULL;
+ static THREAD_LOCAL int lresult = 0;
int i;
while ((c=*p))
{
@@ -107,7 +104,9 @@ void LatexCodeGenerator::codify(const char *str)
m_col+=spacesToNextTabStop;
p++;
break;
- case '\n': (usedTableLevels()>0 && !DoxyCodeOpen) ? m_t << "\\newline\n" : m_t << '\n'; m_col=0; p++;
+ case '\n': m_t << '\n';
+ m_col=0;
+ p++;
break;
default:
i=0;
@@ -118,7 +117,7 @@ void LatexCodeGenerator::codify(const char *str)
if (lresult < (i + 5)) \
{ \
lresult += 512; \
- result = (char *)realloc(result, lresult); \
+ result = (signed char *)realloc(result, lresult); \
} \
result[i++]=c; p++; \
if (c<0) /* multibyte utf-8 character */ \
@@ -148,14 +147,13 @@ void LatexCodeGenerator::codify(const char *str)
COPYCHAR();
}
result[i]=0; // add terminator
- //if (m_prettyCode)
- //{
- filterLatexString(m_t,result,FALSE,TRUE);
- //}
- //else
- //{
- // t << result;
- //}
+ filterLatexString(m_t,(const char *)result,
+ false, // insideTabbing
+ true, // insidePre
+ false, // insideItem
+ m_usedTableLevel>0, // insideTable
+ false // keepSpaces
+ );
break;
}
}
@@ -167,15 +165,15 @@ void LatexCodeGenerator::writeCodeLink(const char *ref,const char *f,
const char *anchor,const char *name,
const char *)
{
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
- static bool usePDFLatex = Config_getBool(USE_PDFLATEX);
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ bool usePDFLatex = Config_getBool(USE_PDFLATEX);
int l = qstrlen(name);
if (!ref && usePDFLatex && pdfHyperlinks)
{
m_t << "\\mbox{\\hyperlink{";
if (f) m_t << stripPath(f);
- if (f && anchor) m_t << "_";
- if (anchor) m_t << anchor;
+ if (f && anchor) m_t << "_";
+ if (anchor) m_t << anchor;
m_t << "}{";
codify(name);
m_t << "}}";
@@ -189,12 +187,12 @@ void LatexCodeGenerator::writeCodeLink(const char *ref,const char *f,
void LatexCodeGenerator::writeLineNumber(const char *ref,const char *fileName,const char *anchor,int l)
{
- static bool usePDFLatex = Config_getBool(USE_PDFLATEX);
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
- if (!DoxyCodeLineOpen)
+ bool usePDFLatex = Config_getBool(USE_PDFLATEX);
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ if (!m_doxyCodeLineOpen)
{
m_t << "\\DoxyCodeLine{";
- DoxyCodeLineOpen = TRUE;
+ m_doxyCodeLineOpen = TRUE;
}
if (m_prettyCode)
{
@@ -230,19 +228,19 @@ void LatexCodeGenerator::writeLineNumber(const char *ref,const char *fileName,co
void LatexCodeGenerator::startCodeLine(bool)
{
m_col=0;
- if (!DoxyCodeLineOpen)
+ if (!m_doxyCodeLineOpen)
{
m_t << "\\DoxyCodeLine{";
- DoxyCodeLineOpen = TRUE;
+ m_doxyCodeLineOpen = TRUE;
}
}
void LatexCodeGenerator::endCodeLine()
{
- if (DoxyCodeLineOpen)
+ if (m_doxyCodeLineOpen)
{
m_t << "}";
- DoxyCodeLineOpen = FALSE;
+ m_doxyCodeLineOpen = FALSE;
}
codify("\n");
}
@@ -257,23 +255,40 @@ void LatexCodeGenerator::endFontClass()
m_t << "}";
}
-void LatexCodeGenerator::setDoxyCodeOpen(bool val)
+void LatexCodeGenerator::startCodeFragment(const char *style)
{
- DoxyCodeOpen = val;
+ m_t << "\n\\begin{" << style << "}{" << m_usedTableLevel << "}\n";
}
+void LatexCodeGenerator::endCodeFragment(const char *style)
+{
+ //endCodeLine checks is there is still an open code line, if so closes it.
+ endCodeLine();
+
+ m_t << "\\end{" << style << "}\n";
+}
+
+
//-------------------------------
-LatexGenerator::LatexGenerator() : OutputGenerator()
+LatexGenerator::LatexGenerator() : OutputGenerator(Config_getString(LATEX_OUTPUT))
{
- m_dir=Config_getString(LATEX_OUTPUT);
//printf("LatexGenerator::LatexGenerator() m_insideTabbing=FALSE\n");
- m_insideTabbing=FALSE;
- m_firstDescItem=TRUE;
- m_disableLinks=FALSE;
- m_indent=0;
- templateMemberItem = FALSE;
- m_prettyCode=Config_getBool(LATEX_SOURCE_CODE);
+}
+
+LatexGenerator::LatexGenerator(const LatexGenerator &og) : OutputGenerator(og)
+{
+}
+
+LatexGenerator &LatexGenerator::operator=(const LatexGenerator &og)
+{
+ OutputGenerator::operator=(og);
+ return *this;
+}
+
+std::unique_ptr<OutputGenerator> LatexGenerator::clone() const
+{
+ return std::make_unique<LatexGenerator>(*this);
}
LatexGenerator::~LatexGenerator()
@@ -282,9 +297,8 @@ LatexGenerator::~LatexGenerator()
static void writeLatexMakefile()
{
- bool generateBib = !Doxygen::citeDict->isEmpty();
- QCString dir=Config_getString(LATEX_OUTPUT);
- QCString fileName=dir+"/Makefile";
+ bool generateBib = !CitationManager::instance().isEmpty();
+ QCString fileName=Config_getString(LATEX_OUTPUT)+"/Makefile";
QFile file(fileName);
if (!file.open(IO_WriteOnly))
{
@@ -371,7 +385,7 @@ static void writeLatexMakefile()
t << endl
<< "clean:" << endl
- << "\trm -f "
+ << "\trm -f "
<< "*.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf" << endl;
}
@@ -383,7 +397,7 @@ static void writeMakeBat()
QCString latex_command = theTranslator->latexCommandName();
QCString mkidx_command = Config_getString(MAKEINDEX_CMD_NAME);
QFile file(fileName);
- bool generateBib = !Doxygen::citeDict->isEmpty();
+ bool generateBib = !CitationManager::instance().isEmpty();
if (!file.open(IO_WriteOnly))
{
term("Could not open file %s for writing\n",fileName.data());
@@ -421,7 +435,8 @@ static void writeMakeBat()
t << mkidx_command << " refman.idx\n";
t << "%LATEX_CMD% refman.tex\n";
t << "dvips -o refman.ps refman.dvi\n";
- t << "gswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
+ t << Portable::ghostScriptCommand();
+ t << " -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
"-sOutputFile=refman.pdf -c save pop -f refman.ps\n";
}
else // use pdflatex
@@ -461,12 +476,11 @@ static void writeMakeBat()
void LatexGenerator::init()
{
-
- QCString dir=Config_getString(LATEX_OUTPUT);
- QDir d(dir);
- if (!d.exists() && !d.mkdir(dir))
+ QCString dname = Config_getString(LATEX_OUTPUT);
+ QDir d(dname);
+ if (!d.exists() && !d.mkdir(dname))
{
- term("Could not create output directory %s\n",dir.data());
+ term("Could not create output directory %s\n",dname.data());
}
writeLatexMakefile();
@@ -507,21 +521,20 @@ static void writeDefaultHeaderPart1(FTextStream &t)
// Load required packages
t << "% Packages required by doxygen\n"
"\\usepackage{fixltx2e}\n" // for \textsubscript
- "\\usepackage{calc}\n"
"\\usepackage{doxygen}\n";
- QStrList extraLatexStyle = Config_getList(LATEX_EXTRA_STYLESHEET);
- for (uint i=0; i<extraLatexStyle.count(); ++i)
+ const StringVector &extraLatexStyles = Config_getList(LATEX_EXTRA_STYLESHEET);
+ for (const auto &extraStyle : extraLatexStyles)
{
- QCString fileName(extraLatexStyle.at(i));
+ QCString fileName = extraStyle.c_str();
if (!fileName.isEmpty())
{
QFileInfo fi(fileName);
if (fi.exists())
{
- if (checkExtension(fi.fileName().data(), latexStyleExtension))
+ if (checkExtension(fi.fileName().data(), LATEX_STYLE_EXTENSION))
{
// strip the extension, it will be added by the usepackage in the tex conversion process
- t << "\\usepackage{" << stripExtensionGeneral(fi.fileName().data(), latexStyleExtension) << "}\n";
+ t << "\\usepackage{" << stripExtensionGeneral(fi.fileName().data(), LATEX_STYLE_EXTENSION) << "}\n";
}
else
{
@@ -533,13 +546,10 @@ static void writeDefaultHeaderPart1(FTextStream &t)
t << "\\usepackage{graphicx}\n"
"\\usepackage[utf8]{inputenc}\n"
"\\usepackage{makeidx}\n"
- "\\usepackage{multicol}\n"
- "\\usepackage{multirow}\n"
"\\PassOptionsToPackage{warn}{textcomp}\n"
"\\usepackage{textcomp}\n"
"\\usepackage[nointegrals]{wasysym}\n"
- "\\usepackage[table]{xcolor}\n"
- "\\usepackage{ifpdf,ifxetex}\n"
+ "\\usepackage{ifxetex}\n"
"\n";
// Language support
@@ -558,11 +568,12 @@ static void writeDefaultHeaderPart1(FTextStream &t)
{
t << "\\usepackage[" << fontenc << "]{fontenc}\n";
}
- t << "\\usepackage[scaled=.90]{helvet}\n"
- "\\usepackage{courier}\n"
- "\\usepackage{amssymb}\n"
- "\\usepackage{sectsty}\n"
- "\\renewcommand{\\familydefault}{\\sfdefault}\n"
+ QCString font = theTranslator->latexFont();
+ if (!font.isEmpty())
+ {
+ t << font;
+ }
+ t << "\\usepackage{sectsty}\n"
"\\allsectionsfont{%\n"
" \\fontseries{bc}\\selectfont%\n"
" \\color{darkgray}%\n"
@@ -621,7 +632,7 @@ static void writeDefaultHeaderPart1(FTextStream &t)
"}\n"
"\\makeatother\n"
"\n";
- //
+ //
t << "\\makeatletter\n"
"\\newcommand\\hrulefilll{\\leavevmode\\leaders\\hrule\\hskip 0pt plus 1filll\\kern\\z@}\n"
"\\makeatother\n"
@@ -630,7 +641,7 @@ static void writeDefaultHeaderPart1(FTextStream &t)
// Headers & footers
QGString genString;
QCString generatedBy;
- static bool timeStamp = Config_getBool(LATEX_TIMESTAMP);
+ bool timeStamp = Config_getBool(LATEX_TIMESTAMP);
FTextStream tg(&genString);
if (timeStamp)
{
@@ -640,23 +651,34 @@ static void writeDefaultHeaderPart1(FTextStream &t)
{
generatedBy = theTranslator->trGeneratedBy();
}
- filterLatexString(tg, generatedBy, FALSE,FALSE,FALSE);
+ filterLatexString(tg, generatedBy,
+ false, // insideTabbing
+ false, // insidePre
+ false, // insideItem
+ false, // insideTable
+ false // keepSpaces
+ );
t << "% Headers & footers\n"
"\\usepackage{fancyhdr}\n"
"\\pagestyle{fancyplain}\n"
- "\\fancyhead[LE]{\\fancyplain{}{\\bfseries\\thepage}}\n"
- "\\fancyhead[CE]{\\fancyplain{}{}}\n"
- "\\fancyhead[RE]{\\fancyplain{}{\\bfseries\\leftmark}}\n"
- "\\fancyhead[LO]{\\fancyplain{}{\\bfseries\\rightmark}}\n"
- "\\fancyhead[CO]{\\fancyplain{}{}}\n"
- "\\fancyhead[RO]{\\fancyplain{}{\\bfseries\\thepage}}\n"
- "\\fancyfoot[LE]{\\fancyplain{}{}}\n"
- "\\fancyfoot[CE]{\\fancyplain{}{}}\n"
- "\\fancyfoot[RE]{\\fancyplain{}{\\bfseries\\scriptsize " << genString << " Doxygen }}\n"
- "\\fancyfoot[LO]{\\fancyplain{}{\\bfseries\\scriptsize " << genString << " Doxygen }}\n"
- "\\fancyfoot[CO]{\\fancyplain{}{}}\n"
- "\\fancyfoot[RO]{\\fancyplain{}{}}\n"
- "\\renewcommand{\\footrulewidth}{0.4pt}\n";
+ "\\renewcommand{\\footrulewidth}{0.4pt}\n"
+ "%\n"
+ "\\fancypagestyle{fancyplain}{\n"
+ "\\fancyhf{}\n"
+ "\\fancyhead[LE, RO]{\\bfseries\\thepage}\n"
+ "\\fancyhead[LO]{\\bfseries\\rightmark}\n"
+ "\\fancyhead[RE]{\\bfseries\\leftmark}\n"
+ "\\fancyfoot[LO, RE]{\\bfseries\\scriptsize " << genString << " Doxygen }\n"
+ "}\n"
+ "%\n"
+ "\\fancypagestyle{plain}{\n"
+ "\\fancyhf{}\n"
+ "\\fancyfoot[LO, RE]{\\bfseries\\scriptsize " << genString << " Doxygen }\n"
+ "\\renewcommand{\\headrulewidth}{0pt}}\n"
+ "%\n"
+ "\\pagestyle{fancyplain}\n"
+ "%\n";
+
if (!Config_getBool(COMPACT_LATEX))
{
t << "\\renewcommand{\\chaptermark}[1]{%\n"
@@ -694,11 +716,10 @@ static void writeDefaultHeaderPart1(FTextStream &t)
QCString macroFile = Config_getString(FORMULA_MACROFILE);
if (!macroFile.isEmpty())
{
- QCString dir=Config_getString(LATEX_OUTPUT);
QFileInfo fi(macroFile);
macroFile=fi.absFilePath().utf8();
QCString stripMacroFile = fi.fileName().data();
- copyFile(macroFile,dir + "/" + stripMacroFile);
+ copyFile(macroFile,Config_getString(LATEX_OUTPUT) + "/" + stripMacroFile);
t << "\\input{" << stripMacroFile << "}" << endl;
}
@@ -748,7 +769,8 @@ static void writeDefaultHeaderPart1(FTextStream &t)
// End of preamble, now comes the document contents
t << "%===== C O N T E N T S =====\n"
"\n"
- "\\begin{document}\n";
+ "\\begin{document}\n"
+ "\\raggedbottom\n";
QCString documentPre = theTranslator->latexDocumentPre();
if (!documentPre.isEmpty())
{
@@ -789,7 +811,7 @@ static void writeDefaultHeaderPart3(FTextStream &t)
{
// part 3
// Finalize project number
- t << " Doxygen " << getVersion() << "}\\\\\n";
+ t << " Doxygen " << getDoxygenVersion() << "}\\\\\n";
if (Config_getBool(LATEX_TIMESTAMP))
t << "\\vspace*{0.5cm}\n"
"{\\small " << dateToString(TRUE) << "}\\\\\n";
@@ -827,7 +849,7 @@ static void writeDefaultFooter(FTextStream &t)
"\n";
// Bibliography
- Doxygen::citeDict->writeLatexBibliography(t);
+ CitationManager::instance().writeLatexBibliography(t);
// Index
t << "% Index\n";
@@ -858,7 +880,7 @@ static void writeDefaultFooter(FTextStream &t)
void LatexGenerator::writeHeaderFile(QFile &f)
{
FTextStream t(&f);
- t << "% Latex header for doxygen " << getVersion() << endl;
+ t << "% Latex header for doxygen " << getDoxygenVersion() << endl;
writeDefaultHeaderPart1(t);
t << "Your title here";
writeDefaultHeaderPart2(t);
@@ -869,18 +891,18 @@ void LatexGenerator::writeHeaderFile(QFile &f)
void LatexGenerator::writeFooterFile(QFile &f)
{
FTextStream t(&f);
- t << "% Latex footer for doxygen " << getVersion() << endl;
+ t << "% Latex footer for doxygen " << getDoxygenVersion() << endl;
writeDefaultFooter(t);
}
void LatexGenerator::writeStyleSheetFile(QFile &f)
{
FTextStream t(&f);
- t << "% stylesheet for doxygen " << getVersion() << endl;
+ t << "% stylesheet for doxygen " << getDoxygenVersion() << endl;
writeDefaultStyleSheet(t);
}
-void LatexGenerator::startFile(const char *name,const char *,const char *)
+void LatexGenerator::startFile(const char *name,const char *,const char *,int)
{
#if 0
setEncoding(Config_getString(LATEX_OUTPUT_ENCODING));
@@ -903,17 +925,17 @@ void LatexGenerator::endFile()
//void LatexGenerator::writeIndex()
//{
// startFile("refman.tex");
-//}
-
+//}
+
void LatexGenerator::startProjectNumber()
{
- t << "\\\\[1ex]\\large ";
+ t << "\\\\[1ex]\\large ";
}
void LatexGenerator::startIndexSection(IndexSections is)
{
- bool &compactLatex = Config_getBool(COMPACT_LATEX);
- QCString &latexHeader = Config_getString(LATEX_HEADER);
+ bool compactLatex = Config_getBool(COMPACT_LATEX);
+ QCString latexHeader = Config_getString(LATEX_HEADER);
switch (is)
{
case isTitlePageStart:
@@ -976,67 +998,56 @@ void LatexGenerator::startIndexSection(IndexSections is)
break;
case isModuleDocumentation:
{
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- bool found=FALSE;
- for (gli.toFirst();(gd=gli.current()) && !found;++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (!gd->isReference())
{
if (compactLatex) t << "\\doxysection"; else t << "\\chapter";
t << "{"; //Module Documentation}\n";
- found=TRUE;
+ break;
}
}
}
break;
case isDirDocumentation:
{
- SDict<DirDef>::Iterator dli(*Doxygen::directories);
- DirDef *dd;
- bool found=FALSE;
- for (dli.toFirst();(dd=dli.current()) && !found;++dli)
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
if (dd->isLinkableInProject())
{
if (compactLatex) t << "\\doxysection"; else t << "\\chapter";
t << "{"; //Module Documentation}\n";
- found=TRUE;
+ break;
}
}
}
break;
case isNamespaceDocumentation:
{
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- bool found=FALSE;
- for (nli.toFirst();(nd=nli.current()) && !found;++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- if (nd->isLinkableInProject())
+ if (nd->isLinkableInProject() && !nd->isAlias())
{
if (compactLatex) t << "\\doxysection"; else t << "\\chapter";
t << "{"; // Namespace Documentation}\n":
- found=TRUE;
+ break;
}
- }
+ }
}
break;
case isClassDocumentation:
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- if (cd->isLinkableInProject() &&
+ if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope()
+ !cd->isEmbeddedInOuterScope() &&
+ !cd->isAlias()
)
{
if (compactLatex) t << "\\doxysection"; else t << "\\chapter";
t << "{"; //Compound Documentation}\n";
- found=TRUE;
+ break;
}
}
}
@@ -1044,13 +1055,9 @@ void LatexGenerator::startIndexSection(IndexSections is)
case isFileDocumentation:
{
bool isFirst=TRUE;
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
if (fd->isLinkableInProject())
{
@@ -1087,10 +1094,10 @@ void LatexGenerator::startIndexSection(IndexSections is)
void LatexGenerator::endIndexSection(IndexSections is)
{
- //static bool compactLatex = Config_getBool(COMPACT_LATEX);
- static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
- static QCString latexHeader = Config_getString(LATEX_HEADER);
- static QCString latexFooter = Config_getString(LATEX_FOOTER);
+ //bool compactLatex = Config_getBool(COMPACT_LATEX);
+ bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
+ QCString latexHeader = Config_getString(LATEX_HEADER);
+ QCString latexFooter = Config_getString(LATEX_FOOTER);
switch (is)
{
case isTitlePageStart:
@@ -1133,140 +1140,95 @@ void LatexGenerator::endIndexSection(IndexSections is)
break;
case isModuleDocumentation:
{
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
bool found=FALSE;
- for (gli.toFirst();(gd=gli.current()) && !found;++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (!gd->isReference())
{
- t << "}\n\\input{" << gd->getOutputFileBase() << "}\n";
- found=TRUE;
- }
- }
- for (;(gd=gli.current());++gli)
- {
- if (!gd->isReference())
- {
- //if (compactLatex) t << "\\input"; else t << "\\include";
- t << "\\include";
- t << "{" << gd->getOutputFileBase() << "}\n";
+ if (!found)
+ {
+ t << "}\n";
+ found=TRUE;
+ }
+ t << "\\input{" << gd->getOutputFileBase() << "}\n";
}
}
}
break;
case isDirDocumentation:
{
- SDict<DirDef>::Iterator dli(*Doxygen::directories);
- DirDef *dd;
bool found=FALSE;
- for (dli.toFirst();(dd=dli.current()) && !found;++dli)
- {
- if (dd->isLinkableInProject())
- {
- t << "}\n\\input{" << dd->getOutputFileBase() << "}\n";
- found=TRUE;
- }
- }
- for (;(dd=dli.current());++dli)
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
if (dd->isLinkableInProject())
{
- //if (compactLatex) t << "\\input"; else t << "\\include";
- t << "\\input";
- t << "{" << dd->getOutputFileBase() << "}\n";
+ if (!found)
+ {
+ t << "}\n";
+ found = TRUE;
+ }
+ t << "\\input{" << dd->getOutputFileBase() << "}\n";
}
}
}
break;
case isNamespaceDocumentation:
{
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
bool found=FALSE;
- for (nli.toFirst();(nd=nli.current()) && !found;++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- if (nd->isLinkableInProject())
+ if (nd->isLinkableInProject() && !nd->isAlias())
{
- t << "}\n\\input{" << nd->getOutputFileBase() << "}\n";
- found=TRUE;
- }
- }
- while ((nd=nli.current()))
- {
- if (nd->isLinkableInProject())
- {
- //if (compactLatex) t << "\\input"; else t << "\\include";
- t << "\\input";
- t << "{" << nd->getOutputFileBase() << "}\n";
+ if (!found)
+ {
+ t << "}\n";
+ found=true;
+ }
+ t << "\\input{" << nd->getOutputFileBase() << "}\n";
}
- ++nli;
}
}
break;
case isClassDocumentation:
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- if (cd->isLinkableInProject() &&
+ if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope()
+ !cd->isEmbeddedInOuterScope() &&
+ !cd->isAlias()
)
{
- t << "}\n\\input{" << cd->getOutputFileBase() << "}\n";
- found=TRUE;
+ if (!found)
+ {
+ t << "}\n"; // end doxysection or chapter title
+ found=TRUE;
+ }
+ t << "\\input{" << cd->getOutputFileBase() << "}\n";
}
}
- for (;(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() &&
- cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope()
- )
- {
- //if (compactLatex) t << "\\input"; else t << "\\include";
- t << "\\input";
- t << "{" << cd->getOutputFileBase() << "}\n";
- }
- }
}
break;
case isFileDocumentation:
{
bool isFirst=TRUE;
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
if (fd->isLinkableInProject())
{
if (isFirst)
{
- t << "}\n\\input{" << fd->getOutputFileBase() << "}\n";
- if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
- {
- //t << "\\include{" << fd->getSourceFileBase() << "}\n";
- t << "\\input{" << fd->getSourceFileBase() << "}\n";
- }
- isFirst=FALSE;
+ t << "}\n"; // end doxysection or chapter title
}
- else
+ isFirst=FALSE;
+ t << "\\input{" << fd->getOutputFileBase() << "}\n";
+ if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
{
- //if (compactLatex) t << "\\input" ; else t << "\\include";
- t << "\\input" ;
- t << "{" << fd->getOutputFileBase() << "}\n";
- if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
- {
- //t << "\\include{" << fd->getSourceFileBase() << "}\n";
- t << "\\input{" << fd->getSourceFileBase() << "}\n";
- }
+ //t << "\\include{" << fd->getSourceFileBase() << "}\n";
+ t << "\\input{" << fd->getSourceFileBase() << "}\n";
}
}
}
@@ -1276,35 +1238,25 @@ void LatexGenerator::endIndexSection(IndexSections is)
case isExampleDocumentation:
{
t << "}\n";
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=pdi.toFirst();
- if (pd)
+ for (const auto &pd : *Doxygen::exampleLinkedMap)
{
t << "\\input{" << pd->getOutputFileBase() << "}\n";
}
- for (++pdi;(pd=pdi.current());++pdi)
- {
- //if (compactLatex) t << "\\input" ; else t << "\\include";
- t << "\\input";
- t << "{" << pd->getOutputFileBase() << "}\n";
- }
}
break;
case isPageDocumentation:
{
t << "}\n";
#if 0
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=pdi.toFirst();
bool first=TRUE;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto *pd : Doxygen::pageLinkedMap)
{
if (!pd->getGroupDef() && !pd->isReference())
{
if (compactLatex) t << "\\doxysection"; else t << "\\chapter";
t << "{" << pd->title();
t << "}\n";
-
+
if (compactLatex || first) t << "\\input" ; else t << "\\include";
t << "{" << pd->getOutputFileBase() << "}\n";
first=FALSE;
@@ -1337,7 +1289,7 @@ void LatexGenerator::writePageLink(const char *name, bool /*first*/)
//bool &compactLatex = Config_getBool(COMPACT_LATEX);
// next is remove for bug615957
//if (compactLatex || first) t << "\\input" ; else t << "\\include";
- t << "\\input" ;
+ t << "\\input" ;
t << "{" << name << "}\n";
}
@@ -1440,7 +1392,7 @@ void LatexGenerator::writeStartAnnoItem(const char *,const char *,
{
t << "\\item\\contentsline{section}\\textbf{ ";
if (path) docify(path);
- docify(name);
+ docify(name);
t << "} ";
}
@@ -1475,17 +1427,17 @@ void LatexGenerator::endIndexValue(const char *name,bool /*hasBrief*/)
//{
// t << "\\textbf{ ";
// docify(name);
-// t << "}";
+// t << "}";
//}
void LatexGenerator::startTextLink(const char *f,const char *anchor)
{
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
if (!m_disableLinks && pdfHyperlinks)
{
t << "\\mbox{\\hyperlink{";
if (f) t << stripPath(f);
- if (anchor) t << "_" << anchor;
+ if (anchor) t << "_" << anchor;
t << "}{";
}
else
@@ -1496,7 +1448,7 @@ void LatexGenerator::startTextLink(const char *f,const char *anchor)
void LatexGenerator::endTextLink()
{
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
if (!m_disableLinks && pdfHyperlinks)
{
t << "}";
@@ -1507,13 +1459,13 @@ void LatexGenerator::endTextLink()
void LatexGenerator::writeObjectLink(const char *ref, const char *f,
const char *anchor, const char *text)
{
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
if (!m_disableLinks && !ref && pdfHyperlinks)
{
t << "\\mbox{\\hyperlink{";
if (f) t << stripPath(f);
- if (f && anchor) t << "_";
- if (anchor) t << anchor;
+ if (f && anchor) t << "_";
+ if (anchor) t << anchor;
t << "}{";
docify(text);
t << "}}";
@@ -1523,7 +1475,7 @@ void LatexGenerator::writeObjectLink(const char *ref, const char *f,
t << "\\textbf{ ";
docify(text);
t << "}";
- }
+ }
}
void LatexGenerator::startPageRef()
@@ -1534,7 +1486,7 @@ void LatexGenerator::startPageRef()
void LatexGenerator::endPageRef(const char *clname, const char *anchor)
{
t << "}{";
- if (clname) t << clname;
+ if (clname) t << clname;
if (anchor) t << "_" << anchor;
t << "}";
}
@@ -1542,19 +1494,19 @@ void LatexGenerator::endPageRef(const char *clname, const char *anchor)
void LatexGenerator::startTitleHead(const char *fileName)
{
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
- static bool usePDFLatex = Config_getBool(USE_PDFLATEX);
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ bool usePDFLatex = Config_getBool(USE_PDFLATEX);
if (usePDFLatex && pdfHyperlinks && fileName)
{
t << "\\hypertarget{" << stripPath(fileName) << "}{}";
}
- if (Config_getBool(COMPACT_LATEX))
+ if (Config_getBool(COMPACT_LATEX))
{
- t << "\\doxysubsection{";
+ t << "\\doxysubsection{";
}
- else
+ else
{
- t << "\\doxysection{";
+ t << "\\doxysection{";
}
}
@@ -1573,26 +1525,26 @@ void LatexGenerator::endTitleHead(const char *fileName,const char *name)
void LatexGenerator::startTitle()
{
- if (Config_getBool(COMPACT_LATEX))
+ if (Config_getBool(COMPACT_LATEX))
{
- t << "\\doxysubsection{";
+ t << "\\doxysubsection{";
}
- else
+ else
{
- t << "\\doxysection{";
+ t << "\\doxysection{";
}
}
void LatexGenerator::startGroupHeader(int extraIndentLevel)
{
- if (Config_getBool(COMPACT_LATEX))
+ if (Config_getBool(COMPACT_LATEX))
{
extraIndentLevel++;
}
if (extraIndentLevel==3)
{
- t << "\\doxysubparagraph*{";
+ t << "\\doxysubparagraph*{";
}
else if (extraIndentLevel==2)
{
@@ -1617,11 +1569,11 @@ void LatexGenerator::endGroupHeader(int)
void LatexGenerator::startMemberHeader(const char *,int)
{
- if (Config_getBool(COMPACT_LATEX))
+ if (Config_getBool(COMPACT_LATEX))
{
- t << "\\doxysubsubsection*{";
+ t << "\\doxysubsubsection*{";
}
- else
+ else
{
t << "\\doxysubsection*{";
}
@@ -1673,8 +1625,8 @@ void LatexGenerator::startMemberDoc(const char *clname,
t << "}" << endl;
}
static const char *levelLab[] = { "doxysubsubsection","doxyparagraph","doxysubparagraph", "doxysubparagraph" };
- static bool compactLatex = Config_getBool(COMPACT_LATEX);
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ bool compactLatex = Config_getBool(COMPACT_LATEX);
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
int level=0;
if (showInline) level+=2;
if (compactLatex) level++;
@@ -1710,8 +1662,8 @@ void LatexGenerator::startDoxyAnchor(const char *fName,const char *,
const char *anchor, const char *,
const char *)
{
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
- static bool usePDFLatex = Config_getBool(USE_PDFLATEX);
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ bool usePDFLatex = Config_getBool(USE_PDFLATEX);
t << "\\mbox{";
if (usePDFLatex && pdfHyperlinks)
{
@@ -1731,11 +1683,11 @@ void LatexGenerator::endDoxyAnchor(const char *fName,const char *anchor)
}
void LatexGenerator::writeAnchor(const char *fName,const char *name)
-{
+{
//printf("LatexGenerator::writeAnchor(%s,%s)\n",fName,name);
- t << "\\label{" << stripPath(name) << "}" << endl;
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
- static bool usePDFLatex = Config_getBool(USE_PDFLATEX);
+ t << "\\label{" << stripPath(name) << "}" << endl;
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ bool usePDFLatex = Config_getBool(USE_PDFLATEX);
if (usePDFLatex && pdfHyperlinks)
{
if (fName)
@@ -1777,10 +1729,10 @@ void LatexGenerator::addIndexItem(const char *s1,const char *s2)
}
-void LatexGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type)
+void LatexGenerator::startSection(const char *lab,const char *,SectionType type)
{
- static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
- static bool usePDFLatex = Config_getBool(USE_PDFLATEX);
+ bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
+ bool usePDFLatex = Config_getBool(USE_PDFLATEX);
if (usePDFLatex && pdfHyperlinks)
{
t << "\\hypertarget{" << stripPath(lab) << "}{}";
@@ -1790,11 +1742,11 @@ void LatexGenerator::startSection(const char *lab,const char *,SectionInfo::Sect
{
switch(type)
{
- case SectionInfo::Page: t << "doxysubsection"; break;
- case SectionInfo::Section: t << "doxysubsubsection"; break;
- case SectionInfo::Subsection: t << "doxyparagraph"; break;
- case SectionInfo::Subsubsection: t << "doxysubparagraph"; break;
- case SectionInfo::Paragraph: t << "doxysubparagraph"; break;
+ case SectionType::Page: t << "doxysubsection"; break;
+ case SectionType::Section: t << "doxysubsubsection"; break;
+ case SectionType::Subsection: t << "doxyparagraph"; break;
+ case SectionType::Subsubsection: t << "doxysubparagraph"; break;
+ case SectionType::Paragraph: t << "doxysubparagraph"; break;
default: ASSERT(0); break;
}
t << "{";
@@ -1803,18 +1755,18 @@ void LatexGenerator::startSection(const char *lab,const char *,SectionInfo::Sect
{
switch(type)
{
- case SectionInfo::Page: t << "doxysection"; break;
- case SectionInfo::Section: t << "doxysubsection"; break;
- case SectionInfo::Subsection: t << "doxysubsubsection"; break;
- case SectionInfo::Subsubsection: t << "doxyparagraph"; break;
- case SectionInfo::Paragraph: t << "doxysubparagraph"; break;
+ case SectionType::Page: t << "doxysection"; break;
+ case SectionType::Section: t << "doxysubsection"; break;
+ case SectionType::Subsection: t << "doxysubsubsection"; break;
+ case SectionType::Subsubsection: t << "doxyparagraph"; break;
+ case SectionType::Paragraph: t << "doxysubparagraph"; break;
default: ASSERT(0); break;
}
t << "{";
}
}
-void LatexGenerator::endSection(const char *lab,SectionInfo::SectionType)
+void LatexGenerator::endSection(const char *lab,SectionType)
{
t << "}\\label{" << lab << "}" << endl;
}
@@ -1822,7 +1774,13 @@ void LatexGenerator::endSection(const char *lab,SectionInfo::SectionType)
void LatexGenerator::docify(const char *str)
{
- filterLatexString(t,str,m_insideTabbing,FALSE,FALSE);
+ filterLatexString(t,str,
+ m_insideTabbing, // insideTabbing
+ false, // insidePre
+ false, // insideItem
+ m_codeGen.usedTableLevel()>0, // insideTable
+ false // keepSpaces
+ );
}
void LatexGenerator::writeChar(char c)
@@ -1842,7 +1800,7 @@ void LatexGenerator::startClassDiagram()
void LatexGenerator::endClassDiagram(const ClassDiagram &d,
const char *fileName,const char *)
{
- d.writeFigure(t,m_dir,fileName);
+ d.writeFigure(t,dir(),fileName);
}
@@ -1883,31 +1841,31 @@ void LatexGenerator::endMemberTemplateParams(const char *,const char *)
}
}
-void LatexGenerator::startMemberItem(const char *,int annoType,const char *)
-{
+void LatexGenerator::startMemberItem(const char *,int annoType,const char *)
+{
//printf("LatexGenerator::startMemberItem(%d)\n",annType);
if (!m_insideTabbing)
{
- t << "\\item " << endl;
+ t << "\\item " << endl;
templateMemberItem = (annoType == 3);
}
}
-void LatexGenerator::endMemberItem()
+void LatexGenerator::endMemberItem()
{
if (m_insideTabbing)
{
t << "\\\\";
- }
+ }
templateMemberItem = FALSE;
- t << endl;
+ t << endl;
}
-void LatexGenerator::startMemberDescription(const char *,const char *,bool)
+void LatexGenerator::startMemberDescription(const char *,const char *,bool)
{
if (!m_insideTabbing)
- {
- t << "\\begin{DoxyCompactList}\\small\\item\\em ";
+ {
+ t << "\\begin{DoxyCompactList}\\small\\item\\em ";
}
else
{
@@ -1916,12 +1874,12 @@ void LatexGenerator::startMemberDescription(const char *,const char *,bool)
}
}
-void LatexGenerator::endMemberDescription()
-{
+void LatexGenerator::endMemberDescription()
+{
if (!m_insideTabbing)
{
- //t << "\\item\\end{DoxyCompactList}";
- t << "\\end{DoxyCompactList}";
+ //t << "\\item\\end{DoxyCompactList}";
+ t << "\\end{DoxyCompactList}";
}
else
{
@@ -1930,7 +1888,7 @@ void LatexGenerator::endMemberDescription()
}
-void LatexGenerator::writeNonBreakableSpace(int)
+void LatexGenerator::writeNonBreakableSpace(int)
{
//printf("writeNonBreakableSpace()\n");
if (m_insideTabbing)
@@ -1939,7 +1897,7 @@ void LatexGenerator::writeNonBreakableSpace(int)
}
else
{
- t << "~";
+ t << "~";
}
}
@@ -1959,13 +1917,13 @@ void LatexGenerator::writeNonBreakableSpace(int)
void LatexGenerator::startDescTable(const char *title)
{
- incUsedTableLevels();
+ m_codeGen.incUsedTableLevel();
t << "\\begin{DoxyEnumFields}{" << title << "}" << endl;
}
void LatexGenerator::endDescTable()
{
- decUsedTableLevels();
+ m_codeGen.decUsedTableLevel();
t << "\\end{DoxyEnumFields}" << endl;
}
@@ -1999,25 +1957,25 @@ void LatexGenerator::endDescTableData()
t << "\\\\\n\\hline\n" << endl;
}
-void LatexGenerator::lastIndexPage()
+void LatexGenerator::lastIndexPage()
{
}
-void LatexGenerator::startMemberList()
-{
+void LatexGenerator::startMemberList()
+{
if (!m_insideTabbing)
{
- t << "\\begin{DoxyCompactItemize}" << endl;
+ t << "\\begin{DoxyCompactItemize}" << endl;
}
}
-void LatexGenerator::endMemberList()
+void LatexGenerator::endMemberList()
{
//printf("LatexGenerator::endMemberList(%d)\n",m_insideTabbing);
if (!m_insideTabbing)
{
- t << "\\end{DoxyCompactItemize}" << endl;
+ t << "\\end{DoxyCompactItemize}" << endl;
}
}
@@ -2027,7 +1985,7 @@ void LatexGenerator::startMemberGroupHeader(bool hasHeader)
if (hasHeader) t << "\\begin{Indent}";
t << "\\textbf{ ";
// changed back to rev 756 due to bug 660501
- //if (Config_getBool(COMPACT_LATEX))
+ //if (Config_getBool(COMPACT_LATEX))
//{
// t << "\\doxysubparagraph*{";
//}
@@ -2060,80 +2018,80 @@ void LatexGenerator::startMemberGroup()
void LatexGenerator::endMemberGroup(bool hasHeader)
{
- if (hasHeader)t << "\\end{Indent}";
+ if (hasHeader)t << "\\end{Indent}";
t << endl;
}
-void LatexGenerator::startDotGraph()
+void LatexGenerator::startDotGraph()
{
newParagraph();
}
-void LatexGenerator::endDotGraph(DotClassGraph &g)
+void LatexGenerator::endDotGraph(DotClassGraph &g)
{
- g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString(LATEX_OUTPUT),m_fileName,m_relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,dir(),fileName(),m_relPath);
}
-void LatexGenerator::startInclDepGraph()
+void LatexGenerator::startInclDepGraph()
{
}
-void LatexGenerator::endInclDepGraph(DotInclDepGraph &g)
+void LatexGenerator::endInclDepGraph(DotInclDepGraph &g)
{
- g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString(LATEX_OUTPUT),m_fileName,m_relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,dir(),fileName(),m_relPath);
}
-void LatexGenerator::startGroupCollaboration()
+void LatexGenerator::startGroupCollaboration()
{
}
-void LatexGenerator::endGroupCollaboration(DotGroupCollaboration &g)
+void LatexGenerator::endGroupCollaboration(DotGroupCollaboration &g)
{
- g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString(LATEX_OUTPUT),m_fileName,m_relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,dir(),fileName(),m_relPath);
}
-void LatexGenerator::startCallGraph()
+void LatexGenerator::startCallGraph()
{
}
-void LatexGenerator::endCallGraph(DotCallGraph &g)
+void LatexGenerator::endCallGraph(DotCallGraph &g)
{
- g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString(LATEX_OUTPUT),m_fileName,m_relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,dir(),fileName(),m_relPath);
}
-void LatexGenerator::startDirDepGraph()
+void LatexGenerator::startDirDepGraph()
{
}
-void LatexGenerator::endDirDepGraph(DotDirDeps &g)
+void LatexGenerator::endDirDepGraph(DotDirDeps &g)
{
- g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString(LATEX_OUTPUT),m_fileName,m_relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,dir(),fileName(),m_relPath);
}
-void LatexGenerator::startDescription()
-{
- t << "\\begin{description}" << endl;
+void LatexGenerator::startDescription()
+{
+ t << "\\begin{description}" << endl;
}
-void LatexGenerator::endDescription()
-{
- t << "\\end{description}" << endl;
+void LatexGenerator::endDescription()
+{
+ t << "\\end{description}" << endl;
m_firstDescItem=TRUE;
}
-void LatexGenerator::startDescItem()
-{
+void LatexGenerator::startDescItem()
+{
m_firstDescItem=TRUE;
- t << "\\item[";
+ t << "\\item[";
}
-void LatexGenerator::endDescItem()
-{
- if (m_firstDescItem)
+void LatexGenerator::endDescItem()
+{
+ if (m_firstDescItem)
{
t << "]" << endl;
m_firstDescItem=FALSE;
- }
+ }
else
{
lineBreak();
@@ -2210,10 +2168,10 @@ void LatexGenerator::exceptionEntry(const char* prefix,bool closeBracket)
t << " ";
}
-void LatexGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *)
+void LatexGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *,int)
{
LatexDocVisitor *visitor =
- new LatexDocVisitor(t,*this,ctx?ctx->getDefFileExtension():QCString(""),m_insideTabbing);
+ new LatexDocVisitor(t,m_codeGen,ctx?ctx->getDefFileExtension():QCString(""),m_insideTabbing);
n->accept(visitor);
delete visitor;
}
@@ -2259,28 +2217,13 @@ void LatexGenerator::endConstraintList()
t << "\\end{Desc}" << endl;
}
-void LatexGenerator::startCodeFragment()
-{
- t << "\n\\begin{DoxyCode}{" << usedTableLevels() << "}\n";
- DoxyCodeOpen = TRUE;
-}
-
-void LatexGenerator::endCodeFragment()
-{
- //endCodeLine checks is there is still an open code line, if so closes it.
- endCodeLine();
-
- t << "\\end{DoxyCode}\n";
- DoxyCodeOpen = FALSE;
-}
-
void LatexGenerator::startInlineHeader()
{
- if (Config_getBool(COMPACT_LATEX))
+ if (Config_getBool(COMPACT_LATEX))
{
- t << "\\doxyparagraph*{";
+ t << "\\doxyparagraph*{";
}
- else
+ else
{
t << "\\doxysubsubsection*{";
}
@@ -2305,7 +2248,7 @@ void LatexGenerator::lineBreak(const char *)
void LatexGenerator::startMemberDocSimple(bool isEnum)
{
- incUsedTableLevels();
+ m_codeGen.incUsedTableLevel();
if (isEnum)
{
t << "\\begin{DoxyEnumFields}{";
@@ -2321,7 +2264,7 @@ void LatexGenerator::startMemberDocSimple(bool isEnum)
void LatexGenerator::endMemberDocSimple(bool isEnum)
{
- decUsedTableLevels();
+ m_codeGen.decUsedTableLevel();
if (isEnum)
{
t << "\\end{DoxyEnumFields}" << endl;
diff --git a/src/latexgen.h b/src/latexgen.h
index 7d4cae8..6be5de7 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,11 +18,12 @@
#ifndef LATEXGEN_H
#define LATEXGEN_H
+#include "config.h"
#include "outputgen.h"
class QFile;
-static const char *latexStyleExtension = ".sty";
+#define LATEX_STYLE_EXTENSION ".sty"
class LatexCodeGenerator : public CodeOutputInterface
{
@@ -51,7 +52,13 @@ class LatexCodeGenerator : public CodeOutputInterface
void writeCodeAnchor(const char *) {}
void setCurrentDoc(const Definition *,const char *,bool) {}
void addWord(const char *,bool) {}
- static void setDoxyCodeOpen(bool val);
+ void startCodeFragment(const char *style);
+ void endCodeFragment(const char *style);
+
+ // extra methods not part of CodeOutputInterface
+ void incUsedTableLevel() { m_usedTableLevel++; }
+ void decUsedTableLevel() { m_usedTableLevel--; }
+ int usedTableLevel() const { return m_usedTableLevel; }
private:
void _writeCodeLink(const char *className,
@@ -59,12 +66,14 @@ class LatexCodeGenerator : public CodeOutputInterface
const char *anchor,const char *name,
const char *tooltip);
void docify(const char *str);
- bool m_streamSet;
+ bool m_streamSet = false;
FTextStream m_t;
QCString m_relPath;
QCString m_sourceFileName;
- int m_col;
- bool m_prettyCode;
+ int m_col = 0;
+ bool m_prettyCode = false;
+ bool m_doxyCodeLineOpen = false;
+ int m_usedTableLevel = 0;
};
/** Generator for LaTeX output. */
@@ -72,23 +81,17 @@ class LatexGenerator : public OutputGenerator
{
public:
LatexGenerator();
- ~LatexGenerator();
+ LatexGenerator(const LatexGenerator &);
+ LatexGenerator &operator=(const LatexGenerator &);
+ virtual ~LatexGenerator();
+ virtual std::unique_ptr<OutputGenerator> clone() const;
+
static void init();
static void writeStyleSheetFile(QFile &f);
static void writeHeaderFile(QFile &f);
static void writeFooterFile(QFile &f);
- //OutputGenerator *copy();
- //OutputGenerator *clone() { return new LatexGenerator(*this); }
- //void append(const OutputGenerator *o);
- void enable()
- { if (m_genStack->top()) m_active=*m_genStack->top(); else m_active=TRUE; }
- void disable() { m_active=FALSE; }
- void enableIf(OutputType o) { if (o==Latex) enable(); }
- void disableIf(OutputType o) { if (o==Latex) disable(); }
- void disableIfNot(OutputType o) { if (o!=Latex) disable(); }
- bool isEnabled(OutputType o) { return (o==Latex && m_active); }
- OutputGenerator *get(OutputType o) { return (o==Latex) ? this : 0; }
+ virtual OutputType type() const { return Latex; }
// --- CodeOutputInterface
void codify(const char *text)
@@ -113,17 +116,21 @@ class LatexGenerator : public OutputGenerator
{ m_codeGen.endFontClass(); }
void writeCodeAnchor(const char *anchor)
{ m_codeGen.writeCodeAnchor(anchor); }
+ void startCodeFragment(const char *style)
+ { m_codeGen.startCodeFragment(style); }
+ void endCodeFragment(const char *style)
+ { m_codeGen.endCodeFragment(style); }
// ---------------------------
- void writeDoc(DocNode *,const Definition *ctx,const MemberDef *);
+ void writeDoc(DocNode *,const Definition *ctx,const MemberDef *,int id);
- void startFile(const char *name,const char *manName,const char *title);
+ void startFile(const char *name,const char *manName,const char *title,int id);
void writeSearchInfo() {}
void writeFooter(const char *) {}
void endFile();
void clearBuffer();
-
+
void startIndexSection(IndexSections);
void endIndexSection(IndexSections);
void writePageLink(const char *,bool);
@@ -167,7 +174,7 @@ class LatexGenerator : public OutputGenerator
void endItemListItem() {}
void startMemberSections() {}
- void endMemberSections() {}
+ void endMemberSections() {}
void startHeaderSection() {}
void endHeaderSection() {}
void startMemberHeader(const char *,int);
@@ -193,14 +200,12 @@ class LatexGenerator : public OutputGenerator
void endMemberGroupDocs();
void startMemberGroup();
void endMemberGroup(bool);
-
+
void insertMemberAlign(bool) {}
void insertMemberAlignLeft(int,bool){}
void writeRuler() { t << endl << endl; }
void writeAnchor(const char *fileName,const char *name);
- void startCodeFragment();
- void endCodeFragment();
void startEmphasis() { t << "{\\em "; }
void endEmphasis() { t << "}"; }
void startBold() { t << "{\\bfseries "; }
@@ -216,7 +221,7 @@ class LatexGenerator : public OutputGenerator
void endDoxyAnchor(const char *,const char *);
void writeChar(char c);
void writeLatexSpacing() { t << "\\hspace{0.3cm}"; }
- void writeStartAnnoItem(const char *type,const char *file,
+ void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name);
void writeEndAnnoItem(const char *name);
void startSubsection() { t << "\\subsection*{"; }
@@ -229,7 +234,7 @@ class LatexGenerator : public OutputGenerator
void endSmall() { t << "\\normalsize "; }
void startMemberDescription(const char *,const char *,bool);
void endMemberDescription();
- void startMemberDeclaration() {}
+ void startMemberDeclaration() {}
void endMemberDeclaration(const char *,const char *) {}
void writeInheritedSectionTitle(const char *,const char *,const char *,
const char *,const char *,const char *) {}
@@ -241,8 +246,8 @@ class LatexGenerator : public OutputGenerator
void endParamList();
void startDescForItem() { t << "\\par" << endl; }
void endDescForItem() {}
- void startSection(const char *,const char *,SectionInfo::SectionType);
- void endSection(const char *,SectionInfo::SectionType);
+ void startSection(const char *,const char *,SectionType);
+ void endSection(const char *,SectionType);
void addIndexItem(const char *,const char *);
void startIndent() {}
void endIndent() {}
@@ -326,15 +331,13 @@ class LatexGenerator : public OutputGenerator
private:
- LatexGenerator(const LatexGenerator &);
- LatexGenerator &operator=(const LatexGenerator &);
- bool m_insideTabbing;
- bool m_firstDescItem;
- bool m_disableLinks;
+ bool m_insideTabbing = false;
+ bool m_firstDescItem = true;
+ bool m_disableLinks = false;
QCString m_relPath;
- int m_indent;
- bool templateMemberItem;
- bool m_prettyCode;
+ int m_indent = 0;
+ bool templateMemberItem = false;
+ bool m_prettyCode = Config_getBool(LATEX_SOURCE_CODE);
LatexCodeGenerator m_codeGen;
};
diff --git a/src/layout.cpp b/src/layout.cpp
index 946b612..5cac7e1 100644
--- a/src/layout.cpp
+++ b/src/layout.cpp
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,6 +16,10 @@
*
*/
+#include <assert.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+
#include "layout.h"
#include "message.h"
#include "language.h"
@@ -24,38 +28,57 @@
#include "doxygen.h"
#include "version.h"
#include "config.h"
+#include "xml.h"
+#include "resourcemgr.h"
-#include <assert.h>
-#include <qxml.h>
-#include <qfile.h>
-#include <qstring.h>
-#include <qfileinfo.h>
-#include <qtextstream.h>
-
-static const char layout_default[] =
-#include "layout_default.xml.h"
-;
+inline QCString compileOptions(const QCString &def)
+{
+ return def;
+}
-#define ADD_OPTION(langId,text) "|"+QCString().setNum(langId)+"="+text
+inline QCString compileOptions(const QCString &def,SrcLangExt langId1,const QCString &value1)
+{
+ return compileOptions(def)+"|"+QCString().setNum(langId1)+"="+value1;
+}
-#define COMPILE_FOR_1_OPTION(def,langId1,text1) \
- def+ADD_OPTION(langId1,text1)
+inline QCString compileOptions(const QCString &def,SrcLangExt langId1,const QCString &value1,
+ SrcLangExt langId2,const QCString &value2)
+{
+ return compileOptions(def,langId1,value1)+
+ "|"+QCString().setNum(langId2)+"="+value2;
+}
-#define COMPILE_FOR_2_OPTIONS(def,langId1,text1,langId2,text2) \
- COMPILE_FOR_1_OPTION(def,langId1,text1)+ADD_OPTION(langId2,text2)
+inline QCString compileOptions(const QCString &def,SrcLangExt langId1,const QCString &value1,
+ SrcLangExt langId2,const QCString &value2,
+ SrcLangExt langId3,const QCString &value3)
+{
+ return compileOptions(def,langId1,value1,langId2,value2)+
+ "|"+QCString().setNum(langId3)+"="+value3;
+}
-#define COMPILE_FOR_3_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3) \
- COMPILE_FOR_2_OPTIONS(def,langId1,text1,langId2,text2)+ADD_OPTION(langId3,text3)
+inline QCString compileOptions(const QCString &def,SrcLangExt langId1,const QCString &value1,
+ SrcLangExt langId2,const QCString &value2,
+ SrcLangExt langId3,const QCString &value3,
+ SrcLangExt langId4,const QCString &value4)
+{
+ return compileOptions(def,langId1,value1,langId2,value2,langId3,value3)+
+ "|"+QCString().setNum(langId4)+"="+value4;
+}
-#define COMPILE_FOR_4_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3,langId4,text4) \
- COMPILE_FOR_3_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3)+ADD_OPTION(langId4,text4)
+inline QCString compileOptions(const QCString &def,SrcLangExt langId1,const QCString &value1,
+ SrcLangExt langId2,const QCString &value2,
+ SrcLangExt langId3,const QCString &value3,
+ SrcLangExt langId4,const QCString &value4,
+ SrcLangExt langId5,const QCString &value5)
+{
+ return compileOptions(def,langId1,value1,langId2,value2,langId3,value3,langId4,value4)+
+ "|"+QCString().setNum(langId5)+"="+value5;
+}
-#define COMPILE_FOR_5_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3,langId4,text4,langId5,text5) \
- COMPILE_FOR_4_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3,langId4,text4)+ADD_OPTION(langId5,text5)
-static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE)
+static bool elemIsVisible(const XMLHandlers::Attributes &attrib,bool defVal=TRUE)
{
- QCString visible = attrib.value("visible").utf8();
+ QCString visible = XMLHandlers::value(attrib,"visible");
if (visible.isEmpty()) return defVal;
if (visible.at(0)=='$' && visible.length()>1)
{
@@ -63,7 +86,7 @@ static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE)
const ConfigValues::Info *opt = ConfigValues::instance().get(id);
if (opt && opt->type==ConfigValues::Info::Bool)
{
- return ConfigValues::instance().*((ConfigValues::InfoBool*)opt)->item;
+ return ConfigValues::instance().*(opt->value.b);
}
else if (!opt)
{
@@ -84,7 +107,7 @@ LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind,
LayoutNavEntry *entry;
for (li.toFirst();(entry=li.current());++li)
{
- // depth first search, needed to find the entry furthest from the
+ // depth first search, needed to find the entry furthest from the
// root in case an entry is in the tree twice
result = entry->find(kind,file);
if (result) return result;
@@ -96,10 +119,12 @@ LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind,
return result;
}
+
+
QCString LayoutNavEntry::url() const
{
QCString url = baseFile().stripWhiteSpace();
- if ((kind()!=LayoutNavEntry::User && kind()!=LayoutNavEntry::UserGroup) ||
+ if ((kind()!=LayoutNavEntry::User && kind()!=LayoutNavEntry::UserGroup) ||
(kind()==LayoutNavEntry::UserGroup && url.left(9)=="usergroup"))
{
url+=Doxygen::htmlFileExtension;
@@ -111,7 +136,7 @@ QCString LayoutNavEntry::url() const
bool found=FALSE;
if (resolveLink(0,url.mid(5).stripWhiteSpace(),TRUE,&d,anchor))
{
- if (d && d->isLinkable())
+ if (d && d->isLinkable())
{
url=d->getOutputFileBase()+Doxygen::htmlFileExtension;
if (!anchor.isEmpty())
@@ -132,762 +157,28 @@ QCString LayoutNavEntry::url() const
//---------------------------------------------------------------------------------
-class LayoutParser : public QXmlDefaultHandler
+class LayoutParser
{
- private:
- class StartElementHandler
- {
- typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib);
- public:
- StartElementHandler(LayoutParser *parent, Handler h)
- : m_parent(parent), m_handler(h) {}
- virtual ~StartElementHandler() {}
- virtual void operator()(const QXmlAttributes &attrib)
- {
- (m_parent->*m_handler)(attrib);
- }
- protected:
- StartElementHandler() : m_parent(0), m_handler(0) {}
- private:
- LayoutParser *m_parent;
- Handler m_handler;
- };
-
- class StartElementHandlerKind : public StartElementHandler
- {
- typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
- const QXmlAttributes &attrib);
- public:
- StartElementHandlerKind(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h)
- : m_parent(parent), m_kind(k), m_handler(h) {}
- void operator()(const QXmlAttributes &attrib)
- {
- (m_parent->*m_handler)(m_kind,attrib);
- }
- private:
- LayoutParser *m_parent;
- LayoutDocEntry::Kind m_kind;
- Handler m_handler;
- };
-
- class StartElementHandlerSection : public StartElementHandler
- {
- typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
- const QXmlAttributes &attrib,
- const QCString &title);
- public:
- StartElementHandlerSection(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h,
- const QCString &title)
- : m_parent(parent), m_kind(k), m_handler(h), m_title(title) {}
- void operator()(const QXmlAttributes &attrib)
- {
- (m_parent->*m_handler)(m_kind,attrib,m_title);
- }
- private:
- LayoutParser *m_parent;
- LayoutDocEntry::Kind m_kind;
- Handler m_handler;
- QCString m_title;
- };
-
- class StartElementHandlerMember : public StartElementHandler
- {
- typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib,
- MemberListType type,
- const QCString &title,
- const QCString &subtitle);
- public:
- StartElementHandlerMember(LayoutParser *parent,
- Handler h,
- MemberListType type,
- const QCString &tl,
- const QCString &ss = QCString()
- )
- : m_parent(parent), m_handler(h), m_type(type),
- m_title(tl), m_subscript(ss) {}
- void operator()(const QXmlAttributes &attrib)
- {
- (m_parent->*m_handler)(attrib,m_type,m_title,m_subscript);
- }
- private:
- LayoutParser *m_parent;
- Handler m_handler;
- MemberListType m_type;
- QCString m_title;
- QCString m_subscript;
- };
-
- class StartElementHandlerNavEntry : public StartElementHandler
- {
- typedef void (LayoutParser::*Handler)(LayoutNavEntry::Kind kind,
- const QXmlAttributes &attrib,
- const QCString &title);
- public:
- StartElementHandlerNavEntry(LayoutParser *parent,
- LayoutNavEntry::Kind kind,
- Handler h,
- const QCString &tl
- )
- : m_parent(parent), m_kind(kind), m_handler(h), m_title(tl) {}
- void operator()(const QXmlAttributes &attrib)
- {
- (m_parent->*m_handler)(m_kind,attrib,m_title);
- }
- private:
- LayoutParser *m_parent;
- LayoutNavEntry::Kind m_kind;
- Handler m_handler;
- QCString m_title;
- };
-
- class EndElementHandler
- {
- typedef void (LayoutParser::*Handler)();
- public:
- EndElementHandler(LayoutParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
- void operator()() { (m_parent->*m_handler)(); }
- private:
- LayoutParser *m_parent;
- Handler m_handler;
- };
-
-
public:
static LayoutParser &instance()
{
static LayoutParser *theInstance = new LayoutParser;
return *theInstance;
}
- void init()
+
+ // =========== XMLHandler events
+ void setDocumentLocator(const XMLLocator *locator)
+ {
+ m_locator = locator;
+ }
+ void error( const std::string &fileName,int lineNr,const std::string &msg)
{
- m_sHandler.setAutoDelete(TRUE);
- m_eHandler.setAutoDelete(TRUE);
- m_part = -1; // invalid
- m_rootNav = 0;
-
- //bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
- //bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
- //bool javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
- bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
-
- // start & end handlers
- m_sHandler.insert("doxygenlayout",
- new StartElementHandler(this,&LayoutParser::startLayout));
- m_eHandler.insert("doxygenlayout",
- new EndElementHandler(this,&LayoutParser::endLayout));
-
- // class layout handlers
- m_sHandler.insert("navindex",
- new StartElementHandler(this,&LayoutParser::startNavIndex));
- m_sHandler.insert("navindex/tab",
- new StartElementHandler(this,&LayoutParser::startNavEntry));
- m_eHandler.insert("navindex/tab",
- new EndElementHandler(this,&LayoutParser::endNavEntry));
- m_eHandler.insert("navindex",
- new EndElementHandler(this,&LayoutParser::endNavIndex));
-
- // class layout handlers
- m_sHandler.insert("class",
- new StartElementHandler(this,&LayoutParser::startClass));
- m_sHandler.insert("class/briefdescription",
- new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("class/detaileddescription",
- new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
- theTranslator->trDetailedDescription()));
- m_sHandler.insert("class/authorsection",
- new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("class/includes",
- new StartElementHandlerKind(this,LayoutDocEntry::ClassIncludes,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("class/inheritancegraph",
- new StartElementHandlerKind(this,LayoutDocEntry::ClassInheritanceGraph,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("class/collaborationgraph",
- new StartElementHandlerKind(this,LayoutDocEntry::ClassCollaborationGraph,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("class/allmemberslink",
- new StartElementHandlerKind(this,LayoutDocEntry::ClassAllMembersLink,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("class/usedfiles",
- new StartElementHandlerKind(this,LayoutDocEntry::ClassUsedFiles,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("class/memberdecl",
- new StartElementHandler(this,&LayoutParser::startMemberDecl));
- m_sHandler.insert("class/memberdecl/membergroups",
- new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("class/memberdecl/nestedclasses",
- new StartElementHandlerSection(this,LayoutDocEntry::ClassNestedClasses,&LayoutParser::startSectionEntry,
- COMPILE_FOR_2_OPTIONS(
- theTranslator->trCompounds(),
- SrcLangExt_VHDL,theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
- SrcLangExt_Fortran,theTranslator->trDataTypes()
- )));
- m_sHandler.insert("class/memberdecl/services",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_services,theTranslator->trServices()));
- m_sHandler.insert("class/memberdecl/interfaces",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_interfaces,theTranslator->trInterfaces()));
- m_sHandler.insert("class/memberdecl/publictypes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pubTypes,theTranslator->trPublicTypes()));
- m_sHandler.insert("class/memberdecl/publicslots",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pubSlots,theTranslator->trPublicSlots()));
- m_sHandler.insert("class/memberdecl/signals",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_signals,theTranslator->trSignals()));
- m_sHandler.insert("class/memberdecl/publicmethods",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pubMethods,
- COMPILE_FOR_2_OPTIONS(
- theTranslator->trPublicMembers(),
- SrcLangExt_ObjC,theTranslator->trInstanceMethods(),
- SrcLangExt_Slice,theTranslator->trOperations()
- )));
- m_sHandler.insert("class/memberdecl/publicstaticmethods",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pubStaticMethods,
- COMPILE_FOR_1_OPTION(
- theTranslator->trStaticPublicMembers(),
- SrcLangExt_ObjC,theTranslator->trClassMethods()
- )));
- m_sHandler.insert("class/memberdecl/publicattributes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pubAttribs,
- COMPILE_FOR_1_OPTION(
- theTranslator->trPublicAttribs(),
- SrcLangExt_Slice,theTranslator->trDataMembers()
- )));
- m_sHandler.insert("class/memberdecl/publicstaticattributes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs()));
- m_sHandler.insert("class/memberdecl/protectedtypes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_proTypes,theTranslator->trProtectedTypes()));
- m_sHandler.insert("class/memberdecl/protectedslots",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_proSlots,theTranslator->trProtectedSlots()));
- m_sHandler.insert("class/memberdecl/protectedmethods",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_proMethods,theTranslator->trProtectedMembers()));
- m_sHandler.insert("class/memberdecl/protectedstaticmethods",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers()));
- m_sHandler.insert("class/memberdecl/protectedattributes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_proAttribs,theTranslator->trProtectedAttribs()));
- m_sHandler.insert("class/memberdecl/protectedstaticattributes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs()));
- m_sHandler.insert("class/memberdecl/packagetypes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pacTypes,theTranslator->trPackageTypes()));
- m_sHandler.insert("class/memberdecl/packagemethods",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pacMethods,theTranslator->trPackageMembers()));
- m_sHandler.insert("class/memberdecl/packagestaticmethods",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers()));
- m_sHandler.insert("class/memberdecl/packageattributes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pacAttribs,theTranslator->trPackageAttribs()));
- m_sHandler.insert("class/memberdecl/packagestaticattributes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs()));
- m_sHandler.insert("class/memberdecl/properties",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_properties,theTranslator->trProperties()));
- m_sHandler.insert("class/memberdecl/events",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_events,theTranslator->trEvents()));
- m_sHandler.insert("class/memberdecl/privatetypes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_priTypes,theTranslator->trPrivateTypes()));
- m_sHandler.insert("class/memberdecl/privateslots",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_priSlots,theTranslator->trPrivateSlots()));
- m_sHandler.insert("class/memberdecl/privatemethods",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_priMethods,theTranslator->trPrivateMembers()));
- m_sHandler.insert("class/memberdecl/privatestaticmethods",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers()));
- m_sHandler.insert("class/memberdecl/privateattributes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_priAttribs,theTranslator->trPrivateAttribs()));
- m_sHandler.insert("class/memberdecl/privatestaticattributes",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs()));
- m_sHandler.insert("class/memberdecl/friends",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_friends,theTranslator->trFriends()));
- m_sHandler.insert("class/memberdecl/related",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_related,theTranslator->trRelatedFunctions(),
- theTranslator->trRelatedSubscript()));
- m_eHandler.insert("class/memberdecl",
- new EndElementHandler(this,&LayoutParser::endMemberDecl));
- m_sHandler.insert("class/memberdef",
- new StartElementHandler(this,&LayoutParser::startMemberDef));
- m_sHandler.insert("class/memberdef/inlineclasses",
- new StartElementHandlerSection(this,LayoutDocEntry::ClassInlineClasses,&LayoutParser::startSectionEntry,
- COMPILE_FOR_1_OPTION(
- theTranslator->trClassDocumentation(),
- SrcLangExt_Fortran,theTranslator->trTypeDocumentation()
- )));
- m_sHandler.insert("class/memberdef/typedefs",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation()));
- m_sHandler.insert("class/memberdef/enums",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation()));
- m_sHandler.insert("class/memberdef/services",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_serviceMembers,theTranslator->trInterfaces()));
- m_sHandler.insert("class/memberdef/interfaces",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_interfaceMembers,theTranslator->trInterfaces()));
- m_sHandler.insert("class/memberdef/constructors",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_constructors,theTranslator->trConstructorDocumentation()));
- m_sHandler.insert("class/memberdef/functions",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_functionMembers,
- COMPILE_FOR_3_OPTIONS(
- theTranslator->trMemberFunctionDocumentation(),
- SrcLangExt_ObjC,theTranslator->trMethodDocumentation(),
- SrcLangExt_Fortran,theTranslator->trMemberFunctionDocumentationFortran(),
- SrcLangExt_Slice,theTranslator->trOperationDocumentation()
- )));
- m_sHandler.insert("class/memberdef/related",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation()));
- m_sHandler.insert("class/memberdef/variables",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_variableMembers,
- COMPILE_FOR_1_OPTION(
- theTranslator->trMemberDataDocumentation(),
- SrcLangExt_Slice,theTranslator->trDataMemberDocumentation()
- )));
- m_sHandler.insert("class/memberdef/properties",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_propertyMembers,theTranslator->trPropertyDocumentation()));
- m_sHandler.insert("class/memberdef/events",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_eventMembers,theTranslator->trEventDocumentation()));
- m_eHandler.insert("class/memberdef",
- new EndElementHandler(this,&LayoutParser::endMemberDef));
- m_eHandler.insert("class",
- new EndElementHandler(this,&LayoutParser::endClass));
-
-
- // namespace layout handlers
- m_sHandler.insert("namespace",
- new StartElementHandler(this,&LayoutParser::startNamespace));
- m_sHandler.insert("namespace/briefdescription",
- new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("namespace/detaileddescription",
- new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
- theTranslator->trDetailedDescription()));
- m_sHandler.insert("namespace/authorsection",
- new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("namespace/memberdecl",
- new StartElementHandler(this,&LayoutParser::startMemberDecl));
- m_sHandler.insert("namespace/memberdecl/nestednamespaces",
- new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedNamespaces,&LayoutParser::startSectionEntry,
- COMPILE_FOR_5_OPTIONS(
- theTranslator->trNamespaces(),
- SrcLangExt_Java,theTranslator->trPackages(),
- SrcLangExt_VHDL,theTranslator->trPackages(),
- SrcLangExt_IDL,theTranslator->trModules(),
- SrcLangExt_Fortran,theTranslator->trModules(),
- SrcLangExt_Slice,(sliceOpt ?
- theTranslator->trModules() :
- theTranslator->trNamespaces()))));
- m_sHandler.insert("namespace/memberdecl/constantgroups",
- new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedConstantGroups,&LayoutParser::startSectionEntry,
- theTranslator->trConstantGroups()));
- m_sHandler.insert("namespace/memberdecl/interfaces",
- new StartElementHandlerSection(this,LayoutDocEntry::NamespaceInterfaces,&LayoutParser::startSectionEntry,
- theTranslator->trSliceInterfaces()));
- m_sHandler.insert("namespace/memberdecl/classes",
- new StartElementHandlerSection(this,LayoutDocEntry::NamespaceClasses,&LayoutParser::startSectionEntry,
- COMPILE_FOR_2_OPTIONS(
- theTranslator->trCompounds(),
- SrcLangExt_VHDL,theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
- SrcLangExt_Fortran,theTranslator->trDataTypes()
- )));
- m_sHandler.insert("namespace/memberdecl/structs",
- new StartElementHandlerSection(this,LayoutDocEntry::NamespaceStructs,&LayoutParser::startSectionEntry,
- theTranslator->trStructs()));
- m_sHandler.insert("namespace/memberdecl/exceptions",
- new StartElementHandlerSection(this,LayoutDocEntry::NamespaceExceptions,&LayoutParser::startSectionEntry,
- theTranslator->trExceptions()));
- m_sHandler.insert("namespace/memberdecl/membergroups",
- new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("namespace/memberdecl/typedefs",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decTypedefMembers,theTranslator->trTypedefs()));
- m_sHandler.insert("namespace/memberdecl/sequences",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decSequenceMembers,theTranslator->trSequences()));
- m_sHandler.insert("namespace/memberdecl/dictionaries",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decDictionaryMembers,theTranslator->trDictionaries()));
- m_sHandler.insert("namespace/memberdecl/enums",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decEnumMembers,theTranslator->trEnumerations()));
- m_sHandler.insert("namespace/memberdecl/functions",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decFuncMembers,
- COMPILE_FOR_2_OPTIONS(
- theTranslator->trFunctions(),
- SrcLangExt_Fortran,theTranslator->trSubprograms(),
- SrcLangExt_VHDL,theTranslator->trFunctionAndProc()
- )));
- m_sHandler.insert("namespace/memberdecl/variables",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decVarMembers,
- sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables()));
- m_eHandler.insert("namespace/memberdecl",
- new EndElementHandler(this,&LayoutParser::endMemberDecl));
- m_sHandler.insert("namespace/memberdef",
- new StartElementHandler(this,&LayoutParser::startMemberDef));
- m_sHandler.insert("namespace/memberdef/inlineclasses",
- new StartElementHandlerSection(this,LayoutDocEntry::NamespaceInlineClasses,&LayoutParser::startSectionEntry,
- COMPILE_FOR_1_OPTION(
- theTranslator->trClassDocumentation(),
- SrcLangExt_Fortran,theTranslator->trTypeDocumentation()
- )));
- m_sHandler.insert("namespace/memberdef/typedefs",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()));
- m_sHandler.insert("namespace/memberdef/sequences",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation()));
- m_sHandler.insert("namespace/memberdef/dictionaries",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docDictionaryMembers,
- theTranslator->trDictionaryDocumentation()));
- m_sHandler.insert("namespace/memberdef/enums",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
- m_sHandler.insert("namespace/memberdef/functions",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docFuncMembers,
- COMPILE_FOR_1_OPTION(
- theTranslator->trFunctionDocumentation(),
- SrcLangExt_Fortran,theTranslator->trSubprogramDocumentation()
- )));
- m_sHandler.insert("namespace/memberdef/variables",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docVarMembers,
- sliceOpt ? theTranslator->trConstantDocumentation() :
- theTranslator->trVariableDocumentation()));
- m_eHandler.insert("namespace/memberdef",
- new EndElementHandler(this,&LayoutParser::endMemberDef));
- m_eHandler.insert("namespace",
- new EndElementHandler(this,&LayoutParser::endNamespace));
-
- // file layout handlers
- m_sHandler.insert("file",
- new StartElementHandler(this,&LayoutParser::startFile));
- m_sHandler.insert("file/briefdescription",
- new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("file/detaileddescription",
- new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
- theTranslator->trDetailedDescription()));
- m_sHandler.insert("file/authorsection",
- new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("file/includes",
- new StartElementHandlerKind(this,LayoutDocEntry::FileIncludes,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("file/includegraph",
- new StartElementHandlerKind(this,LayoutDocEntry::FileIncludeGraph,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("file/includedbygraph",
- new StartElementHandlerKind(this,LayoutDocEntry::FileIncludedByGraph,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("file/sourcelink",
- new StartElementHandlerKind(this,LayoutDocEntry::FileSourceLink,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("file/memberdecl/membergroups",
- new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("file/memberdecl",
- new StartElementHandler(this,&LayoutParser::startMemberDecl));
- m_sHandler.insert("file/memberdecl/interfaces",
- new StartElementHandlerSection(this,LayoutDocEntry::FileInterfaces,&LayoutParser::startSectionEntry,
- theTranslator->trSliceInterfaces()));
- m_sHandler.insert("file/memberdecl/classes",
- new StartElementHandlerSection(this,LayoutDocEntry::FileClasses,&LayoutParser::startSectionEntry,
- COMPILE_FOR_2_OPTIONS(
- theTranslator->trCompounds(),
- SrcLangExt_VHDL,theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
- SrcLangExt_Fortran,theTranslator->trDataTypes()
- )));
- m_sHandler.insert("file/memberdecl/structs",
- new StartElementHandlerSection(this,LayoutDocEntry::FileStructs,&LayoutParser::startSectionEntry,
- theTranslator->trStructs()));
- m_sHandler.insert("file/memberdecl/exceptions",
- new StartElementHandlerSection(this,LayoutDocEntry::FileExceptions,&LayoutParser::startSectionEntry,
- theTranslator->trExceptions()));
- m_sHandler.insert("file/memberdecl/namespaces",
- new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry,
- COMPILE_FOR_4_OPTIONS(
- theTranslator->trNamespaces(),
- SrcLangExt_Java,theTranslator->trPackages(),
- SrcLangExt_IDL,theTranslator->trModules(),
- SrcLangExt_Fortran,theTranslator->trModules(),
- SrcLangExt_Slice,theTranslator->trModules()
- )));
- m_sHandler.insert("file/memberdecl/constantgroups",
- new StartElementHandlerSection(this,LayoutDocEntry::FileConstantGroups,&LayoutParser::startSectionEntry,
- theTranslator->trConstantGroups()));
- m_sHandler.insert("file/memberdecl/defines",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decDefineMembers,theTranslator->trDefines()));
- m_sHandler.insert("file/memberdecl/typedefs",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decTypedefMembers,theTranslator->trTypedefs()));
- m_sHandler.insert("file/memberdecl/sequences",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decSequenceMembers,theTranslator->trSequences()));
- m_sHandler.insert("file/memberdecl/dictionaries",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decDictionaryMembers,theTranslator->trDictionaries()));
- m_sHandler.insert("file/memberdecl/enums",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decEnumMembers,theTranslator->trEnumerations()));
- m_sHandler.insert("file/memberdecl/functions",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decFuncMembers,
- COMPILE_FOR_2_OPTIONS(
- theTranslator->trFunctions(),
- SrcLangExt_Fortran,theTranslator->trSubprograms(),
- SrcLangExt_VHDL,theTranslator->trFunctionAndProc()
- )));
- m_sHandler.insert("file/memberdecl/variables",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decVarMembers,
- sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables()));
-
- m_eHandler.insert("file/memberdecl",
- new EndElementHandler(this,&LayoutParser::endMemberDecl));
- m_sHandler.insert("file/memberdef",
- new StartElementHandler(this,&LayoutParser::startMemberDef));
- m_sHandler.insert("file/memberdef/inlineclasses",
- new StartElementHandlerSection(this,LayoutDocEntry::FileInlineClasses,&LayoutParser::startSectionEntry,
- COMPILE_FOR_1_OPTION(
- theTranslator->trClassDocumentation(),
- SrcLangExt_Fortran,theTranslator->trTypeDocumentation()
- )));
- m_sHandler.insert("file/memberdef/defines",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docDefineMembers,theTranslator->trDefineDocumentation()));
- m_sHandler.insert("file/memberdef/typedefs",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()));
- m_sHandler.insert("file/memberdef/sequences",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation()));
- m_sHandler.insert("file/memberdef/dictionaries",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docDictionaryMembers,
- theTranslator->trDictionaryDocumentation()));
- m_sHandler.insert("file/memberdef/enums",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docEnumMembers,
- theTranslator->trEnumerationTypeDocumentation()));
- m_sHandler.insert("file/memberdef/functions",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docFuncMembers,
- COMPILE_FOR_1_OPTION(
- theTranslator->trFunctionDocumentation(),
- SrcLangExt_Fortran,theTranslator->trSubprogramDocumentation()
- )));
- m_sHandler.insert("file/memberdef/variables",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docVarMembers,theTranslator->trVariableDocumentation()));
- m_eHandler.insert("file/memberdef",
- new EndElementHandler(this,&LayoutParser::endMemberDef));
- m_eHandler.insert("file",
- new EndElementHandler(this,&LayoutParser::endFile));
-
- // group layout handlers
- m_sHandler.insert("group",
- new StartElementHandler(this,&LayoutParser::startGroup));
- m_sHandler.insert("group/briefdescription",
- new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("group/detaileddescription",
- new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
- theTranslator->trDetailedDescription()));
- m_sHandler.insert("group/authorsection",
- new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("group/groupgraph",
- new StartElementHandlerKind(this,LayoutDocEntry::GroupGraph,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("group/memberdecl/membergroups",
- new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("group/memberdecl",
- new StartElementHandler(this,&LayoutParser::startMemberDecl));
- m_sHandler.insert("group/memberdecl/classes",
- new StartElementHandlerSection(this,LayoutDocEntry::GroupClasses,&LayoutParser::startSectionEntry,
- COMPILE_FOR_2_OPTIONS(
- theTranslator->trCompounds(),
- SrcLangExt_VHDL,theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
- SrcLangExt_Fortran,theTranslator->trDataTypes()
- )));
- m_sHandler.insert("group/memberdecl/namespaces",
- new StartElementHandlerSection(this,LayoutDocEntry::GroupNamespaces,&LayoutParser::startSectionEntry,
- COMPILE_FOR_2_OPTIONS(
- theTranslator->trNamespaces(),
- SrcLangExt_Java,theTranslator->trPackages(),
- SrcLangExt_Fortran,theTranslator->trModules()
- )));
- m_sHandler.insert("group/memberdecl/dirs",
- new StartElementHandlerSection(this,LayoutDocEntry::GroupDirs,&LayoutParser::startSectionEntry,
- theTranslator->trDirectories()
- ));
- m_sHandler.insert("group/memberdecl/nestedgroups",
- new StartElementHandlerSection(this,LayoutDocEntry::GroupNestedGroups,&LayoutParser::startSectionEntry,
- theTranslator->trModules()
- ));
- m_sHandler.insert("group/memberdecl/files",
- new StartElementHandlerSection(this,LayoutDocEntry::GroupFiles,&LayoutParser::startSectionEntry,
- theTranslator->trFile(TRUE,FALSE)
- ));
-
- m_sHandler.insert("group/memberdecl/defines",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decDefineMembers,theTranslator->trDefines()));
- m_sHandler.insert("group/memberdecl/typedefs",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decTypedefMembers,theTranslator->trTypedefs()));
- m_sHandler.insert("group/memberdecl/sequences",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decSequenceMembers,theTranslator->trSequences()));
- m_sHandler.insert("group/memberdecl/dictionaries",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decDictionaryMembers,theTranslator->trDictionaries()));
- m_sHandler.insert("group/memberdecl/enums",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decEnumMembers,theTranslator->trEnumerations()));
- m_sHandler.insert("group/memberdecl/enumvalues",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decEnumValMembers,theTranslator->trEnumerationValues()));
- m_sHandler.insert("group/memberdecl/functions",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decFuncMembers,
- COMPILE_FOR_2_OPTIONS(
- theTranslator->trFunctions(),
- SrcLangExt_Fortran,theTranslator->trSubprograms(),
- SrcLangExt_VHDL,theTranslator->trFunctionAndProc()
- )));
- m_sHandler.insert("group/memberdecl/variables",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decVarMembers,theTranslator->trVariables()));
- m_sHandler.insert("group/memberdecl/signals",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decSignalMembers,theTranslator->trSignals()));
- m_sHandler.insert("group/memberdecl/publicslots",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decPubSlotMembers,theTranslator->trPublicSlots()));
- m_sHandler.insert("group/memberdecl/protectedslots",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decProSlotMembers,theTranslator->trProtectedSlots()));
- m_sHandler.insert("group/memberdecl/privateslots",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decPriSlotMembers,theTranslator->trPrivateSlots()));
- m_sHandler.insert("group/memberdecl/events",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decEventMembers,theTranslator->trEvents()));
- m_sHandler.insert("group/memberdecl/properties",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decPropMembers,theTranslator->trProperties()));
- m_sHandler.insert("group/memberdecl/friends",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
- MemberListType_decFriendMembers,theTranslator->trFriends()));
- m_eHandler.insert("group/memberdecl",
- new EndElementHandler(this,&LayoutParser::endMemberDecl));
- m_sHandler.insert("group/memberdef",
- new StartElementHandler(this,&LayoutParser::startMemberDef));
- m_sHandler.insert("group/memberdef/pagedocs",
- new StartElementHandlerKind(this,LayoutDocEntry::GroupPageDocs,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("group/memberdef/inlineclasses",
- new StartElementHandlerSection(this,LayoutDocEntry::GroupInlineClasses,&LayoutParser::startSectionEntry,
- COMPILE_FOR_1_OPTION(
- theTranslator->trClassDocumentation(),
- SrcLangExt_Fortran,theTranslator->trTypeDocumentation()
- )));
- m_sHandler.insert("group/memberdef/defines",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docDefineMembers,theTranslator->trDefineDocumentation()));
- m_sHandler.insert("group/memberdef/typedefs",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()));
- m_sHandler.insert("group/memberdef/sequences",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation()));
- m_sHandler.insert("group/memberdef/dictionaries",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docDictionaryMembers,
- theTranslator->trDictionaryDocumentation()));
- m_sHandler.insert("group/memberdef/enums",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
- m_sHandler.insert("group/memberdef/enumvalues",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docEnumValMembers,theTranslator->trEnumerationValueDocumentation()));
- m_sHandler.insert("group/memberdef/functions",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docFuncMembers,
- COMPILE_FOR_1_OPTION(
- theTranslator->trFunctionDocumentation(),
- SrcLangExt_Fortran,theTranslator->trSubprogramDocumentation()
- )));
- m_sHandler.insert("group/memberdef/variables",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docVarMembers,theTranslator->trVariableDocumentation()));
- m_sHandler.insert("group/memberdef/signals",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docSignalMembers,theTranslator->trSignals()));
- m_sHandler.insert("group/memberdef/publicslots",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docPubSlotMembers,theTranslator->trPublicSlots()));
- m_sHandler.insert("group/memberdef/protectedslots",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docProSlotMembers,theTranslator->trProtectedSlots()));
- m_sHandler.insert("group/memberdef/privateslots",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docPriSlotMembers,theTranslator->trPrivateSlots()));
- m_sHandler.insert("group/memberdef/events",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docEventMembers,theTranslator->trEvents()));
- m_sHandler.insert("group/memberdef/properties",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docPropMembers,theTranslator->trProperties()));
- m_sHandler.insert("group/memberdef/friends",
- new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
- MemberListType_docFriendMembers,theTranslator->trFriends()));
- m_eHandler.insert("group/memberdef",
- new EndElementHandler(this,&LayoutParser::endMemberDef));
- m_eHandler.insert("group",
- new EndElementHandler(this,&LayoutParser::endGroup));
-
- // directory layout handlers
- m_sHandler.insert("directory",
- new StartElementHandler(this,&LayoutParser::startDirectory));
- m_sHandler.insert("directory/briefdescription",
- new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("directory/detaileddescription",
- new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
- theTranslator->trDetailedDescription()));
- m_sHandler.insert("directory/directorygraph",
- new StartElementHandlerKind(this,LayoutDocEntry::DirGraph,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("directory/memberdecl",
- new StartElementHandler(this,&LayoutParser::startMemberDecl));
- m_sHandler.insert("directory/memberdecl/dirs",
- new StartElementHandlerKind(this,LayoutDocEntry::DirSubDirs,&LayoutParser::startSimpleEntry));
- m_sHandler.insert("directory/memberdecl/files",
- new StartElementHandlerKind(this,LayoutDocEntry::DirFiles,&LayoutParser::startSimpleEntry));
- m_eHandler.insert("directory/memberdecl",
- new EndElementHandler(this,&LayoutParser::endMemberDecl));
- m_eHandler.insert("directory",
- new EndElementHandler(this,&LayoutParser::endDirectory));
+ ::warn(fileName.c_str(),lineNr,"%s",msg.c_str());
}
+ void startElement( const std::string &name, const XMLHandlers::Attributes& attrib );
+ void endElement( const std::string &name );
- void startSimpleEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib)
+ void startSimpleEntry(LayoutDocEntry::Kind k,const XMLHandlers::Attributes &attrib)
{
bool isVisible = elemIsVisible(attrib);
if (m_part!=-1 && isVisible)
@@ -897,11 +188,13 @@ class LayoutParser : public QXmlDefaultHandler
}
}
- void startSectionEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib,
+ // ============ Specific callbacks
+
+ void startSectionEntry(LayoutDocEntry::Kind k,const XMLHandlers::Attributes &attrib,
const QCString &title)
{
bool isVisible = elemIsVisible(attrib);
- QCString userTitle = attrib.value("title").utf8();
+ QCString userTitle = XMLHandlers::value(attrib,"title");
//printf("startSectionEntry: title='%s' userTitle='%s'\n",
// title.data(),userTitle.data());
if (userTitle.isEmpty()) userTitle = title;
@@ -913,13 +206,13 @@ class LayoutParser : public QXmlDefaultHandler
}
- void startMemberDeclEntry(const QXmlAttributes &attrib,MemberListType type,
+ void startMemberDeclEntry(const XMLHandlers::Attributes &attrib,MemberListType type,
const QCString &title,const QCString &subscript)
{
- //QCString visible = convertToQCString(attrib.value("visible"));
+ //QCString visible = convertToQCString(XMLHandlers::value(attrib,"visible"));
//bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0");
- QCString userTitle = attrib.value("title").utf8();
- QCString userSubscript = attrib.value("subtitle").utf8();
+ QCString userTitle = XMLHandlers::value(attrib,"title");
+ QCString userSubscript = XMLHandlers::value(attrib,"subtitle");
if (userTitle.isEmpty()) userTitle = title;
if (userSubscript.isEmpty()) userSubscript = subscript;
//printf("memberdecl: %s\n",userTitle.data());
@@ -930,10 +223,10 @@ class LayoutParser : public QXmlDefaultHandler
}
}
- void startMemberDefEntry(const QXmlAttributes &attrib,MemberListType type,
+ void startMemberDefEntry(const XMLHandlers::Attributes &attrib,MemberListType type,
const QCString &title,const QCString &)
{
- QCString userTitle = attrib.value("title").utf8();
+ QCString userTitle = XMLHandlers::value(attrib,"title");
if (userTitle.isEmpty()) userTitle = title;
//printf("memberdef: %s\n",userTitle.data());
if (m_part!=-1 /*&& isVisible*/)
@@ -943,15 +236,11 @@ class LayoutParser : public QXmlDefaultHandler
}
}
- void startLayout(const QXmlAttributes &)
- {
- }
-
- void endLayout()
+ void startLayout(const XMLHandlers::Attributes &)
{
}
- void startNavIndex(const QXmlAttributes &)
+ void startNavIndex(const XMLHandlers::Attributes &)
{
m_scope="navindex/";
m_rootNav = LayoutDocManager::instance().rootNavEntry();
@@ -964,18 +253,18 @@ class LayoutParser : public QXmlDefaultHandler
if (m_rootNav && !m_rootNav->find(LayoutNavEntry::MainPage))
{
// no MainPage node... add one as the first item of the root node...
- new LayoutNavEntry(m_rootNav,LayoutNavEntry::MainPage, TRUE,
+ new LayoutNavEntry(m_rootNav,LayoutNavEntry::MainPage, TRUE,
/*Config_getBool(GENERATE_TREEVIEW) ? "main" :*/ "index",
theTranslator->trMainPage(),"",TRUE);
}
}
- void startNavEntry(const QXmlAttributes &attrib)
+ void startNavEntry(const XMLHandlers::Attributes &attrib)
{
static bool javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
- static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
- static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
+ static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
static bool hasGraphicalHierarchy = Config_getBool(HAVE_DOT) &&
Config_getBool(GRAPHICAL_HIERARCHY);
static bool extractAll = Config_getBool(EXTRACT_ALL);
@@ -1203,7 +492,7 @@ class LayoutParser : public QXmlDefaultHandler
LayoutNavEntry::Kind kind;
// find type in the table
int i=0;
- QString type = attrib.value("type");
+ QCString type = XMLHandlers::value(attrib,"type");
while (mapping[i].typeStr)
{
if (mapping[i].typeStr==type)
@@ -1213,24 +502,25 @@ class LayoutParser : public QXmlDefaultHandler
}
i++;
}
- if (mapping[i].typeStr==0)
+ if (mapping[i].typeStr==0)
{
+ std::string fileName = m_locator->fileName();
if (type.isEmpty())
{
- err("an entry tag within a navindex has no type attribute! Check your layout file!\n");
+ ::warn(fileName.c_str(),m_locator->lineNr(),"an entry tag within a navindex has no type attribute! Check your layout file!\n");
}
else
{
- err("the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n",type.data());
+ ::warn(fileName.c_str(),m_locator->lineNr(),"the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n",type.data());
}
m_invalidEntry=TRUE;
return;
}
QCString baseFile = mapping[i].baseFile;
- QCString title = attrib.value("title").utf8();
+ QCString title = XMLHandlers::value(attrib,"title");
bool isVisible = elemIsVisible(attrib);
if (title.isEmpty()) // use default title
- {
+ {
title = mapping[i].mainName; // use title for main row
if (m_rootNav!=LayoutDocManager::instance().rootNavEntry() && !mapping[i].subName.isEmpty())
{
@@ -1238,12 +528,12 @@ class LayoutParser : public QXmlDefaultHandler
// this is mainly done to get compatible naming with older versions.
}
}
- QCString intro = attrib.value("intro").utf8();
+ QCString intro = XMLHandlers::value(attrib,"intro");
if (intro.isEmpty()) // use default intro text
{
intro = mapping[i].intro;
}
- QCString url = attrib.value("url").utf8();
+ QCString url = XMLHandlers::value(attrib,"url");
if (mapping[i].kind==LayoutNavEntry::User && !url.isEmpty())
{
baseFile=url;
@@ -1270,7 +560,7 @@ class LayoutParser : public QXmlDefaultHandler
m_invalidEntry=FALSE;
}
- void startClass(const QXmlAttributes &)
+ void startClass(const XMLHandlers::Attributes &)
{
LayoutDocManager::instance().clear(LayoutDocManager::Class);
m_scope="class/";
@@ -1283,7 +573,7 @@ class LayoutParser : public QXmlDefaultHandler
m_part = -1;
}
- void startNamespace(const QXmlAttributes &)
+ void startNamespace(const XMLHandlers::Attributes &)
{
LayoutDocManager::instance().clear(LayoutDocManager::Namespace);
m_scope="namespace/";
@@ -1296,7 +586,7 @@ class LayoutParser : public QXmlDefaultHandler
m_part = -1;
}
- void startFile(const QXmlAttributes &)
+ void startFile(const XMLHandlers::Attributes &)
{
LayoutDocManager::instance().clear(LayoutDocManager::File);
m_scope="file/";
@@ -1309,7 +599,7 @@ class LayoutParser : public QXmlDefaultHandler
m_part = -1;
}
- void startGroup(const QXmlAttributes &)
+ void startGroup(const XMLHandlers::Attributes &)
{
LayoutDocManager::instance().clear(LayoutDocManager::Group);
m_scope="group/";
@@ -1322,7 +612,7 @@ class LayoutParser : public QXmlDefaultHandler
m_part = -1;
}
- void startDirectory(const QXmlAttributes &)
+ void startDirectory(const XMLHandlers::Attributes &)
{
LayoutDocManager::instance().clear(LayoutDocManager::Directory);
m_scope="directory/";
@@ -1335,7 +625,7 @@ class LayoutParser : public QXmlDefaultHandler
m_part = -1;
}
- void startMemberDef(const QXmlAttributes &)
+ void startMemberDef(const XMLHandlers::Attributes &)
{
m_scope+="memberdef/";
if (m_part!=-1)
@@ -1359,7 +649,7 @@ class LayoutParser : public QXmlDefaultHandler
}
}
- void startMemberDecl(const QXmlAttributes &)
+ void startMemberDecl(const XMLHandlers::Attributes &)
{
m_scope+="memberdecl/";
if (m_part!=-1)
@@ -1383,95 +673,811 @@ class LayoutParser : public QXmlDefaultHandler
}
}
- // reimplemented from QXmlDefaultHandler
- bool startElement( const QString&, const QString&,
- const QString& name, const QXmlAttributes& attrib )
- {
- //printf("startElement [%s]::[%s]\n",m_scope.data(),name.data());
- StartElementHandler *handler = m_sHandler[m_scope+name.utf8()];
- if (handler)
- {
- (*handler)(attrib);
- }
- else
- {
- err("Unexpected start tag '%s' found in scope='%s'!\n",
- name.data(),m_scope.data());
- }
- return TRUE;
- }
- bool endElement( const QString&, const QString&, const QString& name )
- {
- //printf("endElement [%s]::[%s]\n",m_scope.data(),name.data());
- EndElementHandler *handler;
- if (!m_scope.isEmpty() && m_scope.right(name.length()+1)==name.utf8()+"/")
- { // element ends current scope
- handler = m_eHandler[m_scope.left(m_scope.length()-1)];
- }
- else // continue with current scope
- {
- handler = m_eHandler[m_scope+name.utf8()];
- }
- if (handler)
- {
- (*handler)();
- }
- return TRUE;
- }
- bool startDocument()
- {
- return TRUE;
- }
private:
- LayoutParser() : m_sHandler(163), m_eHandler(17), m_invalidEntry(FALSE), m_part(0), m_rootNav(NULL) { }
+ LayoutParser() { }
~LayoutParser() { delete m_rootNav; }
- QDict<StartElementHandler> m_sHandler;
- QDict<EndElementHandler> m_eHandler;
QCString m_scope;
- int m_part;
- LayoutNavEntry *m_rootNav;
- bool m_invalidEntry;
+ int m_part = -1;
+ LayoutNavEntry *m_rootNav = 0;
+ bool m_invalidEntry = false;
static int m_userGroupCount;
+ const XMLLocator *m_locator = nullptr;
};
-int LayoutParser::m_userGroupCount=0;
-
//---------------------------------------------------------------------------------
-class LayoutErrorHandler : public QXmlErrorHandler
+struct ElementCallbacks
{
- public:
- LayoutErrorHandler(const char *fn) : fileName(fn) {}
- bool warning( const QXmlParseException &exception )
- {
- warn_uncond("at line %d column %d of %s: %s\n",
- exception.lineNumber(),exception.columnNumber(),fileName.data(),
- exception.message().data());
- return FALSE;
- }
- bool error( const QXmlParseException &exception )
- {
- err("at line %d column %d of %s: %s\n",
- exception.lineNumber(),exception.columnNumber(),fileName.data(),
- exception.message().data());
- return FALSE;
- }
- bool fatalError( const QXmlParseException &exception )
- {
- err("fatal: at line %d column %d of %s: %s\n",
- exception.lineNumber(),exception.columnNumber(),fileName.data(),
- exception.message().data());
- return FALSE;
- }
- QString errorString() { return ""; }
+ using StartCallback = std::function<void(LayoutParser&,const XMLHandlers::Attributes&)>;
+ using EndCallback = std::function<void(LayoutParser&)>;
+
+ StartCallback startCb;
+ EndCallback endCb;
+};
+
+static ElementCallbacks::StartCallback startCb(void (LayoutParser::*fn)(const XMLHandlers::Attributes &))
+{
+ return [fn](LayoutParser &parser,const XMLHandlers::Attributes &attr) { (parser.*fn)(attr); };
+}
+
+static ElementCallbacks::StartCallback startCb(void (LayoutParser::*fn)(LayoutDocEntry::Kind,const XMLHandlers::Attributes &),LayoutDocEntry::Kind kind)
+{
+ return [fn,kind](LayoutParser &parser,const XMLHandlers::Attributes &attr) { (parser.*fn)(kind,attr); };
+}
+
+static ElementCallbacks::StartCallback startCb(void (LayoutParser::*fn)(LayoutDocEntry::Kind,const XMLHandlers::Attributes &,const QCString &),
+ LayoutDocEntry::Kind kind,
+ std::function<QCString()> title
+ )
+{
+ return [fn,kind,title](LayoutParser &parser,const XMLHandlers::Attributes &attr) { (parser.*fn)(kind,attr,title()); };
+}
+
+static ElementCallbacks::StartCallback startCb(void (LayoutParser::*fn)(const XMLHandlers::Attributes &,MemberListType,const QCString &,const QCString &),
+ MemberListType type,
+ std::function<QCString()> title
+ )
+{
+ return [fn,type,title](LayoutParser &parser,const XMLHandlers::Attributes &attr) { (parser.*fn)(attr,type,title(),QCString()); };
+}
+
+static ElementCallbacks::StartCallback startCb(void (LayoutParser::*fn)(const XMLHandlers::Attributes &,MemberListType,const QCString &,const QCString &),
+ MemberListType type,
+ std::function<QCString()> title,
+ std::function<QCString()> subtitle
+ )
+{
+ return [fn,type,title,subtitle](LayoutParser &parser,const XMLHandlers::Attributes &attr) { (parser.*fn)(attr,type,title(),subtitle()); };
+}
+
+
+static ElementCallbacks::EndCallback endCb(void (LayoutParser::*fn)())
+{
+ return [fn](LayoutParser &parser) { (parser.*fn)(); };
+}
+
+static ElementCallbacks::EndCallback endCb()
+{
+ return [](LayoutParser &){};
+}
+
+static const std::map< std::string, ElementCallbacks > g_elementHandlers =
+{
+ // path/name
+ { "doxygenlayout", { startCb(&LayoutParser::startLayout),
+ endCb()
+ } },
+ { "navindex", { startCb(&LayoutParser::startNavIndex),
+ endCb(&LayoutParser::endNavIndex)
+ } },
+ { "navindex/tab", { startCb(&LayoutParser::startNavEntry),
+ endCb(&LayoutParser::endNavEntry)
+ } },
+
+ // class layout handlers
+ { "class", { startCb(&LayoutParser::startClass),
+ endCb(&LayoutParser::endClass)
+ } },
+ { "class/briefdescription", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::BriefDesc),
+ endCb()
+ } },
+ { "class/detaileddescription", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::DetailedDesc,
+ [](){ return compileOptions(theTranslator->trDetailedDescription()); }),
+ endCb()
+ } },
+ { "class/authorsection", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::AuthorSection),
+ endCb()
+ } },
+ { "class/includes", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassIncludes),
+ endCb()
+ } },
+ { "class/inheritancegraph", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassInheritanceGraph),
+ endCb()
+ } },
+ { "class/collaborationgraph", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassCollaborationGraph),
+ endCb()
+ } },
+ { "class/allmemberslink", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassAllMembersLink),
+ endCb()
+ } },
+ { "class/usedfiles", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::ClassUsedFiles),
+ endCb()
+ } },
+ { "class/memberdecl", { startCb(&LayoutParser::startMemberDecl),
+ endCb(&LayoutParser::endMemberDecl)
+ } },
+ { "class/memberdecl/membergroups", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::MemberGroups),
+ endCb()
+ } },
+ { "class/memberdecl/nestedclasses", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::ClassNestedClasses,
+ []() { return compileOptions(/*default*/ theTranslator->trCompounds(),
+ SrcLangExt_VHDL, theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
+ SrcLangExt_Fortran,theTranslator->trDataTypes()); }),
+ endCb()
+ } },
+ { "class/memberdecl/services", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType_services,
+ []() { return compileOptions(theTranslator->trServices()); }),
+ endCb()
+ } },
+ { "class/memberdecl/interfaces", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType_interfaces,
+ []() { return compileOptions(theTranslator->trInterfaces()); }),
+ endCb()
+ } },
+ { "class/memberdecl/publictypes", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType_pubTypes,
+ []() { return compileOptions(theTranslator->trPublicTypes()); }),
+ endCb()
+ } },
+ { "class/memberdecl/publicslots", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType_pubSlots,
+ []() { return compileOptions(theTranslator->trPublicSlots()); }),
+ endCb()
+ } },
+ { "class/memberdecl/signals", { startCb(&LayoutParser::startMemberDeclEntry,MemberListType_signals,
+ []() { return compileOptions(theTranslator->trSignals()); }),
+ endCb()
+ } },
+ { "class/memberdecl/publicmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_pubMethods,
+ []() { return compileOptions(/* default */ theTranslator->trPublicMembers(),
+ SrcLangExt_ObjC, theTranslator->trInstanceMethods(),
+ SrcLangExt_Slice,theTranslator->trOperations()); }),
+ endCb()
+ } },
+ { "class/memberdecl/publicstaticmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_pubStaticMethods,
+ []() { return compileOptions(/* default */ theTranslator->trStaticPublicMembers(),
+ SrcLangExt_ObjC, theTranslator->trClassMethods()); }),
+ endCb()
+ } },
+ { "class/memberdecl/publicattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_pubAttribs,
+ []() { return compileOptions(/* default */ theTranslator->trPublicAttribs(),
+ SrcLangExt_Slice,theTranslator->trDataMembers()); }),
+ endCb()
+ } },
+ { "class/memberdecl/publicstaticattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_pubStaticAttribs,
+ []() { return compileOptions(theTranslator->trStaticPublicAttribs()); }),
+ endCb()
+ } },
+ { "class/memberdecl/protectedtypes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_proTypes,
+ []() { return compileOptions(theTranslator->trProtectedTypes()); }),
+ endCb()
+ } },
+ { "class/memberdecl/protectedslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_proSlots,
+ []() { return compileOptions(theTranslator->trProtectedSlots()); }),
+ endCb()
+ } },
+ { "class/memberdecl/protectedmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_proMethods,
+ []() { return compileOptions(theTranslator->trProtectedMembers()); }),
+ endCb()
+ } },
+ { "class/memberdecl/protectedstaticmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_proStaticMethods,
+ []() { return compileOptions(theTranslator->trStaticProtectedMembers()); }),
+ endCb()
+ } },
+ { "class/memberdecl/protectedattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_proAttribs,
+ []() { return compileOptions(theTranslator->trProtectedAttribs()); }),
+ endCb()
+ } },
+ { "class/memberdecl/protectedstaticattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_proStaticAttribs,
+ []() { return compileOptions(theTranslator->trStaticProtectedAttribs()); }),
+ endCb()
+ } },
+ { "class/memberdecl/packagetypes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_pacTypes,
+ []() { return compileOptions(theTranslator->trPackageTypes()); }),
+ endCb()
+ } },
+ { "class/memberdecl/packagemethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_pacMethods,
+ []() { return compileOptions(theTranslator->trPackageMembers()); }),
+ endCb()
+ } },
+ { "class/memberdecl/packagestaticmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_pacStaticMethods,
+ []() { return compileOptions(theTranslator->trStaticPackageMembers()); }),
+ endCb()
+ } },
+ { "class/memberdecl/packageattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_pacAttribs,
+ []() { return compileOptions(theTranslator->trPackageAttribs()); }),
+ endCb()
+ } },
+ { "class/memberdecl/packagestaticattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_pacStaticAttribs,
+ []() { return compileOptions(theTranslator->trStaticPackageAttribs()); }),
+ endCb()
+ } },
+ { "class/memberdecl/properties", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_properties,
+ []() { return compileOptions(theTranslator->trProperties()); }),
+ endCb()
+ } },
+ { "class/memberdecl/events", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_events,
+ []() { return compileOptions(theTranslator->trEvents()); }),
+ endCb()
+ } },
+ { "class/memberdecl/privatetypes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_priTypes,
+ []() { return compileOptions(theTranslator->trPrivateTypes()); }),
+ endCb()
+ } },
+ { "class/memberdecl/privateslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_priSlots,
+ []() { return compileOptions(theTranslator->trPrivateSlots()); }),
+ endCb()
+ } },
+ { "class/memberdecl/privatemethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_priMethods,
+ []() { return compileOptions(theTranslator->trPrivateMembers()); }),
+ endCb()
+ } },
+ { "class/memberdecl/privatestaticmethods", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_priStaticMethods,
+ []() { return compileOptions(theTranslator->trStaticPrivateMembers()); }),
+ endCb()
+ } },
+ { "class/memberdecl/privateattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_priAttribs,
+ []() { return compileOptions(theTranslator->trPrivateAttribs()); }),
+ endCb()
+ } },
+ { "class/memberdecl/privatestaticattributes", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_priStaticAttribs,
+ []() { return compileOptions(theTranslator->trStaticPrivateAttribs()); }),
+ endCb()
+ } },
+ { "class/memberdecl/friends", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_friends,
+ []() { return compileOptions(theTranslator->trFriends()); }),
+ endCb()
+ } },
+ { "class/memberdecl/related", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_related,
+ []() { return compileOptions(theTranslator->trRelatedFunctions()); },
+ []() { return compileOptions(theTranslator->trRelatedSubscript()); }),
+ endCb()
+ } },
+ { "class/memberdef", { startCb(&LayoutParser::startMemberDef),
+ endCb(&LayoutParser::endMemberDef)
+ } },
+ { "class/memberdef/inlineclasses", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::ClassInlineClasses,
+ []() { return compileOptions(/* default */ theTranslator->trClassDocumentation(),
+ SrcLangExt_Fortran,theTranslator->trTypeDocumentation()); }),
+ endCb()
+ } },
+ { "class/memberdef/typedefs", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_typedefMembers,
+ []() { return compileOptions(theTranslator->trMemberTypedefDocumentation()); }),
+ endCb()
+ } },
+ { "class/memberdef/enums", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_enumMembers,
+ []() { return compileOptions(theTranslator->trMemberEnumerationDocumentation()); }),
+ endCb()
+ } },
+ { "class/memberdef/services", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_serviceMembers,
+ []() { return compileOptions(theTranslator->trInterfaces()); }),
+ endCb()
+ } },
+ { "class/memberdef/interfaces", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_interfaceMembers,
+ []() { return compileOptions(theTranslator->trInterfaces()); }),
+ endCb()
+ } },
+ { "class/memberdef/constructors", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_constructors,
+ []() { return compileOptions(theTranslator->trConstructorDocumentation()); }),
+ endCb()
+ } },
+ { "class/memberdef/functions", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_functionMembers,
+ []() { return compileOptions(/* default */ theTranslator->trMemberFunctionDocumentation(), SrcLangExt_ObjC, theTranslator->trMethodDocumentation(),
+ SrcLangExt_Fortran,theTranslator->trMemberFunctionDocumentationFortran(),
+ SrcLangExt_Slice, theTranslator->trOperationDocumentation()); }),
+ endCb()
+ } },
+ { "class/memberdef/related", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_relatedMembers,
+ []() { return compileOptions(theTranslator->trRelatedFunctionDocumentation()); }),
+ endCb()
+ } },
+ { "class/memberdef/variables", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_variableMembers,
+ []() { return compileOptions(/* default */ theTranslator->trMemberDataDocumentation(),
+ SrcLangExt_Slice, theTranslator->trDataMemberDocumentation()); }),
+ endCb()
+ } },
+ { "class/memberdef/properties", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_propertyMembers,
+ []() { return compileOptions(theTranslator->trPropertyDocumentation()); }),
+ endCb()
+ } },
+ { "class/memberdef/events", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_eventMembers,
+ []() { return compileOptions(theTranslator->trEventDocumentation()); }),
+ endCb()
+ } },
+
+ // namespace layout handlers
+ { "namespace", { startCb(&LayoutParser::startNamespace),
+ endCb(&LayoutParser::endNamespace)
+ } },
+
+ { "namespace/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc),
+ endCb()
+ } },
+ { "namespace/detaileddescription", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::DetailedDesc,
+ []() { return compileOptions(theTranslator->trDetailedDescription()); }),
+ endCb()
+ } },
+ { "namespace/authorsection", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::AuthorSection),
+ endCb()
+ } },
+ { "namespace/memberdecl", { startCb(&LayoutParser::startMemberDecl),
+ endCb(&LayoutParser::endMemberDecl)
+ } },
+ { "namespace/memberdecl/nestednamespaces", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::NamespaceNestedNamespaces,
+ []() { return compileOptions(/* default */ theTranslator->trNamespaces(),
+ SrcLangExt_Java, theTranslator->trPackages(),
+ SrcLangExt_VHDL, theTranslator->trPackages(),
+ SrcLangExt_IDL, theTranslator->trModules(),
+ SrcLangExt_Fortran,theTranslator->trModules(),
+ SrcLangExt_Slice,(Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
+ theTranslator->trModules() :
+ theTranslator->trNamespaces())); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/constantgroups", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::NamespaceNestedConstantGroups,
+ []() { return compileOptions(theTranslator->trConstantGroups()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/interfaces", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::NamespaceInterfaces,
+ []() { return compileOptions(theTranslator->trSliceInterfaces()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/classes", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::NamespaceClasses,
+ []() { return compileOptions(/* default */ theTranslator->trCompounds(),
+ SrcLangExt_VHDL, theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
+ SrcLangExt_Fortran,theTranslator->trDataTypes()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/structs", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::NamespaceStructs,
+ []() { return compileOptions(theTranslator->trStructs()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/exceptions", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::NamespaceExceptions,
+ []() { return compileOptions(theTranslator->trExceptions()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/membergroups", { startCb(&LayoutParser::startSimpleEntry,LayoutDocEntry::MemberGroups),
+ endCb()
+ } },
+ { "namespace/memberdecl/typedefs", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decTypedefMembers,
+ []() { return compileOptions(theTranslator->trTypedefs()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/sequences", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decSequenceMembers,
+ []() { return compileOptions(theTranslator->trSequences()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/dictionaries", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decDictionaryMembers,
+ []() { return compileOptions(theTranslator->trDictionaries()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/enums", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decEnumMembers,
+ []() { return compileOptions(theTranslator->trEnumerations()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/functions", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decFuncMembers,
+ []() { return compileOptions(/* default */ theTranslator->trFunctions(),
+ SrcLangExt_Fortran,theTranslator->trSubprograms(),
+ SrcLangExt_VHDL, theTranslator->trFunctionAndProc()); }),
+ endCb()
+ } },
+ { "namespace/memberdecl/variables", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decVarMembers,
+ []() { return compileOptions(Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
+ theTranslator->trConstants() :
+ theTranslator->trVariables()); }),
+ endCb()
+ } },
+ { "namespace/memberdef", { startCb(&LayoutParser::startMemberDef),
+ endCb(&LayoutParser::endMemberDef)
+ } },
+ { "namespace/memberdef/inlineclasses", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::NamespaceInlineClasses,
+ []() { return compileOptions(/* default */ theTranslator->trClassDocumentation(),
+ SrcLangExt_Fortran,theTranslator->trTypeDocumentation()); }),
+ endCb()
+ } },
+ { "namespace/memberdef/typedefs", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docTypedefMembers,
+ []() { return compileOptions(theTranslator->trTypedefDocumentation()); }),
+ endCb()
+ } },
+ { "namespace/memberdef/sequences", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docSequenceMembers,
+ []() { return compileOptions(theTranslator->trSequenceDocumentation()); }),
+ endCb()
+ } },
+ { "namespace/memberdef/dictionaries", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docDictionaryMembers,
+ []() { return compileOptions(theTranslator->trDictionaryDocumentation()); }),
+ endCb()
+ } },
+ { "namespace/memberdef/enums", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docEnumMembers,
+ []() { return compileOptions(theTranslator->trEnumerationTypeDocumentation()); }),
+ endCb()
+ } },
+ { "namespace/memberdef/functions", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docFuncMembers,
+ []() { return compileOptions(/* default */ theTranslator->trFunctionDocumentation(),
+ SrcLangExt_Fortran,theTranslator->trSubprogramDocumentation()); }),
+ endCb()
+ } },
+ { "namespace/memberdef/variables", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docVarMembers,
+ []() { return compileOptions(Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
+ theTranslator->trConstantDocumentation() :
+ theTranslator->trVariableDocumentation()); }),
+ endCb()
+ } },
+
+ // file layout handlers
+ { "file", { startCb(&LayoutParser::startFile),
+ endCb(&LayoutParser::endFile)
+ } },
+
+ { "file/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc),
+ endCb()
+ } },
+ { "file/detaileddescription", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::DetailedDesc,
+ []() { return compileOptions(theTranslator->trDetailedDescription()); }),
+ endCb()
+ } },
+ { "file/authorsection", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::AuthorSection),
+ endCb()
+ } },
+ { "file/includes", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::FileIncludes),
+ endCb()
+ } },
+ { "file/includegraph", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::FileIncludeGraph),
+ endCb()
+ } },
+ { "file/includedbygraph", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::FileIncludedByGraph),
+ endCb()
+ } },
+ { "file/sourcelink", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::FileSourceLink),
+ endCb()
+ } },
+ { "file/memberdecl/membergroups", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::MemberGroups),
+ endCb()
+ } },
+ { "file/memberdecl", { startCb(&LayoutParser::startMemberDecl),
+ endCb(&LayoutParser::endMemberDecl)
+ } },
+
+ { "file/memberdecl/interfaces", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileInterfaces,
+ []() { return compileOptions(theTranslator->trSliceInterfaces()); }),
+ endCb()
+ } },
+ { "file/memberdecl/classes", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileClasses,
+ []() { return compileOptions(/* default */ theTranslator->trCompounds(),
+ SrcLangExt_VHDL, theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
+ SrcLangExt_Fortran,theTranslator->trDataTypes()); }),
+ endCb()
+ } },
+ { "file/memberdecl/structs", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileStructs,
+ []() { return compileOptions(theTranslator->trStructs()); }),
+ endCb()
+ } },
+ { "file/memberdecl/exceptions", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileExceptions,
+ []() { return compileOptions(theTranslator->trExceptions()); }),
+ endCb()
+ } },
+ { "file/memberdecl/namespaces", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileNamespaces,
+ []() { return compileOptions(/* default */ theTranslator->trNamespaces(),
+ SrcLangExt_Java, theTranslator->trPackages(),
+ SrcLangExt_IDL, theTranslator->trModules(),
+ SrcLangExt_Fortran,theTranslator->trModules(),
+ SrcLangExt_Slice, theTranslator->trModules()); }),
+ endCb()
+ } },
+ { "file/memberdecl/constantgroups", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileConstantGroups,
+ []() { return compileOptions(theTranslator->trConstantGroups()); }),
+ endCb()
+ } },
+ { "file/memberdecl/defines", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decDefineMembers,
+ []() { return compileOptions(theTranslator->trDefines()); }),
+ endCb()
+ } },
+ { "file/memberdecl/typedefs", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decTypedefMembers,
+ []() { return compileOptions(theTranslator->trTypedefs()); }),
+ endCb()
+ } },
+ { "file/memberdecl/sequences", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decSequenceMembers,
+ []() { return compileOptions(theTranslator->trSequences()); }),
+ endCb()
+ } },
+ { "file/memberdecl/dictionaries", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decDictionaryMembers,
+ []() { return compileOptions(theTranslator->trDictionaries()); }),
+ endCb()
+ } },
+ { "file/memberdecl/enums", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decEnumMembers,
+ []() { return compileOptions(theTranslator->trEnumerations()); }),
+ endCb()
+ } },
+ { "file/memberdecl/functions", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decFuncMembers,
+ []() { return compileOptions(/* default */ theTranslator->trFunctions(),
+ SrcLangExt_Fortran,theTranslator->trSubprograms(),
+ SrcLangExt_VHDL, theTranslator->trFunctionAndProc()); }),
+ endCb()
+ } },
+ { "file/memberdecl/variables", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decVarMembers,
+ []() { return compileOptions(Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
+ theTranslator->trConstants() :
+ theTranslator->trVariables()); }),
+ endCb()
+ } },
+ { "file/memberdef", { startCb(&LayoutParser::startMemberDef),
+ endCb(&LayoutParser::endMemberDef)
+ } },
+
+ { "file/memberdef/inlineclasses", { startCb(&LayoutParser::startSectionEntry,LayoutDocEntry::FileInlineClasses,
+ []() { return compileOptions(/* default */ theTranslator->trClassDocumentation(),
+ SrcLangExt_Fortran, theTranslator->trTypeDocumentation()); }),
+ endCb()
+ } },
+ { "file/memberdef/defines", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docDefineMembers,
+ []() { return compileOptions(theTranslator->trDefineDocumentation()); }),
+ endCb()
+ } },
+ { "file/memberdef/typedefs", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docTypedefMembers,
+ []() { return compileOptions(theTranslator->trTypedefDocumentation()); }),
+ endCb()
+ } },
+ { "file/memberdef/sequences", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docSequenceMembers,
+ []() { return compileOptions(theTranslator->trSequenceDocumentation()); }),
+ endCb()
+ } },
+ { "file/memberdef/dictionaries", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docDictionaryMembers,
+ []() { return compileOptions(theTranslator->trDictionaryDocumentation()); }),
+ endCb()
+ } },
+ { "file/memberdef/enums", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docEnumMembers,
+ []() { return compileOptions(theTranslator->trEnumerationTypeDocumentation()); }),
+ endCb()
+ } },
+ { "file/memberdef/functions", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docFuncMembers,
+ []() { return compileOptions(/* default */ theTranslator->trFunctionDocumentation(),
+ SrcLangExt_Fortran, theTranslator->trSubprogramDocumentation()); }),
+ endCb()
+ } },
+ { "file/memberdef/variables", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docVarMembers,
+ []() { return compileOptions(theTranslator->trVariableDocumentation()); }),
+ endCb()
+ } },
+
+ // group layout handlers
+ { "group", { startCb(&LayoutParser::startGroup),
+ endCb(&LayoutParser::endGroup)
+ } },
+ { "group/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc),
+ endCb()
+ } },
+ { "group/detaileddescription", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::DetailedDesc,
+ []() { return compileOptions(theTranslator->trDetailedDescription()); }),
+ endCb()
+ } },
+ { "group/authorsection", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::AuthorSection),
+ endCb()
+ } },
+ { "group/groupgraph", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::GroupGraph),
+ endCb()
+ } },
+ { "group/memberdecl/membergroups", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::MemberGroups),
+ endCb()
+ } },
+
+ { "group/memberdecl", { startCb(&LayoutParser::startMemberDecl),
+ endCb(&LayoutParser::endMemberDecl)
+ } },
+
+ { "group/memberdecl/classes", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupClasses,
+ []() { return compileOptions(/* default */ theTranslator->trCompounds(),
+ SrcLangExt_VHDL, theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE),
+ SrcLangExt_Fortran, theTranslator->trDataTypes()); }),
+ endCb()
+ } },
+ { "group/memberdecl/namespaces", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupNamespaces,
+ []() { return compileOptions(/* default */ theTranslator->trNamespaces(),
+ SrcLangExt_Java, theTranslator->trPackages(),
+ SrcLangExt_Fortran, theTranslator->trModules()); }),
+ endCb()
+ } },
+ { "group/memberdecl/dirs", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupDirs,
+ []() { return compileOptions(theTranslator->trDirectories()); }),
+ endCb()
+ } },
+ { "group/memberdecl/nestedgroups", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupNestedGroups,
+ []() { return compileOptions(theTranslator->trModules()); }),
+ endCb()
+ } },
+ { "group/memberdecl/files", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupFiles,
+ []() { return compileOptions(theTranslator->trFile(TRUE,FALSE)); }),
+ endCb()
+ } },
+ { "group/memberdecl/defines", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decDefineMembers,
+ []() { return compileOptions(theTranslator->trDefines()); }),
+ endCb()
+ } },
+ { "group/memberdecl/typedefs", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decTypedefMembers,
+ []() { return compileOptions(theTranslator->trTypedefs()); }),
+ endCb()
+ } },
+ { "group/memberdecl/sequences", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decSequenceMembers,
+ []() { return compileOptions(theTranslator->trSequences()); }),
+ endCb()
+ } },
+ { "group/memberdecl/dictionaries", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decDictionaryMembers,
+ []() { return compileOptions(theTranslator->trDictionaries()); }),
+ endCb()
+ } },
+ { "group/memberdecl/enums", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decEnumMembers,
+ []() { return compileOptions(theTranslator->trEnumerations()); }),
+ endCb()
+ } },
+ { "group/memberdecl/enumvalues", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decEnumValMembers,
+ []() { return compileOptions(theTranslator->trEnumerationValues()); }),
+ endCb()
+ } },
+ { "group/memberdecl/functions", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decFuncMembers,
+ []() { return compileOptions(/* default */ theTranslator->trFunctions(),
+ SrcLangExt_Fortran,theTranslator->trSubprograms(),
+ SrcLangExt_VHDL, theTranslator->trFunctionAndProc()); }),
+ endCb()
+ } },
+ { "group/memberdecl/variables", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decVarMembers,
+ []() { return compileOptions(theTranslator->trVariables()); }),
+ endCb()
+ } },
+ { "group/memberdecl/signals", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decSignalMembers,
+ []() { return compileOptions(theTranslator->trSignals()); }),
+ endCb()
+ } },
+ { "group/memberdecl/publicslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decPubSlotMembers,
+ []() { return compileOptions(theTranslator->trPublicSlots()); }),
+ endCb()
+ } },
+ { "group/memberdecl/protectedslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decProSlotMembers,
+ []() { return compileOptions(theTranslator->trProtectedSlots()); }),
+ endCb()
+ } },
+ { "group/memberdecl/privateslots", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decPriSlotMembers,
+ []() { return compileOptions(theTranslator->trPrivateSlots()); }),
+ endCb()
+ } },
+ { "group/memberdecl/events", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decEventMembers,
+ []() { return compileOptions(theTranslator->trEvents()); }),
+ endCb()
+ } },
+ { "group/memberdecl/properties", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decPropMembers,
+ []() { return compileOptions(theTranslator->trProperties()); }),
+ endCb()
+ } },
+ { "group/memberdecl/friends", { startCb(&LayoutParser::startMemberDeclEntry, MemberListType_decFriendMembers,
+ []() { return compileOptions(theTranslator->trFriends()); }),
+ endCb()
+ } },
+ { "group/memberdef", { startCb(&LayoutParser::startMemberDef),
+ endCb(&LayoutParser::endMemberDef)
+ } },
+
+ { "group/memberdef/pagedocs", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::GroupPageDocs),
+ endCb()
+ } },
+ { "group/memberdef/inlineclasses", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::GroupInlineClasses,
+ []() { return compileOptions(/* default */ theTranslator->trClassDocumentation(),
+ SrcLangExt_Fortran,theTranslator->trTypeDocumentation()); }),
+ endCb()
+ } },
+ { "group/memberdef/defines", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docDefineMembers,
+ []() { return compileOptions(theTranslator->trDefineDocumentation()); }),
+ endCb()
+ } },
+ { "group/memberdef/typedefs", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docTypedefMembers,
+ []() { return compileOptions(theTranslator->trTypedefDocumentation()); }),
+ endCb()
+ } },
+ { "group/memberdef/sequences", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docSequenceMembers,
+ []() { return compileOptions(theTranslator->trSequenceDocumentation()); }),
+ endCb()
+ } },
+ { "group/memberdef/dictionaries", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docDictionaryMembers,
+ []() { return compileOptions(theTranslator->trDictionaryDocumentation()); }),
+ endCb()
+ } },
+ { "group/memberdef/enums", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docEnumMembers,
+ []() { return compileOptions(theTranslator->trEnumerationTypeDocumentation()); }),
+ endCb()
+ } },
+ { "group/memberdef/enumvalues", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docEnumValMembers,
+ []() { return compileOptions(theTranslator->trEnumerationValueDocumentation()); }),
+ endCb()
+ } },
+ { "group/memberdef/functions", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docFuncMembers,
+ []() { return compileOptions(/* default */ theTranslator->trFunctionDocumentation(),
+ SrcLangExt_Fortran,theTranslator->trSubprogramDocumentation()); }),
+ endCb()
+ } },
+ { "group/memberdef/variables", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docVarMembers,
+ []() { return compileOptions(theTranslator->trVariableDocumentation()); }),
+ endCb()
+ } },
+ { "group/memberdef/signals", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docSignalMembers,
+ []() { return compileOptions(theTranslator->trSignals()); }),
+ endCb()
+ } },
+ { "group/memberdef/publicslots", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docPubSlotMembers,
+ []() { return compileOptions(theTranslator->trPublicSlots()); }),
+ endCb()
+ } },
+ { "group/memberdef/protectedslots", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docProSlotMembers,
+ []() { return compileOptions(theTranslator->trProtectedSlots()); }),
+ endCb()
+ } },
+ { "group/memberdef/privateslots", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docPriSlotMembers,
+ []() { return compileOptions(theTranslator->trPrivateSlots()); }),
+ endCb()
+ } },
+ { "group/memberdef/events", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docEventMembers,
+ []() { return compileOptions(theTranslator->trEvents()); }),
+ endCb()
+ } },
+ { "group/memberdef/properties", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docPropMembers,
+ []() { return compileOptions(theTranslator->trProperties()); }),
+ endCb()
+ } }, { "group/memberdef/friends", { startCb(&LayoutParser::startMemberDefEntry, MemberListType_docFriendMembers,
+ []() { return compileOptions(theTranslator->trFriends()); }),
+ endCb()
+ } },
+
+ // directory layout handlers
+ { "directory", { startCb(&LayoutParser::startDirectory),
+ endCb(&LayoutParser::endDirectory)
+ } },
+
+ { "directory/briefdescription", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::BriefDesc),
+ endCb()
+ } },
+ { "directory/detaileddescription", { startCb(&LayoutParser::startSectionEntry, LayoutDocEntry::DetailedDesc,
+ []() { return compileOptions(theTranslator->trDetailedDescription()); }),
+ endCb()
+ } },
+ { "directory/directorygraph", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::DirGraph),
+ endCb()
+ } },
+ { "directory/memberdecl", { startCb(&LayoutParser::startMemberDecl),
+ endCb(&LayoutParser::endMemberDecl)
+ } },
+
+ { "directory/memberdecl/dirs", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::DirSubDirs),
+ endCb()
+ } },
+ { "directory/memberdecl/files", { startCb(&LayoutParser::startSimpleEntry, LayoutDocEntry::DirFiles),
+ endCb()
+ } },
- private:
- QString errorMsg;
- QString fileName;
};
+void LayoutParser::startElement( const std::string &name, const XMLHandlers::Attributes& attrib )
+{
+ //printf("startElement [%s]::[%s]\n",m_scope.data(),name.data());
+ auto it = g_elementHandlers.find(m_scope.str()+name);
+ if (it!=g_elementHandlers.end())
+ {
+ it->second.startCb(*this,attrib);
+ }
+ else
+ {
+ std::string fileName = m_locator->fileName();
+ ::warn(fileName.c_str(),m_locator->lineNr(),"Unexpected start tag '%s' found in scope='%s'!\n",
+ name.data(),m_scope.data());
+ }
+}
+
+void LayoutParser::endElement( const std::string &name )
+{
+ //printf("endElement [%s]::[%s]\n",m_scope.data(),name.data());
+ auto it=g_elementHandlers.end();
+
+ if (!m_scope.isEmpty() && m_scope.right(static_cast<uint>(name.length())+1)==name+"/")
+ { // element ends current scope
+ it = g_elementHandlers.find(m_scope.left(m_scope.length()-1).str());
+ }
+ else // continue with current scope
+ {
+ it = g_elementHandlers.find(m_scope.str()+name);
+ }
+ if (it!=g_elementHandlers.end())
+ {
+ it->second.endCb(*this);
+ }
+}
+
+//---------------------------------------------------------------------------------
+
+int LayoutParser::m_userGroupCount=0;
+
//---------------------------------------------------------------------------------
class LayoutDocManager::Private
@@ -1481,35 +1487,33 @@ class LayoutDocManager::Private
LayoutNavEntry *rootNav;
};
-LayoutDocManager::LayoutDocManager()
+LayoutDocManager::LayoutDocManager() : d(std::make_unique<Private>())
{
- d = new Private;
int i;
for (i=0;i<LayoutDocManager::NrParts;i++)
{
d->docEntries[i].setAutoDelete(TRUE);
}
d->rootNav = new LayoutNavEntry;
- LayoutParser::instance().init();
}
void LayoutDocManager::init()
{
- // parse the default layout
- LayoutErrorHandler errorHandler( "layout_default.xml" );
- QXmlInputSource source;
- source.setData( layout_default );
- QXmlSimpleReader reader;
- reader.setContentHandler( &LayoutParser::instance() );
- reader.setErrorHandler( &errorHandler );
- reader.parse( source );
+ LayoutParser &layoutParser = LayoutParser::instance();
+ XMLHandlers handlers;
+ handlers.startElement = [&layoutParser](const std::string &name,const XMLHandlers::Attributes &attrs) { layoutParser.startElement(name,attrs); };
+ handlers.endElement = [&layoutParser](const std::string &name) { layoutParser.endElement(name); };
+ handlers.error = [&layoutParser](const std::string &fileName,int lineNr,const std::string &msg) { layoutParser.error(fileName,lineNr,msg); };
+ XMLParser parser(handlers);
+ layoutParser.setDocumentLocator(&parser);
+ QCString layout_default = ResourceMgr::instance().getAsString("layout_default.xml");
+ parser.parse("layout_default.xml",layout_default);
}
LayoutDocManager::~LayoutDocManager()
{
delete d->rootNav;
- delete d;
}
LayoutDocManager & LayoutDocManager::instance()
@@ -1540,13 +1544,14 @@ void LayoutDocManager::clear(LayoutDocManager::LayoutPart p)
void LayoutDocManager::parse(const char *fileName)
{
- LayoutErrorHandler errorHandler(fileName);
- QXmlInputSource source;
- source.setData(fileToString(fileName));
- QXmlSimpleReader reader;
- reader.setContentHandler( &LayoutParser::instance() );
- reader.setErrorHandler( &errorHandler );
- reader.parse( source );
+ LayoutParser &layoutParser = LayoutParser::instance();
+ XMLHandlers handlers;
+ handlers.startElement = [&layoutParser](const std::string &name,const XMLHandlers::Attributes &attrs) { layoutParser.startElement(name,attrs); };
+ handlers.endElement = [&layoutParser](const std::string &name) { layoutParser.endElement(name); };
+ handlers.error = [&layoutParser](const std::string &fn,int lineNr,const std::string &msg) { layoutParser.error(fn,lineNr,msg); };
+ XMLParser parser(handlers);
+ layoutParser.setDocumentLocator(&parser);
+ parser.parse(fileName,fileToString(fileName));
}
//---------------------------------------------------------------------------------
@@ -1560,15 +1565,15 @@ void writeDefaultLayoutFile(const char *fileName)
err("Failed to open file %s for writing!\n",fileName);
return;
}
- QTextStream t(&f);
- t.setEncoding(QTextStream::UnicodeUTF8);
- t << substitute(layout_default,"$doxygenversion",getVersion());
+ FTextStream t(&f);
+ QCString layout_default = ResourceMgr::instance().getAsString("layout_default.xml");
+ t << substitute(layout_default,"$doxygenversion",getDoxygenVersion());
}
//----------------------------------------------------------------------------------
// Convert input to a title.
-// The format of input can be a simple title "A title" or in case there are different
+// The format of input can be a simple title "A title" or in case there are different
// titles for some programming languages they can take the following form:
// "A title|16=Another title|8=Yet Another title"
// where the number is a value of SrcLangExt in decimal notation (i.e. 16=Java, 8=IDL).
diff --git a/src/layout.h b/src/layout.h
index b1facf5..68d5c6e 100644
--- a/src/layout.h
+++ b/src/layout.h
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,6 +19,7 @@
#ifndef LAYOUT_H
#define LAYOUT_H
+#include <memory>
#include <qlist.h>
#include "types.h"
@@ -30,14 +31,14 @@ class QTextStream;
struct LayoutDocEntry
{
virtual ~LayoutDocEntry() {}
- enum Kind {
+ enum Kind {
// Generic items for all pages
MemberGroups,
MemberDeclStart, MemberDeclEnd, MemberDecl,
MemberDefStart, MemberDefEnd, MemberDef,
BriefDesc, DetailedDesc,
AuthorSection,
-
+
// Class specific items
ClassIncludes, ClassInlineClasses,
ClassInheritanceGraph, ClassNestedClasses,
@@ -51,7 +52,7 @@ struct LayoutDocEntry
// File specific items
FileClasses, FileInterfaces, FileStructs, FileExceptions, FileConstantGroups, FileNamespaces,
- FileIncludes, FileIncludeGraph,
+ FileIncludes, FileIncludeGraph,
FileIncludedByGraph, FileSourceLink,
FileInlineClasses,
@@ -90,7 +91,7 @@ private:
struct LayoutDocEntryMemberDecl: public LayoutDocEntry
{
LayoutDocEntryMemberDecl(MemberListType tp,
- const QCString &tl,const QCString &ss)
+ const QCString &tl,const QCString &ss)
: type(tp), m_title(tl), m_subscript(ss) {}
Kind kind() const { return MemberDecl; }
@@ -105,7 +106,7 @@ private:
/** @brief Represents of a member definition list with configurable title. */
struct LayoutDocEntryMemberDef: public LayoutDocEntry
{
- LayoutDocEntryMemberDef(MemberListType tp,const QCString &tl)
+ LayoutDocEntryMemberDef(MemberListType tp,const QCString &tl)
: type(tp), m_title(tl) {}
Kind kind() const { return MemberDef; }
@@ -116,44 +117,44 @@ private:
};
/** @brief Base class for the layout of a navigation item at the top of the HTML pages. */
-struct LayoutNavEntry
+struct LayoutNavEntry
{
public:
- enum Kind {
- None = -1,
- MainPage,
+ enum Kind {
+ None = -1,
+ MainPage,
Pages,
- Modules,
- Namespaces,
+ Modules,
+ Namespaces,
NamespaceList,
NamespaceMembers,
Classes,
- ClassList,
- ClassIndex,
- ClassHierarchy,
+ ClassList,
+ ClassIndex,
+ ClassHierarchy,
ClassMembers,
Interfaces,
- InterfaceList,
- InterfaceIndex,
- InterfaceHierarchy,
+ InterfaceList,
+ InterfaceIndex,
+ InterfaceHierarchy,
Structs,
- StructList,
- StructIndex,
+ StructList,
+ StructIndex,
Exceptions,
- ExceptionList,
- ExceptionIndex,
- ExceptionHierarchy,
- Files,
+ ExceptionList,
+ ExceptionIndex,
+ ExceptionHierarchy,
+ Files,
FileList,
FileGlobals,
Examples,
User,
UserGroup
};
- LayoutNavEntry(LayoutNavEntry *parent,Kind k,bool vs,const QCString &bf,
- const QCString &tl,const QCString &intro,bool prepend=FALSE)
+ LayoutNavEntry(LayoutNavEntry *parent,Kind k,bool vs,const QCString &bf,
+ const QCString &tl,const QCString &intro,bool prepend=FALSE)
: m_parent(parent), m_kind(k), m_visible(vs), m_baseFile(bf), m_title(tl), m_intro(intro)
- { m_children.setAutoDelete(TRUE);
+ { m_children.setAutoDelete(TRUE);
if (parent) { if (prepend) parent->prependChild(this); else parent->addChild(this); }
}
LayoutNavEntry *parent() const { return m_parent; }
@@ -208,7 +209,7 @@ class LayoutDocManager
void clear(LayoutPart p);
LayoutDocManager();
~LayoutDocManager();
- Private *d;
+ std::unique_ptr<Private> d;
friend class LayoutParser;
};
diff --git a/src/linkedmap.h b/src/linkedmap.h
new file mode 100644
index 0000000..f09b6d8
--- /dev/null
+++ b/src/linkedmap.h
@@ -0,0 +1,267 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef LINKEDMAP_H
+#define LINKEDMAP_H
+
+#include <unordered_map>
+#include <vector>
+#include <memory>
+#include <string>
+#include <algorithm>
+#include <cctype>
+
+//! @brief Container class representing a vector of objects with keys.
+//! @details Objects can efficiently be looked up given the key.
+//! Objects are owned by the container.
+//! When adding objects the order of addition is kept, and used while iterating.
+template<class T, class Hash = std::hash<std::string>,
+ class KeyEqual = std::equal_to<std::string>,
+ class Map = std::unordered_map<std::string,T*,Hash,KeyEqual > >
+class LinkedMap
+{
+ public:
+ using Ptr = std::unique_ptr<T>;
+ using Vec = std::vector<Ptr>;
+ using iterator = typename Vec::iterator;
+ using const_iterator = typename Vec::const_iterator;
+ using reverse_iterator = typename Vec::reverse_iterator;
+ using const_reverse_iterator = typename Vec::const_reverse_iterator;
+
+ //! Find an object given the key.
+ //! Returns a pointer to the element if found or nullptr if it is not found.
+ const T *find(const char *key_) const
+ {
+ std::string key(key_ ? key_ : "");
+ auto it = m_lookup.find(key);
+ return it!=m_lookup.end() ? it->second : nullptr;
+ }
+
+ //! A non-const wrapper for find() const
+ T* find(const char *key)
+ {
+ return const_cast<T*>(static_cast<const LinkedMap&>(*this).find(key));
+ }
+
+ //! Adds a new object to the ordered vector if it was not added already.
+ //! Return a non-owning pointer to the newly added object, or to the existing object if
+ //! it was already inserted before under the given key.
+ template<class...Args>
+ T *add(const char *k, Args&&... args)
+ {
+ T *result = find(k);
+ if (result==nullptr)
+ {
+ std::string key(k ? k : "");
+ Ptr ptr = std::make_unique<T>(key.c_str(),std::forward<Args>(args)...);
+ result = ptr.get();
+ m_lookup.insert({key,result});
+ m_entries.push_back(std::move(ptr));
+ }
+ return result;
+ }
+
+ //! Adds an existing object to the ordered vector (unless another object was already
+ //! added under the same key). Ownership is transferred.
+ //! Return a non-owning pointer to the newly added object, or to the existing object if
+ //! it was already inserted before under the given key.
+ T *add(const char *k, Ptr &&ptr)
+ {
+ T *result = find(k);
+ if (result==nullptr)
+ {
+ std::string key(k ? k : "");
+ result = ptr.get();
+ m_lookup.insert({key,result});
+ m_entries.push_back(std::move(ptr));
+ }
+ return result;
+ }
+
+ //! Prepends a new object to the ordered vector if it was not added already.
+ //! Return a non-owning pointer to the newly added object, or to the existing object if
+ //! it was already inserted before under the given key.
+ template<class...Args>
+ T *prepend(const char *k, Args&&... args)
+ {
+ T *result = find(k);
+ if (result==nullptr)
+ {
+ std::string key(k ? k : "");
+ Ptr ptr = std::make_unique<T>(key.c_str(),std::forward<Args>(args)...);
+ result = ptr.get();
+ m_lookup.insert({key,result});
+ m_entries.push_front(std::move(ptr));
+ }
+ return result;
+ }
+
+ //! Removes an object from the container and deletes it.
+ //! Returns true if the object was deleted or false it is was not found.
+ bool del(const char *key_)
+ {
+ std::string key(key_ ? key_ : "");
+ auto it = m_lookup.find(key);
+ if (it!=m_lookup.end())
+ {
+ auto vecit = std::find_if(m_entries.begin(),m_entries.end(),[obj=it->second](auto &el) { return el.get()==obj; });
+ if (vecit!=m_entries.end()) // should always be true
+ {
+ m_entries.erase(vecit);
+ m_lookup.erase(it);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ Ptr &operator[](size_t pos) { return m_entries[pos]; }
+ const Ptr &operator[](size_t pos) const { return m_entries[pos]; }
+ iterator begin() { return m_entries.begin(); }
+ iterator end() { return m_entries.end(); }
+ const_iterator begin() const { return m_entries.cbegin(); }
+ const_iterator end() const { return m_entries.cend(); }
+ reverse_iterator rbegin() { return m_entries.rbegin(); }
+ reverse_iterator rend() { return m_entries.rend(); }
+ const_reverse_iterator rbegin() const { return m_entries.crbegin(); }
+ const_reverse_iterator rend() const { return m_entries.crend(); }
+ bool empty() const { return m_entries.empty(); }
+ size_t size() const { return m_entries.size(); }
+
+ void clear()
+ {
+ m_entries.clear();
+ m_lookup.clear();
+ }
+
+ private:
+
+ Map m_lookup;
+ Vec m_entries;
+};
+
+//! @brief Container class representing a vector of objects with keys.
+//! @details Objects can be efficiently be looked up given the key.
+//! Objects are \e not owned by the container, the container will only hold references.
+//! When adding objects the order of addition is kept, and used while iterating.
+template<class T, class Hash = std::hash<std::string>,
+ class KeyEqual = std::equal_to<std::string>,
+ class Map = std::unordered_map<std::string,T*,Hash,KeyEqual > >
+class LinkedRefMap
+{
+ public:
+ using Ptr = T*;
+ using Vec = std::vector<Ptr>;
+ using iterator = typename Vec::iterator;
+ using const_iterator = typename Vec::const_iterator;
+ using reverse_iterator = typename Vec::reverse_iterator;
+ using const_reverse_iterator = typename Vec::const_reverse_iterator;
+
+ //! find an object given the key.
+ //! Returns a pointer to the object if found or nullptr if it is not found.
+ const T *find(const char *key_) const
+ {
+ std::string key(key_ ? key_ : "");
+ auto it = m_lookup.find(key);
+ return it!=m_lookup.end() ? it->second : nullptr;
+ }
+
+ //! non-const wrapper for find() const
+ T* find(const char *key)
+ {
+ return const_cast<T*>(static_cast<const LinkedRefMap&>(*this).find(key));
+ }
+
+ //! Adds an object reference to the ordered vector if it was not added already.
+ //! Return true if the reference was added, and false if an object with the same key
+ //! was already added before
+ bool add(const char *k, T* obj)
+ {
+ if (find(k)==nullptr) // new element
+ {
+ std::string key(k ? k : "");
+ m_lookup.insert({key,obj});
+ m_entries.push_back(obj);
+ return true;
+ }
+ else // already existing, don't add
+ {
+ return false;
+ }
+ }
+
+ //! Prepends an object reference to the ordered vector if it was not added already.
+ //! Return true if the reference was added, and false if an object with the same key
+ //! was already added before
+ bool prepend(const char *k, T* obj)
+ {
+ if (find(k)==nullptr) // new element
+ {
+ std::string key(k ? k : "");
+ m_lookup.insert({key,obj});
+ m_entries.insert(m_entries.begin(),obj);
+ return true;
+ }
+ else // already existing, don't add
+ {
+ return false;
+ }
+ }
+
+ //! Removes an object from the container and deletes it.
+ //! Returns true if the object was deleted or false it is was not found.
+ bool del(const char *key_)
+ {
+ std::string key(key_ ? key_ : "");
+ auto it = m_lookup.find(key);
+ if (it!=m_lookup.end())
+ {
+ auto vecit = std::find_if(m_entries.begin(),m_entries.end(),[obj=it->second](auto &el) { return el.get()==obj; });
+ if (vecit!=m_entries.end()) // should always be true
+ {
+ m_entries.erase(vecit);
+ m_lookup.erase(it);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ Ptr &operator[](size_t pos) { return m_entries[pos]; }
+ const Ptr &operator[](size_t pos) const { return m_entries[pos]; }
+ iterator begin() { return m_entries.begin(); }
+ iterator end() { return m_entries.end(); }
+ const_iterator begin() const { return m_entries.cbegin(); }
+ const_iterator end() const { return m_entries.cend(); }
+ reverse_iterator rbegin() { return m_entries.rbegin(); }
+ reverse_iterator rend() { return m_entries.rend(); }
+ const_reverse_iterator rbegin() const { return m_entries.crbegin(); }
+ const_reverse_iterator rend() const { return m_entries.crend(); }
+ bool empty() const { return m_entries.empty(); }
+ size_t size() const { return m_entries.size(); }
+
+ void clear()
+ {
+ m_entries.clear();
+ m_lookup.clear();
+ }
+
+ private:
+ Map m_lookup;
+ Vec m_entries;
+};
+
+
+#endif
diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp
index 6b76008..875cd14 100644
--- a/src/mandocvisitor.cpp
+++ b/src/mandocvisitor.cpp
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,7 +13,7 @@
*
*/
-#include <qfileinfo.h>
+#include <qfileinfo.h>
#include "mandocvisitor.h"
#include "docparser.h"
@@ -33,7 +30,7 @@
#include "emoji.h"
ManDocVisitor::ManDocVisitor(FTextStream &t,CodeOutputInterface &ci,
- const char *langExt)
+ const char *langExt)
: DocVisitor(DocVisitor_Man), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE), m_firstCol(FALSE),
m_indent(0), m_langExt(langExt)
{
@@ -205,8 +202,7 @@ void ManDocVisitor::visit(DocVerbatim *s)
if (!m_firstCol) m_t << endl;
m_t << ".PP" << endl;
m_t << ".nf" << endl;
- Doxygen::parserManager->getCodeParser(lang)
- .parseCode(m_ci,s->context(),s->text(),
+ getCodeParser(lang).parseCode(m_ci,s->context(),s->text(),
langExt,
s->isExample(),s->exampleFile());
if (!m_firstCol) m_t << endl;
@@ -214,7 +210,7 @@ void ManDocVisitor::visit(DocVerbatim *s)
m_t << ".PP" << endl;
m_firstCol=TRUE;
break;
- case DocVerbatim::Verbatim:
+ case DocVerbatim::Verbatim:
if (!m_firstCol) m_t << endl;
m_t << ".PP" << endl;
m_t << ".nf" << endl;
@@ -224,18 +220,18 @@ void ManDocVisitor::visit(DocVerbatim *s)
m_t << ".PP" << endl;
m_firstCol=TRUE;
break;
- case DocVerbatim::ManOnly:
- m_t << s->text();
+ case DocVerbatim::ManOnly:
+ m_t << s->text();
break;
- case DocVerbatim::HtmlOnly:
- case DocVerbatim::XmlOnly:
- case DocVerbatim::LatexOnly:
+ case DocVerbatim::HtmlOnly:
+ case DocVerbatim::XmlOnly:
+ case DocVerbatim::LatexOnly:
case DocVerbatim::RtfOnly:
case DocVerbatim::DocbookOnly:
- case DocVerbatim::Dot:
- case DocVerbatim::Msc:
- case DocVerbatim::PlantUML:
- /* nothing */
+ case DocVerbatim::Dot:
+ case DocVerbatim::Msc:
+ case DocVerbatim::PlantUML:
+ /* nothing */
break;
}
}
@@ -252,14 +248,13 @@ void ManDocVisitor::visit(DocInclude *inc)
switch(inc->type())
{
case DocInclude::IncWithLines:
- {
+ {
if (!m_firstCol) m_t << endl;
m_t << ".PP" << endl;
m_t << ".nf" << endl;
QFileInfo cfi( inc->file() );
FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
inc->text(),
langExt,
inc->isExample(),
@@ -278,12 +273,11 @@ void ManDocVisitor::visit(DocInclude *inc)
m_firstCol=TRUE;
}
break;
- case DocInclude::Include:
+ case DocInclude::Include:
if (!m_firstCol) m_t << endl;
m_t << ".PP" << endl;
m_t << ".nf" << endl;
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
inc->text(),
langExt,
inc->isExample(),
@@ -304,8 +298,14 @@ void ManDocVisitor::visit(DocInclude *inc)
case DocInclude::DontIncWithLines:
case DocInclude::HtmlInclude:
case DocInclude::LatexInclude:
+ case DocInclude::RtfInclude:
+ case DocInclude::XmlInclude:
+ case DocInclude::DocbookInclude:
break;
- case DocInclude::VerbInclude:
+ case DocInclude::ManInclude:
+ m_t << inc->text();
+ break;
+ case DocInclude::VerbInclude:
if (!m_firstCol) m_t << endl;
m_t << ".PP" << endl;
m_t << ".nf" << endl;
@@ -319,8 +319,7 @@ void ManDocVisitor::visit(DocInclude *inc)
if (!m_firstCol) m_t << endl;
m_t << ".PP" << endl;
m_t << ".nf" << endl;
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
extractBlock(inc->text(),inc->blockId()),
langExt,
@@ -339,13 +338,12 @@ void ManDocVisitor::visit(DocInclude *inc)
m_t << ".nf" << endl;
QFileInfo cfi( inc->file() );
FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
extractBlock(inc->text(),inc->blockId()),
langExt,
inc->isExample(),
- inc->exampleFile(),
+ inc->exampleFile(),
fd,
lineBlock(inc->text(),inc->blockId()),
-1, // endLine
@@ -360,8 +358,8 @@ void ManDocVisitor::visit(DocInclude *inc)
m_firstCol=TRUE;
}
break;
- case DocInclude::SnippetDoc:
- case DocInclude::IncludeDoc:
+ case DocInclude::SnippetDoc:
+ case DocInclude::IncludeDoc:
err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
"Please create a bug report\n",__FILE__);
break;
@@ -375,7 +373,7 @@ void ManDocVisitor::visit(DocIncOperator *op)
SrcLangExt langExt = getLanguageFromFileName(locLangExt);
//printf("DocIncOperator: type=%d first=%d, last=%d text='%s'\n",
// op->type(),op->isFirst(),op->isLast(),op->text().data());
- if (op->isFirst())
+ if (op->isFirst())
{
if (!m_hide)
{
@@ -386,10 +384,10 @@ void ManDocVisitor::visit(DocIncOperator *op)
pushEnabled();
m_hide = TRUE;
}
- if (op->type()!=DocIncOperator::Skip)
+ if (op->type()!=DocIncOperator::Skip)
{
popEnabled();
- if (!m_hide)
+ if (!m_hide)
{
FileDef *fd = 0;
if (!op->includeFileName().isEmpty())
@@ -398,8 +396,7 @@ void ManDocVisitor::visit(DocIncOperator *op)
fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
}
- Doxygen::parserManager->getCodeParser(locLangExt)
- .parseCode(m_ci,op->context(),op->text(),langExt,
+ getCodeParser(locLangExt).parseCode(m_ci,op->context(),op->text(),langExt,
op->isExample(),op->exampleFile(),
fd, // fileDef
op->line(), // startLine
@@ -413,7 +410,7 @@ void ManDocVisitor::visit(DocIncOperator *op)
pushEnabled();
m_hide=TRUE;
}
- if (op->isLast())
+ if (op->isLast())
{
popEnabled();
if (!m_hide)
@@ -478,7 +475,7 @@ void ManDocVisitor::visitPre(DocAutoListItem *li)
QCString ws;
ws.fill(' ',m_indent-2);
if (!m_firstCol) m_t << endl;
- m_t << ".IP \"" << ws;
+ m_t << ".IP \"" << ws;
if (((DocAutoList *)li->parent())->isEnumList())
{
m_t << li->itemNumber() << ".\" " << m_indent+2;
@@ -491,14 +488,14 @@ void ManDocVisitor::visitPre(DocAutoListItem *li)
m_firstCol=TRUE;
}
-void ManDocVisitor::visitPost(DocAutoListItem *)
+void ManDocVisitor::visitPost(DocAutoListItem *)
{
if (m_hide) return;
m_t << endl;
m_firstCol=TRUE;
}
-void ManDocVisitor::visitPre(DocPara *)
+void ManDocVisitor::visitPre(DocPara *)
{
}
@@ -509,7 +506,7 @@ void ManDocVisitor::visitPost(DocPara *p)
!(p->parent() && // and for parameter sections
p->parent()->kind()==DocNode::Kind_ParamSect
)
- )
+ )
{
if (!m_firstCol) m_t << endl;
m_t << ".PP" << endl;
@@ -529,28 +526,28 @@ void ManDocVisitor::visitPre(DocSimpleSect *s)
{
if (m_hide) return;
if (!m_firstCol)
- {
+ {
m_t << endl;
m_t << ".PP" << endl;
}
m_t << "\\fB";
switch(s->type())
{
- case DocSimpleSect::See:
+ case DocSimpleSect::See:
m_t << theTranslator->trSeeAlso(); break;
- case DocSimpleSect::Return:
+ case DocSimpleSect::Return:
m_t << theTranslator->trReturns(); break;
- case DocSimpleSect::Author:
+ case DocSimpleSect::Author:
m_t << theTranslator->trAuthor(TRUE,TRUE); break;
- case DocSimpleSect::Authors:
+ case DocSimpleSect::Authors:
m_t << theTranslator->trAuthor(TRUE,FALSE); break;
- case DocSimpleSect::Version:
+ case DocSimpleSect::Version:
m_t << theTranslator->trVersion(); break;
- case DocSimpleSect::Since:
+ case DocSimpleSect::Since:
m_t << theTranslator->trSince(); break;
- case DocSimpleSect::Date:
+ case DocSimpleSect::Date:
m_t << theTranslator->trDate(); break;
- case DocSimpleSect::Note:
+ case DocSimpleSect::Note:
m_t << theTranslator->trNote(); break;
case DocSimpleSect::Warning:
m_t << theTranslator->trWarning(); break;
@@ -624,7 +621,7 @@ void ManDocVisitor::visitPre(DocSimpleListItem *)
m_firstCol=TRUE;
}
-void ManDocVisitor::visitPost(DocSimpleListItem *)
+void ManDocVisitor::visitPost(DocSimpleListItem *)
{
if (m_hide) return;
m_t << endl;
@@ -643,7 +640,7 @@ void ManDocVisitor::visitPre(DocSection *s)
m_firstCol=TRUE;
}
-void ManDocVisitor::visitPost(DocSection *)
+void ManDocVisitor::visitPost(DocSection *)
{
}
@@ -655,7 +652,7 @@ void ManDocVisitor::visitPre(DocHtmlList *)
m_t << ".PD 0" << endl;
}
-void ManDocVisitor::visitPost(DocHtmlList *)
+void ManDocVisitor::visitPost(DocHtmlList *)
{
if (m_hide) return;
m_indent-=2;
@@ -669,7 +666,7 @@ void ManDocVisitor::visitPre(DocHtmlListItem *li)
QCString ws;
ws.fill(' ',m_indent-2);
if (!m_firstCol) m_t << endl;
- m_t << ".IP \"" << ws;
+ m_t << ".IP \"" << ws;
if (((DocHtmlList *)li->parent())->type()==DocHtmlList::Ordered)
{
m_t << li->itemNumber() << ".\" " << m_indent+2;
@@ -682,7 +679,7 @@ void ManDocVisitor::visitPre(DocHtmlListItem *li)
m_firstCol=TRUE;
}
-void ManDocVisitor::visitPost(DocHtmlListItem *)
+void ManDocVisitor::visitPost(DocHtmlListItem *)
{
if (m_hide) return;
m_t << endl;
@@ -697,7 +694,7 @@ void ManDocVisitor::visitPost(DocHtmlListItem *)
// m_insidePre=TRUE;
//}
//
-//void ManDocVisitor::visitPost(DocHtmlPre *)
+//void ManDocVisitor::visitPost(DocHtmlPre *)
//{
// m_insidePre=FALSE;
// if (!m_firstCol) m_t << endl;
@@ -710,7 +707,7 @@ void ManDocVisitor::visitPre(DocHtmlDescList *)
{
}
-void ManDocVisitor::visitPost(DocHtmlDescList *)
+void ManDocVisitor::visitPost(DocHtmlDescList *)
{
if (m_hide) return;
if (!m_firstCol) m_t << endl;
@@ -726,7 +723,7 @@ void ManDocVisitor::visitPre(DocHtmlDescTitle *)
m_firstCol=FALSE;
}
-void ManDocVisitor::visitPost(DocHtmlDescTitle *)
+void ManDocVisitor::visitPost(DocHtmlDescTitle *)
{
if (m_hide) return;
m_t << "\\fP\" 1c" << endl;
@@ -737,7 +734,7 @@ void ManDocVisitor::visitPre(DocHtmlDescData *)
{
}
-void ManDocVisitor::visitPost(DocHtmlDescData *)
+void ManDocVisitor::visitPost(DocHtmlDescData *)
{
}
@@ -745,7 +742,7 @@ void ManDocVisitor::visitPre(DocHtmlTable *)
{
}
-void ManDocVisitor::visitPost(DocHtmlTable *)
+void ManDocVisitor::visitPost(DocHtmlTable *)
{
}
@@ -753,7 +750,7 @@ void ManDocVisitor::visitPre(DocHtmlCaption *)
{
}
-void ManDocVisitor::visitPost(DocHtmlCaption *)
+void ManDocVisitor::visitPost(DocHtmlCaption *)
{
}
@@ -761,7 +758,7 @@ void ManDocVisitor::visitPre(DocHtmlRow *)
{
}
-void ManDocVisitor::visitPost(DocHtmlRow *)
+void ManDocVisitor::visitPost(DocHtmlRow *)
{
}
@@ -769,7 +766,7 @@ void ManDocVisitor::visitPre(DocHtmlCell *)
{
}
-void ManDocVisitor::visitPost(DocHtmlCell *)
+void ManDocVisitor::visitPost(DocHtmlCell *)
{
}
@@ -782,7 +779,7 @@ void ManDocVisitor::visitPre(DocInternal *)
//m_t << ".RS 4" << endl;
}
-void ManDocVisitor::visitPost(DocInternal *)
+void ManDocVisitor::visitPost(DocInternal *)
{
if (m_hide) return;
//if (!m_firstCol) m_t << endl;
@@ -797,7 +794,7 @@ void ManDocVisitor::visitPre(DocHRef *)
m_t << "\\fC";
}
-void ManDocVisitor::visitPost(DocHRef *)
+void ManDocVisitor::visitPost(DocHRef *)
{
if (m_hide) return;
m_t << "\\fP";
@@ -811,7 +808,7 @@ void ManDocVisitor::visitPre(DocHtmlHeader *header)
m_t << " \"";
}
-void ManDocVisitor::visitPost(DocHtmlHeader *header)
+void ManDocVisitor::visitPost(DocHtmlHeader *header)
{
if (m_hide) return;
m_t << "\"" << endl;
@@ -823,7 +820,7 @@ void ManDocVisitor::visitPre(DocImage *)
{
}
-void ManDocVisitor::visitPost(DocImage *)
+void ManDocVisitor::visitPost(DocImage *)
{
}
@@ -831,14 +828,14 @@ void ManDocVisitor::visitPre(DocDotFile *)
{
}
-void ManDocVisitor::visitPost(DocDotFile *)
+void ManDocVisitor::visitPost(DocDotFile *)
{
}
void ManDocVisitor::visitPre(DocMscFile *)
{
}
-void ManDocVisitor::visitPost(DocMscFile *)
+void ManDocVisitor::visitPost(DocMscFile *)
{
}
@@ -856,7 +853,7 @@ void ManDocVisitor::visitPre(DocLink *)
m_t << "\\fB";
}
-void ManDocVisitor::visitPost(DocLink *)
+void ManDocVisitor::visitPost(DocLink *)
{
if (m_hide) return;
m_t << "\\fP";
@@ -869,7 +866,7 @@ void ManDocVisitor::visitPre(DocRef *ref)
if (!ref->hasLinkText()) filter(ref->targetTitle());
}
-void ManDocVisitor::visitPost(DocRef *)
+void ManDocVisitor::visitPost(DocRef *)
{
if (m_hide) return;
m_t << "\\fP";
@@ -885,7 +882,7 @@ void ManDocVisitor::visitPre(DocSecRefItem *)
m_firstCol=TRUE;
}
-void ManDocVisitor::visitPost(DocSecRefItem *)
+void ManDocVisitor::visitPost(DocSecRefItem *)
{
if (m_hide) return;
m_t << endl;
@@ -898,7 +895,7 @@ void ManDocVisitor::visitPre(DocSecRefList *)
m_indent+=2;
}
-void ManDocVisitor::visitPost(DocSecRefList *)
+void ManDocVisitor::visitPost(DocSecRefList *)
{
if (m_hide) return;
m_indent-=2;
@@ -910,20 +907,20 @@ void ManDocVisitor::visitPre(DocParamSect *s)
{
if (m_hide) return;
if (!m_firstCol)
- {
+ {
m_t << endl;
m_t << ".PP" << endl;
}
m_t << "\\fB";
switch(s->type())
{
- case DocParamSect::Param:
+ case DocParamSect::Param:
m_t << theTranslator->trParameters(); break;
- case DocParamSect::RetVal:
+ case DocParamSect::RetVal:
m_t << theTranslator->trReturnValues(); break;
- case DocParamSect::Exception:
+ case DocParamSect::Exception:
m_t << theTranslator->trExceptions(); break;
- case DocParamSect::TemplateParam:
+ case DocParamSect::TemplateParam:
m_t << theTranslator->trTemplateParameters(); break;
default:
ASSERT(0);
@@ -955,11 +952,11 @@ void ManDocVisitor::visitPre(DocParamList *pl)
if (!first) m_t << ","; else first=FALSE;
if (param->kind()==DocNode::Kind_Word)
{
- visit((DocWord*)param);
+ visit((DocWord*)param);
}
else if (param->kind()==DocNode::Kind_LinkedWord)
{
- visit((DocLinkedWord*)param);
+ visit((DocLinkedWord*)param);
}
}
m_t << "\\fP ";
@@ -980,7 +977,7 @@ void ManDocVisitor::visitPre(DocXRefItem *x)
if (m_hide) return;
if (x->title().isEmpty()) return;
if (!m_firstCol)
- {
+ {
m_t << endl;
m_t << ".PP" << endl;
}
@@ -1006,7 +1003,7 @@ void ManDocVisitor::visitPre(DocInternalRef *)
m_t << "\\fB";
}
-void ManDocVisitor::visitPost(DocInternalRef *)
+void ManDocVisitor::visitPost(DocInternalRef *)
{
if (m_hide) return;
m_t << "\\fP";
@@ -1024,7 +1021,7 @@ void ManDocVisitor::visitPre(DocHtmlBlockQuote *)
{
if (m_hide) return;
if (!m_firstCol)
- {
+ {
m_t << endl;
m_t << ".PP" << endl;
}
@@ -1058,12 +1055,12 @@ void ManDocVisitor::visitPost(DocParBlock *)
void ManDocVisitor::filter(const char *str)
-{
+{
if (str)
{
const char *p=str;
char c=0;
- while ((c=*p++))
+ while ((c=*p++))
{
switch(c)
{
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 5f07932..e58aa6e 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -41,7 +41,7 @@ static QCString getExtension()
QCString ext = Config_getString(MAN_EXTENSION);
if (ext.isEmpty())
{
- ext = "3";
+ ext = "3";
}
else
{
@@ -49,7 +49,7 @@ static QCString getExtension()
{
if (ext.length()==1)
{
- ext = "3";
+ ext = "3";
}
else // strip .
{
@@ -74,15 +74,23 @@ static QCString getSubdir()
return dir;
}
-ManGenerator::ManGenerator() : OutputGenerator()
+ManGenerator::ManGenerator() : OutputGenerator(Config_getString(MAN_OUTPUT)+"/"+getSubdir())
{
- m_dir=Config_getString(MAN_OUTPUT) + "/" + getSubdir();
- m_firstCol=TRUE;
- m_paragraph=TRUE;
- m_col=0;
- m_upperCase=FALSE;
- m_insideTabbing=FALSE;
- m_inHeader=FALSE;
+}
+
+ManGenerator::ManGenerator(const ManGenerator &og) : OutputGenerator(og)
+{
+}
+
+ManGenerator &ManGenerator::operator=(const ManGenerator &og)
+{
+ OutputGenerator::operator=(og);
+ return *this;
+}
+
+std::unique_ptr<OutputGenerator> ManGenerator::clone() const
+{
+ return std::make_unique<ManGenerator>(*this);
}
ManGenerator::~ManGenerator()
@@ -91,8 +99,8 @@ ManGenerator::~ManGenerator()
void ManGenerator::init()
{
- QCString &manOutput = Config_getString(MAN_OUTPUT);
-
+ QCString manOutput = Config_getString(MAN_OUTPUT);
+
QDir d(manOutput);
if (!d.exists() && !d.mkdir(manOutput))
{
@@ -139,7 +147,7 @@ static QCString buildFileName(const char *name)
}
QCString manExtension = "." + getExtension();
- if (fileName.right(manExtension.length())!=manExtension)
+ if (fileName.right(manExtension.length())!=manExtension)
{
fileName+=manExtension;
}
@@ -147,7 +155,7 @@ static QCString buildFileName(const char *name)
return fileName;
}
-void ManGenerator::startFile(const char *,const char *manName,const char *)
+void ManGenerator::startFile(const char *,const char *manName,const char *,int)
{
startPlainFile( buildFileName( manName ) );
m_firstCol=TRUE;
@@ -161,11 +169,11 @@ void ManGenerator::endFile()
void ManGenerator::endTitleHead(const char *,const char *name)
{
- t << ".TH \"" << name << "\" " << getExtension() << " \""
+ t << ".TH \"" << name << "\" " << getExtension() << " \""
<< dateToString(FALSE) << "\" \"";
if (!Config_getString(PROJECT_NUMBER).isEmpty())
t << "Version " << Config_getString(PROJECT_NUMBER) << "\" \"";
- if (Config_getString(PROJECT_NAME).isEmpty())
+ if (Config_getString(PROJECT_NAME).isEmpty())
t << "Doxygen";
else
t << Config_getString(PROJECT_NAME);
@@ -284,7 +292,7 @@ void ManGenerator::docify(const char *str)
{
const char *p=str;
char c=0;
- while ((c=*p++))
+ while ((c=*p++))
{
switch(c)
{
@@ -318,8 +326,8 @@ void ManGenerator::codify(const char *str)
case '.': t << "\\&."; break; // see bug652277
case '\t': spacesToNextTabStop =
Config_getInt(TAB_SIZE) - (m_col%Config_getInt(TAB_SIZE));
- t << Doxygen::spaces.left(spacesToNextTabStop);
- m_col+=spacesToNextTabStop;
+ t << Doxygen::spaces.left(spacesToNextTabStop);
+ m_col+=spacesToNextTabStop;
break;
case '\n': t << "\n"; m_firstCol=TRUE; m_col=0; break;
case '\\': t << "\\"; m_col++; break;
@@ -346,21 +354,21 @@ void ManGenerator::writeChar(char c)
m_paragraph=FALSE;
}
-void ManGenerator::startDescList(SectionTypes)
+void ManGenerator::startDescList(SectionTypes)
{
- if (!m_firstCol)
- { t << endl << ".PP" << endl;
- m_firstCol=TRUE; m_paragraph=TRUE;
+ if (!m_firstCol)
+ { t << endl << ".PP" << endl;
+ m_firstCol=TRUE; m_paragraph=TRUE;
m_col=0;
}
m_paragraph=FALSE;
startBold();
}
-void ManGenerator::startTitle()
-{
- if (!m_firstCol) t << endl;
- t << ".SH \"";
+void ManGenerator::startTitle()
+{
+ if (!m_firstCol) t << endl;
+ t << ".SH \"";
m_firstCol=FALSE;
m_paragraph=FALSE;
}
@@ -370,40 +378,40 @@ void ManGenerator::endTitle()
t << "\"";
}
-void ManGenerator::startItemListItem()
-{
- if (!m_firstCol) t << endl;
- t << ".TP" << endl;
+void ManGenerator::startItemListItem()
+{
+ if (!m_firstCol) t << endl;
+ t << ".TP" << endl;
m_firstCol=TRUE;
m_paragraph=FALSE;
m_col=0;
-}
+}
void ManGenerator::endItemListItem()
{
}
-void ManGenerator::startCodeFragment()
-{
+void ManGenerator::startCodeFragment(const char *)
+{
newParagraph();
- t << ".nf" << endl;
+ t << ".nf" << endl;
m_firstCol=TRUE;
m_paragraph=FALSE;
}
-void ManGenerator::endCodeFragment()
-{
+void ManGenerator::endCodeFragment(const char *)
+{
if (!m_firstCol) t << endl;
- t << ".fi" << endl;
+ t << ".fi" << endl;
m_firstCol=TRUE;
m_paragraph=FALSE;
m_col=0;
}
-void ManGenerator::startMemberDoc(const char *,const char *,const char *,const char *,int,int,bool)
-{
+void ManGenerator::startMemberDoc(const char *,const char *,const char *,const char *,int,int,bool)
+{
if (!m_firstCol) t << endl;
- t << ".SS \"";
+ t << ".SS \"";
m_firstCol=FALSE;
m_paragraph=FALSE;
}
@@ -413,7 +421,7 @@ void ManGenerator::startDoxyAnchor(const char *,const char *manName,
const char *)
{
// something to be done?
- if( !Config_getBool(MAN_LINKS) )
+ if( !Config_getBool(MAN_LINKS) )
{
return; // no
}
@@ -426,14 +434,14 @@ void ManGenerator::startDoxyAnchor(const char *,const char *manName,
//printf("Converting man link '%s'->'%s'->'%s'\n",
// name,baseName.data(),buildFileName(baseName).data());
-
+
// - remove dangerous characters and append suffix, then add dir prefix
- QCString fileName=m_dir+"/"+buildFileName( baseName );
+ QCString fileName=dir()+"/"+buildFileName( baseName );
QFile linkfile( fileName );
// - only create file if it doesn't exist already
- if ( !linkfile.open( IO_ReadOnly ) )
+ if ( !linkfile.open( IO_ReadOnly ) )
{
- if ( linkfile.open( IO_WriteOnly ) )
+ if ( linkfile.open( IO_WriteOnly ) )
{
FTextStream linkstream;
linkstream.setDevice(&linkfile);
@@ -449,10 +457,10 @@ void ManGenerator::endMemberDoc(bool)
t << "\"\n";
}
-void ManGenerator::startSubsection()
-{
+void ManGenerator::startSubsection()
+{
if (!m_firstCol) t << endl;
- t << ".SS \"";
+ t << ".SS \"";
m_firstCol=FALSE;
m_paragraph=FALSE;
}
@@ -463,10 +471,10 @@ void ManGenerator::endSubsection()
}
-void ManGenerator::startSubsubsection()
-{
+void ManGenerator::startSubsubsection()
+{
if (!m_firstCol) t << endl;
- t << "\n.SS \"";
+ t << "\n.SS \"";
m_firstCol=FALSE;
m_paragraph=FALSE;
}
@@ -476,10 +484,10 @@ void ManGenerator::endSubsubsection()
t << "\"";
}
-void ManGenerator::writeSynopsis()
-{
+void ManGenerator::writeSynopsis()
+{
if (!m_firstCol) t << endl;
- t << ".SH SYNOPSIS\n.br\n.PP\n";
+ t << ".SH SYNOPSIS\n.br\n.PP\n";
m_firstCol=TRUE;
m_paragraph=FALSE;
}
@@ -534,31 +542,31 @@ void ManGenerator::endAnonTypeScope(int indentLevel)
}
-void ManGenerator::startMemberItem(const char *,int,const char *)
-{
+void ManGenerator::startMemberItem(const char *,int,const char *)
+{
if (m_firstCol && !m_insideTabbing) t << ".in +1c\n";
- t << "\n.ti -1c\n.RI \"";
+ t << "\n.ti -1c\n.RI \"";
m_firstCol=FALSE;
}
-void ManGenerator::endMemberItem()
-{
- t << "\"\n.br";
+void ManGenerator::endMemberItem()
+{
+ t << "\"\n.br";
}
-void ManGenerator::startMemberList()
-{
+void ManGenerator::startMemberList()
+{
if (!m_insideTabbing)
{
- t << "\n.in +1c"; m_firstCol=FALSE;
+ t << "\n.in +1c"; m_firstCol=FALSE;
}
}
-void ManGenerator::endMemberList()
-{
+void ManGenerator::endMemberList()
+{
if (!m_insideTabbing)
{
- t << "\n.in -1c"; m_firstCol=FALSE;
+ t << "\n.in -1c"; m_firstCol=FALSE;
}
}
@@ -593,33 +601,33 @@ void ManGenerator::endMemberGroup(bool)
m_firstCol=FALSE;
}
-void ManGenerator::startSection(const char *,const char *,SectionInfo::SectionType type)
+void ManGenerator::startSection(const char *,const char *,SectionType type)
{
- if( !m_inHeader )
+ if( !m_inHeader )
{
switch(type)
{
- case SectionInfo::Page: startGroupHeader(FALSE); break;
- case SectionInfo::Section: startGroupHeader(FALSE); break;
- case SectionInfo::Subsection: startMemberHeader(0, -1); break;
- case SectionInfo::Subsubsection: startMemberHeader(0, -1); break;
- case SectionInfo::Paragraph: startMemberHeader(0, -1); break;
+ case SectionType::Page: startGroupHeader(FALSE); break;
+ case SectionType::Section: startGroupHeader(FALSE); break;
+ case SectionType::Subsection: startMemberHeader(0, -1); break;
+ case SectionType::Subsubsection: startMemberHeader(0, -1); break;
+ case SectionType::Paragraph: startMemberHeader(0, -1); break;
default: ASSERT(0); break;
}
}
}
-void ManGenerator::endSection(const char *,SectionInfo::SectionType type)
+void ManGenerator::endSection(const char *,SectionType type)
{
if( !m_inHeader )
{
switch(type)
{
- case SectionInfo::Page: endGroupHeader(0); break;
- case SectionInfo::Section: endGroupHeader(0); break;
- case SectionInfo::Subsection: endMemberHeader(); break;
- case SectionInfo::Subsubsection: endMemberHeader(); break;
- case SectionInfo::Paragraph: endMemberHeader(); break;
+ case SectionType::Page: endGroupHeader(0); break;
+ case SectionType::Section: endGroupHeader(0); break;
+ case SectionType::Subsection: endMemberHeader(); break;
+ case SectionType::Subsubsection: endMemberHeader(); break;
+ case SectionType::Paragraph: endMemberHeader(); break;
default: ASSERT(0); break;
}
}
@@ -634,9 +642,9 @@ void ManGenerator::endSection(const char *,SectionInfo::SectionType type)
void ManGenerator::startExamples()
{
- if (!m_firstCol)
- { t << endl << ".PP" << endl;
- m_firstCol=TRUE; m_paragraph=TRUE;
+ if (!m_firstCol)
+ { t << endl << ".PP" << endl;
+ m_firstCol=TRUE; m_paragraph=TRUE;
m_col=0;
}
m_paragraph=FALSE;
@@ -652,9 +660,9 @@ void ManGenerator::endExamples()
void ManGenerator::startDescTable(const char *title)
{
- if (!m_firstCol)
- { t << endl << ".PP" << endl;
- m_firstCol=TRUE; m_paragraph=TRUE;
+ if (!m_firstCol)
+ { t << endl << ".PP" << endl;
+ m_firstCol=TRUE; m_paragraph=TRUE;
m_col=0;
}
m_paragraph=FALSE;
@@ -672,9 +680,9 @@ void ManGenerator::endDescTable()
void ManGenerator::startParamList(ParamListTypes,const char *title)
{
- if (!m_firstCol)
- { t << endl << ".PP" << endl;
- m_firstCol=TRUE; m_paragraph=TRUE;
+ if (!m_firstCol)
+ { t << endl << ".PP" << endl;
+ m_firstCol=TRUE; m_paragraph=TRUE;
m_col=0;
}
m_paragraph=FALSE;
@@ -688,20 +696,20 @@ void ManGenerator::endParamList()
{
}
-void ManGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *)
+void ManGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *,int)
{
ManDocVisitor *visitor = new ManDocVisitor(t,*this,ctx?ctx->getDefFileExtension():QCString(""));
n->accept(visitor);
- delete visitor;
+ delete visitor;
m_firstCol=FALSE;
m_paragraph = FALSE;
}
void ManGenerator::startConstraintList(const char *header)
{
- if (!m_firstCol)
- { t << endl << ".PP" << endl;
- m_firstCol=TRUE; m_paragraph=TRUE;
+ if (!m_firstCol)
+ { t << endl << ".PP" << endl;
+ m_firstCol=TRUE; m_paragraph=TRUE;
m_col=0;
}
m_paragraph=FALSE;
@@ -748,16 +756,16 @@ void ManGenerator::endConstraintList()
}
-void ManGenerator::startInlineHeader()
+void ManGenerator::startInlineHeader()
{
- if (!m_firstCol)
+ if (!m_firstCol)
{
t << endl << ".PP" << endl << ".in -1c" << endl;
}
- t << ".RI \"\\fB";
+ t << ".RI \"\\fB";
}
-void ManGenerator::endInlineHeader()
+void ManGenerator::endInlineHeader()
{
t << "\\fP\"" << endl << ".in +1c" << endl;
m_firstCol = FALSE;
@@ -765,7 +773,7 @@ void ManGenerator::endInlineHeader()
void ManGenerator::startMemberDocSimple(bool isEnum)
{
- if (!m_firstCol)
+ if (!m_firstCol)
{
t << endl << ".PP" << endl;
}
diff --git a/src/mangen.h b/src/mangen.h
index eba6c8d..052c5ee 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -27,24 +27,17 @@ class ManGenerator : public OutputGenerator
{
public:
ManGenerator();
- ~ManGenerator();
-
- //OutputGenerator *copy() { return new ManGenerator; }
- //OutputGenerator *clone() { return new ManGenerator(*this); }
- //void append(const OutputGenerator *o);
- void enable()
- { if (m_genStack->top()) m_active=*m_genStack->top(); else m_active=TRUE; }
- void disable() { m_active=FALSE; }
- void enableIf(OutputType o) { if (o==Man) enable(); }
- void disableIf(OutputType o) { if (o==Man) disable(); }
- void disableIfNot(OutputType o) { if (o!=Man) disable(); }
- bool isEnabled(OutputType o) { return (o==Man && m_active); }
- OutputGenerator *get(OutputType o) { return (o==Man) ? this : 0; }
+ ManGenerator(const ManGenerator &g);
+ ManGenerator &operator=(const ManGenerator &g);
+ virtual ~ManGenerator();
+ virtual std::unique_ptr<OutputGenerator> clone() const;
+
+ OutputType type() const { return Man; }
- void writeDoc(DocNode *,const Definition *,const MemberDef *);
+ void writeDoc(DocNode *,const Definition *,const MemberDef *,int);
static void init();
- void startFile(const char *name,const char *manName,const char *title);
+ void startFile(const char *name,const char *manName,const char *title,int);
void writeSearchInfo() {}
void writeFooter(const char *) {}
void endFile();
@@ -60,7 +53,7 @@ class ManGenerator : public OutputGenerator
void endTitleHead(const char *,const char *);
void startTitle();
void endTitle();
-
+
void newParagraph();
void startParagraph(const char *classDef);
void endParagraph();
@@ -68,11 +61,11 @@ class ManGenerator : public OutputGenerator
void startIndexListItem() {}
void endIndexListItem() {}
void startIndexList() {}
- void endIndexList() { newParagraph(); }
+ void endIndexList() { newParagraph(); }
void startIndexKey() {}
- void endIndexKey() {}
+ void endIndexKey() {}
void startIndexValue(bool) {}
- void endIndexValue(const char *,bool) {}
+ void endIndexValue(const char *,bool) {}
void startItemList() {}
void endItemList() { newParagraph(); }
void startIndexItem(const char *ref,const char *file);
@@ -130,8 +123,8 @@ class ManGenerator : public OutputGenerator
void writeRuler() {}
void writeAnchor(const char *,const char *) {}
- void startCodeFragment();
- void endCodeFragment();
+ void startCodeFragment(const char *);
+ void endCodeFragment(const char *);
void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; m_col=0; }
void startCodeLine(bool) {}
void endCodeLine() { codify("\n"); m_col=0; }
@@ -163,7 +156,7 @@ class ManGenerator : public OutputGenerator
void endSmall() {}
void startMemberDescription(const char *,const char *,bool) { t << "\n.RI \""; m_firstCol=FALSE; }
void endMemberDescription() { t << "\""; m_firstCol=FALSE; }
- void startMemberDeclaration() {}
+ void startMemberDeclaration() {}
void endMemberDeclaration(const char *,const char *) {}
void writeInheritedSectionTitle(const char *,const char *,const char *,
const char *,const char *,const char *) {}
@@ -176,8 +169,8 @@ class ManGenerator : public OutputGenerator
//void writeDescItem();
void startDescForItem();
void endDescForItem();
- void startSection(const char *,const char *,SectionInfo::SectionType);
- void endSection(const char *,SectionInfo::SectionType);
+ void startSection(const char *,const char *,SectionType);
+ void endSection(const char *,SectionType);
void addIndexItem(const char *,const char *) {}
void startIndent() {}
void endIndent() {}
@@ -196,7 +189,7 @@ class ManGenerator : public OutputGenerator
void startContents() {}
void endContents() {}
void writeNonBreakableSpace(int n) { int i; for (i=0;i<n;i++) t << " "; }
-
+
void startDescTable(const char *t);
void endDescTable();
void startDescTableRow() {}
@@ -214,7 +207,7 @@ class ManGenerator : public OutputGenerator
void endGroupCollaboration(DotGroupCollaboration &) {}
void startCallGraph() {}
void endCallGraph(DotCallGraph &) {}
- void startDirDepGraph() {}
+ void startDirDepGraph() {}
void endDirDepGraph(DotDirDeps &) {}
void writeGraphicalHierarchy(DotGfxHierarchyTable &) {}
@@ -264,15 +257,13 @@ class ManGenerator : public OutputGenerator
void addWord(const char *,bool) {}
private:
- bool m_firstCol;
- bool m_paragraph;
- int m_col;
- bool m_upperCase;
- bool m_insideTabbing;
- bool m_inHeader;
+ bool m_firstCol = true;
+ bool m_paragraph = true;
+ int m_col = 0;
+ bool m_upperCase = false;
+ bool m_insideTabbing = false;
+ bool m_inHeader = false;
- ManGenerator(const ManGenerator &g);
- ManGenerator &operator=(const ManGenerator &g);
};
#endif
diff --git a/src/markdown.cpp b/src/markdown.cpp
index aa64aa2..93d143d 100644
--- a/src/markdown.cpp
+++ b/src/markdown.cpp
@@ -1,10 +1,10 @@
/******************************************************************************
*
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -13,7 +13,7 @@
*
*/
-/* Note: part of the code below is inspired by libupskirt written by
+/* Note: part of the code below is inspired by libupskirt written by
* Natacha Porté. Original copyright message follows:
*
* Copyright (c) 2008, Natacha Porté
@@ -35,9 +35,9 @@
#include <qglobal.h>
#include <qregexp.h>
#include <qfileinfo.h>
-#include <qdict.h>
-#include <qvector.h>
-//#define USE_ORIGINAL_TABLES
+
+#include <unordered_map>
+#include <functional>
#include "markdown.h"
#include "growbuf.h"
@@ -46,13 +46,96 @@
#include "doxygen.h"
#include "commentscan.h"
#include "entry.h"
-#include "bufstr.h"
#include "commentcnv.h"
#include "config.h"
#include "section.h"
#include "message.h"
#include "portable.h"
+#if !defined(NDEBUG)
+#define ENABLE_TRACING
+#endif
+
+#ifdef ENABLE_TRACING
+#define IOSTREAM stdout
+#define DATA_BUFSIZE 20
+#if defined(_WIN32) && !defined(CYGWIN) && !defined(__MINGW32__)
+#define PRETTY_FUNC __FUNCSIG__
+#else
+#define PRETTY_FUNC __PRETTY_FUNCTION__
+#endif
+
+class Trace
+{
+ public:
+ Trace(const char *func) : m_func(func)
+ {
+ if (Debug::isFlagSet(Debug::Markdown))
+ {
+ fprintf(IOSTREAM,"> %s\n",func);
+ s_indent++;
+ }
+ }
+ Trace(const char *func,const char *data) : m_func(func)
+ {
+ if (Debug::isFlagSet(Debug::Markdown))
+ {
+ indent();
+ char data_s[DATA_BUFSIZE*2+1] = ""; // worst case each input char outputs 2 chars + 0 terminator.
+ int j=0;
+ if (data)
+ {
+ for (int i=0;i<DATA_BUFSIZE;i++)
+ {
+ char c=data[i];
+ if (c==0) break;
+ else if (c=='\n') { data_s[j++]='\\'; data_s[j++]='n'; }
+ else if (c=='\t') { data_s[j++]='\\'; data_s[j++]='t'; }
+ else if (c=='\r') { data_s[j++]='\\'; data_s[j++]='r'; }
+ else if (c=='\\') { data_s[j++]='\\'; data_s[j++]='\\'; }
+ else data_s[j++]=c;
+ }
+ }
+ data_s[j++]=0;
+ fprintf(IOSTREAM,"> %s data=[%s…]\n",func,data_s);
+ s_indent++;
+ }
+ }
+ ~Trace()
+ {
+ if (Debug::isFlagSet(Debug::Markdown))
+ {
+ s_indent--;
+ indent();
+ fprintf(IOSTREAM,"< %s\n",m_func);
+ }
+ }
+ void trace(const char *fmt,...)
+ {
+ if (Debug::isFlagSet(Debug::Markdown))
+ {
+ indent();
+ fprintf(IOSTREAM,": %s: ",m_func);
+ va_list args;
+ va_start(args,fmt);
+ vfprintf(IOSTREAM, fmt, args);
+ va_end(args);
+ }
+ }
+ private:
+ void indent() { for (int i=0;i<s_indent;i++) fputs(" ",IOSTREAM); }
+ const char *m_func;
+ static int s_indent;
+};
+
+int Trace::s_indent = 0;
+#define TRACE(data) Trace trace_(PRETTY_FUNC,data);
+#define TRACE_MORE(...) trace_.trace(__VA_ARGS__);
+#else
+#define TRACE(data) do {} while(false)
+#define TRACE_MORE(...) do {} while(false)
+#endif
+
//-----------
// is character at position i in data part of an identifier?
@@ -70,25 +153,18 @@
// is character at position i in data allowed before an emphasis section
#define isOpenEmphChar(i) \
(data[i]=='\n' || data[i]==' ' || data[i]=='\'' || data[i]=='<' || \
- data[i]=='{' || data[i]=='(' || data[i]=='[' || data[i]==',' || \
- data[i]==':' || data[i]==';')
+ data[i]=='>' || data[i]=='{' || data[i]=='(' || data[i]=='[' || \
+ data[i]==',' || data[i]==':' || data[i]==';')
// is character at position i in data an escape that prevents ending an emphasis section
// so for example *bla (*.txt) is cool*
#define ignoreCloseEmphChar(i) \
- (data[i]=='(' || data[i]=='{' || data[i]=='[' || data[i]=='<' || \
+ (data[i]=='(' || data[i]=='{' || data[i]=='[' || (data[i]=='<' && data[i+1]!='/') || \
data[i]=='\\' || \
data[i]=='@')
//----------
-struct LinkRef
-{
- LinkRef(const QCString &l,const QCString &t) : link(l), title(t) {}
- QCString link;
- QCString title;
-};
-
struct TableCell
{
TableCell() : colSpan(false) {}
@@ -96,30 +172,51 @@ struct TableCell
bool colSpan;
};
-typedef int (*action_t)(GrowBuf &out,const char *data,int offset,int size);
+Markdown::Markdown(const char *fileName,int lineNr,int indentLevel)
+ : m_fileName(fileName), m_lineNr(lineNr), m_indentLevel(indentLevel)
+{
+ using namespace std::placeholders;
+ // setup callback table for special characters
+ m_actions[(unsigned int)'_'] = std::bind(&Markdown::processEmphasis, this,_1,_2,_3);
+ m_actions[(unsigned int)'*'] = std::bind(&Markdown::processEmphasis, this,_1,_2,_3);
+ m_actions[(unsigned int)'~'] = std::bind(&Markdown::processEmphasis, this,_1,_2,_3);
+ m_actions[(unsigned int)'`'] = std::bind(&Markdown::processCodeSpan, this,_1,_2,_3);
+ m_actions[(unsigned int)'\\']= std::bind(&Markdown::processSpecialCommand,this,_1,_2,_3);
+ m_actions[(unsigned int)'@'] = std::bind(&Markdown::processSpecialCommand,this,_1,_2,_3);
+ m_actions[(unsigned int)'['] = std::bind(&Markdown::processLink, this,_1,_2,_3);
+ m_actions[(unsigned int)'!'] = std::bind(&Markdown::processLink, this,_1,_2,_3);
+ m_actions[(unsigned int)'<'] = std::bind(&Markdown::processHtmlTag, this,_1,_2,_3);
+ m_actions[(unsigned int)'-'] = std::bind(&Markdown::processNmdash, this,_1,_2,_3);
+ m_actions[(unsigned int)'"'] = std::bind(&Markdown::processQuoted, this,_1,_2,_3);
+ (void)m_lineNr; // not used yet
+}
enum Alignment { AlignNone, AlignLeft, AlignCenter, AlignRight };
-//----------
-
-static QDict<LinkRef> g_linkRefs(257);
-static action_t g_actions[256];
-static Entry *g_current;
-static QCString g_fileName;
-static int g_lineNr;
-static int g_indentLevel=0; // 0 is outside markdown, -1=page level
-static const char g_utf8_nbsp[3] = {'\xc2', '\xa0', '\0'}; // UTF-8 nbsp
-static const char *g_doxy_nsbp = "&_doxy_nbsp;"; // doxygen escape command for UTF-8 nbsp
-//----------
-
+//---------- constants -------
+//
+const uchar g_utf8_nbsp[3] = { 0xc2, 0xa0, 0}; // UTF-8 nbsp
+const char *g_doxy_nsbp = "&_doxy_nbsp;"; // doxygen escape command for UTF-8 nbsp
const int codeBlockIndent = 4;
-static void processInline(GrowBuf &out,const char *data,int size);
+//---------- helpers -------
+
+// test if the next characters in data represent a new line (which can be character \n or string \ilinebr).
+// returns 0 if no newline is found, or the number of characters that make up the newline if found.
+inline int isNewline(const char *data)
+{
+ // normal newline
+ if (data[0] == '\n') return 1;
+ // artificial new line from ^^ in ALIASES
+ if (data[0] == '\\' && qstrncmp(data+1,"ilinebr",7)==0) return 8;
+ return 0;
+}
// escape characters that have a special meaning later on.
static QCString escapeSpecialChars(const QCString &s)
{
+ TRACE(s.data());
if (s.isEmpty()) return "";
bool insideQuote=FALSE;
GrowBuf growBuf;
@@ -145,6 +242,7 @@ static QCString escapeSpecialChars(const QCString &s)
static void convertStringFragment(QCString &result,const char *data,int size)
{
+ TRACE(result.data());
if (size<0) size=0;
result.resize(size+1);
memcpy(result.rawData(),data,size);
@@ -194,8 +292,9 @@ static Alignment markersToAlignment(bool leftMarker,bool rightMarker)
// \xmlonly..\endxmlonly
// \rtfonly..\endrtfonly
// \manonly..\endmanonly
-static QCString isBlockCommand(const char *data,int offset,int size)
+QCString Markdown::isBlockCommand(const char *data,int offset,int size)
{
+ TRACE(data);
bool openBracket = offset>0 && data[-1]=='{';
bool isEscaped = offset>0 && (data[-1]=='\\' || data[-1]=='@');
if (isEscaped) return QCString();
@@ -209,11 +308,11 @@ static QCString isBlockCommand(const char *data,int offset,int size)
{
return "}";
}
- else if (blockName=="dot" ||
- blockName=="code" ||
+ else if (blockName=="dot" ||
+ blockName=="code" ||
blockName=="msc" ||
- blockName=="verbatim" ||
- blockName=="latexonly" ||
+ blockName=="verbatim" ||
+ blockName=="latexonly" ||
blockName=="htmlonly" ||
blockName=="xmlonly" ||
blockName=="rtfonly" ||
@@ -248,20 +347,22 @@ static QCString isBlockCommand(const char *data,int offset,int size)
/** looks for the next emph char, skipping other constructs, and
* stopping when either it is found, or we are at the end of a paragraph.
*/
-static int findEmphasisChar(const char *data, int size, char c, int c_size)
+int Markdown::findEmphasisChar(const char *data, int size, char c, int c_size)
{
+ TRACE(data);
int i = 1;
while (i<size)
{
- while (i<size && data[i]!=c && data[i]!='`' &&
+ while (i<size && data[i]!=c && data[i]!='`' &&
data[i]!='\\' && data[i]!='@' &&
+ !(data[i]=='/' && data[i-1]=='<') && // html end tag also ends emphasis
data[i]!='\n') i++;
//printf("findEmphasisChar: data=[%s] i=%d c=%c\n",data,i,data[i]);
- // not counting escaped chars or characters that are unlikely
+ // not counting escaped chars or characters that are unlikely
// to appear as the end of the emphasis char
- if (i>0 && ignoreCloseEmphChar(i-1))
+ if (ignoreCloseEmphChar(i-1))
{
i++;
continue;
@@ -330,6 +431,10 @@ static int findEmphasisChar(const char *data, int size, char c, int c_size)
i++;
}
}
+ else if (data[i-1]=='<' && data[i]=='/') // html end tag invalidates emphasis
+ {
+ return 0;
+ }
else if (data[i]=='\n') // end * or _ at paragraph boundary
{
i++;
@@ -346,8 +451,9 @@ static int findEmphasisChar(const char *data, int size, char c, int c_size)
}
/** process single emphasis */
-static int processEmphasis1(GrowBuf &out, const char *data, int size, char c)
+int Markdown::processEmphasis1(const char *data, int size, char c)
{
+ TRACE(data);
int i = 0, len;
/* skipping one symbol if coming from emph3 */
@@ -356,9 +462,9 @@ static int processEmphasis1(GrowBuf &out, const char *data, int size, char c)
while (i<size)
{
len = findEmphasisChar(data+i, size-i, c, 1);
- if (len==0) return 0;
+ if (len==0) return 0;
i+=len;
- if (i>=size) return 0;
+ if (i>=size) return 0;
if (i+1<size && data[i+1]==c)
{
@@ -367,9 +473,9 @@ static int processEmphasis1(GrowBuf &out, const char *data, int size, char c)
}
if (data[i]==c && data[i-1]!=' ' && data[i-1]!='\n')
{
- out.addStr("<em>");
- processInline(out,data,i);
- out.addStr("</em>");
+ m_out.addStr("<em>");
+ processInline(data,i);
+ m_out.addStr("</em>");
return i+1;
}
}
@@ -377,8 +483,9 @@ static int processEmphasis1(GrowBuf &out, const char *data, int size, char c)
}
/** process double emphasis */
-static int processEmphasis2(GrowBuf &out, const char *data, int size, char c)
+int Markdown::processEmphasis2(const char *data, int size, char c)
{
+ TRACE(data);
int i = 0, len;
while (i<size)
@@ -389,15 +496,15 @@ static int processEmphasis2(GrowBuf &out, const char *data, int size, char c)
return 0;
}
i += len;
- if (i+1<size && data[i]==c && data[i+1]==c && i && data[i-1]!=' ' &&
+ if (i+1<size && data[i]==c && data[i+1]==c && i && data[i-1]!=' ' &&
data[i-1]!='\n'
)
{
- if (c == '~') out.addStr("<strike>");
- else out.addStr("<strong>");
- processInline(out,data,i);
- if (c == '~') out.addStr("</strike>");
- else out.addStr("</strong>");
+ if (c == '~') m_out.addStr("<strike>");
+ else m_out.addStr("<strong>");
+ processInline(data,i);
+ if (c == '~') m_out.addStr("</strike>");
+ else m_out.addStr("</strong>");
return i + 2;
}
i++;
@@ -406,10 +513,11 @@ static int processEmphasis2(GrowBuf &out, const char *data, int size, char c)
}
/** Parsing triple emphasis.
- * Finds the first closing tag, and delegates to the other emph
+ * Finds the first closing tag, and delegates to the other emph
*/
-static int processEmphasis3(GrowBuf &out, const char *data, int size, char c)
+int Markdown::processEmphasis3(const char *data, int size, char c)
{
+ TRACE(data);
int i = 0, len;
while (i<size)
@@ -429,15 +537,15 @@ static int processEmphasis3(GrowBuf &out, const char *data, int size, char c)
if (i+2<size && data[i+1]==c && data[i+2]==c)
{
- out.addStr("<em><strong>");
- processInline(out,data,i);
- out.addStr("</strong></em>");
+ m_out.addStr("<em><strong>");
+ processInline(data,i);
+ m_out.addStr("</strong></em>");
return i+3;
}
else if (i+1<size && data[i+1]==c)
{
// double symbol found, handing over to emph1
- len = processEmphasis1(out, data-2, size+2, c);
+ len = processEmphasis1(data-2, size+2, c);
if (len==0)
{
return 0;
@@ -450,7 +558,7 @@ static int processEmphasis3(GrowBuf &out, const char *data, int size, char c)
else
{
// single symbol found, handing over to emph2
- len = processEmphasis2(out, data-1, size+1, c);
+ len = processEmphasis2(data-1, size+1, c);
if (len==0)
{
return 0;
@@ -465,8 +573,9 @@ static int processEmphasis3(GrowBuf &out, const char *data, int size, char c)
}
/** Process ndash and mdashes */
-static int processNmdash(GrowBuf &out,const char *data,int off,int size)
+int Markdown::processNmdash(const char *data,int off,int size)
{
+ TRACE(data);
// precondition: data[0]=='-'
int i=1;
int count=1;
@@ -486,12 +595,12 @@ static int processNmdash(GrowBuf &out,const char *data,int off,int size)
if (count==2 && (data[2]=='>')) return 0; // end HTML comment
if (count==2 && (off<8 || qstrncmp(data-8,"operator",8)!=0)) // -- => ndash
{
- out.addStr("&ndash;");
+ m_out.addStr("&ndash;");
return 2;
}
else if (count==3) // --- => ndash
{
- out.addStr("&mdash;");
+ m_out.addStr("&mdash;");
return 3;
}
// not an ndash or mdash
@@ -499,18 +608,19 @@ static int processNmdash(GrowBuf &out,const char *data,int off,int size)
}
/** Process quoted section "...", can contain one embedded newline */
-static int processQuoted(GrowBuf &out,const char *data,int,int size)
+int Markdown::processQuoted(const char *data,int,int size)
{
+ TRACE(data);
int i=1;
int nl=0;
- while (i<size && data[i]!='"' && nl<2)
+ while (i<size && data[i]!='"' && nl<2)
{
if (data[i]=='\n') nl++;
i++;
}
if (i<size && data[i]=='"' && nl<2)
{
- out.addStr(data,i+1);
+ m_out.addStr(data,i+1);
return i+1;
}
// not a quoted section
@@ -520,8 +630,9 @@ static int processQuoted(GrowBuf &out,const char *data,int,int size)
/** Process a HTML tag. Note that <pre>..</pre> are treated specially, in
* the sense that all code inside is written unprocessed
*/
-static int processHtmlTagWrite(GrowBuf &out,const char *data,int offset,int size,bool doWrite)
+int Markdown::processHtmlTagWrite(const char *data,int offset,int size,bool doWrite)
{
+ TRACE(data);
if (offset>0 && data[-1]=='\\') return 0; // escaped <
// find the end of the html tag
@@ -543,7 +654,7 @@ static int processHtmlTagWrite(GrowBuf &out,const char *data,int offset,int size
tolower(data[i+2])=='p' && tolower(data[i+3])=='r' &&
tolower(data[i+4])=='e' && tolower(data[i+5])=='>')
{ // found </pre> tag, copy from start to end of tag
- if (doWrite) out.addStr(data,i+6);
+ if (doWrite) m_out.addStr(data,i+6);
//printf("found <pre>..</pre> [%d..%d]\n",0,i+6);
return i+6;
}
@@ -566,13 +677,13 @@ static int processHtmlTagWrite(GrowBuf &out,const char *data,int offset,int size
if (data[i]=='/' && i<size-1 && data[i+1]=='>') // <bla/>
{
//printf("Found htmlTag={%s}\n",QCString(data).left(i+2).data());
- if (doWrite) out.addStr(data,i+2);
+ if (doWrite) m_out.addStr(data,i+2);
return i+2;
}
else if (data[i]=='>') // <bla>
{
//printf("Found htmlTag={%s}\n",QCString(data).left(i+1).data());
- if (doWrite) out.addStr(data,i+1);
+ if (doWrite) m_out.addStr(data,i+1);
return i+1;
}
else if (data[i]==' ') // <bla attr=...
@@ -592,7 +703,7 @@ static int processHtmlTagWrite(GrowBuf &out,const char *data,int offset,int size
else if (!insideAttr && data[i]=='>') // found end of tag
{
//printf("Found htmlTag={%s}\n",QCString(data).left(i+1).data());
- if (doWrite) out.addStr(data,i+1);
+ if (doWrite) m_out.addStr(data,i+1);
return i+1;
}
i++;
@@ -603,13 +714,16 @@ static int processHtmlTagWrite(GrowBuf &out,const char *data,int offset,int size
//printf("Not a valid html tag\n");
return 0;
}
-static int processHtmlTag(GrowBuf &out,const char *data,int offset,int size)
+
+int Markdown::processHtmlTag(const char *data,int offset,int size)
{
- return processHtmlTagWrite(out,data,offset,size,true);
+ TRACE(data);
+ return processHtmlTagWrite(data,offset,size,true);
}
-static int processEmphasis(GrowBuf &out,const char *data,int offset,int size)
+int Markdown::processEmphasis(const char *data,int offset,int size)
{
+ TRACE(data);
if ((offset>0 && !isOpenEmphChar(-1)) || // invalid char before * or _
(size>1 && data[0]!=data[1] && !(isIdChar(1) || extraChar(1) || data[1]=='[')) || // invalid char after * or _
(size>2 && data[0]==data[1] && !(isIdChar(2) || extraChar(2) || data[2]=='['))) // invalid char after ** or __
@@ -622,8 +736,8 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size)
if (size>2 && c!='~' && data[1]!=c) // _bla or *bla
{
// whitespace cannot follow an opening emphasis
- if (data[1]==' ' || data[1]=='\n' ||
- (ret = processEmphasis1(out, data+1, size-1, c)) == 0)
+ if (data[1]==' ' || data[1]=='\n' ||
+ (ret = processEmphasis1(data+1, size-1, c)) == 0)
{
return 0;
}
@@ -631,8 +745,8 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size)
}
if (size>3 && data[1]==c && data[2]!=c) // __bla or **bla
{
- if (data[2]==' ' || data[2]=='\n' ||
- (ret = processEmphasis2(out, data+2, size-2, c)) == 0)
+ if (data[2]==' ' || data[2]=='\n' ||
+ (ret = processEmphasis2(data+2, size-2, c)) == 0)
{
return 0;
}
@@ -640,8 +754,8 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size)
}
if (size>4 && c!='~' && data[1]==c && data[2]==c && data[3]!=c) // ___bla or ***bla
{
- if (data[3]==' ' || data[3]=='\n' ||
- (ret = processEmphasis3(out, data+3, size-3, c)) == 0)
+ if (data[3]==' ' || data[3]=='\n' ||
+ (ret = processEmphasis3(data+3, size-3, c)) == 0)
{
return 0;
}
@@ -650,29 +764,36 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size)
return 0;
}
-static void writeMarkdownImage(GrowBuf &out, const char *fmt, bool explicitTitle, QCString title, QCString content, QCString link, FileDef *fd)
+void Markdown::writeMarkdownImage(const char *fmt, bool explicitTitle,
+ const QCString &title, const QCString &content,
+ const QCString &link, const FileDef *fd)
{
- out.addStr("@image ");
- out.addStr(fmt);
- out.addStr(" ");
- out.addStr(link.mid(fd ? 0 : 5));
+ m_out.addStr("@image{inline} ");
+ m_out.addStr(fmt);
+ m_out.addStr(" ");
+ m_out.addStr(link.mid(fd ? 0 : 5));
if (!explicitTitle && !content.isEmpty())
{
- out.addStr(" \"");
- out.addStr(content);
- out.addStr("\"");
+ m_out.addStr(" \"");
+ m_out.addStr(content);
+ m_out.addStr("\"");
}
else if ((content.isEmpty() || explicitTitle) && !title.isEmpty())
{
- out.addStr(" \"");
- out.addStr(title);
- out.addStr("\"");
+ m_out.addStr(" \"");
+ m_out.addStr(title);
+ m_out.addStr("\"");
}
- out.addStr("\n");
+ else
+ {
+ m_out.addStr(" ");// so the line break will not be part of the image name
+ }
+ m_out.addStr("\\ilinebr");
}
-static int processLink(GrowBuf &out,const char *data,int,int size)
+int Markdown::processLink(const char *data,int,int size)
{
+ TRACE(data);
QCString content;
QCString link;
QCString title;
@@ -691,6 +812,7 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
}
contentStart=i;
int level=1;
+ int nlTotal=0;
int nl=0;
// find the matching ]
while (i<size)
@@ -714,6 +836,8 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
}
i++;
}
+ nlTotal += nl;
+ nl = 0;
if (i>=size) return 0; // premature end of comment -> no link
contentEnd=i;
convertStringFragment(content,data+contentStart,contentEnd-contentStart);
@@ -726,9 +850,12 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
if (i<size && data[i]=='\n') // one newline allowed here
{
i++;
+ nl++;
// skip more whitespace
while (i<size && data[i]==' ') i++;
}
+ nlTotal += nl;
+ nl = 0;
bool explicitTitle=FALSE;
if (i<size && data[i]=='(') // inline link
@@ -737,7 +864,6 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
while (i<size && data[i]==' ') i++;
if (i<size && data[i]=='<') i++;
linkStart=i;
- nl=0;
int braceCount=1;
while (i<size && data[i]!='\'' && data[i]!='"' && braceCount>0)
{
@@ -759,6 +885,8 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
i++;
}
}
+ nlTotal += nl;
+ nl = 0;
if (i>=size || data[i]=='\n') return 0;
convertStringFragment(link,data+linkStart,i-linkStart);
link = link.stripWhiteSpace();
@@ -826,14 +954,15 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
link=content;
}
// lookup reference
- LinkRef *lr = g_linkRefs.find(link.lower());
- if (lr) // found it
+ QCString link_lower = link.lower();
+ auto lr_it=m_linkRefs.find(link_lower.str());
+ if (lr_it!=m_linkRefs.end()) // found it
{
- link = lr->link;
- title = lr->title;
+ link = lr_it->second.link;
+ title = lr_it->second.title;
//printf("processLink: ref: link={%s} title={%s}\n",link.data(),title.data());
}
- else // reference not found!
+ else // reference not found!
{
//printf("processLink: ref {%s} do not exist\n",link.lower().data());
return 0;
@@ -842,12 +971,13 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
}
else if (i<size && data[i]!=':' && !content.isEmpty()) // minimal link ref notation [some id]
{
- LinkRef *lr = g_linkRefs.find(content.lower());
+ QCString content_lower = content.lower();
+ auto lr_it = m_linkRefs.find(content_lower.str());
//printf("processLink: minimal link {%s} lr=%p",content.data(),lr);
- if (lr) // found it
+ if (lr_it!=m_linkRefs.end()) // found it
{
- link = lr->link;
- title = lr->title;
+ link = lr_it->second.link;
+ title = lr_it->second.title;
explicitTitle=TRUE;
i=contentEnd;
}
@@ -866,85 +996,104 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
{
return 0;
}
+ nlTotal += nl;
+ nl = 0;
if (isToc) // special case for [TOC]
{
- int level = Config_getInt(TOC_INCLUDE_HEADINGS);
- if (level > 0 && level <=5)
+ int toc_level = Config_getInt(TOC_INCLUDE_HEADINGS);
+ if (toc_level > 0 && toc_level <=5)
{
- char levStr[10];
- sprintf(levStr,"%d",level);
- out.addStr("@tableofcontents{html:");
- out.addStr(levStr);
- out.addStr("}");
+ m_out.addStr("@tableofcontents{html:");
+ m_out.addStr(QCString().setNum(toc_level));
+ m_out.addStr("}");
}
}
- else if (isImageLink)
+ else if (isImageLink)
{
bool ambig;
FileDef *fd=0;
if (link.find("@ref ")!=-1 || link.find("\\ref ")!=-1 ||
- (fd=findFileDef(Doxygen::imageNameDict,link,ambig)))
+ (fd=findFileDef(Doxygen::imageNameLinkedMap,link,ambig)))
// assume doxygen symbol link or local image link
{
- writeMarkdownImage(out, "html", explicitTitle, title, content, link, fd);
- writeMarkdownImage(out, "latex", explicitTitle, title, content, link, fd);
- writeMarkdownImage(out, "rtf", explicitTitle, title, content, link, fd);
- writeMarkdownImage(out, "docbook", explicitTitle, title, content, link, fd);
+ writeMarkdownImage("html", explicitTitle, title, content, link, fd);
+ writeMarkdownImage("latex", explicitTitle, title, content, link, fd);
+ writeMarkdownImage("rtf", explicitTitle, title, content, link, fd);
+ writeMarkdownImage("docbook", explicitTitle, title, content, link, fd);
}
else
{
- out.addStr("<img src=\"");
- out.addStr(link);
- out.addStr("\" alt=\"");
- out.addStr(content);
- out.addStr("\"");
+ m_out.addStr("<img src=\"");
+ m_out.addStr(link);
+ m_out.addStr("\" alt=\"");
+ m_out.addStr(content);
+ m_out.addStr("\"");
if (!title.isEmpty())
{
- out.addStr(" title=\"");
- out.addStr(substitute(title.simplifyWhiteSpace(),"\"","&quot;"));
- out.addStr("\"");
+ m_out.addStr(" title=\"");
+ m_out.addStr(substitute(title.simplifyWhiteSpace(),"\"","&quot;"));
+ m_out.addStr("\"");
}
- out.addStr("/>");
+ m_out.addStr("/>");
}
}
else
{
SrcLangExt lang = getLanguageFromFileName(link);
int lp=-1;
- if ((lp=link.find("@ref "))!=-1 || (lp=link.find("\\ref "))!=-1 || (lang==SrcLangExt_Markdown && !isURL(link)))
+ if ((lp=link.find("@ref "))!=-1 || (lp=link.find("\\ref "))!=-1 || (lang==SrcLangExt_Markdown && !isURL(link)))
// assume doxygen symbol link
{
if (lp==-1) // link to markdown page
{
- out.addStr("@ref ");
+ m_out.addStr("@ref ");
+ if (!(Portable::isAbsolutePath(link) || isURL(link)))
+ {
+ QFileInfo forg(link);
+ if (forg.exists() && forg.isReadable())
+ {
+ link = forg.absFilePath().data();
+ }
+ else if (!(forg.exists() && forg.isReadable()))
+ {
+ QFileInfo fi(m_fileName);
+ QCString mdFile = m_fileName.left(m_fileName.length()-fi.fileName().length()) + link;
+ QFileInfo fmd(mdFile);
+ if (fmd.exists() && fmd.isReadable())
+ {
+ link = fmd.absFilePath().data();
+ }
+ }
+ }
}
- out.addStr(link);
- out.addStr(" \"");
+ m_out.addStr(link);
+ m_out.addStr(" \"");
if (explicitTitle && !title.isEmpty())
{
- out.addStr(title);
+ m_out.addStr(title);
}
else
{
- out.addStr(content);
+ m_out.addStr(content);
}
- out.addStr("\"");
+ m_out.addStr("\"");
}
- else if (link.find('/')!=-1 || link.find('.')!=-1 || link.find('#')!=-1)
+ else if (link.find('/')!=-1 || link.find('.')!=-1 || link.find('#')!=-1)
{ // file/url link
- out.addStr("<a href=\"");
- out.addStr(link);
- out.addStr("\"");
+ m_out.addStr("<a href=\"");
+ m_out.addStr(link);
+ m_out.addStr("\"");
+ for (int ii = 0; ii < nlTotal; ii++) m_out.addStr("\n");
if (!title.isEmpty())
{
- out.addStr(" title=\"");
- out.addStr(substitute(title.simplifyWhiteSpace(),"\"","&quot;"));
- out.addStr("\"");
+ m_out.addStr(" title=\"");
+ m_out.addStr(substitute(title.simplifyWhiteSpace(),"\"","&quot;"));
+ m_out.addStr("\"");
}
- out.addStr(">");
+ m_out.addStr(">");
content = content.simplifyWhiteSpace();
- processInline(out,content,content.length());
- out.addStr("</a>");
+ processInline(content,content.length());
+ m_out.addStr("</a>");
}
else // avoid link to e.g. F[x](y)
{
@@ -956,8 +1105,9 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
}
/** '`' parsing a code span (assuming codespan != 0) */
-static int processCodeSpan(GrowBuf &out, const char *data, int /*offset*/, int size)
+int Markdown::processCodeSpan(const char *data, int /*offset*/, int size)
{
+ TRACE(data);
int end, nb = 0, i, f_begin, f_end;
/* counting the number of backticks in the delimiter */
@@ -971,9 +1121,9 @@ static int processCodeSpan(GrowBuf &out, const char *data, int /*offset*/, int s
int nl=0;
for (end=nb; end<size && i<nb && nl<2; end++)
{
- if (data[end]=='`')
+ if (data[end]=='`')
{
- i++;
+ i++;
}
else if (data[end]=='\n')
{
@@ -984,14 +1134,14 @@ static int processCodeSpan(GrowBuf &out, const char *data, int /*offset*/, int s
{ // look for quoted strings like 'some word', but skip strings like `it's cool`
QCString textFragment;
convertStringFragment(textFragment,data+nb,end-nb);
- out.addStr("&lsquo;");
- out.addStr(textFragment);
- out.addStr("&rsquo;");
+ m_out.addStr("&lsquo;");
+ m_out.addStr(textFragment);
+ m_out.addStr("&rsquo;");
return end+1;
}
else
{
- i=0;
+ i=0;
}
}
if (i < nb && end >= size)
@@ -1022,32 +1172,35 @@ static int processCodeSpan(GrowBuf &out, const char *data, int /*offset*/, int s
{
QCString codeFragment;
convertStringFragment(codeFragment,data+f_begin,f_end-f_begin);
- out.addStr("<tt>");
- //out.addStr(convertToHtml(codeFragment,TRUE));
- out.addStr(escapeSpecialChars(codeFragment));
- out.addStr("</tt>");
+ m_out.addStr("<tt>");
+ //m_out.addStr(convertToHtml(codeFragment,TRUE));
+ m_out.addStr(escapeSpecialChars(codeFragment));
+ m_out.addStr("</tt>");
}
return end;
}
-static void addStrEscapeUtf8Nbsp(GrowBuf &out,const char *s,int len)
+void Markdown::addStrEscapeUtf8Nbsp(const char *s,int len)
{
+ TRACE(s);
if (Portable::strnstr(s,g_doxy_nsbp,len)==0) // no escape needed -> fast
{
- out.addStr(s,len);
+ m_out.addStr(s,len);
}
else // escape needed -> slow
{
- out.addStr(substitute(QCString(s).left(len),g_doxy_nsbp,g_utf8_nbsp));
+ m_out.addStr(substitute(QCString(s).left(len),g_doxy_nsbp,(const char *)g_utf8_nbsp));
}
}
-static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int size)
+int Markdown::processSpecialCommand(const char *data, int offset, int size)
{
+ TRACE(data);
int i=1;
QCString endBlockName = isBlockCommand(data,offset,size);
if (!endBlockName.isEmpty())
{
+ TRACE_MORE("endBlockName=%s\n",qPrint(endBlockName));
int l = endBlockName.length();
while (i<size-l)
{
@@ -1057,7 +1210,8 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int
if (qstrncmp(&data[i+1],endBlockName,l)==0)
{
//printf("found end at %d\n",i);
- addStrEscapeUtf8Nbsp(out,data,i+1+l);
+ addStrEscapeUtf8Nbsp(data,i+1+l);
+ TRACE_MORE("result=%d\n",i+1+l);
return i+1+l;
}
}
@@ -1069,34 +1223,39 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int
char c=data[1];
if (c=='[' || c==']' || c=='*' || c=='!' || c=='(' || c==')' || c=='`' || c=='_')
{
- out.addChar(data[1]);
+ m_out.addChar(data[1]);
+ TRACE_MORE("result=2\n");
return 2;
}
else if (c=='-' && size>3 && data[2]=='-' && data[3]=='-') // \---
{
- out.addStr(&data[1],3);
+ m_out.addStr(&data[1],3);
+ TRACE_MORE("result=4\n");
return 4;
}
else if (c=='-' && size>2 && data[2]=='-') // \--
{
- out.addStr(&data[1],2);
+ m_out.addStr(&data[1],2);
+ TRACE_MORE("result=3\n");
return 3;
}
}
+ TRACE_MORE("result=0\n");
return 0;
}
-static void processInline(GrowBuf &out,const char *data,int size)
+void Markdown::processInline(const char *data,int size)
{
+ TRACE(data);
int i=0, end=0;
- action_t action = 0;
+ Action_t action;
while (i<size)
{
- while (end<size && ((action=g_actions[(uchar)data[end]])==0)) end++;
- out.addStr(data+i,end-i);
+ while (end<size && ((action=m_actions[(uchar)data[end]])==0)) end++;
+ m_out.addStr(data+i,end-i);
if (end>=size) break;
i=end;
- end = action(out,data+i,i,size-i);
+ end = action(data+i,i,size-i);
if (end<=0)
{
end=i+1-end;
@@ -1110,8 +1269,9 @@ static void processInline(GrowBuf &out,const char *data,int size)
}
/** returns whether the line is a setext-style hdr underline */
-static int isHeaderline(const char *data, int size, bool allowAdjustLevel)
+int Markdown::isHeaderline(const char *data, int size, bool allowAdjustLevel)
{
+ TRACE(data);
int i=0, c=0;
while (i<size && data[i]==' ') i++;
@@ -1121,44 +1281,45 @@ static int isHeaderline(const char *data, int size, bool allowAdjustLevel)
while (i<size && data[i]=='=') i++,c++;
while (i<size && data[i]==' ') i++;
int level = (c>1 && (i>=size || data[i]=='\n')) ? 1 : 0;
- if (allowAdjustLevel && level==1 && g_indentLevel==-1)
+ if (allowAdjustLevel && level==1 && m_indentLevel==-1)
{
// In case a page starts with a header line we use it as title, promoting it to @page.
- // We set g_indentLevel to -1 to promoting the other sections if they have a deeper
+ // We set g_indentLevel to -1 to promoting the other sections if they have a deeper
// nesting level than the page header, i.e. @section..@subsection becomes @page..@section.
- // In case a section at the same level is found (@section..@section) however we need
+ // In case a section at the same level is found (@section..@section) however we need
// to undo this (and the result will be @page..@section).
- g_indentLevel=0;
+ m_indentLevel=0;
}
- return g_indentLevel+level;
+ return m_indentLevel+level;
}
// test of level 2 header
if (data[i]=='-')
{
while (i<size && data[i]=='-') i++,c++;
while (i<size && data[i]==' ') i++;
- return (c>1 && (i>=size || data[i]=='\n')) ? g_indentLevel+2 : 0;
+ return (c>1 && (i>=size || data[i]=='\n')) ? m_indentLevel+2 : 0;
}
return 0;
}
/** returns TRUE if this line starts a block quote */
-static bool isBlockQuote(const char *data,int size,int indent)
+bool isBlockQuote(const char *data,int size,int indent)
{
+ TRACE(data);
int i = 0;
while (i<size && data[i]==' ') i++;
if (i<indent+codeBlockIndent) // could be a quotation
{
// count >'s and skip spaces
int level=0;
- while (i<size && (data[i]=='>' || data[i]==' '))
+ while (i<size && (data[i]=='>' || data[i]==' '))
{
if (data[i]=='>') level++;
i++;
}
- // last characters should be a space or newline,
+ // last characters should be a space or newline,
// so a line starting with >= does not match
- return level>0 && i<size && ((data[i-1]==' ') || data[i]=='\n');
+ return level>0 && i<size && ((data[i-1]==' ') || data[i]=='\n');
}
else // too much indentation -> code block
{
@@ -1171,6 +1332,7 @@ static bool isBlockQuote(const char *data,int size,int indent)
static int isLinkRef(const char *data,int size,
QCString &refid,QCString &link,QCString &title)
{
+ TRACE(data);
//printf("isLinkRef data={%s}\n",data);
// format: start with [some text]:
int i = 0;
@@ -1224,7 +1386,7 @@ static int isLinkRef(const char *data,int size,
i++;
while (i<size && data[i]==' ') i++;
}
- if (i>=size)
+ if (i>=size)
{
//printf("end of isLinkRef while looking for title! i=%d\n",i);
return i; // end of buffer while looking for the optional title
@@ -1260,12 +1422,13 @@ static int isLinkRef(const char *data,int size,
static int isHRuler(const char *data,int size)
{
+ TRACE(data);
int i=0;
if (size>0 && data[size-1]=='\n') size--; // ignore newline character
while (i<size && data[i]==' ') i++;
if (i>=size) return 0; // empty line
char c=data[i];
- if (c!='*' && c!='-' && c!='_')
+ if (c!='*' && c!='-' && c!='_')
{
return 0; // not a hrule character
}
@@ -1287,6 +1450,7 @@ static int isHRuler(const char *data,int size)
static QCString extractTitleId(QCString &title, int level)
{
+ TRACE(title.data());
//static QRegExp r1("^[a-z_A-Z][a-z_A-Z0-9\\-]*:");
static QRegExp r2("\\{#[a-z_A-Z][a-z_A-Z0-9\\-]*\\}");
int l=0;
@@ -1300,7 +1464,7 @@ static QCString extractTitleId(QCString &title, int level)
}
if ((level > 0) && (level <= Config_getInt(TOC_INCLUDE_HEADINGS)))
{
- static int autoId = 0;
+ static AtomicInt autoId { 0 };
QCString id;
id.sprintf("autotoc_md%d",autoId++);
//printf("auto-generated id='%s' title='%s'\n",id.data(),title.data());
@@ -1311,21 +1475,22 @@ static QCString extractTitleId(QCString &title, int level)
}
-static int isAtxHeader(const char *data,int size,
+int Markdown::isAtxHeader(const char *data,int size,
QCString &header,QCString &id,bool allowAdjustLevel)
{
+ TRACE(data);
int i = 0, end;
int level = 0, blanks=0;
// find start of header text and determine heading level
while (i<size && data[i]==' ') i++;
- if (i>=size || data[i]!='#')
+ if (i>=size || data[i]!='#')
{
return 0;
}
while (i<size && level<6 && data[i]=='#') i++,level++;
while (i<size && data[i]==' ') i++,blanks++;
- if (level==1 && blanks==0)
+ if (level==1 && blanks==0)
{
return 0; // special case to prevent #someid seen as a header (see bug 671395)
}
@@ -1345,7 +1510,7 @@ static int isAtxHeader(const char *data,int size,
header=header.left(i+1);
}
- if (allowAdjustLevel && level==1 && g_indentLevel==-1)
+ if (allowAdjustLevel && level==1 && m_indentLevel==-1)
{
// in case we find a `# Section` on a markdown page that started with the same level
// header, we no longer need to artificially decrease the paragraph level.
@@ -1365,13 +1530,14 @@ static int isAtxHeader(const char *data,int size,
// @section autotoc_md1 Heading 2
// -------------------
- g_indentLevel=0;
+ m_indentLevel=0;
}
- return level+g_indentLevel;
+ return level+m_indentLevel;
}
static int isEmptyLine(const char *data,int size)
{
+ TRACE(data);
int i=0;
while (i<size)
{
@@ -1392,12 +1558,13 @@ static int isEmptyLine(const char *data,int size)
// such as -, -#, *, +, 1., and <li>
static int computeIndentExcludingListMarkers(const char *data,int size)
{
+ TRACE(data);
int i=0;
int indent=0;
bool isDigit=FALSE;
bool isLi=FALSE;
bool listMarkerSkipped=FALSE;
- while (i<size &&
+ while (i<size &&
(data[i]==' ' || // space
(!listMarkerSkipped && // first list marker
(data[i]=='+' || data[i]=='-' || data[i]=='*' || // unordered list char
@@ -1407,7 +1574,7 @@ static int computeIndentExcludingListMarkers(const char *data,int size)
)
)
)
- )
+ )
{
if (isDigit) // skip over ordered list marker '10. '
{
@@ -1460,6 +1627,7 @@ static int computeIndentExcludingListMarkers(const char *data,int size)
static bool isFencedCodeBlock(const char *data,int size,int refIndent,
QCString &lang,int &start,int &end,int &offset)
{
+ TRACE(data);
// rules: at least 3 ~~~, end of the block same amount of ~~~'s, otherwise
// return FALSE
int i=0;
@@ -1481,14 +1649,17 @@ static bool isFencedCodeBlock(const char *data,int size,int refIndent,
{
if (data[i]==tildaChar)
{
- end=i-1;
+ end=i;
int endTildes=0;
while (i<size && data[i]==tildaChar) endTildes++,i++;
while (i<size && data[i]==' ') i++;
- if (i==size || data[i]=='\n')
+ if (i==size || data[i]=='\n')
{
- offset=i;
- return endTildes==startTildes;
+ if (endTildes==startTildes)
+ {
+ offset=i;
+ return TRUE;
+ }
}
}
i++;
@@ -1498,6 +1669,7 @@ static bool isFencedCodeBlock(const char *data,int size,int refIndent,
static bool isCodeBlock(const char *data,int offset,int size,int &indent)
{
+ TRACE(data);
//printf("<isCodeBlock(offset=%d,size=%d,indent=%d)\n",offset,size,indent);
// determine the indent of this line
int i=0;
@@ -1514,14 +1686,19 @@ static bool isCodeBlock(const char *data,int offset,int size,int &indent)
//printf("only spaces at the end of a comment block\n");
return FALSE;
}
-
+
i=offset;
int nl=0;
int nl_pos[3];
// search back 3 lines and remember the start of lines -1 and -2
while (i>0 && nl<3)
{
- if (data[i-offset-1]=='\n') nl_pos[nl++]=i-offset;
+ int j = i-offset-1;
+ int nl_size = isNewline(data+j);
+ if (nl_size>0)
+ {
+ nl_pos[nl++]=j+nl_size;
+ }
i--;
}
@@ -1544,9 +1721,9 @@ static bool isCodeBlock(const char *data,int offset,int size,int &indent)
// determine the indent of line -2
indent=computeIndentExcludingListMarkers(data+nl_pos[2],nl_pos[1]-nl_pos[2]);
-
- //printf(">isCodeBlock local_indent %d>=%d+4=%d\n",
- // indent0,indent2,indent0>=indent2+4);
+
+ //printf(">isCodeBlock local_indent %d>=%d+%d=%d\n",
+ // indent0,indent,codeBlockIndent,indent0>=indent+codeBlockIndent);
// if the difference is >4 spaces -> code block
return indent0>=indent+codeBlockIndent;
}
@@ -1574,6 +1751,7 @@ static bool isCodeBlock(const char *data,int offset,int size,int &indent)
*/
int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
{
+ TRACE(data);
int i=0,n=0;
int eol;
// find start character of the table line
@@ -1582,8 +1760,12 @@ int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
start = i;
// find end character of the table line
- while (i<size && data[i]!='\n') i++;
- eol=i+1;
+ //while (i<size && data[i]!='\n') i++;
+ //eol=i+1;
+ int j = 0;
+ while (i<size && (j = isNewline(data + i))==0) i++;
+ eol=i+j;
+
i--;
while (i>0 && data[i]==' ') i--;
if (i>0 && data[i-1]!='\\' && data[i]=='|') i--,n++; // trailing or escaped | does not count
@@ -1613,11 +1795,12 @@ int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
/** Returns TRUE iff data points to the start of a table block */
static bool isTableBlock(const char *data,int size)
{
+ TRACE(data);
int cc0,start,end;
// the first line should have at least two columns separated by '|'
int i = findTableColumns(data,size,start,end,cc0);
- if (i>=size || cc0<1)
+ if (i>=size || cc0<1)
{
//printf("isTableBlock: no |'s in the header\n");
return FALSE;
@@ -1649,8 +1832,9 @@ static bool isTableBlock(const char *data,int size)
return cc1==cc2;
}
-static int writeTableBlock(GrowBuf &out,const char *data,int size)
+int Markdown::writeTableBlock(const char *data,int size)
{
+ TRACE(data);
int i=0,j,k;
int columns,start,end,cc;
@@ -1659,17 +1843,10 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
int headerStart = start;
int headerEnd = end;
-#ifdef USE_ORIGINAL_TABLES
- out.addStr("<table>");
-
- // write table header, in range [start..end]
- out.addStr("<tr>");
-#endif
-
// read cell alignments
int ret = findTableColumns(data+i,size-i,start,end,cc);
k=0;
- Alignment *columnAlignment = new Alignment[columns];
+ std::vector<int> columnAlignment(columns);
bool leftMarker=FALSE,rightMarker=FALSE;
bool startFound=FALSE;
@@ -1679,12 +1856,12 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
if (!startFound)
{
if (data[j]==':') { leftMarker=TRUE; startFound=TRUE; }
- if (data[j]=='-') startFound=TRUE;
+ if (data[j]=='-') startFound=TRUE;
//printf(" data[%d]=%c startFound=%d\n",j,data[j],startFound);
}
if (data[j]=='-') rightMarker=FALSE;
else if (data[j]==':') rightMarker=TRUE;
- if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\')))
+ if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\')))
{
if (k<columns)
{
@@ -1706,142 +1883,62 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
// proceed to next line
i+=ret;
-#ifdef USE_ORIGINAL_TABLES
-
- int m=headerStart;
- for (k=0;k<columns;k++)
- {
- out.addStr("<th");
- switch (columnAlignment[k])
- {
- case AlignLeft: out.addStr(" align=\"left\""); break;
- case AlignRight: out.addStr(" align=\"right\""); break;
- case AlignCenter: out.addStr(" align=\"center\""); break;
- case AlignNone: break;
- }
- out.addStr(">");
- while (m<=headerEnd && (data[m]!='|' || (m>0 && data[m-1]=='\\')))
- {
- out.addChar(data[m++]);
- }
- m++;
- }
- out.addStr("\n</th>\n");
-
- // write table cells
- while (i<size)
- {
- int ret = findTableColumns(data+i,size-i,start,end,cc);
- //printf("findTableColumns cc=%d\n",cc);
- if (cc!=columns) break; // end of table
-
- out.addStr("<tr>");
- j=start+i;
- int columnStart=j;
- k=0;
- while (j<=end+i)
- {
- if (j==columnStart)
- {
- out.addStr("<td");
- switch (columnAlignment[k])
- {
- case AlignLeft: out.addStr(" align=\"left\""); break;
- case AlignRight: out.addStr(" align=\"right\""); break;
- case AlignCenter: out.addStr(" align=\"center\""); break;
- case AlignNone: break;
- }
- out.addStr(">");
- }
- if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\')))
- {
- columnStart=j+1;
- k++;
- }
- else
- {
- out.addChar(data[j]);
- }
- j++;
- }
- out.addChar('\n');
-
- // proceed to next line
- i+=ret;
- }
-
- out.addStr("</table> ");
-#else
// Store the table cell information by row then column. This
// allows us to handle row spanning.
- QVector<QVector<TableCell> > tableContents;
- tableContents.setAutoDelete(TRUE);
+ std::vector<std::vector<TableCell> > tableContents;
int m=headerStart;
- QVector<TableCell> *headerContents = new QVector<TableCell>(columns);
- headerContents->setAutoDelete(TRUE);
+ std::vector<TableCell> headerContents(columns);
for (k=0;k<columns;k++)
{
- headerContents->insert(k, new TableCell);
while (m<=headerEnd && (data[m]!='|' || (m>0 && data[m-1]=='\\')))
{
- headerContents->at(k)->cellText += data[m++];
+ headerContents[k].cellText += data[m++];
}
m++;
// do the column span test before stripping white space
// || is spanning columns, | | is not
- headerContents->at(k)->colSpan = headerContents->at(k)->cellText.isEmpty();
- headerContents->at(k)->cellText = headerContents->at(k)->cellText.stripWhiteSpace();
+ headerContents[k].colSpan = headerContents[k].cellText.isEmpty();
+ headerContents[k].cellText = headerContents[k].cellText.stripWhiteSpace();
}
- // qvector doesn't have an append like std::vector, so we gotta do
- // extra work
- tableContents.resize(1);
- tableContents.insert(0, headerContents);
+ tableContents.push_back(headerContents);
// write table cells
- int rowNum = 1;
while (i<size)
{
- int ret = findTableColumns(data+i,size-i,start,end,cc);
+ ret = findTableColumns(data+i,size-i,start,end,cc);
if (cc!=columns) break; // end of table
j=start+i;
k=0;
- QVector<TableCell> *rowContents = new QVector<TableCell>(columns);
- rowContents->setAutoDelete(TRUE);
- rowContents->insert(k, new TableCell);
+ std::vector<TableCell> rowContents(columns);
while (j<=end+i)
{
- if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\')))
+ if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\')))
{
// do the column span test before stripping white space
// || is spanning columns, | | is not
- rowContents->at(k)->colSpan = rowContents->at(k)->cellText.isEmpty();
- rowContents->at(k)->cellText = rowContents->at(k)->cellText.stripWhiteSpace();
+ rowContents[k].colSpan = rowContents[k].cellText.isEmpty();
+ rowContents[k].cellText = rowContents[k].cellText.stripWhiteSpace();
k++;
- rowContents->insert(k, new TableCell);
- } // if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\')))
+ } // if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\')))
else
{
- rowContents->at(k)->cellText += data[j];
+ rowContents[k].cellText += data[j];
} // else { if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\'))) }
j++;
} // while (j<=end+i)
// do the column span test before stripping white space
// || is spanning columns, | | is not
- rowContents->at(k)->colSpan = rowContents->at(k)->cellText.isEmpty();
- rowContents->at(k)->cellText = rowContents->at(k)->cellText.stripWhiteSpace();
- // qvector doesn't have an append like std::vector, so we gotta do
- // extra work
- tableContents.resize(tableContents.size()+1);
- tableContents.insert(rowNum++, rowContents);
+ rowContents[k].colSpan = rowContents[k].cellText.isEmpty();
+ rowContents[k].cellText = rowContents[k].cellText.stripWhiteSpace();
+ tableContents.push_back(rowContents);
// proceed to next line
i+=ret;
}
-
- out.addStr("<table class=\"markdownTable\">");
+ m_out.addStr("<table class=\"markdownTable\">");
QCString cellTag("th"), cellClass("class=\"markdownTableHead");
for (unsigned row = 0; row < tableContents.size(); row++)
{
@@ -1849,58 +1946,57 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
{
if (row % 2)
{
- out.addStr("<tr class=\"markdownTableRowOdd\">");
+ m_out.addStr("\n<tr class=\"markdownTableRowOdd\">");
}
else
{
- out.addStr("<tr class=\"markdownTableRowEven\">");
+ m_out.addStr("\n<tr class=\"markdownTableRowEven\">");
}
}
else
{
- out.addStr(" <tr class=\"markdownTableHead\">");
+ m_out.addStr("\n <tr class=\"markdownTableHead\">");
}
for (int c = 0; c < columns; c++)
{
// save the cell text for use after column span computation
- QCString cellText(tableContents[row]->at(c)->cellText);
+ QCString cellText(tableContents[row][c].cellText);
// Row span handling. Spanning rows will contain a caret ('^').
// If the current cell contains just a caret, this is part of an
// earlier row's span and the cell should not be added to the
// output.
- if (tableContents[row]->at(c)->cellText == "^")
+ if (tableContents[row][c].cellText == "^")
continue;
unsigned rowSpan = 1, spanRow = row+1;
while ((spanRow < tableContents.size()) &&
- (tableContents[spanRow]->at(c)->cellText == "^"))
+ (tableContents[spanRow][c].cellText == "^"))
{
spanRow++;
rowSpan++;
}
- out.addStr(" <" + cellTag + " " + cellClass);
+ m_out.addStr(" <" + cellTag + " " + cellClass);
// use appropriate alignment style
switch (columnAlignment[c])
{
- case AlignLeft: out.addStr("Left\""); break;
- case AlignRight: out.addStr("Right\""); break;
- case AlignCenter: out.addStr("Center\""); break;
- case AlignNone: out.addStr("None\""); break;
+ case AlignLeft: m_out.addStr("Left\""); break;
+ case AlignRight: m_out.addStr("Right\""); break;
+ case AlignCenter: m_out.addStr("Center\""); break;
+ case AlignNone: m_out.addStr("None\""); break;
}
if (rowSpan > 1)
{
QCString spanStr;
spanStr.setNum(rowSpan);
- out.addStr(" rowspan=\"" + spanStr + "\"");
+ m_out.addStr(" rowspan=\"" + spanStr + "\"");
}
// Column span handling, assumes that column spans will have
// empty strings, which would indicate the sequence "||", used
// to signify spanning columns.
unsigned colSpan = 1;
- while ((c < columns-1) &&
- tableContents[row]->at(c+1)->colSpan)
+ while ((c < columns-1) && tableContents[row][c+1].colSpan)
{
c++;
colSpan++;
@@ -1909,26 +2005,25 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
{
QCString spanStr;
spanStr.setNum(colSpan);
- out.addStr(" colspan=\"" + spanStr + "\"");
+ m_out.addStr(" colspan=\"" + spanStr + "\"");
}
// need at least one space on either side of the cell text in
// order for doxygen to do other formatting
- out.addStr("> " + cellText + "</" + cellTag + ">");
+ m_out.addStr("> " + cellText + " \\ilinebr </" + cellTag + ">");
}
cellTag = "td";
cellClass = "class=\"markdownTableBody";
- out.addStr(" </tr>\n");
+ m_out.addStr(" </tr>");
}
- out.addStr("</table>\n");
-#endif
+ m_out.addStr("</table>\n");
- delete[] columnAlignment;
return i;
}
static int hasLineBreak(const char *data,int size)
{
+ TRACE(data);
int i=0;
int j=0;
// search for end of line and also check if it is not a completely blank
@@ -1943,65 +2038,66 @@ static int hasLineBreak(const char *data,int size)
}
-void writeOneLineHeaderOrRuler(GrowBuf &out,const char *data,int size)
+void Markdown::writeOneLineHeaderOrRuler(const char *data,int size)
{
+ TRACE(data);
int level;
QCString header;
QCString id;
if (isHRuler(data,size))
{
- out.addStr("\n<hr>\n");
+ m_out.addStr("<hr>\n");
}
else if ((level=isAtxHeader(data,size,header,id,TRUE)))
{
QCString hTag;
if (level<5 && !id.isEmpty())
{
- SectionInfo::SectionType type = SectionInfo::Anchor;
switch(level)
{
- case 1: out.addStr("@section ");
- type=SectionInfo::Section;
+ case 1: m_out.addStr("@section ");
break;
- case 2: out.addStr("@subsection ");
- type=SectionInfo::Subsection;
+ case 2: m_out.addStr("@subsection ");
break;
- case 3: out.addStr("@subsubsection ");
- type=SectionInfo::Subsubsection;
+ case 3: m_out.addStr("@subsubsection ");
break;
- default: out.addStr("@paragraph ");
- type=SectionInfo::Paragraph;
+ default: m_out.addStr("@paragraph ");
break;
}
- out.addStr(id);
- out.addStr(" ");
- out.addStr(header);
- out.addStr("\n");
+ m_out.addStr(id);
+ m_out.addStr(" ");
+ m_out.addStr(header);
+ m_out.addStr("\n");
}
else
{
if (!id.isEmpty())
{
- out.addStr("\\anchor "+id+"\n");
+ m_out.addStr("\\anchor "+id+"\\ilinebr ");
}
hTag.sprintf("h%d",level);
- out.addStr("<"+hTag+">");
- out.addStr(header);
- out.addStr("</"+hTag+">\n");
+ m_out.addStr("<"+hTag+">");
+ m_out.addStr(header);
+ m_out.addStr("</"+hTag+">\n");
}
}
- else // nothing interesting -> just output the line
+ else if (size>0) // nothing interesting -> just output the line
{
- out.addStr(data,size);
+ int tmpSize = size;
+ if (data[size-1] == '\n') tmpSize--;
+ m_out.addStr(data,tmpSize);
+
if (hasLineBreak(data,size))
{
- out.addStr("<br>\n");
+ m_out.addStr("<br>");
}
+ if (tmpSize != size) m_out.addChar('\n');
}
}
-static int writeBlockQuote(GrowBuf &out,const char *data,int size)
+int Markdown::writeBlockQuote(const char *data,int size)
{
+ TRACE(data);
int l;
int i=0;
int curLevel=0;
@@ -2021,7 +2117,7 @@ static int writeBlockQuote(GrowBuf &out,const char *data,int size)
else if (j>0 && data[j-1]=='>') indent=j+1;
j++;
}
- if (j>0 && data[j-1]=='>' &&
+ if (j>0 && data[j-1]=='>' &&
!(j==size || data[j]=='\n')) // disqualify last > if not followed by space
{
indent--;
@@ -2031,36 +2127,38 @@ static int writeBlockQuote(GrowBuf &out,const char *data,int size)
{
for (l=curLevel;l<level;l++)
{
- out.addStr("<blockquote>\n");
+ m_out.addStr("<blockquote>");
}
}
else if (level<curLevel) // quote level decreased => add end markers
{
for (l=level;l<curLevel;l++)
{
- out.addStr("</blockquote>\n");
+ m_out.addStr("</blockquote>");
}
}
curLevel=level;
if (level==0) break; // end of quote block
// copy line without quotation marks
- out.addStr(data+indent,end-indent);
+ m_out.addStr(data+indent,end-indent);
// proceed with next line
i=end;
}
// end of comment within blockquote => add end markers
for (l=0;l<curLevel;l++)
{
- out.addStr("</blockquote>\n");
+ m_out.addStr("</blockquote>");
}
return i;
}
-static int writeCodeBlock(GrowBuf &out,const char *data,int size,int refIndent)
+int Markdown::writeCodeBlock(const char *data,int size,int refIndent)
{
+ TRACE(data);
int i=0,end;
//printf("writeCodeBlock: data={%s}\n",QCString(data).left(size).data());
- out.addStr("@verbatim\n");
+ // no need for \ilinebr here as the previous line was empty and was skipped
+ m_out.addStr("@verbatim\n");
int emptyLines=0;
while (i<size)
{
@@ -2072,7 +2170,7 @@ static int writeCodeBlock(GrowBuf &out,const char *data,int size,int refIndent)
while (j<end && data[j]==' ') j++,indent++;
//printf("j=%d end=%d indent=%d refIndent=%d tabSize=%d data={%s}\n",
// j,end,indent,refIndent,Config_getInt(TAB_SIZE),QCString(data+i).left(end-i-1).data());
- if (j==end-1) // empty line
+ if (j==end-1) // empty line
{
emptyLines++;
i=end;
@@ -2082,11 +2180,11 @@ static int writeCodeBlock(GrowBuf &out,const char *data,int size,int refIndent)
while (emptyLines>0) // write skipped empty lines
{
// add empty line
- out.addStr("\n");
+ m_out.addStr("\n");
emptyLines--;
}
// add code line minus the indent
- out.addStr(data+i+refIndent+codeBlockIndent,end-i-refIndent-codeBlockIndent);
+ m_out.addStr(data+i+refIndent+codeBlockIndent,end-i-refIndent-codeBlockIndent);
i=end;
}
else // end of code block
@@ -2094,11 +2192,11 @@ static int writeCodeBlock(GrowBuf &out,const char *data,int size,int refIndent)
break;
}
}
- out.addStr("@endverbatim\n");
+ m_out.addStr("@endverbatim\\ilinebr ");
while (emptyLines>0) // write skipped empty lines
{
// add empty line
- out.addStr("\n");
+ m_out.addStr("\n");
emptyLines--;
}
//printf("i=%d\n",i);
@@ -2107,13 +2205,16 @@ static int writeCodeBlock(GrowBuf &out,const char *data,int size,int refIndent)
// start searching for the end of the line start at offset \a i
// keeping track of possible blocks that need to be skipped.
-static void findEndOfLine(GrowBuf &out,const char *data,int size,
+void Markdown::findEndOfLine(const char *data,int size,
int &pi,int&i,int &end)
{
+ TRACE(data);
// find end of the line
int nb=0;
end=i+1;
- while (end<=size && data[end-1]!='\n')
+ //while (end<=size && data[end-1]!='\n')
+ int j=0;
+ while (end<=size && (j=isNewline(data+end-1))==0)
{
// while looking for the end of the line we might encounter a block
// that needs to be passed unprocessed.
@@ -2135,7 +2236,7 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
if (qstrncmp(&data[end+1],endBlockName,l)==0)
{
// found end marker, skip over this block
- //printf("feol.block out={%s}\n",QCString(data+i).left(end+l+1-i).data());
+ //printf("feol.block m_out={%s}\n",QCString(data+i).left(end+l+1-i).data());
end = end + l + 2;
break;
}
@@ -2151,7 +2252,7 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
tolower(data[end+2])=='e' && data[end+3]=='>') // <pre> tag
{
// skip part until including </pre>
- end = end + processHtmlTagWrite(out,data+end-1,end-1,size-end+1,false) + 2;
+ end = end + processHtmlTagWrite(data+end-1,end-1,size-end+1,false) + 2;
break;
}
else
@@ -2159,7 +2260,7 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
end++;
}
}
- else if (nb==0 && data[end-1]=='`')
+ else if (nb==0 && data[end-1]=='`')
{
while (end<=size && data[end-1]=='`') end++,nb++;
}
@@ -2174,27 +2275,29 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
end++;
}
}
+ if (j>0) end+=j-1;
//printf("findEndOfLine pi=%d i=%d end=%d {%s}\n",pi,i,end,QCString(data+i).left(end-i).data());
}
-static void writeFencedCodeBlock(GrowBuf &out,const char *data,const char *lng,
+void Markdown::writeFencedCodeBlock(const char *data,const char *lng,
int blockStart,int blockEnd)
{
+ TRACE(data);
QCString lang = lng;
if (!lang.isEmpty() && lang.at(0)=='.') lang=lang.mid(1);
- out.addStr("@code");
+ m_out.addStr("@code");
if (!lang.isEmpty())
{
- out.addStr("{"+lang+"}");
+ m_out.addStr("{"+lang+"}");
}
- addStrEscapeUtf8Nbsp(out,data+blockStart,blockEnd-blockStart);
- out.addStr("\n");
- out.addStr("@endcode\n");
+ addStrEscapeUtf8Nbsp(data+blockStart,blockEnd-blockStart);
+ m_out.addStr("@endcode");
}
-static QCString processQuotations(const QCString &s,int refIndent)
+QCString Markdown::processQuotations(const QCString &s,int refIndent)
{
- GrowBuf out;
+ TRACE(s.data());
+ m_out.clear();
const char *data = s.data();
int size = s.length();
int i=0,end=0,pi=-1;
@@ -2202,14 +2305,14 @@ static QCString processQuotations(const QCString &s,int refIndent)
QCString lang;
while (i<size)
{
- findEndOfLine(out,data,size,pi,i,end);
+ findEndOfLine(data,size,pi,i,end);
// line is now found at [i..end)
if (pi!=-1)
{
if (isFencedCodeBlock(data+pi,size-pi,refIndent,lang,blockStart,blockEnd,blockOffset))
{
- writeFencedCodeBlock(out,data+pi,lang,blockStart,blockEnd);
+ writeFencedCodeBlock(data+pi,lang,blockStart,blockEnd);
i=pi+blockOffset;
pi=-1;
end=i+1;
@@ -2217,15 +2320,15 @@ static QCString processQuotations(const QCString &s,int refIndent)
}
else if (isBlockQuote(data+pi,i-pi,refIndent))
{
- i = pi+writeBlockQuote(out,data+pi,size-pi);
+ i = pi+writeBlockQuote(data+pi,size-pi);
pi=-1;
end=i+1;
continue;
}
else
{
- //printf("quote out={%s}\n",QCString(data+pi).left(i-pi).data());
- out.addStr(data+pi,i-pi);
+ //printf("quote m_out={%s}\n",QCString(data+pi).left(i-pi).data());
+ m_out.addStr(data+pi,i-pi);
}
}
pi=i;
@@ -2235,24 +2338,25 @@ static QCString processQuotations(const QCString &s,int refIndent)
{
if (isBlockQuote(data+pi,size-pi,refIndent))
{
- writeBlockQuote(out,data+pi,size-pi);
+ writeBlockQuote(data+pi,size-pi);
}
else
{
- out.addStr(data+pi,size-pi);
+ m_out.addStr(data+pi,size-pi);
}
}
- out.addChar(0);
+ m_out.addChar(0);
//printf("Process quotations\n---- input ----\n%s\n---- output ----\n%s\n------------\n",
- // s.data(),out.get());
+ // s.data(),m_out.get());
- return out.get();
+ return m_out.get();
}
-static QCString processBlocks(const QCString &s,int indent)
+QCString Markdown::processBlocks(const QCString &s,int indent)
{
- GrowBuf out;
+ TRACE(s.data());
+ m_out.clear();
const char *data = s.data();
int size = s.length();
int i=0,end=0,pi=-1,ref,level;
@@ -2262,20 +2366,20 @@ static QCString processBlocks(const QCString &s,int indent)
// get indent for the first line
end = i+1;
int sp=0;
- while (end<=size && data[end-1]!='\n')
+ while (end<=size && data[end-1]!='\n')
{
if (data[end-1]==' ') sp++;
end++;
}
-#if 0 // commented out, since starting with a comment block is probably a usage error
+#if 0 // commented m_out, since starting with a comment block is probably a usage error
// see also http://stackoverflow.com/q/20478611/784672
// special case when the documentation starts with a code block
// since the first line is skipped when looking for a code block later on.
if (end>codeBlockIndent && isCodeBlock(data,0,end,blockIndent))
{
- i=writeCodeBlock(out,data,size,blockIndent);
+ i=writeCodeBlock(m_out,data,size,blockIndent);
end=i+1;
pi=-1;
}
@@ -2284,7 +2388,7 @@ static QCString processBlocks(const QCString &s,int indent)
// process each line
while (i<size)
{
- findEndOfLine(out,data,size,pi,i,end);
+ findEndOfLine(data,size,pi,i,end);
// line is now found at [i..end)
//printf("findEndOfLine: pi=%d i=%d end=%d\n",pi,i,end);
@@ -2299,7 +2403,7 @@ static QCString processBlocks(const QCString &s,int indent)
{
//printf("Found header at %d-%d\n",i,end);
while (pi<size && data[pi]==' ') pi++;
- QCString header,id;
+ QCString header;
convertStringFragment(header,data+pi,i-pi-1);
id = extractTitleId(header, level);
//printf("header='%s' is='%s'\n",header.data(),id.data());
@@ -2307,22 +2411,22 @@ static QCString processBlocks(const QCString &s,int indent)
{
if (!id.isEmpty())
{
- out.addStr(level==1?"@section ":"@subsection ");
- out.addStr(id);
- out.addStr(" ");
- out.addStr(header);
- out.addStr("\n\n");
+ m_out.addStr(level==1?"@section ":"@subsection ");
+ m_out.addStr(id);
+ m_out.addStr(" ");
+ m_out.addStr(header);
+ m_out.addStr("\n\n");
}
else
{
- out.addStr(level==1?"<h1>":"<h2>");
- out.addStr(header);
- out.addStr(level==1?"\n</h1>\n":"\n</h2>\n");
+ m_out.addStr(level==1?"<h1>":"<h2>");
+ m_out.addStr(header);
+ m_out.addStr(level==1?"\n</h1>\n":"\n</h2>\n");
}
}
else
{
- out.addStr("\n<hr>\n");
+ m_out.addStr("\n<hr>\n");
}
pi=-1;
i=end;
@@ -2333,7 +2437,7 @@ static QCString processBlocks(const QCString &s,int indent)
{
//printf("found link ref: id='%s' link='%s' title='%s'\n",
// id.data(),link.data(),title.data());
- g_linkRefs.insert(id.lower(),new LinkRef(link,title));
+ m_linkRefs.insert({id.lower().str(),LinkRef(link,title)});
i=ref+pi;
pi=-1;
end=i+1;
@@ -2342,7 +2446,7 @@ static QCString processBlocks(const QCString &s,int indent)
{
//printf("Found FencedCodeBlock lang='%s' start=%d end=%d code={%s}\n",
// lang.data(),blockStart,blockEnd,QCString(data+pi+blockStart).left(blockEnd-blockStart).data());
- writeFencedCodeBlock(out,data+pi,lang,blockStart,blockEnd);
+ writeFencedCodeBlock(data+pi,lang,blockStart,blockEnd);
i=pi+blockOffset;
pi=-1;
end=i+1;
@@ -2351,21 +2455,21 @@ static QCString processBlocks(const QCString &s,int indent)
else if (isCodeBlock(data+i,i,end-i,blockIndent))
{
// skip previous line (it is empty anyway)
- i+=writeCodeBlock(out,data+i,size-i,blockIndent);
+ i+=writeCodeBlock(data+i,size-i,blockIndent);
pi=-1;
end=i+1;
continue;
}
else if (isTableBlock(data+pi,size-pi))
{
- i=pi+writeTableBlock(out,data+pi,size-pi);
+ i=pi+writeTableBlock(data+pi,size-pi);
pi=-1;
end=i+1;
continue;
}
else
{
- writeOneLineHeaderOrRuler(out,data+pi,i-pi);
+ writeOneLineHeaderOrRuler(data+pi,i-pi);
}
}
pi=i;
@@ -2378,21 +2482,22 @@ static QCString processBlocks(const QCString &s,int indent)
{
//printf("found link ref: id='%s' link='%s' title='%s'\n",
// id.data(),link.data(),title.data());
- g_linkRefs.insert(id.lower(),new LinkRef(link,title));
+ m_linkRefs.insert({id.lower().str(),LinkRef(link,title)});
}
else
{
- writeOneLineHeaderOrRuler(out,data+pi,size-pi);
+ writeOneLineHeaderOrRuler(data+pi,size-pi);
}
}
- out.addChar(0);
- return out.get();
+ m_out.addChar(0);
+ return m_out.get();
}
/** returns TRUE if input string docs starts with \@page or \@mainpage command */
static bool isExplicitPage(const QCString &docs)
{
+ TRACE(docs.data());
int i=0;
const char *data = docs.data();
if (data)
@@ -2413,17 +2518,20 @@ static bool isExplicitPage(const QCString &docs)
return FALSE;
}
-static QCString extractPageTitle(QCString &docs,QCString &id)
+QCString Markdown::extractPageTitle(QCString &docs,QCString &id, int &prepend)
{
- int ln=0;
+ TRACE(docs.data());
// first first non-empty line
+ prepend = 0;
QCString title;
- const char *data = docs.data();
int i=0;
int size=docs.size();
- while (i<size && (data[i]==' ' || data[i]=='\n'))
+ QCString docs_org(docs);
+ const char *data = docs_org.data();
+ docs = "";
+ while (i<size && (data[i]==' ' || data[i]=='\n'))
{
- if (data[i]=='\n') ln++;
+ if (data[i]=='\n') prepend++;
i++;
}
if (i>=size) return "";
@@ -2433,16 +2541,13 @@ static QCString extractPageTitle(QCString &docs,QCString &id)
// first line from i..end1
if (end1<size)
{
- ln++;
// second line form end1..end2
int end2=end1+1;
while (end2<size && data[end2-1]!='\n') end2++;
if (isHeaderline(data+end1,size-end1,FALSE))
{
convertStringFragment(title,data+i,end1-i-1);
- QCString lns;
- lns.fill('\n',ln);
- docs=lns+docs.mid(end2);
+ docs+="\n\n"+docs_org.mid(end2);
id = extractTitleId(title, 0);
//printf("extractPageTitle(title='%s' docs='%s' id='%s')\n",title.data(),docs.data(),id.data());
return title;
@@ -2450,21 +2555,25 @@ static QCString extractPageTitle(QCString &docs,QCString &id)
}
if (i<end1 && isAtxHeader(data+i,end1-i,title,id,FALSE)>0)
{
- docs=docs.mid(end1);
+ docs+="\n";
+ docs+=docs_org.mid(end1);
}
else
{
+ docs=docs_org;
id = extractTitleId(title, 0);
}
//printf("extractPageTitle(title='%s' docs='%s' id='%s')\n",title.data(),docs.data(),id.data());
return title;
}
-static QCString detab(const QCString &s,int &refIndent)
+QCString Markdown::detab(const QCString &s,int &refIndent)
{
- static int tabSize = Config_getInt(TAB_SIZE);
+ TRACE(s.data());
+ int tabSize = Config_getInt(TAB_SIZE);
int size = s.length();
- GrowBuf out(size);
+ m_out.clear();
+ m_out.reserve(size);
const char *data = s.data();
int i=0;
int col=0;
@@ -2472,7 +2581,7 @@ static QCString detab(const QCString &s,int &refIndent)
int minIndent=maxIndent;
while (i<size)
{
- char c = data[i++];
+ signed char c = (signed char)data[i++];
switch(c)
{
case '\t': // expand tab
@@ -2480,141 +2589,116 @@ static QCString detab(const QCString &s,int &refIndent)
int stop = tabSize - (col%tabSize);
//printf("expand at %d stop=%d\n",col,stop);
col+=stop;
- while (stop--) out.addChar(' ');
+ while (stop--) m_out.addChar(' ');
}
break;
case '\n': // reset column counter
- out.addChar(c);
+ m_out.addChar(c);
col=0;
break;
case ' ': // increment column counter
- out.addChar(c);
+ m_out.addChar(c);
col++;
break;
default: // non-whitespace => update minIndent
if (c<0 && i<size) // multibyte sequence
{
- // special handling of the UTF-8 nbsp character 0xc2 0xa0
- if (c == '\xc2' && data[i] == '\xa0')
+ // special handling of the UTF-8 nbsp character 0xC2 0xA0
+ if ((uchar)c == 0xC2 && (uchar)(data[i]) == 0xA0)
{
- out.addStr(g_doxy_nsbp);
+ m_out.addStr(g_doxy_nsbp);
i++;
}
else
{
- out.addChar(c);
- out.addChar(data[i++]); // >= 2 bytes
+ m_out.addChar(c);
+ m_out.addChar(data[i++]); // >= 2 bytes
if (((uchar)c&0xE0)==0xE0 && i<size)
{
- out.addChar(data[i++]); // 3 bytes
+ m_out.addChar(data[i++]); // 3 bytes
}
if (((uchar)c&0xF0)==0xF0 && i<size)
{
- out.addChar(data[i++]); // 4 byres
+ m_out.addChar(data[i++]); // 4 byres
}
}
}
else
{
- out.addChar(c);
+ m_out.addChar(c);
}
if (col<minIndent) minIndent=col;
col++;
}
}
if (minIndent!=maxIndent) refIndent=minIndent; else refIndent=0;
- out.addChar(0);
+ m_out.addChar(0);
//printf("detab refIndent=%d\n",refIndent);
- return out.get();
+ return m_out.get();
}
//---------------------------------------------------------------------------
-QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,const QCString &input)
+QCString Markdown::process(const QCString &input, int &startNewlines)
{
- static bool init=FALSE;
- if (!init)
- {
- // setup callback table for special characters
- g_actions[(unsigned int)'_']=processEmphasis;
- g_actions[(unsigned int)'*']=processEmphasis;
- g_actions[(unsigned int)'~']=processEmphasis;
- g_actions[(unsigned int)'`']=processCodeSpan;
- g_actions[(unsigned int)'\\']=processSpecialCommand;
- g_actions[(unsigned int)'@']=processSpecialCommand;
- g_actions[(unsigned int)'[']=processLink;
- g_actions[(unsigned int)'!']=processLink;
- g_actions[(unsigned int)'<']=processHtmlTag;
- g_actions[(unsigned int)'-']=processNmdash;
- g_actions[(unsigned int)'"']=processQuoted;
- init=TRUE;
- }
-
- g_linkRefs.setAutoDelete(TRUE);
- g_linkRefs.clear();
- g_current = e;
- g_fileName = fileName;
- g_lineNr = lineNr;
- static GrowBuf out;
if (input.isEmpty()) return input;
- out.clear();
int refIndent;
+
// for replace tabs by spaces
QCString s = input;
if (s.at(s.length()-1)!='\n') s += "\n"; // see PR #6766
s = detab(s,refIndent);
//printf("======== DeTab =========\n---- output -----\n%s\n---------\n",s.data());
+
// then process quotation blocks (as these may contain other blocks)
s = processQuotations(s,refIndent);
//printf("======== Quotations =========\n---- output -----\n%s\n---------\n",s.data());
+
// then process block items (headers, rules, and code blocks, references)
s = processBlocks(s,refIndent);
//printf("======== Blocks =========\n---- output -----\n%s\n---------\n",s.data());
+
// finally process the inline markup (links, emphasis and code spans)
- processInline(out,s,s.length());
- out.addChar(0);
- Debug::print(Debug::Markdown,0,"======== Markdown =========\n---- input ------- \n%s\n---- output -----\n%s\n=========\n",qPrint(input),qPrint(out.get()));
- return substitute(out.get(),g_doxy_nsbp,"&nbsp;");
+ m_out.clear();
+ processInline(s,s.length());
+ m_out.addChar(0);
+ Debug::print(Debug::Markdown,0,"======== Markdown =========\n---- input ------- \n%s\n---- output -----\n%s\n=========\n",qPrint(input),qPrint(m_out.get()));
+
+ // post processing
+ QCString result = substitute(m_out.get(),g_doxy_nsbp,"&nbsp;");
+ const char *p = result.data();
+ if (p)
+ {
+ while (*p==' ') p++; // skip over spaces
+ while (*p=='\n') {startNewlines++;p++;}; // skip over newlines
+ if (qstrncmp(p,"<br>",4)==0) p+=4; // skip over <br>
+ }
+ if (p>result.data())
+ {
+ // strip part of the input
+ result = result.mid(p-result.data());
+ }
+ return result;
}
//---------------------------------------------------------------------------
QCString markdownFileNameToId(const QCString &fileName)
{
+ TRACE(fileName.data());
QCString baseFn = stripFromPath(QFileInfo(fileName).absFilePath().utf8());
int i = baseFn.findRev('.');
if (i!=-1) baseFn = baseFn.left(i);
- QCString baseName = substitute(substitute(baseFn," ","_"),"/","_");
- return "md_"+baseName;
-}
-
-//---------------------------------------------------------------------------
-
-QCString processMarkdownForCommentBlock(const QCString &comment,
- const QCString &fileName,
- int lineNr)
-{
- if (!comment.isEmpty() && Doxygen::markdownSupport)
- {
- QCString result = processMarkdown(fileName,lineNr,0,comment);
- const char *p = result.data();
- if (p)
- {
- while (*p==' ') p++; // skip over spaces
- while (*p=='\n') p++; // skip over newlines
- if (qstrncmp(p,"<br>",4)==0) p+=4; // skip over <br>
- }
- if (p>result.data())
- {
- // strip part of the input
- result = result.mid(p-result.data());
- }
- return result;
- }
- else
+ QCString baseName = baseFn;
+ char *p = baseName.rawData();
+ char c;
+ while ((c=*p))
{
- return comment;
+ if (!isId(c)) *p='_'; // escape characters that do not yield an identifier by underscores
+ p++;
}
+ //printf("markdownFileNameToId(%s)=md_%s\n",qPrint(fileName),qPrint(baseName));
+ return "md_"+baseName;
}
//---------------------------------------------------------------------------
@@ -2632,26 +2716,29 @@ MarkdownOutlineParser::~MarkdownOutlineParser()
{
}
-void MarkdownOutlineParser::parseInput(const char *fileName,
- const char *fileBuf,
+void MarkdownOutlineParser::parseInput(const char *fileName,
+ const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool /*sameTranslationUnit*/,
- QStrList & /*filesInSameTranslationUnit*/)
+ ClangTUParser* /*clangParser*/)
{
std::shared_ptr<Entry> current = std::make_shared<Entry>();
+ int prepend = 0; // number of empty lines in front
current->lang = SrcLangExt_Markdown;
current->fileName = fileName;
current->docFile = fileName;
current->docLine = 1;
QCString docs = fileBuf;
QCString id;
- QCString title=extractPageTitle(docs,id).stripWhiteSpace();
+ Markdown markdown(fileName,1,0);
+ QCString title=markdown.extractPageTitle(docs,id,prepend).stripWhiteSpace();
if (id.startsWith("autotoc_md")) id = "";
- g_indentLevel=title.isEmpty() ? 0 : -1;
- QCString titleFn = QFileInfo(fileName).baseName().utf8();
+ int indentLevel=title.isEmpty() ? 0 : -1;
+ markdown.setIndentLevel(indentLevel);
QCString fn = QFileInfo(fileName).fileName().utf8();
- static QCString mdfileAsMainPage = Config_getString(USE_MDFILE_AS_MAINPAGE);
- if (id.isEmpty()) id = markdownFileNameToId(fileName);
+ QCString titleFn = stripExtensionGeneral(fn,getFileNameExtension(fn));
+ QCString mdfileAsMainPage = Config_getString(USE_MDFILE_AS_MAINPAGE);
+ bool wasEmpty = id.isEmpty();
+ if (wasEmpty) id = markdownFileNameToId(fileName);
if (!isExplicitPage(docs))
{
if (!mdfileAsMainPage.isEmpty() &&
@@ -2660,30 +2747,30 @@ void MarkdownOutlineParser::parseInput(const char *fileName,
QFileInfo(mdfileAsMainPage).absFilePath()) // file reference with path
)
{
- docs.prepend("@mainpage "+title+"\n");
+ docs.prepend("@anchor " + id + "\\ilinebr ");
+ docs.prepend("@mainpage "+title+"\\ilinebr ");
}
else if (id=="mainpage" || id=="index")
{
if (title.isEmpty()) title = titleFn;
- docs.prepend("@mainpage "+title+"\n");
+ docs.prepend("@anchor " + id + "\\ilinebr ");
+ docs.prepend("@mainpage "+title+"\\ilinebr ");
}
else
{
- if (title.isEmpty()) title = titleFn;
- docs.prepend("@page "+id+" "+title+"\n");
+ if (title.isEmpty()) {title = titleFn;prepend=0;}
+ if (!wasEmpty) docs.prepend("@anchor " + markdownFileNameToId(fileName) + "\\ilinebr ");
+ docs.prepend("@page "+id+" "+title+"\\ilinebr ");
}
+ for (int i = 0; i < prepend; i++) docs.prepend("\n");
}
int lineNr=1;
- // even without markdown support enabled, we still
- // parse markdown files as such
- bool markdownEnabled = Doxygen::markdownSupport;
- Doxygen::markdownSupport = TRUE;
-
+ p->commentScanner.enterFile(fileName,lineNr);
Protection prot=Public;
bool needsEntry = FALSE;
int position=0;
- QCString processedDocs = processMarkdownForCommentBlock(docs,fileName,lineNr);
+ QCString processedDocs = markdown.process(docs,lineNr);
while (p->commentScanner.parseCommentBlock(
this,
current.get(),
@@ -2695,7 +2782,8 @@ void MarkdownOutlineParser::parseInput(const char *fileName,
FALSE, // inBodyDocs
prot, // protection
position,
- needsEntry))
+ needsEntry,
+ true))
{
if (needsEntry)
{
@@ -2710,19 +2798,12 @@ void MarkdownOutlineParser::parseInput(const char *fileName,
{
root->moveToSubEntryAndKeep(current);
}
-
- // restore setting
- Doxygen::markdownSupport = markdownEnabled;
- g_indentLevel=0;
+ p->commentScanner.leaveFile(fileName,lineNr);
}
void MarkdownOutlineParser::parsePrototype(const char *text)
{
- OutlineParserInterface &intf = Doxygen::parserManager->getOutlineParser("*.cpp");
- if (&intf!=this)
- {
- intf.parsePrototype(text);
- }
+ Doxygen::parserManager->getOutlineParser("*.cpp")->parsePrototype(text);
}
//------------------------------------------------------------------------
diff --git a/src/markdown.h b/src/markdown.h
index bc1e9bb..dd4ff73 100644
--- a/src/markdown.h
+++ b/src/markdown.h
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,39 +16,87 @@
#ifndef MARKDOWN_H
#define MARKDOWN_H
+#include <functional>
+
#include <qcstring.h>
#include "parserintf.h"
+#include "growbuf.h"
class Entry;
/** processes string \a s and converts markdown into doxygen/html commands. */
-QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,const QCString &s);
+//QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,const QCString &s);
QCString markdownFileNameToId(const QCString &fileName);
-/** Performs markdown processing for a comment block if markdown processing is enabled.
- * @param[in] comment A string representing the actual comment block.
- * Note that leading *'s should already be stripped from the comment block.
- * @param[in] fileName The name of the file in which the comment is found.
- * Mainly used for producing warnings.
- * @param[in] lineNr The line number at which the comment block was found.
- * @returns The processed comment block
- */
-QCString processMarkdownForCommentBlock(const QCString &comment,
- const QCString &fileName,
- int lineNr);
+/// Helper class to process markdown formatted text
+class Markdown
+{
+ public:
+ Markdown(const char *fileName,int lineNr,int indentLevel=0);
+ QCString process(const QCString &input, int &startNewlines);
+ QCString extractPageTitle(QCString &docs,QCString &id,int &prepend);
+ void setIndentLevel(int level) { m_indentLevel = level; }
+
+ private:
+ QCString detab(const QCString &s,int &refIndent);
+ QCString processQuotations(const QCString &s,int refIndent);
+ QCString processBlocks(const QCString &s,int indent);
+ QCString isBlockCommand(const char *data,int offset,int size);
+ void findEndOfLine(const char *data,int size,int &pi,int&i,int &end);
+ int processHtmlTagWrite(const char *data,int offset,int size,bool doWrite);
+ int processHtmlTag(const char *data,int offset,int size);
+ int processEmphasis(const char *data,int offset,int size);
+ int processEmphasis1(const char *data, int size, char c);
+ int processEmphasis2(const char *data, int size, char c);
+ int processEmphasis3(const char *data, int size, char c);
+ int processNmdash(const char *data,int off,int size);
+ int processQuoted(const char *data,int,int size);
+ int processCodeSpan(const char *data, int /*offset*/, int size);
+ void addStrEscapeUtf8Nbsp(const char *s,int len);
+ int processSpecialCommand(const char *data, int offset, int size);
+ int processLink(const char *data,int,int size);
+ int findEmphasisChar(const char *data, int size, char c, int c_size);
+ void processInline(const char *data,int size);
+ void writeMarkdownImage(const char *fmt, bool explicitTitle,
+ const QCString &title, const QCString &content,
+ const QCString &link, const FileDef *fd);
+ int isHeaderline(const char *data, int size, bool allowAdjustLevel);
+ int isAtxHeader(const char *data,int size,
+ QCString &header,QCString &id,bool allowAdjustLevel);
+ void writeOneLineHeaderOrRuler(const char *data,int size);
+ void writeFencedCodeBlock(const char *data,const char *lng,
+ int blockStart,int blockEnd);
+ int writeBlockQuote(const char *data,int size);
+ int writeCodeBlock(const char *data,int size,int refIndent);
+ int writeTableBlock(const char *data,int size);
+
+ private:
+ struct LinkRef
+ {
+ LinkRef(const char *l,const char *t) : link(l), title(t) {}
+ QCString link;
+ QCString title;
+ };
+ using Action_t = std::function<int(const char *,int,int)>;
+
+ std::unordered_map<std::string,LinkRef> m_linkRefs;
+ QCString m_fileName;
+ int m_lineNr = 0;
+ int m_indentLevel=0; // 0 is outside markdown, -1=page level
+ GrowBuf m_out;
+ Markdown::Action_t m_actions[256];
+};
+
class MarkdownOutlineParser : public OutlineParserInterface
{
public:
MarkdownOutlineParser();
virtual ~MarkdownOutlineParser();
- void startTranslationUnit(const char *) {}
- void finishTranslationUnit() {}
- void parseInput(const char *fileName,
- const char *fileBuf,
+ void parseInput(const char *fileName,
+ const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool sameTranslationUnit,
- QStrList &filesInSameTranslationUnit);
+ ClangTUParser *clangParser);
bool needsPreprocessing(const QCString &) const { return FALSE; }
void parsePrototype(const char *text);
private:
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 1c935ac..8f09347 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -36,7 +36,6 @@
#include "dotcallgraph.h"
#include "searchindex.h"
#include "parserintf.h"
-#include "objcache.h"
#include "vhdldocgen.h"
#include "arguments.h"
@@ -48,7 +47,7 @@
//-----------------------------------------------------------------------------
-class MemberDefImpl : public DefinitionImpl, public MemberDef
+class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
{
public:
MemberDefImpl(const char *defFileName,int defLine,int defColumn,
@@ -76,16 +75,12 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual const QCString &initializer() const;
virtual int initializerLines() const;
virtual uint64 getMemberSpecifiers() const;
- virtual const MemberList *getSectionList() const;
- virtual QCString displayDefinition() const;
+ virtual const MemberList *getSectionList(const Definition *) const;
+ virtual QCString displayDefinition() const;
virtual const ClassDef *getClassDef() const;
- virtual ClassDef *getClassDef();
virtual const FileDef *getFileDef() const;
- virtual FileDef *getFileDef();
virtual const NamespaceDef* getNamespaceDef() const;
- virtual NamespaceDef* getNamespaceDef();
virtual const GroupDef *getGroupDef() const;
- virtual GroupDef *getGroupDef();
virtual ClassDef *accessorClass() const;
virtual const char *getReadAccessor() const;
virtual const char *getWriteAccessor() const;
@@ -94,7 +89,7 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual int getGroupStartLine() const;
virtual bool getGroupHasDocs() const;
virtual QCString qualifiedName() const;
- virtual QCString objCMethodName(bool localLink,bool showStatic) const;
+ virtual QCString objCMethodName(bool localLink,bool showStatic) const;
virtual Protection protection() const;
virtual Specifier virtualness(int count=0) const;
virtual MemberType memberType() const;
@@ -200,13 +195,13 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual void setEnumBaseType(const QCString &type);
virtual QCString enumBaseType() const;
virtual bool hasExamples() const;
- virtual ExampleSDict *getExamples() const;
+ virtual const ExampleList &getExamples() const;
virtual bool isPrototype() const;
virtual const ArgumentList &argumentList() const;
virtual ArgumentList &argumentList();
virtual const ArgumentList &declArgumentList() const;
virtual const ArgumentList &templateArguments() const;
- virtual const std::vector<ArgumentList> &definitionTemplateParameterLists() const;
+ virtual const ArgumentLists &definitionTemplateParameterLists() const;
virtual int getMemberGroupId() const;
virtual MemberGroup *getMemberGroup() const;
virtual bool fromAnonymousScope() const;
@@ -243,7 +238,7 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual int getDeclColumn() const;
virtual void setMemberType(MemberType t);
virtual void setDefinition(const char *d);
- virtual void setFileDef(FileDef *fd);
+ virtual void setFileDef(const FileDef *fd);
virtual void setAnchor();
virtual void setProtection(Protection p);
virtual void setMemberSpecifiers(uint64 s);
@@ -251,9 +246,9 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual void setInitializer(const char *i);
virtual void setBitfields(const char *s);
virtual void setMaxInitLines(int lines);
- virtual void setMemberClass(ClassDef *cd);
- virtual void setSectionList(MemberList *sl);
- virtual void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+ virtual void setMemberClass(const ClassDef *cd);
+ virtual void setSectionList(const Definition *container,const MemberList *sl);
+ virtual void setGroupDef(const GroupDef *gd,Grouping::GroupPri_t pri,
const QCString &fileName,int startLine,bool hasDocs,
MemberDef *member=0);
virtual void setReadAccessor(const char *r);
@@ -276,13 +271,13 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual void setPrototype(bool p,const QCString &df,int line, int column);
virtual void setExplicitExternal(bool b,const QCString &df,int line,int column);
virtual void setDeclFile(const QCString &df,int line,int column);
- virtual void setArgumentList(const ArgumentList &al);
- virtual void setDeclArgumentList(const ArgumentList &al);
- virtual void setDefinitionTemplateParameterLists(const std::vector<ArgumentList> &lists);
+ virtual void moveArgumentList(std::unique_ptr<ArgumentList> al);
+ virtual void moveDeclArgumentList(std::unique_ptr<ArgumentList> al);
+ virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists);
virtual void setTypeConstraints(const ArgumentList &al);
virtual void setType(const char *t);
virtual void setAccessorType(ClassDef *cd,const char *t);
- virtual void setNamespace(NamespaceDef *nd);
+ virtual void setNamespace(const NamespaceDef *nd);
virtual void setMemberGroup(MemberGroup *grp);
virtual void setMemberGroupId(int id);
virtual void makeImplementationDetail();
@@ -324,13 +319,14 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual void warnIfUndocumented() const;
virtual void warnIfUndocumentedParams() const;
virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const;
- virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs,
- const ArgumentList &actualArgs) const;
+ virtual MemberDefMutable *createTemplateInstanceMember(const ArgumentList &formalArgs,
+ const std::unique_ptr<ArgumentList> &actualArgs) const;
virtual void findSectionsInDocumentation();
virtual void writeLink(OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
bool onlyText=FALSE) const;
virtual void addToSearchIndex() const;
+ virtual void resolveUnnamedParameters(const MemberDef *md);
private:
void _computeLinkableInProject();
@@ -361,10 +357,10 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
IMPL *m_impl;
uchar m_isLinkableCached; // 0 = not cached, 1=FALSE, 2=TRUE
uchar m_isConstructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
- uchar m_isDestructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
+ uchar m_isDestructorCached; // 1 = not cached, 1=FALSE, 2=TRUE
};
-MemberDef *createMemberDef(const char *defFileName,int defLine,int defColumn,
+MemberDefMutable *createMemberDef(const char *defFileName,int defLine,int defColumn,
const char *type,const char *name,const char *args,
const char *excp,Protection prot,Specifier virt,bool stat,
Relationship related,MemberType t,const ArgumentList &tal,
@@ -376,15 +372,15 @@ MemberDef *createMemberDef(const char *defFileName,int defLine,int defColumn,
//-----------------------------------------------------------------------------
-class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
+class MemberDefAliasImpl : public DefinitionAliasMixin<MemberDef>
{
public:
- MemberDefAliasImpl(const Definition *newScope,const MemberDef *md)
- : DefinitionAliasImpl(newScope,md), m_memberGroup(0) {}
- virtual ~MemberDefAliasImpl() {}
+ MemberDefAliasImpl(const Definition *newScope,const MemberDef *md)
+ : DefinitionAliasMixin(newScope,md), m_memberGroup(0) { init(); }
+ virtual ~MemberDefAliasImpl() { deinit(); }
virtual DefType definitionType() const { return TypeMember; }
- const MemberDef *getMdAlias() const { return dynamic_cast<const MemberDef*>(getAlias()); }
+ const MemberDef *getMdAlias() const { return toMemberDef(getAlias()); }
virtual MemberDef *resolveAlias() { return const_cast<MemberDef*>(getMdAlias()); }
virtual const MemberDef *resolveAlias() const { return getMdAlias(); }
@@ -393,6 +389,8 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
}
virtual void moveTo(Definition *) {}
+ virtual QCString name() const
+ { return getMdAlias()->name(); }
virtual QCString getOutputFileBase() const
{ return getMdAlias()->getOutputFileBase(); }
virtual QCString getReference() const
@@ -419,8 +417,8 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
{ return getMdAlias()->initializerLines(); }
virtual uint64 getMemberSpecifiers() const
{ return getMdAlias()->getMemberSpecifiers(); }
- virtual const MemberList *getSectionList() const
- { return getMdAlias()->getSectionList(); }
+ virtual const MemberList *getSectionList(const Definition *container) const
+ { return getMdAlias()->getSectionList(container); }
virtual QCString displayDefinition() const
{ return getMdAlias()->displayDefinition(); }
virtual const ClassDef *getClassDef() const
@@ -429,7 +427,7 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
{ return getMdAlias()->getFileDef(); }
virtual const NamespaceDef* getNamespaceDef() const
{ return getMdAlias()->getNamespaceDef(); }
- virtual ClassDef *accessorClass() const
+ virtual const ClassDef *accessorClass() const
{ return getMdAlias()->accessorClass(); }
virtual const char *getReadAccessor() const
{ return getMdAlias()->getReadAccessor(); }
@@ -657,7 +655,7 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
{ return getMdAlias()->enumBaseType(); }
virtual bool hasExamples() const
{ return getMdAlias()->hasExamples(); }
- virtual ExampleSDict *getExamples() const
+ virtual const ExampleList &getExamples() const
{ return getMdAlias()->getExamples(); }
virtual bool isPrototype() const
{ return getMdAlias()->isPrototype(); }
@@ -667,7 +665,7 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
{ return getMdAlias()->declArgumentList(); }
virtual const ArgumentList &templateArguments() const
{ return getMdAlias()->templateArguments(); }
- virtual const std::vector<ArgumentList> &definitionTemplateParameterLists() const
+ virtual const ArgumentLists &definitionTemplateParameterLists() const
{ return getMdAlias()->definitionTemplateParameterLists(); }
virtual int getMemberGroupId() const
{ return getMdAlias()->getMemberGroupId(); }
@@ -738,95 +736,13 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
virtual int getDeclColumn() const
{ return getMdAlias()->getDeclColumn(); }
- // non-const getters should not be called
- virtual ClassDef *getClassDef()
- { err("non-const getClassDef() called on aliased member. Please report as a bug.\n"); return 0; }
- virtual FileDef *getFileDef()
- { err("non-const getFileDef() called on aliased member. Please report as a bug.\n"); return 0; }
- virtual NamespaceDef* getNamespaceDef()
- { err("non-const getNamespaceDef() called on aliased member. Please report as a bug.\n"); return 0; }
- virtual GroupDef *getGroupDef()
- { err("non-const getGroupDef() called on aliased member. Please report as a bug.\n"); return 0; }
- virtual ArgumentList &argumentList()
- { err("non-const argumentList() called on aliased member. Please report as bug.\n");
- static ArgumentList dummy; return dummy;
- }
-
- virtual void setEnumBaseType(const QCString &type) {}
- virtual void setMemberType(MemberType t) {}
- virtual void setDefinition(const char *d) {}
- virtual void setFileDef(FileDef *fd) {}
- virtual void setAnchor() {}
- virtual void setProtection(Protection p) {}
- virtual void setMemberSpecifiers(uint64 s) {}
- virtual void mergeMemberSpecifiers(uint64 s) {}
- virtual void setInitializer(const char *i) {}
- virtual void setBitfields(const char *s) {}
- virtual void setMaxInitLines(int lines) {}
- virtual void setMemberClass(ClassDef *cd) {}
- virtual void setSectionList(MemberList *sl) {}
- virtual void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
- const QCString &fileName,int startLine,bool hasDocs,
- MemberDef *member=0) {}
- virtual void setReadAccessor(const char *r) {}
- virtual void setWriteAccessor(const char *w) {}
- virtual void setTemplateSpecialization(bool b) {}
- virtual void makeRelated() {}
- virtual void makeForeign() {}
- virtual void setInheritsDocsFrom(MemberDef *md) {}
- virtual void setTagInfo(const TagInfo *i) {}
- virtual void setArgsString(const char *as) {}
- virtual void setReimplements(MemberDef *md) {}
- virtual void insertReimplementedBy(MemberDef *md) {}
- virtual void setRelatedAlso(ClassDef *cd) {}
- virtual void insertEnumField(MemberDef *md) {}
- virtual void setEnumScope(MemberDef *md,bool livesInsideEnum=FALSE) {}
- virtual void setEnumClassScope(ClassDef *cd) {}
- virtual void setDocumentedEnumValues(bool value) {}
- virtual void setAnonymousEnumType(const MemberDef *md) {}
- virtual bool addExample(const char *anchor,const char *name,const char *file) { return FALSE; }
- virtual void setPrototype(bool p,const QCString &df,int line, int column) {}
- virtual void setExplicitExternal(bool b,const QCString &df,int line,int column) {}
- virtual void setDeclFile(const QCString &df,int line,int column) {}
- virtual void setArgumentList(const ArgumentList &al) {}
- virtual void setDeclArgumentList(const ArgumentList &al) {}
- virtual void setDefinitionTemplateParameterLists(const std::vector<ArgumentList> &lists) {}
- virtual void setTypeConstraints(const ArgumentList &al) {}
- virtual void setType(const char *t) {}
- virtual void setAccessorType(ClassDef *cd,const char *t) {}
- virtual void setNamespace(NamespaceDef *nd) {}
+ virtual void warnIfUndocumented() const {}
+ virtual void warnIfUndocumentedParams() const {}
+ virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const {}
virtual void setMemberGroup(MemberGroup *grp) { m_memberGroup = grp; }
- virtual void setMemberGroupId(int id) {}
- virtual void makeImplementationDetail() {}
- virtual void setFromAnonymousScope(bool b) const {}
- virtual void setFromAnonymousMember(MemberDef *m) {}
- virtual void enableCallGraph(bool e) {}
- virtual void enableCallerGraph(bool e) {}
- virtual void enableReferencedByRelation(bool e) {}
- virtual void enableReferencesRelation(bool e) {}
- virtual void setTemplateMaster(MemberDef *mt) {}
- virtual void addListReference(Definition *d) {}
- virtual void setDocsForDefinition(bool b) {}
- virtual void setGroupAlias(const MemberDef *md) {}
- virtual void cacheTypedefVal(const ClassDef *val,const QCString &templSpec,const QCString &resolvedType) {}
- virtual void invalidateTypedefValCache() {}
- virtual void invalidateCachedArgumentTypes() {}
- virtual void setMemberDefinition(MemberDef *md) {}
- virtual void setMemberDeclaration(MemberDef *md) {}
- virtual void setAnonymousUsed() const {}
- virtual void copyArgumentNames(MemberDef *bmd) {}
- virtual void setCategory(ClassDef *) {}
- virtual void setCategoryRelation(MemberDef *) {}
- virtual void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE) {}
- virtual void setBriefDescription(const char *b,const char *briefFile,int briefLine) {}
- virtual void setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine) {}
- virtual void setHidden(bool b) {}
- virtual void addToSearchIndex() const {}
- virtual void findSectionsInDocumentation() {}
- virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs,
- const ArgumentList &actualArgs) const
+ virtual MemberDefMutable *createTemplateInstanceMember(const ArgumentList &formalArgs,
+ const std::unique_ptr<ArgumentList> &actualArgs) const
{ return getMdAlias()->createTemplateInstanceMember(formalArgs,actualArgs); }
- virtual void incrementFlowKeyWordCount() {}
virtual void writeDeclaration(OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
@@ -839,18 +755,6 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
{
getMdAlias()->writeEnumDeclaration(typeDecl,cd,nd,fd,gd);
}
- virtual void writeDocumentation(const MemberList *ml,int memCount,int memTotal,OutputList &ol,
- const char *scopeName,const Definition *container,
- bool inGroup,bool showEnumValues=FALSE,bool
- showInline=FALSE) const {}
- virtual void writeMemberDocSimple(OutputList &ol,const Definition *container) const {}
- virtual void writeLink(OutputList &ol,
- const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
- bool onlyText=FALSE) const {}
- virtual void writeTagFile(FTextStream &) const {}
- virtual void warnIfUndocumented() const {}
- virtual void warnIfUndocumentedParams() const {}
- virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const {}
private:
MemberGroup *m_memberGroup; // group's member definition
};
@@ -858,7 +762,9 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
MemberDef *createMemberDefAlias(const Definition *newScope,const MemberDef *aliasMd)
{
- return new MemberDefAliasImpl(newScope,aliasMd);
+ MemberDef *amd = new MemberDefAliasImpl(newScope,aliasMd);
+ //printf("amd: name=%s displayName=%s\n",amd->name().data(),amd->displayName().data());
+ return amd;
}
//-----------------------------------------------------------------------------
@@ -939,35 +845,11 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me
const ArgumentList &defArgList=(md->isDocsForDefinition()) ?
md->argumentList() : md->declArgumentList();
//printf("writeDefArgumentList '%s' isDocsForDefinition()=%d\n",md->name().data(),md->isDocsForDefinition());
- if (!defArgList.hasParameters() || md->isProperty())
+ if (!defArgList.hasParameters() || md->isProperty() || md->isTypedef())
{
return FALSE; // member has no function like argument list
}
- // simple argument list for tcl
- if (md->getLanguage()==SrcLangExt_Tcl)
- {
- if (defArgList.empty()) return FALSE;
- ol.endMemberDocName();
- ol.startParameterList(FALSE);
- ol.startParameterType(TRUE,0);
- ol.endParameterType();
- ol.startParameterName(FALSE);
- for (const Argument &a : defArgList)
- {
- if (a.defval.isEmpty())
- {
- ol.docify(a.name+" ");
- }
- else
- {
- ol.docify("?"+a.name+"? ");
- }
- }
- ol.endParameterName(TRUE,FALSE,FALSE);
- return TRUE;
- }
-
if (!md->isDefine()) ol.docify(" ");
//printf("writeDefArgList(%d)\n",defArgList->count());
@@ -1010,7 +892,7 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me
}
else if (scope->definitionType()==Definition::TypeClass)
{
- cName=tempArgListToString((dynamic_cast<const ClassDef*>(scope))->templateArguments(),
+ cName=tempArgListToString((toClassDef(scope))->templateArguments(),
scope->getLanguage());
//printf("2. cName=%s\n",cName.data());
}
@@ -1173,29 +1055,29 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me
{
ol.docify(md->extraTypeChars());
}
- if (defArgList.constSpecifier)
+ if (defArgList.constSpecifier())
{
ol.docify(" const");
}
- if (defArgList.volatileSpecifier)
+ if (defArgList.volatileSpecifier())
{
ol.docify(" volatile");
}
- if (defArgList.refQualifier==RefQualifierLValue)
+ if (defArgList.refQualifier()==RefQualifierLValue)
{
ol.docify(" &");
}
- else if (defArgList.refQualifier==RefQualifierRValue)
+ else if (defArgList.refQualifier()==RefQualifierRValue)
{
ol.docify(" &&");
}
- if (!defArgList.trailingReturnType.isEmpty())
+ if (!defArgList.trailingReturnType().isEmpty())
{
linkifyText(TextGeneratorOLImpl(ol), // out
scope, // scope
md->getBodyDef(), // fileScope
md, // self
- defArgList.trailingReturnType, // text
+ defArgList.trailingReturnType(), // text
FALSE // autoBreak
);
@@ -1300,9 +1182,9 @@ class MemberDefImpl::IMPL
const ArgumentList &al,const char *meta
);
- ClassDef *classDef = 0; // member of or related to
- FileDef *fileDef = 0; // member of file definition
- NamespaceDef *nspace = 0; // the namespace this member is in.
+ const ClassDef *classDef = 0; // member of or related to
+ const FileDef *fileDef = 0; // member of file definition
+ const NamespaceDef *nspace = 0; // the namespace this member is in.
MemberDef *enumScope = 0; // the enclosing scope, if this is an enum field
bool livesInsideEnum = false;
@@ -1316,7 +1198,7 @@ class MemberDefImpl::IMPL
MemberDef *memDec = 0; // member declaration for this definition
ClassDef *relatedAlso = 0; // points to class marked by relatedAlso
- ExampleSDict *exampleSDict = 0; // a dictionary of all examples for quick access
+ ExampleList examples; // a dictionary of all examples for quick access
QCString type; // return actual type
QCString accessorType; // return type that tell how to get to this member
@@ -1349,7 +1231,7 @@ class MemberDefImpl::IMPL
ArgumentList tArgList; // template argument list of function template
ArgumentList typeConstraints; // type constraints for template parameters
MemberDef *templateMaster;
- std::vector<ArgumentList> defTmpArgLists; // lists of template argument lists
+ ArgumentLists defTmpArgLists; // lists of template argument lists
// (for template functions in nested template classes)
QCString metaData; // Slice metadata.
@@ -1358,12 +1240,12 @@ class MemberDefImpl::IMPL
// as its type then this is computed by
// getClassDefOfAnonymousType() and
// cached here.
- SDict<MemberList> *classSectionSDict = 0; // not accessible
+ std::map<const Definition *,const MemberList *> sectionMap;
const MemberDef *groupAlias = 0; // Member containing the definition
int grpId = 0; // group id
MemberGroup *memberGroup = 0; // group's member definition
- GroupDef *group = 0; // group in which this member is in
+ const GroupDef *group = 0; // group in which this member is in
Grouping::GroupPri_t grouppri; // priority of this definition
QCString groupFileName; // file where this grouping was defined
int groupStartLine = 0; // line " " " " "
@@ -1420,8 +1302,6 @@ class MemberDefImpl::IMPL
MemberDefImpl::IMPL::IMPL() :
enumFields(0),
redefinedBy(0),
- exampleSDict(0),
- classSectionSDict(0),
category(0),
categoryRelation(0),
declLine(-1),
@@ -1433,12 +1313,10 @@ MemberDefImpl::IMPL::IMPL() :
MemberDefImpl::IMPL::~IMPL()
{
delete redefinedBy;
- delete exampleSDict;
delete enumFields;
- delete classSectionSDict;
}
-void MemberDefImpl::IMPL::init(Definition *def,
+void MemberDefImpl::IMPL::init(Definition *d,
const char *t,const char *a,const char *e,
Protection p,Specifier v,bool s,Relationship r,
MemberType mt,const ArgumentList &tal,
@@ -1456,7 +1334,6 @@ void MemberDefImpl::IMPL::init(Definition *def,
memDec=0;
group=0;
grpId=-1;
- exampleSDict=0;
enumFields=0;
enumScope=0;
livesInsideEnum=FALSE;
@@ -1473,7 +1350,7 @@ void MemberDefImpl::IMPL::init(Definition *def,
type=removeRedundantWhiteSpace(type);
args=a;
args=removeRedundantWhiteSpace(args);
- if (type.isEmpty()) decl=def->name()+args; else decl=type+" "+def->name()+args;
+ if (type.isEmpty()) decl=d->name()+args; else decl=type+" "+d->name()+args;
memberGroup=0;
virt=v;
@@ -1503,13 +1380,12 @@ void MemberDefImpl::IMPL::init(Definition *def,
// convert function declaration arguments (if any)
if (!args.isEmpty())
{
- stringToArgumentList(def->getLanguage(),args,declArgList,&extraTypeChars);
+ declArgList = *stringToArgumentList(d->getLanguage(),args,&extraTypeChars);
//printf("setDeclArgList %s to %s const=%d\n",args.data(),
// argListToString(declArgList).data(),declArgList->constSpecifier);
}
metaData = meta;
templateMaster = 0;
- classSectionSDict = 0;
docsForDefinition = TRUE;
isTypedefValCached = FALSE;
cachedTypedefValue = 0;
@@ -1519,7 +1395,7 @@ void MemberDefImpl::IMPL::init(Definition *def,
hasDocumentedParams = FALSE;
hasDocumentedReturnType = FALSE;
docProvider = 0;
- isDMember = def->getDefFileName().right(2).lower()==".d";
+ isDMember = d->getDefFileName().right(2).lower()==".d";
}
@@ -1554,7 +1430,7 @@ MemberDefImpl::MemberDefImpl(const char *df,int dl,int dc,
const char *t,const char *na,const char *a,const char *e,
Protection p,Specifier v,bool s,Relationship r,MemberType mt,
const ArgumentList &tal,const ArgumentList &al,const char *meta
- ) : DefinitionImpl(df,dl,dc,removeRedundantWhiteSpace(na))
+ ) : DefinitionMixin(df,dl,dc,removeRedundantWhiteSpace(na))
{
//printf("MemberDefImpl::MemberDef(%s)\n",na);
m_impl = new MemberDefImpl::IMPL;
@@ -1564,7 +1440,7 @@ MemberDefImpl::MemberDefImpl(const char *df,int dl,int dc,
m_isDestructorCached = 0;
}
-MemberDefImpl::MemberDefImpl(const MemberDefImpl &md) : DefinitionImpl(md)
+MemberDefImpl::MemberDefImpl(const MemberDefImpl &md) : DefinitionMixin(md)
{
m_impl = new MemberDefImpl::IMPL;
m_isLinkableCached = 0;
@@ -1580,9 +1456,7 @@ MemberDef *MemberDefImpl::deepCopy() const
*result->m_impl = *m_impl;
// clear pointers owned by object
result->m_impl->redefinedBy= 0;
- result->m_impl->exampleSDict=0;
result->m_impl->enumFields=0;
- result->m_impl->classSectionSDict=0;
// replace pointers owned by the object by deep copies
if (m_impl->redefinedBy)
{
@@ -1593,15 +1467,6 @@ MemberDef *MemberDefImpl::deepCopy() const
result->insertReimplementedBy(md);
}
}
- if (m_impl->exampleSDict)
- {
- ExampleSDict::Iterator it(*m_impl->exampleSDict);
- Example *e;
- for (it.toFirst();(e=it.current());++it)
- {
- result->addExample(e->anchor,e->name,e->file);
- }
- }
if (m_impl->enumFields)
{
MemberListIterator mli(*m_impl->enumFields);
@@ -1615,16 +1480,6 @@ MemberDef *MemberDefImpl::deepCopy() const
result->m_impl->tArgList = m_impl->tArgList;
result->m_impl->typeConstraints = m_impl->typeConstraints;
result->setDefinitionTemplateParameterLists(m_impl->defTmpArgLists);
- if (m_impl->classSectionSDict)
- {
- result->m_impl->classSectionSDict = new SDict<MemberList>(7);
- SDict<MemberList>::IteratorDict it(*m_impl->classSectionSDict);
- MemberList *ml;
- for (it.toFirst();(ml=it.current());++it)
- {
- result->m_impl->classSectionSDict->append(it.currentKey(),ml);
- }
- }
result->m_impl->declArgList = m_impl->declArgList;
return result;
}
@@ -1634,15 +1489,15 @@ void MemberDefImpl::moveTo(Definition *scope)
setOuterScope(scope);
if (scope->definitionType()==Definition::TypeClass)
{
- m_impl->classDef = dynamic_cast<ClassDef*>(scope);
+ m_impl->classDef = toClassDef(scope);
}
else if (scope->definitionType()==Definition::TypeFile)
{
- m_impl->fileDef = dynamic_cast<FileDef*>(scope);
+ m_impl->fileDef = toFileDef(scope);
}
else if (scope->definitionType()==Definition::TypeNamespace)
{
- m_impl->nspace = dynamic_cast<NamespaceDef*>(scope);
+ m_impl->nspace = toNamespaceDef(scope);
}
m_isLinkableCached = 0;
m_isConstructorCached = 0;
@@ -1666,7 +1521,11 @@ void MemberDefImpl::insertReimplementedBy(MemberDef *md)
{
if (m_impl->templateMaster)
{
- m_impl->templateMaster->insertReimplementedBy(md);
+ MemberDefMutable *mdm = toMemberDefMutable(m_impl->templateMaster);
+ if (mdm)
+ {
+ mdm->insertReimplementedBy(md);
+ }
}
if (m_impl->redefinedBy==0) m_impl->redefinedBy = new MemberList(MemberListType_redefinedBy);
if (m_impl->redefinedBy->findRef(md)==-1)
@@ -1712,30 +1571,15 @@ void MemberDefImpl::insertEnumField(MemberDef *md)
m_impl->enumFields->append(md);
}
-bool MemberDefImpl::addExample(const char *anchor,const char *nameStr,
- const char *file)
+bool MemberDefImpl::addExample(const char *anchor,const char *nameStr, const char *file)
{
//printf("%s::addExample(%s,%s,%s)\n",name().data(),anchor,nameStr,file);
- if (m_impl->exampleSDict==0) m_impl->exampleSDict = new ExampleSDict;
- if (m_impl->exampleSDict->find(nameStr)==0)
- {
- //printf("Add reference to example %s to member %s\n",nameStr,name.data());
- Example *e=new Example;
- e->anchor=anchor;
- e->name=nameStr;
- e->file=file;
- m_impl->exampleSDict->inSort(nameStr,e);
- return TRUE;
- }
- return FALSE;
+ return m_impl->examples.inSort(Example(anchor,nameStr,file));
}
bool MemberDefImpl::hasExamples() const
{
- if (m_impl->exampleSDict==0)
- return FALSE;
- else
- return m_impl->exampleSDict->count()>0;
+ return !m_impl->examples.empty();
}
QCString MemberDefImpl::getOutputFileBase() const
@@ -1804,7 +1648,7 @@ QCString MemberDefImpl::getOutputFileBase() const
QCString MemberDefImpl::getReference() const
{
- QCString ref = DefinitionImpl::getReference();
+ QCString ref = DefinitionMixin::getReference();
if (!ref.isEmpty())
{
return ref;
@@ -1939,25 +1783,25 @@ void MemberDefImpl::_computeLinkableInProject()
void MemberDefImpl::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
{
- DefinitionImpl::setDocumentation(d,docFile,docLine,stripWhiteSpace);
+ DefinitionMixin::setDocumentation(d,docFile,docLine,stripWhiteSpace);
m_isLinkableCached = 0;
}
void MemberDefImpl::setBriefDescription(const char *b,const char *briefFile,int briefLine)
{
- DefinitionImpl::setBriefDescription(b,briefFile,briefLine);
+ DefinitionMixin::setBriefDescription(b,briefFile,briefLine);
m_isLinkableCached = 0;
}
void MemberDefImpl::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
{
- DefinitionImpl::setInbodyDocumentation(d,inbodyFile,inbodyLine);
+ DefinitionMixin::setInbodyDocumentation(d,inbodyFile,inbodyLine);
m_isLinkableCached = 0;
}
void MemberDefImpl::setHidden(bool b)
{
- DefinitionImpl::setHidden(b);
+ DefinitionMixin::setHidden(b);
m_isLinkableCached = 0;
}
@@ -1985,7 +1829,7 @@ bool MemberDefImpl::isLinkable() const
}
-void MemberDefImpl::setDefinitionTemplateParameterLists(const std::vector<ArgumentList> &lists)
+void MemberDefImpl::setDefinitionTemplateParameterLists(const ArgumentLists &lists)
{
m_impl->defTmpArgLists = lists;
}
@@ -2002,10 +1846,10 @@ void MemberDefImpl::writeLink(OutputList &ol,
const NamespaceDef *nspace = getNamespaceDef();
if (!hideScopeNames)
{
- if (m_impl->enumScope && m_impl->livesInsideEnum)
- {
- n.prepend(m_impl->enumScope->displayName()+sep);
- }
+ //if (m_impl->enumScope && m_impl->livesInsideEnum)
+ //{
+ // n.prepend(m_impl->enumScope->displayName()+sep);
+ //}
if (classDef && gd && !isRelated())
{
n.prepend(classDef->displayName()+sep);
@@ -2114,12 +1958,17 @@ bool MemberDefImpl::isBriefSectionVisible() const
// "", //getFileDef()->name().data(),
// argsString());
- MemberGroupInfo *info = Doxygen::memGrpInfoDict[m_impl->grpId];
- //printf("name=%s m_impl->grpId=%d info=%p\n",name().data(),m_impl->grpId,info);
- //QCString *pMemGrp = Doxygen::memberDocDict[grpId];
- bool hasDocs = hasDocumentation() ||
+ auto it = Doxygen::memberGroupInfoMap.find(m_impl->grpId);
+ bool hasDocs = hasDocumentation();
+ if (it!=Doxygen::memberGroupInfoMap.end())
+ {
+ auto &info = it->second;
+ //printf("name=%s m_impl->grpId=%d info=%p\n",name().data(),m_impl->grpId,info);
+ //QCString *pMemGrp = Doxygen::memberDocDict[grpId];
+ hasDocs = hasDocs ||
// part of a documented member group
- (m_impl->grpId!=-1 && info && !(info->doc.isEmpty() && info->header.isEmpty()));
+ (m_impl->grpId!=-1 && !(info->doc.isEmpty() && info->header.isEmpty()));
+ }
// only include static members with file/namespace scope if
// explicitly enabled in the config file
@@ -2252,7 +2101,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
QCString cfname = getOutputFileBase();
// search for the last anonymous scope in the member type
- ClassDef *annoClassDef=getClassDefOfAnonymousType();
+ ClassDefMutable *annoClassDef=toClassDefMutable(getClassDefOfAnonymousType());
ol.startMemberDeclaration();
@@ -2430,6 +2279,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
static bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
static bool extractStatic = Config_getBool(EXTRACT_STATIC);
+ MemberDefMutable *annMemb = toMemberDefMutable(m_impl->annMemb);
//printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d hasDocumentation=%d\n",name().data(),gd,getGroupDef(),inGroup,isLinkable(),hasDocumentation());
if (!name().isEmpty() && // name valid
(hasDocumentation() || isReference()) && // has docs
@@ -2437,16 +2287,15 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
!(isStatic() && getClassDef()==0 && !extractStatic) // hidden due to static-ness
)
{
- if (m_impl->annMemb)
+ if (annMemb)
{
//printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
- m_impl->annMemb->writeLink(ol,
- m_impl->annMemb->getClassDef(),
- m_impl->annMemb->getNamespaceDef(),
- m_impl->annMemb->getFileDef(),
- m_impl->annMemb->getGroupDef()
- );
- m_impl->annMemb->setAnonymousUsed();
+ annMemb->writeLink(ol,
+ annMemb->getClassDef(),
+ annMemb->getNamespaceDef(),
+ annMemb->getFileDef(),
+ annMemb->getGroupDef());
+ annMemb->setAnonymousUsed();
setAnonymousUsed();
}
else
@@ -2467,9 +2316,9 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
// there is a brief member description and brief member
// descriptions are enabled or there is no detailed description.
{
- if (m_impl->annMemb)
+ if (annMemb)
{
- m_impl->annMemb->setAnonymousUsed();
+ annMemb->setAnonymousUsed();
setAnonymousUsed();
}
const ClassDef *rcd = cd;
@@ -2559,7 +2408,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
ol.docify(" [implementation]");
ol.endTypewriter();
}
-
+
bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
if (isProperty() && (isSettable() || isGettable() ||
@@ -2570,7 +2419,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
ol.startTypewriter();
ol.docify(" [");
QStrList sl;
-
+
if (isGettable()) sl.append("get");
if (isProtectedGettable()) sl.append("protected get");
if (isSettable()) sl.append("set");
@@ -2631,8 +2480,8 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
)
{
DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),
- getOuterScope()?getOuterScope():d,this,briefDescription(),
- TRUE,FALSE,0,TRUE,FALSE);
+ getOuterScope()?getOuterScope():d,this,briefDescription(),TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
if (rootNode && !rootNode->isEmpty())
{
@@ -2640,7 +2489,6 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
ol.writeDoc(rootNode,getOuterScope()?getOuterScope():d,this);
if (detailsVisible)
{
- static bool separateMemberPages = Config_getBool(SEPARATE_MEMBER_PAGES);
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
//ol.endEmphasis();
@@ -2759,7 +2607,7 @@ void MemberDefImpl::getLabels(QStrList &sl,const Definition *container) const
isFriend() || isRelated() ||
(isInline() && inlineInfo) ||
isSignal() || isSlot() ||
- isStatic() ||
+ isStatic() || isExternal() ||
(getClassDef() && getClassDef()!=container && container->definitionType()==TypeClass) ||
(m_impl->memSpec & ~Entry::Inline)!=0
)
@@ -2771,7 +2619,7 @@ void MemberDefImpl::getLabels(QStrList &sl,const Definition *container) const
//ol.docify(" [");
SrcLangExt lang = getLanguage();
bool optVhdl = lang==SrcLangExt_VHDL;
- bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
+ static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
if (optVhdl)
{
sl.append(theTranslator->trVhdlType(getMemberSpecifiers(),TRUE));
@@ -2782,7 +2630,8 @@ void MemberDefImpl::getLabels(QStrList &sl,const Definition *container) const
else if (isRelated()) sl.append("related");
else
{
- if (Config_getBool(INLINE_INFO) && isInline()) sl.append("inline");
+ if (isExternal()) sl.append("extern");
+ if (inlineInfo && isInline()) sl.append("inline");
if (isExplicit()) sl.append("explicit");
if (isMutable()) sl.append("mutable");
if (isStatic()) sl.append("static");
@@ -3110,7 +2959,7 @@ void MemberDefImpl::_writeExamples(OutputList &ol) const
{
ol.startExamples();
ol.startDescForItem();
- writeExample(ol,m_impl->exampleSDict);
+ writeExamples(ol,m_impl->examples);
ol.endDescForItem();
ol.endExamples();
}
@@ -3172,7 +3021,8 @@ void MemberDefImpl::_writeEnumValues(OutputList &ol,const Definition *container,
{
ol.generateDoc(fmd->briefFile(),fmd->briefLine(),
getOuterScope()?getOuterScope():container,
- fmd,fmd->briefDescription(),TRUE,FALSE);
+ fmd,fmd->briefDescription(),TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
// FIXME:PARA
//if (!fmd->briefDescription().isEmpty() &&
@@ -3184,7 +3034,8 @@ void MemberDefImpl::_writeEnumValues(OutputList &ol,const Definition *container,
{
ol.generateDoc(fmd->docFile(),fmd->docLine(),
getOuterScope()?getOuterScope():container,
- fmd,fmd->documentation()+"\n",TRUE,FALSE);
+ fmd,fmd->documentation()+"\n",TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
ol.endDescTableData();
ol.endDescTableRow();
@@ -3337,8 +3188,6 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
{
// if this member is in a group find the real scope name.
bool hasParameterList = FALSE;
- bool inFile = container->definitionType()==Definition::TypeFile;
- bool hasDocs = isDetailedSectionVisible(inGroup,inFile);
//printf("MemberDefImpl::writeDocumentation(): name='%s' hasDocs='%d' containerType=%d inGroup=%d sectionLinkable=%d\n",
// name().data(),hasDocs,container->definitionType(),inGroup,isDetailedSectionLinkable());
@@ -3360,7 +3209,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
if (getClassDef()) { scopeName=getClassDef()->displayName(); scopedContainer=getClassDef(); }
else if (getNamespaceDef()) { scopeName=getNamespaceDef()->displayName(); scopedContainer=getNamespaceDef(); }
else if (getFileDef()) { scopeName=getFileDef()->displayName(); scopedContainer=getFileDef(); }
- ciname = (dynamic_cast<const GroupDef *>(container))->groupTitle();
+ ciname = (toGroupDef(container))->groupTitle();
}
else if (container->definitionType()==TypeFile && getNamespaceDef() && getNamespaceDef()->isLinkable())
{ // member is in a namespace, but is written as part of the file documentation
@@ -3458,7 +3307,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
{
//printf("Anonymous compound '%s'\n",cname.data());
ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
- ol.startMemberDoc(ciname,name(),memAnchor,name(),memCount,memTotal,showInline);
+ ol.startMemberDoc(ciname,name(),memAnchor,"",memCount,memTotal,showInline);
// search for the last anonymous compound name in the definition
int si=ldef.find(' '),pi,ei=i+l;
if (si==-1) si=0;
@@ -3494,7 +3343,6 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
if (!Config_getBool(HIDE_SCOPE_NAMES))
{
bool first=TRUE;
- SrcLangExt lang = getLanguage();
if (!m_impl->defTmpArgLists.empty() && lang==SrcLangExt_Cpp)
// definition has explicit template parameter declarations
{
@@ -3567,9 +3415,9 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
{
ldef=ldef.left(dp+1);
}
- int l=ldef.length();
+ int dl=ldef.length();
//printf("start >%s<\n",ldef.data());
- int i=l-1;
+ i=dl-1;
while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
while (i>=0 && isspace((uchar)ldef.at(i))) i--;
if (i>0)
@@ -3707,12 +3555,12 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
else
ol.parseText(theTranslator->trInitialValue());
ol.endBold();
- CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
- intf.resetCodeParserState();
- ol.startCodeFragment();
- intf.parseCode(ol,scopeName,m_impl->initializer,lang,FALSE,0,const_cast<FileDef*>(getFileDef()),
+ auto intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
+ intf->resetCodeParserState();
+ ol.startCodeFragment("DoxyCode");
+ intf->parseCode(ol,scopeName,m_impl->initializer,lang,FALSE,0,const_cast<FileDef*>(getFileDef()),
-1,-1,TRUE,this,FALSE,this);
- ol.endCodeFragment();
+ ol.endCodeFragment("DoxyCode");
}
QCString brief = briefDescription();
@@ -3735,7 +3583,8 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
ol.startParagraph();
ol.generateDoc(briefFile(),briefLine(),
scopedContainer,this,
- brief,FALSE,FALSE,0,TRUE,FALSE);
+ brief,FALSE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endParagraph();
}
@@ -3751,14 +3600,16 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
}
else
{
- ol.generateDoc(docFile(),docLine(),scopedContainer,this,detailed+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),scopedContainer,this,detailed+"\n",TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
if (!inbodyDocumentation().isEmpty())
{
ol.generateDoc(inbodyFile(),inbodyLine(),
- scopedContainer,this,
- inbodyDocumentation()+"\n",TRUE,FALSE);
+ scopedContainer,this,
+ inbodyDocumentation()+"\n",TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
}
else if (!brief.isEmpty() && (Config_getBool(REPEAT_BRIEF) ||
@@ -3766,7 +3617,8 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
{
if (!inbodyDocumentation().isEmpty())
{
- ol.generateDoc(inbodyFile(),inbodyLine(),scopedContainer,this,inbodyDocumentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(inbodyFile(),inbodyLine(),scopedContainer,this,inbodyDocumentation()+"\n",TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
}
@@ -3783,7 +3635,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
{
QCString docsWithoutDir = a.docs;
QCString direction = extractDirection(docsWithoutDir);
- paramDocs+="@param"+direction+" "+a.name+" "+a.docs;
+ paramDocs+="@param"+direction+" "+a.name+" "+docsWithoutDir;
}
}
// feed the result to the documentation parser
@@ -3793,7 +3645,8 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
this, // memberDef
paramDocs, // docStr
TRUE, // indexWords
- FALSE // isExample
+ FALSE, // isExample
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT)
);
}
@@ -3925,7 +3778,7 @@ void MemberDefImpl::writeMemberDocSimple(OutputList &ol, const Definition *conta
//printf("===> %s::anonymous: %s\n",name().data(),cd?cd->name().data():"<none>");
if (container && container->definitionType()==Definition::TypeClass &&
- !(dynamic_cast<const ClassDef*>(container))->isJavaEnum())
+ !(toClassDef(container))->isJavaEnum())
{
ol.startInlineMemberType();
ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
@@ -3987,7 +3840,8 @@ void MemberDefImpl::writeMemberDocSimple(OutputList &ol, const Definition *conta
{
ol.generateDoc(briefFile(),briefLine(),
getOuterScope()?getOuterScope():container,this,
- brief,FALSE,FALSE,0,TRUE,FALSE);
+ brief,FALSE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
/* write detailed description */
@@ -3995,7 +3849,8 @@ void MemberDefImpl::writeMemberDocSimple(OutputList &ol, const Definition *conta
{
ol.generateDoc(docFile(),docLine(),
getOuterScope()?getOuterScope():container,this,
- detailed+"\n",FALSE,FALSE,0,FALSE,FALSE);
+ detailed+"\n",FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
@@ -4037,16 +3892,13 @@ void MemberDefImpl::warnIfUndocumented() const
const FileDef *fd = getFileDef();
const GroupDef *gd = getGroupDef();
const Definition *d=0;
- const char *t=0;
+ QCString t;
if (cd)
- t="class", d=cd;
+ t=cd->compoundTypeString(), d=cd;
else if (nd)
{
d=nd;
- if (d->getLanguage() == SrcLangExt_Fortran)
- t="module";
- else
- t="namespace";
+ t=nd->compoundTypeString();
}
else if (gd)
t="group", d=gd;
@@ -4065,19 +3917,44 @@ void MemberDefImpl::warnIfUndocumented() const
)
{
warn_undoc(getDefFileName(),getDefLine(),"Member %s%s (%s) of %s %s is not documented.",
- qPrint(name()),qPrint(argsString()),qPrint(memberTypeName()),t,qPrint(d->name()));
+ qPrint(name()),qPrint(argsString()),qPrint(memberTypeName()),qPrint(t),qPrint(d->name()));
}
else if (!isDetailedSectionLinkable())
{
warnIfUndocumentedParams();
}
}
+static QCString stripTrailingReturn(const QCString trailRet)
+{
+ QCString ret = trailRet;
+
+ ret = ret.stripWhiteSpace();
+ if (ret.startsWith("->"))
+ {
+ ret = ret.mid(2).stripWhiteSpace();
+ return ret;
+ }
+ return trailRet;
+}
void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const
{
if (!Config_getBool(WARN_NO_PARAMDOC)) return;
- QCString returnType = typeString();
+ QCString returnType = typeString();
bool isPython = getLanguage()==SrcLangExt_Python;
+ bool isFortran = getLanguage()==SrcLangExt_Fortran;
+ bool isFortranSubroutine = isFortran && returnType.find("subroutine")!=-1;
+
+ bool isVoidReturn = (returnType=="void") || (returnType.right(5)==" void");
+ if (!isVoidReturn && returnType == "auto")
+ {
+ const ArgumentList &defArgList=isDocsForDefinition() ? argumentList() : declArgumentList();
+ if (!defArgList.trailingReturnType().isEmpty())
+ {
+ QCString strippedTrailingReturn = stripTrailingReturn(defArgList.trailingReturnType());
+ isVoidReturn = (strippedTrailingReturn=="void") || (strippedTrailingReturn.right(5)==" void");
+ }
+ }
if (!m_impl->hasDocumentedParams && hasParamCommand)
{
@@ -4139,8 +4016,8 @@ void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturn
else if ( // see if return type is documented in a function w/o return type
hasReturnCommand &&
(
- returnType=="void" || // void return type
- returnType.find("subroutine")!=-1 || // fortran subroutine
+ isVoidReturn || // void return type
+ isFortranSubroutine || // fortran subroutine
isConstructor() || // a constructor
isDestructor() // or destructor
)
@@ -4149,12 +4026,12 @@ void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturn
warn_doc_error(getDefFileName(),getDefLine(),"documented empty return type of %s",
qualifiedName().data());
}
- else if ( // see if return needs to documented
+ else if ( // see if return needs to documented
m_impl->hasDocumentedReturnType ||
- returnType=="void" || // void return type
- returnType.find("subroutine")!=-1 || // fortran subroutine
- isConstructor() || // a constructor
- isDestructor() // or destructor
+ isVoidReturn || // void return type
+ isFortranSubroutine || // fortran subroutine
+ isConstructor() || // a constructor
+ isDestructor() // or destructor
)
{
m_impl->hasDocumentedReturnType = TRUE;
@@ -4166,6 +4043,7 @@ void MemberDefImpl::warnIfUndocumentedParams() const
if (!Config_getBool(EXTRACT_ALL) &&
Config_getBool(WARN_IF_UNDOCUMENTED) &&
Config_getBool(WARN_NO_PARAMDOC) &&
+ isFunction() &&
!isDeleted() &&
!isReference() &&
!Doxygen::suppressDocWarnings)
@@ -4178,7 +4056,7 @@ void MemberDefImpl::warnIfUndocumentedParams() const
qPrint(qualifiedName()));
}
if (!m_impl->hasDocumentedReturnType &&
- isFunction() && hasDocumentation() && !returnType.isEmpty())
+ hasDocumentation() && !returnType.isEmpty())
{
warn_doc_error(getDefFileName(),getDefLine(),
"return type of member %s is not documented",
@@ -4199,12 +4077,12 @@ bool MemberDefImpl::isDocumentedFriendClass() const
bool MemberDefImpl::isDeleted() const
{
- return m_impl->defArgList.isDeleted;
+ return m_impl->defArgList.isDeleted();
}
bool MemberDefImpl::hasDocumentation() const
{
- return DefinitionImpl::hasDocumentation() ||
+ return DefinitionMixin::hasDocumentation() ||
(m_impl->mtype==MemberType_Enumeration && m_impl->docEnumValues) || // has enum values
(m_impl->defArgList.hasDocumentation()); // has doc arguments
}
@@ -4212,7 +4090,7 @@ bool MemberDefImpl::hasDocumentation() const
#if 0
bool MemberDefImpl::hasUserDocumentation() const
{
- bool hasDocs = DefinitionImpl::hasUserDocumentation();
+ bool hasDocs = DefinitionMixin::hasUserDocumentation();
return hasDocs;
}
#endif
@@ -4290,7 +4168,7 @@ void MemberDefImpl::setAnchor()
m_impl->anc = "a"+sigStr;
}
-void MemberDefImpl::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+void MemberDefImpl::setGroupDef(const GroupDef *gd,Grouping::GroupPri_t pri,
const QCString &fileName,int startLine,
bool hasDocs,MemberDef *member)
{
@@ -4310,45 +4188,43 @@ void MemberDefImpl::setEnumScope(MemberDef *md,bool livesInsideEnum)
m_impl->livesInsideEnum=livesInsideEnum;
if (md->getGroupDef())
{
- m_impl->group=md->getGroupDef();
- m_impl->grouppri=md->getGroupPri();
- m_impl->groupFileName=md->getGroupFileName();
- m_impl->groupStartLine=md->getGroupStartLine();
- m_impl->groupHasDocs=md->getGroupHasDocs();
+ m_impl->group = const_cast<GroupDef*>(md->getGroupDef());
+ m_impl->grouppri = md->getGroupPri();
+ m_impl->groupFileName = md->getGroupFileName();
+ m_impl->groupStartLine = md->getGroupStartLine();
+ m_impl->groupHasDocs = md->getGroupHasDocs();
m_isLinkableCached = 0;
}
}
-void MemberDefImpl::setMemberClass(ClassDef *cd)
+void MemberDefImpl::setMemberClass(const ClassDef *cd)
{
m_impl->classDef=cd;
m_isLinkableCached = 0;
m_isConstructorCached = 0;
- setOuterScope(cd);
+ setOuterScope(const_cast<ClassDef*>(cd));
}
-void MemberDefImpl::setNamespace(NamespaceDef *nd)
+void MemberDefImpl::setNamespace(const NamespaceDef *nd)
{
m_impl->nspace=nd;
- setOuterScope(nd);
+ setOuterScope(const_cast<NamespaceDef*>(nd));
}
-MemberDef *MemberDefImpl::createTemplateInstanceMember(
- const ArgumentList &formalArgs,const ArgumentList &actualArgs) const
+MemberDefMutable *MemberDefImpl::createTemplateInstanceMember(
+ const ArgumentList &formalArgs,const std::unique_ptr<ArgumentList> &actualArgs) const
{
//printf(" Member %s %s %s\n",typeString(),name().data(),argsString());
- ArgumentList actualArgList;
+ std::unique_ptr<ArgumentList> actualArgList = std::make_unique<ArgumentList>(m_impl->defArgList);
if (!m_impl->defArgList.empty())
{
- actualArgList = m_impl->defArgList;
-
// replace formal arguments with actuals
- for (Argument &arg : actualArgList)
+ for (Argument &arg : *actualArgList)
{
arg.type = substituteTemplateArgumentsInString(arg.type,formalArgs,actualArgs);
}
- actualArgList.trailingReturnType =
- substituteTemplateArgumentsInString(actualArgList.trailingReturnType,formalArgs,actualArgs);
+ actualArgList->setTrailingReturnType(
+ substituteTemplateArgumentsInString(actualArgList->trailingReturnType(),formalArgs,actualArgs));
}
QCString methodName=name();
@@ -4357,19 +4233,19 @@ MemberDef *MemberDefImpl::createTemplateInstanceMember(
methodName=substituteTemplateArgumentsInString(methodName,formalArgs,actualArgs);
}
- MemberDef *imd = createMemberDef(
+ MemberDefMutable *imd = createMemberDef(
getDefFileName(),getDefLine(),getDefColumn(),
substituteTemplateArgumentsInString(m_impl->type,formalArgs,actualArgs),
methodName,
substituteTemplateArgumentsInString(m_impl->args,formalArgs,actualArgs),
m_impl->exception, m_impl->prot,
- m_impl->virt, m_impl->stat, m_impl->related, m_impl->mtype,
+ m_impl->virt, m_impl->stat, m_impl->related, m_impl->mtype,
ArgumentList(), ArgumentList(), ""
);
- imd->setArgumentList(actualArgList);
+ imd->moveArgumentList(std::move(actualArgList));
imd->setDefinition(substituteTemplateArgumentsInString(m_impl->def,formalArgs,actualArgs));
imd->setBodyDef(getBodyDef());
- imd->setBodySegment(getStartBodyLine(),getEndBodyLine());
+ imd->setBodySegment(getDefLine(),getStartBodyLine(),getEndBodyLine());
//imd->setBodyMember(this);
// TODO: init other member variables (if needed).
@@ -4431,7 +4307,7 @@ void MemberDefImpl::addListReference(Definition *)
QCString memName = name();
Definition *pd=getOuterScope();
QCString pdName = pd->definitionType()==Definition::TypeClass ?
- (dynamic_cast<ClassDef*>(pd))->displayName() : pd->name();
+ (toClassDef(pd))->displayName() : pd->name();
QCString sep = getLanguageSpecificSeparator(lang,TRUE);
QCString memArgs;
if (!isRelated()
@@ -4456,32 +4332,23 @@ void MemberDefImpl::addListReference(Definition *)
memArgs = argsString();
}
}
- const std::vector<ListItemInfo> &xrefItems = xrefListItems();
+ const RefItemVector &xrefItems = xrefListItems();
addRefItem(xrefItems,
qualifiedName()+argsString(), // argsString is needed for overloaded functions (see bug 609624)
memLabel,
getOutputFileBase()+"#"+anchor(),memName,memArgs,pd);
}
-const MemberList *MemberDefImpl::getSectionList() const
+const MemberList *MemberDefImpl::getSectionList(const Definition *container) const
{
- const Definition *d= resolveAlias()->getOuterScope();
- char key[20];
- sprintf(key,"%p",d);
- return (d!=0 && m_impl->classSectionSDict) ? m_impl->classSectionSDict->find(key) : 0;
+ auto it = m_impl->sectionMap.find(container);
+ return it!=m_impl->sectionMap.end() ? it->second : 0;
}
-void MemberDefImpl::setSectionList(MemberList *sl)
+void MemberDefImpl::setSectionList(const Definition *container,const MemberList *sl)
{
- //printf("MemberDefImpl::setSectionList(%p,%p) name=%s\n",d,sl,name().data());
- const Definition *d= resolveAlias()->getOuterScope();
- char key[20];
- sprintf(key,"%p",d);
- if (m_impl->classSectionSDict==0)
- {
- m_impl->classSectionSDict = new SDict<MemberList>(7);
- }
- m_impl->classSectionSDict->append(key,sl);
+ //printf("MemberDefImpl::setSectionList(%s,%p) name=%s\n",d->name().data(),sl,name().data());
+ m_impl->sectionMap.insert(std::make_pair(container,sl));
}
Specifier MemberDefImpl::virtualness(int count) const
@@ -4550,7 +4417,7 @@ void MemberDefImpl::writeTagFile(FTextStream &tagFile) const
tagFile << " <type>" << convertToXML(typeString()) << "</type>" << endl;
}
tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
- tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
+ tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</anchorfile>" << endl;
tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
QCString idStr = id();
if (!idStr.isEmpty())
@@ -4571,7 +4438,7 @@ void MemberDefImpl::writeTagFile(FTextStream &tagFile) const
{
tagFile << " <enumvalue file=\"" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension);
tagFile << "\" anchor=\"" << convertToXML(fmd->anchor());
- QCString idStr = fmd->id();
+ idStr = fmd->id();
if (!idStr.isEmpty())
{
tagFile << "\" clangid=\"" << convertToXML(idStr);
@@ -4606,11 +4473,6 @@ void MemberDefImpl::_computeIsConstructor()
m_isConstructorCached = 2; // TRUE
return;
}
- else if (getLanguage()==SrcLangExt_Tcl) // for Tcl
- {
- m_isConstructorCached = name()=="constructor" ? 2 : 1;
- return;
- }
else // for other languages
{
QCString locName = getClassDef()->localName();
@@ -4651,10 +4513,6 @@ void MemberDefImpl::_computeIsDestructor()
{
isDestructor = name()=="__destruct";
}
- else if (getLanguage()==SrcLangExt_Tcl) // for Tcl
- {
- isDestructor = name()=="destructor";
- }
else if (name()=="__del__" &&
getLanguage()==SrcLangExt_Python) // for Python
{
@@ -4735,12 +4593,17 @@ void MemberDefImpl::writeEnumDeclaration(OutputList &typeDecl,
if (fmdl)
{
MemberListIterator mli(*fmdl);
- MemberDef *fmd=mli.current();
+ MemberDefMutable *fmd=toMemberDefMutable(mli.current());
bool fmdVisible = fmd ? fmd->isBriefSectionVisible() : TRUE;
+ bool first=true;
while (fmd)
{
if (fmdVisible)
{
+ if (!first)
+ {
+ typeDecl.writeString(", ");
+ }
/* in html we start a new line after a number of items */
if (numVisibleEnumValues>enumValuesPerLine
&& (enumMemCount%enumValuesPerLine)==0
@@ -4775,15 +4638,12 @@ void MemberDefImpl::writeEnumDeclaration(OutputList &typeDecl,
typeDecl.writeString(" ");
typeDecl.parseText(fmd->initializer());
}
+ first=false;
}
bool prevVisible = fmdVisible;
++mli;
- fmd=mli.current();
- if (fmd && (fmdVisible=fmd->isBriefSectionVisible()))
- {
- typeDecl.writeString(", ");
- }
+ fmd=toMemberDefMutable(mli.current());
if (prevVisible)
{
typeDecl.disable(OutputGenerator::Man);
@@ -4804,14 +4664,14 @@ void MemberDefImpl::writeEnumDeclaration(OutputList &typeDecl,
}
}
-void MemberDefImpl::setArgumentList(const ArgumentList &al)
+void MemberDefImpl::moveArgumentList(std::unique_ptr<ArgumentList> al)
{
- m_impl->defArgList = al;
+ m_impl->defArgList = *al;
}
-void MemberDefImpl::setDeclArgumentList(const ArgumentList &al)
+void MemberDefImpl::moveDeclArgumentList(std::unique_ptr<ArgumentList> al)
{
- m_impl->declArgList = al;
+ m_impl->declArgList = *al;
}
void MemberDefImpl::setTypeConstraints(const ArgumentList &al)
@@ -4837,6 +4697,7 @@ ClassDef *MemberDefImpl::accessorClass() const
void MemberDefImpl::findSectionsInDocumentation()
{
+ docFindSections(briefDescription(),this,docFile());
docFindSections(documentation(),this,docFile());
}
@@ -4917,7 +4778,7 @@ QCString MemberDefImpl::qualifiedName() const
}
else
{
- return DefinitionImpl::qualifiedName();
+ return DefinitionMixin::qualifiedName();
}
}
@@ -5004,31 +4865,16 @@ const ClassDef *MemberDefImpl::getClassDef() const
return m_impl->classDef;
}
-ClassDef *MemberDefImpl::getClassDef()
-{
- return m_impl->classDef;
-}
-
const FileDef *MemberDefImpl::getFileDef() const
{
return m_impl->fileDef;
}
-FileDef *MemberDefImpl::getFileDef()
-{
- return m_impl->fileDef;
-}
-
const NamespaceDef* MemberDefImpl::getNamespaceDef() const
{
return m_impl->nspace;
}
-NamespaceDef* MemberDefImpl::getNamespaceDef()
-{
- return m_impl->nspace;
-}
-
const char *MemberDefImpl::getReadAccessor() const
{
return m_impl->read;
@@ -5044,11 +4890,6 @@ const GroupDef *MemberDefImpl::getGroupDef() const
return m_impl->group;
}
-GroupDef *MemberDefImpl::getGroupDef()
-{
- return m_impl->group;
-}
-
Grouping::GroupPri_t MemberDefImpl::getGroupPri() const
{
return m_impl->grouppri;
@@ -5461,9 +5302,9 @@ const MemberList *MemberDefImpl::enumFieldList() const
return m_impl->enumFields;
}
-ExampleSDict *MemberDefImpl::getExamples() const
+const ExampleList &MemberDefImpl::getExamples() const
{
- return m_impl->exampleSDict;
+ return m_impl->examples;
}
bool MemberDefImpl::isPrototype() const
@@ -5486,12 +5327,60 @@ const ArgumentList &MemberDefImpl::declArgumentList() const
return m_impl->declArgList;
}
+void MemberDefImpl::resolveUnnamedParameters(const MemberDef *md)
+{
+ ArgumentList &decAl = m_impl->declArgList;
+ ArgumentList &defAl = m_impl->defArgList;
+ const ArgumentList &decAlSrc = md->declArgumentList();
+ const ArgumentList &defAlSrc = md->argumentList();
+ auto decSrc = decAlSrc.begin(), defSrc = defAlSrc.begin();
+ for (auto decIt = decAl.begin(), defIt = defAl.begin();
+ decIt != decAl.end() && defIt != defAl.end() && decSrc != decAlSrc.end() && defSrc != defAlSrc.end();
+ ++decIt, ++defIt, ++decSrc, ++defSrc++)
+ {
+ Argument &decA = *decIt;
+ Argument &defA = *defIt;
+ const Argument &decAS = *decSrc;
+ const Argument &defAS = *defSrc;
+ if (decA.name.isEmpty())
+ {
+ if (!defA.name.isEmpty())
+ {
+ decA.name = defA.name;
+ }
+ else if (!decAS.name.isEmpty())
+ {
+ decA.name = decAS.name;
+ }
+ else if (!defAS.name.isEmpty())
+ {
+ decA.name = defAS.name;
+ }
+ }
+ if (defA.name.isEmpty())
+ {
+ if (!decA.name.isEmpty())
+ {
+ defA.name = decA.name;
+ }
+ else if (!decAS.name.isEmpty())
+ {
+ defA.name = decAS.name;
+ }
+ else if (!defAS.name.isEmpty())
+ {
+ defA.name = defAS.name;
+ }
+ }
+ }
+}
+
const ArgumentList &MemberDefImpl::templateArguments() const
{
return m_impl->tArgList;
}
-const std::vector<ArgumentList> &MemberDefImpl::definitionTemplateParameterLists() const
+const ArgumentLists &MemberDefImpl::definitionTemplateParameterLists() const
{
return m_impl->defTmpArgLists;
}
@@ -5616,7 +5505,7 @@ void MemberDefImpl::setDefinition(const char *d)
m_impl->def=d;
}
-void MemberDefImpl::setFileDef(FileDef *fd)
+void MemberDefImpl::setFileDef(const FileDef *fd)
{
m_impl->fileDef=fd;
m_isLinkableCached = 0;
@@ -5906,7 +5795,7 @@ int MemberDefImpl::numberOfFlowKeyWords() const
QCString MemberDefImpl::displayName(bool) const
{
- return DefinitionImpl::name();
+ return DefinitionMixin::name();
}
void MemberDefImpl::addToSearchIndex() const
@@ -5942,8 +5831,8 @@ static void transferArgumentDocumentation(ArgumentList &decAl,ArgumentList &defA
decIt!= decAl.end() && defIt!= defAl.end();
++decIt, ++defIt)
{
- Argument decA = *decIt;
- Argument defA = *defIt;
+ Argument &decA = *decIt;
+ Argument &defA = *defIt;
if (decA.docs.isEmpty() && !defA.docs.isEmpty())
{
decA.docs = defA.docs;
@@ -5952,10 +5841,21 @@ static void transferArgumentDocumentation(ArgumentList &decAl,ArgumentList &defA
{
defA.docs = decA.docs;
}
+ if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
+ {
+ if (decA.name.isEmpty() && !defA.name.isEmpty())
+ {
+ decA.name = defA.name;
+ }
+ else if (defA.name.isEmpty() && !decA.name.isEmpty())
+ {
+ defA.name = decA.name;
+ }
+ }
}
}
-void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
+void combineDeclarationAndDefinition(MemberDefMutable *mdec,MemberDefMutable *mdef)
{
//printf("mdec=%s isPrototype()=%d\n",mdec->name().data(),mdec->isPrototype());
if (
@@ -5967,12 +5867,10 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
// mdef, mdef ? mdef->name().data() : "",
// mdec, mdec ? mdec->name().data() : "");
- const MemberDef *cmdec = const_cast<const MemberDef*>(mdec);
- const MemberDef *cmdef = const_cast<const MemberDef*>(mdef);
- ArgumentList &mdefAl = mdef->argumentList();
- ArgumentList &mdecAl = mdec->argumentList();
- if (matchArguments2(cmdef->getOuterScope(),cmdef->getFileDef(),mdefAl,
- cmdec->getOuterScope(),cmdec->getFileDef(),mdecAl,
+ ArgumentList &mdefAl = const_cast<ArgumentList&>(mdef->argumentList());
+ ArgumentList &mdecAl = const_cast<ArgumentList&>(mdec->argumentList());
+ if (matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),&mdefAl,
+ mdec->getOuterScope(),mdec->getFileDef(),&mdecAl,
TRUE
)
) /* match found */
@@ -5983,6 +5881,11 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
// mdec->getFileDef()->name().data(),mdec->documentation().data()
// );
+ if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
+ {
+ mdec->resolveUnnamedParameters(mdef);
+ }
+
// first merge argument documentation
transferArgumentDocumentation(mdecAl,mdefAl);
@@ -6002,10 +5905,9 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
mdec->setDocsForDefinition(mdef->isDocsForDefinition());
if (mdefAl.hasParameters())
{
- ArgumentList mdefAlComb;
- stringToArgumentList(mdef->getLanguage(),mdef->argsString(),mdefAlComb);
- transferArgumentDocumentation(mdefAl,mdefAlComb);
- mdec->setArgumentList(mdefAlComb);
+ auto mdefAlComb = stringToArgumentList(mdef->getLanguage(),mdef->argsString());
+ transferArgumentDocumentation(mdefAl,*mdefAlComb);
+ mdec->moveArgumentList(std::move(mdefAlComb));
}
}
else if (!mdec->documentation().isEmpty())
@@ -6015,10 +5917,9 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
mdef->setDocsForDefinition(mdec->isDocsForDefinition());
if (mdecAl.hasParameters())
{
- ArgumentList mdecAlComb;
- stringToArgumentList(mdec->getLanguage(),mdec->argsString(),mdecAlComb);
- transferArgumentDocumentation(mdecAl,mdecAlComb);
- mdef->setDeclArgumentList(mdecAlComb);
+ auto mdecAlComb = stringToArgumentList(mdec->getLanguage(),mdec->argsString());
+ transferArgumentDocumentation(mdecAl,*mdecAlComb);
+ mdef->moveDeclArgumentList(std::move(mdecAlComb));
}
}
if (!mdef->inbodyDocumentation().isEmpty())
@@ -6032,21 +5933,20 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1)
{
//printf("body mdec->mdef %d-%d\n",mdec->getStartBodyLine(),mdef->getEndBodyLine());
- mdef->setBodySegment(mdec->getStartBodyLine(),mdec->getEndBodyLine());
+ mdef->setBodySegment(mdec->getDefLine(),mdec->getStartBodyLine(),mdec->getEndBodyLine());
mdef->setBodyDef(mdec->getBodyDef());
//mdef->setBodyMember(mdec);
}
else if (mdef->getStartBodyLine()!=-1 && mdec->getStartBodyLine()==-1)
{
//printf("body mdef->mdec %d-%d\n",mdef->getStartBodyLine(),mdec->getEndBodyLine());
- mdec->setBodySegment(mdef->getStartBodyLine(),mdef->getEndBodyLine());
+ mdec->setBodySegment(mdef->getDefLine(),mdef->getStartBodyLine(),mdef->getEndBodyLine());
mdec->setBodyDef(mdef->getBodyDef());
//mdec->setBodyMember(mdef);
}
mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers());
mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers());
-
// copy group info.
if (mdec->getGroupDef()==0 && mdef->getGroupDef()!=0)
{
@@ -6097,7 +5997,7 @@ QCString MemberDefImpl::briefDescription(bool abbr) const
}
else
{
- return DefinitionImpl::briefDescription(abbr);
+ return DefinitionMixin::briefDescription(abbr);
}
}
@@ -6109,7 +6009,7 @@ QCString MemberDefImpl::documentation() const
}
else
{
- return DefinitionImpl::documentation();
+ return DefinitionMixin::documentation();
}
}
@@ -6153,7 +6053,114 @@ bool MemberDefImpl::isRelatedOrFriend() const
bool MemberDefImpl::isReference() const
{
- return DefinitionImpl::isReference() ||
+ return DefinitionMixin::isReference() ||
(m_impl->templateMaster && m_impl->templateMaster->isReference());
}
+//-------------------------------------------------------------------------------
+// Helpers
+
+void addDocCrossReference(MemberDefMutable *src,MemberDefMutable *dst)
+{
+ if (src==0 || dst==0) return;
+ //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+ if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+ if ((dst->hasReferencedByRelation() || dst->hasCallerGraph()) &&
+ src->showInCallGraph()
+ )
+ {
+ dst->addSourceReferencedBy(src);
+ MemberDefMutable *mdDef = toMemberDefMutable(dst->memberDefinition());
+ if (mdDef)
+ {
+ mdDef->addSourceReferencedBy(src);
+ }
+ MemberDefMutable *mdDecl = toMemberDefMutable(dst->memberDeclaration());
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferencedBy(src);
+ }
+ }
+ if ((src->hasReferencesRelation() || src->hasCallGraph()) &&
+ src->showInCallGraph()
+ )
+ {
+ src->addSourceReferences(dst);
+ MemberDefMutable *mdDef = toMemberDefMutable(src->memberDefinition());
+ if (mdDef)
+ {
+ mdDef->addSourceReferences(dst);
+ }
+ MemberDefMutable *mdDecl = toMemberDefMutable(src->memberDeclaration());
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferences(dst);
+ }
+ }
+}
+
+// --- Cast functions
+//
+MemberDef *toMemberDef(Definition *d)
+{
+ if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
+ {
+ return static_cast<MemberDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+MemberDef *toMemberDef(DefinitionMutable *md)
+{
+ Definition *d = toDefinition(md);
+ if (d && typeid(*d)==typeid(MemberDefImpl))
+ {
+ return static_cast<MemberDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+const MemberDef *toMemberDef(const Definition *d)
+{
+ if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
+ {
+ return static_cast<const MemberDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+MemberDefMutable *toMemberDefMutable(Definition *d)
+{
+ if (d && typeid(*d)==typeid(MemberDefImpl))
+ {
+ return static_cast<MemberDefMutable*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+MemberDefMutable *toMemberDefMutable(const Definition *d)
+{
+ if (d && typeid(*d)==typeid(MemberDefImpl))
+ {
+ return const_cast<MemberDefMutable*>(static_cast<const MemberDefMutable*>(d));
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+
diff --git a/src/memberdef.h b/src/memberdef.h
index a9103e1..ff0e300 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,29 +19,31 @@
#define MEMBERDEF_H
#include <vector>
+#include <memory>
#include <qlist.h>
#include <sys/types.h>
#include "types.h"
#include "definition.h"
+#include "arguments.h"
+#include "classdef.h"
-class ClassDef;
class NamespaceDef;
class GroupDef;
class FileDef;
class MemberList;
class MemberGroup;
-class ExampleSDict;
+class ExampleList;
class OutputList;
class GroupDef;
class QTextStream;
-class ArgumentList;
class QStrList;
struct TagInfo;
+class MemberDefMutable;
/** A model of a class/file/namespace member symbol. */
-class MemberDef : virtual public Definition
+class MemberDef : public Definition
{
public:
virtual ~MemberDef() {}
@@ -53,6 +55,8 @@ class MemberDef : virtual public Definition
virtual MemberDef *resolveAlias() = 0;
virtual const MemberDef *resolveAlias() const = 0;
+ ClassDefMutable *getClassDefMutable() const;
+
//-----------------------------------------------------------------------------------
// ---- getters -----
//-----------------------------------------------------------------------------------
@@ -72,37 +76,29 @@ class MemberDef : virtual public Definition
virtual const QCString &initializer() const = 0;
virtual int initializerLines() const = 0;
virtual uint64 getMemberSpecifiers() const = 0;
- virtual const MemberList *getSectionList() const = 0;
+ virtual const MemberList *getSectionList(const Definition *container) const = 0;
virtual QCString displayDefinition() const = 0;
// scope query members
- virtual const ClassDef *getClassDef() const = 0;
- virtual ClassDef *getClassDef() = 0;
-
virtual const FileDef *getFileDef() const = 0;
- virtual FileDef *getFileDef() = 0;
-
+ virtual const ClassDef *getClassDef() const = 0;
virtual const NamespaceDef* getNamespaceDef() const = 0;
- virtual NamespaceDef* getNamespaceDef() = 0;
-
- virtual const GroupDef *getGroupDef() const = 0;
- virtual GroupDef *getGroupDef() = 0;
-
- virtual ClassDef *accessorClass() const = 0;
+ virtual const ClassDef *accessorClass() const = 0;
// grabbing the property read/write accessor names
virtual const char *getReadAccessor() const = 0;
virtual const char *getWriteAccessor() const = 0;
-
+
// querying the grouping definition
+ virtual const GroupDef *getGroupDef() const = 0;
virtual Grouping::GroupPri_t getGroupPri() const = 0;
virtual const char *getGroupFileName() const = 0;
virtual int getGroupStartLine() const = 0;
virtual bool getGroupHasDocs() const = 0;
virtual QCString qualifiedName() const = 0;
- virtual QCString objCMethodName(bool localLink,bool showStatic) const = 0;
+ virtual QCString objCMethodName(bool localLink,bool showStatic) const = 0;
- // direct kind info
+ // direct kind info
virtual Protection protection() const = 0;
virtual Specifier virtualness(int count=0) const = 0;
virtual MemberType memberType() const = 0;
@@ -215,19 +211,17 @@ class MemberDef : virtual public Definition
virtual bool isDocsForDefinition() const = 0;
virtual const MemberDef *getEnumScope() const = 0;
virtual const MemberList *enumFieldList() const = 0;
- virtual void setEnumBaseType(const QCString &type) = 0;
virtual QCString enumBaseType() const = 0;
virtual bool hasExamples() const = 0;
- virtual ExampleSDict *getExamples() const = 0;
+ virtual const ExampleList &getExamples() const = 0;
virtual bool isPrototype() const = 0;
// argument related members
virtual const ArgumentList &argumentList() const = 0;
- virtual ArgumentList &argumentList() = 0;
virtual const ArgumentList &declArgumentList() const = 0;
virtual const ArgumentList &templateArguments() const = 0;
- virtual const std::vector<ArgumentList> &definitionTemplateParameterLists() const = 0;
+ virtual const ArgumentLists &definitionTemplateParameterLists() const = 0;
// member group related members
virtual int getMemberGroupId() const = 0;
@@ -279,15 +273,33 @@ class MemberDef : virtual public Definition
virtual int getDeclLine() const = 0;
virtual int getDeclColumn() const = 0;
+ virtual MemberDefMutable *createTemplateInstanceMember(const ArgumentList &formalArgs,
+ const std::unique_ptr<ArgumentList> &actualArgs) const = 0;
+ virtual void writeDeclaration(OutputList &ol,
+ const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
+ bool inGroup, const ClassDef *inheritFrom=0,const char *inheritId=0) const = 0;
+ virtual void writeEnumDeclaration(OutputList &typeDecl, const ClassDef *cd,
+ const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd) const = 0;
+ virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const = 0;
+ virtual void warnIfUndocumented() const = 0;
+ virtual void warnIfUndocumentedParams() const = 0;
+
+ // TODO: this is not a getter, should be passed at construction
+ virtual void setMemberGroup(MemberGroup *grp) = 0;
+};
+
+class MemberDefMutable : public DefinitionMutable, public MemberDef
+{
+ public:
+
//-----------------------------------------------------------------------------------
// ---- setters -----
//-----------------------------------------------------------------------------------
-
// set functions
virtual void setMemberType(MemberType t) = 0;
virtual void setDefinition(const char *d) = 0;
- virtual void setFileDef(FileDef *fd) = 0;
+ virtual void setFileDef(const FileDef *fd) = 0;
virtual void setAnchor() = 0;
virtual void setProtection(Protection p) = 0;
virtual void setMemberSpecifiers(uint64 s) = 0;
@@ -295,9 +307,9 @@ class MemberDef : virtual public Definition
virtual void setInitializer(const char *i) = 0;
virtual void setBitfields(const char *s) = 0;
virtual void setMaxInitLines(int lines) = 0;
- virtual void setMemberClass(ClassDef *cd) = 0;
- virtual void setSectionList(MemberList *sl) = 0;
- virtual void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+ virtual void setMemberClass(const ClassDef *cd) = 0;
+ virtual void setSectionList(const Definition *container,const MemberList *sl) = 0;
+ virtual void setGroupDef(const GroupDef *gd,Grouping::GroupPri_t pri,
const QCString &fileName,int startLine,bool hasDocs,
MemberDef *member=0) = 0;
virtual void setReadAccessor(const char *r) = 0;
@@ -310,6 +322,7 @@ class MemberDef : virtual public Definition
virtual void setTagInfo(const TagInfo *i) = 0;
virtual void setArgsString(const char *as) = 0;
virtual void incrementFlowKeyWordCount() = 0;
+ virtual void setEnumBaseType(const QCString &type) = 0;
// relation to other members
virtual void setReimplements(MemberDef *md) = 0;
@@ -326,25 +339,25 @@ class MemberDef : virtual public Definition
// example related members
virtual bool addExample(const char *anchor,const char *name,const char *file) = 0;
-
+
// prototype related members
virtual void setPrototype(bool p,const QCString &df,int line, int column) = 0;
virtual void setExplicitExternal(bool b,const QCString &df,int line,int column) = 0;
virtual void setDeclFile(const QCString &df,int line,int column) = 0;
// argument related members
- virtual void setArgumentList(const ArgumentList &al) = 0;
- virtual void setDeclArgumentList(const ArgumentList &al) = 0;
- virtual void setDefinitionTemplateParameterLists(const std::vector<ArgumentList> &lists) = 0;
+ virtual void moveArgumentList(std::unique_ptr<ArgumentList> al) = 0;
+ virtual void moveDeclArgumentList(std::unique_ptr<ArgumentList> al) = 0;
+ virtual void resolveUnnamedParameters(const MemberDef *md) = 0;
+ virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists) = 0;
virtual void setTypeConstraints(const ArgumentList &al) = 0;
virtual void setType(const char *t) = 0;
virtual void setAccessorType(ClassDef *cd,const char *t) = 0;
// namespace related members
- virtual void setNamespace(NamespaceDef *nd) = 0;
+ virtual void setNamespace(const NamespaceDef *nd) = 0;
// member group related members
- virtual void setMemberGroup(MemberGroup *grp) = 0;
virtual void setMemberGroupId(int id) = 0;
virtual void makeImplementationDetail() = 0;
@@ -386,8 +399,6 @@ class MemberDef : virtual public Definition
// --- actions ----
//-----------------------------------------------------------------------------------
- virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs,
- const ArgumentList &actualArgs) const = 0;
virtual void findSectionsInDocumentation() = 0;
virtual void addToSearchIndex() const = 0;
@@ -395,32 +406,40 @@ class MemberDef : virtual public Definition
// --- write output ----
//-----------------------------------------------------------------------------------
- virtual void writeDeclaration(OutputList &ol,
- const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
- bool inGroup, const ClassDef *inheritFrom=0,const char *inheritId=0) const = 0;
virtual void writeDocumentation(const MemberList *ml,int memCount,int memTotal,OutputList &ol,
const char *scopeName,const Definition *container,
bool inGroup,bool showEnumValues=FALSE,bool
showInline=FALSE) const = 0;
virtual void writeMemberDocSimple(OutputList &ol,const Definition *container) const = 0;
- virtual void writeEnumDeclaration(OutputList &typeDecl, const ClassDef *cd,
- const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd) const = 0;
virtual void writeTagFile(FTextStream &) const = 0;
virtual void writeLink(OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
bool onlyText=FALSE) const = 0;
// write helpers
- virtual void warnIfUndocumented() const = 0;
- virtual void warnIfUndocumentedParams() const = 0;
- virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const = 0;
virtual void setAnonymousUsed() const = 0;
virtual void setFromAnonymousScope(bool b) const = 0;
};
+inline ClassDefMutable *MemberDef::getClassDefMutable() const
+{
+ return toClassDefMutable(getClassDef());
+}
+
+// --- Cast functions
+
+MemberDef *toMemberDef(Definition *d);
+MemberDef *toMemberDef(DefinitionMutable *d);
+const MemberDef *toMemberDef(const Definition *d);
+MemberDefMutable *toMemberDefMutable(Definition *d);
+MemberDefMutable *toMemberDefMutable(const Definition *d);
+
+//------------------------------------------------------------------------
+
+
/** Factory method to create a new instance of a MemberDef */
-MemberDef *createMemberDef(const char *defFileName,int defLine,int defColumn,
+MemberDefMutable *createMemberDef(const char *defFileName,int defLine,int defColumn,
const char *type,const char *name,const char *args,
const char *excp,Protection prot,Specifier virt,bool stat,
Relationship related,MemberType t,const ArgumentList &tal,
@@ -428,6 +447,7 @@ MemberDef *createMemberDef(const char *defFileName,int defLine,int defColumn,
MemberDef *createMemberDefAlias(const Definition *newScope,const MemberDef *aliasMd);
-void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef);
+void combineDeclarationAndDefinition(MemberDefMutable *mdec,MemberDefMutable *mdef);
+void addDocCrossReference(MemberDefMutable *src,MemberDefMutable *dst);
#endif
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index 05c38c3..bd3bf0c 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -29,33 +29,14 @@
#include "entry.h"
#include "md5.h"
-//static QCString idToName(int id)
-//{
-// QCString result;
-// result.sprintf("mgroup_%d",id);
-// return result;
-//}
-
-MemberGroup::MemberGroup()
-{
-}
-
-MemberGroup::MemberGroup(int id,const char *hdr,const char *d,const char *docFile,int docLine)
+MemberGroup::MemberGroup(const Definition *container,int id,const char *hdr,const char *d,const char *docFile,int docLine)
+ : m_container(container), grpId(id), grpHeader(hdr), doc(d), m_docFile(docFile), m_docLine(docLine)
{
static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
//printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
memberList = new MemberList(MemberListType_memberGroup);
memberList->setNeedsSorting(sortBriefDocs); // detailed sections are already sorted elsewhere.
- grpId = id;
- grpHeader = hdr;
- doc = d;
- inSameSection = TRUE;
- inDeclSection = 0;
- m_numDecMembers = -1;
- m_numDocMembers = -1;
- m_docFile = docFile;
- m_docLine = docLine;
//printf("Member group docs='%s'\n",doc.data());
}
@@ -74,13 +55,14 @@ void MemberGroup::insertMember(MemberDef *md)
// md,md->name().data());
MemberDef *firstMd = memberList->getFirst();
- if (inSameSection && firstMd && firstMd->getSectionList()!=md->getSectionList())
+ if (inSameSection && firstMd &&
+ firstMd->getSectionList(m_container)!=md->getSectionList(m_container))
{
inSameSection=FALSE;
}
else if (inDeclSection==0)
{
- inDeclSection = const_cast<MemberList*>(md->getSectionList());
+ inDeclSection = const_cast<MemberList*>(md->getSectionList(m_container));
//printf("inDeclSection=%p type=%d\n",inDeclSection,inDeclSection->listType());
}
memberList->append(md);
@@ -89,10 +71,14 @@ void MemberGroup::insertMember(MemberDef *md)
GroupDef *gd;
if (firstMd && !firstMd->isAlias() && (gd=const_cast<GroupDef*>(firstMd->getGroupDef())))
{
- md->setGroupDef(gd, firstMd->getGroupPri(),
- firstMd->getGroupFileName(),
- firstMd->getGroupStartLine(),
- firstMd->getGroupHasDocs());
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm)
+ {
+ mdm->setGroupDef(gd, firstMd->getGroupPri(),
+ firstMd->getGroupFileName(),
+ firstMd->getGroupStartLine(),
+ firstMd->getGroupHasDocs());
+ }
gd->insertMember(md);
}
}
@@ -100,7 +86,7 @@ void MemberGroup::insertMember(MemberDef *md)
void MemberGroup::setAnchors()
{
- ::setAnchors(memberList);
+ memberList->setAnchors();
}
void MemberGroup::writeDeclarations(OutputList &ol,
@@ -125,11 +111,12 @@ void MemberGroup::writePlainDeclarations(OutputList &ol,
void MemberGroup::writeDocumentation(OutputList &ol,const char *scopeName,
const Definition *container,bool showEnumValues,bool showInline) const
{
+ //printf("MemberGroup::writeDocumentation() %s\n",grpHeader.data());
memberList->writeDocumentation(ol,scopeName,container,0,showEnumValues,showInline);
}
void MemberGroup::writeDocumentationPage(OutputList &ol,const char *scopeName,
- const Definition *container) const
+ const DefinitionMutable *container) const
{
memberList->writeDocumentationPage(ol,scopeName,container);
}
@@ -149,13 +136,13 @@ void MemberGroup::addGroupedInheritedMembers(OutputList &ol,const ClassDef *cd,
for (li.toFirst();(md=li.current());++li)
{
//printf("matching %d == %d\n",lt,md->getSectionList()->listType());
- const MemberList *ml = md->getSectionList();
+ const MemberList *ml = md->getSectionList(m_container);
if (ml && lt==ml->listType())
{
- MemberList ml(lt);
- ml.append(md);
- ml.countDecMembers();
- ml.writePlainDeclarations(ol,cd,0,0,0,inheritedFrom,inheritId);
+ MemberList mml(lt);
+ mml.append(md);
+ mml.countDecMembers();
+ mml.writePlainDeclarations(ol,cd,0,0,0,inheritedFrom,inheritId);
}
}
}
@@ -169,7 +156,7 @@ int MemberGroup::countGroupedInheritedMembers(MemberListType lt)
for (li.toFirst();(md=li.current());++li)
{
//printf("matching %d == %d\n",lt,md->getSectionList()->listType());
- const MemberList *ml = md->getSectionList();
+ const MemberList *ml = md->getSectionList(m_container);
if (ml && lt==ml->listType())
{
count++;
@@ -202,6 +189,10 @@ void MemberGroup::countDocMembers()
memberList->countDocMembers();
}
+const Definition *MemberGroup::container() const
+{
+ return m_container;
+}
int MemberGroup::countInheritableMembers(const ClassDef *inheritedFrom) const
{
@@ -230,12 +221,13 @@ void MemberGroup::distributeMemberGroupDocumentation()
if (md) // distribute docs of md to other members of the list
{
//printf("Member %s has documentation!\n",md->name().data());
- MemberDef *omd;
- for (li.toFirst();(omd=li.current());++li)
+ MemberDef *iomd;
+ for (li.toFirst();(iomd=li.current());++li)
{
- if (md!=omd && omd->documentation().isEmpty() &&
- omd->briefDescription().isEmpty() &&
- omd->inbodyDocumentation().isEmpty()
+ MemberDefMutable *omd = toMemberDefMutable(iomd);
+ if (omd && md!=omd && omd->documentation().isEmpty() &&
+ omd->briefDescription().isEmpty() &&
+ omd->inbodyDocumentation().isEmpty()
)
{
//printf("Copying documentation to member %s\n",omd->name().data());
@@ -253,49 +245,49 @@ int MemberGroup::varCount() const
return memberList->varCount();
}
-int MemberGroup::funcCount() const
-{
- return memberList->funcCount();
+int MemberGroup::funcCount() const
+{
+ return memberList->funcCount();
}
-int MemberGroup::enumCount() const
-{
- return memberList->enumCount();
+int MemberGroup::enumCount() const
+{
+ return memberList->enumCount();
}
-int MemberGroup::enumValueCount() const
-{
- return memberList->enumValueCount();
+int MemberGroup::enumValueCount() const
+{
+ return memberList->enumValueCount();
}
-int MemberGroup::typedefCount() const
-{
- return memberList->typedefCount();
+int MemberGroup::typedefCount() const
+{
+ return memberList->typedefCount();
}
-int MemberGroup::sequenceCount() const
-{
- return memberList->sequenceCount();
+int MemberGroup::sequenceCount() const
+{
+ return memberList->sequenceCount();
}
-int MemberGroup::dictionaryCount() const
-{
- return memberList->dictionaryCount();
+int MemberGroup::dictionaryCount() const
+{
+ return memberList->dictionaryCount();
}
-int MemberGroup::protoCount() const
-{
- return memberList->protoCount();
+int MemberGroup::protoCount() const
+{
+ return memberList->protoCount();
}
-int MemberGroup::defineCount() const
-{
- return memberList->defineCount();
+int MemberGroup::defineCount() const
+{
+ return memberList->defineCount();
}
-int MemberGroup::friendCount() const
-{
- return memberList->friendCount();
+int MemberGroup::friendCount() const
+{
+ return memberList->friendCount();
}
#endif
@@ -356,7 +348,7 @@ void MemberGroup::findSectionsInDocumentation(const Definition *d)
memberList->findSectionsInDocumentation(d);
}
-void MemberGroup::setRefItems(const std::vector<ListItemInfo> &sli)
+void MemberGroup::setRefItems(const RefItemVector &sli)
{
m_xrefListItems.insert(m_xrefListItems.end(), sli.cbegin(), sli.cend());
}
@@ -368,7 +360,7 @@ void MemberGroup::writeTagFile(FTextStream &tagFile)
//--------------------------------------------------------------------------
-void MemberGroupInfo::setRefItems(const std::vector<ListItemInfo> &sli)
+void MemberGroupInfo::setRefItems(const RefItemVector &sli)
{
m_sli.insert(m_sli.end(), sli.cbegin(), sli.cend());
}
diff --git a/src/membergroup.h b/src/membergroup.h
index aa30063..5b0c621 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,10 +19,13 @@
#define MEMBERGROUP_H
#include <vector>
+#include <map>
+#include <memory>
#include <qlist.h>
#include "sortdict.h"
#include "types.h"
+#include "reflist.h"
#define DOX_NOGROUP -1
@@ -34,15 +37,16 @@ class FileDef;
class GroupDef;
class OutputList;
class Definition;
+class DefinitionMutable;
class FTextStream;
-struct ListItemInfo;
+class RefItem;
/** A class representing a group of members. */
-class MemberGroup
+class MemberGroup
{
public:
- MemberGroup();
- MemberGroup(int id,const char *header,
+ //MemberGroup();
+ MemberGroup(const Definition *container,int id,const char *header,
const char *docs,const char *docFile,int docLine);
~MemberGroup();
QCString header() const { return grpHeader; }
@@ -58,7 +62,7 @@ class MemberGroup
void writeDocumentation(OutputList &ol,const char *scopeName,
const Definition *container,bool showEnumValues,bool showInline) const;
void writeDocumentationPage(OutputList &ol,const char *scopeName,
- const Definition *container) const;
+ const DefinitionMutable *container) const;
void writeTagFile(FTextStream &);
void addGroupedInheritedMembers(OutputList &ol,const ClassDef *cd,
MemberListType lt,
@@ -77,69 +81,47 @@ class MemberGroup
int numDecEnumValues() const;
int numDocMembers() const;
int numDocEnumValues() const;
+ const Definition *container() const;
int countInheritableMembers(const ClassDef *inheritedFrom) const;
void setInGroup(bool b);
void addListReferences(Definition *d);
- void setRefItems(const std::vector<ListItemInfo> &sli);
+ void setRefItems(const RefItemVector &sli);
MemberList *members() const { return memberList; }
QCString anchor() const;
QCString docFile() const { return m_docFile; }
int docLine() const { return m_docLine; }
- private:
+ private:
+ const Definition *m_container;
MemberList *memberList = 0; // list of all members in the group
MemberList *inDeclSection = 0;
int grpId = 0;
QCString grpHeader;
QCString fileName; // base name of the generated file
QCString doc;
- bool inSameSection = 0;
- int m_numDecMembers = 0;
- int m_numDocMembers = 0;
- const Definition *m_parent = 0;
+ bool inSameSection = true;
QCString m_docFile;
- int m_docLine = 0;
- std::vector<ListItemInfo> m_xrefListItems;
-};
-
-/** A list of MemberGroup objects. */
-class MemberGroupList : public QList<MemberGroup>
-{
-};
-
-/** An iterator for MemberGroup objects in a MemberGroupList. */
-class MemberGroupListIterator : public QListIterator<MemberGroup>
-{
- public:
- MemberGroupListIterator(const MemberGroupList &l) :
- QListIterator<MemberGroup>(l) {}
+ int m_docLine;
+ RefItemVector m_xrefListItems;
};
-/** A sorted dictionary of MemberGroup objects. */
-class MemberGroupSDict : public SIntDict<MemberGroup>
-{
- public:
- MemberGroupSDict(int size=17) : SIntDict<MemberGroup>(size) {}
- ~MemberGroupSDict() {}
- private:
- int compareValues(const MemberGroup *item1,const MemberGroup *item2) const
- {
- return item1->groupId() - item2->groupId();
- }
-};
+using MemberGroupRefList = std::vector<MemberGroup *>;
+using MemberGroupList = std::vector< std::unique_ptr<MemberGroup> >;
/** Data collected for a member group */
struct MemberGroupInfo
{
- void setRefItems(const std::vector<ListItemInfo> &sli);
+ void setRefItems(const RefItemVector &sli);
QCString header;
QCString doc;
QCString docFile;
int docLine = -1;
QCString compoundName;
- std::vector<ListItemInfo> m_sli;
+ RefItemVector m_sli;
};
+using MemberGroupInfoMap = std::unordered_map< int,std::unique_ptr<MemberGroupInfo> >;
+
#endif
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 278023b..c71390c 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -35,7 +35,6 @@
MemberList::MemberList() : m_listType(MemberListType_pubMethods)
{
//printf("%p: MemberList::MemberList()\n",this);
- memberGroupList=0;
m_numDecMembers=-1; // special value indicating that value needs to be computed
m_numDecEnumValues=0;
m_numDocMembers=-1; // special value indicating that value needs to be computed
@@ -48,7 +47,6 @@ MemberList::MemberList() : m_listType(MemberListType_pubMethods)
MemberList::MemberList(MemberListType lt) : m_listType(lt)
{
//printf("%p: MemberList::MemberList(%d)\n",this,lt);
- memberGroupList=0;
m_numDecMembers=-1; // special value indicating that value needs to be computed
m_numDecEnumValues=0;
m_numDocMembers=-1; // special value indicating that value needs to be computed
@@ -60,13 +58,13 @@ MemberList::MemberList(MemberListType lt) : m_listType(lt)
MemberList::~MemberList()
{
- delete memberGroupList;
}
-int MemberList::compareValues(const MemberDef *c1, const MemberDef *c2) const
+int genericCompareMembers(const MemberDef *c1,const MemberDef *c2)
{
- static bool sortConstructorsFirst = Config_getBool(SORT_MEMBERS_CTORS_1ST);
- if (sortConstructorsFirst) {
+ bool sortConstructorsFirst = Config_getBool(SORT_MEMBERS_CTORS_1ST);
+ if (sortConstructorsFirst)
+ {
int ord1 = c1->isConstructor() ? 2 : (c1->isDestructor() ? 1 : 0);
int ord2 = c2->isConstructor() ? 2 : (c2->isDestructor() ? 1 : 0);
if (ord1 > ord2)
@@ -74,9 +72,29 @@ int MemberList::compareValues(const MemberDef *c1, const MemberDef *c2) const
else if (ord2 > ord1)
return 1;
}
+ // sort on name
int cmp = qstricmp(c1->name(),c2->name());
- if (cmp==0) cmp = qstricmp(c1->argsString(),c2->argsString());
- return cmp!=0 ? cmp : c1->getDefLine()-c2->getDefLine();
+ // then on argument list
+ if (cmp==0 && c1->argsString() && c2->argsString())
+ {
+ cmp = qstricmp(c1->argsString(),c2->argsString());
+ }
+ // then on file in which the item is defined
+ if (cmp==0)
+ {
+ cmp = qstricmp(c1->getDefFileName(),c2->getDefFileName());
+ }
+ // then on line number at which the member is defined
+ if (cmp==0)
+ {
+ cmp = c1->getDefLine()-c2->getDefLine();
+ }
+ return cmp;
+}
+
+int MemberList::compareValues(const MemberDef *c1, const MemberDef *c2) const
+{
+ return genericCompareMembers(c1,c2);
}
int MemberList::countInheritableMembers(const ClassDef *inheritedFrom) const
@@ -105,14 +123,9 @@ int MemberList::countInheritableMembers(const ClassDef *inheritedFrom) const
}
}
}
- if (memberGroupList)
+ for (const auto &mg : m_memberGroupRefList)
{
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- count+=mg->countInheritableMembers(inheritedFrom);
- }
+ count+=mg->countInheritableMembers(inheritedFrom);
}
//printf("%s::countInheritableMembers(%s)=%d\n",
// listTypeAsString().data(),
@@ -187,28 +200,23 @@ void MemberList::countDecMembers()
}
}
}
- if (memberGroupList)
+ for (const auto &mg : m_memberGroupRefList)
{
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->countDecMembers();
- /*
- m_varCnt+=mg->varCount();
- m_funcCnt+=mg->funcCount();
- m_enumCnt+=mg->enumCount();
- m_enumValCnt+=mg->enumValueCount();
- m_typeCnt+=mg->typedefCount();
- m_seqCnt+=mg->sequenceCount();
- m_dictCnt+=mg->dictionaryCount();
- m_protoCnt+=mg->protoCount();
- m_defCnt+=mg->defineCount();
- m_friendCnt+=mg->friendCount();
- */
- m_numDecMembers+=mg->numDecMembers();
- m_numDecEnumValues+=mg->numDecEnumValues();
- }
+ mg->countDecMembers();
+ /*
+ m_varCnt+=mg->varCount();
+ m_funcCnt+=mg->funcCount();
+ m_enumCnt+=mg->enumCount();
+ m_enumValCnt+=mg->enumValueCount();
+ m_typeCnt+=mg->typedefCount();
+ m_seqCnt+=mg->sequenceCount();
+ m_dictCnt+=mg->dictionaryCount();
+ m_protoCnt+=mg->protoCount();
+ m_defCnt+=mg->defineCount();
+ m_friendCnt+=mg->friendCount();
+ */
+ m_numDecMembers+=mg->numDecMembers();
+ m_numDecEnumValues+=mg->numDecEnumValues();
}
//printf("----- end countDecMembers ----\n");
@@ -233,16 +241,11 @@ void MemberList::countDocMembers()
m_numDocMembers++;
}
}
- if (memberGroupList)
+ for (const auto &mg : m_memberGroupRefList)
{
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->countDocMembers();
- m_numDocMembers+=mg->numDocMembers();
- m_numDocEnumValues+=mg->numDocEnumValues();
- }
+ mg->countDocMembers();
+ m_numDocMembers+=mg->numDocMembers();
+ m_numDocEnumValues+=mg->numDocEnumValues();
}
//printf("MemberList::countDocMembers()=%d memberGroupList=%p\n",m_numDocMembers,memberGroupList);
}
@@ -288,7 +291,7 @@ MemberDef *MemberList::take(uint index)
}
MemberListIterator::MemberListIterator(const MemberList &l) :
- QListIterator<MemberDef>(l)
+ QListIterator<MemberDef>(l)
{
}
@@ -313,24 +316,23 @@ void MemberList::setAnonymousEnumType()
MemberDef *vmd;
for ( ; (vmd=vmli.current()) ; ++vmli)
{
- QCString vtype=vmd->typeString();
- if ((vtype.find(name))!=-1)
+ MemberDefMutable *vmdm = toMemberDefMutable(vmd);
+ if (vmdm)
{
- vmd->setAnonymousEnumType(md);
+ QCString vtype=vmd->typeString();
+ if ((vtype.find(name))!=-1)
+ {
+ vmdm->setAnonymousEnumType(md);
+ }
}
}
}
}
}
}
- if (memberGroupList)
+ for (const auto &mg : m_memberGroupRefList)
{
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->setAnonymousEnumType();
- }
+ mg->setAnonymousEnumType();
}
}
@@ -378,9 +380,9 @@ bool MemberList::declVisible() const
case MemberType_Service: // fall through
case MemberType_Sequence: // fall through
case MemberType_Dictionary: // fall through
- case MemberType_Event:
+ case MemberType_Event:
return TRUE;
- case MemberType_Enumeration:
+ case MemberType_Enumeration:
{
// if this is an anonymous enum and there are variables of this
// enum type (i.e. enumVars>0), then we do not show the enum here.
@@ -392,7 +394,7 @@ bool MemberList::declVisible() const
break;
case MemberType_Friend:
return TRUE;
- case MemberType_EnumValue:
+ case MemberType_EnumValue:
{
if (m_inGroup)
{
@@ -412,7 +414,6 @@ void MemberList::writePlainDeclarations(OutputList &ol,
) const
{
//printf("----- writePlainDeclaration() ----\n");
- static bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
if (numDecMembers()==-1)
{
err("MemberList::numDecMembers()==-1, so the members of this list have not been counted. Please report as a bug.\n");
@@ -425,7 +426,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
}
//printf(" --> writePlainDeclaration() numDecMembers()=%d\n",
// numDecMembers());
-
+
ol.pushGeneratorState();
bool first=TRUE;
@@ -454,13 +455,13 @@ void MemberList::writePlainDeclarations(OutputList &ol,
case MemberType_Service: // fall through
case MemberType_Sequence: // fall through
case MemberType_Dictionary: // fall through
- case MemberType_Event:
+ case MemberType_Event:
{
if (first) ol.startMemberList(),first=FALSE;
md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
break;
}
- case MemberType_Enumeration:
+ case MemberType_Enumeration:
{
// if this is an anonymous enum and there are variables of this
// enum type (i.e. enumVars>0), then we do not show the enum here.
@@ -484,6 +485,10 @@ void MemberList::writePlainDeclarations(OutputList &ol,
ol.writeString("local ");
}
ol.writeString("enum ");
+ if (md->isStrong())
+ {
+ ol.writeString("class ");
+ }
ol.insertMemberAlign();
md->writeEnumDeclaration(ol,cd,nd,fd,gd);
if (!detailsLinkable)
@@ -497,7 +502,8 @@ void MemberList::writePlainDeclarations(OutputList &ol,
md->briefFile(),md->briefLine(),
cd,md,
md->briefDescription(),
- TRUE,FALSE,0,TRUE,FALSE
+ TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT)
);
if (rootNode && !rootNode->isEmpty())
{
@@ -525,7 +531,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
case MemberType_Friend:
if (inheritedFrom==0)
{
- if (first)
+ if (first)
{
ol.startMemberList();
first=FALSE;
@@ -533,7 +539,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
break;
}
- case MemberType_EnumValue:
+ case MemberType_EnumValue:
{
if (m_inGroup)
{
@@ -551,30 +557,30 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// no variables of the anonymous compound type exist.
if (cd)
{
- MemberListIterator mli(*this);
- for ( ; (md=mli.current()) ; ++mli )
+ for ( mli.toFirst(); (md=mli.current()) ; ++mli )
{
if (md->fromAnonymousScope() && !md->anonymousDeclShown())
{
- md->setFromAnonymousScope(FALSE);
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm) mdm->setFromAnonymousScope(FALSE);
//printf("anonymous compound members\n");
if (md->isBriefSectionVisible())
{
- if (first)
+ if (first)
{
ol.startMemberList();
first=FALSE;
}
md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
}
- md->setFromAnonymousScope(TRUE);
+ if (mdm) mdm->setFromAnonymousScope(TRUE);
}
}
}
-
- if (!first)
+
+ if (!first)
{
- ol.endMemberList();
+ ol.endMemberList();
}
ol.popGeneratorState();
@@ -630,7 +636,7 @@ void MemberList::writeDeclarations(OutputList &ol,
if (title)
{
ol.writeInheritedSectionTitle(inheritId,cd->getReference(),
- cd->getOutputFileBase(),
+ cd->getOutputFileBase(),
cd->anchor(),title,cd->displayName());
}
ol.popGeneratorState();
@@ -638,7 +644,7 @@ void MemberList::writeDeclarations(OutputList &ol,
}
else if (num>numEnumValues)
{
- if (title)
+ if (title)
{
if (showInline)
{
@@ -658,14 +664,15 @@ void MemberList::writeDeclarations(OutputList &ol,
ol.endMemberHeader();
}
}
- if (subtitle)
+ if (subtitle)
{
QCString st=subtitle;
st = st.stripWhiteSpace();
if (!st.isEmpty())
{
ol.startMemberSubtitle();
- ol.generateDoc("[generated]",-1,ctx,0,subtitle,FALSE,FALSE,0,FALSE,FALSE);
+ ol.generateDoc("[generated]",-1,ctx,0,subtitle,FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endMemberSubtitle();
}
}
@@ -688,46 +695,45 @@ void MemberList::writeDeclarations(OutputList &ol,
}
//printf("memberGroupList=%p\n",memberGroupList);
- if (memberGroupList)
+ for (const auto &mg : m_memberGroupRefList)
{
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- while ((mg=mgli.current()))
+ bool hasHeader=!mg->header().isEmpty() && mg->header()!="[NOHEADER]";
+ if (inheritId.isEmpty())
{
- bool hasHeader=!mg->header().isEmpty() && mg->header()!="[NOHEADER]";
- if (inheritId.isEmpty())
+ //printf("mg->header=%s hasHeader=%d\n",mg->header().data(),hasHeader);
+ ol.startMemberGroupHeader(hasHeader);
+ if (hasHeader)
{
- //printf("mg->header=%s hasHeader=%d\n",mg->header().data(),hasHeader);
- ol.startMemberGroupHeader(hasHeader);
- if (hasHeader)
- {
- ol.parseText(mg->header());
- }
- ol.endMemberGroupHeader();
- if (!mg->documentation().isEmpty())
- {
- //printf("Member group has docs!\n");
- ol.startMemberGroupDocs();
- ol.generateDoc(mg->docFile(),mg->docLine(),ctx,0,mg->documentation()+"\n",FALSE,FALSE);
- ol.endMemberGroupDocs();
- }
- ol.startMemberGroup();
+ ol.parseText(mg->header());
}
- //printf("--- mg->writePlainDeclarations ---\n");
- mg->writePlainDeclarations(ol,cd,nd,fd,gd,inheritedFrom,inheritId);
- if (inheritId.isEmpty())
+ ol.endMemberGroupHeader();
+ if (!mg->documentation().isEmpty())
{
- ol.endMemberGroup(hasHeader);
+ //printf("Member group has docs!\n");
+ ol.startMemberGroupDocs();
+ ol.generateDoc(mg->docFile(),mg->docLine(),ctx,0,mg->documentation()+"\n",FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
+ ol.endMemberGroupDocs();
}
- ++mgli;
+ ol.startMemberGroup();
+ }
+ //printf("--- mg->writePlainDeclarations ---\n");
+ mg->writePlainDeclarations(ol,cd,nd,fd,gd,inheritedFrom,inheritId);
+ if (inheritId.isEmpty())
+ {
+ ol.endMemberGroup(hasHeader);
}
}
}
- if (inheritedFrom && cd)
+ if (inheritedFrom && cd)
{
- // also add members that of this list type, that are grouped together
- // in a separate list in class 'inheritedFrom'
- cd->addGroupedInheritedMembers(ol,m_listType,inheritedFrom,inheritId);
+ const ClassDefMutable *cdm = toClassDefMutable(cd);
+ if (cdm)
+ {
+ // also add members that of this list type, that are grouped together
+ // in a separate list in class 'inheritedFrom'
+ cdm->addGroupedInheritedMembers(ol,m_listType,inheritedFrom,inheritId);
+ }
}
//printf("----- end writeDeclaration() ----\n");
}
@@ -767,7 +773,7 @@ void MemberList::writeDocumentation(OutputList &ol,
overloadCountDict.setAutoDelete(TRUE);
for (mli.toFirst() ; (md=mli.current()) ; ++mli)
{
- if (md->isDetailedSectionVisible(m_inGroup,container->definitionType()==Definition::TypeFile) &&
+ if (md->isDetailedSectionVisible(m_inGroup,container->definitionType()==Definition::TypeFile) &&
!(md->isEnumValue() && !showInline))
{
uint *pCount = overloadTotalDict.find(md->name());
@@ -785,25 +791,24 @@ void MemberList::writeDocumentation(OutputList &ol,
for (mli.toFirst() ; (md=mli.current()) ; ++mli)
{
- if (md->isDetailedSectionVisible(m_inGroup,container->definitionType()==Definition::TypeFile) &&
+ if (md->isDetailedSectionVisible(m_inGroup,container->definitionType()==Definition::TypeFile) &&
!(md->isEnumValue() && !showInline))
{
uint overloadCount = *overloadTotalDict.find(md->name());
uint *pCount = overloadCountDict.find(md->name());
- md->writeDocumentation(this,*pCount,overloadCount,ol,scopeName,container,
- m_inGroup,showEnumValues,showInline);
- (*pCount)++;
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm)
+ {
+ mdm->writeDocumentation(this,*pCount,overloadCount,ol,scopeName,container,
+ m_inGroup,showEnumValues,showInline);
+ (*pCount)++;
+ }
}
}
- if (memberGroupList)
+ //printf("MemberList::writeDocumentation() -- member groups %d\n",memberGroupList->count());
+ for (const auto &mg : m_memberGroupRefList)
{
- //printf("MemberList::writeDocumentation() -- member groups %d\n",memberGroupList->count());
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeDocumentation(ol,scopeName,container,showEnumValues,showInline);
- }
+ mg->writeDocumentation(ol,scopeName,container,showEnumValues,showInline);
}
ol.endMemberDocList();
}
@@ -818,21 +823,25 @@ void MemberList::writeSimpleDocumentation(OutputList &ol,
const ClassDef *cd = 0;
if (container && container->definitionType()==Definition::TypeClass)
{
- cd = dynamic_cast<const ClassDef*>(container);
+ cd = toClassDef(container);
}
ol.startMemberDocSimple(cd && cd->isJavaEnum());
MemberListIterator mli(*this);
const MemberDef *md;
for ( ; (md=mli.current()) ; ++mli)
{
- md->writeMemberDocSimple(ol,container);
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm)
+ {
+ mdm->writeMemberDocSimple(ol,container);
+ }
}
ol.endMemberDocSimple(cd && cd->isJavaEnum());
}
// separate member pages
void MemberList::writeDocumentationPage(OutputList &ol,
- const char *scopeName, const Definition *container) const
+ const char *scopeName, const DefinitionMutable *container) const
{
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
@@ -842,9 +851,11 @@ void MemberList::writeDocumentationPage(OutputList &ol,
overloadTotalDict.setAutoDelete(TRUE);
overloadCountDict.setAutoDelete(TRUE);
MemberListIterator mli(*this);
- const MemberDef *md;
- for (mli.toFirst() ; (md=mli.current()) ; ++mli)
+ const MemberDef *imd;
+ for (mli.toFirst() ; (imd=mli.current()) ; ++mli)
{
+ MemberDefMutable *md = toMemberDefMutable(imd);
+
if (md->isDetailedSectionLinkable())
{
uint *pCount = overloadTotalDict.find(md->name());
@@ -860,8 +871,10 @@ void MemberList::writeDocumentationPage(OutputList &ol,
}
}
- for ( mli.toFirst() ; (md=mli.current()) ; ++mli)
+ for ( mli.toFirst() ; (imd=mli.current()) ; ++mli)
{
+ Definition *container_d = toDefinition(const_cast<DefinitionMutable*>(container));
+ MemberDefMutable *md = toMemberDefMutable(imd);
if (md->isDetailedSectionLinkable())
{
uint overloadCount = *overloadTotalDict.find(md->name());
@@ -878,10 +891,11 @@ void MemberList::writeDocumentationPage(OutputList &ol,
if (generateTreeView)
{
- md->writeDocumentation(this,*pCount,overloadCount,ol,scopeName,container,m_inGroup);
+ md->writeDocumentation(this,*pCount,overloadCount,ol,scopeName,container_d,m_inGroup);
(*pCount)++;
+
ol.endContents();
- endFileWithNavPath(container,ol);
+ endFileWithNavPath(container_d,ol);
}
else
{
@@ -894,7 +908,7 @@ void MemberList::writeDocumentationPage(OutputList &ol,
ol.writeString(" </td>\n");
ol.writeString(" <td valign=\"top\" class=\"mempage\">\n");
- md->writeDocumentation(this,*pCount,overloadCount,ol,scopeName,container,m_inGroup);
+ md->writeDocumentation(this,*pCount,overloadCount,ol,scopeName,container_d,m_inGroup);
(*pCount)++;
ol.writeString(" </td>\n");
@@ -905,35 +919,25 @@ void MemberList::writeDocumentationPage(OutputList &ol,
}
}
}
- if (memberGroupList)
+ for (const auto &mg : m_memberGroupRefList)
{
- //printf("MemberList::writeDocumentation() -- member groups\n");
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeDocumentationPage(ol,scopeName,container);
- }
+ mg->writeDocumentationPage(ol,scopeName,container);
}
}
void MemberList::addMemberGroup(MemberGroup *mg)
{
- if (memberGroupList==0)
- {
- memberGroupList=new MemberGroupList;
- }
- //printf("addMemberGroup: this=%p mg=%p\n",this,mg);
- memberGroupList->append(mg);
+ m_memberGroupRefList.push_back(mg);
}
void MemberList::addListReferences(Definition *def)
{
MemberListIterator mli(*this);
- MemberDef *md;
- for ( ; (md=mli.current()) ; ++mli)
+ MemberDef *imd;
+ for ( ; (imd=mli.current()) ; ++mli)
{
- if (!md->isAlias() && (md->getGroupDef()==0 || def->definitionType()==Definition::TypeGroup))
+ MemberDefMutable *md = toMemberDefMutable(imd);
+ if (md && !md->isAlias() && (md->getGroupDef()==0 || def->definitionType()==Definition::TypeGroup))
{
md->addListReference(def);
const MemberList *enumFields = md->enumFieldList();
@@ -944,40 +948,38 @@ void MemberList::addListReferences(Definition *def)
MemberDef *vmd;
for ( ; (vmd=vmli.current()) ; ++vmli)
{
- //printf(" adding %s\n",vmd->name().data());
- vmd->addListReference(def);
+ MemberDefMutable *vmdm = toMemberDefMutable(vmd);
+ if (vmdm)
+ {
+ //printf(" adding %s\n",vmd->name().data());
+ vmdm->addListReference(def);
+ }
}
}
}
}
- if (memberGroupList)
+ for (const auto &mg : m_memberGroupRefList)
{
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->addListReferences(def);
- }
+ mg->addListReferences(def);
}
}
void MemberList::findSectionsInDocumentation(const Definition *d)
{
MemberListIterator mli(*this);
- MemberDef *md;
- for ( ; (md=mli.current()) ; ++mli)
+ MemberDef *imd;
+ for ( ; (imd=mli.current()) ; ++mli)
{
- md->findSectionsInDocumentation();
- }
- if (memberGroupList)
- {
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ MemberDefMutable *md = toMemberDefMutable(imd);
+ if (md)
{
- mg->findSectionsInDocumentation(d);
+ md->findSectionsInDocumentation();
}
}
+ for (const auto &mg : m_memberGroupRefList)
+ {
+ mg->findSectionsInDocumentation(d);
+ }
}
void MemberList::setNeedsSorting(bool b)
@@ -985,7 +987,7 @@ void MemberList::setNeedsSorting(bool b)
m_needsSorting = b;
}
-QCString MemberList::listTypeAsString(MemberListType type)
+QCString MemberList::listTypeAsString(MemberListType type)
{
switch(type)
{
@@ -1037,7 +1039,7 @@ QCString MemberList::listTypeAsString(MemberListType type)
case MemberListType_decFriendMembers: return "friend-members";
case MemberListType_decPropMembers: return "prop-members";
case MemberListType_enumFields: return "enum-fields";
- case MemberListType_memberGroup: return "member-group";
+ case MemberListType_memberGroup: break;
default: break;
}
return "";
@@ -1046,52 +1048,54 @@ QCString MemberList::listTypeAsString(MemberListType type)
void MemberList::writeTagFile(FTextStream &tagFile)
{
MemberListIterator mli(*this);
- MemberDef *md;
- for ( ; (md=mli.current()) ; ++mli)
+ MemberDef *imd;
+ for ( ; (imd=mli.current()) ; ++mli)
{
- if (md->getLanguage()!=SrcLangExt_VHDL)
+ MemberDefMutable *md = toMemberDefMutable(imd);
+ if (md)
{
- md->writeTagFile(tagFile);
- if (md->memberType()==MemberType_Enumeration && md->enumFieldList() && !md->isStrong())
+ if (md->getLanguage()!=SrcLangExt_VHDL)
{
- MemberListIterator vmli(*md->enumFieldList());
- MemberDef *vmd;
- for ( ; (vmd=vmli.current()) ; ++vmli)
+ md->writeTagFile(tagFile);
+ if (md->memberType()==MemberType_Enumeration && md->enumFieldList() && !md->isStrong())
{
- vmd->writeTagFile(tagFile);
+ MemberListIterator vmli(*md->enumFieldList());
+ MemberDef *ivmd;
+ for ( ; (ivmd=vmli.current()) ; ++vmli)
+ {
+ MemberDefMutable *vmd = toMemberDefMutable(ivmd);
+ if (vmd)
+ {
+ vmd->writeTagFile(tagFile);
+ }
+ }
}
}
- }
- else
- {
- VhdlDocGen::writeTagFile(md,tagFile);
+ else
+ {
+ VhdlDocGen::writeTagFile(md,tagFile);
+ }
}
}
- if (memberGroupList)
+ for (const auto &mg : m_memberGroupRefList)
{
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeTagFile(tagFile);
- }
+ mg->writeTagFile(tagFile);
}
}
-//--------------------------------------------------------------------------
-
-int MemberSDict::compareValues(const MemberDef *c1, const MemberDef *c2) const
+// compute the HTML anchors for a list of members
+void MemberList::setAnchors()
{
- //printf("MemberSDict::compareValues(%s,%s)\n",c1->name().data(),c2->name().data());
- int cmp = qstricmp(c1->name(),c2->name());
- if (cmp)
- {
- return cmp;
- }
- else
+ //int count=0;
+ MemberListIterator mli(*this);
+ MemberDef *md;
+ for (;(md=mli.current());++mli)
{
- return c1->getDefLine()-c2->getDefLine();
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm && !md->isReference())
+ {
+ mdm->setAnchor();
+ }
}
}
-
diff --git a/src/memberlist.h b/src/memberlist.h
index 422c162..08e2873 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,14 +16,16 @@
#ifndef MEMBERLIST_H
#define MEMBERLIST_H
+#include <vector>
+#include <algorithm>
+
#include <qlist.h>
#include "memberdef.h"
-#include "sortdict.h"
+#include "linkedmap.h"
#include "types.h"
+#include "membergroup.h"
class GroupDef;
-class MemberGroup;
-class MemberGroupList;
/** A list of MemberDef objects. */
class MemberList : private QList<MemberDef>
@@ -81,7 +81,7 @@ class MemberList : private QList<MemberDef>
bool showEnumValues=FALSE,bool showInline=FALSE) const;
void writeSimpleDocumentation(OutputList &ol,const Definition *container) const;
void writeDocumentationPage(OutputList &ol,
- const char *scopeName, const Definition *container) const;
+ const char *scopeName, const DefinitionMutable *container) const;
void writeTagFile(FTextStream &);
bool declVisible() const;
void addMemberGroup(MemberGroup *mg);
@@ -90,10 +90,13 @@ class MemberList : private QList<MemberDef>
void addListReferences(Definition *def);
void findSectionsInDocumentation(const Definition *d);
void setNeedsSorting(bool b);
- MemberGroupList *getMemberGroupList() const { return memberGroupList; }
+ const MemberGroupRefList &getMemberGroupList() const { return m_memberGroupRefList; }
void setAnonymousEnumType();
+ void setAnchors();
private:
+ MemberList(const MemberList &) = delete;
+ MemberList &operator=(const MemberList &) = delete;
int compareValues(const MemberDef *item1,const MemberDef *item2) const;
int countEnumValues(const MemberDef *md) const;
/*
@@ -105,13 +108,13 @@ class MemberList : private QList<MemberDef>
int m_dictCnt;
int m_protoCnt;
int m_defCnt;
- int m_friendCnt;
+ int m_friendCnt;
*/
int m_numDecMembers; // number of members in the brief part of the memberlist
int m_numDecEnumValues;
int m_numDocMembers; // number of members in the detailed part of the memberlist
int m_numDocEnumValues;
- MemberGroupList *memberGroupList;
+ MemberGroupRefList m_memberGroupRefList;
bool m_inGroup; // is this list part of a group definition
bool m_inFile; // is this list part of a file definition
MemberListType m_listType;
@@ -127,23 +130,29 @@ class MemberListIterator : public QListIterator<MemberDef>
virtual ~MemberListIterator() {}
};
-/** An unsorted dictionary of MemberDef objects. */
-class MemberDict : public QDict<MemberDef>
+class MemberLinkedRefMap : public LinkedRefMap<const MemberDef>
{
- public:
- MemberDict(int size) : QDict<MemberDef>(size) {}
- virtual ~MemberDict() {}
};
-/** A sorted dictionary of MemberDef objects. */
-class MemberSDict : public SDict<MemberDef>
+class MemberLists : public std::vector< std::unique_ptr<MemberList> >
{
public:
- MemberSDict(int size=17) : SDict<MemberDef>(size) {}
- virtual ~MemberSDict() {}
+ MemberLists() = default;
+ const std::unique_ptr<MemberList> &get(MemberListType lt)
+ {
+ // find the list with the given type
+ auto it = std::find_if(begin(),end(),[&lt](const auto &ml) { return ml->listType()==lt; });
+ if (it!=end()) return *it;
+ // or create a new list if it is not found
+ emplace_back(std::make_unique<MemberList>(lt));
+ return back();
+ }
+
private:
- int compareValues(const MemberDef *item1,const MemberDef *item2) const;
+ MemberLists(const MemberLists &) = delete;
+ MemberLists &operator=(const MemberLists &) = delete;
};
+int genericCompareMembers(const MemberDef *c1,const MemberDef *c2);
#endif
diff --git a/src/membername.cpp b/src/membername.cpp
deleted file mode 100644
index 72809b3..0000000
--- a/src/membername.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include "membername.h"
-#include "classdef.h"
-#include "util.h"
-#include "filedef.h"
-
-MemberName::MemberName(const char *n) : QList<MemberDef>()
-{
- name=n;
- setAutoDelete(TRUE);
-}
-
-MemberName::~MemberName()
-{
-}
-
-int MemberName::compareValues(const MemberDef *m1, const MemberDef *m2) const
-{
- const ClassDef *c1=m1->getClassDef();
- const ClassDef *c2=m2->getClassDef();
- const FileDef *f1=m1->getFileDef();
- const FileDef *f2=m2->getFileDef();
- if (c1 && c2)
- return qstrcmp(c1->name(),c2->name());
- else if (f1 && f2)
- return qstrcmp(f1->name(),f2->name());
- else
- return 0;
-}
-
-MemberNameInfo::MemberNameInfo(const char *n) : QList<MemberInfo>()
-{
- name=n;
- setAutoDelete(TRUE);
-}
-
-int MemberNameInfo::compareValues(const MemberInfo *m1,const MemberInfo *m2) const
-{
- const ClassDef *c1=m1->memberDef->getClassDef();
- const ClassDef *c2=m2->memberDef->getClassDef();
- const FileDef *f1=m1->memberDef->getFileDef();
- const FileDef *f2=m2->memberDef->getFileDef();
- if (c1 && c2)
- return qstrcmp(c1->name(),c2->name());
- else if (f1 && f2)
- return qstrcmp(f1->name(),f2->name());
- else
- return 0;
-}
-MemberNameIterator::MemberNameIterator(const MemberName &mnlist) :
- QListIterator<MemberDef>(mnlist)
-{
-}
-
-int MemberNameSDict::compareValues(const MemberName *n1,const MemberName *n2) const
-{
- return qstricmp(n1->memberName()+getPrefixIndex(n1->memberName()),
- n2->memberName()+getPrefixIndex(n2->memberName())
- );
-}
-
diff --git a/src/membername.h b/src/membername.h
index 143dca1..88d8832 100644
--- a/src/membername.h
+++ b/src/membername.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -21,84 +21,112 @@
#include <qlist.h>
#include "memberdef.h"
#include "sortdict.h"
+#include "linkedmap.h"
-/** Class representing all MemberDef objects with the same name */
-class MemberName : public QList<MemberDef>
+class MemberName
{
public:
- MemberName(const char *name);
- ~MemberName();
- const char *memberName() const { return name; }
+ using Ptr = std::unique_ptr<MemberDef>;
+ using Vec = std::vector<Ptr>;
+ using iterator = typename Vec::iterator;
+ using const_iterator = typename Vec::const_iterator;
+ using reverse_iterator = typename Vec::reverse_iterator;
+ using const_reverse_iterator = typename Vec::const_reverse_iterator;
+
+ MemberName(const char *name) : m_name(name) {}
+ const char *memberName() const { return m_name; }
+
+ iterator begin() { return m_members.begin(); }
+ iterator end() { return m_members.end(); }
+ const_iterator begin() const { return m_members.begin(); }
+ const_iterator end() const { return m_members.end(); }
+ const_iterator cbegin() const { return m_members.cbegin(); }
+ const_iterator cend() const { return m_members.cend(); }
+ reverse_iterator rbegin() { return m_members.rbegin(); }
+ reverse_iterator rend() { return m_members.rend(); }
+ const_reverse_iterator crbegin() const { return m_members.crbegin(); }
+ const_reverse_iterator crend() const { return m_members.crend(); }
+ bool empty() const { return m_members.empty(); }
+ size_t size() const { return m_members.size(); }
+ Ptr &back() { return m_members.back(); }
+ const Ptr &back() const { return m_members.back(); }
+ Ptr &front() { return m_members.front(); }
+ const Ptr &front() const { return m_members.front(); }
+ void push_back(Ptr &&p) { m_members.push_back(std::move(p)); }
private:
- int compareValues(const MemberDef *item1,const MemberDef *item2) const;
- QCString name;
+ QCString m_name;
+ Vec m_members;
};
-/** Iterator for MemberDef objects in a MemberName list. */
-class MemberNameIterator : public QListIterator<MemberDef>
+/** Ordered dictionary of MemberName objects. */
+class MemberNameLinkedMap : public LinkedMap<MemberName>
{
- public:
- MemberNameIterator( const MemberName &list);
};
-/** Sorted dictionary of MemberName objects. */
-class MemberNameSDict : public SDict<MemberName>
+/** Data associated with a MemberDef in an inheritance relation. */
+class MemberInfo
{
public:
- MemberNameSDict(int size) : SDict<MemberName>(size) {}
- ~MemberNameSDict() {}
+ MemberInfo(MemberDef *md,Protection p,Specifier v,bool inh) :
+ m_memberDef(md), m_prot(p), m_virt(v), m_inherited(inh) {}
+ ~MemberInfo() {}
- private:
- int compareValues(const MemberName *item1,const MemberName *item2) const;
-};
+ // getters
+ MemberDef *memberDef() { return m_memberDef; }
+ const MemberDef *memberDef() const { return m_memberDef; }
+ Protection prot() const { return m_prot; }
+ Specifier virt() const { return m_virt; }
+ bool inherited() const { return m_inherited; }
+ QCString scopePath() const { return m_scopePath; }
+ QCString ambiguityResolutionScope() const { return m_ambiguityResolutionScope; }
+ const ClassDef *ambigClass() const { return m_ambigClass; }
-/** Data associated with a MemberDef in an inheritance relation. */
-struct MemberInfo
-{
- MemberInfo(MemberDef *md,Protection p,Specifier v,bool inh) :
- memberDef(md), prot(p), virt(v), inherited(inh), ambigClass(0) {}
- ~MemberInfo() {}
- MemberDef *memberDef;
- Protection prot;
- Specifier virt;
- bool inherited;
- QCString scopePath;
- QCString ambiguityResolutionScope;
- ClassDef *ambigClass;
-};
+ // setters
+ void setAmbiguityResolutionScope(const QCString &s) { m_ambiguityResolutionScope = s; }
+ void setScopePath(const QCString &s) { m_scopePath = s; }
+ void setAmbigClass(const ClassDef *cd) { m_ambigClass = cd; }
-/** Class representing all MemberInfo objects with the same name */
-class MemberNameInfo : public QList<MemberInfo>
-{
- public:
- MemberNameInfo(const char *name);
- ~MemberNameInfo() {}
- const char *memberName() const { return name; }
private:
- int compareValues(const MemberInfo *item1,const MemberInfo *item2) const;
- QCString name;
+ MemberDef *m_memberDef;
+ Protection m_prot;
+ Specifier m_virt;
+ bool m_inherited;
+ QCString m_scopePath;
+ QCString m_ambiguityResolutionScope;
+ const ClassDef *m_ambigClass = 0;
};
-/** Iterator for MemberInfo objects in a MemberNameInfo list. */
-class MemberNameInfoIterator : public QListIterator<MemberInfo>
+class MemberNameInfo
{
public:
- MemberNameInfoIterator(const MemberNameInfo &mnii)
- : QListIterator<MemberInfo>(mnii) {}
+ using Ptr = std::unique_ptr<MemberInfo>;
+ using Vec = std::vector<Ptr>;
+ using iterator = typename Vec::iterator;
+ using const_iterator = typename Vec::const_iterator;
+
+ MemberNameInfo(const char *name) : m_name(name) {}
+ const char *memberName() const { return m_name; }
+
+ iterator begin() { return m_members.begin(); }
+ iterator end() { return m_members.end(); }
+ const_iterator begin() const { return m_members.begin(); }
+ const_iterator end() const { return m_members.end(); }
+ bool empty() const { return m_members.empty(); }
+ size_t size() const { return m_members.size(); }
+ Ptr &back() { return m_members.back(); }
+ const Ptr &back() const { return m_members.back(); }
+ Ptr &front() { return m_members.front(); }
+ const Ptr &front() const { return m_members.front(); }
+ void push_back(Ptr &&p) { m_members.push_back(std::move(p)); }
+
+ private:
+ QCString m_name;
+ Vec m_members;
};
-/** Sorted dictionary of MemberNameInfo objects. */
-class MemberNameInfoSDict : public SDict<MemberNameInfo>
+class MemberNameInfoLinkedMap : public LinkedMap<MemberNameInfo>
{
- public:
- MemberNameInfoSDict(int size) : SDict<MemberNameInfo>(size) {}
- ~MemberNameInfoSDict() {}
- private:
- int compareValues(const MemberNameInfo *item1,const MemberNameInfo *item2) const
- {
- return qstricmp(item1->memberName(), item2->memberName());
- }
};
#endif
diff --git a/src/message.cpp b/src/message.cpp
index d8f83ef..95a7553 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -14,14 +14,13 @@
*/
#include <stdio.h>
-#include <qdatetime.h>
#include "config.h"
-#include "util.h"
#include "debug.h"
-#include "doxygen.h"
#include "portable.h"
-#include "filedef.h"
#include "message.h"
+#include "doxygen.h"
+
+#include <mutex>
static QCString outputFormat;
static const char *warning_str = "warning: ";
@@ -35,6 +34,17 @@ static const char *error_str = "error: ";
static FILE *warnFile = stderr;
+enum warn_as_error
+{
+ WARN_NO,
+ WARN_YES,
+ FAIL_ON_WARNINGS,
+};
+static warn_as_error warnBehavior = WARN_NO;
+static bool warnStat = false;
+
+static std::mutex g_mutex;
+
void initWarningFormat()
{
// int filePos = Config_getString(WARN_FORMAT).find("$file");
@@ -97,7 +107,11 @@ void initWarningFormat()
warnFile = stderr;
}
- if (Config_getBool(WARN_AS_ERROR))
+ QCString warnStr = Config_getEnum(WARN_AS_ERROR).upper();
+ if (warnStr =="NO") warnBehavior=WARN_NO;
+ else if (warnStr =="YES") warnBehavior=WARN_YES;
+ else if (warnStr =="FAIL_ON_WARNINGS") warnBehavior=FAIL_ON_WARNINGS;
+ if (warnBehavior == WARN_YES)
{
warning_str = error_str;
}
@@ -108,9 +122,10 @@ void msg(const char *fmt, ...)
{
if (!Config_getBool(QUIET))
{
+ std::unique_lock<std::mutex> lock(g_mutex);
if (Debug::isFlagSet(Debug::Time))
{
- printf("%.3f sec: ",((double)Doxygen::runningTime.elapsed())/1000.0);
+ printf("%.3f sec: ",((double)Debug::elapsedTime()));
}
va_list args;
va_start(args, fmt);
@@ -125,17 +140,7 @@ static void format_warn(const char *file,int line,const char *text)
QCString lineSubst; lineSubst.setNum(line);
QCString textSubst = text;
QCString versionSubst;
- if (file) // get version from file name
- {
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,file,ambig);
- if (fd)
- {
- versionSubst = fd->getVersion();
- }
- }
// substitute markers by actual values
- bool warnAsError = Config_getBool(WARN_AS_ERROR);
QCString msgText =
substitute(
substitute(
@@ -150,18 +155,34 @@ static void format_warn(const char *file,int line,const char *text)
),
"$text",textSubst
);
- if (warnAsError)
+ if (warnBehavior == WARN_YES)
{
msgText += " (warning treated as error, aborting now)";
}
msgText += '\n';
- // print resulting message
- fwrite(msgText.data(),1,msgText.length(),warnFile);
- if (warnAsError)
+ {
+ std::unique_lock<std::mutex> lock(g_mutex);
+ // print resulting message
+ fwrite(msgText.data(),1,msgText.length(),warnFile);
+ }
+ if (warnBehavior == WARN_YES)
{
exit(1);
}
+ warnStat = true;
+}
+
+static void handle_warn_as_error()
+{
+ if (warnBehavior == WARN_YES)
+ {
+ std::unique_lock<std::mutex> lock(g_mutex);
+ QCString msgText = " (warning treated as error, aborting now)\n";
+ fwrite(msgText.data(),1,msgText.length(),warnFile);
+ exit(1);
+ }
+ warnStat = true;
}
static void do_warn(bool enabled, const char *file, int line, const char *prefix, const char *fmt, va_list args)
@@ -174,7 +195,7 @@ static void do_warn(bool enabled, const char *file, int line, const char *prefix
int l=0;
if (prefix)
{
- l=strlen(prefix);
+ l=(int)strlen(prefix);
}
// determine needed buffersize based on:
// format + arguments
@@ -233,6 +254,7 @@ void warn_uncond(const char *fmt, ...)
va_start(args, fmt);
vfprintf(warnFile, (QCString(warning_str) + fmt).data(), args);
va_end(args);
+ handle_warn_as_error();
}
void err(const char *fmt, ...)
@@ -241,6 +263,7 @@ void err(const char *fmt, ...)
va_start(args, fmt);
vfprintf(warnFile, (QCString(error_str) + fmt).data(), args);
va_end(args);
+ handle_warn_as_error();
}
extern void err_full(const char *file,int line,const char *fmt, ...)
@@ -253,18 +276,27 @@ extern void err_full(const char *file,int line,const char *fmt, ...)
void term(const char *fmt, ...)
{
- va_list args;
- va_start(args, fmt);
- vfprintf(warnFile, (QCString(error_str) + fmt).data(), args);
- va_end(args);
- if (warnFile != stderr)
{
- for (int i = 0; i < strlen(error_str); i++) fprintf(warnFile, " ");
- fprintf(warnFile, "%s\n", "Exiting...");
+ std::unique_lock<std::mutex> lock(g_mutex);
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(warnFile, (QCString(error_str) + fmt).data(), args);
+ va_end(args);
+ if (warnFile != stderr)
+ {
+ for (int i = 0; i < (int)strlen(error_str); i++) fprintf(warnFile, " ");
+ fprintf(warnFile, "%s\n", "Exiting...");
+ }
}
exit(1);
}
+void warn_flush()
+{
+ fflush(warnFile);
+}
+
+
void printlex(int dbg, bool enter, const char *lexName, const char *fileName)
{
const char *enter_txt = "entering";
@@ -276,6 +308,7 @@ void printlex(int dbg, bool enter, const char *lexName, const char *fileName)
enter_txt_uc = "Finished";
}
+ std::unique_lock<std::mutex> lock(g_mutex);
if (dbg)
{
if (fileName)
@@ -291,3 +324,11 @@ void printlex(int dbg, bool enter, const char *lexName, const char *fileName)
Debug::print(Debug::Lex,0,"%s lexical analyzer: %s\n",enter_txt_uc, qPrint(lexName));
}
}
+
+extern void finishWarnExit()
+{
+ if (warnStat && warnBehavior == FAIL_ON_WARNINGS)
+ {
+ exit(1);
+ }
+}
diff --git a/src/message.h b/src/message.h
index 7b12ba8..af49632 100644
--- a/src/message.h
+++ b/src/message.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,20 +16,30 @@
#ifndef MESSAGE_H
#define MESSAGE_H
-#include <stdio.h>
-#include <stdarg.h>
+#include <cstdarg>
+
+#ifdef __GNUC__
+#define PRINTFLIKE(FORMAT, PARAM ) __attribute__((format(printf, FORMAT, PARAM)))
+#else
+#define PRINTFLIKE(FORMAT, PARAM )
+#endif
-extern void msg(const char *fmt, ...);
-extern void warn(const char *file,int line,const char *fmt, ...);
-extern void va_warn(const char *file,int line,const char *fmt, va_list args);
+extern void msg(const char *fmt, ...) PRINTFLIKE(1,2);
+extern void warn(const char *file,int line,const char *fmt, ...) PRINTFLIKE(3, 4);
+extern void va_warn(const char* file, int line, const char* fmt, va_list args);
extern void warn_simple(const char *file,int line,const char *text);
-extern void warn_undoc(const char *file,int line,const char *fmt, ...);
-extern void warn_doc_error(const char *file,int line,const char *fmt, ...);
-extern void warn_uncond(const char *fmt, ...);
-extern void err(const char *fmt, ...);
-extern void err_full(const char *file,int line,const char *fmt, ...);
-extern void term(const char *fmt, ...);
+extern void warn_undoc(const char *file,int line,const char *fmt, ...) PRINTFLIKE(3, 4);
+extern void warn_doc_error(const char *file,int line,const char *fmt, ...) PRINTFLIKE(3, 4);
+extern void warn_uncond(const char *fmt, ...) PRINTFLIKE(1, 2);
+extern void err(const char *fmt, ...) PRINTFLIKE(1, 2);
+extern void err_full(const char *file,int line,const char *fmt, ...) PRINTFLIKE(3, 4);
+extern void term(const char *fmt, ...) PRINTFLIKE(1, 2);
void initWarningFormat();
+void warn_flush();
+extern void finishWarnExit();
extern void printlex(int dbg, bool enter, const char *lexName, const char *fileName);
+
+#undef PRINTFLIKE
+
#endif
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 220f300..d0a88f0 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -34,8 +34,21 @@
#include "membername.h"
//------------------------------------------------------------------
+static QCString makeDisplayName(const NamespaceDef *nd,bool includeScope)
+{
+ QCString result=includeScope ? nd->name() : nd->localName();
+ SrcLangExt lang = nd->getLanguage();
+ QCString sep = getLanguageSpecificSeparator(lang);
+ if (sep!="::")
+ {
+ result = substitute(result,"::",sep);
+ }
+ //printf("makeDisplayName() %s->%s lang=%d\n",name().data(),result.data(),lang);
+ return result;
+}
+//------------------------------------------------------------------
-class NamespaceDefImpl : public DefinitionImpl, public NamespaceDef
+class NamespaceDefImpl : public DefinitionMixin<NamespaceDefMutable>
{
public:
NamespaceDefImpl(const char *defFileName,int defLine,int defColumn,
@@ -58,10 +71,10 @@ class NamespaceDefImpl : public DefinitionImpl, public NamespaceDef
virtual void countMembers();
virtual int numDocMembers() const;
virtual void addUsingDirective(const NamespaceDef *nd);
- virtual const NamespaceSDict *getUsedNamespaces() const;
- virtual void addUsingDeclaration(const Definition *def);
- virtual const SDict<Definition> *getUsedClasses() const { return usingDeclList; }
- virtual void combineUsingRelations();
+ virtual LinkedRefMap<const NamespaceDef> getUsedNamespaces() const { return m_usingDirList; }
+ virtual void addUsingDeclaration(const ClassDef *cd);
+ virtual LinkedRefMap<const ClassDef> getUsedClasses() const { return m_usingDeclList; }
+ virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace);
virtual QCString displayName(bool=TRUE) const;
virtual QCString localName() const;
virtual void setInline(bool isInline) { m_inline = isInline; }
@@ -76,31 +89,27 @@ class NamespaceDefImpl : public DefinitionImpl, public NamespaceDef
virtual void distributeMemberGroupDocumentation();
virtual void findSectionsInDocumentation();
virtual void sortMemberLists();
- virtual Definition *findInnerCompound(const char *name) const;
+ virtual const Definition *findInnerCompound(const char *name) const;
virtual void addInnerCompound(const Definition *d);
virtual void addListReferences();
virtual void setFileName(const QCString &fn);
virtual bool subGrouping() const { return m_subGrouping; }
virtual MemberList *getMemberList(MemberListType lt) const;
- virtual const QList<MemberList> &getMemberLists() const { return m_memberLists; }
- virtual MemberDef *getMemberByName(const QCString &) const;
- virtual MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
- virtual ClassSDict *getClassSDict() const { return classSDict; }
- virtual ClassSDict *getInterfaceSDict() const { return interfaceSDict; }
- virtual ClassSDict *getStructSDict() const { return structSDict; }
- virtual ClassSDict *getExceptionSDict() const { return exceptionSDict; }
- virtual const NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; }
+ virtual const MemberLists &getMemberLists() const { return m_memberLists; }
+ virtual const MemberDef *getMemberByName(const QCString &) const;
+ virtual const MemberGroupList &getMemberGroups() const { return m_memberGroups; }
+ virtual ClassLinkedRefMap getClasses() const { return classes; }
+ virtual ClassLinkedRefMap getInterfaces() const { return interfaces; }
+ virtual ClassLinkedRefMap getStructs() const { return structs; }
+ virtual ClassLinkedRefMap getExceptions() const { return exceptions; }
+ virtual NamespaceLinkedRefMap getNamespaces() const { return namespaces; }
virtual QCString title() const;
virtual QCString compoundTypeString() const;
virtual void setMetaData(const QCString &m);
- void setVisited(bool v) { m_visited = v; }
- bool isVisited() const { return m_visited; }
private:
- bool m_visited;
- MemberList *createMemberList(MemberListType lt);
void addMemberToList(MemberListType lt,MemberDef *md);
void writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCString &title);
void writeMemberDocumentation(OutputList &ol,MemberListType lt,const QCString &title);
@@ -108,7 +117,7 @@ class NamespaceDefImpl : public DefinitionImpl, public NamespaceDef
void writeBriefDescription(OutputList &ol);
void startMemberDeclarations(OutputList &ol);
void endMemberDeclarations(OutputList &ol);
- void writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d);
+ void writeClassDeclarations(OutputList &ol,const QCString &title,const ClassLinkedRefMap &d);
void writeInlineClasses(OutputList &ol);
void writeMemberGroups(OutputList &ol);
void writeAuthorSection(OutputList &ol);
@@ -116,7 +125,7 @@ class NamespaceDefImpl : public DefinitionImpl, public NamespaceDef
void endMemberDocumentation(OutputList &ol);
void writeSummaryLinks(OutputList &ol) const;
void addNamespaceAttributes(OutputList &ol);
- void writeClassesToTagFile(FTextStream &,ClassSDict *d);
+ void writeClassesToTagFile(FTextStream &,const ClassLinkedRefMap &d);
void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
bool isConstantGroup=false);
@@ -124,18 +133,18 @@ class NamespaceDefImpl : public DefinitionImpl, public NamespaceDef
QCString fileName;
FileList files;
- NamespaceSDict *usingDirList = 0;
- SDict<Definition> *usingDeclList = 0;
+ LinkedRefMap<const NamespaceDef> m_usingDirList;
+ LinkedRefMap<const ClassDef> m_usingDeclList;
SDict<Definition> *m_innerCompounds = 0;
- MemberSDict *m_allMembersDict = 0;
- QList<MemberList> m_memberLists;
- MemberGroupSDict *memberGroupSDict = 0;
- ClassSDict *classSDict = 0;
- ClassSDict *interfaceSDict = 0;
- ClassSDict *structSDict = 0;
- ClassSDict *exceptionSDict = 0;
- NamespaceSDict *namespaceSDict = 0;
+ MemberLinkedRefMap m_allMembers;
+ MemberLists m_memberLists;
+ MemberGroupList m_memberGroups;
+ ClassLinkedRefMap classes;
+ ClassLinkedRefMap interfaces;
+ ClassLinkedRefMap structs;
+ ClassLinkedRefMap exceptions;
+ NamespaceLinkedRefMap namespaces;
bool m_subGrouping = false;
enum { NAMESPACE, MODULE, CONSTANT_GROUP, LIBRARY } m_type;
bool m_isPublished = false;
@@ -143,7 +152,7 @@ class NamespaceDefImpl : public DefinitionImpl, public NamespaceDef
bool m_inline = false;
};
-NamespaceDef *createNamespaceDef(const char *defFileName,int defLine,int defColumn,
+NamespaceDefMutable *createNamespaceDef(const char *defFileName,int defLine,int defColumn,
const char *name,const char *ref,
const char *refFile,const char*type,
bool isPublished)
@@ -153,14 +162,15 @@ NamespaceDef *createNamespaceDef(const char *defFileName,int defLine,int defColu
//------------------------------------------------------------------
-class NamespaceDefAliasImpl : public DefinitionAliasImpl, public NamespaceDef
+class NamespaceDefAliasImpl : public DefinitionAliasMixin<NamespaceDef>
{
public:
- NamespaceDefAliasImpl(const Definition *newScope,const NamespaceDef *nd) : DefinitionAliasImpl(newScope,nd) {}
- virtual ~NamespaceDefAliasImpl() {}
+ NamespaceDefAliasImpl(const Definition *newScope,const NamespaceDef *nd)
+ : DefinitionAliasMixin(newScope,nd) { init(); }
+ virtual ~NamespaceDefAliasImpl() { deinit(); }
virtual DefType definitionType() const { return TypeNamespace; }
- const NamespaceDef *getNSAlias() const { return dynamic_cast<const NamespaceDef*>(getAlias()); }
+ const NamespaceDef *getNSAlias() const { return toNamespaceDef(getAlias()); }
// ---- getters
virtual QCString getOutputFileBase() const
@@ -169,18 +179,14 @@ class NamespaceDefAliasImpl : public DefinitionAliasImpl, public NamespaceDef
{ return getNSAlias()->anchor(); }
virtual int numDocMembers() const
{ return getNSAlias()->numDocMembers(); }
- virtual void addUsingDirective(const NamespaceDef *nd) {}
- virtual const NamespaceSDict *getUsedNamespaces() const
+ virtual LinkedRefMap<const NamespaceDef> getUsedNamespaces() const
{ return getNSAlias()->getUsedNamespaces(); }
- virtual void addUsingDeclaration(const Definition *def) {}
- virtual const SDict<Definition> *getUsedClasses() const
+ virtual LinkedRefMap<const ClassDef> getUsedClasses() const
{ return getNSAlias()->getUsedClasses(); }
- virtual void combineUsingRelations() {}
virtual QCString displayName(bool b=TRUE) const
- { return getNSAlias()->displayName(b); }
+ { return makeDisplayName(this,b); }
virtual QCString localName() const
{ return getNSAlias()->localName(); }
- virtual void setInline(bool isInline) { }
virtual bool isConstantGroup() const
{ return getNSAlias()->isConstantGroup(); }
virtual bool isModule() const
@@ -195,63 +201,41 @@ class NamespaceDefAliasImpl : public DefinitionAliasImpl, public NamespaceDef
{ return getNSAlias()->isLinkable(); }
virtual bool hasDetailedDescription() const
{ return getNSAlias()->hasDetailedDescription(); }
- virtual Definition *findInnerCompound(const char *name) const
+ virtual const Definition *findInnerCompound(const char *name) const
{ return getNSAlias()->findInnerCompound(name); }
virtual bool subGrouping() const
{ return getNSAlias()->subGrouping(); }
virtual MemberList *getMemberList(MemberListType lt) const
{ return getNSAlias()->getMemberList(lt); }
- virtual const QList<MemberList> &getMemberLists() const
+ virtual const MemberLists &getMemberLists() const
{ return getNSAlias()->getMemberLists(); }
- virtual MemberDef *getMemberByName(const QCString &name) const
+ virtual const MemberDef *getMemberByName(const QCString &name) const
{ return getNSAlias()->getMemberByName(name); }
- virtual MemberGroupSDict *getMemberGroupSDict() const
- { return getNSAlias()->getMemberGroupSDict(); }
- virtual ClassSDict *getClassSDict() const
- { return getNSAlias()->getClassSDict(); }
- virtual ClassSDict *getInterfaceSDict() const
- { return getNSAlias()->getInterfaceSDict(); }
- virtual ClassSDict *getStructSDict() const
- { return getNSAlias()->getStructSDict(); }
- virtual ClassSDict *getExceptionSDict() const
- { return getNSAlias()->getExceptionSDict(); }
- virtual const NamespaceSDict *getNamespaceSDict() const
- { return getNSAlias()->getNamespaceSDict(); }
+ virtual const MemberGroupList &getMemberGroups() const
+ { return getNSAlias()->getMemberGroups(); }
+ virtual ClassLinkedRefMap getClasses() const
+ { return getNSAlias()->getClasses(); }
+ virtual ClassLinkedRefMap getInterfaces() const
+ { return getNSAlias()->getInterfaces(); }
+ virtual ClassLinkedRefMap getStructs() const
+ { return getNSAlias()->getStructs(); }
+ virtual ClassLinkedRefMap getExceptions() const
+ { return getNSAlias()->getExceptions(); }
+ virtual NamespaceLinkedRefMap getNamespaces() const
+ { return getNSAlias()->getNamespaces(); }
virtual QCString title() const
{ return getNSAlias()->title(); }
virtual QCString compoundTypeString() const
{ return getNSAlias()->compoundTypeString(); }
-
- // --- setters/actions
- virtual void setMetaData(const QCString &m) {}
- virtual void insertUsedFile(FileDef *fd) { }
- virtual void writeDocumentation(OutputList &ol) {}
- virtual void writeMemberPages(OutputList &ol) {}
- virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const {}
- virtual void writeTagFile(FTextStream &) {}
- virtual void insertClass(const ClassDef *cd) {}
- virtual void insertNamespace(const NamespaceDef *nd) {}
- virtual void insertMember(MemberDef *md) {}
- virtual void computeAnchors() {}
- virtual void countMembers() {}
- virtual void addMembersToMemberGroup() {}
- virtual void distributeMemberGroupDocumentation() {}
- virtual void findSectionsInDocumentation() {}
- virtual void sortMemberLists() {}
- virtual void addInnerCompound(const Definition *d) {}
- virtual void addListReferences() {}
- virtual void setFileName(const QCString &fn) {}
-
- void setVisited(bool v) { m_visited = v; }
- bool isVisited() const { return m_visited; }
-
- private:
- bool m_visited = false;
};
NamespaceDef *createNamespaceDefAlias(const Definition *newScope,const NamespaceDef *nd)
{
- return new NamespaceDefAliasImpl(newScope,nd);
+ NamespaceDef *alnd = new NamespaceDefAliasImpl(newScope,nd);
+ //printf("alnd name=%s localName=%s qualifiedName=%s displayName()=%s\n",
+ // alnd->name().data(),alnd->localName().data(),alnd->qualifiedName().data(),
+ // alnd->displayName().data());
+ return alnd;
}
//------------------------------------------------------------------
@@ -260,7 +244,7 @@ NamespaceDefImpl::NamespaceDefImpl(const char *df,int dl,int dc,
const char *name,const char *lref,
const char *fName, const char*type,
bool isPublished) :
- DefinitionImpl(df,dl,dc,name)
+ DefinitionMixin(df,dl,dc,name)
,m_isPublished(isPublished)
{
if (fName)
@@ -278,19 +262,8 @@ NamespaceDefImpl::NamespaceDefImpl(const char *df,int dl,int dc,
{
setFileName(name);
}
- classSDict = new ClassSDict(17);
- interfaceSDict = new ClassSDict(17);
- structSDict = new ClassSDict(17);
- exceptionSDict = new ClassSDict(17);
- namespaceSDict = new NamespaceSDict(17);
m_innerCompounds = new SDict<Definition>(17);
- usingDirList = 0;
- usingDeclList = 0;
- m_allMembersDict = 0;
setReference(lref);
- memberGroupSDict = new MemberGroupSDict;
- memberGroupSDict->setAutoDelete(TRUE);
- m_visited=FALSE;
m_inline=FALSE;
m_subGrouping=Config_getBool(SUBGROUPING);
if (type && !strcmp("module", type))
@@ -313,16 +286,7 @@ NamespaceDefImpl::NamespaceDefImpl(const char *df,int dl,int dc,
NamespaceDefImpl::~NamespaceDefImpl()
{
- delete classSDict;
- delete interfaceSDict;
- delete structSDict;
- delete exceptionSDict;
- delete namespaceSDict;
delete m_innerCompounds;
- delete usingDirList;
- delete usingDeclList;
- delete memberGroupSDict;
- delete m_allMembersDict;
}
void NamespaceDefImpl::setFileName(const QCString &fn)
@@ -339,9 +303,7 @@ void NamespaceDefImpl::setFileName(const QCString &fn)
void NamespaceDefImpl::distributeMemberGroupDocumentation()
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ for (const auto &mg : m_memberGroups)
{
mg->distributeMemberGroupDocumentation();
}
@@ -349,16 +311,13 @@ void NamespaceDefImpl::distributeMemberGroupDocumentation()
void NamespaceDefImpl::findSectionsInDocumentation()
{
+ docFindSections(briefDescription(),this,docFile());
docFindSections(documentation(),this,docFile());
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ for (const auto &mg : m_memberGroups)
{
mg->findSectionsInDocumentation(this);
}
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_declarationLists)
{
@@ -370,7 +329,7 @@ void NamespaceDefImpl::findSectionsInDocumentation()
void NamespaceDefImpl::insertUsedFile(FileDef *fd)
{
if (fd==0) return;
- if (files.find(fd)==-1)
+ if (files.find(fd)==-1)
{
if (Config_getBool(SORT_MEMBER_DOCS))
files.inSort(fd);
@@ -384,83 +343,60 @@ void NamespaceDefImpl::addInnerCompound(const Definition *d)
m_innerCompounds->append(d->localName(),d);
if (d->definitionType()==Definition::TypeNamespace)
{
- insertNamespace(dynamic_cast<const NamespaceDef *>(d));
+ insertNamespace(toNamespaceDef(d));
}
else if (d->definitionType()==Definition::TypeClass)
{
- insertClass(dynamic_cast<const ClassDef *>(d));
+ insertClass(toClassDef(d));
}
}
void NamespaceDefImpl::insertClass(const ClassDef *cd)
{
- ClassSDict *d = classSDict;
+ ClassLinkedRefMap &d = classes;
if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
{
if (cd->compoundType()==ClassDef::Interface)
{
- d = interfaceSDict;
+ d = interfaces;
}
else if (cd->compoundType()==ClassDef::Struct)
{
- d = structSDict;
+ d = structs;
}
else if (cd->compoundType()==ClassDef::Exception)
{
- d = exceptionSDict;
+ d = exceptions;
}
}
- if (d->find(cd->name())==0)
- {
- if (Config_getBool(SORT_BRIEF_DOCS))
- {
- d->inSort(cd->name(),cd);
- }
- else
- {
- d->append(cd->name(),cd);
- }
- }
+ d.add(cd->name(),cd);
}
void NamespaceDefImpl::insertNamespace(const NamespaceDef *nd)
{
- if (namespaceSDict->find(nd->name())==0)
- {
- if (Config_getBool(SORT_MEMBER_DOCS))
- namespaceSDict->inSort(nd->name(),nd);
- else
- namespaceSDict->append(nd->name(),nd);
- }
+ namespaces.add(nd->name(),nd);
}
void NamespaceDefImpl::addMembersToMemberGroup()
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_declarationLists)
{
- ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
+ ::addMembersToMemberGroup(ml.get(),&m_memberGroups,this);
}
}
// add members inside sections to their groups
- if (memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ if (mg->allMembersInSameSection() && m_subGrouping)
{
- if (mg->allMembersInSameSection() && m_subGrouping)
- {
- //printf("----> addToDeclarationSection(%s)\n",mg->header().data());
- mg->addToDeclarationSection();
- }
+ //printf("----> addToDeclarationSection(%s)\n",mg->header().data());
+ mg->addToDeclarationSection();
}
}
}
@@ -470,8 +406,9 @@ void NamespaceDefImpl::insertMember(MemberDef *md)
//printf("%s::insertMember(%s) isInline=%d hasDocs=%d\n",qPrint(name()),qPrint(md->name()),
// isInline(),hasDocumentation());
if (md->isHidden()) return;
+ MemberDefMutable *mdm = toMemberDefMutable(md);
- // if this is an inline namespace that is not documented, then insert the
+ // if this is an inline namespace that is not documented, then insert the
// member in the parent scope instead
if (isInline() && !hasDocumentation())
{
@@ -480,16 +417,25 @@ void NamespaceDefImpl::insertMember(MemberDef *md)
{
if (outerScope->definitionType()==Definition::TypeNamespace)
{
- NamespaceDef *nd = dynamic_cast<NamespaceDef*>(outerScope);
- nd->insertMember(md);
- md->setNamespace(nd);
+ NamespaceDefMutable *nd = toNamespaceDefMutable(outerScope);
+ if (nd)
+ {
+ nd->insertMember(md);
+ if (mdm)
+ {
+ mdm->setNamespace(nd);
+ }
+ }
}
else if (outerScope->definitionType()==Definition::TypeFile)
{
- FileDef *fd = dynamic_cast<FileDef*>(outerScope);
+ FileDef *fd = toFileDef(outerScope);
fd->insertMember(md);
- md->setFileDef(fd);
- md->setOuterScope(fd);
+ if (mdm)
+ {
+ mdm->setFileDef(fd);
+ mdm->setOuterScope(fd);
+ }
}
}
}
@@ -498,47 +444,43 @@ void NamespaceDefImpl::insertMember(MemberDef *md)
MemberList *allMemberList = getMemberList(MemberListType_allMembersList);
if (allMemberList==0)
{
- allMemberList = new MemberList(MemberListType_allMembersList);
- m_memberLists.append(allMemberList);
- }
- allMemberList->append(md);
- if (m_allMembersDict==0)
- {
- m_allMembersDict = new MemberSDict;
+ m_memberLists.emplace_back(std::make_unique<MemberList>(MemberListType_allMembersList));
+ allMemberList = m_memberLists.back().get();
}
+ allMemberList->append(md);
//printf("%s::m_allMembersDict->append(%s)\n",name().data(),md->localName().data());
- m_allMembersDict->append(md->localName(),md);
+ m_allMembers.add(md->localName(),md);
//::addNamespaceMemberNameToIndex(md);
//static bool sortBriefDocs=Config_getBool(SORT_BRIEF_DOCS);
switch(md->memberType())
{
- case MemberType_Variable:
+ case MemberType_Variable:
addMemberToList(MemberListType_decVarMembers,md);
addMemberToList(MemberListType_docVarMembers,md);
break;
- case MemberType_Function:
+ case MemberType_Function:
addMemberToList(MemberListType_decFuncMembers,md);
addMemberToList(MemberListType_docFuncMembers,md);
break;
- case MemberType_Typedef:
+ case MemberType_Typedef:
addMemberToList(MemberListType_decTypedefMembers,md);
addMemberToList(MemberListType_docTypedefMembers,md);
break;
- case MemberType_Sequence:
+ case MemberType_Sequence:
addMemberToList(MemberListType_decSequenceMembers,md);
addMemberToList(MemberListType_docSequenceMembers,md);
break;
- case MemberType_Dictionary:
+ case MemberType_Dictionary:
addMemberToList(MemberListType_decDictionaryMembers,md);
addMemberToList(MemberListType_docDictionaryMembers,md);
break;
- case MemberType_Enumeration:
+ case MemberType_Enumeration:
addMemberToList(MemberListType_decEnumMembers,md);
addMemberToList(MemberListType_docEnumMembers,md);
break;
- case MemberType_EnumValue:
+ case MemberType_EnumValue:
break;
- case MemberType_Define:
+ case MemberType_Define:
addMemberToList(MemberListType_decDefineMembers,md);
addMemberToList(MemberListType_docDefineMembers,md);
break;
@@ -555,31 +497,27 @@ void NamespaceDefImpl::insertMember(MemberDef *md)
Definition *outerScope = getOuterScope();
if (outerScope)
{
- MemberDef *aliasMd = 0;
+ std::unique_ptr<MemberDef> aliasMd;
if (outerScope->definitionType()==Definition::TypeNamespace)
{
- aliasMd = createMemberDefAlias(outerScope,md);
- dynamic_cast<NamespaceDef*>(outerScope)->insertMember(aliasMd);
+ aliasMd.reset(createMemberDefAlias(outerScope,md));
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(outerScope);
+ if (ndm)
+ {
+ ndm->insertMember(aliasMd.get());
+ }
}
else if (outerScope->definitionType()==Definition::TypeFile)
{
- aliasMd = createMemberDefAlias(outerScope,md);
- dynamic_cast<FileDef*>(outerScope)->insertMember(aliasMd);
+ aliasMd.reset(createMemberDefAlias(outerScope,md));
+ toFileDef(outerScope)->insertMember(aliasMd.get());
}
if (aliasMd)
{
MemberName *mn;
QCString name = md->name();
- if ((mn=Doxygen::functionNameSDict->find(name)))
- {
- mn->append(aliasMd);
- }
- else
- {
- mn = new MemberName(name);
- mn->append(aliasMd);
- Doxygen::functionNameSDict->append(name,mn);
- }
+ mn = Doxygen::functionNameLinkedMap->add(name);
+ mn->push_back(std::move(aliasMd));
}
}
}
@@ -589,7 +527,7 @@ void NamespaceDefImpl::insertMember(MemberDef *md)
void NamespaceDefImpl::computeAnchors()
{
MemberList *allMemberList = getMemberList(MemberListType_allMembersList);
- if (allMemberList) setAnchors(allMemberList);
+ if (allMemberList) allMemberList->setAnchors();
}
bool NamespaceDefImpl::hasDetailedDescription() const
@@ -618,42 +556,33 @@ void NamespaceDefImpl::writeTagFile(FTextStream &tagFile)
{
case LayoutDocEntry::NamespaceNestedNamespaces:
{
- if (namespaceSDict)
+ for (const auto &nd : namespaces)
{
- SDict<NamespaceDef>::Iterator ni(*namespaceSDict);
- NamespaceDef *nd;
- for (ni.toFirst();(nd=ni.current());++ni)
+ if (nd->isLinkableInProject())
{
- if (nd->isLinkableInProject())
- {
- tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
- }
+ tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
}
}
}
break;
case LayoutDocEntry::NamespaceClasses:
{
- if (classSDict)
- writeClassesToTagFile(tagFile, classSDict);
+ writeClassesToTagFile(tagFile, classes);
}
break;
case LayoutDocEntry::NamespaceInterfaces:
{
- if (interfaceSDict)
- writeClassesToTagFile(tagFile, interfaceSDict);
+ writeClassesToTagFile(tagFile, interfaces);
}
break;
case LayoutDocEntry::NamespaceStructs:
{
- if (structSDict)
- writeClassesToTagFile(tagFile, structSDict);
+ writeClassesToTagFile(tagFile, structs);
}
break;
case LayoutDocEntry::NamespaceExceptions:
{
- if (exceptionSDict)
- writeClassesToTagFile(tagFile, exceptionSDict);
+ writeClassesToTagFile(tagFile, exceptions);
}
break;
case LayoutDocEntry::MemberDecl:
@@ -668,14 +597,9 @@ void NamespaceDefImpl::writeTagFile(FTextStream &tagFile)
break;
case LayoutDocEntry::MemberGroups:
{
- if (memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeTagFile(tagFile);
- }
+ mg->writeTagFile(tagFile);
}
}
break;
@@ -697,7 +621,7 @@ void NamespaceDefImpl::writeDetailedDescription(OutputList &ol,const QCString &t
ol.popGeneratorState();
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
- ol.writeAnchor(0,"details");
+ ol.writeAnchor(0,"details");
ol.popGeneratorState();
ol.startGroupHeader();
ol.parseText(title);
@@ -706,7 +630,8 @@ void NamespaceDefImpl::writeDetailedDescription(OutputList &ol,const QCString &t
ol.startTextBlock();
if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
{
- ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
!documentation().isEmpty())
@@ -723,7 +648,8 @@ void NamespaceDefImpl::writeDetailedDescription(OutputList &ol,const QCString &t
}
if (!documentation().isEmpty())
{
- ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
}
ol.endTextBlock();
}
@@ -734,7 +660,8 @@ void NamespaceDefImpl::writeBriefDescription(OutputList &ol)
if (hasBriefDescription())
{
DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
- briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ briefDescription(),TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
if (rootNode && !rootNode->isEmpty())
{
ol.startParagraph();
@@ -815,41 +742,35 @@ void NamespaceDefImpl::endMemberDocumentation(OutputList &ol)
}
}
-void NamespaceDefImpl::writeClassDeclarations(OutputList &ol,const QCString &title,ClassSDict *d)
+void NamespaceDefImpl::writeClassDeclarations(OutputList &ol,const QCString &title,const ClassLinkedRefMap &d)
{
- if (d) d->writeDeclaration(ol,0,title,TRUE);
+ d.writeDeclaration(ol,0,title,TRUE);
}
void NamespaceDefImpl::writeInlineClasses(OutputList &ol)
{
- if (classSDict) classSDict->writeDocumentation(ol,this);
+ classes.writeDocumentation(ol,this);
}
void NamespaceDefImpl::writeNamespaceDeclarations(OutputList &ol,const QCString &title,
bool const isConstantGroup)
{
- if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,isConstantGroup,TRUE);
+ namespaces.writeDeclaration(ol,title,isConstantGroup,TRUE);
}
void NamespaceDefImpl::writeMemberGroups(OutputList &ol)
{
/* write user defined member groups */
- if (memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- memberGroupSDict->sort();
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ if ((!mg->allMembersInSameSection() || !m_subGrouping)
+ && mg->header()!="[NOHEADER]")
{
- if ((!mg->allMembersInSameSection() || !m_subGrouping)
- && mg->header()!="[NOHEADER]")
- {
- mg->writeDeclarations(ol,0,this,0,0);
- }
+ mg->writeDeclarations(ol,0,this,0,0);
}
}
}
-
+
void NamespaceDefImpl::writeAuthorSection(OutputList &ol)
{
// write Author section (Man only)
@@ -873,35 +794,35 @@ void NamespaceDefImpl::writeSummaryLinks(OutputList &ol) const
SrcLangExt lang = getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if (lde->kind()==LayoutDocEntry::NamespaceClasses && classSDict && classSDict->declVisible())
+ if (lde->kind()==LayoutDocEntry::NamespaceClasses && classes.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "nested-classes";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::NamespaceInterfaces && interfaceSDict && interfaceSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::NamespaceInterfaces && interfaces.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "interfaces";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::NamespaceStructs && structSDict && structSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::NamespaceStructs && structs.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "structs";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::NamespaceExceptions && exceptionSDict && exceptionSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::NamespaceExceptions && exceptions.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "exceptions";
ol.writeSummaryLink(0,label,ls->title(lang),first);
first=FALSE;
}
- else if (lde->kind()==LayoutDocEntry::NamespaceNestedNamespaces && namespaceSDict && namespaceSDict->declVisible())
+ else if (lde->kind()==LayoutDocEntry::NamespaceNestedNamespaces && namespaces.declVisible())
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
QCString label = "namespaces";
@@ -940,11 +861,9 @@ void NamespaceDefImpl::addNamespaceAttributes(OutputList &ol)
}
}
-void NamespaceDefImpl::writeClassesToTagFile(FTextStream &tagFile,ClassSDict *d)
+void NamespaceDefImpl::writeClassesToTagFile(FTextStream &tagFile,const ClassLinkedRefMap &list)
{
- SDict<ClassDef>::Iterator ci(*d);
- ClassDef *cd;
- for (ci.toFirst();(cd=ci.current());++ci)
+ for (const auto &cd : list)
{
if (cd->isLinkableInProject())
{
@@ -978,7 +897,7 @@ void NamespaceDefImpl::writeDocumentation(OutputList &ol)
addNamespaceAttributes(ol);
endTitle(ol,getOutputFileBase(),displayName());
ol.startContents();
-
+
if (Doxygen::searchIndex)
{
Doxygen::searchIndex->setCurrentDoc(this,anchor(),FALSE);
@@ -997,82 +916,82 @@ void NamespaceDefImpl::writeDocumentation(OutputList &ol)
{
switch (lde->kind())
{
- case LayoutDocEntry::BriefDesc:
+ case LayoutDocEntry::BriefDesc:
writeBriefDescription(ol);
- break;
- case LayoutDocEntry::MemberDeclStart:
+ break;
+ case LayoutDocEntry::MemberDeclStart:
startMemberDeclarations(ol);
- break;
- case LayoutDocEntry::NamespaceClasses:
+ break;
+ case LayoutDocEntry::NamespaceClasses:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),classSDict);
+ writeClassDeclarations(ol,ls->title(lang),classes);
}
- break;
- case LayoutDocEntry::NamespaceInterfaces:
+ break;
+ case LayoutDocEntry::NamespaceInterfaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),interfaceSDict);
+ writeClassDeclarations(ol,ls->title(lang),interfaces);
}
- break;
- case LayoutDocEntry::NamespaceStructs:
+ break;
+ case LayoutDocEntry::NamespaceStructs:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),structSDict);
+ writeClassDeclarations(ol,ls->title(lang),structs);
}
- break;
- case LayoutDocEntry::NamespaceExceptions:
+ break;
+ case LayoutDocEntry::NamespaceExceptions:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeClassDeclarations(ol,ls->title(lang),exceptionSDict);
+ writeClassDeclarations(ol,ls->title(lang),exceptions);
}
- break;
- case LayoutDocEntry::NamespaceNestedNamespaces:
+ break;
+ case LayoutDocEntry::NamespaceNestedNamespaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeNamespaceDeclarations(ol,ls->title(lang),false);
}
- break;
+ break;
case LayoutDocEntry::NamespaceNestedConstantGroups:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeNamespaceDeclarations(ol,ls->title(lang),true);
}
break;
- case LayoutDocEntry::MemberGroups:
+ case LayoutDocEntry::MemberGroups:
writeMemberGroups(ol);
- break;
- case LayoutDocEntry::MemberDecl:
+ break;
+ case LayoutDocEntry::MemberDecl:
{
LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
}
- break;
- case LayoutDocEntry::MemberDeclEnd:
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
endMemberDeclarations(ol);
break;
- case LayoutDocEntry::DetailedDesc:
+ case LayoutDocEntry::DetailedDesc:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
writeDetailedDescription(ol,ls->title(lang));
}
break;
- case LayoutDocEntry::MemberDefStart:
+ case LayoutDocEntry::MemberDefStart:
startMemberDocumentation(ol);
- break;
+ break;
case LayoutDocEntry::NamespaceInlineClasses:
writeInlineClasses(ol);
break;
- case LayoutDocEntry::MemberDef:
+ case LayoutDocEntry::MemberDef:
{
LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
}
break;
- case LayoutDocEntry::MemberDefEnd:
+ case LayoutDocEntry::MemberDefEnd:
endMemberDocumentation(ol);
break;
- case LayoutDocEntry::AuthorSection:
+ case LayoutDocEntry::AuthorSection:
writeAuthorSection(ol);
break;
case LayoutDocEntry::ClassIncludes:
@@ -1090,16 +1009,16 @@ void NamespaceDefImpl::writeDocumentation(OutputList &ol)
case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
case LayoutDocEntry::FileIncludeGraph:
- case LayoutDocEntry::FileIncludedByGraph:
+ case LayoutDocEntry::FileIncludedByGraph:
case LayoutDocEntry::FileSourceLink:
case LayoutDocEntry::FileInlineClasses:
- case LayoutDocEntry::GroupClasses:
- case LayoutDocEntry::GroupInlineClasses:
+ case LayoutDocEntry::GroupClasses:
+ case LayoutDocEntry::GroupInlineClasses:
case LayoutDocEntry::GroupNamespaces:
- case LayoutDocEntry::GroupDirs:
- case LayoutDocEntry::GroupNestedGroups:
+ case LayoutDocEntry::GroupDirs:
+ case LayoutDocEntry::GroupNestedGroups:
case LayoutDocEntry::GroupFiles:
- case LayoutDocEntry::GroupGraph:
+ case LayoutDocEntry::GroupGraph:
case LayoutDocEntry::GroupPageDocs:
case LayoutDocEntry::DirSubDirs:
case LayoutDocEntry::DirFiles:
@@ -1129,9 +1048,7 @@ void NamespaceDefImpl::writeMemberPages(OutputList &ol)
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_documentationLists)
{
@@ -1157,25 +1074,25 @@ void NamespaceDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *cur
{
if (md->getNamespaceDef()==this && md->isLinkable() && !md->isEnumValue())
{
- ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
{
if (md==currentMd) // selected item => highlight
{
- ol.writeString("<a class=\"qindexHL\" ");
+ ol.writeString(" <tr><td class=\"navtabHL\">");
}
else
{
- ol.writeString("<a class=\"qindex\" ");
+ ol.writeString(" <tr><td class=\"navtab\">");
}
+ ol.writeString("<a class=\"navtab\" ");
ol.writeString("href=\"");
if (createSubDirs) ol.writeString("../../");
ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
ol.writeString("\">");
ol.writeString(convertToHtml(md->localName()));
ol.writeString("</a>");
+ ol.writeString("</td></tr>\n");
}
- ol.writeString("</td></tr>\n");
}
}
}
@@ -1186,22 +1103,15 @@ void NamespaceDefImpl::writeQuickMemberLinks(OutputList &ol,const MemberDef *cur
void NamespaceDefImpl::countMembers()
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
ml->countDecMembers();
ml->countDocMembers();
}
- if (memberGroupSDict)
+ for (const auto &mg : m_memberGroups)
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->countDecMembers();
- mg->countDocMembers();
- }
+ mg->countDecMembers();
+ mg->countDocMembers();
}
}
@@ -1213,33 +1123,13 @@ int NamespaceDefImpl::numDocMembers() const
void NamespaceDefImpl::addUsingDirective(const NamespaceDef *nd)
{
- if (usingDirList==0)
- {
- usingDirList = new NamespaceSDict;
- }
- if (usingDirList->find(nd->qualifiedName())==0)
- {
- usingDirList->append(nd->qualifiedName(),nd);
- }
- //printf("%p: NamespaceDefImpl::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count());
-}
-
-const NamespaceSDict *NamespaceDefImpl::getUsedNamespaces() const
-{
- //printf("%p: NamespaceDefImpl::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0);
- return usingDirList;
+ m_usingDirList.add(nd->qualifiedName(),nd);
+ //printf("%p: NamespaceDefImpl::addUsingDirective: %s:%d\n",this,name().data(),m_usingDirList->count());
}
-void NamespaceDefImpl::addUsingDeclaration(const Definition *d)
+void NamespaceDefImpl::addUsingDeclaration(const ClassDef *cd)
{
- if (usingDeclList==0)
- {
- usingDeclList = new SDict<Definition>(17);
- }
- if (usingDeclList->find(d->qualifiedName())==0)
- {
- usingDeclList->append(d->qualifiedName(),d);
- }
+ m_usingDeclList.add(cd->qualifiedName(),cd);
}
QCString NamespaceDefImpl::getOutputFileBase() const
@@ -1247,19 +1137,19 @@ QCString NamespaceDefImpl::getOutputFileBase() const
return fileName;
}
-Definition *NamespaceDefImpl::findInnerCompound(const char *n) const
+const Definition *NamespaceDefImpl::findInnerCompound(const char *n) const
{
if (n==0) return 0;
- Definition *d = m_innerCompounds->find(n);
+ const Definition *d = m_innerCompounds->find(n);
if (d==0)
{
- if (usingDirList)
+ if (!m_usingDirList.empty())
{
- d = usingDirList->find(n);
+ d = m_usingDirList.find(n);
}
- if (d==0 && usingDeclList)
+ if (d==0 && !m_usingDeclList.empty())
{
- d = usingDeclList->find(n);
+ d = m_usingDeclList.find(n);
}
}
return d;
@@ -1269,26 +1159,22 @@ void NamespaceDefImpl::addListReferences()
{
//bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
{
- const std::vector<ListItemInfo> &xrefItems = xrefListItems();
+ const RefItemVector &xrefItems = xrefListItems();
addRefItem(xrefItems,
qualifiedName(),
- getLanguage()==SrcLangExt_Fortran ?
- theTranslator->trModule(TRUE,TRUE) :
+ getLanguage()==SrcLangExt_Fortran ?
+ theTranslator->trModule(TRUE,TRUE) :
theTranslator->trNamespace(TRUE,TRUE),
getOutputFileBase(),displayName(),
0,
this
);
}
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ for (const auto &mg : m_memberGroups)
{
mg->addListReferences(this);
}
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()&MemberListType_documentationLists)
{
@@ -1299,15 +1185,7 @@ void NamespaceDefImpl::addListReferences()
QCString NamespaceDefImpl::displayName(bool includeScope) const
{
- QCString result=includeScope ? name() : localName();
- SrcLangExt lang = getLanguage();
- QCString sep = getLanguageSpecificSeparator(lang);
- if (sep!="::")
- {
- result = substitute(result,"::",sep);
- }
- //printf("NamespaceDefImpl::displayName() %s->%s lang=%d\n",name().data(),result.data(),lang);
- return result;
+ return makeDisplayName(this,includeScope);
}
QCString NamespaceDefImpl::localName() const
@@ -1321,51 +1199,41 @@ QCString NamespaceDefImpl::localName() const
return result;
}
-void NamespaceDefImpl::combineUsingRelations()
+void NamespaceDefImpl::combineUsingRelations(NamespaceDefSet &visitedNamespaces)
{
- if (m_visited) return; // already done
- m_visited=TRUE;
- if (usingDirList)
+ if (visitedNamespaces.find(this)!=visitedNamespaces.end()) return; // already processed
+ visitedNamespaces.insert(this);
+
+ LinkedRefMap<const NamespaceDef> usingDirList = m_usingDirList;
+ for (auto &nd : usingDirList)
{
- NamespaceSDict::Iterator nli(*usingDirList);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ NamespaceDefMutable *ndm = toNamespaceDefMutable(nd);
+ if (ndm)
{
- nd->combineUsingRelations();
+ ndm->combineUsingRelations(visitedNamespaces);
}
- for (nli.toFirst();(nd=nli.current());++nli)
+ }
+
+ for (auto &nd : usingDirList)
+ {
+ // add used namespaces of namespace nd to this namespace
+ for (const auto &und : nd->getUsedNamespaces())
{
- // add used namespaces of namespace nd to this namespace
- if (nd->getUsedNamespaces())
- {
- NamespaceSDict::Iterator unli(*nd->getUsedNamespaces());
- NamespaceDef *und;
- for (unli.toFirst();(und=unli.current());++unli)
- {
- //printf("Adding namespace %s to the using list of %s\n",und->qualifiedName().data(),qualifiedName().data());
- addUsingDirective(und);
- }
- }
- // add used classes of namespace nd to this namespace
- if (nd->getUsedClasses())
- {
- SDict<Definition>::Iterator cli(*nd->getUsedClasses());
- Definition *ucd;
- for (cli.toFirst();(ucd=cli.current());++cli)
- {
- //printf("Adding class %s to the using list of %s\n",cd->qualifiedName().data(),qualifiedName().data());
- addUsingDeclaration(ucd);
- }
- }
+ addUsingDirective(und);
+ }
+ // add used classes of namespace nd to this namespace
+ for (const auto &ucd : nd->getUsedClasses())
+ {
+ addUsingDeclaration(ucd);
}
}
}
-bool NamespaceSDict::declVisible() const
+//-------------------------------------------------------------------------------
+
+bool NamespaceLinkedRefMap::declVisible() const
{
- SDict<NamespaceDef>::Iterator ni(*this);
- NamespaceDef *nd;
- for (ni.toFirst();(nd=ni.current());++ni)
+ for (const auto &nd : *this)
{
if (nd->isLinkable())
{
@@ -1375,20 +1243,17 @@ bool NamespaceSDict::declVisible() const
return FALSE;
}
-void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,
+void NamespaceLinkedRefMap::writeDeclaration(OutputList &ol,const char *title,
bool const isConstantGroup,bool localName)
{
-
- if (count()==0) return; // no namespaces in the list
+
+ if (empty()) return; // no namespaces in the list
if (Config_getBool(OPTIMIZE_OUTPUT_VHDL)) return;
-
- SDict<NamespaceDef>::Iterator ni(*this);
- NamespaceDef *nd;
bool found=FALSE;
- for (ni.toFirst();(nd=ni.current()) && !found;++ni)
+ for (const auto &nd : *this)
{
if (nd->isLinkable() && nd->hasDocumentation())
{
@@ -1421,7 +1286,7 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,
ol.parseText(title);
ol.endMemberHeader();
ol.startMemberList();
- for (ni.toFirst();(nd=ni.current());++ni)
+ for (const auto &nd : *this)
{
if (nd->isLinkable() && nd->hasDocumentation())
{
@@ -1448,7 +1313,8 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,
if (!nd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
{
ol.startMemberDescription(nd->getOutputFileBase());
- ol.generateDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE,0,TRUE);
+ ol.generateDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
@@ -1457,29 +1323,13 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,
ol.endMemberList();
}
-MemberList *NamespaceDefImpl::createMemberList(MemberListType lt)
-{
- m_memberLists.setAutoDelete(TRUE);
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
- {
- if (ml->listType()==lt)
- {
- return ml;
- }
- }
- // not found, create a new member list
- ml = new MemberList(lt);
- m_memberLists.append(ml);
- return ml;
-}
+//-------------------------------------------------------------------------------
void NamespaceDefImpl::addMemberToList(MemberListType lt,MemberDef *md)
{
static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
static bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
- MemberList *ml = createMemberList(lt);
+ const auto &ml = m_memberLists.get(lt);
ml->setNeedsSorting(
((ml->listType()&MemberListType_declarationLists) && sortBriefDocs) ||
((ml->listType()&MemberListType_documentationLists) && sortMemberDocs));
@@ -1487,49 +1337,53 @@ void NamespaceDefImpl::addMemberToList(MemberListType lt,MemberDef *md)
if (ml->listType()&MemberListType_declarationLists)
{
- md->setSectionList(ml);
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm)
+ {
+ mdm->setSectionList(this,ml.get());
+ }
}
}
void NamespaceDefImpl::sortMemberLists()
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
}
- if (classSDict)
- {
- classSDict->sort();
- }
- if (interfaceSDict)
- {
- interfaceSDict->sort();
- }
- if (structSDict)
- {
- structSDict->sort();
- }
- if (exceptionSDict)
+
+ if (Config_getBool(SORT_BRIEF_DOCS))
{
- exceptionSDict->sort();
+ auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
+ {
+ return Config_getBool(SORT_BY_SCOPE_NAME) ?
+ qstricmp(c1->name(), c2->name())<0 :
+ qstricmp(c1->className(), c2->className())<0;
+ };
+
+ std::sort(classes.begin(), classes.end(), classComp);
+ std::sort(interfaces.begin(),interfaces.end(),classComp);
+ std::sort(structs.begin(), structs.end(), classComp);
+ std::sort(exceptions.begin(),exceptions.end(),classComp);
+
}
- if (namespaceSDict)
+
+ // TODO: inconsistent: should be only done when SORT_BRIEF_DOCS is enabled...
+ auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
{
- namespaceSDict->sort();
- }
+ return qstricmp(n1->name(),n2->name())<0;
+ };
+
+ std::sort(namespaces.begin(),namespaces.end(),namespaceComp);
}
MemberList *NamespaceDefImpl::getMemberList(MemberListType lt) const
{
- QListIterator<MemberList> mli(m_memberLists);
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (auto &ml : m_memberLists)
{
if (ml->listType()==lt)
{
- return ml;
+ return ml.get();
}
}
return 0;
@@ -1571,15 +1425,9 @@ bool NamespaceDefImpl::isLinkable() const
return isLinkableInProject() || isReference();
}
-MemberDef * NamespaceDefImpl::getMemberByName(const QCString &n) const
+const MemberDef * NamespaceDefImpl::getMemberByName(const QCString &n) const
{
- MemberDef *md = 0;
- if (m_allMembersDict && !n.isEmpty())
- {
- md = m_allMembersDict->find(n);
- //printf("%s::m_allMembersDict->find(%s)=%p\n",name().data(),n.data(),md);
- }
- return md;
+ return m_allMembers.find(n);
}
QCString NamespaceDefImpl::title() const
@@ -1648,3 +1496,68 @@ void NamespaceDefImpl::setMetaData(const QCString &m)
{
metaData = m;
}
+
+// --- Cast functions
+//
+NamespaceDef *toNamespaceDef(Definition *d)
+{
+ if (d && (typeid(*d)==typeid(NamespaceDefImpl) || typeid(*d)==typeid(NamespaceDefAliasImpl)))
+ {
+ return static_cast<NamespaceDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+NamespaceDef *toNamespaceDef(DefinitionMutable *md)
+{
+ Definition *d = toDefinition(md);
+ if (d && typeid(*d)==typeid(NamespaceDefImpl))
+ {
+ return static_cast<NamespaceDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+const NamespaceDef *toNamespaceDef(const Definition *d)
+{
+ if (d && (typeid(*d)==typeid(NamespaceDefImpl) || typeid(*d)==typeid(NamespaceDefAliasImpl)))
+ {
+ return static_cast<const NamespaceDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+NamespaceDefMutable *toNamespaceDefMutable(Definition *d)
+{
+ if (d && typeid(*d)==typeid(NamespaceDefImpl))
+ {
+ return static_cast<NamespaceDefMutable*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+NamespaceDefMutable *toNamespaceDefMutable(const Definition *d)
+{
+ if (d && typeid(*d)==typeid(NamespaceDefImpl))
+ {
+ return const_cast<NamespaceDefMutable*>(static_cast<const NamespaceDefMutable*>(d));
+ }
+ else
+ {
+ return 0;
+ }
+}
+
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 3be54f2..e644a32 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,104 +16,121 @@
#ifndef NAMESPACEDEF_H
#define NAMESPACEDEF_H
+#include <set>
+
#include <qstrlist.h>
-#include <qdict.h>
-#include "sortdict.h"
#include "definition.h"
#include "filedef.h"
+#include "linkedmap.h"
+#include "membergroup.h"
class MemberList;
class ClassDef;
class OutputList;
-class ClassSDict;
+class ClassLinkedRefMap;
class MemberDef;
-class MemberGroupSDict;
-class NamespaceSDict;
+class NamespaceDef;
class FTextStream;
+class NamespaceDef;
+class NamespaceDefMutable;
+
+// --- Set of namespaces
+
+using NamespaceDefSet = std::set<const NamespaceDef*>;
+
+class NamespaceLinkedMap : public LinkedMap<NamespaceDef>
+{
+};
+
+class NamespaceLinkedRefMap : public LinkedRefMap<const NamespaceDef>
+{
+ public:
+ void writeDeclaration(OutputList &ol,const char *title,
+ bool isConstantGroup=false, bool localName=FALSE);
+ bool declVisible() const;
+};
/** An abstract interface of a namespace symbol. */
-class NamespaceDef : virtual public Definition
+class NamespaceDef : public Definition
{
public:
virtual ~NamespaceDef() {}
virtual DefType definitionType() const = 0;
+
+ // ---- getters
virtual QCString getOutputFileBase() const = 0;
virtual QCString anchor() const = 0;
- virtual void insertUsedFile(FileDef *fd) = 0;
-
- virtual void writeDocumentation(OutputList &ol) = 0;
- virtual void writeMemberPages(OutputList &ol) = 0;
- virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const = 0;
- virtual void writeTagFile(FTextStream &) = 0;
-
- virtual void insertClass(const ClassDef *cd) = 0;
- virtual void insertNamespace(const NamespaceDef *nd) = 0;
- virtual void insertMember(MemberDef *md) = 0; // md cannot be const, since setSectionList is called on it
-
- virtual void computeAnchors() = 0;
- virtual void countMembers() = 0;
virtual int numDocMembers() const = 0;
- virtual void addUsingDirective(const NamespaceDef *nd) = 0;
- virtual const NamespaceSDict *getUsedNamespaces() const = 0;
- virtual void addUsingDeclaration(const Definition *def) = 0;
- virtual const SDict<Definition> *getUsedClasses() const = 0;
- virtual void combineUsingRelations() = 0;
+ virtual LinkedRefMap<const NamespaceDef> getUsedNamespaces() const = 0;
+ virtual LinkedRefMap<const ClassDef> getUsedClasses() const = 0;
virtual QCString displayName(bool=TRUE) const = 0;
virtual QCString localName() const = 0;
- virtual void setInline(bool isInline) = 0;
-
virtual bool isConstantGroup() const = 0;
virtual bool isModule() const = 0;
virtual bool isLibrary() const = 0;
virtual bool isInline() const = 0;
-
virtual bool isLinkableInProject() const = 0;
virtual bool isLinkable() const = 0;
virtual bool hasDetailedDescription() const = 0;
- virtual void addMembersToMemberGroup() = 0;
- virtual void distributeMemberGroupDocumentation() = 0;
- virtual void findSectionsInDocumentation() = 0;
- virtual void sortMemberLists() = 0;
-
- virtual Definition *findInnerCompound(const char *name) const = 0;
- virtual void addInnerCompound(const Definition *d) = 0;
- virtual void addListReferences() = 0;
- virtual void setFileName(const QCString &fn) = 0;
-
+ virtual const Definition *findInnerCompound(const char *name) const = 0;
virtual bool subGrouping() const = 0;
-
virtual MemberList *getMemberList(MemberListType lt) const = 0;
- virtual const QList<MemberList> &getMemberLists() const = 0;
- virtual MemberDef *getMemberByName(const QCString &) const = 0;
+ virtual const MemberLists &getMemberLists() const = 0;
+ virtual const MemberDef *getMemberByName(const QCString &) const = 0;
/*! Returns the user defined member groups */
- virtual MemberGroupSDict *getMemberGroupSDict() const = 0;
+ virtual const MemberGroupList &getMemberGroups() const = 0;
/*! Returns the classes contained in this namespace */
- virtual ClassSDict *getClassSDict() const = 0;
+ virtual ClassLinkedRefMap getClasses() const = 0;
/*! Returns the Slice interfaces contained in this namespace */
- virtual ClassSDict *getInterfaceSDict() const = 0;
+ virtual ClassLinkedRefMap getInterfaces() const = 0;
/*! Returns the Slice structs contained in this namespace */
- virtual ClassSDict *getStructSDict() const = 0;
+ virtual ClassLinkedRefMap getStructs() const = 0;
/*! Returns the Slice exceptions contained in this namespace */
- virtual ClassSDict *getExceptionSDict() const = 0;
+ virtual ClassLinkedRefMap getExceptions() const = 0;
/*! Returns the namespaces contained in this namespace */
- virtual const NamespaceSDict *getNamespaceSDict() const = 0;
+ virtual NamespaceLinkedRefMap getNamespaces() const = 0;
virtual QCString title() const = 0;
virtual QCString compoundTypeString() const = 0;
+};
+
+class NamespaceDefMutable : public DefinitionMutable, public NamespaceDef
+{
+ public:
+ // --- setters/actions
virtual void setMetaData(const QCString &m) = 0;
- virtual void setVisited(bool v) = 0;
- virtual bool isVisited() const = 0;
+ virtual void insertUsedFile(FileDef *fd) = 0;
+ virtual void writeDocumentation(OutputList &ol) = 0;
+ virtual void writeMemberPages(OutputList &ol) = 0;
+ virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const = 0;
+ virtual void writeTagFile(FTextStream &) = 0;
+ virtual void insertClass(const ClassDef *cd) = 0;
+ virtual void insertNamespace(const NamespaceDef *nd) = 0;
+ virtual void insertMember(MemberDef *md) = 0; // md cannot be const, since setSectionList is called on it
+ virtual void computeAnchors() = 0;
+ virtual void countMembers() = 0;
+ virtual void addMembersToMemberGroup() = 0;
+ virtual void distributeMemberGroupDocumentation() = 0;
+ virtual void findSectionsInDocumentation() = 0;
+ virtual void sortMemberLists() = 0;
+ virtual void addInnerCompound(const Definition *d) = 0;
+ virtual void addListReferences() = 0;
+ virtual void setFileName(const QCString &fn) = 0;
+ virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace) = 0;
+ virtual void addUsingDirective(const NamespaceDef *nd) = 0;
+ virtual void addUsingDeclaration(const ClassDef *cd) = 0;
+ virtual void setInline(bool isInline) = 0;
};
/** Factory method to create new NamespaceDef instance */
-NamespaceDef *createNamespaceDef(const char *defFileName,int defLine,int defColumn,
+NamespaceDefMutable *createNamespaceDef(const char *defFileName,int defLine,int defColumn,
const char *name,const char *ref=0,
const char *refFile=0,const char*type=0,
bool isPublished=false);
@@ -123,49 +138,15 @@ NamespaceDef *createNamespaceDef(const char *defFileName,int defLine,int defColu
/** Factory method to create an alias of an existing namespace. Used for inline namespaces. */
NamespaceDef *createNamespaceDefAlias(const Definition *newScope, const NamespaceDef *nd);
-/** A list of NamespaceDef objects. */
-class NamespaceList : public QList<NamespaceDef>
-{
- public:
- ~NamespaceList() {}
- int compareValues(const NamespaceDef *nd1,const NamespaceDef *nd2) const
- {
- return qstricmp(nd1->name(), nd2->name());
- }
-};
-
-/** An iterator for NamespaceDef objects in a NamespaceList. */
-class NamespaceListIterator : public QListIterator<NamespaceDef>
-{
- public:
- NamespaceListIterator(const NamespaceList &l) :
- QListIterator<NamespaceDef>(l) {}
-};
-
-/** An unsorted dictionary of NamespaceDef objects. */
-class NamespaceDict : public QDict<NamespaceDef>
-{
- public:
- NamespaceDict(int size) : QDict<NamespaceDef>(size) {}
- ~NamespaceDict() {}
-};
-/** A sorted dictionary of NamespaceDef objects. */
-class NamespaceSDict : public SDict<NamespaceDef>
-{
- public:
- NamespaceSDict(int size=17) : SDict<NamespaceDef>(size) {}
- ~NamespaceSDict() {}
- void writeDeclaration(OutputList &ol,const char *title,
- bool isConstantGroup=false, bool localName=FALSE);
- bool declVisible() const;
- private:
- int compareValues(const NamespaceDef *item1,const NamespaceDef *item2) const
- {
- return qstricmp(item1->name(),item2->name());
- }
-};
+// --- Cast functions
+NamespaceDef *toNamespaceDef(Definition *d);
+NamespaceDef *toNamespaceDef(DefinitionMutable *d);
+const NamespaceDef *toNamespaceDef(const Definition *d);
+NamespaceDefMutable *toNamespaceDefMutable(Definition *d);
+NamespaceDefMutable *toNamespaceDefMutable(const Definition *d);
+//------------------------------------------------------------------------
#endif
diff --git a/src/objcache.cpp b/src/objcache.cpp
deleted file mode 100644
index a5180d6..0000000
--- a/src/objcache.cpp
+++ /dev/null
@@ -1,329 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdio.h>
-#include <assert.h>
-#include <qglobal.h>
-#include "objcache.h"
-#if !defined(_OS_WIN32_) || defined(__MINGW32__)
-#include <stdint.h>
-#endif
-
-//----------------------------------------------------------------------
-
-ObjCache::ObjCache(unsigned int logSize)
- : m_head(-1), m_tail(-1), //m_numEntries(0),
- m_size(1<<logSize), m_count(0), m_freeHashNodes(0), m_freeCacheNodes(0),
- m_lastHandle(-1)
-{
- int i;
- m_cache = new CacheNode[m_size];
- m_hash = new HashNode[m_size];
- // add all items to list of free buckets
- for (i=0;i<m_size-1;i++)
- {
- m_hash[i].nextHash = i+1;
- m_cache[i].next = i+1;
- }
- m_misses = 0;
- m_hits = 0;
-}
-
-ObjCache::~ObjCache()
-{
- delete[] m_cache;
- delete[] m_hash;
-}
-
-int ObjCache::add(void *obj,void **victim)
-{
- *victim=0;
-
- HashNode *hnode = hashFind(obj);
- //printf("hnode=%p\n",hnode);
- if (hnode) // move object to the front of the LRU list, since it is used
- // most recently
- {
- //printf("moveToFront=%d\n",hnode->index);
- moveToFront(hnode->index);
- m_hits++;
- }
- else // object not in the cache.
- {
- void *lruObj=0;
- if (m_freeCacheNodes!=-1) // cache not full -> add element to the cache
- {
- // remove element from free list
- int index = m_freeCacheNodes;
- m_freeCacheNodes = m_cache[index].next;
-
- // add to head of the list
- if (m_tail==-1)
- {
- m_tail = index;
- }
- m_cache[index].prev = -1;
- m_cache[index].next = m_head;
- if (m_head!=-1)
- {
- m_cache[m_head].prev = index;
- }
- m_head = index;
- m_count++;
- }
- else // cache full -> replace element in the cache
- {
- //printf("Cache full!\n");
- lruObj = m_cache[m_tail].obj;
- hashRemove(lruObj);
- moveToFront(m_tail); // m_tail indexes the emptied element, which becomes m_head
- }
- //printf("numEntries=%d size=%d\n",m_numEntries,m_size);
- m_cache[m_head].obj = obj;
- hnode = hashInsert(obj);
- hnode->index = m_head;
- *victim = lruObj;
- m_misses++;
- }
- return m_head;
-}
-
-void ObjCache::del(int index)
-{
- assert(index!=-1);
- assert(m_cache[index].obj!=0);
- hashRemove(m_cache[index].obj);
- moveToFront(index);
- m_head = m_cache[index].next;
- if (m_head==-1)
- m_tail=-1;
- else
- m_cache[m_head].prev=-1;
- m_cache[index].obj=0;
- m_cache[index].prev=-1;
- m_cache[index].next = m_freeCacheNodes;
- m_freeCacheNodes = index;
- m_count--;
-}
-
-#ifdef CACHE_DEBUG
-#define cache_debug_printf printf
-void ObjCache::printLRU()
-{
- cache_debug_printf("MRU->LRU: ");
- int index = m_head;
- while (index!=-1)
- {
- cache_debug_printf("%d=%p ",index,m_cache[index].obj);
- index = m_cache[index].next;
- }
- cache_debug_printf("\n");
-
- cache_debug_printf("LRU->MRU: ");
- index = m_tail;
- while (index!=-1)
- {
- cache_debug_printf("%d=%p ",index,m_cache[index].obj);
- index = m_cache[index].prev;
- }
- cache_debug_printf("\n");
-}
-#endif
-
-#ifdef CACHE_STATS
-#define cache_stats_printf printf
-void ObjCache::printStats()
-{
- cache_stats_printf("ObjCache: hits=%d misses=%d hit ratio=%f\n",m_hits,m_misses,m_hits*100.0/(m_hits+m_misses));
-}
-#endif
-
-void ObjCache::moveToFront(int index)
-{
- int prev,next;
- if (m_head!=index)
- {
- next = m_cache[index].next;
- prev = m_cache[index].prev;
-
- // de-chain node at index
- m_cache[prev].next = next;
- if (next!=-1) m_cache[next].prev = prev; else m_tail = prev;
-
- // add to head
- m_cache[index].prev = -1;
- m_cache[index].next = m_head;
- m_cache[m_head].prev = index;
- m_head = index;
- }
-}
-
-unsigned int ObjCache::hash(void *addr)
-{
- static bool isPtr64 = sizeof(addr)==8;
- if (isPtr64)
- {
- uint64 key = (uint64)addr;
- // Thomas Wang's 64 bit Mix Function
- key += ~(key << 32);
- key ^= (key >> 22);
- key += ~(key << 13);
- key ^= (key >> 8);
- key += (key << 3);
- key ^= (key >> 15);
- key += ~(key << 27);
- key ^= (key >> 31);
- return (unsigned int)(key & (m_size-1));
- }
- else
- {
- // Thomas Wang's 32 bit Mix Function
- uintptr_t key = (uintptr_t)addr;
- key += ~(key << 15);
- key ^= (key >> 10);
- key += (key << 3);
- key ^= (key >> 6);
- key += ~(key << 11);
- key ^= (key >> 16);
- return (unsigned int)(key & (m_size-1));
- }
-}
-
-ObjCache::HashNode *ObjCache::hashFind(void *obj)
-{
- HashNode *node = 0;
- int index = m_hash[hash(obj)].head;
- //printf("hashFind: obj=%p index=%d\n",obj,index);
- while (index!=-1 &&
- m_hash[index].obj!=obj
- ) // search for right object in the list
- {
- index = m_hash[index].nextHash;
- }
- // found the obj at index, so it is in the cache!
- if (index!=-1)
- {
- node = &m_hash[index];
- }
- return node;
-}
-
-ObjCache::HashNode *ObjCache::hashInsert(void *obj)
-{
- int index = hash(obj);
- //printf("Inserting %p index=%d\n",obj,index);
-
- // remove element from empty list
- int newElement = m_freeHashNodes;
- assert(newElement!=-1);
- m_freeHashNodes = m_hash[m_freeHashNodes].nextHash;
-
- if (m_hash[index].head!=-1) // hash collision -> goto end of the list
- {
- index = m_hash[index].head;
- while (m_hash[index].nextHash!=-1)
- {
- index = m_hash[index].nextHash;
- }
- // add to end of the list
- m_hash[index].nextHash = newElement;
- }
- else // first element in the hash list
- {
- m_hash[index].head = newElement;
- }
- // add to the end of the list
- m_hash[newElement].nextHash = -1;
- m_hash[newElement].obj = obj;
- return &m_hash[newElement];
-}
-
-void ObjCache::hashRemove(void *obj)
-{
- int index = hash(obj);
-
- // find element
- int curIndex = m_hash[index].head;
- int prevIndex=-1;
- while (m_hash[curIndex].obj!=obj)
- {
- prevIndex = curIndex;
- curIndex = m_hash[curIndex].nextHash;
- }
-
- if (prevIndex==-1) // remove from start
- {
- m_hash[index].head = m_hash[curIndex].nextHash;
- }
- else // remove in the middle
- {
- m_hash[prevIndex].nextHash = m_hash[curIndex].nextHash;
- }
-
- // add curIndex element to empty list
- m_hash[curIndex].nextHash = m_freeHashNodes;
- m_hash[curIndex].index = -1;
- m_hash[curIndex].obj = 0;
- m_freeHashNodes = curIndex;
-}
-
-#ifdef CACHE_TEST
-int main()
-{
- int i;
- struct obj
- {
- obj() : handle(-1) {}
- int handle;
- };
- obj *objs = new obj[100];
- ObjCache c(3);
- for (i=0;i<32;i++)
- {
- int objId=(i%3)+(i>>2)*4;
- printf("------- use(%d=%p)--------\n",objId,&objs[objId]);
-#ifdef CACHE_DEBUG
- c.printLRU();
-#endif
- obj *victim=0;
- if (objs[objId].handle==-1)
- {
- objs[objId].handle = c.add(&objs[objId],(void**)&victim);
- if (victim) victim->handle=-1;
- }
- else
- {
- c.use(objs[objId].handle);
- }
- printf("i=%d objId=%d using %p victim=%p\n",i,objId,&objs[objId],victim);
- }
- for (i=0;i<100;i++)
- {
- if (objs[i].handle!=-1)
- {
- printf("------ del objId=%d handle=%d ------\n",i,objs[i].handle);
- c.del(objs[i].handle);
- objs[i].handle=-1;
-#ifdef CACHE_DEBUG
- c.printLRU();
-#endif
- }
- }
- c.printStats();
- return 0;
-}
-#endif
diff --git a/src/objcache.h b/src/objcache.h
deleted file mode 100644
index 224b34b..0000000
--- a/src/objcache.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#ifndef OBJCACHE_H
-#define OBJCACHE_H
-
-//#define CACHE_TEST
-//#define CACHE_DEBUG
-#define CACHE_STATS
-
-/** @brief Cache for objects.
- *
- * This cache is used to decide which objects should remain in
- * memory. It uses a least recently used policy (LRU) to decide
- * which object should make room for a new object when the cache
- * is full. An object should be added using add(), and then use()
- * should be called when the object is used.
- */
-class ObjCache
-{
- private:
- struct CacheNode
- {
- CacheNode() : next(-1), prev(-1), obj(0) {}
- int next;
- int prev;
- void *obj;
- };
- struct HashNode
- {
- HashNode() : head(-1), nextHash(-1), index(-1), obj(0) {}
- int head;
- int nextHash;
- int index;
- void *obj;
- };
-
- public:
- /*! Creates the cache. The number of elements in the cache is 2 to
- * the power of \a logSize.
- */
- ObjCache(unsigned int logSize);
-
- /*! Deletes the cache and free all internal data-structures used. */
- ~ObjCache();
-
- /*! Adds \a obj to the cache. When victim is not null, this object is
- * removed from the cache to make room for \a obj.
- * Returns a handle to the object, which can be used by the use()
- * function, each time the object is used.
- */
- int add(void *obj,void **victim);
-
- /*! Indicates that this object is used. This will move the object
- * to the front of the internal LRU list to make sure it is removed last.
- * The parameter \a handle is returned when called add().
- */
- void use(int handle)
- {
- if (handle==m_lastHandle) return;
- m_lastHandle = handle;
- m_hits++;
- moveToFront(handle);
- }
-
- /*! Removes the item identified by \a handle from the cache.
- * @see add()
- */
- void del(int handle);
-
- /*! Debug function. Prints the LRU list */
- void printLRU();
- /*! Print miss/hits statistics */
- void printStats();
-
- /*! total size of the cache */
- int size() const { return m_size; }
-
- /*! number of elements in the cache */
- int count() const { return m_count; }
-
- int hits() const
- {
- return m_hits;
- }
- int misses() const
- {
- return m_misses;
- }
-
-
- private:
- void moveToFront(int index);
- unsigned int hash(void *addr);
- HashNode *hashFind(void *obj);
- HashNode *hashInsert(void *obj);
- void hashRemove(void *obj);
-
- CacheNode *m_cache;
- HashNode *m_hash;
- int m_head;
- int m_tail;
- int m_size;
- int m_count;
- int m_freeHashNodes;
- int m_freeCacheNodes;
- int m_lastHandle;
- int m_misses;
- int m_hits;
-};
-
-#endif // OBJCACHE_H
-
diff --git a/src/outputgen.cpp b/src/outputgen.cpp
index b9f24fa..5be6817 100644
--- a/src/outputgen.cpp
+++ b/src/outputgen.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -15,63 +15,135 @@
*
*/
+#include <stdexcept>
+
#include <stdlib.h>
#include <qfile.h>
+#include "doxygen.h"
#include "outputgen.h"
#include "message.h"
#include "portable.h"
-OutputGenerator::OutputGenerator()
+OutputGenerator::OutputGenerator(const char *dir) : m_dir(dir)
{
//printf("OutputGenerator::OutputGenerator()\n");
- m_file=0;
- m_active=TRUE;
- m_genStack = new QStack<bool>;
- m_genStack->setAutoDelete(TRUE);
}
OutputGenerator::~OutputGenerator()
{
//printf("OutputGenerator::~OutputGenerator()\n");
- delete m_file;
- delete m_genStack;
+}
+
+OutputGenerator::OutputGenerator(const OutputGenerator &og)
+{
+ m_dir = og.m_dir;
+ // we don't copy the other fields.
+ // after copying startPlainFile() should be called
+ if (og.t.device()!=nullptr)
+ {
+ throw std::runtime_error("OutputGenerator copy constructor called while a file is processing");
+ }
+}
+
+OutputGenerator &OutputGenerator::operator=(const OutputGenerator &og)
+{
+ m_dir = og.m_dir;
+ // we don't copy the other fields.
+ // after assignment startPlainFile() should be called
+ if (og.t.device()!=nullptr)
+ {
+ throw std::runtime_error("OutputGenerator assignment operator called while a file is processing");
+ }
+ return *this;
}
void OutputGenerator::startPlainFile(const char *name)
{
//printf("startPlainFile(%s)\n",name);
m_fileName=m_dir+"/"+name;
- m_file = new QFile(m_fileName);
- if (!m_file->open(IO_WriteOnly))
+ m_file.setName(m_fileName);
+ if (!m_file.open(IO_WriteOnly))
{
term("Could not open file %s for writing\n",m_fileName.data());
}
- t.setDevice(m_file);
+ t.setDevice(&m_file);
}
void OutputGenerator::endPlainFile()
{
t.unsetDevice();
- delete m_file;
- m_file=0;
+ m_file.close();
m_fileName.resize(0);
}
+QCString OutputGenerator::dir() const
+{
+ return m_dir;
+}
+
+QCString OutputGenerator::fileName() const
+{
+ return m_fileName;
+}
+
void OutputGenerator::pushGeneratorState()
{
- m_genStack->push(new bool(isEnabled()));
+ m_genStack.push(isEnabled());
//printf("%p:pushGeneratorState(%d) enabled=%d\n",this,genStack->count(),isEnabled());
}
void OutputGenerator::popGeneratorState()
{
//printf("%p:popGeneratorState(%d) enabled=%d\n",this,genStack->count(),isEnabled());
- bool *lb = m_genStack->pop();
- ASSERT(lb!=0);
- if (lb==0) return; // for some robustness against superfluous \endhtmlonly commands.
- if (*lb) enable(); else disable();
- delete lb;
+ if (!m_genStack.empty())
+ {
+ bool lb = m_genStack.top();
+ m_genStack.pop();
+ if (lb) enable(); else disable();
+ }
+}
+
+void OutputGenerator::enable()
+{
+ if (!m_genStack.empty())
+ {
+ m_active=m_genStack.top();
+ }
+ else
+ {
+ m_active=true;
+ }
+}
+
+void OutputGenerator::disable()
+{
+ m_active=false;
+}
+
+void OutputGenerator::enableIf(OutputGenerator::OutputType o)
+{
+ if (o==type()) enable();
+}
+
+void OutputGenerator::disableIf(OutputGenerator::OutputType o)
+{
+ if (o==type()) disable();
+}
+
+void OutputGenerator::disableIfNot(OutputGenerator::OutputType o)
+{
+ if (o!=type()) disable();
+}
+
+bool OutputGenerator::isEnabled(OutputGenerator::OutputType o)
+{
+ return (o==type() && m_active);
+}
+
+OutputGenerator *OutputGenerator::get(OutputGenerator::OutputType o)
+{
+ return (o==type()) ? this : 0;
}
diff --git a/src/outputgen.h b/src/outputgen.h
index 576e950..0d64833 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,7 +18,10 @@
#ifndef OUTPUTGEN_H
#define OUTPUTGEN_H
-#include <qstack.h>
+#include <memory>
+#include <stack>
+
+#include <qfile.h>
#include "index.h"
#include "section.h"
@@ -33,9 +36,7 @@ class DotGfxHierarchyTable;
class DotGroupCollaboration;
class DocNode;
class MemberDef;
-class GroupDef;
class Definition;
-class QFile;
struct DocLinkInfo
{
@@ -54,15 +55,18 @@ struct SourceLinkInfo
QCString anchor;
};
-/** Output interface for code parser.
+/** Output interface for code parser.
*/
class CodeOutputInterface
{
public:
virtual ~CodeOutputInterface() {}
- /*! Writes an code fragment to the output. This function should keep
- * spaces visible, should break lines at a newline and should convert
+ /** Identifier for the output file */
+ virtual int id() const { return 0; }
+
+ /*! Writes an code fragment to the output. This function should keep
+ * spaces visible, should break lines at a newline and should convert
* tabs to the right number of spaces.
*/
virtual void codify(const char *s) = 0;
@@ -71,8 +75,8 @@ class CodeOutputInterface
* \param ref If this is non-zero, the object is to be found in
* an external documentation file.
* \param file The file in which the object is located.
- * \param anchor The anchor uniquely identifying the object within
- * the file.
+ * \param anchor The anchor uniquely identifying the object within
+ * the file.
* \param name The text to display as a placeholder for the link.
* \param tooltip The tooltip to display when the mouse is on the link.
*/
@@ -89,7 +93,7 @@ class CodeOutputInterface
virtual void writeLineNumber(const char *ref,const char *file,
const char *anchor,int lineNumber) = 0;
- /*! Writes a tool tip definition
+ /*! Writes a tool tip definition
* \param id unique identifier for the tooltip
* \param docInfo Info about the symbol's documentation.
* \param decl full declaration of the symbol (for functions)
@@ -97,14 +101,14 @@ class CodeOutputInterface
* \param defInfo Info about the symbol's definition in the source code
* \param declInfo Info about the symbol's declaration in the source code
*/
- virtual void writeTooltip(const char *id,
+ virtual void writeTooltip(const char *id,
const DocLinkInfo &docInfo,
const char *decl,
const char *desc,
const SourceLinkInfo &defInfo,
const SourceLinkInfo &declInfo
) = 0;
-
+
virtual void startCodeLine(bool hasLineNumbers) = 0;
/*! Ends a line of code started with startCodeLine() */
@@ -126,6 +130,16 @@ class CodeOutputInterface
virtual void setCurrentDoc(const Definition *context,const char *anchor,bool isSourceFile) = 0;
virtual void addWord(const char *word,bool hiPriority) = 0;
+
+ /*! Starts a source code fragment. The fragment will be
+ * fed to the code parser (see code.h) for syntax highlighting
+ * and cross-referencing. The fragment ends by a call to
+ * endCodeFragment()
+ * @param style The kind of code fragment.
+ */
+ virtual void startCodeFragment(const char *style) = 0;
+ /*! Ends a block of code */
+ virtual void endCodeFragment(const char *style) = 0;
};
/** Base Interface used for generating output outside of the
@@ -141,29 +155,29 @@ class BaseOutputDocInterface : public CodeOutputInterface
public:
virtual ~BaseOutputDocInterface() {}
enum ParamListTypes { Param, RetVal, Exception };
- enum SectionTypes { /*See, Return, Author, Version,
+ enum SectionTypes { /*See, Return, Author, Version,
Since, Date, Bug, Note,
- Warning, Par, Deprecated, Pre,
- Post, Invar, Remark, Attention,
+ Warning, Par, Deprecated, Pre,
+ Post, Invar, Remark, Attention,
Todo, Test, RCS, */
- EnumValues,
- Examples
+ EnumValues,
+ Examples
};
- virtual void parseText(const QCString &s) {}
-
+ virtual void parseText(const QCString &) {}
+
/*! Start of a bullet list: e.g. \c \<ul\> in html. startItemListItem() is
* Used for the bullet items.
*/
virtual void startItemList() = 0;
- /*! Writes a list item for a bullet or enumerated
- * list: e.g. \c \<li\> in html
+ /*! Writes a list item for a bullet or enumerated
+ * list: e.g. \c \<li\> in html
*/
virtual void startItemListItem() = 0;
- /*! Writes a list item for a bullet or enumerated
- * list: e.g. \c \</li\> in html
+ /*! Writes a list item for a bullet or enumerated
+ * list: e.g. \c \</li\> in html
*/
virtual void endItemListItem() = 0;
@@ -171,7 +185,7 @@ class BaseOutputDocInterface : public CodeOutputInterface
virtual void endItemList() = 0;
/*! Writes an ASCII string to the output. Converts characters that have
- * A special meaning, like \c & in html.
+ * A special meaning, like \c & in html.
*/
virtual void docify(const char *s) = 0;
@@ -180,8 +194,8 @@ class BaseOutputDocInterface : public CodeOutputInterface
*/
virtual void writeChar(char c) = 0;
- /*! Writes an ASCII string to the output, \e without converting
- * special characters.
+ /*! Writes an ASCII string to the output, \e without converting
+ * special characters.
*/
virtual void writeString(const char *text) = 0;
@@ -197,8 +211,8 @@ class BaseOutputDocInterface : public CodeOutputInterface
* \param ref If this is non-zero, the object is to be found in
* an external documentation file.
* \param file The file in which the object is located.
- * \param anchor The anchor uniquely identifying the object within
- * the file.
+ * \param anchor The anchor uniquely identifying the object within
+ * the file.
* \param name The text to display as a placeholder for the link.
*/
virtual void writeObjectLink(const char *ref,const char *file,
@@ -214,7 +228,7 @@ class BaseOutputDocInterface : public CodeOutputInterface
*/
virtual void endHtmlLink() = 0;
-
+
/*! Changes the text font to bold face. The bold section ends with
* endBold()
*/
@@ -239,24 +253,10 @@ class BaseOutputDocInterface : public CodeOutputInterface
/*! Ends a section of text displayed in italic. */
virtual void endEmphasis() = 0;
- /*! Starts a source code fragment. The fragment will be
- * fed to the code parser (see code.h) for syntax highlighting
- * and cross-referencing. The fragment ends by a call to
- * endCodeFragment()
- */
- virtual void startCodeFragment() = 0;
-
- /*! Ends a source code fragment
- */
- virtual void endCodeFragment() = 0;
-
-
-
-
/*! Writes a horizontal ruler to the output */
virtual void writeRuler() = 0;
-
- /*! Starts a description list: e.g. \c \<dl\> in HTML
+
+ /*! Starts a description list: e.g. \c \<dl\> in HTML
* Items are surrounded by startDescItem() and endDescItem()
*/
virtual void startDescription() = 0;
@@ -270,8 +270,8 @@ class BaseOutputDocInterface : public CodeOutputInterface
virtual void startDescForItem() = 0;
virtual void endDescForItem() = 0;
- /*! Ends an item of a description list and starts the
- * description itself: e.g. \c \</dt\> in HTML.
+ /*! Ends an item of a description list and starts the
+ * description itself: e.g. \c \</dt\> in HTML.
*/
virtual void endDescItem() = 0;
@@ -290,8 +290,8 @@ class BaseOutputDocInterface : public CodeOutputInterface
virtual void endTitle() = 0;
virtual void writeAnchor(const char *fileName,const char *name) = 0;
- virtual void startSection(const char *,const char *,SectionInfo::SectionType) = 0;
- virtual void endSection(const char *,SectionInfo::SectionType) = 0;
+ virtual void startSection(const char *,const char *,SectionType) = 0;
+ virtual void endSection(const char *,SectionType) = 0;
virtual void lineBreak(const char *style) = 0;
virtual void addIndexItem(const char *s1,const char *s2) = 0;
@@ -324,19 +324,27 @@ class OutputGenerator : public BaseOutputDocInterface
public:
enum OutputType { Html, Latex, Man, RTF, XML, DEF, Perl , Docbook};
- OutputGenerator();
+ OutputGenerator(const char *dir);
+ OutputGenerator(const OutputGenerator &o);
+ OutputGenerator &operator=(const OutputGenerator &o);
virtual ~OutputGenerator();
+ virtual OutputType type() const = 0;
+ virtual std::unique_ptr<OutputGenerator> clone() const = 0;
+
///////////////////////////////////////////////////////////////
// generic generator methods
///////////////////////////////////////////////////////////////
- virtual void enable() = 0;
- virtual void disable() = 0;
- virtual void enableIf(OutputType o) = 0;
- virtual void disableIf(OutputType o) = 0;
- virtual void disableIfNot(OutputType o) = 0;
- virtual bool isEnabled(OutputType o) = 0;
- virtual OutputGenerator *get(OutputType o) = 0;
+ void enable();
+ void disable();
+ void enableIf(OutputType o);
+ void disableIf(OutputType o);
+ void disableIfNot(OutputType o);
+ bool isEnabled(OutputType o);
+ OutputGenerator *get(OutputType o);
+ QCString dir() const;
+ QCString fileName() const;
+
void startPlainFile(const char *name);
void endPlainFile();
//QCString getContents() const;
@@ -346,13 +354,13 @@ class OutputGenerator : public BaseOutputDocInterface
//void setEncoding(const QCString &enc) { encoding = enc; }
//virtual void postProcess(QByteArray &) { }
- virtual void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md) = 0;
+ virtual void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md,int id) = 0;
///////////////////////////////////////////////////////////////
// structural output interface
///////////////////////////////////////////////////////////////
virtual void startFile(const char *name,const char *manName,
- const char *title) = 0;
+ const char *title,int id=0) = 0;
virtual void writeSearchInfo() = 0;
virtual void writeFooter(const char *navPath) = 0;
virtual void endFile() = 0;
@@ -447,8 +455,8 @@ class OutputGenerator : public BaseOutputDocInterface
virtual void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first) = 0;
virtual void startContents() = 0;
virtual void endContents() = 0;
- virtual void startPageDoc(const char *pageTitle) {};
- virtual void endPageDoc() {};
+ virtual void startPageDoc(const char *) {}
+ virtual void endPageDoc() {}
virtual void startTextBlock(bool) = 0;
virtual void endTextBlock(bool) = 0;
virtual void lastIndexPage() = 0;
@@ -489,21 +497,18 @@ class OutputGenerator : public BaseOutputDocInterface
protected:
FTextStream t;
- QFile *m_file;
- QCString m_fileName;
- QCString m_dir;
- bool m_active;
- QStack<bool> *m_genStack;
-
private:
- OutputGenerator(const OutputGenerator &o);
- OutputGenerator &operator=(const OutputGenerator &o);
+ QCString m_dir;
+ QCString m_fileName;
+ QFile m_file;
+ bool m_active = true;
+ std::stack<bool> m_genStack;
};
/** Interface used for generating documentation.
*
* This abstract class is used by several functions
- * to generate the output for a specific format.
+ * to generate the output for a specific format.
* This interface contains some state saving and changing
* functions for dealing with format specific output.
*/
@@ -512,18 +517,13 @@ class OutputDocInterface : public BaseOutputDocInterface
public:
virtual ~OutputDocInterface() {}
- /*! Create a new output generator. This can later by appended
- * to the current one using append().
- */
- //virtual OutputDocInterface *clone() = 0;
-
- /*! Disables all output formats except format \a o
- * (useful for OutputList only)
+ /*! Disables all output formats except format \a o
+ * (useful for OutputList only)
*/
virtual void disableAllBut(OutputGenerator::OutputType o) = 0;
/*! Enables all output formats as far as they have been enabled in
- * the config file. (useful for OutputList only)
+ * the config file. (useful for OutputList only)
*/
virtual void enableAll() = 0;
@@ -536,27 +536,26 @@ class OutputDocInterface : public BaseOutputDocInterface
/*! Enables a specific output format (useful for OutputList only) */
virtual void enable(OutputGenerator::OutputType o) = 0;
- /*! Check whether a specific output format is currently enabled
- * (useful for OutputList only)
+ /*! Check whether a specific output format is currently enabled
+ * (useful for OutputList only)
*/
virtual bool isEnabled(OutputGenerator::OutputType o) = 0;
/*! Appends the output generated by generator \a g to this
* generator.
- */
+ */
//virtual void append(const OutputDocInterface *g) = 0;
- /*! Pushes the state of the current generator (or list of
+ /*! Pushes the state of the current generator (or list of
* generators) on a stack.
*/
virtual void pushGeneratorState() = 0;
- /*! Pops the state of the current generator (or list of
+ /*! Pops the state of the current generator (or list of
* generators) on a stack. Should be preceded by a call
* the pushGeneratorState().
*/
virtual void popGeneratorState() = 0;
};
-
#endif
diff --git a/src/outputlist.cpp b/src/outputlist.cpp
index c47c1c9..f968c8b 100644
--- a/src/outputlist.cpp
+++ b/src/outputlist.cpp
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -29,11 +29,36 @@
#include "definition.h"
#include "docparser.h"
#include "vhdldocgen.h"
+#include "doxygen.h"
+
+static AtomicInt g_outId;
-OutputList::OutputList(bool)
+OutputList::OutputList()
{
+ newId();
//printf("OutputList::OutputList()\n");
- m_outputs.setAutoDelete(TRUE);
+}
+
+OutputList::OutputList(const OutputList &ol)
+{
+ m_id = ol.m_id;
+ for (const auto &og : ol.m_outputs)
+ {
+ m_outputs.emplace_back(og->clone());
+ }
+}
+
+OutputList &OutputList::operator=(const OutputList &ol)
+{
+ if (this!=&ol)
+ {
+ m_id = ol.m_id;
+ for (const auto &og : ol.m_outputs)
+ {
+ m_outputs.emplace_back(og->clone());
+ }
+ }
+ return *this;
}
OutputList::~OutputList()
@@ -41,16 +66,14 @@ OutputList::~OutputList()
//printf("OutputList::~OutputList()\n");
}
-void OutputList::add(const OutputGenerator *og)
+void OutputList::newId()
{
- if (og) m_outputs.append(og);
+ m_id = ++g_outId;
}
void OutputList::disableAllBut(OutputGenerator::OutputType o)
{
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
og->disableIfNot(o);
}
@@ -58,9 +81,7 @@ void OutputList::disableAllBut(OutputGenerator::OutputType o)
void OutputList::enableAll()
{
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
og->enable();
}
@@ -68,9 +89,7 @@ void OutputList::enableAll()
void OutputList::disableAll()
{
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
og->disable();
}
@@ -78,9 +97,7 @@ void OutputList::disableAll()
void OutputList::disable(OutputGenerator::OutputType o)
{
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
og->disableIf(o);
}
@@ -88,9 +105,7 @@ void OutputList::disable(OutputGenerator::OutputType o)
void OutputList::enable(OutputGenerator::OutputType o)
{
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
og->enableIf(o);
}
@@ -99,9 +114,7 @@ void OutputList::enable(OutputGenerator::OutputType o)
bool OutputList::isEnabled(OutputGenerator::OutputType o)
{
bool result=FALSE;
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
result=result || og->isEnabled(o);
}
@@ -110,9 +123,7 @@ bool OutputList::isEnabled(OutputGenerator::OutputType o)
void OutputList::pushGeneratorState()
{
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
og->pushGeneratorState();
}
@@ -120,9 +131,7 @@ void OutputList::pushGeneratorState()
void OutputList::popGeneratorState()
{
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
og->popGeneratorState();
}
@@ -132,14 +141,13 @@ void OutputList::generateDoc(const char *fileName,int startLine,
const Definition *ctx,const MemberDef * md,
const QCString &docStr,bool indexWords,
bool isExample,const char *exampleName,
- bool singleLine,bool linkFromIndex)
+ bool singleLine,bool linkFromIndex,
+ bool markdownSupport)
{
int count=0;
if (docStr.isEmpty()) return;
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
if (og->isEnabled()) count++;
}
@@ -151,20 +159,18 @@ void OutputList::generateDoc(const char *fileName,int startLine,
DocRoot *root=0;
root = validatingParseDoc(fileName,startLine,
ctx,md,docStr,indexWords,isExample,exampleName,
- singleLine,linkFromIndex);
- if (count>0) writeDoc(root,ctx,md);
+ singleLine,linkFromIndex,markdownSupport);
+ if (count>0) writeDoc(root,ctx,md,m_id);
delete root;
}
-void OutputList::writeDoc(DocRoot *root,const Definition *ctx,const MemberDef *md)
+void OutputList::writeDoc(DocRoot *root,const Definition *ctx,const MemberDef *md,int)
{
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
//printf("og->printDoc(extension=%s)\n",
// ctx?ctx->getDefFileExtension().data():"<null>");
- if (og->isEnabled()) og->writeDoc(root,ctx,md);
+ if (og->isEnabled()) og->writeDoc(root,ctx,md,m_id);
}
VhdlDocGen::setFlowMember(0);
}
@@ -172,9 +178,7 @@ void OutputList::writeDoc(DocRoot *root,const Definition *ctx,const MemberDef *m
void OutputList::parseText(const QCString &textStr)
{
int count=0;
- QListIterator<OutputGenerator> it(m_outputs);
- OutputGenerator *og;
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
if (og->isEnabled()) count++;
}
@@ -187,9 +191,9 @@ void OutputList::parseText(const QCString &textStr)
if (count>0)
{
- for (it.toFirst();(og=it.current());++it)
+ for (const auto &og : m_outputs)
{
- if (og->isEnabled()) og->writeDoc(root,0,0);
+ if (og->isEnabled()) og->writeDoc(root,0,0,m_id);
}
}
diff --git a/src/outputlist.h b/src/outputlist.h
index cfd3773..7baef7a 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,48 +17,40 @@
#define OUTPUTLIST_H
#include <utility>
-#include <qlist.h>
+#include <vector>
+#include <memory>
+
#include "index.h" // for IndexSections
#include "outputgen.h"
-#define FORALLPROTO1(arg1) \
- void forall(void (OutputGenerator::*func)(arg1),arg1)
-#define FORALLPROTO2(arg1,arg2) \
- void forall(void (OutputGenerator::*func)(arg1,arg2),arg1,arg2)
-#define FORALLPROTO3(arg1,arg2,arg3) \
- void forall(void (OutputGenerator::*func)(arg1,arg2,arg3),arg1,arg2,arg3)
-#define FORALLPROTO4(arg1,arg2,arg3,arg4) \
- void forall(void (OutputGenerator::*func)(arg1,arg2,arg3,arg4),arg1,arg2,arg3,arg4)
-#define FORALLPROTO5(arg1,arg2,arg3,arg4,arg5) \
- void forall(void (OutputGenerator::*func)(arg1,arg2,arg3,arg4,arg5),arg1,arg2,arg3,arg4,arg5)
-#define FORALLPROTO6(arg1,arg2,arg3,arg4,arg5,arg6) \
- void forall(void (OutputGenerator::*func)(arg1,arg2,arg3,arg4,arg5,arg6),arg1,arg2,arg3,arg4,arg5,arg6)
-#define FORALLPROTO7(arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
- void forall(void (OutputGenerator::*func)(arg1,arg2,arg3,arg4,arg5,arg6,arg7),arg1,arg2,arg3,arg4,arg5,arg6,arg7)
-#define FORALLPROTO8(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) \
- void forall(void (OutputGenerator::*func)(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8),arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)
-
class ClassDiagram;
class DotClassGraph;
class DotDirDeps;
class DotInclDepGraph;
class DotGfxHierarchyTable;
-class SectionDict;
class DotGroupCollaboration;
class DocRoot;
/** Class representing a list of output generators that are written to
- * in parallel.
+ * in parallel.
*/
class OutputList : public OutputDocInterface
{
public:
- OutputList(bool);
+ OutputList();
+ OutputList(const OutputList &ol);
+ OutputList &operator=(const OutputList &ol);
virtual ~OutputList();
- void add(const OutputGenerator *);
- uint count() const { return m_outputs.count(); }
-
+ template<class Generator>
+ void add()
+ {
+ m_outputs.emplace_back(std::make_unique<Generator>());
+ }
+
+ size_t size() const { return m_outputs.size(); }
+ int id() const { return m_id; }
+
void disableAllBut(OutputGenerator::OutputType o);
void enableAll();
void disableAll();
@@ -77,9 +67,10 @@ class OutputList : public OutputDocInterface
void generateDoc(const char *fileName,int startLine,
const Definition *ctx,const MemberDef *md,const QCString &docStr,
- bool indexWords,bool isExample,const char *exampleName=0,
- bool singleLine=FALSE,bool linkFromIndex=FALSE);
- void writeDoc(DocRoot *root,const Definition *ctx,const MemberDef *md);
+ bool indexWords,bool isExample,const char *exampleName /*=0*/,
+ bool singleLine /*=FALSE*/,bool linkFromIndex /*=FALSE*/,
+ bool markdownSupport /*=FALSE*/);
+ void writeDoc(DocRoot *root,const Definition *ctx,const MemberDef *md,int id=0);
void parseText(const QCString &textStr);
void startIndexSection(IndexSections is)
@@ -92,37 +83,40 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startProjectNumber); }
void endProjectNumber()
{ forall(&OutputGenerator::endProjectNumber); }
- void writeStyleInfo(int part)
+ void writeStyleInfo(int part)
{ forall(&OutputGenerator::writeStyleInfo,part); }
void startFile(const char *name,const char *manName,const char *title)
- { forall(&OutputGenerator::startFile,name,manName,title); }
+ {
+ newId();
+ forall(&OutputGenerator::startFile,name,manName,title,m_id);
+ }
void writeSearchInfo()
{ forall(&OutputGenerator::writeSearchInfo); }
void writeFooter(const char *navPath)
{ forall(&OutputGenerator::writeFooter,navPath); }
- void endFile()
+ void endFile()
{ forall(&OutputGenerator::endFile); }
- void startTitleHead(const char *fileName)
+ void startTitleHead(const char *fileName)
{ forall(&OutputGenerator::startTitleHead,fileName); }
void endTitleHead(const char *fileName,const char *name)
{ forall(&OutputGenerator::endTitleHead,fileName,name); }
- void startTitle()
+ void startTitle()
{ forall(&OutputGenerator::startTitle); }
- void endTitle()
+ void endTitle()
{ forall(&OutputGenerator::endTitle); }
void startParagraph(const char *classDef=0)
{ forall(&OutputGenerator::startParagraph,classDef); }
- void endParagraph()
+ void endParagraph()
{ forall(&OutputGenerator::endParagraph); }
- void writeString(const char *text)
+ void writeString(const char *text)
{ forall(&OutputGenerator::writeString,text); }
- void startIndexListItem()
+ void startIndexListItem()
{ forall(&OutputGenerator::startIndexListItem); }
- void endIndexListItem()
+ void endIndexListItem()
{ forall(&OutputGenerator::endIndexListItem); }
- void startIndexList()
+ void startIndexList()
{ forall(&OutputGenerator::startIndexList); }
- void endIndexList()
+ void endIndexList()
{ forall(&OutputGenerator::endIndexList); }
void startIndexKey()
{ forall(&OutputGenerator::startIndexKey); }
@@ -132,9 +126,9 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startIndexValue,b); }
void endIndexValue(const char *name,bool b)
{ forall(&OutputGenerator::endIndexValue,name,b); }
- void startItemList()
+ void startItemList()
{ forall(&OutputGenerator::startItemList); }
- void endItemList()
+ void endItemList()
{ forall(&OutputGenerator::endItemList); }
void startIndexItem(const char *ref,const char *file)
{ forall(&OutputGenerator::startIndexItem,ref,file); }
@@ -162,22 +156,22 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startHtmlLink,url); }
void endHtmlLink()
{ forall(&OutputGenerator::endHtmlLink); }
- void writeStartAnnoItem(const char *type,const char *file,
+ void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name)
{ forall(&OutputGenerator::writeStartAnnoItem,type,file,path,name); }
void writeEndAnnoItem(const char *name)
{ forall(&OutputGenerator::writeEndAnnoItem,name); }
- void startTypewriter()
+ void startTypewriter()
{ forall(&OutputGenerator::startTypewriter); }
- void endTypewriter()
+ void endTypewriter()
{ forall(&OutputGenerator::endTypewriter); }
void startGroupHeader(int extraLevels=0)
{ forall(&OutputGenerator::startGroupHeader,extraLevels); }
void endGroupHeader(int extraLevels=0)
{ forall(&OutputGenerator::endGroupHeader,extraLevels); }
- void startItemListItem()
+ void startItemListItem()
{ forall(&OutputGenerator::startItemListItem); }
- void endItemListItem()
+ void endItemListItem()
{ forall(&OutputGenerator::endItemListItem); }
void startMemberSections()
{ forall(&OutputGenerator::startMemberSections); }
@@ -195,31 +189,31 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startMemberSubtitle); }
void endMemberSubtitle()
{ forall(&OutputGenerator::endMemberSubtitle); }
- void startMemberDocList()
+ void startMemberDocList()
{ forall(&OutputGenerator::startMemberDocList); }
- void endMemberDocList()
+ void endMemberDocList()
{ forall(&OutputGenerator::endMemberDocList); }
- void startMemberList()
+ void startMemberList()
{ forall(&OutputGenerator::startMemberList); }
- void endMemberList()
+ void endMemberList()
{ forall(&OutputGenerator::endMemberList); }
void startInlineHeader()
{ forall(&OutputGenerator::startInlineHeader); }
void endInlineHeader()
{ forall(&OutputGenerator::endInlineHeader); }
- void startAnonTypeScope(int i1)
+ void startAnonTypeScope(int i1)
{ forall(&OutputGenerator::startAnonTypeScope,i1); }
- void endAnonTypeScope(int i1)
+ void endAnonTypeScope(int i1)
{ forall(&OutputGenerator::endAnonTypeScope,i1); }
- void startMemberItem(const char *anchor,int i1,const char *id=0)
+ void startMemberItem(const char *anchor,int i1,const char *id=0)
{ forall(&OutputGenerator::startMemberItem,anchor,i1,id); }
- void endMemberItem()
+ void endMemberItem()
{ forall(&OutputGenerator::endMemberItem); }
- void startMemberTemplateParams()
+ void startMemberTemplateParams()
{ forall(&OutputGenerator::startMemberTemplateParams); }
- void endMemberTemplateParams(const char *anchor,const char *inheritId)
+ void endMemberTemplateParams(const char *anchor,const char *inheritId)
{ forall(&OutputGenerator::endMemberTemplateParams,anchor,inheritId); }
- void startMemberGroupHeader(bool b)
+ void startMemberGroupHeader(bool b)
{ forall(&OutputGenerator::startMemberGroupHeader,b); }
void endMemberGroupHeader()
{ forall(&OutputGenerator::endMemberGroupHeader); }
@@ -231,28 +225,28 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startMemberGroup); }
void endMemberGroup(bool last)
{ forall(&OutputGenerator::endMemberGroup,last); }
- void insertMemberAlign(bool templ=FALSE)
+ void insertMemberAlign(bool templ=FALSE)
{ forall(&OutputGenerator::insertMemberAlign,templ); }
- void insertMemberAlignLeft(int typ=0, bool templ=FALSE)
+ void insertMemberAlignLeft(int typ=0, bool templ=FALSE)
{ forall(&OutputGenerator::insertMemberAlignLeft,typ,templ); }
- void writeRuler()
+ void writeRuler()
{ forall(&OutputGenerator::writeRuler); }
void writeAnchor(const char *fileName,const char *name)
{ forall(&OutputGenerator::writeAnchor,fileName,name); }
- void startCodeFragment()
- { forall(&OutputGenerator::startCodeFragment); }
- void endCodeFragment()
- { forall(&OutputGenerator::endCodeFragment); }
- void startCodeLine(bool hasLineNumbers)
+ void startCodeFragment(const char *style)
+ { forall(&OutputGenerator::startCodeFragment,style); }
+ void endCodeFragment(const char *style)
+ { forall(&OutputGenerator::endCodeFragment,style); }
+ void startCodeLine(bool hasLineNumbers)
{ forall(&OutputGenerator::startCodeLine,hasLineNumbers); }
- void endCodeLine()
+ void endCodeLine()
{ forall(&OutputGenerator::endCodeLine); }
void writeLineNumber(const char *ref,const char *file,const char *anchor,
- int lineNumber)
+ int lineNumber)
{ forall(&OutputGenerator::writeLineNumber,ref,file,anchor,lineNumber); }
- void startEmphasis()
+ void startEmphasis()
{ forall(&OutputGenerator::startEmphasis); }
- void endEmphasis()
+ void endEmphasis()
{ forall(&OutputGenerator::endEmphasis); }
void writeChar(char c)
{ forall(&OutputGenerator::writeChar,c); }
@@ -260,7 +254,7 @@ class OutputList : public OutputDocInterface
const char *anchor,const char *title,
int memCount,int memTotal,bool showInline)
{ forall(&OutputGenerator::startMemberDoc,clName,memName,anchor,title,memCount,memTotal,showInline); }
- void endMemberDoc(bool hasArgs)
+ void endMemberDoc(bool hasArgs)
{ forall(&OutputGenerator::endMemberDoc,hasArgs); }
void startDoxyAnchor(const char *fName,const char *manName,
const char *anchor, const char *name,
@@ -268,45 +262,45 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startDoxyAnchor,fName,manName,anchor,name,args); }
void endDoxyAnchor(const char *fn,const char *anchor)
{ forall(&OutputGenerator::endDoxyAnchor,fn,anchor); }
- void writeLatexSpacing()
+ void writeLatexSpacing()
{ forall(&OutputGenerator::writeLatexSpacing); }
- void startDescription()
+ void startDescription()
{ forall(&OutputGenerator::startDescription); }
- void endDescription()
+ void endDescription()
{ forall(&OutputGenerator::endDescription); }
- void startDescItem()
+ void startDescItem()
{ forall(&OutputGenerator::startDescItem); }
- void endDescItem()
+ void endDescItem()
{ forall(&OutputGenerator::endDescItem); }
- void startDescForItem()
+ void startDescForItem()
{ forall(&OutputGenerator::startDescForItem); }
- void endDescForItem()
+ void endDescForItem()
{ forall(&OutputGenerator::endDescForItem); }
- void startSubsection()
+ void startSubsection()
{ forall(&OutputGenerator::startSubsection); }
- void endSubsection()
+ void endSubsection()
{ forall(&OutputGenerator::endSubsection); }
- void startSubsubsection()
+ void startSubsubsection()
{ forall(&OutputGenerator::startSubsubsection); }
- void endSubsubsection()
+ void endSubsubsection()
{ forall(&OutputGenerator::endSubsubsection); }
- void startCenter()
+ void startCenter()
{ forall(&OutputGenerator::startCenter); }
- void endCenter()
+ void endCenter()
{ forall(&OutputGenerator::endCenter); }
- void startSmall()
+ void startSmall()
{ forall(&OutputGenerator::startSmall); }
- void endSmall()
+ void endSmall()
{ forall(&OutputGenerator::endSmall); }
- void lineBreak(const char *style=0)
+ void lineBreak(const char *style=0)
{ forall(&OutputGenerator::lineBreak,style); }
- void startBold()
+ void startBold()
{ forall(&OutputGenerator::startBold); }
- void endBold()
+ void endBold()
{ forall(&OutputGenerator::endBold); }
- void startMemberDescription(const char *anchor,const char *inheritId=0, bool typ = false)
+ void startMemberDescription(const char *anchor,const char *inheritId=0, bool typ = false)
{ forall(&OutputGenerator::startMemberDescription,anchor,inheritId, typ); }
- void endMemberDescription()
+ void endMemberDescription()
{ forall(&OutputGenerator::endMemberDescription); }
void startMemberDeclaration()
{ forall(&OutputGenerator::startMemberDeclaration); }
@@ -321,21 +315,21 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startExamples); }
void endExamples()
{ forall(&OutputGenerator::endExamples); }
- void startParamList(ParamListTypes t,const char *title)
+ void startParamList(ParamListTypes t,const char *title)
{ forall(&OutputGenerator::startParamList,t,title); }
- void endParamList()
+ void endParamList()
{ forall(&OutputGenerator::endParamList); }
- void startIndent()
+ void startIndent()
{ forall(&OutputGenerator::startIndent); }
- void endIndent()
+ void endIndent()
{ forall(&OutputGenerator::endIndent); }
- void startSection(const char *lab,const char *title,SectionInfo::SectionType t)
+ void startSection(const char *lab,const char *title,SectionType t)
{ forall(&OutputGenerator::startSection,lab,title,t); }
- void endSection(const char *lab,SectionInfo::SectionType t)
+ void endSection(const char *lab,SectionType t)
{ forall(&OutputGenerator::endSection,lab,t); }
void addIndexItem(const char *s1,const char *s2)
{ forall(&OutputGenerator::addIndexItem,s1,s2); }
- void writeSynopsis()
+ void writeSynopsis()
{ forall(&OutputGenerator::writeSynopsis); }
void startClassDiagram()
{ forall(&OutputGenerator::startClassDiagram); }
@@ -436,11 +430,11 @@ class OutputList : public OutputDocInterface
void exceptionEntry(const char* prefix,bool closeBracket)
{ forall(&OutputGenerator::exceptionEntry,prefix,closeBracket); }
- void startConstraintList(const char *header)
+ void startConstraintList(const char *header)
{ forall(&OutputGenerator::startConstraintList,header); }
- void startConstraintParam()
+ void startConstraintParam()
{ forall(&OutputGenerator::startConstraintParam); }
- void endConstraintParam()
+ void endConstraintParam()
{ forall(&OutputGenerator::endConstraintParam); }
void startConstraintType()
{ forall(&OutputGenerator::startConstraintType); }
@@ -470,7 +464,7 @@ class OutputList : public OutputDocInterface
void endInlineMemberDoc()
{ forall(&OutputGenerator::endInlineMemberDoc); }
- void startLabels()
+ void startLabels()
{ forall(&OutputGenerator::startLabels); }
void writeLabel(const char *l,bool isLast)
{ forall(&OutputGenerator::writeLabel,l,isLast); }
@@ -496,6 +490,7 @@ class OutputList : public OutputDocInterface
private:
void debug();
void clear();
+ void newId();
// For each output format that is enabled (OutputGenerator::isEnabled()) we forward
// the method call.
@@ -504,16 +499,15 @@ class OutputList : public OutputDocInterface
template<typename T,class... Ts,class... As>
void forall(void (T::*methodPtr)(Ts...),As&&... args)
{
- QListIterator<OutputGenerator> li(m_outputs);
- OutputGenerator *og;
- for (li.toFirst();(og=li.current());++li)
+ for (const auto &og : m_outputs)
{
- if (og->isEnabled()) (og->*methodPtr)(std::forward<As>(args)...);
+ if (og->isEnabled()) (og.get()->*methodPtr)(std::forward<As>(args)...);
}
}
- OutputList(const OutputList &ol);
- QList<OutputGenerator> m_outputs;
+ std::vector< std::unique_ptr<OutputGenerator> > m_outputs;
+ int m_id;
+
};
#endif
diff --git a/src/pagedef.cpp b/src/pagedef.cpp
index 8b6228f..d3cf823 100644
--- a/src/pagedef.cpp
+++ b/src/pagedef.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -29,7 +29,7 @@
//------------------------------------------------------------------------------------------
-class PageDefImpl : public DefinitionImpl, public PageDef
+class PageDefImpl : public DefinitionMixin<PageDef>
{
public:
PageDefImpl(const char *f,int l,const char *n,const char *d,const char *t);
@@ -45,9 +45,9 @@ class PageDefImpl : public DefinitionImpl, public PageDef
virtual QCString anchor() const { return QCString(); }
virtual void findSectionsInDocumentation();
virtual QCString title() const { return m_title; }
- virtual GroupDef * getGroupDef() const;
- virtual PageSDict * getSubPages() const { return m_subPageDict; }
- virtual void addInnerCompound(Definition *d);
+ virtual const GroupDef * getGroupDef() const;
+ virtual const PageLinkedRefMap &getSubPages() const { return m_subPages; }
+ virtual void addInnerCompound(const Definition *d);
virtual bool visibleInIndex() const;
virtual bool documentedPage() const;
virtual bool hasSubPages() const;
@@ -56,17 +56,17 @@ class PageDefImpl : public DefinitionImpl, public PageDef
virtual LocalToc localToc() const { return m_localToc; }
virtual void setPageScope(Definition *d){ m_pageScope = d; }
virtual Definition *getPageScope() const { return m_pageScope; }
- virtual QCString displayName(bool=TRUE) const { return hasTitle() ? m_title : DefinitionImpl::name(); }
+ virtual QCString displayName(bool=TRUE) const { return hasTitle() ? m_title : DefinitionMixin::name(); }
virtual bool showLineNo() const;
virtual void writeDocumentation(OutputList &ol);
virtual void writeTagFile(FTextStream &);
virtual void setNestingLevel(int l);
- virtual void writePageDocumentation(OutputList &ol);
+ virtual void writePageDocumentation(OutputList &ol) const;
private:
QCString m_fileName;
QCString m_title;
- PageSDict *m_subPageDict; // list of pages in the group
+ PageLinkedRefMap m_subPages; // list of pages in the group
Definition *m_pageScope;
int m_nestingLevel;
LocalToc m_localToc;
@@ -82,10 +82,9 @@ PageDef *createPageDef(const char *f,int l,const char *n,const char *d,const cha
PageDefImpl::PageDefImpl(const char *f,int l,const char *n,
const char *d,const char *t)
- : DefinitionImpl(f,l,1,n), m_title(t)
+ : DefinitionMixin(f,l,1,n), m_title(t)
{
setDocumentation(d,f,l);
- m_subPageDict = new PageSDict(7);
m_pageScope = 0;
m_nestingLevel = 0;
m_fileName = ::convertNameToFile(n,FALSE,TRUE);
@@ -94,26 +93,25 @@ PageDefImpl::PageDefImpl(const char *f,int l,const char *n,
PageDefImpl::~PageDefImpl()
{
- delete m_subPageDict;
}
void PageDefImpl::findSectionsInDocumentation()
{
+ docFindSections(briefDescription(),this,docFile());
docFindSections(documentation(),this,docFile());
}
-GroupDef *PageDefImpl::getGroupDef() const
-{
- GroupList *groups = partOfGroups();
- return groups!=0 ? groups->getFirst() : 0;
+const GroupDef *PageDefImpl::getGroupDef() const
+{
+ return !partOfGroups().empty() ? partOfGroups().front() : 0;
}
-QCString PageDefImpl::getOutputFileBase() const
-{
- if (getGroupDef())
+QCString PageDefImpl::getOutputFileBase() const
+{
+ if (getGroupDef())
return getGroupDef()->getOutputFileBase();
- else
- return m_fileName;
+ else
+ return m_fileName;
}
void PageDefImpl::setFileName(const char *name)
@@ -121,36 +119,37 @@ void PageDefImpl::setFileName(const char *name)
m_fileName = name;
}
-void PageDefImpl::addInnerCompound(Definition *def)
+void PageDefImpl::addInnerCompound(const Definition *def)
{
if (def->definitionType()==Definition::TypePage)
{
- PageDef *pd = dynamic_cast<PageDef*>(def);
- m_subPageDict->append(pd->name(),pd);
- def->setOuterScope(this);
- if (this==Doxygen::mainPage)
- {
- pd->setNestingLevel(m_nestingLevel);
- }
- else
+ PageDef *pd = const_cast<PageDef*>(toPageDef(def));
+ if (pd)
{
- pd->setNestingLevel(m_nestingLevel+1);
+ m_subPages.add(pd->name(),pd);
+ pd->setOuterScope(this);
+ if (this==Doxygen::mainPage.get())
+ {
+ pd->setNestingLevel(m_nestingLevel);
+ }
+ else
+ {
+ pd->setNestingLevel(m_nestingLevel+1);
+ }
}
}
}
bool PageDefImpl::hasParentPage() const
{
- return getOuterScope() &&
+ return getOuterScope() &&
getOuterScope()->definitionType()==Definition::TypePage;
}
void PageDefImpl::writeTagFile(FTextStream &tagFile)
{
bool found = name()=="citelist";
- QDictIterator<RefList> rli(*Doxygen::xrefLists);
- RefList *rl;
- for (rli.toFirst();(rl=rli.current()) && !found;++rli)
+ for (RefListManager::Ptr &rl : RefListManager::instance())
{
if (rl->listName()==name())
{
@@ -163,7 +162,7 @@ void PageDefImpl::writeTagFile(FTextStream &tagFile)
tagFile << " <compound kind=\"page\">" << endl;
tagFile << " <name>" << name() << "</name>" << endl;
tagFile << " <title>" << convertToXML(title()) << "</title>" << endl;
- tagFile << " <filename>" << convertToXML(getOutputFileBase()) << "</filename>" << endl;
+ tagFile << " <filename>" << convertToXML(getOutputFileBase())<< Doxygen::htmlFileExtension << "</filename>" << endl;
writeDocAnchorsToTagFile(tagFile);
tagFile << " </compound>" << endl;
}
@@ -181,9 +180,9 @@ void PageDefImpl::writeDocumentation(OutputList &ol)
//printf("PageDefImpl::writeDocumentation: %s\n",getOutputFileBase().data());
ol.pushGeneratorState();
- //1.{
+ //1.{
- if (m_nestingLevel>0
+ if (m_nestingLevel>0
//&& // a sub page
//(Doxygen::mainPage==0 || getOuterScope()!=Doxygen::mainPage) // and not a subpage of the mainpage
)
@@ -196,24 +195,28 @@ void PageDefImpl::writeDocumentation(OutputList &ol)
}
ol.pushGeneratorState();
- //2.{
+ //2.{
ol.disableAllBut(OutputGenerator::Man);
startFile(ol,getOutputFileBase(),manPageName,title(),HLI_Pages,!generateTreeView);
ol.enableAll();
ol.disable(OutputGenerator::Man);
startFile(ol,getOutputFileBase(),pageName,title(),HLI_Pages,!generateTreeView);
ol.popGeneratorState();
- //2.}
+ //2.}
if (!generateTreeView)
{
if (getOuterScope()!=Doxygen::globalScope && !Config_getBool(DISABLE_INDEX))
{
- getOuterScope()->writeNavigationPath(ol);
+ DefinitionMutable *outerScope = toDefinitionMutable(getOuterScope());
+ if (outerScope)
+ {
+ outerScope->writeNavigationPath(ol);
+ }
}
ol.endQuickIndices();
}
- SectionInfo *si=Doxygen::sectionDict->find(name());
+ const SectionInfo *si=SectionManager::instance().find(name());
// save old generator state and write title only to Man generator
ol.pushGeneratorState();
@@ -228,10 +231,11 @@ void PageDefImpl::writeDocumentation(OutputList &ol)
ol.writeString(" - ");
ol.popGeneratorState();
- if (si->title != manPageName)
+ if (si->title() != manPageName)
{
- ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
- ol.endSection(si->label,si->type);
+ ol.generateDoc(docFile(),getStartBodyLine(),this,0,si->title(),TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
+ ol.endSection(si->label(),si->type());
}
}
ol.popGeneratorState();
@@ -246,10 +250,11 @@ void PageDefImpl::writeDocumentation(OutputList &ol)
ol.disable(OutputGenerator::Man);
if (hasTitle() && !name().isEmpty() && si!=0)
{
- ol.startPageDoc(si->title);
+ ol.startPageDoc(si->title());
//ol.startSection(si->label,si->title,si->type);
startTitle(ol,getOutputFileBase(),this);
- ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(docFile(),getStartBodyLine(),this,0,si->title(),TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
//stringToSearchIndex(getOutputFileBase(),
// theTranslator->trPage(TRUE,TRUE)+" "+si->title,
// si->title);
@@ -286,18 +291,11 @@ void PageDefImpl::writeDocumentation(OutputList &ol)
Doxygen::indexList->addIndexItem(this,0,0,filterTitle(title()));
}
-void PageDefImpl::writePageDocumentation(OutputList &ol)
+void PageDefImpl::writePageDocumentation(OutputList &ol) const
{
-
- bool markdownEnabled = Doxygen::markdownSupport;
- if (getLanguage()==SrcLangExt_Markdown)
- {
- Doxygen::markdownSupport = TRUE;
- }
-
ol.startTextBlock();
QCString docStr = documentation()+inbodyDocumentation();
- if (hasBriefDescription() && !Doxygen::sectionDict->find(name()))
+ if (hasBriefDescription() && !SectionManager::instance().find(name()))
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Man);
@@ -311,12 +309,14 @@ void PageDefImpl::writePageDocumentation(OutputList &ol)
0, // memberdef
docStr, // docStr
TRUE, // index words
- FALSE // not an example
+ FALSE, // not an example
+ 0, // exampleName
+ FALSE, // singleLine
+ FALSE, // linkFromIndex
+ TRUE // markdown support
);
ol.endTextBlock();
- Doxygen::markdownSupport = markdownEnabled;
-
if (hasSubPages())
{
// for printed documentation we write subpages as section's of the
@@ -327,18 +327,16 @@ void PageDefImpl::writePageDocumentation(OutputList &ol)
ol.enable(OutputGenerator::Docbook);
ol.enable(OutputGenerator::RTF);
- PageSDict::Iterator pdi(*m_subPageDict);
- PageDef *subPage=pdi.toFirst();
- for (pdi.toFirst();(subPage=pdi.current());++pdi)
+ for (const auto &subPage : m_subPages)
{
- SectionInfo::SectionType sectionType = SectionInfo::Paragraph;
+ SectionType sectionType = SectionType::Paragraph;
switch (m_nestingLevel)
{
- case 0: sectionType = SectionInfo::Page; break;
- case 1: sectionType = SectionInfo::Section; break;
- case 2: sectionType = SectionInfo::Subsection; break;
- case 3: sectionType = SectionInfo::Subsubsection; break;
- default: sectionType = SectionInfo::Paragraph; break;
+ case 0: sectionType = SectionType::Page; break;
+ case 1: sectionType = SectionType::Section; break;
+ case 2: sectionType = SectionType::Subsection; break;
+ case 3: sectionType = SectionType::Subsubsection; break;
+ default: sectionType = SectionType::Paragraph; break;
}
QCString title = subPage->title();
if (title.isEmpty()) title = subPage->name();
@@ -358,23 +356,23 @@ bool PageDefImpl::visibleInIndex() const
{
static bool externalPages = Config_getBool(EXTERNAL_PAGES);
return // not part of a group
- !getGroupDef() &&
+ !getGroupDef() &&
// not an externally defined page
- (!isReference() || externalPages)
+ (!isReference() || externalPages)
;
}
bool PageDefImpl::documentedPage() const
{
return // not part of a group
- !getGroupDef() &&
+ !getGroupDef() &&
// not an externally defined page
!isReference();
}
bool PageDefImpl::hasSubPages() const
{
- return m_subPageDict->count()>0;
+ return !m_subPages.empty();
}
void PageDefImpl::setNestingLevel(int l)
@@ -402,3 +400,31 @@ bool PageDefImpl::hasTitle() const
return !m_title.isEmpty() && m_title.lower()!="notitle";
}
+// --- Cast functions
+
+PageDef *toPageDef(Definition *d)
+{
+ if (d==0) return 0;
+ if (d && typeid(*d)==typeid(PageDefImpl))
+ {
+ return static_cast<PageDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+const PageDef *toPageDef(const Definition *d)
+{
+ if (d==0) return 0;
+ if (d && typeid(*d)==typeid(PageDefImpl))
+ {
+ return static_cast<const PageDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
diff --git a/src/pagedef.h b/src/pagedef.h
index f0b68d1..c0a7bf0 100644
--- a/src/pagedef.h
+++ b/src/pagedef.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -21,12 +19,12 @@
#include "definition.h"
#include "sortdict.h"
-class PageSDict;
+class PageLinkedRefMap;
class OutputList;
class FTextStream;
/** @brief A model of a page symbol. */
-class PageDef : virtual public Definition
+class PageDef : public DefinitionMutable, public Definition
{
public:
virtual ~PageDef() {}
@@ -44,39 +42,42 @@ class PageDef : virtual public Definition
virtual QCString anchor() const = 0;
virtual void findSectionsInDocumentation() = 0;
virtual QCString title() const = 0;
- virtual GroupDef * getGroupDef() const = 0;
- virtual PageSDict * getSubPages() const = 0;
- virtual void addInnerCompound(Definition *d) = 0;
+ virtual const GroupDef *getGroupDef() const = 0;
+ virtual const PageLinkedRefMap &getSubPages() const = 0;
+ virtual void addInnerCompound(const Definition *) = 0;
virtual bool visibleInIndex() const = 0;
virtual bool documentedPage() const = 0;
virtual bool hasSubPages() const = 0;
virtual bool hasParentPage() const = 0;
virtual bool hasTitle() const = 0;
virtual LocalToc localToc() const = 0;
- virtual void setPageScope(Definition *d) = 0;
+ virtual void setPageScope(Definition *) = 0;
virtual Definition *getPageScope() const = 0;
virtual QCString displayName(bool=TRUE) const = 0;
virtual bool showLineNo() const = 0;
- virtual void writeDocumentation(OutputList &ol) = 0;
+ virtual void writeDocumentation(OutputList &) = 0;
virtual void writeTagFile(FTextStream &) = 0;
- virtual void setNestingLevel(int l) = 0;
- virtual void writePageDocumentation(OutputList &ol) = 0;
+ virtual void setNestingLevel(int) = 0;
+ virtual void writePageDocumentation(OutputList &) const = 0;
};
PageDef *createPageDef(const char *f,int l,const char *n,const char *d,const char *t);
-class PageSDict : public SDict<PageDef>
+// --- Cast functions
+
+PageDef *toPageDef(Definition *d);
+const PageDef *toPageDef(const Definition *d);
+
+// ------------------
+
+class PageLinkedMap : public LinkedMap<PageDef>
+{
+};
+
+class PageLinkedRefMap : public LinkedRefMap<const PageDef>
{
- public:
- PageSDict(int size) : SDict<PageDef>(size) {}
- virtual ~PageSDict() {}
- private:
- int compareValues(const PageDef *i1,const PageDef *i2) const
- {
- return qstricmp(i1->name(),i2->name());
- }
};
#endif
diff --git a/src/parserintf.h b/src/parserintf.h
index 5095a1e..2fde2f1 100644
--- a/src/parserintf.h
+++ b/src/parserintf.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -20,22 +20,25 @@
#include <qstrlist.h>
+#include <functional>
#include <memory>
#include <map>
#include <string>
#include "types.h"
+#include "containers.h"
class Entry;
class FileDef;
class CodeOutputInterface;
class MemberDef;
class Definition;
+class ClangTUParser;
/** \brief Abstract interface for outline parsers.
*
* By implementing the methods of this interface one can add
- * a new language parser to doxygen. The parser implementation can make use of the
+ * a new language parser to doxygen. The parser implementation can make use of the
* comment block parser to parse the contents of special comment blocks.
*/
class OutlineParserInterface
@@ -43,36 +46,18 @@ class OutlineParserInterface
public:
virtual ~OutlineParserInterface() {}
- /** Starts processing a translation unit (source files + headers).
- * After this call parseInput() is called with sameTranslationUnit
- * set to FALSE. If parseInput() returns additional include files,
- * these are also processed using parseInput() with
- * sameTranslationUnit set to TRUE. After that
- * finishTranslationUnit() is called.
- */
- virtual void startTranslationUnit(const char *fileName) = 0;
-
- /** Called after all files in a translation unit have been
- * processed.
- */
- virtual void finishTranslationUnit() = 0;
-
- /** Parses a single input file with the goal to build an Entry tree.
+ /** Parses a single input file with the goal to build an Entry tree.
* @param[in] fileName The full name of the file.
* @param[in] fileBuf The contents of the file (zero terminated).
- * @param[in,out] root The root of the tree of Entry *nodes
+ * @param[in,out] root The root of the tree of Entry *nodes
* representing the information extracted from the file.
- * @param[in] sameTranslationUnit TRUE if this file was found in the same
- * translation unit (in the filesInSameTranslationUnit list
- * returned for another file).
- * @param[in,out] filesInSameTranslationUnit other files expected to be
- * found in the same translation unit (used for libclang)
+ * @param[in] clangParser The clang translation unit parser object
+ * or nullptr if disabled.
*/
virtual void parseInput(const char *fileName,
const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool sameTranslationUnit,
- QStrList &filesInSameTranslationUnit) = 0;
+ ClangTUParser *clangParser) = 0;
/** Returns TRUE if the language identified by \a extension needs
* the C preprocessor to be run before feed the result to the input
@@ -80,7 +65,7 @@ class OutlineParserInterface
* @see parseInput()
*/
virtual bool needsPreprocessing(const QCString &extension) const = 0;
-
+
/** Callback function called by the comment block scanner.
* It provides a string \a text containing the prototype of a function
* or variable. The parser should parse this and store the information
@@ -110,14 +95,14 @@ class CodeParserInterface
* @param[in] input Actual code in the form of a string
* @param[in] isExampleBlock TRUE iff the code is part of an example.
* @param[in] exampleName Name of the example.
- * @param[in] fileDef File definition to which the code
+ * @param[in] fileDef File definition to which the code
* is associated.
- * @param[in] startLine Starting line in case of a code fragment.
+ * @param[in] startLine Starting line in case of a code fragment.
* @param[in] endLine Ending line of the code fragment.
- * @param[in] inlineFragment Code fragment that is to be shown inline
+ * @param[in] inlineFragment Code fragment that is to be shown inline
* as part of the documentation.
* @param[in] memberDef Member definition to which the code
- * is associated (non null in case of an inline fragment
+ * is associated (non null in case of an inline fragment
* for a member).
* @param[in] showLineNumbers if set to TRUE and also fileDef is not 0,
* line numbers will be added to the source fragment
@@ -151,46 +136,55 @@ class CodeParserInterface
//-----------------------------------------------------------------------------
+using OutlineParserFactory = std::function<std::unique_ptr<OutlineParserInterface>()>;
+using CodeParserFactory = std::function<std::unique_ptr<CodeParserInterface>()>;
+
/** \brief Manages programming language parsers.
*
- * This class manages the language parsers in the system. One can
+ * This class manages the language parsers in the system. One can
* register parsers, and obtain a parser given a file extension.
*/
class ParserManager
{
- public:
+
struct ParserPair
{
- ParserPair(std::unique_ptr<OutlineParserInterface> oli,
- std::unique_ptr<CodeParserInterface> cpi)
- : outlineParser(std::move(oli)), codeParser(std::move(cpi))
+ ParserPair(OutlineParserFactory opf, CodeParserFactory cpf, const QCString pn)
+ : outlineParserFactory(opf), codeParserFactory(cpf), parserName(pn)
{
}
- std::unique_ptr<OutlineParserInterface> outlineParser;
- std::unique_ptr<CodeParserInterface> codeParser;
+ OutlineParserFactory outlineParserFactory;
+ CodeParserFactory codeParserFactory;
+ QCString parserName;
};
- ParserManager(std::unique_ptr<OutlineParserInterface> outlineParser,
- std::unique_ptr<CodeParserInterface> codeParser)
- : m_defaultParsers(std::move(outlineParser),std::move(codeParser))
+ public:
+ /** Create the parser manager
+ * @param outlineParserFactory the fallback outline parser factory to use for unknown extensions
+ * @param codeParserFactory the fallback code parser factory to use for unknown extensions
+ */
+ ParserManager(OutlineParserFactory outlineParserFactory,
+ CodeParserFactory codeParserFactory)
+ : m_defaultParsers(outlineParserFactory,codeParserFactory, "")
{
}
/** Registers an additional parser.
- * @param[in] name A symbolic name of the parser, i.e. "c",
- * "python", "fortran", "vhdl", ...
- * @param[in] parser The parser that is to be used for the
- * given name.
+ * @param[in] name A symbolic name of the parser, i.e. "c",
+ * "python", "fortran", "vhdl", ...
+ * @param[in] outlineParserFactory A factory method to create a language parser (scanner) that
+ * is to be used for the given name.
+ * @param[in] codeParserFactory A factory method to create a code parser that is to be used
+ * for the given name.
*/
- void registerParser(const char *name,std::unique_ptr<OutlineParserInterface> outlineParser,
- std::unique_ptr<CodeParserInterface> codeParser)
+ void registerParser(const char *name,OutlineParserFactory outlineParserFactory,
+ CodeParserFactory codeParserFactory)
{
- m_parsers.emplace(std::string(name),
- ParserPair(std::move(outlineParser),std::move(codeParser)));
+ m_parsers.emplace(std::string(name),ParserPair(outlineParserFactory,codeParserFactory,name));
}
- /** Registers a file \a extension with a parser with name \a parserName.
+ /** Registers a file \a extension with a parser with name \a parserName.
* Returns TRUE if the extension was successfully registered.
*/
bool registerExtension(const char *extension, const char *parserName)
@@ -209,22 +203,38 @@ class ParserManager
return TRUE;
}
- /** Gets the interface to the parser associated with given \a extension.
- * If there is no parser explicitly registered for the supplied extension,
+ /** Gets the interface to the parser associated with a given \a extension.
+ * If there is no parser explicitly registered for the supplied extension,
* the interface to the default parser will be returned.
*/
- OutlineParserInterface &getOutlineParser(const char *extension)
+ std::unique_ptr<OutlineParserInterface> getOutlineParser(const char *extension)
{
- return *getParsers(extension).outlineParser;
+ return getParsers(extension).outlineParserFactory();
}
- /** Gets the interface to the parser associated with given \a extension.
- * If there is no parser explicitly registered for the supplied extension,
+ /** Gets the interface to the parser associated with a given \a extension.
+ * If there is no parser explicitly registered for the supplied extension,
* the interface to the default parser will be returned.
*/
- CodeParserInterface &getCodeParser(const char *extension)
+ std::unique_ptr<CodeParserInterface> getCodeParser(const char *extension)
+ {
+ auto factory = getCodeParserFactory(extension);
+ return factory();
+ }
+
+ /** Get the factory for create code parser objects with a given \a extension. */
+ CodeParserFactory &getCodeParserFactory(const char *extension)
+ {
+ return getParsers(extension).codeParserFactory;
+ }
+
+ /** Gets the name of the parser associated with given \a extension.
+ * If there is no parser explicitly registered for the supplied extension,
+ * te empty string will be reurned.
+ */
+ QCString getParserName(const char *extension)
{
- return *getParsers(extension).codeParser;
+ return getParsers(extension).parserName;
}
private:
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index 4ecee5e..854b3df 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -92,7 +92,7 @@ void PerlModOutputStream::add(int n)
if (m_t != 0)
(*m_t) << n;
else
- m_s += n;
+ m_s += QCString().setNum(n);
}
void PerlModOutputStream::add(unsigned int n)
@@ -100,7 +100,7 @@ void PerlModOutputStream::add(unsigned int n)
if (m_t != 0)
(*m_t) << n;
else
- m_s += n;
+ m_s += QCString().setNum(n);
}
class PerlModOutput
@@ -171,10 +171,10 @@ public:
inline PerlModOutput &closeHash() { close('}'); return *this; }
protected:
-
+
void iopenSave();
void icloseSave(QCString &);
-
+
void incIndent();
void decIndent();
@@ -187,7 +187,7 @@ protected:
void iclose(char);
private:
-
+
PerlModOutputStream *m_stream;
int m_indentation;
bool m_blockstart;
@@ -226,7 +226,7 @@ void PerlModOutput::decIndent()
m_spaces[m_indentation * 2] = 0;
}
-void PerlModOutput::iaddQuoted(const char *s)
+void PerlModOutput::iaddQuoted(const char *s)
{
char c;
while ((c = *s++) != 0) {
@@ -235,7 +235,7 @@ void PerlModOutput::iaddQuoted(const char *s)
m_stream->add(c);
}
}
-
+
void PerlModOutput::iaddField(const char *s)
{
continueBlock();
@@ -276,10 +276,10 @@ void PerlModOutput::iopen(char c, const char *s)
void PerlModOutput::iclose(char c)
{
- decIndent();
+ decIndent();
indent();
if (c != 0)
- m_stream->add(c);
+ m_stream->add(c);
m_blockstart = false;
}
@@ -291,11 +291,11 @@ public:
virtual ~PerlModDocVisitor() { }
void finish();
-
+
//--------------------------------------
// visitor functions for leaf nodes
//--------------------------------------
-
+
void visit(DocWord *);
void visit(DocLinkedWord *);
void visit(DocWhiteSpace *);
@@ -317,7 +317,7 @@ public:
//--------------------------------------
// visitor functions for compound nodes
//--------------------------------------
-
+
void visitPre(DocAutoList *);
void visitPost(DocAutoList *);
void visitPre(DocAutoListItem *);
@@ -405,7 +405,7 @@ private:
void addLink(const QCString &ref, const QCString &file,
const QCString &anchor);
-
+
void enterText();
void leaveText();
@@ -653,7 +653,7 @@ void PerlModDocVisitor::visit(DocStyleChange *s)
case DocStyleChange::Preformatted: style = "preformatted"; break;
case DocStyleChange::Div: style = "div"; break;
case DocStyleChange::Span: style = "span"; break;
-
+
}
openItem("style");
m_output.addFieldQuotedString("style", style)
@@ -712,12 +712,12 @@ void PerlModDocVisitor::visit(DocInclude *inc)
{
case DocInclude::IncWithLines:
#if 0
- {
+ {
m_t << "<div class=\"fragment\"><pre>";
QFileInfo cfi( inc->file() );
FileDef fd( cfi.dirPath(), cfi.fileName() );
parseCode(m_ci,inc->context(),inc->text().latin1(),inc->isExample(),inc->exampleFile(), &fd);
- m_t << "</pre></div>";
+ m_t << "</pre></div>";
}
break;
#endif
@@ -733,11 +733,15 @@ void PerlModDocVisitor::visit(DocInclude *inc)
case DocInclude::DontIncWithLines: return;
case DocInclude::HtmlInclude: type = "htmlonly"; break;
case DocInclude::LatexInclude: type = "latexonly"; break;
+ case DocInclude::RtfInclude: type = "rtfonly"; break;
+ case DocInclude::ManInclude: type = "manonly"; break;
+ case DocInclude::XmlInclude: type = "xmlonly"; break;
+ case DocInclude::DocbookInclude: type = "docbookonly"; break;
case DocInclude::VerbInclude: type = "preformatted"; break;
case DocInclude::Snippet: return;
case DocInclude::SnipWithLines: return;
- case DocInclude::SnippetDoc:
- case DocInclude::IncludeDoc:
+ case DocInclude::SnippetDoc:
+ case DocInclude::IncludeDoc:
err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
"Please create a bug report\n",__FILE__);
break;
@@ -760,7 +764,7 @@ void PerlModDocVisitor::visit(DocIncOperator *)
{
parseCode(m_ci,op->context(),op->text(),FALSE,0);
}
- if (op->isLast())
+ if (op->isLast())
{
m_output.add("</programlisting>");
}
@@ -775,7 +779,7 @@ void PerlModDocVisitor::visit(DocFormula *f)
{
openItem("formula");
QCString id;
- id += f->id();
+ id += QCString().setNum(f->id());
m_output.addFieldQuotedString("id", id).addFieldQuotedString("content", f->text());
closeItem();
}
@@ -910,7 +914,7 @@ void PerlModDocVisitor::visitPost(DocTitle *)
closeItem();
}
-void PerlModDocVisitor::visitPre(DocSimpleList *)
+void PerlModDocVisitor::visitPre(DocSimpleList *)
{
openItem("list");
m_output.addFieldQuotedString("style", "itemized");
@@ -1122,7 +1126,7 @@ void PerlModDocVisitor::visitPre(DocImage *)
case DocImage::Rtf: m_output.add("rtf"); break;
}
m_output.add("\"");
-
+
QCString baseName=img->name();
int i;
if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
@@ -1442,16 +1446,6 @@ static void addTemplateArgumentList(const ArgumentList &al,PerlModOutput &output
output.closeList();
}
-#if 0
-static void addMemberTemplateLists(MemberDef *md,PerlModOutput &output)
-{
- ClassDef *cd = md->getClassDef();
- const char *cname = cd ? cd->name().data() : 0;
- if (md->templateArguments()) // function template prefix
- addTemplateArgumentList(md->templateArguments(),output,cname);
-}
-#endif
-
static void addTemplateList(const ClassDef *cd,PerlModOutput &output)
{
addTemplateArgumentList(cd->templateArguments(),output,cd->name());
@@ -1469,7 +1463,8 @@ static void addPerlModDocBlock(PerlModOutput &output,
if (stext.isEmpty())
output.addField(name).add("{}");
else {
- DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,stext,FALSE,0);
+ DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,stext,FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
output.openHash(name);
PerlModDocVisitor *visitor = new PerlModDocVisitor(output);
root->accept(visitor);
@@ -1480,7 +1475,7 @@ static void addPerlModDocBlock(PerlModOutput &output,
}
}
-static const char *getProtectionName(Protection prot)
+static const char *getProtectionName(Protection prot)
{
switch (prot)
{
@@ -1534,6 +1529,7 @@ public:
inline PerlModGenerator(bool pretty) : m_output(pretty) { }
void generatePerlModForMember(const MemberDef *md, const Definition *);
+ void generatePerlUserDefinedSection(const Definition *d, const MemberGroupList &mgl);
void generatePerlModSection(const Definition *d, MemberList *ml,
const char *name, const char *header=0);
void addListOfAllMembers(const ClassDef *cd);
@@ -1542,7 +1538,7 @@ public:
void generatePerlModForFile(const FileDef *fd);
void generatePerlModForGroup(const GroupDef *gd);
void generatePerlModForPage(PageDef *pi);
-
+
bool createOutputFile(QFile &f, const char *s);
bool createOutputDir(QDir &perlModDir);
bool generateDoxyLatexTex();
@@ -1571,8 +1567,9 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini
// - body code
// - template arguments
// (templateArguments(), definitionTemplateParameterLists())
-
+
QCString memType;
+ QCString name;
bool isFunc=FALSE;
switch (md->memberType())
{
@@ -1594,24 +1591,27 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini
case MemberType_Dictionary: memType="dictionary"; break;
}
+ name = md->name();
+ if (md->isAnonymous()) name = "__unnamed" + name.right(name.length() - 1)+"__";
+
m_output.openHash()
.addFieldQuotedString("kind", memType)
- .addFieldQuotedString("name", md->name())
+ .addFieldQuotedString("name", name)
.addFieldQuotedString("virtualness", getVirtualnessName(md->virtualness()))
.addFieldQuotedString("protection", getProtectionName(md->protection()))
.addFieldBoolean("static", md->isStatic());
-
+
addPerlModDocBlock(m_output,"brief",md->getDefFileName(),md->getDefLine(),md->getOuterScope(),md,md->briefDescription());
addPerlModDocBlock(m_output,"detailed",md->getDefFileName(),md->getDefLine(),md->getOuterScope(),md,md->documentation());
if (md->memberType()!=MemberType_Define &&
md->memberType()!=MemberType_Enumeration)
m_output.addFieldQuotedString("type", md->typeString());
-
+
const ArgumentList &al = md->argumentList();
if (isFunc) //function
{
- m_output.addFieldBoolean("const", al.constSpecifier)
- .addFieldBoolean("volatile", al.volatileSpecifier);
+ m_output.addFieldBoolean("const", al.constSpecifier())
+ .addFieldBoolean("volatile", al.volatileSpecifier());
m_output.openList("parameters");
const ArgumentList &declAl = md->declArgumentList();
@@ -1645,7 +1645,7 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini
if (!a.attrib.isEmpty())
m_output.addFieldQuotedString("attributes", a.attrib);
-
+
m_output.closeHash();
}
}
@@ -1663,17 +1663,17 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini
}
m_output.closeList();
}
- else if (md->argsString()!=0)
+ else if (md->argsString()!=0)
{
m_output.addFieldQuotedString("arguments", md->argsString());
}
if (!md->initializer().isEmpty())
m_output.addFieldQuotedString("initializer", md->initializer());
-
+
if (md->excpString())
m_output.addFieldQuotedString("exceptions", md->excpString());
-
+
if (md->memberType()==MemberType_Enumeration) // enum
{
const MemberList *enumFields = md->enumFieldList();
@@ -1686,7 +1686,7 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini
{
m_output.openHash()
.addFieldQuotedString("name", emd->name());
-
+
if (!emd->initializer().isEmpty())
m_output.addFieldQuotedString("initializer", emd->initializer());
@@ -1700,6 +1700,13 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini
}
}
+ if (md->memberType() == MemberType_Variable && md->bitfieldString())
+ {
+ QCString bitfield = md->bitfieldString();
+ if (bitfield.at(0) == ':') bitfield = bitfield.mid(1);
+ m_output.addFieldQuotedString("bitfield", bitfield);
+ }
+
const MemberDef *rmd = md->reimplements();
if (rmd)
m_output.openHash("reimplements")
@@ -1717,7 +1724,7 @@ void PerlModGenerator::generatePerlModForMember(const MemberDef *md,const Defini
.closeHash();
m_output.closeList();
}
-
+
m_output.closeHash();
}
@@ -1730,7 +1737,7 @@ void PerlModGenerator::generatePerlModSection(const Definition *d,
if (header)
m_output.addFieldQuotedString("header", header);
-
+
m_output.openList("members");
MemberListIterator mli(*ml);
const MemberDef *md;
@@ -1745,37 +1752,58 @@ void PerlModGenerator::generatePerlModSection(const Definition *d,
void PerlModGenerator::addListOfAllMembers(const ClassDef *cd)
{
m_output.openList("all_members");
- if (cd->memberNameInfoSDict())
+ for (auto &mni : cd->memberNameInfoLinkedMap())
{
- MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
- MemberNameInfo *mni;
- for (mnii.toFirst();(mni=mnii.current());++mnii)
+ for (auto &mi : *mni)
{
- MemberNameInfoIterator mii(*mni);
- MemberInfo *mi;
- for (mii.toFirst();(mi=mii.current());++mii)
- {
- const MemberDef *md=mi->memberDef;
- const ClassDef *cd=md->getClassDef();
- const Definition *d=md->getGroupDef();
- if (d==0) d = cd;
+ const MemberDef *md=mi->memberDef();
+ const ClassDef *mcd=md->getClassDef();
+ const Definition *d=md->getGroupDef();
+ if (d==0) d = mcd;
- m_output.openHash()
- .addFieldQuotedString("name", md->name())
- .addFieldQuotedString("virtualness", getVirtualnessName(md->virtualness()))
- .addFieldQuotedString("protection", getProtectionName(mi->prot));
+ m_output.openHash()
+ .addFieldQuotedString("name", md->name())
+ .addFieldQuotedString("virtualness", getVirtualnessName(md->virtualness()))
+ .addFieldQuotedString("protection", getProtectionName(mi->prot()));
- if (!mi->ambiguityResolutionScope.isEmpty())
- m_output.addFieldQuotedString("ambiguity_scope", mi->ambiguityResolutionScope);
+ if (!mi->ambiguityResolutionScope().isEmpty())
+ m_output.addFieldQuotedString("ambiguity_scope", mi->ambiguityResolutionScope());
- m_output.addFieldQuotedString("scope", cd->name())
- .closeHash();
- }
+ m_output.addFieldQuotedString("scope", mcd->name())
+ .closeHash();
}
}
m_output.closeList();
}
+void PerlModGenerator::generatePerlUserDefinedSection(const Definition *d, const MemberGroupList &mgl)
+{
+ if (!mgl.empty())
+ {
+ m_output.openList("user_defined");
+ for (const auto &mg : mgl)
+ {
+ m_output.openHash();
+ if (mg->header())
+ m_output.addFieldQuotedString("header", mg->header());
+
+ if (mg->members())
+ {
+ m_output.openList("members");
+ MemberListIterator mli(*mg->members());
+ const MemberDef *md;
+ for (mli.toFirst(); (md = mli.current()); ++mli)
+ {
+ generatePerlModForMember(md, d);
+ }
+ m_output.closeList();
+ }
+ m_output.closeHash();
+ }
+ m_output.closeList();
+ }
+}
+
void PerlModGenerator::generatePerlModForClass(const ClassDef *cd)
{
// + brief description
@@ -1800,44 +1828,42 @@ void PerlModGenerator::generatePerlModForClass(const ClassDef *cd)
m_output.openHash()
.addFieldQuotedString("name", cd->name());
-
- if (cd->baseClasses())
+ /* DGA: fix # #7547 Perlmod does not generate "kind" information to discriminate struct/union */
+ m_output.addFieldQuotedString("kind", cd->compoundTypeString());
+
+ if (!cd->baseClasses().empty())
{
m_output.openList("base");
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ for (const auto &bcd : cd->baseClasses())
+ {
m_output.openHash()
- .addFieldQuotedString("name", bcd->classDef->displayName())
- .addFieldQuotedString("virtualness", getVirtualnessName(bcd->virt))
- .addFieldQuotedString("protection", getProtectionName(bcd->prot))
+ .addFieldQuotedString("name", bcd.classDef->displayName())
+ .addFieldQuotedString("virtualness", getVirtualnessName(bcd.virt))
+ .addFieldQuotedString("protection", getProtectionName(bcd.prot))
.closeHash();
+ }
m_output.closeList();
}
- if (cd->subClasses())
+ if (!cd->subClasses().empty())
{
m_output.openList("derived");
- BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ for (const auto &bcd : cd->subClasses())
+ {
m_output.openHash()
- .addFieldQuotedString("name", bcd->classDef->displayName())
- .addFieldQuotedString("virtualness", getVirtualnessName(bcd->virt))
- .addFieldQuotedString("protection", getProtectionName(bcd->prot))
+ .addFieldQuotedString("name", bcd.classDef->displayName())
+ .addFieldQuotedString("virtualness", getVirtualnessName(bcd.virt))
+ .addFieldQuotedString("protection", getProtectionName(bcd.prot))
.closeHash();
+ }
m_output.closeList();
}
- ClassSDict *cl = cd->getClassSDict();
- if (cl)
{
m_output.openList("inner");
- ClassSDict::Iterator cli(*cl);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &icd : cd->getClasses())
m_output.openHash()
- .addFieldQuotedString("name", cd->name())
+ .addFieldQuotedString("name", icd->name())
.closeHash();
m_output.closeList();
}
@@ -1862,13 +1888,7 @@ void PerlModGenerator::generatePerlModForClass(const ClassDef *cd)
addTemplateList(cd,m_output);
addListOfAllMembers(cd);
- if (cd->getMemberGroupSDict())
- {
- MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- generatePerlModSection(cd,mg->members(),"user_defined",mg->header());
- }
+ generatePerlUserDefinedSection(cd, cd->getMemberGroups());
generatePerlModSection(cd,cd->getMemberList(MemberListType_pubTypes),"public_typedefs");
generatePerlModSection(cd,cd->getMemberList(MemberListType_pubMethods),"public_methods");
@@ -1912,12 +1932,12 @@ void PerlModGenerator::generatePerlModForClass(const ClassDef *cd)
collaborationGraph.writePerlMod(t);
t << " </collaborationgraph>" << endl;
}
- t << " <location file=\""
- << cd->getDefFileName() << "\" line=\""
+ t << " <location file=\""
+ << cd->getDefFileName() << "\" line=\""
<< cd->getDefLine() << "\"";
if (cd->getStartBodyLine()!=-1)
{
- t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
+ t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
<< cd->getEndBodyLine() << "\"";
}
t << "/>" << endl;
@@ -1941,40 +1961,28 @@ void PerlModGenerator::generatePerlModForNamespace(const NamespaceDef *nd)
m_output.openHash()
.addFieldQuotedString("name", nd->name());
-
- ClassSDict *cl = nd->getClassSDict();
- if (cl)
+
+ if (!nd->getClasses().empty())
{
m_output.openList("classes");
- ClassSDict::Iterator cli(*cl);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : nd->getClasses())
m_output.openHash()
.addFieldQuotedString("name", cd->name())
.closeHash();
m_output.closeList();
}
- const NamespaceSDict *nl = nd->getNamespaceSDict();
- if (nl)
+ if (!nd->getNamespaces().empty())
{
m_output.openList("namespaces");
- NamespaceSDict::Iterator nli(*nl);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &ind : nd->getNamespaces())
m_output.openHash()
- .addFieldQuotedString("name", nd->name())
+ .addFieldQuotedString("name", ind->name())
.closeHash();
m_output.closeList();
}
- if (nd->getMemberGroupSDict())
- {
- MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
- const MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- generatePerlModSection(nd,mg->members(),"user-defined",mg->header());
- }
+ generatePerlUserDefinedSection(nd, nd->getMemberGroups());
generatePerlModSection(nd,nd->getMemberList(MemberListType_decDefineMembers),"defines");
generatePerlModSection(nd,nd->getMemberList(MemberListType_decProtoMembers),"prototypes");
@@ -2004,12 +2012,12 @@ void PerlModGenerator::generatePerlModForFile(const FileDef *fd)
// - source code
// - location
// - number of lines
-
+
if (fd->isReference()) return;
m_output.openHash()
.addFieldQuotedString("name", fd->name());
-
+
IncludeInfo *inc;
m_output.openList("includes");
if (fd->includeFileList())
@@ -2027,7 +2035,7 @@ void PerlModGenerator::generatePerlModForFile(const FileDef *fd)
}
}
m_output.closeList();
-
+
m_output.openList("included_by");
if (fd->includedByFileList())
{
@@ -2044,7 +2052,9 @@ void PerlModGenerator::generatePerlModForFile(const FileDef *fd)
}
}
m_output.closeList();
-
+
+ generatePerlUserDefinedSection(fd, fd->getMemberGroups());
+
generatePerlModSection(fd,fd->getMemberList(MemberListType_decDefineMembers),"defines");
generatePerlModSection(fd,fd->getMemberList(MemberListType_decProtoMembers),"prototypes");
generatePerlModSection(fd,fd->getMemberList(MemberListType_decTypedefMembers),"typedefs");
@@ -2091,65 +2101,47 @@ void PerlModGenerator::generatePerlModForGroup(const GroupDef *gd)
m_output.closeList();
}
- ClassSDict *cl = gd->getClasses();
- if (cl)
+ if (!gd->getClasses().empty())
{
m_output.openList("classes");
- ClassSDict::Iterator cli(*cl);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : gd->getClasses())
m_output.openHash()
.addFieldQuotedString("name", cd->name())
.closeHash();
m_output.closeList();
}
- NamespaceSDict *nl = gd->getNamespaces();
- if (nl)
+ if (!gd->getNamespaces().empty())
{
m_output.openList("namespaces");
- NamespaceSDict::Iterator nli(*nl);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : gd->getNamespaces())
m_output.openHash()
.addFieldQuotedString("name", nd->name())
.closeHash();
m_output.closeList();
}
- PageSDict *pl = gd->getPages();
- if (pl)
+ if (!gd->getPages().empty())
{
m_output.openList("pages");
- PageSDict::Iterator pli(*pl);
- PageDef *pd;
- for (pli.toFirst();(pd=pli.current());++pli)
+ for (const auto &pd : gd->getPages())
m_output.openHash()
.addFieldQuotedString("title", pd->title())
.closeHash();
m_output.closeList();
}
- GroupList *gl = gd->getSubGroups();
- if (gl)
+ if (!gd->getSubGroups().empty())
{
m_output.openList("groups");
- GroupListIterator gli(*gl);
- const GroupDef *sgd;
- for (gli.toFirst();(sgd=gli.current());++gli)
+ for (const auto &sgd : gd->getSubGroups())
m_output.openHash()
.addFieldQuotedString("title", sgd->groupTitle())
.closeHash();
m_output.closeList();
}
- if (gd->getMemberGroupSDict())
- {
- MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- generatePerlModSection(gd,mg->members(),"user-defined",mg->header());
- }
+ generatePerlUserDefinedSection(gd, gd->getMemberGroups());
generatePerlModSection(gd,gd->getMemberList(MemberListType_decDefineMembers),"defines");
generatePerlModSection(gd,gd->getMemberList(MemberListType_decProtoMembers),"prototypes");
@@ -2174,10 +2166,10 @@ void PerlModGenerator::generatePerlModForPage(PageDef *pd)
m_output.openHash()
.addFieldQuotedString("name", pd->name());
-
- SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+
+ const SectionInfo *si = SectionManager::instance().find(pd->name());
if (si)
- m_output.addFieldQuotedString("title4", filterTitle(si->title));
+ m_output.addFieldQuotedString("title4", filterTitle(si->title()));
addPerlModDocBlock(m_output,"detailed",pd->docFile(),pd->docLine(),0,0,pd->documentation());
m_output.closeHash();
@@ -2188,57 +2180,47 @@ bool PerlModGenerator::generatePerlModOutput()
QFile outputFile;
if (!createOutputFile(outputFile, pathDoxyDocsPM))
return false;
-
+
FTextStream outputTextStream(&outputFile);
PerlModOutputStream outputStream(&outputTextStream);
m_output.setPerlModOutputStream(&outputStream);
m_output.add("$doxydocs=").openHash();
-
+
m_output.openList("classes");
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- generatePerlModForClass(cd);
+ for (const auto &cd : *Doxygen::classLinkedMap)
+ generatePerlModForClass(cd.get());
m_output.closeList();
m_output.openList("namespaces");
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- generatePerlModForNamespace(nd);
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
+ generatePerlModForNamespace(nd.get());
m_output.closeList();
m_output.openList("files");
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- const FileDef *fd;
- for (;(fd=fni.current());++fni)
- generatePerlModForFile(fd);
+ for (const auto &fd : *fn)
+ {
+ generatePerlModForFile(fd.get());
+ }
}
m_output.closeList();
m_output.openList("groups");
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- const GroupDef *gd;
- for (;(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
- generatePerlModForGroup(gd);
+ generatePerlModForGroup(gd.get());
}
m_output.closeList();
m_output.openList("pages");
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
- generatePerlModForPage(pd);
+ generatePerlModForPage(pd.get());
}
if (Doxygen::mainPage)
{
- generatePerlModForPage(Doxygen::mainPage);
+ generatePerlModForPage(Doxygen::mainPage.get());
}
m_output.closeList();
@@ -2295,7 +2277,7 @@ bool PerlModGenerator::createOutputDir(QDir &perlModDir)
return false;
}
}
-
+
perlModDir.setPath(outputDirectory+"/perlmod");
if (!perlModDir.exists() && !perlModDir.mkdir(outputDirectory+"/perlmod"))
{
@@ -2312,7 +2294,7 @@ bool PerlModGenerator::generateDoxyStructurePM()
return false;
FTextStream doxyModelPMStream(&doxyModelPM);
- doxyModelPMStream <<
+ doxyModelPMStream <<
"sub memberlist($) {\n"
" my $prefix = $_[0];\n"
" return\n"
@@ -2442,7 +2424,7 @@ bool PerlModGenerator::generateDoxyStructurePM()
"\t\tclasses =>\n"
"\t\t [ \"list\", \"Classes\",\n"
"\t\t [ \"hash\", \"Class\",\n"
- "\t\t {\n"
+ "\t\t {\n"
"\t\t name => [ \"string\", \"Classname\" ]\n"
"\t\t }\n"
"\t\t ],\n"
@@ -2450,7 +2432,7 @@ bool PerlModGenerator::generateDoxyStructurePM()
"\t\tnamespaces =>\n"
"\t\t [ \"list\", \"Namespaces\",\n"
"\t\t [ \"hash\", \"Namespace\",\n"
- "\t\t {\n"
+ "\t\t {\n"
"\t\t name => [ \"string\", \"NamespaceName\" ]\n"
"\t\t }\n"
"\t\t ],\n"
@@ -2620,7 +2602,7 @@ bool PerlModGenerator::generateDoxyLatexStructurePL()
return false;
FTextStream doxyLatexStructurePLStream(&doxyLatexStructurePL);
- doxyLatexStructurePLStream <<
+ doxyLatexStructurePLStream <<
"use DoxyStructure;\n"
"\n"
"sub process($) {\n"
@@ -2654,7 +2636,7 @@ bool PerlModGenerator::generateDoxyLatexPL()
return false;
FTextStream doxyLatexPLStream(&doxyLatexPL);
- doxyLatexPLStream <<
+ doxyLatexPLStream <<
"use DoxyStructure;\n"
"use DoxyDocs;\n"
"\n"
@@ -2777,7 +2759,7 @@ bool PerlModGenerator::generateDoxyFormatTex()
return false;
FTextStream doxyFormatTexStream(&doxyFormatTex);
- doxyFormatTexStream <<
+ doxyFormatTexStream <<
"\\def\\Defcs#1{\\long\\expandafter\\def\\csname#1\\endcsname}\n"
"\\Defcs{Empty}{}\n"
"\\def\\IfEmpty#1{\\expandafter\\ifx\\csname#1\\endcsname\\Empty}\n"
@@ -3023,12 +3005,12 @@ void generatePerlMod()
(global-set-key '(control z) (lambda () (interactive)
(save-excursion
(if (< (mark) (point)) (exchange-point-and-mark))
- (let ((start (point)) (replacers
+ (let ((start (point)) (replacers
'(("\\\\" "\\\\\\\\")
("\"" "\\\\\"")
("\t" "\\\\t")
("^.*$" "\"\\&\\\\n\""))))
- (while replacers
+ (while replacers
(while (re-search-forward (caar replacers) (mark) t)
(replace-match (cadar replacers) t))
(goto-char start)
diff --git a/src/plantuml.cpp b/src/plantuml.cpp
index fa50f2d..d020da0 100644
--- a/src/plantuml.cpp
+++ b/src/plantuml.cpp
@@ -27,16 +27,24 @@
#include <qlist.h>
-QCString PlantumlManager::writePlantUMLSource(const QCString &outDir,const QCString &fileName,const QCString &content,OutputFormat format)
+QCString PlantumlManager::writePlantUMLSource(const QCString &outDirArg,const QCString &fileName,const QCString &content,OutputFormat format)
{
QCString baseName;
QCString puName;
QCString imgName;
+ QCString outDir(outDirArg);
static int umlindex=1;
Debug::print(Debug::Plantuml,0,"*** %s fileName: %s\n","writePlantUMLSource",qPrint(fileName));
Debug::print(Debug::Plantuml,0,"*** %s outDir: %s\n","writePlantUMLSource",qPrint(outDir));
+ // strip any trailing slashes and backslashes
+ uint l;
+ while ((l=outDir.length())>0 && (outDir.at(l-1)=='/' || outDir.at(l-1)=='\\'))
+ {
+ outDir = outDir.left(l-1);
+ }
+
if (fileName.isEmpty()) // generate name
{
puName = "inline_umlgraph_"+QCString().setNum(umlindex);
@@ -76,7 +84,7 @@ QCString PlantumlManager::writePlantUMLSource(const QCString &outDir,const QCStr
uint pos = qcOutDir.findRev("/");
QCString generateType(qcOutDir.right(qcOutDir.length() - (pos + 1)) );
Debug::print(Debug::Plantuml,0,"*** %s generateType: %s\n","writePlantUMLSource",qPrint(generateType));
- PlantumlManager::instance()->insert(generateType,puName,format,text);
+ PlantumlManager::instance()->insert(generateType,puName,outDir,format,text);
Debug::print(Debug::Plantuml,0,"*** %s generateType: %s\n","writePlantUMLSource",qPrint(generateType));
return baseName;
@@ -178,16 +186,16 @@ PlantumlManager::~PlantumlManager()
}
static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles,
- const QDict< QCString > &plantumlContent,
+ const QDict< PlantumlContent > &plantumlContent,
PlantumlManager::OutputFormat format)
{
- /* example : running: java -Djava.awt.headless=true
- -jar "/usr/local/bin/plantuml.jar"
- -o "test_doxygen/DOXYGEN_OUTPUT/html"
- -tpng
- "test_doxygen/DOXYGEN_OUTPUT/html/A.pu"
- -charset UTF-8
- outDir:test_doxygen/DOXYGEN_OUTPUT/html
+ /* example : running: java -Djava.awt.headless=true
+ -jar "/usr/local/bin/plantuml.jar"
+ -o "test_doxygen/DOXYGEN_OUTPUT/html"
+ -tpng
+ "test_doxygen/DOXYGEN_OUTPUT/html/A.pu"
+ -charset UTF-8
+ outDir:test_doxygen/DOXYGEN_OUTPUT/html
test_doxygen/DOXYGEN_OUTPUT/html/A
*/
int exitCode;
@@ -200,21 +208,23 @@ static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles,
QCString pumlType = "";
QCString pumlOutDir = "";
- QStrList &pumlIncludePathList = Config_getList(PLANTUML_INCLUDE_PATH);
- char *s=pumlIncludePathList.first();
- if (s)
+ const StringVector &pumlIncludePathList = Config_getList(PLANTUML_INCLUDE_PATH);
{
- pumlArgs += "-Dplantuml.include.path=\"";
- pumlArgs += s;
- s = pumlIncludePathList.next();
- }
- while (s)
- {
- pumlArgs += Portable::pathListSeparator();
- pumlArgs += s;
- s = pumlIncludePathList.next();
+ auto it = pumlIncludePathList.begin();
+ if (it!=pumlIncludePathList.end())
+ {
+ pumlArgs += "-Dplantuml.include.path=\"";
+ pumlArgs += it->c_str();
+ ++it;
+ }
+ while (it!=pumlIncludePathList.end())
+ {
+ pumlArgs += Portable::pathListSeparator();
+ pumlArgs += it->c_str();
+ ++it;
+ }
}
- if (pumlIncludePathList.first()) pumlArgs += "\" ";
+ if (!pumlIncludePathList.empty()) pumlArgs += "\" ";
pumlArgs += "-Djava.awt.headless=true -jar \""+plantumlJarPath+"plantuml.jar\" ";
if (!plantumlConfigFile.isEmpty())
{
@@ -244,25 +254,21 @@ static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles,
}
{
- QDictIterator< QCString > it( plantumlContent); // See QDictIterator
- QCString *nb;
+ QDictIterator< PlantumlContent > it( plantumlContent); // See QDictIterator
+ PlantumlContent *nb;
for (it.toFirst();(nb=it.current());++it)
{
QCString pumlArguments(pumlArgs);
msg("Generating PlantUML %s Files in %s\n",qPrint(pumlType),qPrint(it.currentKey()));
pumlArguments+="-o \"";
- pumlArguments+=Config_getString(OUTPUT_DIRECTORY);
- pumlArguments+="/";
- pumlArguments+=it.currentKey();
+ pumlArguments+=nb->outDir.data();
pumlArguments+="\" ";
pumlArguments+="-charset UTF-8 -t";
pumlArguments+=pumlType;
pumlArguments+=" ";
QCString puFileName("");
- puFileName+=Config_getString(OUTPUT_DIRECTORY);
- puFileName+="/";
- puFileName+=it.currentKey();
+ puFileName+=nb->outDir.data();
puFileName+="/";
pumlOutDir=puFileName;
puFileName+="inline_umlgraph_";
@@ -279,7 +285,7 @@ static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles,
{
err("Could not open file %s for writing\n",puFileName.data());
}
- file.writeBlock( *nb, nb->length() );
+ file.writeBlock( nb->content, nb->content.length() );
file.close();
Debug::print(Debug::Plantuml,0,"*** %s Running Plantuml arguments:%s\n","PlantumlManager::runPlantumlContent",qPrint(pumlArguments));
@@ -303,12 +309,12 @@ static void runPlantumlContent(const QDict< QList <QCString> > &plantumlFiles,
if (list)
{
QListIterator<QCString> li(*list);
- QCString *nb;
- for (li.toFirst();(nb=li.current());++li)
+ QCString *str_p;
+ for (li.toFirst();(str_p=li.current());++li)
{
const int maxCmdLine = 40960;
QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s%s.eps\" --outfile=\"%s%s.pdf\"",qPrint(pumlOutDir),qPrint(*nb),qPrint(pumlOutDir),qPrint(*nb));
+ epstopdfArgs.sprintf("\"%s%s.eps\" --outfile=\"%s%s.pdf\"",qPrint(pumlOutDir),qPrint(*str_p),qPrint(pumlOutDir),qPrint(*str_p));
Portable::sysTimerStart();
if ((exitCode=Portable::system("epstopdf",epstopdfArgs))!=0)
{
@@ -358,16 +364,16 @@ static void print(const QDict< QList <QCString> > &plantumlFiles)
}
}
-static void print(const QDict<QCString> &plantumlContent)
+static void print(const QDict<PlantumlContent> &plantumlContent)
{
if (Debug::isFlagSet(Debug::Plantuml))
{
- QDictIterator< QCString > it( plantumlContent); // See QDictIterator
- QCString *nb;
+ QDictIterator< PlantumlContent > it( plantumlContent); // See QDictIterator
+ PlantumlContent *nb;
for (it.toFirst();(nb=it.current());++it)
{
Debug::print(Debug::Plantuml,0,"*** %s PlantumlContent key:%s\n","PlantumlManager::print Content",qPrint(it.currentKey()));
- Debug::print(Debug::Plantuml,0,"*** %s Content :%s\n","PlantumlManager::print",qPrint(*nb));
+ Debug::print(Debug::Plantuml,0,"*** %s Content :%s\n","PlantumlManager::print",qPrint(nb->content));
}
}
}
@@ -384,22 +390,22 @@ static void addPlantumlFiles(QDict< QList<QCString> > &plantumlFiles,
list->append(new QCString(value));
}
-static void addPlantumlContent(QDict< QCString > &plantumlContent,
- const QCString &key, const QCString &puContent)
+static void addPlantumlContent(QDict< PlantumlContent > &plantumlContent,
+ const QCString &key, const QCString &outDir, const QCString &puContent)
{
- QCString* content = plantumlContent.find(key);
+ PlantumlContent* content = plantumlContent.find(key);
if (content == 0)
{
- content = new QCString("");
+ content = new PlantumlContent("",outDir);
plantumlContent.insert(key,content);
}
- (*content)+=puContent;
+ (content->content)+=puContent;
}
void PlantumlManager::insert(const QCString &key, const QCString &value,
- OutputFormat format,const QCString &puContent)
+ const QCString &outDir,OutputFormat format,const QCString &puContent)
{
int find;
@@ -419,19 +425,19 @@ void PlantumlManager::insert(const QCString &key, const QCString &value,
case PUML_BITMAP:
addPlantumlFiles(m_pngPlantumlFiles,key,value);
print(m_pngPlantumlFiles);
- addPlantumlContent(m_pngPlantumlContent,key,puContent);
+ addPlantumlContent(m_pngPlantumlContent,key,outDir,puContent);
print(m_pngPlantumlContent);
break;
case PUML_EPS:
addPlantumlFiles(m_epsPlantumlFiles,key,value);
print(m_epsPlantumlFiles);
- addPlantumlContent(m_epsPlantumlContent,key,puContent);
+ addPlantumlContent(m_epsPlantumlContent,key,outDir,puContent);
print(m_epsPlantumlContent);
break;
case PUML_SVG:
addPlantumlFiles(m_svgPlantumlFiles,key,value);
print(m_svgPlantumlFiles);
- addPlantumlContent(m_svgPlantumlContent,key,puContent);
+ addPlantumlContent(m_svgPlantumlContent,key,outDir,puContent);
print(m_svgPlantumlContent);
break;
}
diff --git a/src/plantuml.h b/src/plantuml.h
index d3a01f5..f2e9dec 100644
--- a/src/plantuml.h
+++ b/src/plantuml.h
@@ -24,6 +24,17 @@
#define MIN_PLANTUML_COUNT 8
class QCString;
+struct PlantumlContent
+{
+ QCString outDir;
+ QCString content;
+ PlantumlContent(const QCString Content, const QCString OutDir)
+ {
+ outDir = OutDir;
+ content = Content;
+ };
+ ~PlantumlContent(){};
+};
/** Singleton that manages plantuml relation actions */
class PlantumlManager
@@ -58,15 +69,16 @@ class PlantumlManager
~PlantumlManager();
void insert(const QCString &key,
const QCString &value,
+ const QCString &outDir,
OutputFormat format,
const QCString &puContent);
static PlantumlManager *m_theInstance;
QDict< QList<QCString> > m_pngPlantumlFiles;
QDict< QList<QCString> > m_svgPlantumlFiles;
QDict< QList<QCString> > m_epsPlantumlFiles;
- QDict< QCString > m_pngPlantumlContent; // use circular queue for using multi-processor (multi threading)
- QDict< QCString > m_svgPlantumlContent;
- QDict< QCString > m_epsPlantumlContent;
+ QDict< PlantumlContent > m_pngPlantumlContent; // use circular queue for using multi-processor (multi threading)
+ QDict< PlantumlContent > m_svgPlantumlContent;
+ QDict< PlantumlContent > m_epsPlantumlContent;
QCString m_cachedPlantumlAllContent; // read from CACHE_FILENAME file
QCString m_currentPlantumlAllContent; // processing plantuml then write it into CACHE_FILENAME to reuse the next time as cache information
};
diff --git a/src/portable.cpp b/src/portable.cpp
index e191b26..0ffbd49 100644
--- a/src/portable.cpp
+++ b/src/portable.cpp
@@ -196,7 +196,7 @@ int Portable::system(const char *command,const char *args,bool commandHasConsole
}
-unsigned int Portable::pid(void)
+unsigned int Portable::pid()
{
unsigned int pid;
#if !defined(_WIN32) || defined(__CYGWIN__)
@@ -207,11 +207,6 @@ unsigned int Portable::pid(void)
return pid;
}
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#else
- static char **last_environ;
-#endif
-
#if !defined(_WIN32) || defined(__CYGWIN__)
void loadEnvironment()
{
@@ -261,9 +256,6 @@ void Portable::unsetenv(const char *variable)
SetEnvironmentVariable(variable,0);
#else
/* Some systems don't have unsetenv(), so we do it ourselves */
- size_t len;
- char **ep;
-
if (variable == NULL || *variable == '\0' || strchr (variable, '=') != NULL)
{
return; // not properly formatted
@@ -330,7 +322,7 @@ FILE *Portable::fopen(const char *fileName,const char *mode)
#endif
}
-char Portable::pathSeparator(void)
+char Portable::pathSeparator()
{
#if defined(_WIN32) && !defined(__CYGWIN__)
return '\\';
@@ -339,7 +331,7 @@ char Portable::pathSeparator(void)
#endif
}
-char Portable::pathListSeparator(void)
+char Portable::pathListSeparator()
{
#if defined(_WIN32) && !defined(__CYGWIN__)
return ';';
@@ -348,16 +340,77 @@ char Portable::pathListSeparator(void)
#endif
}
-const char *Portable::ghostScriptCommand(void)
+static bool ExistsOnPath(const char *fileName)
+{
+ QFileInfo fi1(fileName);
+ if (fi1.exists()) return true;
+
+ const char *p = Portable::getenv("PATH");
+ char listSep = Portable::pathListSeparator();
+ char pathSep = Portable::pathSeparator();
+ QCString paths(p);
+ int strt = 0;
+ int idx;
+ while ((idx = paths.find(listSep,strt)) != -1)
+ {
+ QCString locFile(paths.mid(strt,idx-strt));
+ locFile += pathSep;
+ locFile += fileName;
+ QFileInfo fi(locFile);
+ if (fi.exists()) return true;
+ strt = idx + 1;
+ }
+ // to be sure the last path component is checked as well
+ QCString locFile(paths.mid(strt));
+ if (!locFile.isEmpty())
+ {
+ locFile += pathSep;
+ locFile += fileName;
+ QFileInfo fi(locFile);
+ if (fi.exists()) return true;
+ }
+ return false;
+}
+
+bool Portable::checkForExecutable(const char *fileName)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ char *extensions[] = {".bat",".com",".exe"};
+ for (int i = 0; i < sizeof(extensions) / sizeof(*extensions); i++)
+ {
+ if (ExistsOnPath(QCString(fileName) + extensions[i])) return true;
+ }
+ return false;
+#else
+ return ExistsOnPath(fileName);
+#endif
+}
+
+const char *Portable::ghostScriptCommand()
{
#if defined(_WIN32) && !defined(__CYGWIN__)
- return "gswin32c.exe";
+ static char *gsexe = NULL;
+ if (!gsexe)
+ {
+ char *gsExec[] = {"gswin32c.exe","gswin64c.exe"};
+ for (int i = 0; i < sizeof(gsExec) / sizeof(*gsExec); i++)
+ {
+ if (ExistsOnPath(gsExec[i]))
+ {
+ gsexe = gsExec[i];
+ return gsexe;
+ }
+ }
+ gsexe = gsExec[0];
+ return gsexe;
+ }
+ return gsexe;
#else
return "gs";
#endif
}
-const char *Portable::commandExtension(void)
+const char *Portable::commandExtension()
{
#if defined(_WIN32) && !defined(__CYGWIN__)
return ".exe";
@@ -366,7 +419,7 @@ const char *Portable::commandExtension(void)
#endif
}
-bool Portable::fileSystemIsCaseSensitive(void)
+bool Portable::fileSystemIsCaseSensitive()
{
#if defined(_WIN32) || defined(macintosh) || defined(__MACOSX__) || defined(__APPLE__) || defined(__CYGWIN__)
return FALSE;
@@ -393,17 +446,17 @@ int Portable::pclose(FILE *stream)
#endif
}
-void Portable::sysTimerStart(void)
+void Portable::sysTimerStart()
{
g_time.start();
}
-void Portable::sysTimerStop(void)
+void Portable::sysTimerStop()
{
g_sysElapsedTime+=((double)g_time.elapsed())/1000.0;
}
-double Portable::getSysElapsedTime(void)
+double Portable::getSysElapsedTime()
{
return g_sysElapsedTime;
}
@@ -439,7 +492,7 @@ bool Portable::isAbsolutePath(const char *fileName)
*
* This routine was inspired by the cause for bug 766059 was that in the Windows path there were forward slashes.
*/
-void Portable::correct_path(void)
+void Portable::correct_path()
{
#if defined(_WIN32) && !defined(__CYGWIN__)
const char *p = Portable::getenv("PATH");
@@ -458,7 +511,7 @@ void Portable::unlink(const char *fileName)
#endif
}
-void Portable::setShortDir(void)
+void Portable::setShortDir()
{
#if defined(_WIN32) && !defined(__CYGWIN__)
long length = 0;
@@ -518,3 +571,12 @@ const char *Portable::strnstr(const char *haystack, const char *needle, size_t h
}
return 0;
}
+
+const char *Portable::devNull()
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ return "NUL";
+#else
+ return "/dev/null";
+#endif
+}
diff --git a/src/portable.h b/src/portable.h
index 771108e..d2b3036 100644
--- a/src/portable.h
+++ b/src/portable.h
@@ -20,7 +20,7 @@ typedef off_t portable_off_t;
namespace Portable
{
int system(const char *command,const char *args,bool commandHasConsole=true);
- unsigned int pid(void);
+ unsigned int pid();
const char * getenv(const char *variable);
void setenv(const char *variable,const char *value);
void unsetenv(const char *variable);
@@ -28,21 +28,23 @@ namespace Portable
portable_off_t ftell(FILE *f);
FILE * fopen(const char *fileName,const char *mode);
void unlink(const char *fileName);
- char pathSeparator(void);
- char pathListSeparator(void);
- const char * ghostScriptCommand(void);
- const char * commandExtension(void);
+ char pathSeparator();
+ char pathListSeparator();
+ const char * ghostScriptCommand();
+ const char * commandExtension();
bool fileSystemIsCaseSensitive();
FILE * popen(const char *name,const char *type);
int pclose(FILE *stream);
- void sysTimerStart(void);
- void sysTimerStop(void);
- double getSysElapsedTime(void);
+ void sysTimerStart();
+ void sysTimerStop();
+ double getSysElapsedTime();
void sleep(int ms);
bool isAbsolutePath(const char *fileName);
- void correct_path(void);
- void setShortDir(void);
+ void correct_path();
+ void setShortDir();
const char * strnstr(const char *haystack, const char *needle, size_t haystack_len);
+ const char * devNull();
+ bool checkForExecutable(const char *fileName);
}
diff --git a/src/pre.l b/src/pre.l
index a26c044..4a86562 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,6 +16,9 @@
%option prefix="preYY"
%option reentrant
%option extra-type="struct preYY_state *"
+%top{
+#include <stdint.h>
+}
%{
@@ -25,24 +26,28 @@
* includes
*/
+#include "doxygen.h"
+
+#include <stack>
+#include <deque>
+#include <algorithm>
+#include <utility>
+#include <mutex>
+#include <thread>
+
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
-#include <qarray.h>
-#include <qstack.h>
-#include <qfile.h>
-#include <qstrlist.h>
-#include <qdict.h>
+#include <qcstring.h>
#include <qregexp.h>
#include <qfileinfo.h>
-#include <qdir.h>
-
+
+#include "containers.h"
#include "pre.h"
#include "constexp.h"
#include "define.h"
-#include "doxygen.h"
#include "message.h"
#include "util.h"
#include "defargs.h"
@@ -55,20 +60,22 @@
#include "condparser.h"
#include "config.h"
#include "filedef.h"
-#include "memberdef.h"
-#include "membername.h"
#define YY_NO_UNISTD_H 1
+#define USE_STATE2STRING 0
+
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
#define DBG_CTX(x) do { } while(0)
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
struct CondCtx
{
- CondCtx(int line,QCString id,bool b)
+ CondCtx(int line,QCString id,bool b)
: lineNr(line),sectionId(id), skip(b) {}
int lineNr;
QCString sectionId;
@@ -77,247 +84,160 @@ struct CondCtx
struct FileState
{
- FileState(int size) : lineNr(1), curlyCount(0),fileBuf(size),
- oldFileBuf(0), oldFileBufPos(0), bufState(0) {}
- int lineNr;
- int curlyCount;
+ FileState(int size) : fileBuf(size) {}
+ int lineNr = 1;
+ int curlyCount = 0;
BufStr fileBuf;
- BufStr *oldFileBuf;
- int oldFileBufPos;
- YY_BUFFER_STATE bufState;
+ BufStr *oldFileBuf = 0;
+ yy_size_t oldFileBufPos = 0;
+ YY_BUFFER_STATE bufState = 0;
QCString fileName;
-};
+};
-/** @brief Singleton that manages the defines available while
- * preprocessing files.
- */
-class DefineManager
+struct PreIncludeInfo
{
- /** Local class used to hold the defines for a single file */
- class DefinesPerFile
+ PreIncludeInfo(const char *fn,FileDef *srcFd, FileDef *dstFd,const char *iName,bool loc, bool imp)
+ : fileName(fn), fromFileDef(srcFd), toFileDef(dstFd), includeName(iName), local(loc), imported(imp)
{
- public:
- /** Creates an empty container for defines */
- DefinesPerFile(DefineManager *parent)
- : m_parent(parent), m_defines(257), m_includedFiles(17)
- {
- m_defines.setAutoDelete(TRUE);
- }
- /** Destroys the object */
- virtual ~DefinesPerFile()
- {
- }
- /** Adds a define in the context of a file. Will replace
- * an existing define with the same name (redefinition)
- * @param def The Define object to add.
- */
- void addDefine(Define *def)
- {
- Define *d = m_defines.find(def->name);
- if (d!=0) // redefine
- {
- m_defines.remove(d->name);
- }
- m_defines.insert(def->name,def);
- }
- /** Adds an include file for this file
- * @param fileName The name of the include file
- */
- void addInclude(const char *fileName)
- {
- m_includedFiles.insert(fileName,(void*)0x8);
- }
- void collectDefines(DefineDict *dict,QDict<void> &includeStack);
- private:
- DefineManager *m_parent;
- DefineDict m_defines;
- QDict<void> m_includedFiles;
- };
+ }
+ QCString fileName; // file name in which the include statement was found
+ FileDef *fromFileDef; // filedef in which the include statement was found
+ FileDef *toFileDef; // filedef to which the include is pointing
+ QCString includeName; // name used in the #include statement
+ bool local; // is it a "local" or <global> include
+ bool imported; // include via "import" keyword (Objective-C)
+};
- public:
- friend class DefinesPerFile;
+/** A dictionary of managed Define objects. */
+typedef std::map< std::string, Define > DefineMap;
- /** Creates a new DefineManager object */
- DefineManager() : m_fileMap(1009), m_contextDefines(1009)
+/** @brief Class that manages the defines available while
+ * preprocessing files.
+ */
+class DefineManager
+{
+ private:
+ /** Local class used to hold the defines for a single file */
+ class DefinesPerFile
{
- m_fileMap.setAutoDelete(TRUE);
- }
+ public:
+ /** Creates an empty container for defines */
+ DefinesPerFile(DefineManager *parent)
+ : m_parent(parent)
+ {
+ }
+ void addInclude(std::string fileName)
+ {
+ m_includedFiles.insert(fileName);
+ }
+ void store(const DefineMap &fromMap)
+ {
+ for (auto &kv : fromMap)
+ {
+ m_defines.emplace(kv.first,kv.second);
+ }
+ //printf(" m_defines.size()=%zu\n",m_defines.size());
+ m_stored=true;
+ }
+ void retrieve(DefineMap &toMap)
+ {
+ StringSet includeStack;
+ retrieveRec(toMap,includeStack);
+ }
+ void retrieveRec(DefineMap &toMap,StringSet &includeStack)
+ {
+ //printf(" retrieveRec #includedFiles=%zu\n",m_includedFiles.size());
+ for (auto incFile : m_includedFiles)
+ {
+ DefinesPerFile *dpf = m_parent->find(incFile);
+ if (dpf && includeStack.find(incFile)==includeStack.end())
+ {
+ includeStack.insert(incFile);
+ dpf->retrieveRec(toMap,includeStack);
+ //printf(" retrieveRec: processing include %s: #toMap=%zu\n",incFile.data(),toMap.size());
+ }
+ }
+ for (auto &kv : m_defines)
+ {
+ toMap.emplace(kv.first,kv.second);
+ }
+ }
+ bool stored() const { return m_stored; }
+ private:
+ DefineManager *m_parent;
+ DefineMap m_defines;
+ StringSet m_includedFiles;
+ bool m_stored = false;
+ };
- /** Destroys the object */
- virtual ~DefineManager()
- {
- }
+ friend class DefinesPerFile;
+ public:
- /** Starts a context in which defines are collected.
- * Called at the start of a new file that is preprocessed.
- * @param fileName the name of the file to process.
- */
- void startContext(const char *fileName)
+ void addInclude(std::string fromFileName,std::string toFileName)
{
- //printf("DefineManager::startContext()\n");
- m_contextDefines.clear();
- if (fileName==0) return;
- DefinesPerFile *dpf = m_fileMap.find(fileName);
- if (dpf==0)
+ //printf("DefineManager::addInclude('%s'->'%s')\n",fromFileName.c_str(),toFileName.c_str());
+ auto it = m_fileMap.find(fromFileName);
+ if (it==m_fileMap.end())
{
- //printf("New file!\n");
- dpf = new DefinesPerFile(this);
- m_fileMap.insert(fileName,dpf);
- }
- }
- /** Ends the context started with startContext() freeing any
- * defines collected within in this context.
- */
- void endContext()
- {
- //printf("DefineManager::endContext()\n");
- m_contextDefines.clear();
- }
- /** Add an included file to the current context.
- * If the file has been pre-processed already, all defines are added
- * to the context.
- * @param fileName The name of the include file to add to the context.
- */
- void addFileToContext(const char *fileName)
- {
- if (fileName==0) return;
- //printf("DefineManager::addFileToContext(%s)\n",fileName);
- DefinesPerFile *dpf = m_fileMap.find(fileName);
- if (dpf==0)
- {
- //printf("New file!\n");
- dpf = new DefinesPerFile(this);
- m_fileMap.insert(fileName,dpf);
- }
- else
- {
- //printf("existing file!\n");
- QDict<void> includeStack(17);
- dpf->collectDefines(&m_contextDefines,includeStack);
+ it = m_fileMap.emplace(fromFileName,std::make_unique<DefinesPerFile>(this)).first;
}
+ auto &dpf = it->second;
+ dpf->addInclude(toFileName);
}
- /** Add a define to the manager object.
- * @param fileName The file in which the define was found
- * @param def The Define object to add.
- */
- void addDefine(const char *fileName,Define *def)
+ void store(std::string fileName,const DefineMap &fromMap)
{
- if (fileName==0) return;
- //printf("DefineManager::addDefine(%s,%s)\n",fileName,def->name.data());
- Define *d = m_contextDefines.find(def->name);
- if (d!=0) // redefine
+ //printf("DefineManager::store(%s,#=%zu)\n",fileName.c_str(),fromMap.size());
+ auto it = m_fileMap.find(fileName);
+ if (it==m_fileMap.end())
{
- m_contextDefines.remove(d->name);
+ it = m_fileMap.emplace(fileName,std::make_unique<DefinesPerFile>(this)).first;
}
- m_contextDefines.insert(def->name,def);
-
- DefinesPerFile *dpf = m_fileMap.find(fileName);
- if (dpf==0)
- {
- dpf = new DefinesPerFile(this);
- m_fileMap.insert(fileName,dpf);
- }
- dpf->addDefine(def);
+ it->second->store(fromMap);
}
- /** Add an include relation to the manager object.
- * @param fromFileName file name in which the include was found.
- * @param toFileName file name that is included.
- */
- void addInclude(const char *fromFileName,const char *toFileName)
+ void retrieve(std::string fileName,DefineMap &toMap)
{
- //printf("DefineManager::addInclude(%s,%s)\n",fromFileName,toFileName);
- if (fromFileName==0 || toFileName==0) return;
- DefinesPerFile *dpf = m_fileMap.find(fromFileName);
- if (dpf==0)
+ auto it = m_fileMap.find(fileName);
+ if (it!=m_fileMap.end())
{
- dpf = new DefinesPerFile(this);
- m_fileMap.insert(fromFileName,dpf);
+ auto &dpf = it->second;
+ dpf->retrieve(toMap);
}
- dpf->addInclude(toFileName);
- }
- /** Returns a Define object given its name or 0 if the Define does
- * not exist.
- */
- Define *isDefined(const char *name) const
- {
- Define *d = m_contextDefines.find(name);
- if (d && d->undef) d=0;
- //printf("isDefined(%s)=%p\n",name,d);
- return d;
- }
- /** Returns a reference to the defines found in the current context. */
- const DefineDict &defineContext() const
- {
- return m_contextDefines;
+ //printf("DefineManager::retrieve(%s,#=%zu)\n",fileName.c_str(),toMap.size());
}
- private:
- /** Helper function to collect all define for a given file */
- void collectDefinesForFile(const char *fileName,DefineDict *dict)
+ bool alreadyProcessed(std::string fileName) const
{
- if (fileName==0) return;
- DefinesPerFile *dpf = m_fileMap.find(fileName);
- if (dpf)
+ auto it = m_fileMap.find(fileName);
+ if (it!=m_fileMap.end())
{
- QDict<void> includeStack(17);
- dpf->collectDefines(dict,includeStack);
+ return it->second->stored();
}
+ return false;
}
+ private:
/** Helper function to return the DefinesPerFile object for a given file name. */
- DefinesPerFile *find(const char *fileName) const
+ DefinesPerFile *find(std::string fileName) const
{
- if (fileName==0) return 0;
- return m_fileMap.find(fileName);
+ auto it = m_fileMap.find(fileName);
+ return it!=m_fileMap.end() ? it->second.get() : nullptr;
}
- QDict<DefinesPerFile> m_fileMap;
- DefineDict m_contextDefines;
+ std::unordered_map< std::string, std::unique_ptr<DefinesPerFile> > m_fileMap;
};
-/** Collects all defines for a file and all files that the file includes.
- * This function will recursively call itself for each file.
- * @param dict The dictionary to fill with the defines. A redefine will
- * replace a previous definition.
- * @param includeStack The stack of includes, used to stop recursion in
- * case there is a cyclic include dependency.
+/* -----------------------------------------------------------------
+ *
+ * global state
*/
-void DefineManager::DefinesPerFile::collectDefines(
- DefineDict *dict,QDict<void> &includeStack)
-{
- //printf("DefinesPerFile::collectDefines #defines=%d\n",m_defines.count());
- {
- QDictIterator<void> di(m_includedFiles);
- for (di.toFirst();(di.current());++di)
- {
- QCString incFile = di.currentKey();
- DefinesPerFile *dpf = m_parent->find(incFile);
- if (dpf && includeStack.find(incFile)==0)
- {
- //printf(" processing include %s\n",incFile.data());
- includeStack.insert(incFile,(void*)0x8);
- dpf->collectDefines(dict,includeStack);
- }
- }
- }
- {
- QDictIterator<Define> di(m_defines);
- Define *def;
- for (di.toFirst();(def=di.current());++di)
- {
- Define *d = dict->find(def->name);
- if (d!=0) // redefine
- {
- dict->remove(d->name);
- }
- dict->insert(def->name,def);
- //printf(" adding define %s\n",def->name.data());
- }
- }
-}
+static std::mutex g_debugMutex;
+static std::mutex g_globalDefineMutex;
+static std::mutex g_updateGlobals;
+static DefineManager g_defineManager;
+
/* -----------------------------------------------------------------
*
@@ -326,62 +246,64 @@ void DefineManager::DefinesPerFile::collectDefines(
struct preYY_state
{
- preYY_state() : allIncludes(10009) {}
- int yyLineNr = 1;
- int yyMLines = 1;
- int yyColNr = 1;
+ int yyLineNr = 1;
+ int yyMLines = 1;
+ int yyColNr = 1;
QCString yyFileName;
- FileDef *yyFileDef;
- FileDef *inputFileDef;
- int ifcount = 0;
- QStrList *pathList = 0;
- QStack<FileState> includeStack;
- QDict<int> *argDict = 0;
- int defArgs = -1;
+ FileDef *yyFileDef = 0;
+ FileDef *inputFileDef = 0;
+ int ifcount = 0;
+ int defArgs = -1;
QCString defName;
QCString defText;
QCString defLitText;
QCString defArgsStr;
QCString defExtraSpacing;
- bool defVarArgs;
- int level;
- int lastCContext;
- int lastCPPContext;
- QArray<int> levelGuard;
- BufStr *inputBuf = 0;
- int inputBufPos;
- BufStr *outputBuf = 0;
- int roundCount;
- bool quoteArg;
- DefineDict *expandedDict = 0;
- int findDefArgContext;
- bool expectGuard;
+ bool defVarArgs = false;
+ int lastCContext = 0;
+ int lastCPPContext = 0;
+ BufStr *inputBuf = 0;
+ yy_size_t inputBufPos = 0;
+ BufStr *outputBuf = 0;
+ int roundCount = 0;
+ bool quoteArg = false;
+ int findDefArgContext = 0;
+ bool expectGuard = false;
QCString guardName;
QCString lastGuardName;
QCString incName;
QCString guardExpr;
- int curlyCount;
- bool nospaces; // add extra spaces during macro expansion
-
- bool macroExpansion; // from the configuration
- bool expandOnlyPredef; // from the configuration
- int commentCount;
- bool insideComment;
- bool isImported;
+ int curlyCount = 0;
+ bool nospaces = false; // add extra spaces during macro expansion
+
+ bool macroExpansion = false; // from the configuration
+ bool expandOnlyPredef = false; // from the configuration
+ int commentCount = 0;
+ bool insideComment = false;
+ bool isImported = false;
QCString blockName;
- int condCtx;
- bool skip;
- QStack<CondCtx> condStack;
- bool insideCS; // C# has simpler preprocessor
- bool isSource;
-
- int fenceSize = 0;
- bool ccomment;
+ int condCtx = 0;
+ bool skip = false;
+ bool insideCS = false; // C# has simpler preprocessor
+ bool insideFtn = false;
+ bool isSource = false;
+
+ yy_size_t fenceSize = 0;
+ bool ccomment = false;
QCString delimiter;
- QDict<void> allIncludes;
- QDict<void> expansionDict;
- DefineManager defineManager;
- ConstExpressionParser constExpParser;
+ bool isSpecialComment = false;
+ StringVector pathList;
+ IntMap argMap;
+ BoolStack levelGuard;
+ std::stack< std::unique_ptr<CondCtx> > condStack;
+ std::deque< std::unique_ptr<FileState> > includeStack;
+ std::unordered_map<std::string,Define*> expandedDict;
+ StringUnorderedSet expanded;
+ ConstExpressionParser constExpParser;
+ DefineMap contextDefines; // macros imported from other files
+ DefineMap localDefines; // macros defined in this file
+ DefineList macroDefinitions;
+ LinkedMap<PreIncludeInfo> includeRelations;
};
// stateless functions
@@ -401,10 +323,11 @@ static bool otherCaseDone(yyscan_t yyscanner);
static bool computeExpression(yyscan_t yyscanner,const QCString &expr);
static void startCondSection(yyscan_t yyscanner,const char *sectId);
static void endCondSection(yyscan_t yyscanner);
+static void addMacroDefinition(yyscan_t yyscanner);
static void addDefine(yyscan_t yyscanner);
-static Define * newDefine(yyscan_t yyscanner);
static void setFileName(yyscan_t yyscanner,const char *name);
-static int yyread(yyscan_t yyscanner,char *buf,int max_size);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+static Define * isDefined(yyscan_t yyscanner,const char *name);
/* ----------------------------------------------------------------- */
@@ -472,7 +395,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<*>"??"[=/'()!<>-] { // Trigraph
unput(resolveTrigraph(yytext[2]));
}
-<Start>^{B}*"#" { BEGIN(Command); yyextra->yyColNr+=yyleng; yyextra->yyMLines=0;}
+<Start>^{B}*"#" { BEGIN(Command); yyextra->yyColNr+=(int)yyleng; yyextra->yyMLines=0;}
<Start>^{B}*/[^#] {
outputArray(yyscanner,yytext,(int)yyleng);
BEGIN(CopyLine);
@@ -492,12 +415,12 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
name=name.left(name.find('(')).stripWhiteSpace();
Define *def=0;
- if (skipFuncMacros &&
+ if (skipFuncMacros && !yyextra->insideFtn &&
name!="Q_PROPERTY" &&
!(
- (yyextra->includeStack.isEmpty() || yyextra->curlyCount>0) &&
+ (yyextra->includeStack.empty() || yyextra->curlyCount>0) &&
yyextra->macroExpansion &&
- (def=yyextra->defineManager.isDefined(name)) &&
+ (def=isDefined(yyscanner,name)) &&
/*macroIsAccessible(def) &&*/
(!yyextra->expandOnlyPredef || def->isPredefined)
)
@@ -528,14 +451,14 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
BEGIN(CopyRawString);
}
<CopyLine>"{" { // count brackets inside the main file
- if (yyextra->includeStack.isEmpty())
+ if (yyextra->includeStack.empty())
{
yyextra->curlyCount++;
}
outputChar(yyscanner,*yytext);
}
<CopyLine>"}" { // count brackets inside the main file
- if (yyextra->includeStack.isEmpty() && yyextra->curlyCount>0)
+ if (yyextra->includeStack.empty() && yyextra->curlyCount>0)
{
yyextra->curlyCount--;
}
@@ -623,16 +546,16 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
yyextra->expectGuard = FALSE;
Define *def=0;
//def=yyextra->globalDefineDict->find(yytext);
- //def=yyextra->defineManager.isDefined(yytext);
- //printf("Search for define %s found=%d yyextra->includeStack.isEmpty()=%d "
+ //def=isDefined(yyscanner,yytext);
+ //printf("Search for define %s found=%d yyextra->includeStack.empty()=%d "
// "yyextra->curlyCount=%d yyextra->macroExpansion=%d yyextra->expandOnlyPredef=%d "
// "isPreDefined=%d\n",yytext,def ? 1 : 0,
- // yyextra->includeStack.isEmpty(),yyextra->curlyCount,yyextra->macroExpansion,yyextra->expandOnlyPredef,
+ // yyextra->includeStack.empty(),yyextra->curlyCount,yyextra->macroExpansion,yyextra->expandOnlyPredef,
// def ? def->isPredefined : -1
// );
- if ((yyextra->includeStack.isEmpty() || yyextra->curlyCount>0) &&
+ if ((yyextra->includeStack.empty() || yyextra->curlyCount>0) &&
yyextra->macroExpansion &&
- (def=yyextra->defineManager.isDefined(yytext)) &&
+ (def=isDefined(yyscanner,yytext)) &&
/*(def->isPredefined || macroIsAccessible(def)) && */
(!yyextra->expandOnlyPredef || def->isPredefined)
)
@@ -658,9 +581,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<CopyLine>{ID} {
Define *def=0;
- if ((yyextra->includeStack.isEmpty() || yyextra->curlyCount>0) &&
+ if ((yyextra->includeStack.empty() || yyextra->curlyCount>0) &&
yyextra->macroExpansion &&
- (def=yyextra->defineManager.isDefined(yytext)) &&
+ (def=isDefined(yyscanner,yytext)) &&
def->nargs==-1 &&
/*(def->isPredefined || macroIsAccessible(def)) &&*/
(!yyextra->expandOnlyPredef || def->isPredefined)
@@ -792,7 +715,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<Command>("cmake")?"define"{B}+ {
//printf("!!!DefName\n");
- yyextra->yyColNr+=yyleng;
+ yyextra->yyColNr+=(int)yyleng;
BEGIN(DefName);
}
<Command>"ifdef"/{B}*"(" {
@@ -834,7 +757,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
}
<Command>"else"/[^a-z_A-Z0-9\x80-\xFF] {
- //printf("else yyextra->levelGuard[%d]=%d\n",yyextra->level-1,yyextra->levelGuard[yyextra->level-1]);
if (otherCaseDone(yyscanner))
{
yyextra->ifcount=0;
@@ -843,7 +765,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
else
{
setCaseDone(yyscanner,TRUE);
- //yyextra->levelGuard[yyextra->level-1]=TRUE;
}
}
<Command>"undef"{B}+ {
@@ -876,10 +797,10 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
yyextra->yyLineNr++;
}
<IgnoreLine>.
-<Command>. {yyextra->yyColNr+=yyleng;}
+<Command>. {yyextra->yyColNr+=(int)yyleng;}
<UndefName>{ID} {
Define *def;
- if ((def=yyextra->defineManager.isDefined(yytext))
+ if ((def=isDefined(yyscanner,yytext))
/*&& !def->isPredefined*/
&& !def->nonRecursive
)
@@ -909,7 +830,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
// yyextra->guardExpr.data());
bool guard=computeExpression(yyscanner,yyextra->guardExpr);
setCaseDone(yyscanner,guard);
- //printf("if yyextra->levelGuard[%d]=%d\n",yyextra->level-1,yyextra->levelGuard[yyextra->level-1]);
if (guard)
{
BEGIN(Start);
@@ -922,7 +842,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<DefinedExpr1,DefinedExpr2>\\\n { yyextra->yyLineNr++; outputChar(yyscanner,'\n'); }
<DefinedExpr1>{ID} {
- if (yyextra->defineManager.isDefined(yytext) || yyextra->guardName==yytext)
+ if (isDefined(yyscanner,yytext) || yyextra->guardName==yytext)
yyextra->guardExpr+=" 1L ";
else
yyextra->guardExpr+=" 0L ";
@@ -930,7 +850,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
BEGIN(Guard);
}
<DefinedExpr2>{ID} {
- if (yyextra->defineManager.isDefined(yytext) || yyextra->guardName==yytext)
+ if (isDefined(yyscanner,yytext) || yyextra->guardName==yytext)
yyextra->guardExpr+=" 1L ";
else
yyextra->guardExpr+=" 0L ";
@@ -1060,10 +980,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<DefName>{ID}/("\\\n")*"(" { // define with argument
//printf("Define() '%s'\n",yytext);
- delete yyextra->argDict;
- yyextra->argDict = new QDict<int>(31);
- yyextra->argDict->setAutoDelete(TRUE);
- yyextra->defArgs = 0;
+ yyextra->argMap.clear();
+ yyextra->defArgs = 0;
yyextra->defArgsStr.resize(0);
yyextra->defText.resize(0);
yyextra->defLitText.resize(0);
@@ -1074,7 +992,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<DefName>{ID}{B}+"1"/[ \r\t\n] { // special case: define with 1 -> can be "guard"
//printf("Define '%s'\n",yytext);
- delete yyextra->argDict; yyextra->argDict=0;
+ yyextra->argMap.clear();
yyextra->defArgs = -1;
yyextra->defArgsStr.resize(0);
yyextra->defName = yytext;
@@ -1103,7 +1021,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
yyextra->expectGuard=FALSE;
}
<DefName>{ID}/{B}*"\n" { // empty define
- delete yyextra->argDict; yyextra->argDict=0;
+ yyextra->argMap.clear();
yyextra->defArgs = -1;
yyextra->defName = yytext;
yyextra->defArgsStr.resize(0);
@@ -1132,7 +1050,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<DefName>{ID}/{B}* { // define with content
//printf("Define '%s'\n",yytext);
- delete yyextra->argDict; yyextra->argDict=0;
+ yyextra->argMap.clear();
yyextra->defArgs = -1;
yyextra->defArgsStr.resize(0);
yyextra->defText.resize(0);
@@ -1162,7 +1080,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<DefineArg>"..." { // Variadic macro
yyextra->defVarArgs = TRUE;
yyextra->defArgsStr+=yytext;
- yyextra->argDict->insert("__VA_ARGS__",new int(yyextra->defArgs));
+ yyextra->argMap.emplace(std::string("__VA_ARGS__"),yyextra->defArgs);
yyextra->defArgs++;
}
<DefineArg>{ID}{B}*("..."?) {
@@ -1175,7 +1093,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
argName = argName.stripWhiteSpace();
yyextra->defArgsStr+=yytext;
- yyextra->argDict->insert(argName,new int(yyextra->defArgs));
+ yyextra->argMap.emplace(toStdString(argName),yyextra->defArgs);
yyextra->defArgs++;
}
/*
@@ -1229,27 +1147,27 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<SkipCComment>^({B}*"*"+)?{B}{0,3}"~~~"[~]* {
bool markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
- if (!markdownSupport)
+ if (!markdownSupport || !yyextra->isSpecialComment)
{
REJECT;
}
else
{
outputArray(yyscanner,yytext,(int)yyleng);
- yyextra->fenceSize=yyleng;
+ yyextra->fenceSize=(int)yyleng;
BEGIN(SkipVerbatim);
}
}
<SkipCComment>^({B}*"*"+)?{B}{0,3}"```"[`]* {
bool markdownSupport = Config_getBool(MARKDOWN_SUPPORT);
- if (!markdownSupport)
+ if (!markdownSupport || !yyextra->isSpecialComment)
{
REJECT;
}
else
{
outputArray(yyscanner,yytext,(int)yyleng);
- yyextra->fenceSize=yyleng;
+ yyextra->fenceSize=(int)yyleng;
BEGIN(SkipVerbatim);
}
}
@@ -1389,14 +1307,14 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<SkipVerbatim>^({B}*"*"+)?{B}{0,3}"~~~"[~]* {
outputArray(yyscanner,yytext,(int)yyleng);
- if (yyextra->fenceSize==yyleng)
+ if (yyextra->fenceSize==(yy_size_t)yyleng)
{
BEGIN(SkipCComment);
}
}
<SkipVerbatim>^({B}*"*"+)?{B}{0,3}"```"[`]* {
outputArray(yyscanner,yytext,(int)yyleng);
- if (yyextra->fenceSize==yyleng)
+ if (yyextra->fenceSize==(yy_size_t)yyleng)
{
BEGIN(SkipCComment);
}
@@ -1485,15 +1403,12 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
if (yyextra->defArgs>0)
{
- int *n;
- if ((n=(*yyextra->argDict)[yytext]))
+ auto it = yyextra->argMap.find(yytext);
+ if (it!=yyextra->argMap.end())
{
- //if (!yyextra->quoteArg) yyextra->defText+=' ';
+ int n = it->second;
yyextra->defText+='@';
- QCString numStr;
- numStr.sprintf("%d",*n);
- yyextra->defText+=numStr;
- //if (!yyextra->quoteArg) yyextra->defText+=' ';
+ yyextra->defText+=QCString().setNum(n);
}
else
{
@@ -1532,22 +1447,15 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
outputChar(yyscanner,'\n');
Define *def=0;
//printf("Define name='%s' text='%s' litTexti='%s'\n",yyextra->defName.data(),yyextra->defText.data(),yyextra->defLitText.data());
- if (yyextra->includeStack.isEmpty() || yyextra->curlyCount>0)
+ if (yyextra->includeStack.empty() || yyextra->curlyCount>0)
{
- addDefine(yyscanner);
+ addMacroDefinition(yyscanner);
}
- def=yyextra->defineManager.isDefined(yyextra->defName);
+ def=isDefined(yyscanner,yyextra->defName);
if (def==0) // new define
{
//printf("new define '%s'!\n",yyextra->defName.data());
- Define *nd = newDefine(yyscanner);
- yyextra->defineManager.addDefine(yyextra->yyFileName,nd);
-
- // also add it to the local file list if it is a source file
- //if (yyextra->isSource && yyextra->includeStack.isEmpty())
- //{
- // yyextra->fileDefineDict->insert(yyextra->defName,nd);
- //}
+ addDefine(yyscanner);
}
else if (def /*&& macroIsAccessible(def)*/)
// name already exists
@@ -1569,7 +1477,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
//printf("error: define %s is defined more than once!\n",yyextra->defName.data());
}
}
- delete yyextra->argDict; yyextra->argDict=0;
+ yyextra->argMap.clear();
yyextra->yyLineNr++;
yyextra->yyColNr=1;
yyextra->lastGuardName.resize(0);
@@ -1594,7 +1502,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
}
<SkipDoubleQuote>"//"[/]? { yyextra->defText += yytext; yyextra->defLitText+=yytext; }
-<SkipDoubleQuote>"/*" { yyextra->defText += yytext; yyextra->defLitText+=yytext; }
+<SkipDoubleQuote>"/*"[*]? { yyextra->defText += yytext; yyextra->defLitText+=yytext; }
<SkipDoubleQuote>\" {
yyextra->defText += *yytext; yyextra->defLitText+=yytext;
BEGIN(DefineText);
@@ -1611,15 +1519,16 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<DefineText>. { yyextra->defText += *yytext; yyextra->defLitText+=yytext; }
<<EOF>> {
DBG_CTX((stderr,"End of include file\n"));
- //printf("Include stack depth=%d\n",yyextra->includeStack.count());
- if (yyextra->includeStack.isEmpty())
+ //printf("Include stack depth=%d\n",yyextra->includeStack.size());
+ if (yyextra->includeStack.empty())
{
DBG_CTX((stderr,"Terminating scanner!\n"));
yyterminate();
}
else
{
- FileState *fs=yyextra->includeStack.pop();
+ QCString toFileName = yyextra->yyFileName;
+ const std::unique_ptr<FileState> &fs=yyextra->includeStack.back();
//fileDefineCache->merge(yyextra->yyFileName,fs->fileName);
YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
yy_switch_to_buffer( fs->bufState, yyscanner );
@@ -1628,21 +1537,53 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
//preYYin = fs->oldYYin;
yyextra->inputBuf = fs->oldFileBuf;
yyextra->inputBufPos = fs->oldFileBufPos;
- yyextra->curlyCount = fs->curlyCount;
+ yyextra->curlyCount = fs->curlyCount;
setFileName(yyscanner,fs->fileName);
DBG_CTX((stderr,"######## FileName %s\n",yyextra->yyFileName.data()));
-
+
// Deal with file changes due to
// #include's within { .. } blocks
QCString lineStr(15+yyextra->yyFileName.length());
lineStr.sprintf("# %d \"%s\" 2",yyextra->yyLineNr,yyextra->yyFileName.data());
outputArray(yyscanner,lineStr.data(),lineStr.length());
-
- delete fs; fs=0;
+
+ yyextra->includeStack.pop_back();
+
+ {
+ std::lock_guard<std::mutex> lock(g_globalDefineMutex);
+ // to avoid deadlocks we allow multiple threads to process the same header file.
+ // The first one to finish will store the results globally. After that the
+ // next time the same file is encountered, the stored data is used and the file
+ // is not processed again.
+ if (!g_defineManager.alreadyProcessed(toFileName.str()))
+ {
+ // now that the file is completely processed, prevent it from processing it again
+ g_defineManager.addInclude(yyextra->yyFileName.str(),toFileName.str());
+ g_defineManager.store(toFileName.str(),yyextra->localDefines);
+ }
+ else
+ {
+ if (Debug::isFlagSet(Debug::Preprocessor))
+ {
+ Debug::print(Debug::Preprocessor,0,"#include %s: was already processed by another thread! not storing data...\n",qPrint(toFileName));
+ }
+ }
+ }
+ // move the local macros definitions for in this file to the translation unit context
+ for (const auto &kv : yyextra->localDefines)
+ {
+ auto pair = yyextra->contextDefines.insert(kv);
+ if (!pair.second) // define already in context -> replace with local version
+ {
+ yyextra->contextDefines.erase(pair.first);
+ yyextra->contextDefines.insert(kv);
+ }
+ }
+ yyextra->localDefines.clear();
}
}
<*>"/*"/"*/" |
-<*>"/*"[*]? {
+<*>"/*"[*!]? {
if (YY_START==SkipVerbatim || YY_START==SkipCond)
{
REJECT;
@@ -1652,11 +1593,19 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
outputArray(yyscanner,yytext,(int)yyleng);
yyextra->lastCContext=YY_START;
yyextra->commentCount=1;
- if (yyleng==3) yyextra->lastGuardName.resize(0); // reset guard in case the #define is documented!
+ if (yyleng==3)
+ {
+ yyextra->isSpecialComment = true;
+ yyextra->lastGuardName.resize(0); // reset guard in case the #define is documented!
+ }
+ else
+ {
+ yyextra->isSpecialComment = false;
+ }
BEGIN(SkipCComment);
}
}
-<*>"//"[/]? {
+<*>"//"[/!]? {
if (YY_START==SkipVerbatim || YY_START==SkipCond || getLanguageFromFileName(yyextra->yyFileName)==SrcLangExt_Fortran)
{
REJECT;
@@ -1665,7 +1614,15 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
{
outputArray(yyscanner,yytext,(int)yyleng);
yyextra->lastCPPContext=YY_START;
- if (yyleng==3) yyextra->lastGuardName.resize(0); // reset guard in case the #define is documented!
+ if (yyleng==3)
+ {
+ yyextra->isSpecialComment = true;
+ yyextra->lastGuardName.resize(0); // reset guard in case the #define is documented!
+ }
+ else
+ {
+ yyextra->isSpecialComment = false;
+ }
BEGIN(SkipCPPComment);
}
}
@@ -1682,11 +1639,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
/////////////////////////////////////////////////////////////////////////////////////
-static int yyread(yyscan_t yyscanner,char *buf,int max_size)
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- int bytesInBuf = state->inputBuf->curPos()-state->inputBufPos;
- int bytesToCopy = QMIN(max_size,bytesInBuf);
+ yy_size_t bytesInBuf = state->inputBuf->curPos()-state->inputBufPos;
+ yy_size_t bytesToCopy = QMIN(max_size,bytesInBuf);
memcpy(buf,state->inputBuf->data()+state->inputBufPos,bytesToCopy);
state->inputBufPos+=bytesToCopy;
return bytesToCopy;
@@ -1698,36 +1655,34 @@ static void setFileName(yyscan_t yyscanner,const char *name)
bool ambig;
QFileInfo fi(name);
state->yyFileName=fi.absFilePath().utf8();
- state->yyFileDef=findFileDef(Doxygen::inputNameDict,state->yyFileName,ambig);
+ state->yyFileDef=findFileDef(Doxygen::inputNameLinkedMap,state->yyFileName,ambig);
if (state->yyFileDef==0) // if this is not an input file check if it is an
// include file
{
- state->yyFileDef=findFileDef(Doxygen::includeNameDict,state->yyFileName,ambig);
+ state->yyFileDef=findFileDef(Doxygen::includeNameLinkedMap,state->yyFileName,ambig);
}
//printf("setFileName(%s) state->yyFileName=%s state->yyFileDef=%p\n",
// name,state->yyFileName.data(),state->yyFileDef);
if (state->yyFileDef && state->yyFileDef->isReference()) state->yyFileDef=0;
state->insideCS = getLanguageFromFileName(state->yyFileName)==SrcLangExt_CSharp;
+ state->insideFtn = getLanguageFromFileName(state->yyFileName)==SrcLangExt_Fortran;
state->isSource = guessSection(state->yyFileName);
}
static void incrLevel(yyscan_t yyscanner)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- state->level++;
- state->levelGuard.resize(state->level);
- state->levelGuard[state->level-1]=FALSE;
- //printf("%s line %d: incrLevel %d\n",yyextra->yyFileName.data(),yyextra->yyLineNr,yyextra->level);
+ state->levelGuard.push(false);
+ //printf("%s line %d: incrLevel %d\n",yyextra->yyFileName.data(),yyextra->yyLineNr,yyextra->levelGuard.size());
}
static void decrLevel(yyscan_t yyscanner)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- //printf("%s line %d: decrLevel %d\n",state->yyFileName.data(),state->yyLineNr,state->level);
- if (state->level > 0)
+ //printf("%s line %d: decrLevel %d\n",state->yyFileName.data(),state->yyLineNr,state->levelGuard.size());
+ if (!state->levelGuard.empty())
{
- state->level--;
- state->levelGuard.resize(state->level);
+ state->levelGuard.pop();
}
else
{
@@ -1738,65 +1693,59 @@ static void decrLevel(yyscan_t yyscanner)
static bool otherCaseDone(yyscan_t yyscanner)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- if (state->level==0)
+ if (state->levelGuard.empty())
{
warn(state->yyFileName,state->yyLineNr,"Found an #else without a preceding #if.\n");
return TRUE;
}
else
{
- return state->levelGuard[state->level-1];
+ return state->levelGuard.top();
}
}
static void setCaseDone(yyscan_t yyscanner,bool value)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- state->levelGuard[state->level-1]=value;
+ state->levelGuard.top()=value;
}
-static FileState *checkAndOpenFile(yyscan_t yyscanner,const QCString &fileName,bool &alreadyIncluded)
+static FileState *checkAndOpenFile(yyscan_t yyscanner,const QCString &fileName,bool &alreadyProcessed)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- alreadyIncluded = FALSE;
+ alreadyProcessed = FALSE;
FileState *fs = 0;
//printf("checkAndOpenFile(%s)\n",fileName.data());
QFileInfo fi(fileName);
if (fi.exists() && fi.isFile())
{
- const QStrList &exclPatterns = Config_getList(EXCLUDE_PATTERNS);
- if (patternMatch(fi,&exclPatterns)) return 0;
+ const StringVector &exclPatterns = Config_getList(EXCLUDE_PATTERNS);
+ if (patternMatch(fi,exclPatterns)) return 0;
QCString absName = fi.absFilePath().utf8();
// global guard
if (state->curlyCount==0) // not #include inside { ... }
{
- if (state->allIncludes.find(absName)!=0)
+ std::lock_guard<std::mutex> lock(g_globalDefineMutex);
+ if (g_defineManager.alreadyProcessed(absName.str()))
{
- alreadyIncluded = TRUE;
+ alreadyProcessed = TRUE;
//printf(" already included 1\n");
return 0; // already done
}
- state->allIncludes.insert(absName,(void *)0x8);
}
// check include stack for absName
- QStack<FileState> tmpStack;
- state->includeStack.setAutoDelete(FALSE);
- while ((fs=state->includeStack.pop()))
- {
- if (fs->fileName==absName) alreadyIncluded=TRUE;
- tmpStack.push(fs);
- }
- while ((fs=tmpStack.pop()))
- {
- state->includeStack.push(fs);
- }
- state->includeStack.setAutoDelete(TRUE);
+ alreadyProcessed = std::any_of(
+ state->includeStack.begin(),
+ state->includeStack.end(),
+ [absName](const std::unique_ptr<FileState> &lfs)
+ { return lfs->fileName==absName; }
+ );
- if (alreadyIncluded)
+ if (alreadyProcessed)
{
//printf(" already included 2\n");
return 0;
@@ -1804,7 +1753,6 @@ static FileState *checkAndOpenFile(yyscan_t yyscanner,const QCString &fileName,b
//printf("#include %s\n",absName.data());
fs = new FileState(fi.size()+4096);
- alreadyIncluded = FALSE;
if (!readInputFile(absName,fs->fileBuf))
{ // error
//printf(" error reading\n");
@@ -1820,20 +1768,20 @@ static FileState *checkAndOpenFile(yyscan_t yyscanner,const QCString &fileName,b
return fs;
}
-static FileState *findFile(yyscan_t yyscanner, const char *fileName,bool localInclude,bool &alreadyIncluded)
+static FileState *findFile(yyscan_t yyscanner, const char *fileName,bool localInclude,bool &alreadyProcessed)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
//printf("** findFile(%s,%d) state->yyFileName=%s\n",fileName,localInclude,state->yyFileName.data());
if (Portable::isAbsolutePath(fileName))
{
- FileState *fs = checkAndOpenFile(yyscanner,fileName,alreadyIncluded);
+ FileState *fs = checkAndOpenFile(yyscanner,fileName,alreadyProcessed);
if (fs)
{
setFileName(yyscanner,fileName);
state->yyLineNr=1;
return fs;
}
- else if (alreadyIncluded)
+ else if (alreadyProcessed)
{
return 0;
}
@@ -1844,50 +1792,47 @@ static FileState *findFile(yyscan_t yyscanner, const char *fileName,bool localIn
if (fi.exists())
{
QCString absName = QCString(fi.dirPath(TRUE).data())+"/"+fileName;
- FileState *fs = checkAndOpenFile(yyscanner,absName,alreadyIncluded);
+ FileState *fs = checkAndOpenFile(yyscanner,absName,alreadyProcessed);
if (fs)
{
setFileName(yyscanner,absName);
state->yyLineNr=1;
return fs;
}
- else if (alreadyIncluded)
+ else if (alreadyProcessed)
{
return 0;
}
}
}
- if (state->pathList==0)
+ if (state->pathList.empty())
{
return 0;
}
- char *s=state->pathList->first();
- while (s)
+ for (auto path : state->pathList)
{
- QCString absName = (QCString)s+"/"+fileName;
- //printf(" Looking for %s in %s\n",fileName,s);
- FileState *fs = checkAndOpenFile(yyscanner,absName,alreadyIncluded);
+ std::string absName = path+"/"+fileName;
+ //printf(" Looking for %s in %s\n",fileName,path.c_str());
+ FileState *fs = checkAndOpenFile(yyscanner,absName.c_str(),alreadyProcessed);
if (fs)
{
- setFileName(yyscanner,absName);
+ setFileName(yyscanner,absName.c_str());
state->yyLineNr=1;
//printf(" -> found it\n");
return fs;
}
- else if (alreadyIncluded)
+ else if (alreadyProcessed)
{
return 0;
}
-
- s=state->pathList->next();
- }
+ }
return 0;
}
static QCString extractTrailingComment(const char *s)
{
if (s==0) return "";
- int i=strlen(s)-1;
+ int i=(int)strlen(s)-1;
while (i>=0)
{
char c=s[i];
@@ -1989,7 +1934,7 @@ static QCString stringize(const QCString &s)
pc=0;
while (i<s.length() && inString)
{
- char c=s.at(i++);
+ c=s.at(i++);
if (c=='"')
{
result+="\\\"";
@@ -2070,7 +2015,7 @@ static inline void addTillEndOfString(yyscan_t yyscanner,const QCString &expr,QC
static bool replaceFunctionMacro(yyscan_t yyscanner,const QCString &expr,QCString *rest,int pos,int &len,const Define *def,QCString &result,int level)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- //printf(">replaceFunctionMacro(expr='%s',rest='%s',pos=%d,def='%s') level=%d\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),state->level);
+ //printf(">replaceFunctionMacro(expr='%s',rest='%s',pos=%d,def='%s') level=%d\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),state->levelGuard.size());
uint j=pos;
len=0;
result.resize(0);
@@ -2082,17 +2027,16 @@ static bool replaceFunctionMacro(yyscan_t yyscanner,const QCString &expr,QCStrin
}
if (cc!='(')
{
- unputChar(yyscanner,expr,rest,j,cc);
+ unputChar(yyscanner,expr,rest,j,(char)cc);
return FALSE;
}
getNextChar(yyscanner,expr,rest,j); // eat the '(' character
- QDict<QCString> argTable; // list of arguments
- argTable.setAutoDelete(TRUE);
+ std::map<std::string,std::string> argTable; // list of arguments
QCString arg;
int argCount=0;
bool done=FALSE;
-
+
// PHASE 1: read the macro arguments
if (def->nargs==0)
{
@@ -2111,12 +2055,12 @@ static bool replaceFunctionMacro(yyscan_t yyscanner,const QCString &expr,QCStrin
char c=(char)cc;
if (c=='(') // argument is a function => search for matching )
{
- int level=1;
+ int lvl=1;
arg+=c;
//char term='\0';
while ((cc=getNextChar(yyscanner,expr,rest,j))!=EOF && cc!=0)
{
- char c=(char)cc;
+ c=(char)cc;
//printf("processing %c: term=%c (%d)\n",c,term,term);
if (c=='\'' || c=='\"') // skip ('s and )'s inside strings
{
@@ -2125,13 +2069,13 @@ static bool replaceFunctionMacro(yyscan_t yyscanner,const QCString &expr,QCStrin
}
if (c==')')
{
- level--;
+ lvl--;
arg+=c;
- if (level==0) break;
+ if (lvl==0) break;
}
else if (c=='(')
{
- level++;
+ lvl++;
arg+=c;
}
else
@@ -2151,7 +2095,7 @@ static bool replaceFunctionMacro(yyscan_t yyscanner,const QCString &expr,QCStrin
argKey.sprintf("@%d",argCount++); // key name
arg=arg.stripWhiteSpace();
// add argument to the lookup table
- argTable.insert(argKey, new QCString(arg));
+ argTable.emplace(toStdString(argKey), toStdString(arg));
arg.resize(0);
if (c==')') // end of the argument list
{
@@ -2243,7 +2187,6 @@ static bool replaceFunctionMacro(yyscan_t yyscanner,const QCString &expr,QCStrin
else // argument marker => read the argument number
{
QCString key="@";
- QCString *subst=0;
bool hash=FALSE;
int l=k-1;
// search for ## backward
@@ -2262,9 +2205,10 @@ static bool replaceFunctionMacro(yyscan_t yyscanner,const QCString &expr,QCStrin
if (l<(int)d.length()-1 && d.at(l)=='#' && d.at(l+1)=='#') hash=TRUE;
}
//printf("request key %s result %s\n",key.data(),argTable[key]->data());
- if (key.length()>1 && (subst=argTable[key]))
+ auto it = argTable.find(key.data());
+ if (it!=argTable.end())
{
- QCString substArg=*subst;
+ QCString substArg = it->second.c_str();
//printf("substArg='%s'\n",substArg.data());
// only if no ## operator is before or after the argument
// marker we do macro expansion.
@@ -2313,10 +2257,10 @@ static bool replaceFunctionMacro(yyscan_t yyscanner,const QCString &expr,QCStrin
}
len=j-pos;
result=resExpr;
- //printf("<replaceFunctionMacro(expr='%s',rest='%s',pos=%d,def='%s',result='%s') level=%d return=TRUE\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),result.data(),state->level);
+ //printf("<replaceFunctionMacro(expr='%s',rest='%s',pos=%d,def='%s',result='%s') level=%d return=TRUE\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),result.data(),state->levelGuard.size());
return TRUE;
}
- //printf("<replaceFunctionMacro(expr='%s',rest='%s',pos=%d,def='%s',result='%s') level=%d return=FALSE\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),result.data(),state->level);
+ //printf("<replaceFunctionMacro(expr='%s',rest='%s',pos=%d,def='%s',result='%s') level=%d return=FALSE\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),result.data(),state->levelGuard.size());
return FALSE;
}
@@ -2379,6 +2323,8 @@ static int getNextId(const QCString &expr,int p,int *l)
return -1;
}
+#define MAX_EXPANSION_DEPTH 50
+
/*! performs recursive macro expansion on the string \a expr
* starting at position \a pos.
* May read additional characters from the input while re-scanning!
@@ -2392,19 +2338,22 @@ static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,in
//printf("<expandExpression: empty\n");
return TRUE;
}
- if (state->expansionDict.find(expr)!=0) // check for recursive expansions
+ if (state->expanded.find(expr.data())!=state->expanded.end() &&
+ level>MAX_EXPANSION_DEPTH) // check for too deep recursive expansions
{
//printf("<expandExpression: already expanded expr='%s'\n",expr.data());
return FALSE;
}
else
{
- state->expansionDict.insert(expr,(void*)0x8);
+ state->expanded.insert(expr.data());
}
QCString macroName;
QCString expMacro;
bool definedTest=FALSE;
int i=pos,l,p,len;
+ int startPos = pos;
+ int samePosCount=0;
while ((p=getNextId(expr,i,&l))!=-1) // search for an macro name
{
bool replaced=FALSE;
@@ -2412,9 +2361,9 @@ static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,in
//printf(" p=%d macroName=%s\n",p,macroName.data());
if (p<2 || !(expr.at(p-2)=='@' && expr.at(p-1)=='-')) // no-rescan marker?
{
- if (state->expandedDict->find(macroName)==0) // expand macro
+ if (state->expandedDict.find(macroName.data())==state->expandedDict.end()) // expand macro
{
- Define *def=state->defineManager.isDefined(macroName);
+ Define *def=isDefined(yyscanner,macroName);
if (macroName=="defined")
{
//printf("found defined inside macro definition '%s'\n",expr.right(expr.length()-p).data());
@@ -2446,7 +2395,7 @@ static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,in
}
else if (def && def->nargs>=0) // function macro
{
- //printf(" >>>> call replaceFunctionMacro\n");
+ //printf(" >>>> call replaceFunctionMacro expr='%s'\n",qPrint(expr));
replaced=replaceFunctionMacro(yyscanner,expr,rest,p+l,len,def,expMacro,level);
//printf(" <<<< call replaceFunctionMacro: replaced=%d\n",replaced);
len+=l;
@@ -2463,10 +2412,14 @@ static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,in
bool expanded=false;
if (def && !def->nonRecursive)
{
- state->expandedDict->insert(macroName,def);
+ state->expandedDict.emplace(toStdString(macroName),def);
expanded = expandExpression(yyscanner,resultExpr,&restExpr,0,level+1);
- state->expandedDict->remove(macroName);
+ state->expandedDict.erase(toStdString(macroName));
}
+ else if (def && def->nonRecursive)
+ {
+ expanded = true;
+ }
if (expanded)
{
expr=expr.left(p)+resultExpr+restExpr;
@@ -2492,6 +2445,20 @@ static bool expandExpression(yyscan_t yyscanner,QCString &expr,QCString *rest,in
i=p+l+2;
//i=p+l;
}
+ // check for too many inplace expansions without making progress
+ if (i==startPos)
+ {
+ samePosCount++;
+ }
+ else
+ {
+ startPos=i;
+ samePosCount=0;
+ }
+ if (samePosCount>MAX_EXPANSION_DEPTH)
+ {
+ break;
+ }
}
else // no re-scan marker found, skip the macro name
{
@@ -2650,7 +2617,7 @@ static QCString removeIdsAndMarkers(const char *s)
{
nextChar:
result+=c;
- char lc=tolower(c);
+ char lc=(char)tolower(c);
if (!isId(lc) && lc!='.' /*&& lc!='-' && lc!='+'*/) inNum=FALSE;
p++;
}
@@ -2729,7 +2696,7 @@ static bool computeExpression(yyscan_t yyscanner,const QCString &expr)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
QCString e=expr;
- state->expansionDict.clear();
+ state->expanded.clear();
expandExpression(yyscanner,e,0,0,0);
//printf("after expansion '%s'\n",e.data());
e = removeIdsAndMarkers(e);
@@ -2746,118 +2713,138 @@ static QCString expandMacro(yyscan_t yyscanner,const QCString &name)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
QCString n=name;
- state->expansionDict.clear();
+ state->expanded.clear();
expandExpression(yyscanner,n,0,0,0);
n=removeMarkers(n);
//printf("expandMacro '%s'->'%s'\n",name.data(),n.data());
return n;
}
-static Define *newDefine(yyscan_t yyscanner)
+static void addDefine(yyscan_t yyscanner)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- Define *def=new Define;
- def->name = state->defName;
- def->definition = state->defText.stripWhiteSpace();
- def->nargs = state->defArgs;
- def->fileName = state->yyFileName;
- def->fileDef = state->yyFileDef;
- def->lineNr = state->yyLineNr-state->yyMLines;
- def->columnNr = state->yyColNr;
- def->varArgs = state->defVarArgs;
- //printf("newDefine: %s %s file: %s\n",def->name.data(),def->definition.data(),
- // def->fileDef ? def->fileDef->name().data() : def->fileName.data());
- //printf("newDefine: '%s'->'%s'\n",def->name.data(),def->definition.data());
- if (!def->name.isEmpty() && Doxygen::expandAsDefinedDict[def->name])
+ Define def;
+ def.name = state->defName;
+ def.definition = state->defText.stripWhiteSpace();
+ def.nargs = state->defArgs;
+ def.fileName = state->yyFileName;
+ def.fileDef = state->yyFileDef;
+ def.lineNr = state->yyLineNr-state->yyMLines;
+ def.columnNr = state->yyColNr;
+ def.varArgs = state->defVarArgs;
+ //printf("newDefine: %s %s file: %s\n",def.name.data(),def.definition.data(),
+ // def.fileDef ? def.fileDef->name().data() : def.fileName.data());
+ //printf("newDefine: '%s'->'%s'\n",def.name.data(),def.definition.data());
+ if (!def.name.isEmpty() &&
+ Doxygen::expandAsDefinedSet.find(def.name.str())!=Doxygen::expandAsDefinedSet.end())
{
- def->isPredefined=TRUE;
+ def.isPredefined=TRUE;
}
- return def;
+ auto it = state->localDefines.find(def.name.str());
+ if (it!=state->localDefines.end()) // redefine
+ {
+ state->localDefines.erase(it);
+ }
+ state->localDefines.insert(std::make_pair(def.name.str(),def));
}
-static void addDefine(yyscan_t yyscanner)
+static void addMacroDefinition(yyscan_t yyscanner)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
if (state->skip) return; // do not add this define as it is inside a
// conditional section (cond command) that is disabled.
- if (!Doxygen::gatherDefines) return;
-
- //printf("addDefine '%s' '%s'\n",state->defName.data(),state->defArgsStr.data());
- //ArgumentList *al = new ArgumentList;
- //stringToArgumentList(state->defArgsStr,al);
- MemberDef *md=createMemberDef(
- state->yyFileName,state->yyLineNr-state->yyMLines,state->yyColNr,
- "#define",state->defName,state->defArgsStr,0,
- Public,Normal,FALSE,Member,MemberType_Define,ArgumentList(),ArgumentList(),"");
- if (!state->defArgsStr.isEmpty())
- {
- ArgumentList argList;
- //printf("addDefine() state->defName='%s' state->defArgsStr='%s'\n",state->defName.data(),state->defArgsStr.data());
- stringToArgumentList(SrcLangExt_Cpp, state->defArgsStr,argList);
- md->setArgumentList(argList);
- }
- //printf("Setting initializer for '%s' to '%s'\n",state->defName.data(),state->defText.data());
- int l=state->defLitText.find('\n');
- if (l>0 && state->defLitText.left(l).stripWhiteSpace()=="\\")
+
+ Define define;
+ define.fileName = state->yyFileName;
+ define.lineNr = state->yyLineNr - state->yyMLines;
+ define.columnNr = state->yyColNr;
+ define.name = state->defName;
+ define.args = state->defArgsStr;
+ define.fileDef = state->inputFileDef;
+
+ QCString litText = state->defLitText;
+ int l=litText.find('\n');
+ if (l>0 && litText.left(l).stripWhiteSpace()=="\\")
{
// strip first line if it only contains a slash
- state->defLitText = state->defLitText.right(state->defLitText.length()-l-1);
+ litText = litText.right(litText.length()-l-1);
}
else if (l>0)
{
// align the items on the first line with the items on the second line
int k=l+1;
- const char *p=state->defLitText.data()+k;
+ const char *p=litText.data()+k;
char c;
while ((c=*p++) && (c==' ' || c=='\t')) k++;
- state->defLitText=state->defLitText.mid(l+1,k-l-1)+state->defLitText.stripWhiteSpace();
+ litText=litText.mid(l+1,k-l-1)+litText.stripWhiteSpace();
}
- QCString defLitTextStripped = state->defLitText.stripWhiteSpace();
- if (defLitTextStripped.contains('\n')>=1)
+ QCString litTextStripped = state->defLitText.stripWhiteSpace();
+ if (litTextStripped.contains('\n')>=1)
{
- md->setInitializer(state->defLitText);
+ define.definition = litText;
}
else
{
- md->setInitializer(defLitTextStripped);
- }
-
- //printf("pre.l: md->setFileDef(%p)\n",state->inputFileDef);
- md->setFileDef(state->inputFileDef);
- md->setDefinition("#define "+state->defName);
-
- MemberName *mn=Doxygen::functionNameSDict->find(state->defName);
- if (mn==0)
- {
- mn = new MemberName(state->defName);
- Doxygen::functionNameSDict->append(state->defName,mn);
+ define.definition = litTextStripped;
}
- mn->append(md);
- if (state->yyFileDef)
{
- state->yyFileDef->insertMember(md);
+ state->macroDefinitions.push_back(define);
}
-
- //Define *d;
- //if ((d=defineDict[state->defName])==0) defineDict.insert(state->defName,newDefine());
}
static inline void outputChar(yyscan_t yyscanner,char c)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- if (state->includeStack.isEmpty() || state->curlyCount>0) state->outputBuf->addChar(c);
+ if (state->includeStack.empty() || state->curlyCount>0) state->outputBuf->addChar(c);
}
static inline void outputArray(yyscan_t yyscanner,const char *a,int len)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- if (state->includeStack.isEmpty() || state->curlyCount>0) state->outputBuf->addArray(a,len);
+ if (state->includeStack.empty() || state->curlyCount>0) state->outputBuf->addArray(a,len);
+}
+
+static QCString determineAbsoluteIncludeName(const QCString &curFile,const QCString &incFileName)
+{
+ bool searchIncludes = Config_getBool(SEARCH_INCLUDES);
+ QCString absIncFileName = incFileName;
+ QFileInfo fi(curFile);
+ if (fi.exists())
+ {
+ QCString absName = QCString(fi.dirPath(TRUE).data())+"/"+incFileName;
+ QFileInfo fi2(absName);
+ if (fi2.exists())
+ {
+ absIncFileName=fi2.absFilePath().utf8();
+ }
+ else if (searchIncludes) // search in INCLUDE_PATH as well
+ {
+ const StringVector &includePath = Config_getList(INCLUDE_PATH);
+ for (const auto &incPath : includePath)
+ {
+ QFileInfo fi3(incPath.c_str());
+ if (fi3.exists() && fi3.isDir())
+ {
+ absName = QCString(fi3.absFilePath().utf8())+"/"+incFileName;
+ //printf("trying absName=%s\n",absName.data());
+ QFileInfo fi4(absName);
+ if (fi4.exists())
+ {
+ absIncFileName=fi4.absFilePath().utf8();
+ break;
+ }
+ //printf( "absIncFileName = %s\n", absIncFileName.data() );
+ }
+ }
+ }
+ //printf( "absIncFileName = %s\n", absIncFileName.data() );
+ }
+ return absIncFileName;
}
static void readIncludeFile(yyscan_t yyscanner,const QCString &inc)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- static bool searchIncludes = Config_getBool(SEARCH_INCLUDES);
uint i=0;
// find the start of the include file name
@@ -2889,79 +2876,47 @@ static void readIncludeFile(yyscan_t yyscanner,const QCString &inc)
int oldLineNr = state->yyLineNr;
//printf("Searching for '%s'\n",incFileName.data());
- // absIncFileName avoids difficulties for incFileName starting with "../" (bug 641336)
- QCString absIncFileName = incFileName;
- {
- QFileInfo fi(state->yyFileName);
- if (fi.exists())
- {
- QCString absName = QCString(fi.dirPath(TRUE).data())+"/"+incFileName;
- QFileInfo fi2(absName);
- if (fi2.exists())
- {
- absIncFileName=fi2.absFilePath().utf8();
- }
- else if (searchIncludes) // search in INCLUDE_PATH as well
- {
- QStrList &includePath = Config_getList(INCLUDE_PATH);
- char *s=includePath.first();
- while (s)
- {
- QFileInfo fi(s);
- if (fi.exists() && fi.isDir())
- {
- QCString absName = QCString(fi.absFilePath().utf8())+"/"+incFileName;
- //printf("trying absName=%s\n",absName.data());
- QFileInfo fi2(absName);
- if (fi2.exists())
- {
- absIncFileName=fi2.absFilePath().utf8();
- break;
- }
- //printf( "absIncFileName = %s\n", absIncFileName.data() );
- }
- s=includePath.next();
- }
- }
- //printf( "absIncFileName = %s\n", absIncFileName.data() );
- }
- }
- state->defineManager.addInclude(state->yyFileName,absIncFileName);
- state->defineManager.addFileToContext(absIncFileName);
+ QCString absIncFileName = determineAbsoluteIncludeName(state->yyFileName,incFileName);
// findFile will overwrite state->yyFileDef if found
FileState *fs;
- bool alreadyIncluded = FALSE;
+ bool alreadyProcessed = FALSE;
//printf("calling findFile(%s)\n",incFileName.data());
- if ((fs=findFile(yyscanner,incFileName,localInclude,alreadyIncluded))) // see if the include file can be found
+ if ((fs=findFile(yyscanner,incFileName,localInclude,alreadyProcessed))) // see if the include file can be found
{
+ {
+ std::lock_guard<std::mutex> lock(g_globalDefineMutex);
+ g_defineManager.addInclude(oldFileName.str(),absIncFileName.str());
+ }
+
//printf("Found include file!\n");
if (Debug::isFlagSet(Debug::Preprocessor))
{
- for (i=0;i<state->includeStack.count();i++)
+ for (i=0;i<state->includeStack.size();i++)
{
Debug::print(Debug::Preprocessor,0," ");
}
- //msg("#include %s: parsing...\n",incFileName.data());
+ Debug::print(Debug::Preprocessor,0,"#include %s: parsing...\n",incFileName.data());
}
- if (oldFileDef)
+
+ if (state->includeStack.empty() && oldFileDef)
{
- // add include dependency to the file in which the #include was found
- bool ambig;
- // change to absolute name for bug 641336
- FileDef *incFd = findFileDef(Doxygen::inputNameDict,absIncFileName,ambig);
- oldFileDef->addIncludeDependency(ambig ? 0 : incFd,incFileName,localInclude,state->isImported,FALSE);
- // add included by dependency
- if (state->yyFileDef)
+ PreIncludeInfo *ii = state->includeRelations.find(absIncFileName);
+ if (ii==0)
{
- //printf("Adding include dependency %s->%s\n",oldFileDef->name().data(),incFileName.data());
- state->yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,state->isImported);
+ bool ambig;
+ FileDef *incFd = findFileDef(Doxygen::inputNameLinkedMap,absIncFileName,ambig);
+ state->includeRelations.add(
+ absIncFileName,
+ oldFileDef,
+ ambig?nullptr:incFd,
+ incFileName,
+ localInclude,
+ state->isImported
+ );
}
}
- else if (state->inputFileDef)
- {
- state->inputFileDef->addIncludeDependency(0,absIncFileName,localInclude,state->isImported,TRUE);
- }
+
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
fs->bufState = YY_CURRENT_BUFFER;
fs->lineNr = oldLineNr;
@@ -2969,7 +2924,7 @@ static void readIncludeFile(yyscan_t yyscanner,const QCString &inc)
fs->curlyCount = state->curlyCount;
state->curlyCount = 0;
// push the state on the stack
- state->includeStack.push(fs);
+ state->includeStack.emplace_back(fs);
// set the scanner to the include file
// Deal with file changes due to
@@ -2986,38 +2941,40 @@ static void readIncludeFile(yyscan_t yyscanner,const QCString &inc)
}
else
{
- //printf(" calling findFile(%s) alreadyInc=%d\n",incFileName.data(),alreadyIncluded);
- if (oldFileDef)
+ if (alreadyProcessed) // if this header was already process we can just copy the stored macros
+ // in the local context
{
- bool ambig;
- //QCString absPath = incFileName;
- //if (QDir::isRelativePath(incFileName))
- //{
- // absPath = QDir::cleanDirPath(oldFileDef->getPath()+"/"+incFileName);
- // //printf("%s + %s -> resolved path %s\n",oldFileDef->getPath().data(),incFileName.data(),absPath.data());
- //}
-
- // change to absolute name for bug 641336
- FileDef *fd = findFileDef(Doxygen::inputNameDict,absIncFileName,ambig);
- //printf("%s::findFileDef(%s)=%p\n",oldFileDef->name().data(),incFileName.data(),fd);
- // add include dependency to the file in which the #include was found
- oldFileDef->addIncludeDependency(ambig ? 0 : fd,incFileName,localInclude,state->isImported,FALSE);
- // add included by dependency
- if (fd)
- {
- //printf("Adding include dependency (2) %s->%s ambig=%d\n",oldFileDef->name().data(),fd->name().data(),ambig);
- fd->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,state->isImported);
- }
+ std::lock_guard<std::mutex> lock(g_globalDefineMutex);
+ g_defineManager.addInclude(state->yyFileName.str(),absIncFileName.str());
+ g_defineManager.retrieve(absIncFileName.str(),state->contextDefines);
}
- else if (state->inputFileDef)
+
+ if (state->includeStack.empty() && oldFileDef)
{
- state->inputFileDef->addIncludeDependency(0,absIncFileName,localInclude,state->isImported,TRUE);
+ PreIncludeInfo *ii = state->includeRelations.find(absIncFileName);
+ if (ii==0)
+ {
+ bool ambig;
+ FileDef *incFd = findFileDef(Doxygen::inputNameLinkedMap,absIncFileName,ambig);
+ ii = state->includeRelations.add(absIncFileName,
+ oldFileDef,
+ ambig?0:incFd,
+ incFileName,
+ localInclude,
+ state->isImported
+ );
+ }
}
+
if (Debug::isFlagSet(Debug::Preprocessor))
{
- if (alreadyIncluded)
+ for (i=0;i<state->includeStack.size();i++)
+ {
+ Debug::print(Debug::Preprocessor,0," ");
+ }
+ if (alreadyProcessed)
{
- Debug::print(Debug::Preprocessor,0,"#include %s: already included! skipping...\n",qPrint(incFileName));
+ Debug::print(Debug::Preprocessor,0,"#include %s: already processed! skipping...\n",qPrint(incFileName));
}
else
{
@@ -3025,7 +2982,7 @@ static void readIncludeFile(yyscan_t yyscanner,const QCString &inc)
}
//printf("error: include file %s not found\n",yytext);
}
- if (state->curlyCount>0 && !alreadyIncluded) // failed to find #include inside { ... }
+ if (state->curlyCount>0 && !alreadyProcessed) // failed to find #include inside { ... }
{
warn(state->yyFileName,state->yyLineNr,"include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data());
}
@@ -3038,10 +2995,10 @@ static void readIncludeFile(yyscan_t yyscanner,const QCString &inc)
static void startCondSection(yyscan_t yyscanner,const char *sectId)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- //printf("startCondSection: skip=%d stack=%d\n",state->skip,state->condStack.count());
+ //printf("startCondSection: skip=%d stack=%d\n",state->skip,state->condStack.size());
CondParser prs;
bool expResult = prs.parse(state->yyFileName,state->yyLineNr,sectId);
- state->condStack.push(new CondCtx(state->yyLineNr,sectId,state->skip));
+ state->condStack.emplace(std::make_unique<CondCtx>(state->yyLineNr,sectId,state->skip));
if (!expResult)
{
state->skip=TRUE;
@@ -3052,15 +3009,15 @@ static void startCondSection(yyscan_t yyscanner,const char *sectId)
static void endCondSection(yyscan_t yyscanner)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- if (state->condStack.isEmpty())
+ if (state->condStack.empty())
{
state->skip=FALSE;
}
else
{
- CondCtx *ctx = state->condStack.pop();
+ const std::unique_ptr<CondCtx> &ctx = state->condStack.top();
state->skip=ctx->skip;
- delete ctx;
+ state->condStack.pop();
}
//printf("endCondSection: skip=%d stack=%d\n",state->skip,state->condStack.count());
}
@@ -3068,9 +3025,9 @@ static void endCondSection(yyscan_t yyscanner)
static void forceEndCondSection(yyscan_t yyscanner)
{
YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
- while (!state->condStack.isEmpty())
+ while (!state->condStack.empty())
{
- delete state->condStack.pop();
+ state->condStack.pop();
}
state->skip=FALSE;
}
@@ -3150,8 +3107,7 @@ static int getCurrentChar(yyscan_t yyscanner,const QCString &expr,QCString *rest
else
{
int cc=yyinput(yyscanner);
- returnCharToStream(yyscanner,cc);
- //unput((char)cc);
+ returnCharToStream(yyscanner,(char)cc);
//printf("%c=yyinput()\n",cc);
return cc;
}
@@ -3178,43 +3134,197 @@ static void unputChar(yyscan_t yyscanner,const QCString &expr,QCString *rest,uin
//printf("result: unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c);
}
+/** Returns a reference to a Define object given its name or 0 if the Define does
+ * not exist.
+ */
+static Define *isDefined(yyscan_t yyscanner,const char *name)
+{
+ YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
+
+ bool undef = false;
+ auto findDefine = [&undef,&name](DefineMap &map)
+ {
+ Define *d=0;
+ auto it = map.find(name);
+ if (it!=map.end())
+ {
+ d = &it->second;
+ if (d->undef)
+ {
+ undef=true;
+ d=0;
+ }
+ }
+ return d;
+ };
+
+ Define *def = findDefine(state->localDefines);
+ if (def==0 && !undef)
+ {
+ def = findDefine(state->contextDefines);
+ }
+ return def;
+}
+
+static void initPredefined(yyscan_t yyscanner,const char *fileName)
+{
+ YY_EXTRA_TYPE state = preYYget_extra(yyscanner);
+
+ // add predefined macros
+ const StringVector &predefList = Config_getList(PREDEFINED);
+ for (const auto &defStr : predefList)
+ {
+ QCString ds = defStr.c_str();
+ int i_equals=ds.find('=');
+ int i_obrace=ds.find('(');
+ int i_cbrace=ds.find(')');
+ bool nonRecursive = i_equals>0 && ds.at(i_equals-1)==':';
+
+ if ((i_obrace==0) || (i_equals==0) || (i_equals==1 && ds.at(i_equals-1)==':'))
+ {
+ continue; // no define name
+ }
+
+ if (i_obrace<i_equals && i_cbrace<i_equals &&
+ i_obrace!=-1 && i_cbrace!=-1 &&
+ i_obrace<i_cbrace
+ ) // predefined function macro definition
+ {
+ bool varArgs = false;
+ int count = 0;
+ int i,pi,l;
+ std::map<std::string,int> argMap;
+ QRegExp reId("[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*"); // regexp matching an id
+ if (ds.mid(i_obrace+1,i_cbrace-i_obrace-1)=="...")
+ {
+ varArgs = true;
+ argMap.emplace("__VA_ARGS__",count);
+ count++;
+ }
+ else
+ {
+ //printf("predefined function macro '%s'\n",qPrint(ds.mid(i_obrace+1,i_cbrace-i_obrace-1)));
+ i=i_obrace+1;
+ // gather the formal arguments in a dictionary
+ while (i<i_cbrace && (pi=reId.match(ds,i,&l)))
+ {
+ if (l>0) // see bug375037
+ {
+ argMap.emplace(toStdString(ds.mid(pi,l)),count);
+ count++;
+ i=pi+l;
+ }
+ else
+ {
+ i++;
+ }
+ }
+ }
+ // strip definition part
+ QCString tmp=ds.right(ds.length()-i_equals-1);
+ QCString definition;
+ i=0;
+ // substitute all occurrences of formal arguments by their
+ // corresponding markers
+ while ((pi=reId.match(tmp,i,&l))!=-1)
+ {
+ if (pi>i) definition+=tmp.mid(i,pi-i);
+ auto it = argMap.find(tmp.mid(pi,l).data());
+ if (it!=argMap.end())
+ {
+ int argIndex = it->second;
+ QCString marker;
+ marker.sprintf(" @%d ",argIndex);
+ definition+=marker;
+ }
+ else
+ {
+ definition+=tmp.mid(pi,l);
+ }
+ i=pi+l;
+ }
+ if (i<(int)tmp.length()) definition+=tmp.mid(i,tmp.length()-i);
+
+ // add define definition to the dictionary of defines for this file
+ QCString dname = ds.left(i_obrace);
+ if (!dname.isEmpty())
+ {
+ Define def;
+ def.name = dname;
+ def.definition = definition;
+ def.nargs = count;
+ def.isPredefined = TRUE;
+ def.nonRecursive = nonRecursive;
+ def.fileDef = state->yyFileDef;
+ def.fileName = fileName;
+ def.varArgs = varArgs;
+ state->contextDefines.insert(std::make_pair(def.name.str(),def));
+
+ //printf("#define '%s' '%s' #nargs=%d\n",
+ // def->name.data(),def->definition.data(),def->nargs);
+ }
+
+ }
+ else if ((i_obrace==-1 || i_obrace>i_equals) &&
+ (i_cbrace==-1 || i_cbrace>i_equals) &&
+ !ds.isEmpty() && (int)ds.length()>i_equals
+ ) // predefined non-function macro definition
+ {
+ //printf("predefined normal macro '%s'\n",defStr);
+ Define def;
+ if (i_equals==-1) // simple define without argument
+ {
+ def.name = ds;
+ def.definition = "1"; // substitute occurrences by 1 (true)
+ }
+ else // simple define with argument
+ {
+ int ine=i_equals - (nonRecursive ? 1 : 0);
+ def.name = ds.left(ine);
+ def.definition = ds.right(ds.length()-i_equals-1);
+ }
+ if (!def.name.isEmpty())
+ {
+ def.nargs = -1;
+ def.isPredefined = TRUE;
+ def.nonRecursive = nonRecursive;
+ def.fileDef = state->yyFileDef;
+ def.fileName = fileName;
+ state->contextDefines.insert(std::make_pair(def.name.str(),def));
+ }
+ }
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////
struct Preprocessor::Private
{
yyscan_t yyscanner;
preYY_state state;
- bool firstTime = FALSE;
};
void Preprocessor::addSearchDir(const char *dir)
{
YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner);
QFileInfo fi(dir);
- if (fi.isDir()) state->pathList->append(fi.absFilePath().utf8());
-}
+ if (fi.isDir()) state->pathList.push_back(fi.absFilePath().utf8().data());
+}
Preprocessor::Preprocessor() : p(std::make_unique<Private>())
{
preYYlex_init_extra(&p->state,&p->yyscanner);
- YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner);
- state->pathList = new QStrList;
addSearchDir(".");
- state->expandedDict = new DefineDict(17);
}
Preprocessor::~Preprocessor()
{
- YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner);
- delete state->expandedDict;
- state->expandedDict=0;
- delete state->pathList;
- state->pathList=0;
preYYlex_destroy(p->yyscanner);
}
void Preprocessor::processFile(const char *fileName,BufStr &input,BufStr &output)
{
+// printf("Preprocessor::processFile(%s)\n",fileName);
yyscan_t yyscanner = p->yyscanner;
YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner);
struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
@@ -3236,146 +3346,20 @@ void Preprocessor::processFile(const char *fileName,BufStr &input,BufStr &output
state->inputBuf=&input;
state->inputBufPos=0;
state->outputBuf=&output;
- state->includeStack.setAutoDelete(TRUE);
state->includeStack.clear();
- state->expandedDict->setAutoDelete(FALSE);
- state->expandedDict->clear();
- state->condStack.setAutoDelete(TRUE);
- state->condStack.clear();
- //state->fileDefineDict->clear();
+ state->expandedDict.clear();
+ state->contextDefines.clear();
+ while (!state->condStack.empty()) state->condStack.pop();
setFileName(yyscanner,fileName);
+
state->inputFileDef = state->yyFileDef;
- state->defineManager.startContext(state->yyFileName);
+ //yyextra->defineManager.startContext(state->yyFileName);
- p->firstTime=TRUE;
- if (p->firstTime)
- {
- // add predefined macros
- char *defStr;
- QStrList &predefList = Config_getList(PREDEFINED);
- QStrListIterator sli(predefList);
- for (sli.toFirst();(defStr=sli.current());++sli)
- {
- QCString ds = defStr;
- int i_equals=ds.find('=');
- int i_obrace=ds.find('(');
- int i_cbrace=ds.find(')');
- bool nonRecursive = i_equals>0 && ds.at(i_equals-1)==':';
-
- if ((i_obrace==0) || (i_equals==0) || (i_equals==1 && ds.at(i_equals-1)==':'))
- {
- continue; // no define name
- }
-
- if (i_obrace<i_equals && i_cbrace<i_equals &&
- i_obrace!=-1 && i_cbrace!=-1 &&
- i_obrace<i_cbrace
- ) // predefined function macro definition
- {
- //printf("predefined function macro '%s'\n",defStr);
- QRegExp reId("[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*"); // regexp matching an id
- QDict<int> argDict(17);
- argDict.setAutoDelete(TRUE);
- int i=i_obrace+1,p,l,count=0;
- // gather the formal arguments in a dictionary
- while (i<i_cbrace && (p=reId.match(ds,i,&l)))
- {
- if (l>0) // see bug375037
- {
- argDict.insert(ds.mid(p,l),new int(count++));
- i=p+l;
- }
- else
- {
- i++;
- }
- }
- // strip definition part
- QCString tmp=ds.right(ds.length()-i_equals-1);
- QCString definition;
- i=0;
- // substitute all occurrences of formal arguments by their
- // corresponding markers
- while ((p=reId.match(tmp,i,&l))!=-1)
- {
- if (p>i) definition+=tmp.mid(i,p-i);
- int *argIndex;
- if ((argIndex=argDict[tmp.mid(p,l)])!=0)
- {
- QCString marker;
- marker.sprintf(" @%d ",*argIndex);
- definition+=marker;
- }
- else
- {
- definition+=tmp.mid(p,l);
- }
- i=p+l;
- }
- if (i<(int)tmp.length()) definition+=tmp.mid(i,tmp.length()-i);
-
- // add define definition to the dictionary of defines for this file
- QCString dname = ds.left(i_obrace);
- if (!dname.isEmpty())
- {
- Define *def = new Define;
- def->name = dname;
- def->definition = definition;
- def->nargs = count;
- def->isPredefined = TRUE;
- def->nonRecursive = nonRecursive;
- def->fileDef = state->yyFileDef;
- def->fileName = fileName;
- state->defineManager.addDefine(state->yyFileName,def);
-
- //printf("#define '%s' '%s' #nargs=%d\n",
- // def->name.data(),def->definition.data(),def->nargs);
- }
-
- }
- else if ((i_obrace==-1 || i_obrace>i_equals) &&
- (i_cbrace==-1 || i_cbrace>i_equals) &&
- !ds.isEmpty() && (int)ds.length()>i_equals
- ) // predefined non-function macro definition
- {
- //printf("predefined normal macro '%s'\n",defStr);
- Define *def = new Define;
- if (i_equals==-1) // simple define without argument
- {
- def->name = ds;
- def->definition = "1"; // substitute occurrences by 1 (true)
- }
- else // simple define with argument
- {
- int ine=i_equals - (nonRecursive ? 1 : 0);
- def->name = ds.left(ine);
- def->definition = ds.right(ds.length()-i_equals-1);
- }
- if (!def->name.isEmpty())
- {
- def->nargs = -1;
- def->isPredefined = TRUE;
- def->nonRecursive = nonRecursive;
- def->fileDef = state->yyFileDef;
- def->fileName = fileName;
- state->defineManager.addDefine(state->yyFileName,def);
- }
- else
- {
- delete def;
- }
-
- //printf("#define '%s' '%s' #nargs=%d\n",
- // def->name.data(),def->definition.data(),def->nargs);
- }
- }
- //firstTime=FALSE;
- }
+ initPredefined(yyscanner,fileName);
state->yyLineNr = 1;
state->yyColNr = 1;
- state->level = 0;
state->ifcount = 0;
BEGIN( Start );
@@ -3387,35 +3371,24 @@ void Preprocessor::processFile(const char *fileName,BufStr &input,BufStr &output
preYYlex(yyscanner);
- while (!state->condStack.isEmpty())
+ while (!state->condStack.empty())
{
- CondCtx *ctx = state->condStack.pop();
+ const std::unique_ptr<CondCtx> &ctx = state->condStack.top();
QCString sectionInfo = " ";
if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label '%s' ",ctx->sectionId.stripWhiteSpace().data());
warn(fileName,ctx->lineNr,"Conditional section%sdoes not have "
"a corresponding \\endcond command within this file.",sectionInfo.data());
- delete ctx;
+ state->condStack.pop();
}
// make sure we don't extend a \cond with missing \endcond over multiple files (see bug 624829)
forceEndCondSection(yyscanner);
- // remove locally defined macros so they can be redefined in another source file
- //if (state->fileDefineDict->count()>0)
- //{
- // QDictIterator<Define> di(*state->fileDefineDict);
- // Define *d;
- // for (di.toFirst();(d=di.current());++di)
- // {
- // state->globalDefineDict->remove(di.currentKey());
- // }
- // state->fileDefineDict->clear();
- //}
-
if (Debug::isFlagSet(Debug::Preprocessor))
{
+ std::lock_guard<std::mutex> lock(g_debugMutex);
char *orgPos=output.data()+orgOffset;
char *newPos=output.data()+output.curPos();
- Debug::print(Debug::Preprocessor,0,"Preprocessor output (size: %d bytes):\n",newPos-orgPos);
+ Debug::print(Debug::Preprocessor,0,"Preprocessor output of %s (size: %d bytes):\n",fileName,newPos-orgPos);
int line=1;
Debug::print(Debug::Preprocessor,0,"---------\n00001 ");
while (orgPos<newPos)
@@ -3425,26 +3398,48 @@ void Preprocessor::processFile(const char *fileName,BufStr &input,BufStr &output
orgPos++;
}
Debug::print(Debug::Preprocessor,0,"\n---------\n");
- if (state->defineManager.defineContext().count()>0)
+ if (yyextra->contextDefines.size()>0)
{
- Debug::print(Debug::Preprocessor,0,"Macros accessible in this file:\n");
+ Debug::print(Debug::Preprocessor,0,"Macros accessible in this file (%s):\n", fileName);
Debug::print(Debug::Preprocessor,0,"---------\n");
- QDictIterator<Define> di(state->defineManager.defineContext());
- Define *def;
- for (di.toFirst();(def=di.current());++di)
+ for (auto &kv : yyextra->contextDefines)
{
- Debug::print(Debug::Preprocessor,0,"%s ",qPrint(def->name));
+ Debug::print(Debug::Preprocessor,0,"%s ",qPrint(kv.second.name));
+ }
+ for (auto &kv : yyextra->localDefines)
+ {
+ Debug::print(Debug::Preprocessor,0,"%s ",qPrint(kv.second.name));
}
Debug::print(Debug::Preprocessor,0,"\n---------\n");
}
else
{
- Debug::print(Debug::Preprocessor,0,"No macros accessible in this file.\n");
+ Debug::print(Debug::Preprocessor,0,"No macros accessible in this file (%s).\n", fileName);
}
}
- state->defineManager.endContext();
+
+ {
+ std::lock_guard<std::mutex> lock(g_updateGlobals);
+ for (const auto &inc : state->includeRelations)
+ {
+ if (inc->fromFileDef)
+ {
+ inc->fromFileDef->addIncludeDependency(inc->toFileDef,inc->includeName,inc->local,inc->imported);
+ }
+ if (inc->toFileDef && inc->fromFileDef)
+ {
+ inc->toFileDef->addIncludedByDependency(inc->fromFileDef,inc->fromFileDef->docName(),inc->local,inc->imported);
+ }
+ }
+ // add the macro definition for this file to the global map
+ Doxygen::macroDefinitions.emplace(std::make_pair(state->yyFileName.str(),std::move(state->macroDefinitions)));
+ }
+
+ //yyextra->defineManager.endContext();
printlex(yy_flex_debug, FALSE, __FILE__, fileName);
+// printf("Preprocessor::processFile(%s) finished\n",fileName);
}
-
+#if USE_STATE2STRING
#include "pre.l.h"
+#endif
diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h
index ed4e76b..7bc5821 100644
--- a/src/printdocvisitor.h
+++ b/src/printdocvisitor.h
@@ -202,6 +202,10 @@ class PrintDocVisitor : public DocVisitor
if (inc->isBlock()) printf(" block=\"yes\"");
break;
case DocInclude::LatexInclude: printf("latexinclude"); break;
+ case DocInclude::RtfInclude: printf("rtfinclude"); break;
+ case DocInclude::DocbookInclude: printf("docbookinclude"); break;
+ case DocInclude::ManInclude: printf("maninclude"); break;
+ case DocInclude::XmlInclude: printf("xmlinclude"); break;
case DocInclude::VerbInclude: printf("verbinclude"); break;
case DocInclude::Snippet: printf("snippet"); break;
case DocInclude::SnipWithLines: printf("snipwithlines"); break;
diff --git a/src/pycode.h b/src/pycode.h
index e3a01b4..8bce2a9 100644
--- a/src/pycode.h
+++ b/src/pycode.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -36,6 +34,8 @@ class Definition;
class PythonCodeParser : public CodeParserInterface
{
public:
+ PythonCodeParser();
+ virtual ~PythonCodeParser();
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
const QCString &input,
@@ -52,6 +52,9 @@ class PythonCodeParser : public CodeParserInterface
bool collectXrefs=TRUE
);
void resetCodeParserState();
+ private:
+ struct Private;
+ std::unique_ptr<Private> p;
};
diff --git a/src/pycode.l b/src/pycode.l
index f7e255f..65788cc 100644
--- a/src/pycode.l
+++ b/src/pycode.l
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -23,15 +21,24 @@
%option never-interactive
%option prefix="pycodeYY"
+%option reentrant
+%option extra-type="struct pycodeYY_state *"
+%option noyy_top_state
+%top{
+#include <stdint.h>
+}
%{
+#include <vector>
+#include <unordered_map>
+#include <string>
+#include <stack>
+
#include <stdio.h>
-#include <qvaluestack.h>
#include "pycode.h"
#include "message.h"
-
#include "scanner.h"
#include "entry.h"
#include "doxygen.h"
@@ -45,6 +52,8 @@
#include "filedef.h"
#include "namespacedef.h"
#include "tooltip.h"
+#include "scopedtypevariant.h"
+#include "symbolresolver.h"
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
@@ -53,276 +62,913 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
-static ClassSDict g_codeClassSDict(17);
-static QCString g_curClassName;
-static QStrList g_curClassBases;
-
-
-static CodeOutputInterface * g_code;
-static const char * g_inputString; //!< the code fragment as text
-static int g_inputPosition; //!< read offset during parsing
-static const char * g_currentFontClass;
-static bool g_needsTermination;
-static const Definition *g_searchCtx;
-static bool g_collectXRefs;
-static int g_inputLines; //!< number of line in the code fragment
-static int g_yyLineNr; //!< current line number
-static FileDef * g_sourceFileDef;
-static Definition * g_currentDefinition;
-static MemberDef * g_currentMemberDef;
-static bool g_includeCodeFragment;
-static QCString g_realScope;
-//static bool g_insideBody;
-static int g_bodyCurlyCount;
-static bool g_searchingForBody;
-static QCString g_classScope;
-static int g_paramParens;
-//static int g_anchorCount;
-
-static bool g_exampleBlock;
-static QCString g_exampleName;
-
-static QCString g_type;
-static QCString g_name;
-
-static bool g_doubleStringIsDoc;
-static bool g_doubleQuote;
-static bool g_noSuiteFound;
-static int g_stringContext;
-
-static QValueStack<uint> g_indents; //!< Tracks indentation levels for scoping in python
-
-static QCString g_docBlock; //!< contents of all lines of a documentation block
-static bool g_endComment;
-
-static void endFontClass();
-static void adjustScopesAndSuites(unsigned indentLength);
-static const char *stateToString(int state);
+#define USE_STATE2STRING 0
-/*! Represents a stack of variable to class mappings as found in the
- * code. Each scope is enclosed in pushScope() and popScope() calls.
- * Variables are added by calling addVariables() and one can search
- * for variable using findVariable().
- */
-class PyVariableContext
+struct pycodeYY_state
{
- public:
- static const ClassDef *dummyContext;
- class Scope : public SDict<ClassDef>
- {
- public:
- Scope() : SDict<ClassDef>(17) {}
- };
-
- PyVariableContext()
- {
- m_scopes.setAutoDelete(TRUE);
- }
+ std::unordered_map< std::string, ScopedTypeVariant > codeClassMap;
+ QCString curClassName;
+ QStrList curClassBases;
+
+ CodeOutputInterface * code = 0;
+ const char * inputString = 0; //!< the code fragment as text
+ yy_size_t inputPosition = 0; //!< read offset during parsing
+ const char * currentFontClass = 0;
+ bool needsTermination = FALSE;
+ const Definition *searchCtx = 0;
+ bool collectXRefs = FALSE;
+ int inputLines = 0; //!< number of line in the code fragment
+ int yyLineNr = 0; //!< current line number
+ FileDef * sourceFileDef = 0;
+ const Definition * currentDefinition = 0;
+ const MemberDef * currentMemberDef = 0;
+ bool includeCodeFragment = FALSE;
+ QCString realScope;
+ int bodyCurlyCount = 0;
+ bool searchingForBody = FALSE;
+ QCString classScope;
+ int paramParens = 0;
+
+ bool exampleBlock = FALSE;
+ QCString exampleName;
+
+ QCString type;
+ QCString name;
+
+ bool doubleStringIsDoc = FALSE;
+ bool doubleQuote = FALSE;
+ bool noSuiteFound = FALSE;
+ int stringContext = 0;
+
+ std::stack<yy_size_t> indents; //!< Tracks indentation levels for scoping in python
+
+ QCString docBlock; //!< contents of all lines of a documentation block
+ bool endComment = FALSE;
+ VariableContext theVarContext;
+ CallContext theCallContext;
+ SymbolResolver symbolResolver;
+};
- virtual ~PyVariableContext()
- {
- }
-
- void pushScope()
- {
- m_scopes.append(new Scope);
- }
- void popScope()
- {
- if (m_scopes.count()>0)
- {
- m_scopes.remove(m_scopes.count()-1);
- }
- }
+#if USE_STATE2STRING
+static const char *stateToString(int state);
+#endif
+
+static void startCodeLine(yyscan_t yyscanner);
+static int countLines(yyscan_t yyscanner);
+static void setCurrentDoc(yyscan_t yyscanner, const QCString &anchor);
+static void addToSearchIndex(yyscan_t yyscanner, const char *text);
+static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,Definition *d);
+static void codify(yyscan_t yyscanner,const char* text);
+static void endCodeLine(yyscan_t yyscanner);
+static void nextCodeLine(yyscan_t yyscanner);
+static void writeMultiLineCodeLink(yyscan_t yyscanner, CodeOutputInterface &ol, const Definition *d, const char *text);
+static void startFontClass(yyscan_t yyscanner,const char *s);
+static void endFontClass(yyscan_t yyscanner);
+static void codifyLines(yyscan_t yyscanner,const char *text);
+static bool getLinkInScope(yyscan_t yyscanner, const QCString &c, const QCString &m,
+ const char *memberText, CodeOutputInterface &ol, const char *text);
+static bool getLink(yyscan_t yyscanner, const char *className, const char *memberName,
+ CodeOutputInterface &ol, const char *text=0);
+static void generateClassOrGlobalLink(yyscan_t yyscanner, CodeOutputInterface &ol,
+ const char *clName, bool typeOnly=FALSE);
+static void generateFunctionLink(yyscan_t yyscanner, CodeOutputInterface &ol,
+ const char *funcName);
+static bool findMemberLink(yyscan_t yyscanner, CodeOutputInterface &ol,
+ Definition *sym, const char *symName);
+static void findMemberLink(yyscan_t yyscanner, CodeOutputInterface &ol,
+ const char *symName);
+static void adjustScopesAndSuites(yyscan_t yyscanner,unsigned indentLength);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+
+#if 0 // TODO: call me to store local variables and get better syntax highlighting, see code.l
+static void addVariable(yyscan_t yyscanner, QCString type, QCString name);
+#endif
+
+//-------------------------------------------------------------------
+
+static std::mutex g_searchIndexMutex;
+static std::mutex g_docCrossReferenceMutex;
+static std::mutex g_countFlowKeywordsMutex;
+
+//-------------------------------------------------------------------
- void clear()
- {
- m_scopes.clear();
- m_globalScope.clear();
- }
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
- void clearExceptGlobal()
- {
- m_scopes.clear();
- }
+%}
- void addVariable(const QCString &type,const QCString &name);
- ClassDef *findVariable(const QCString &name);
-
- private:
- Scope m_globalScope;
- QList<Scope> m_scopes;
-};
-void PyVariableContext::addVariable(const QCString &type,const QCString &name)
+BB [ \t]+
+B [ \t]*
+NEWLINE \n
+
+DIGIT [0-9]
+LETTER [A-Za-z\x80-\xFF]
+NONEMPTY [A-Za-z0-9_\x80-\xFF]
+EXPCHAR [#(){}\[\],:.%/\\=`*~|&<>!;+-]
+NONEMPTYEXP [^ \t\n:]
+PARAMNONEMPTY [^ \t\n():]
+IDENTIFIER ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*
+SCOPE {IDENTIFIER}("."{IDENTIFIER})*
+CALLANY "("[^)]*")"
+BORDER ([^A-Za-z0-9])
+
+POUNDCOMMENT "##"
+
+TRISINGLEQUOTE "'''"
+TRIDOUBLEQUOTE "\"\"\""
+LONGSTRINGCHAR [^\\"']
+ESCAPESEQ ("\\")(.)
+LONGSTRINGITEM ({LONGSTRINGCHAR}|{ESCAPESEQ})
+SMALLQUOTE ("\"\""|"\""|"'"|"''")
+LONGSTRINGBLOCK ({LONGSTRINGITEM}+|{SMALLQUOTE})
+
+SHORTSTRING ("'"{SHORTSTRINGITEM}*"'"|'"'{SHORTSTRINGITEM}*'"')
+SHORTSTRINGITEM ({SHORTSTRINGCHAR}|{ESCAPESEQ})
+SHORTSTRINGCHAR [^\\\n"]
+STRINGLITERAL {STRINGPREFIX}?( {SHORTSTRING} | {LONGSTRING})
+STRINGPREFIX ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR")
+KEYWORD ("lambda"|"import"|"class"|"assert"|"with"|"as"|"from"|"global"|"def"|"True"|"False")
+FLOWKW ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally")
+QUOTES ("\""[^"]*"\"")
+SINGLEQUOTES ("'"[^']*"'")
+
+LONGINTEGER {INTEGER}("l"|"L")
+INTEGER ({DECIMALINTEGER}|{OCTINTEGER}|{HEXINTEGER})
+DECIMALINTEGER ({NONZERODIGIT}{DIGIT}*|"0")
+OCTINTEGER "0"{OCTDIGIT}+
+HEXINTEGER "0"("x"|"X"){HEXDIGIT}+
+NONZERODIGIT [1-9]
+OCTDIGIT [0-7]
+HEXDIGIT ({DIGIT}|[a-f]|[A-F])
+FLOATNUMBER ({POINTFLOAT}|{EXPONENTFLOAT})
+POINTFLOAT ({INTPART}?{FRACTION}|{INTPART}".")
+EXPONENTFLOAT ({INTPART}|{POINTFLOAT}){EXPONENT}
+INTPART {DIGIT}+
+FRACTION "."{DIGIT}+
+EXPONENT ("e"|"E")("+"|"-")?{DIGIT}+
+IMAGNUMBER ({FLOATNUMBER}|{INTPART})("j"|"J")
+ATOM ({IDENTIFIER}|{LITERAL}|{ENCLOSURE})
+ENCLOSURE ({PARENTH_FORM}|{LIST_DISPLAY}|{DICT_DISPLAY}|{STRING_CONVERSION})
+LITERAL ({STRINGLITERAL}|{INTEGER}|{LONGINTEGER}|{FLOATNUMBER}|{IMAGNUMBER})
+PARENTH_FORM "("{EXPRESSION_LIST}?")"
+TEST ({AND_TEST}("or"{AND_TEST})*|{LAMBDA_FORM})
+TESTLIST {TEST}( ","{TEST})*","?
+LIST_DISPLAY "["{LISTMAKER}?"]"
+LISTMAKER {EXPRESSION}({LIST_FOR}|(","{EXPRESSION})*","?)
+LIST_ITER ({LIST_FOR}|{LIST_IF})
+LIST_FOR "for"{EXPRESSION_LIST}"in"{TESTLIST}{LIST_ITER}?
+LIST_IF "if"{TEST}{LIST_ITER}?
+DICT_DISPLAY "\{"{KEY_DATUM_LIST}?"\}"
+KEY_DATUM_LIST {KEY_DATUM}(","{KEY_DATUM})*","?
+KEY_DATUM {EXPRESSION}":"{EXPRESSION}
+STRING_CONVERSION "`"{EXPRESSION_LIST}"`"
+PRIMARY ({ATOM}|{ATTRIBUTEREF}|{SUBSCRIPTION}|{SLICING}|{CALL})
+ATTRIBUTEREF {PRIMARY}"."{IDENTIFIER}
+SUBSCRIPTION {PRIMARY}"["{EXPRESSION_LIST}"]"
+SLICING ({SIMPLE_SLICING}|{EXTENDED_SLICING})
+SIMPLE_SLICING {PRIMARY}"["{SHORT_SLICE}"]"
+EXTENDED_SLICING {PRIMARY}"["{SLICE_LIST}"]"
+SLICE_LIST {SLICE_ITEM}(","{SLICE_ITEM})*","?
+SLICE_ITEM ({EXPRESSION}|{PROPER_SLICE}|{ELLIPSIS})
+PROPER_SLICE ({SHORT_SLICE}|{LONG_SLICE})
+SHORT_SLICE {LOWER_BOUND}?":"{UPPER_BOUND}?
+LONG_SLICE {SHORT_SLICE}":"{STRIDE}?
+LOWER_BOUND {EXPRESSION}
+UPPER_BOUND {EXPRESSION}
+STRIDE {EXPRESSION}
+ELLIPSIS "..."
+CALL {PRIMARY}"("({ARGUMENT_LIST}","?)?")"
+ARGUMENT_LIST ({POSITIONAL_ARGUMENTS}(","{KEYWORD_ARGUMENTS})?(",""*"{EXPRESSION})?(",""**"{EXPRESSION})?|{KEYWORD_ARGUMENTS}(",""*"{EXPRESSION})?(",""**"{EXPRESSION})?|"*"{EXPRESSION}(",""**"{EXPRESSION})?|"**"{EXPRESSION})
+POSITIONAL_ARGUMENTS {EXPRESSION}(","{EXPRESSION})*
+KEYWORD_ARGUMENTS {KEYWORD_ITEM}(","{KEYWORD_ITEM})*
+KEYWORD_ITEM {IDENTIFIER}"="{EXPRESSION}
+POWER {PRIMARY}("**"{U_EXPR})?
+U_EXPR ({POWER}|"-"{U_EXPR}|"+"{U_EXPR}|"\~"{U_EXPR})
+M_EXPR ({U_EXPR}|{M_EXPR}"*"{U_EXPR}|{M_EXPR}"//"{U_EXPR}|{M_EXPR}"/"{U_EXPR}|{M_EXPR}"\%"{U_EXPR})
+A_EXPR ({M_EXPR}|{A_EXPR}"+"{M_EXPR}|{A_EXPR}"-"{M_EXPR}
+SHIFT_EXPR ({A_EXPR}|{SHIFT_EXPR}("<<"|">>"){A_EXPR})
+AND_EXPR ({SHIFT_EXPR}|{AND_EXPR}"\;SPMamp;"{SHIFT_EXPR}
+XOR_EXPR ({AND_EXPR}|{XOR_EXPR}"\textasciicircum"{AND_EXPR})
+OR_EXPR ({XOR_EXPR}|{OR_EXPR}"|"{ XOR_EXPR})
+
+COMPARISON {OR_EXPR}({COMP_OPERATOR}{OR_EXPR})*
+COMP_OPERATOR ("<"|">"|"=="|">="|"<="|"<>"|"!="|"is""not"?|"not"?"in")
+EXPRESSION ({OR_TEST}|{LAMBDA_FORM})
+OR_TEST ({AND_TEST}|{OR_TEST}"or"{AND_TEST})
+AND_TEST ({NOT_TEST}|{AND_TEST}"and"{NOT_TEST})
+NOT_TEST ({COMPARISON}|"not"{NOT_TEST})
+LAMBDA_FORM "lambda"{PARAMETER_LIST}?":"{EXPRESSION}
+EXPRESSION_LIST {EXPRESSION}(","{EXPRESSION})*","?
+SIMPLE_STMT ({EXPRESSION_STMT}|{ASSERT_STMT}|{ASSIGNMENT_STMT}|{AUGMENTED_ASSIGNMENT_STMT}|{PASS_STMT}|{DEL_STMT}|{PRINT_STMT}|{RETURN_STMT}|{YIELD_STMT}|{RAISE_STMT}|{BREAK_STMT}|{CONTINUE_STMT}|{IMPORT_STMT}|{GLOBAL_STMT}|{EXEC_STMT})
+EXPRESSION_STMT {EXPRESSION_LIST}
+ASSERT_STMT "assert"{EXPRESSION}(","{EXPRESSION})?
+ASSIGNMENT_STMT ({TARGET_LIST}"=")+{EXPRESSION_LIST}
+TARGET_LIST {TARGET}(","{TARGET})*","?
+TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUTEREF}|{SUBSCRIPTION}|{SLICING})
+
+%option noyywrap
+%option stack
+
+%x Body
+
+%x FunctionDec
+%x FunctionParams
+
+%x ClassDec
+%x ClassInheritance
+
+%x Suite
+%x SuiteCaptureIndent
+%x SuiteStart
+%x SuiteMaintain
+%x SuiteContinuing
+
+%x LongString
+
+%x SingleQuoteString
+%x DoubleQuoteString
+%x TripleString
+
+%x DocBlock
+%%
+
+<Body,Suite>{
+ "def"{BB} {
+ startFontClass(yyscanner,"keyword");
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN( FunctionDec );
+ }
+
+ "class"{BB} {
+ startFontClass(yyscanner,"keyword");
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN( ClassDec );
+ }
+ "None" {
+ startFontClass(yyscanner,"keywordtype");
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ "self."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER}"(" {
+ codify(yyscanner,"self.");
+ findMemberLink(yyscanner,*yyextra->code,&yytext[5]);
+ }
+ "self."{IDENTIFIER}/"(" {
+ codify(yyscanner,"self.");
+ findMemberLink(yyscanner,*yyextra->code,&yytext[5]);
+ }
+ "self."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER} {
+ codify(yyscanner,"self.");
+ findMemberLink(yyscanner,*yyextra->code,&yytext[5]);
+ }
+ "self."{IDENTIFIER} {
+ codify(yyscanner,"self.");
+ findMemberLink(yyscanner,*yyextra->code,&yytext[5]);
+ }
+ "cls."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER}"(" {
+ codify(yyscanner,"cls.");
+ findMemberLink(yyscanner,*yyextra->code,&yytext[4]);
+ }
+ "cls."{IDENTIFIER}/"(" {
+ codify(yyscanner,"cls.");
+ findMemberLink(yyscanner,*yyextra->code,&yytext[4]);
+ }
+ "cls."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER} {
+ codify(yyscanner,"cls.");
+ findMemberLink(yyscanner,*yyextra->code,&yytext[4]);
+ }
+ "cls."{IDENTIFIER} {
+ codify(yyscanner,"cls.");
+ findMemberLink(yyscanner,*yyextra->code,&yytext[4]);
+ }
+ "@"{SCOPE}{CALLANY}? { // decorator
+ startFontClass(yyscanner,"preprocessor");
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+}
+
+<ClassDec>{IDENTIFIER} {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ // codify(yyscanner,yytext);
+ yyextra->curClassName = yytext;
+ yyextra->curClassBases.clear();
+ BEGIN( ClassInheritance );
+ }
+
+<ClassInheritance>{
+ ({BB}|[(,)]) {
+ codify(yyscanner,yytext);
+ }
+
+ ({IDENTIFIER}".")*{IDENTIFIER} {
+ // The parser
+ // is assuming
+ // that ALL identifiers
+ // in this state
+ // are base classes;
+ // it doesn't check to see
+ // that the first parenthesis
+ // has been seen.
+
+ // This is bad - it should
+ // probably be more strict
+ // about what to accept.
+
+ yyextra->curClassBases.inSort(yytext);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ // codify(yyscanner,yytext);
+ }
+
+ ":" {
+ codify(yyscanner,yytext);
+
+ // Assume this will
+ // be a one-line suite;
+ // found counter-example
+ // in SuiteStart.
+
+ // Push a class scope
+
+ std::unique_ptr<ClassDef> classDefToAdd { createClassDef("<code>",1,1,yyextra->curClassName,ClassDef::Class,0,0,FALSE) };
+ ScopedTypeVariant var(yyextra->curClassName);
+ char *s=yyextra->curClassBases.first();
+ while (s)
+ {
+ const ClassDef *baseDefToAdd = 0;
+ // find class in the local scope
+ auto it = yyextra->codeClassMap.find(s);
+ if (it != yyextra->codeClassMap.end())
+ {
+ baseDefToAdd = toClassDef(it->second.globalDef());
+ }
+ // Try to find class in global scope
+ if (baseDefToAdd==0)
+ {
+ baseDefToAdd=yyextra->symbolResolver.resolveClass(yyextra->currentDefinition,s);
+ }
+
+ if (baseDefToAdd && baseDefToAdd->name()!=yyextra->curClassName)
+ {
+ var.localDef()->insertBaseClass(baseDefToAdd->name());
+ }
+
+ s=yyextra->curClassBases.next();
+ }
+ yyextra->codeClassMap.emplace(std::make_pair(yyextra->curClassName.str(),std::move(var)));
+
+ // Reset class-parsing variables.
+ yyextra->curClassName.resize(0);
+ yyextra->curClassBases.clear();
+
+ yyextra->noSuiteFound = TRUE;
+ BEGIN( SuiteStart );
+ }
+}
+
+
+<FunctionDec>{
+ {IDENTIFIER} {
+ generateFunctionLink(yyscanner,*yyextra->code,yytext);
+ }
+
+ {B}"(" {
+ codify(yyscanner,yytext);
+ BEGIN( FunctionParams );
+ }
+}
+
+<FunctionParams>{
+ ({BB}|",") {
+ // Parses delimiters
+ codify(yyscanner,yytext);
+ }
+
+ ({IDENTIFIER}|{PARAMNONEMPTY}+) {
+ codify(yyscanner,yytext);
+ }
+
+ ")" {
+ codify(yyscanner,yytext);
+ }
+
+ "\n" {
+ codifyLines(yyscanner,yytext);
+ }
+
+ ":" {
+ codify(yyscanner,yytext);
+
+ // Assume this will
+ // be a one-line suite;
+ // found counter-example
+ // in SuiteStart.
+ yyextra->noSuiteFound = TRUE;
+ BEGIN( SuiteStart );
+ }
+}
+
+<Body,Suite>{
+
+ {KEYWORD} {
+ // Position-sensitive rules!
+ // Must come AFTER keyword-triggered rules
+ // Must come BEFORE identifier NONEMPTY-like rules
+ // to syntax highlight.
+
+ startFontClass(yyscanner,"keyword");
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+
+ {FLOWKW} {
+ if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction())
+ {
+ std::lock_guard<std::mutex> lock(g_countFlowKeywordsMutex);
+ MemberDefMutable *mdm = toMemberDefMutable(yyextra->currentMemberDef);
+ if (mdm)
+ {
+ mdm->incrementFlowKeyWordCount();
+ }
+ }
+ startFontClass(yyscanner,"keywordflow");
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+ ({IDENTIFIER}".")*{IDENTIFIER}/"(" {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ }
+ ({IDENTIFIER}".")+{IDENTIFIER} {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext,TRUE);
+ }
+ {IDENTIFIER} { codify(yyscanner,yytext); }
+
+}
+
+
+
+<SuiteStart>{
+
+ {BB} {
+ codify(yyscanner,yytext);
+ }
+ "pass" {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN(Body);
+ }
+ {KEYWORD} {
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+
+ // No indentation necessary
+ yyextra->noSuiteFound = FALSE;
+ }
+
+ {FLOWKW} {
+ if (yyextra->currentMemberDef && yyextra->currentMemberDef->isFunction())
+ {
+ std::lock_guard<std::mutex> lock(g_countFlowKeywordsMutex);
+ MemberDefMutable *mdm = toMemberDefMutable(yyextra->currentMemberDef);
+ if (mdm)
+ {
+ mdm->incrementFlowKeyWordCount();
+ }
+ }
+ startFontClass(yyscanner,"keywordflow");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+
+ // No indentation necessary
+ yyextra->noSuiteFound = FALSE;
+ }
+ {IDENTIFIER} {
+ codify(yyscanner,yytext);
+ }
+
+
+ {POUNDCOMMENT} {
+ if (YY_START==SingleQuoteString ||
+ YY_START==DoubleQuoteString ||
+ YY_START==TripleString
+ )
+ {
+ REJECT;
+ }
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(DocBlock);
+ yyextra->docBlock=yytext;
+ }
+
+ {NEWLINE} {
+ codifyLines(yyscanner,yytext);
+ if ( yyextra->noSuiteFound )
+ {
+ // printf("New suite to capture! [%d]\n", yyextra->yyLineNr);
+ BEGIN ( SuiteCaptureIndent );
+ }
+ }
+}
+
+<SuiteCaptureIndent>{
+ "\n"|({BB}"\n") {
+ // Blankline - ignore, keep looking for indentation.
+ codifyLines(yyscanner,yytext);
+ }
+
+ {BB} {
+ // This state lasts momentarily,
+ // to check the indentation
+ // level that is about to be
+ // used.
+ codifyLines(yyscanner,yytext);
+ yyextra->indents.push(yyleng);
+ // printf("Captured indent of %d [line %d]\n", yyleng, yyextra->yyLineNr);
+ BEGIN( Suite );
+ }
+}
+
+<SuiteMaintain>{
+
+ {BB}/({NONEMPTY}|{EXPCHAR}) {
+ // This implements poor
+ // indentation-tracking;
+ // should be improved.
+ // (translate tabs to space, etc)
+ codifyLines(yyscanner,yytext);
+ adjustScopesAndSuites(yyscanner,static_cast<int>(yyleng));
+ }
+
+ "\n"|({BB}"\n") {
+ // If this ever succeeds,
+ // it means that this is
+ // a blank line, and
+ // can be ignored.
+ codifyLines(yyscanner,yytext);
+ }
+
+ ""/({NONEMPTY}|{EXPCHAR}) {
+ // Default rule; matches
+ // the empty string, assuming
+ // real text starts here.
+ // Just go straight to Body.
+ adjustScopesAndSuites(yyscanner,0);
+ }
+}
+
+
+<Suite>{NEWLINE} {
+ codifyLines(yyscanner,yytext);
+ BEGIN( SuiteMaintain );
+ }
+<Body>{IDENTIFIER} {
+ codify(yyscanner,yytext);
+ }
+<Body>{NEWLINE} {
+ codifyLines(yyscanner,yytext);
+ }
+
+<SingleQuoteString>{ // Single quoted string like 'That\'s a """nice""" string!'
+ \\{B}\n { // line continuation
+ codifyLines(yyscanner,yytext);
+ }
+ \\. { // escaped char
+ codify(yyscanner,yytext);
+ }
+ {STRINGPREFIX}?{TRIDOUBLEQUOTE} { // triple double quotes
+ codify(yyscanner,yytext);
+ }
+ "'" { // end of the string
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN(yyextra->stringContext);
+ }
+ [^"'\n\\]+ { // normal chars
+ codify(yyscanner,yytext);
+ }
+ . { // normal char
+ codify(yyscanner,yytext);
+ }
+}
+
+<DoubleQuoteString>{ // Double quoted string like "That's \"a '''nice'''\" string!"
+ \\{B}\n { // line continuation
+ codifyLines(yyscanner,yytext);
+ }
+ \\. { // escaped char
+ codify(yyscanner,yytext);
+ }
+ {STRINGPREFIX}?{TRISINGLEQUOTE} { // triple single quotes
+ codify(yyscanner,yytext);
+ }
+ "\"" { // end of the string
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+ BEGIN(yyextra->stringContext);
+ }
+ [^"'\n\\]+ { // normal chars
+ codify(yyscanner,yytext);
+ }
+ . { // normal char
+ codify(yyscanner,yytext);
+ }
+}
+
+<TripleString>{
+ {TRIDOUBLEQUOTE} |
+ {TRISINGLEQUOTE} {
+ codify(yyscanner,yytext);
+ if (yyextra->doubleQuote==(yytext[0]=='"'))
+ {
+ endFontClass(yyscanner);
+ BEGIN(yyextra->stringContext);
+ }
+ }
+ {LONGSTRINGBLOCK} {
+ codifyLines(yyscanner,yytext);
+ }
+ \n {
+ codifyLines(yyscanner,yytext);
+ }
+ . {
+ codify(yyscanner,yytext);
+ }
+}
+
+
+<*>{STRINGPREFIX}?{TRISINGLEQUOTE} {
+ if (YY_START==SingleQuoteString) REJECT;
+ startFontClass(yyscanner,"stringliteral");
+ yyextra->stringContext=YY_START;
+ yyextra->doubleQuote=yytext[yyleng-1]=='"';
+ codify(yyscanner,yytext);
+ BEGIN(TripleString);
+ }
+<*>{STRINGPREFIX}?{TRIDOUBLEQUOTE} {
+ if (YY_START==DoubleQuoteString) REJECT;
+ startFontClass(yyscanner,"stringliteral");
+ yyextra->stringContext=YY_START;
+ yyextra->doubleQuote=yytext[yyleng-1]=='"';
+ codify(yyscanner,yytext);
+ BEGIN(TripleString);
+ }
+<*>{STRINGPREFIX}?"'" { // single quoted string
+ if (YY_START==SingleQuoteString ||
+ YY_START==DoubleQuoteString ||
+ YY_START==TripleString)
+ {
+ REJECT;
+ }
+ startFontClass(yyscanner,"stringliteral");
+ yyextra->stringContext=YY_START;
+ codify(yyscanner,yytext);
+ BEGIN(SingleQuoteString);
+ }
+<*>{STRINGPREFIX}?"\"" { // double quoted string
+ if (YY_START==SingleQuoteString ||
+ YY_START==DoubleQuoteString ||
+ YY_START==TripleString)
+ {
+ REJECT;
+ }
+ startFontClass(yyscanner,"stringliteral");
+ yyextra->stringContext=YY_START;
+ codify(yyscanner,yytext);
+ BEGIN(DoubleQuoteString);
+ }
+<DocBlock>.* { // contents of current comment line
+ yyextra->docBlock+=yytext;
+ }
+<DocBlock>"\n"{B}("#") { // comment block (next line is also comment line)
+ yyextra->docBlock+=yytext;
+ }
+<DocBlock>{NEWLINE} { // comment block ends at the end of this line
+ // remove special comment (default config)
+ if (Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ yyextra->yyLineNr+=((QCString)yyextra->docBlock).contains('\n');
+ yyextra->endComment=TRUE;
+ }
+ else // do not remove comment
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yyextra->docBlock);
+ endFontClass(yyscanner);
+ }
+ unput(*yytext);
+ yy_pop_state(yyscanner);
+ }
+<*>{POUNDCOMMENT}.* {
+ if (YY_START==SingleQuoteString ||
+ YY_START==DoubleQuoteString ||
+ YY_START==TripleString)
+ {
+ REJECT;
+ }
+ yy_push_state(YY_START,yyscanner);
+ BEGIN(DocBlock);
+ yyextra->docBlock=yytext;
+ }
+<*>"#".* { // normal comment
+ if (YY_START==SingleQuoteString ||
+ YY_START==DoubleQuoteString ||
+ YY_START==TripleString)
+ {
+ REJECT;
+ }
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<*>{NEWLINE} {
+ if (yyextra->endComment)
+ {
+ yyextra->endComment=FALSE;
+ }
+ else
+ {
+ codifyLines(yyscanner,yytext);
+ }
+ //printf("[pycode] %d NEWLINE [line %d] no match\n",
+ // YY_START, yyextra->yyLineNr);
+
+ BEGIN(Body);
+ }
+
+<*>[ \t]+ {
+ codify(yyscanner,yytext);
+ BEGIN(Body);
+ }
+<*>. {
+ codify(yyscanner,yytext);
+ // printf("[pycode] '%s' [ state %d ] [line %d] no match\n",
+ // yytext, YY_START, yyextra->yyLineNr);
+
+ BEGIN(Body);
+ }
+
+<*><<EOF>> {
+ if (YY_START==DocBlock && !Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yyextra->docBlock);
+ endFontClass(yyscanner);
+ }
+ yyterminate();
+ }
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+#if 0 // TODO: call me to store local variables and get better syntax highlighting, see code.l
+static void addVariable(yyscan_t yyscanner, QCString type, QCString name)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//printf("PyVariableContext::addVariable(%s,%s)\n",type.data(),name.data());
QCString ltype = type.simplifyWhiteSpace();
QCString lname = name.simplifyWhiteSpace();
- Scope *scope = m_scopes.count()==0 ? &m_globalScope : m_scopes.getLast();
- const ClassDef *varType;
- if (
- (varType=g_codeClassSDict[ltype]) || // look for class definitions inside the code block
- (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,ltype)) // look for global class definitions
- )
+ auto it = yyextra->codeClassMap.find(ltype.str());
+ if (it!=yyextra->codeClassMap.end())
{
- scope->append(lname,varType); // add it to a list
+ yyextra->theVarContext.addVariable(lname,std::move(it->second));
}
- else
+ else
{
- if (m_scopes.count()>0) // for local variables add a dummy entry so the name
- // is hidden to avoid FALSE links to global variables with the same name
- // TODO: make this work for namespaces as well!
+ const ClassDef *varType = getResolvedClass(yyextra->currentDefinition,yyextra->sourceFileDef,ltype); // look for global class definitions
+ if (varType)
{
- scope->append(lname,dummyContext);
+ yyextra->theVarContext.addVariable(lname,ScopedTypeVariant(varType));
+ }
+ else
+ {
+ if (!yyextra->theVarContext.atGlobalScope()) // for local variable add a dummy entry to avoid linking to a global that is shadowed.
+ {
+ yyextra->theVarContext.addVariable(lname.str(),ScopedTypeVariant());
+ }
}
}
}
+#endif
+
+//-------------------------------------------------------------------------------
-ClassDef *PyVariableContext::findVariable(const QCString &name)
+static yy_size_t yyread(yyscan_t yyscanner, char *buf,yy_size_t max_size)
{
- if (name.isEmpty()) return 0;
- ClassDef *result = 0;
- QListIterator<Scope> sli(m_scopes);
- Scope *scope;
- // search from inner to outer scope
- for (sli.toLast();(scope=sli.current());--sli)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yy_size_t inputPosition = yyextra->inputPosition;
+ const char *s = yyextra->inputString + inputPosition;
+ yy_size_t c=0;
+ while( c < max_size && *s )
{
- result = scope->find(name);
- if (result)
- {
- return result;
- }
+ *buf++ = *s++;
+ c++;
}
- // nothing found -> also try the global scope
- result=m_globalScope.find(name);
- return result;
+ yyextra->inputPosition += c;
+ return c;
}
-static PyVariableContext g_theVarContext;
-const ClassDef *PyVariableContext::dummyContext = (ClassDef*)0x8;
+//-------------------------------------------------------------------------------
-class PyCallContext
+/*!
+ Examines current stack of white-space indentations;
+ re-syncs the parser with the correct scope.
+*/
+static void adjustScopesAndSuites(yyscan_t yyscanner,unsigned indentLength)
{
- public:
- struct Ctx
- {
- Ctx() : name(g_name), type(g_type), cd(0) {}
- QCString name;
- QCString type;
- const ClassDef *cd;
- };
-
- PyCallContext()
- {
- m_classList.append(new Ctx);
- m_classList.setAutoDelete(TRUE);
- }
-
- virtual ~PyCallContext() {}
-
- void setClass(const ClassDef *cd)
- {
- Ctx *ctx = m_classList.getLast();
- if (ctx)
- {
- ctx->cd=cd;
- }
- }
- void pushScope()
- {
- m_classList.append(new Ctx);
- }
-
- void popScope()
- {
- if (m_classList.count()>1)
- {
- Ctx *ctx = m_classList.getLast();
- if (ctx)
- {
- g_name = ctx->name;
- g_type = ctx->type;
- }
- m_classList.removeLast();
- }
- else
- {
- }
- }
-
- void clear()
- {
- m_classList.clear();
- m_classList.append(new Ctx);
- }
-
- const ClassDef *getClass() const
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ // States to pop
+ if (!yyextra->indents.empty() && indentLength < yyextra->indents.top())
+ {
+ while (!yyextra->indents.empty() && indentLength < yyextra->indents.top())
{
- Ctx *ctx = m_classList.getLast();
+ // printf("Exited scope indent of [%d]\n", yyextra->indents.top());
+ yyextra->indents.pop(); // Pop the old suite's indentation
- if (ctx)
- return ctx->cd;
- else
- return 0;
+ yyextra->currentMemberDef=0;
+ if (yyextra->currentDefinition)
+ yyextra->currentDefinition=yyextra->currentDefinition->getOuterScope();
}
+ }
- private:
- QList<Ctx> m_classList;
-};
-
-static PyCallContext g_theCallContext;
+ // Are there any remaining indentation levels for suites?
+ if (!yyextra->indents.empty())
+ {
+ BEGIN( Suite );
+ }
+ else
+ {
+ BEGIN( Body );
+ }
+}
+//-------------------------------------------------------------------------------
/*! counts the number of lines in the input */
-static int countLines()
+static int countLines(yyscan_t yyscanner)
{
- const char *p=g_inputString;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ const char *p=yyextra->inputString;
char c;
int count=1;
- while ((c=*p))
- {
- p++ ;
- if (c=='\n') count++;
+ while ((c=*p))
+ {
+ p++;
+ if (c=='\n') count++;
}
- if (p>g_inputString && *(p-1)!='\n')
+ if (p>yyextra->inputString && *(p-1)!='\n')
{ // last line does not end with a \n, so we add an extra
// line and explicitly terminate the line after parsing.
- count++,
- g_needsTermination=TRUE;
- }
+ count++;
+ yyextra->needsTermination=TRUE;
+ }
return count;
}
-static void setCurrentDoc(const QCString &anchor)
+//-------------------------------------------------------------------------------
+
+static void setCurrentDoc(yyscan_t yyscanner, const QCString &anchor)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
- if (g_searchCtx)
+ std::lock_guard<std::mutex> lock(g_searchIndexMutex);
+ if (yyextra->searchCtx)
{
- Doxygen::searchIndex->setCurrentDoc(g_searchCtx,g_searchCtx->anchor(),FALSE);
+ yyextra->code->setCurrentDoc(yyextra->searchCtx,yyextra->searchCtx->anchor(),FALSE);
}
else
{
- Doxygen::searchIndex->setCurrentDoc(g_sourceFileDef,anchor,TRUE);
+ yyextra->code->setCurrentDoc(yyextra->sourceFileDef,anchor,TRUE);
}
}
}
-static void addToSearchIndex(const char *text)
+//-------------------------------------------------------------------------------
+
+static void addToSearchIndex(yyscan_t yyscanner, const char *text)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
- Doxygen::searchIndex->addWord(text,FALSE);
+ std::lock_guard<std::mutex> lock(g_searchIndexMutex);
+ yyextra->code->addWord(text,FALSE);
}
}
+//-------------------------------------------------------------------------------
-static const ClassDef *stripClassName(const char *s,Definition *d=g_currentDefinition)
+static const ClassDef *stripClassName(yyscan_t yyscanner,const char *s,Definition *d)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
int pos=0;
QCString type = s;
QCString className;
@@ -330,15 +976,14 @@ static const ClassDef *stripClassName(const char *s,Definition *d=g_currentDefin
while (extractClassNameFromType(type,pos,className,templSpec)!=-1)
{
QCString clName=className+templSpec;
-
const ClassDef *cd=0;
- if (!g_classScope.isEmpty())
+ if (!yyextra->classScope.isEmpty())
{
- cd=getResolvedClass(d,g_sourceFileDef,g_classScope+"::"+clName);
+ cd=yyextra->symbolResolver.resolveClass(d,yyextra->classScope+"::"+clName);
}
if (cd==0)
{
- cd=getResolvedClass(d,g_sourceFileDef,clName);
+ cd=yyextra->symbolResolver.resolveClass(d,clName);
}
if (cd)
{
@@ -349,104 +994,117 @@ static const ClassDef *stripClassName(const char *s,Definition *d=g_currentDefin
return 0;
}
+//-------------------------------------------------------------------------------
-
-/*! start a new line of code, inserting a line number if g_sourceFileDef
+/*! start a new line of code, inserting a line number if yyextra->sourceFileDef
* is TRUE. If a definition starts at the current line, then the line
* number is linked to the documentation of that definition.
*/
-static void startCodeLine()
+static void startCodeLine(yyscan_t yyscanner)
{
- //if (g_currentFontClass) { g_code->endFontClass(); }
- if (g_sourceFileDef)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ //if (yyextra->currentFontClass) { yyextra->code->endFontClass(yyscanner); }
+ if (yyextra->sourceFileDef)
{
//QCString lineNumber,lineAnchor;
- //lineNumber.sprintf("%05d",g_yyLineNr);
- //lineAnchor.sprintf("l%05d",g_yyLineNr);
-
- Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
- //printf("startCodeLine %d d=%p\n",g_yyLineNr,d);
- //g_code->startLineNumber();
-
- if (!g_includeCodeFragment && d && d->isLinkableInProject())
+ //lineNumber.sprintf("%05d",yyextra->yyLineNr);
+ //lineAnchor.sprintf("l%05d",yyextra->yyLineNr);
+
+ const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr);
+ //printf("startCodeLine %d d=%p\n",yyextra->yyLineNr,d);
+ //yyextra->code->startLineNumber();
+
+ if (!yyextra->includeCodeFragment && d && d->isLinkableInProject())
{
- g_currentDefinition = d;
- g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
- //g_insideBody = FALSE;
- g_endComment = FALSE;
- g_searchingForBody = TRUE;
- g_realScope = d->name().copy();
- g_classScope = d->name().copy();
- //printf("Real scope: '%s'\n",g_realScope.data());
- g_bodyCurlyCount = 0;
+ yyextra->currentDefinition = d;
+ yyextra->currentMemberDef = yyextra->sourceFileDef->getSourceMember(yyextra->yyLineNr);
+ //yyextra->insideBody = FALSE;
+ yyextra->endComment = FALSE;
+ yyextra->searchingForBody = TRUE;
+ yyextra->realScope = d->name().copy();
+ yyextra->classScope = d->name().copy();
+ //printf("Real scope: '%s'\n",yyextra->realScope.data());
+ yyextra->bodyCurlyCount = 0;
QCString lineAnchor;
- lineAnchor.sprintf("l%05d",g_yyLineNr);
- if (g_currentMemberDef)
+ lineAnchor.sprintf("l%05d",yyextra->yyLineNr);
+ if (yyextra->currentMemberDef)
{
- g_code->writeLineNumber(g_currentMemberDef->getReference(),
- g_currentMemberDef->getOutputFileBase(),
- g_currentMemberDef->anchor(),g_yyLineNr);
- setCurrentDoc(lineAnchor);
+ yyextra->code->writeLineNumber(yyextra->currentMemberDef->getReference(),
+ yyextra->currentMemberDef->getOutputFileBase(),
+ yyextra->currentMemberDef->anchor(),yyextra->yyLineNr);
+ setCurrentDoc(yyscanner,lineAnchor);
}
else
{
- g_code->writeLineNumber(d->getReference(),
- d->getOutputFileBase(),
- 0,g_yyLineNr);
- setCurrentDoc(lineAnchor);
+ yyextra->code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,yyextra->yyLineNr);
+ setCurrentDoc(yyscanner,lineAnchor);
}
}
else
{
- //g_code->codify(lineNumber);
- g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ //yyextra->code->codify(lineNumber);
+ yyextra->code->writeLineNumber(0,0,0,yyextra->yyLineNr);
}
- //g_code->endLineNumber();
+ //yyextra->code->endLineNumber();
}
- g_code->startCodeLine(g_sourceFileDef);
- if (g_currentFontClass)
+ yyextra->code->startCodeLine(yyextra->sourceFileDef);
+ if (yyextra->currentFontClass)
{
- g_code->startFontClass(g_currentFontClass);
+ yyextra->code->startFontClass(yyextra->currentFontClass);
}
}
-static void codify(const char* text)
-{
- g_code->codify(text);
+//-------------------------------------------------------------------------------
+
+static void codify(yyscan_t yyscanner,const char* text)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yyextra->code->codify(text);
}
-static void endCodeLine()
+//-------------------------------------------------------------------------------
+
+static void endCodeLine(yyscan_t yyscanner)
{
- endFontClass();
- g_code->endCodeLine();
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ endFontClass(yyscanner);
+ yyextra->code->endCodeLine();
}
-static void nextCodeLine()
+//-------------------------------------------------------------------------------
+
+static void nextCodeLine(yyscan_t yyscanner)
{
- const char *fc = g_currentFontClass;
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ const char *fc = yyextra->currentFontClass;
+ endCodeLine(yyscanner);
+ if (yyextra->yyLineNr<yyextra->inputLines)
{
- g_currentFontClass = fc;
- startCodeLine();
+ yyextra->currentFontClass = fc;
+ startCodeLine(yyscanner);
}
}
+//-------------------------------------------------------------------------------
/*! writes a link to a fragment \a text that may span multiple lines, inserting
- * line numbers for each line. If \a text contains newlines, the link will be
+ * line numbers for each line. If \a text contains newlines, the link will be
* split into multiple links with the same destination, one for each line.
*/
-static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+static void writeMultiLineCodeLink(yyscan_t yyscanner,
+ CodeOutputInterface &ol,
const Definition *d,
const char *text)
{
- static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
- TooltipManager::instance()->addTooltip(d);
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
+ TooltipManager::instance().addTooltip(ol,d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
- QCString tooltip;
+ QCString tooltip;
if (!sourceTooltips) // fall back to simple "title" tooltips
{
tooltip = d->briefDescriptionAsTooltip();
@@ -460,11 +1118,11 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
while ((c=*p++) && c!='\n') { }
if (c=='\n')
{
- g_yyLineNr++;
+ yyextra->yyLineNr++;
*(p-1)='\0';
//printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
ol.writeCodeLink(ref,file,anchor,sp,tooltip);
- nextCodeLine();
+ nextCodeLine(yyscanner);
}
else
{
@@ -475,141 +1133,150 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
}
}
-static void startFontClass(const char *s)
+//-------------------------------------------------------------------------------
+
+static void startFontClass(yyscan_t yyscanner,const char *s)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
// if font class is already set don't stop and start it.
// strcmp does not like null pointers as input.
- if (!g_currentFontClass || !s || strcmp(g_currentFontClass,s))
+ if (!yyextra->currentFontClass || !s || strcmp(yyextra->currentFontClass,s))
{
- endFontClass();
- g_code->startFontClass(s);
- g_currentFontClass=s;
+ endFontClass(yyscanner);
+ yyextra->code->startFontClass(s);
+ yyextra->currentFontClass=s;
}
}
-static void endFontClass()
+//-------------------------------------------------------------------------------
+
+static void endFontClass(yyscan_t yyscanner)
{
- if (g_currentFontClass)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yyextra->currentFontClass)
{
- g_code->endFontClass();
- g_currentFontClass=0;
+ yyextra->code->endFontClass();
+ yyextra->currentFontClass=0;
}
}
-static void codifyLines(char *text)
+//-------------------------------------------------------------------------------
+
+static void codifyLines(yyscan_t yyscanner,const char *text)
{
- //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
- char *p=text,*sp=p;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ //printf("codifyLines(%d,\"%s\")\n",yyextra->yyLineNr,text);
+ const char *p=text,*sp=p;
char c;
bool done=FALSE;
- const char * tmp_currentFontClass = g_currentFontClass;
while (!done)
{
sp=p;
while ((c=*p++) && c!='\n') { }
if (c=='\n')
{
- g_yyLineNr++;
- *(p-1)='\0';
- g_code->codify(sp);
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- if (tmp_currentFontClass)
- {
- startFontClass(tmp_currentFontClass);
- }
+ yyextra->yyLineNr++;
+ int l = (int)(p-sp-1);
+ char *tmp = (char*)malloc(l+1);
+ memcpy(tmp,sp,l);
+ tmp[l]='\0';
+ yyextra->code->codify(tmp);
+ free(tmp);
+ nextCodeLine(yyscanner);
}
else
{
- g_code->codify(sp);
+ yyextra->code->codify(sp);
done=TRUE;
}
}
}
-static void codifyLines(const QCString &str)
-{
- char *tmp= (char *)malloc(str.length()+1);
- qstrcpy(tmp, str);
- codifyLines(tmp);
- free(tmp);
-}
+//-------------------------------------------------------------------------------
-static bool getLinkInScope(const QCString &c, // scope
+static bool getLinkInScope(yyscan_t yyscanner,
+ const QCString &c, // scope
const QCString &m, // member
- const char *memberText, // exact text
- CodeOutputInterface &ol,
- const char *text
- )
+ const char *memberText, // exact text
+ CodeOutputInterface &ol,
+ const char *text
+ )
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
const MemberDef *md = 0;
const ClassDef *cd = 0;
const FileDef *fd = 0;
const NamespaceDef *nd = 0;
const GroupDef *gd = 0;
//printf("Trying '%s'::'%s'\n",c.data(),m.data());
- if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
+ if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,yyextra->sourceFileDef) &&
md->isLinkable())
{
//Definition *d=0;
//if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
const Definition *d = md->getOuterScope()==Doxygen::globalScope ?
- md->getBodyDef() : md->getOuterScope();
+ md->getBodyDef() : md->getOuterScope();
//printf("Found! d=%s\n",d?d->name().data():"<none>");
if (md->getGroupDef()) d = md->getGroupDef();
if (d && d->isLinkable())
{
- g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
- //printf("g_currentDefinition=%p g_currentMemberDef=%p\n",
- // g_currentDefinition,g_currentMemberDef);
+ yyextra->theCallContext.setScope(ScopedTypeVariant(stripClassName(yyscanner,md->typeString(),md->getOuterScope())));
+ //printf("yyextra->currentDefinition=%p yyextra->currentMemberDef=%p\n",
+ // yyextra->currentDefinition,yyextra->currentMemberDef);
- if (g_currentDefinition && g_currentMemberDef &&
- md!=g_currentMemberDef && g_collectXRefs)
+ if (yyextra->currentDefinition && yyextra->currentMemberDef &&
+ md!=yyextra->currentMemberDef && yyextra->collectXRefs)
{
- addDocCrossReference(g_currentMemberDef,const_cast<MemberDef*>(md));
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(md));
}
//printf("d->getReference()='%s' d->getOutputBase()='%s' name='%s' member name='%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
-
- writeMultiLineCodeLink(ol,md, text ? text : memberText);
- addToSearchIndex(text ? text : memberText);
+
+ writeMultiLineCodeLink(yyscanner,ol,md, text ? text : memberText);
+ addToSearchIndex(yyscanner,text ? text : memberText);
return TRUE;
- }
+ }
}
return FALSE;
}
-static bool getLink(const char *className,
+//-------------------------------------------------------------------------------
+
+static bool getLink(yyscan_t yyscanner,
+ const char *className,
const char *memberName,
- CodeOutputInterface &ol,
- const char *text=0)
+ CodeOutputInterface &ol,
+ const char *text)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
QCString m=removeRedundantWhiteSpace(memberName);
QCString c=className;
- if (!getLinkInScope(c,m,memberName,ol,text))
+ if (!getLinkInScope(yyscanner,c,m,memberName,ol,text))
{
- if (!g_curClassName.isEmpty())
+ if (!yyextra->curClassName.isEmpty())
{
if (!c.isEmpty()) c.prepend("::");
- c.prepend(g_curClassName);
- return getLinkInScope(c,m,memberName,ol,text);
+ c.prepend(yyextra->curClassName);
+ return getLinkInScope(yyscanner,c,m,memberName,ol,text);
}
return FALSE;
}
return TRUE;
}
+//-------------------------------------------------------------------------------
/*
For a given string in the source code,
finds its class or global id and links to it.
*/
-static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
- bool typeOnly=FALSE)
+static void generateClassOrGlobalLink(yyscan_t yyscanner,
+ CodeOutputInterface &ol,
+ const char *clName,
+ bool typeOnly)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
QCString className=clName;
// Don't do anything for empty text
@@ -617,20 +1284,22 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
DBG_CTX((stderr,"generateClassOrGlobalLink(className=%s)\n",className.data()));
- const ClassDef *cd=0,*lcd=0; /** Class def that we may find */
- const MemberDef *md=0; /** Member def that we may find */
+ const ScopedTypeVariant *lcd = 0;
+ const ClassDef *cd=0; // Class def that we may find
+ const MemberDef *md=0; // Member def that we may find
//bool isLocal=FALSE;
- if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable
+ if ((lcd=yyextra->theVarContext.findVariable(className))==0) // not a local variable
{
- Definition *d = g_currentDefinition;
+ const Definition *d = yyextra->currentDefinition;
QCString scope = substitute(className,".","::");
- cd = getResolvedClass(d,g_sourceFileDef,substitute(className,".","::"),&md);
+ cd = yyextra->symbolResolver.resolveClass(d,substitute(className,".","::"));
+ md = yyextra->symbolResolver.getTypedef();
- DBG_CTX((stderr,"d=%s g_sourceFileDef=%s\n",
+ DBG_CTX((stderr,"d=%s yyextra->sourceFileDef=%s\n",
d?d->displayName().data():"<null>",
- g_currentDefinition?g_currentDefinition->displayName().data():"<null>"));
+ yyextra->currentDefinition?yyextra->currentDefinition->displayName().data():"<null>"));
DBG_CTX((stderr,"is found as a type %s\n",cd?cd->name().data():"<null>"));
if (cd==0 && md==0) // also see if it is variable or enum or enum value
@@ -638,21 +1307,21 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
const NamespaceDef *nd = getResolvedNamespace(scope);
if (nd)
{
- writeMultiLineCodeLink(ol,nd,clName);
- addToSearchIndex(className);
+ writeMultiLineCodeLink(yyscanner,ol,nd,clName);
+ addToSearchIndex(yyscanner,className);
return;
}
- else if (getLink(g_classScope,clName,ol,clName))
+ else if (getLink(yyscanner,yyextra->classScope,clName,ol,clName))
{
- return;
+ return;
}
}
}
else
{
- if (lcd!=PyVariableContext::dummyContext)
+ if (lcd->type()!=ScopedTypeVariant::Dummy)
{
- g_theCallContext.setClass(lcd);
+ yyextra->theCallContext.setScope(*lcd);
}
//isLocal=TRUE;
DBG_CTX((stderr,"is a local variable cd=%p!\n",cd));
@@ -660,17 +1329,18 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
if (cd && cd->isLinkable()) // is it a linkable class
{
- writeMultiLineCodeLink(ol,cd,clName);
- addToSearchIndex(className);
+ writeMultiLineCodeLink(yyscanner,ol,cd,clName);
+ addToSearchIndex(yyscanner,className);
if (md)
{
const Definition *d = md->getOuterScope()==Doxygen::globalScope ?
md->getBodyDef() : md->getOuterScope();
if (md->getGroupDef()) d = md->getGroupDef();
- if (d && d->isLinkable() && md->isLinkable() &&
- g_currentMemberDef && g_collectXRefs)
+ if (d && d->isLinkable() && md->isLinkable() &&
+ yyextra->currentMemberDef && yyextra->collectXRefs)
{
- addDocCrossReference(g_currentMemberDef,const_cast<MemberDef*>(md));
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(md));
}
}
}
@@ -685,55 +1355,59 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
DBG_CTX((stderr,"scope=%s locName=%s mcd=%p\n",scope.data(),locName.data(),mcd));
if (mcd)
{
- MemberDef *md = mcd->getMemberByName(locName);
- if (md)
- {
- g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
- writeMultiLineCodeLink(ol,md,clName);
- addToSearchIndex(className);
- const Definition *d = md->getOuterScope()==Doxygen::globalScope ?
- md->getBodyDef() : md->getOuterScope();
- if (md->getGroupDef()) d = md->getGroupDef();
- if (d && d->isLinkable() && md->isLinkable() &&
- g_currentMemberDef && g_collectXRefs)
- {
- addDocCrossReference(g_currentMemberDef,md);
- }
- return;
- }
+ MemberDef *mmd = mcd->getMemberByName(locName);
+ if (mmd)
+ {
+ yyextra->theCallContext.setScope(ScopedTypeVariant(stripClassName(yyscanner,mmd->typeString(),mmd->getOuterScope())));
+ writeMultiLineCodeLink(yyscanner,ol,mmd,clName);
+ addToSearchIndex(yyscanner,className);
+ const Definition *d = mmd->getOuterScope()==Doxygen::globalScope ?
+ mmd->getBodyDef() : mmd->getOuterScope();
+ if (mmd->getGroupDef()) d = mmd->getGroupDef();
+ if (d && d->isLinkable() && mmd->isLinkable() &&
+ yyextra->currentMemberDef && yyextra->collectXRefs)
+ {
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(mmd));
+ }
+ return;
+ }
}
else // check namespace as well
{
const NamespaceDef *mnd = getResolvedNamespace(scope);
if (mnd)
{
- MemberDef *md=mnd->getMemberByName(locName);
- if (md)
+ const MemberDef *mmd=mnd->getMemberByName(locName);
+ if (mmd)
{
- //printf("name=%s scope=%s\n",locName.data(),scope.data());
- g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
- writeMultiLineCodeLink(ol,md,clName);
- addToSearchIndex(className);
- const Definition *d = md->getOuterScope()==Doxygen::globalScope ?
- md->getBodyDef() : md->getOuterScope();
- if (md->getGroupDef()) d = md->getGroupDef();
- if (d && d->isLinkable() && md->isLinkable() &&
- g_currentMemberDef && g_collectXRefs)
- {
- addDocCrossReference(g_currentMemberDef,md);
- }
- return;
+ //printf("name=%s scope=%s\n",locName.data(),scope.data());
+ yyextra->theCallContext.setScope(ScopedTypeVariant(stripClassName(yyscanner,mmd->typeString(),mmd->getOuterScope())));
+ writeMultiLineCodeLink(yyscanner,ol,mmd,clName);
+ addToSearchIndex(yyscanner,className);
+ const Definition *d = mmd->getOuterScope()==Doxygen::globalScope ?
+ mmd->getBodyDef() : mmd->getOuterScope();
+ if (mmd->getGroupDef()) d = mmd->getGroupDef();
+ if (d && d->isLinkable() && mmd->isLinkable() &&
+ yyextra->currentMemberDef && yyextra->collectXRefs)
+ {
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(mmd));
+ }
+ return;
}
}
}
}
-
+
// nothing found, just write out the word
- codifyLines(clName);
- addToSearchIndex(clName);
+ codifyLines(yyscanner,clName);
+ addToSearchIndex(yyscanner,clName);
}
}
+//-------------------------------------------------------------------------------
+
/*
As of June 1, this function seems to work
for file members, but scopes are not
@@ -741,11 +1415,12 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
so it doesn't work for classes yet.
*/
-static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
+static void generateFunctionLink(yyscan_t yyscanner,
+ CodeOutputInterface &ol,
+ const char *funcName)
{
- //CodeClassDef *ccd=0;
- ClassDef *ccd=0;
- QCString locScope=g_classScope.copy();
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ QCString locScope=yyextra->classScope;
QCString locFunc=removeRedundantWhiteSpace(funcName);
DBG_CTX((stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()));
int i=locFunc.findRev("::");
@@ -755,916 +1430,215 @@ static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
locFunc=locFunc.right(locFunc.length()-i-2).stripWhiteSpace();
}
//printf("generateFunctionLink(%s) classScope='%s'\n",locFunc.data(),locScope.data());
- if (!locScope.isEmpty() && (ccd=g_codeClassSDict[locScope]))
+ if (!locScope.isEmpty())
{
- //printf("using classScope %s\n",g_classScope.data());
- if (ccd->baseClasses())
+ auto it = yyextra->codeClassMap.find(locScope.str());
+ if (it!=yyextra->codeClassMap.end())
{
- BaseClassListIterator bcli(*ccd->baseClasses());
- for ( ; bcli.current() ; ++bcli)
+ ScopedTypeVariant ccd = it->second;
+ //printf("using classScope %s\n",yyextra->classScope.data());
+ if (ccd.localDef() && !ccd.localDef()->baseClasses().empty())
{
- if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName))
- {
- return;
- }
+ for (const auto &bcName : ccd.localDef()->baseClasses())
+ {
+ if (getLink(yyscanner,bcName,locFunc,ol,funcName))
+ {
+ return;
+ }
+ }
}
}
}
- if (!getLink(locScope,locFunc,ol,funcName))
+ if (!getLink(yyscanner,locScope,locFunc,ol,funcName))
{
- generateClassOrGlobalLink(ol,funcName);
+ generateClassOrGlobalLink(yyscanner,ol,funcName);
}
return;
}
-static bool findMemberLink(CodeOutputInterface &ol,Definition *sym,const char *symName)
+//-------------------------------------------------------------------------------
+
+static bool findMemberLink(yyscan_t yyscanner,
+ CodeOutputInterface &ol,
+ Definition *sym,
+ const char *symName)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//printf("sym %s outerScope=%s equal=%d\n",
// sym->name().data(),sym->getOuterScope()->name().data(),
- // sym->getOuterScope()==g_currentDefinition);
+ // sym->getOuterScope()==yyextra->currentDefinition);
if (sym->getOuterScope() &&
sym->getOuterScope()->definitionType()==Definition::TypeClass &&
- g_currentDefinition->definitionType()==Definition::TypeClass)
+ yyextra->currentDefinition->definitionType()==Definition::TypeClass)
{
- ClassDef *cd = dynamic_cast<ClassDef*>(sym->getOuterScope());
- ClassDef *thisCd = dynamic_cast<ClassDef *>(g_currentDefinition);
+ const ClassDef *cd = toClassDef(sym->getOuterScope());
+ const ClassDef *thisCd = toClassDef(yyextra->currentDefinition);
if (sym->definitionType()==Definition::TypeMember)
{
- if (g_currentMemberDef && g_collectXRefs)
+ if (yyextra->currentMemberDef && yyextra->collectXRefs)
{
- addDocCrossReference(g_currentMemberDef,dynamic_cast<MemberDef*>(sym));
+ std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
+ addDocCrossReference(toMemberDefMutable(yyextra->currentMemberDef),toMemberDefMutable(toMemberDef(sym)));
}
}
DBG_CTX((stderr,"cd=%s thisCd=%s\n",cd?cd->name().data():"<none>",thisCd?thisCd->name().data():"<none>"));
// TODO: find the nearest base class in case cd is a base class of
- // thisCd
+ // thisCd
if (cd==thisCd || (thisCd && thisCd->isBaseClass(cd,TRUE)))
{
- writeMultiLineCodeLink(ol,sym,symName);
+ writeMultiLineCodeLink(yyscanner,ol,sym,symName);
return TRUE;
}
}
return FALSE;
}
-static void findMemberLink(CodeOutputInterface &ol,char *symName)
+//-------------------------------------------------------------------------------
+
+static void findMemberLink(yyscan_t yyscanner,
+ CodeOutputInterface &ol,
+ const char *symName)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//printf("Member reference: %s scope=%s member=%s\n",
// yytext,
- // g_currentDefinition?g_currentDefinition->name().data():"<none>",
- // g_currentMemberDef?g_currentMemberDef->name().data():"<none>"
+ // yyextra->currentDefinition?yyextra->currentDefinition->name().data():"<none>",
+ // yyextra->currentMemberDef?yyextra->currentMemberDef->name().data():"<none>"
// );
- if (g_currentDefinition)
+ if (yyextra->currentDefinition)
{
- DefinitionIntf *di = Doxygen::symbolMap->find(symName);
- if (di)
+ auto range = Doxygen::symbolMap.find(symName);
+ for (auto it = range.first; it!=range.second; ++it)
{
- if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multiple symbols
- {
- DefinitionListIterator dli(*(DefinitionList*)di);
- Definition *sym;
- for (dli.toFirst();(sym=dli.current());++dli)
- {
- if (findMemberLink(ol,sym,symName)) return;
- }
- }
- else // single symbol
- {
- if (findMemberLink(ol,(Definition*)di,symName)) return;
- }
+ findMemberLink(yyscanner,ol,it->second,symName);
}
}
//printf("sym %s not found\n",&yytext[5]);
- codify(symName);
-}
-
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-
-static int yyread(char *buf,int max_size)
-{
- int c=0;
- while( c < max_size && g_inputString[g_inputPosition] )
- {
- *buf = g_inputString[g_inputPosition++] ;
- c++; buf++;
- }
- return c;
+ codify(yyscanner,symName);
}
-%}
-
-BB [ \t]+
-B [ \t]*
-NEWLINE \n
+//-------------------------------------------------------------------------------
-DIGIT [0-9]
-LETTER [A-Za-z\x80-\xFF]
-NONEMPTY [A-Za-z0-9_\x80-\xFF]
-EXPCHAR [#(){}\[\],:.%/\\=`*~|&<>!;+-]
-NONEMPTYEXP [^ \t\n:]
-PARAMNONEMPTY [^ \t\n():]
-IDENTIFIER ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*
-BORDER ([^A-Za-z0-9])
-
-POUNDCOMMENT "##"
-
-TRISINGLEQUOTE "'''"
-TRIDOUBLEQUOTE "\"\"\""
-LONGSTRINGCHAR [^\\"']
-ESCAPESEQ ("\\")(.)
-LONGSTRINGITEM ({LONGSTRINGCHAR}|{ESCAPESEQ})
-SMALLQUOTE ("\"\""|"\""|"'"|"''")
-LONGSTRINGBLOCK ({LONGSTRINGITEM}+|{SMALLQUOTE})
-
-SHORTSTRING ("'"{SHORTSTRINGITEM}*"'"|'"'{SHORTSTRINGITEM}*'"')
-SHORTSTRINGITEM ({SHORTSTRINGCHAR}|{ESCAPESEQ})
-SHORTSTRINGCHAR [^\\\n"]
-STRINGLITERAL {STRINGPREFIX}?( {SHORTSTRING} | {LONGSTRING})
-STRINGPREFIX ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR")
-KEYWORD ("lambda"|"import"|"class"|"assert"|"with"|"as"|"from"|"global"|"def"|"True"|"False")
-FLOWKW ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally")
-QUOTES ("\""[^"]*"\"")
-SINGLEQUOTES ("'"[^']*"'")
-
-LONGINTEGER {INTEGER}("l"|"L")
-INTEGER ({DECIMALINTEGER}|{OCTINTEGER}|{HEXINTEGER})
-DECIMALINTEGER ({NONZERODIGIT}{DIGIT}*|"0")
-OCTINTEGER "0"{OCTDIGIT}+
-HEXINTEGER "0"("x"|"X"){HEXDIGIT}+
-NONZERODIGIT [1-9]
-OCTDIGIT [0-7]
-HEXDIGIT ({DIGIT}|[a-f]|[A-F])
-FLOATNUMBER ({POINTFLOAT}|{EXPONENTFLOAT})
-POINTFLOAT ({INTPART}?{FRACTION}|{INTPART}".")
-EXPONENTFLOAT ({INTPART}|{POINTFLOAT}){EXPONENT}
-INTPART {DIGIT}+
-FRACTION "."{DIGIT}+
-EXPONENT ("e"|"E")("+"|"-")?{DIGIT}+
-IMAGNUMBER ({FLOATNUMBER}|{INTPART})("j"|"J")
-ATOM ({IDENTIFIER}|{LITERAL}|{ENCLOSURE})
-ENCLOSURE ({PARENTH_FORM}|{LIST_DISPLAY}|{DICT_DISPLAY}|{STRING_CONVERSION})
-LITERAL ({STRINGLITERAL}|{INTEGER}|{LONGINTEGER}|{FLOATNUMBER}|{IMAGNUMBER})
-PARENTH_FORM "("{EXPRESSION_LIST}?")"
-TEST ({AND_TEST}("or"{AND_TEST})*|{LAMBDA_FORM})
-TESTLIST {TEST}( ","{TEST})*","?
-LIST_DISPLAY "["{LISTMAKER}?"]"
-LISTMAKER {EXPRESSION}({LIST_FOR}|(","{EXPRESSION})*","?)
-LIST_ITER ({LIST_FOR}|{LIST_IF})
-LIST_FOR "for"{EXPRESSION_LIST}"in"{TESTLIST}{LIST_ITER}?
-LIST_IF "if"{TEST}{LIST_ITER}?
-DICT_DISPLAY "\{"{KEY_DATUM_LIST}?"\}"
-KEY_DATUM_LIST {KEY_DATUM}(","{KEY_DATUM})*","?
-KEY_DATUM {EXPRESSION}":"{EXPRESSION}
-STRING_CONVERSION "`"{EXPRESSION_LIST}"`"
-PRIMARY ({ATOM}|{ATTRIBUTEREF}|{SUBSCRIPTION}|{SLICING}|{CALL})
-ATTRIBUTEREF {PRIMARY}"."{IDENTIFIER}
-SUBSCRIPTION {PRIMARY}"["{EXPRESSION_LIST}"]"
-SLICING ({SIMPLE_SLICING}|{EXTENDED_SLICING})
-SIMPLE_SLICING {PRIMARY}"["{SHORT_SLICE}"]"
-EXTENDED_SLICING {PRIMARY}"["{SLICE_LIST}"]"
-SLICE_LIST {SLICE_ITEM}(","{SLICE_ITEM})*","?
-SLICE_ITEM ({EXPRESSION}|{PROPER_SLICE}|{ELLIPSIS})
-PROPER_SLICE ({SHORT_SLICE}|{LONG_SLICE})
-SHORT_SLICE {LOWER_BOUND}?":"{UPPER_BOUND}?
-LONG_SLICE {SHORT_SLICE}":"{STRIDE}?
-LOWER_BOUND {EXPRESSION}
-UPPER_BOUND {EXPRESSION}
-STRIDE {EXPRESSION}
-ELLIPSIS "..."
-CALL {PRIMARY}"("({ARGUMENT_LIST}","?)?")"
-ARGUMENT_LIST ({POSITIONAL_ARGUMENTS}(","{KEYWORD_ARGUMENTS})?(",""*"{EXPRESSION})?(",""**"{EXPRESSION})?|{KEYWORD_ARGUMENTS}(",""*"{EXPRESSION})?(",""**"{EXPRESSION})?|"*"{EXPRESSION}(",""**"{EXPRESSION})?|"**"{EXPRESSION})
-POSITIONAL_ARGUMENTS {EXPRESSION}(","{EXPRESSION})*
-KEYWORD_ARGUMENTS {KEYWORD_ITEM}(","{KEYWORD_ITEM})*
-KEYWORD_ITEM {IDENTIFIER}"="{EXPRESSION}
-POWER {PRIMARY}("**"{U_EXPR})?
-U_EXPR ({POWER}|"-"{U_EXPR}|"+"{U_EXPR}|"\~"{U_EXPR})
-M_EXPR ({U_EXPR}|{M_EXPR}"*"{U_EXPR}|{M_EXPR}"//"{U_EXPR}|{M_EXPR}"/"{U_EXPR}|{M_EXPR}"\%"{U_EXPR})
-A_EXPR ({M_EXPR}|{A_EXPR}"+"{M_EXPR}|{A_EXPR}"-"{M_EXPR}
-SHIFT_EXPR ({A_EXPR}|{SHIFT_EXPR}("<<"|">>"){A_EXPR})
-AND_EXPR ({SHIFT_EXPR}|{AND_EXPR}"\;SPMamp;"{SHIFT_EXPR}
-XOR_EXPR ({AND_EXPR}|{XOR_EXPR}"\textasciicircum"{AND_EXPR})
-OR_EXPR ({XOR_EXPR}|{OR_EXPR}"|"{ XOR_EXPR})
-
-COMPARISON {OR_EXPR}({COMP_OPERATOR}{OR_EXPR})*
-COMP_OPERATOR ("<"|">"|"=="|">="|"<="|"<>"|"!="|"is""not"?|"not"?"in")
-EXPRESSION ({OR_TEST}|{LAMBDA_FORM})
-OR_TEST ({AND_TEST}|{OR_TEST}"or"{AND_TEST})
-AND_TEST ({NOT_TEST}|{AND_TEST}"and"{NOT_TEST})
-NOT_TEST ({COMPARISON}|"not"{NOT_TEST})
-LAMBDA_FORM "lambda"{PARAMETER_LIST}?":"{EXPRESSION}
-EXPRESSION_LIST {EXPRESSION}(","{EXPRESSION})*","?
-SIMPLE_STMT ({EXPRESSION_STMT}|{ASSERT_STMT}|{ASSIGNMENT_STMT}|{AUGMENTED_ASSIGNMENT_STMT}|{PASS_STMT}|{DEL_STMT}|{PRINT_STMT}|{RETURN_STMT}|{YIELD_STMT}|{RAISE_STMT}|{BREAK_STMT}|{CONTINUE_STMT}|{IMPORT_STMT}|{GLOBAL_STMT}|{EXEC_STMT})
-EXPRESSION_STMT {EXPRESSION_LIST}
-ASSERT_STMT "assert"{EXPRESSION}(","{EXPRESSION})?
-ASSIGNMENT_STMT ({TARGET_LIST}"=")+{EXPRESSION_LIST}
-TARGET_LIST {TARGET}(","{TARGET})*","?
-TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUTEREF}|{SUBSCRIPTION}|{SLICING})
-
-
-%option noyywrap
-%option stack
-
-%x Body
-
-%x FunctionDec
-%x FunctionParams
-
-%x ClassDec
-%x ClassInheritance
-
-%x Suite
-%x SuiteCaptureIndent
-%x SuiteStart
-%x SuiteMaintain
-%x SuiteContinuing
-
-%x LongString
-
-%x SingleQuoteString
-%x DoubleQuoteString
-%x TripleString
-
-%x DocBlock
-%%
-
-<Body,Suite>{
- "def"{BB} {
- startFontClass("keyword");
- codify(yytext);
- endFontClass();
- BEGIN( FunctionDec );
- }
-
- "class"{BB} {
- startFontClass("keyword");
- codify(yytext);
- endFontClass();
- BEGIN( ClassDec );
- }
- "None" {
- startFontClass("keywordtype");
- codify(yytext);
- endFontClass();
- }
- "self."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER}"(" {
- codify("self.");
- findMemberLink(*g_code,&yytext[5]);
- }
- "self."{IDENTIFIER}/"(" {
- codify("self.");
- findMemberLink(*g_code,&yytext[5]);
- }
- "self."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER} {
- codify("self.");
- findMemberLink(*g_code,&yytext[5]);
- }
- "self."{IDENTIFIER} {
- codify("self.");
- findMemberLink(*g_code,&yytext[5]);
- }
- "cls."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER}"(" {
- codify("cls.");
- findMemberLink(*g_code,&yytext[4]);
- }
- "cls."{IDENTIFIER}/"(" {
- codify("cls.");
- findMemberLink(*g_code,&yytext[4]);
- }
- "cls."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER} {
- codify("cls.");
- findMemberLink(*g_code,&yytext[4]);
- }
- "cls."{IDENTIFIER} {
- codify("cls.");
- findMemberLink(*g_code,&yytext[4]);
- }
-}
-
-<ClassDec>{IDENTIFIER} {
-
- generateClassOrGlobalLink(*g_code,yytext);
- // codify(yytext);
- g_curClassName = yytext;
- g_curClassBases.clear();
- BEGIN( ClassInheritance );
- }
-
-<ClassInheritance>{
- ({BB}|[(,)]) {
- codify(yytext);
- }
-
- ({IDENTIFIER}".")*{IDENTIFIER} {
- // The parser
- // is assuming
- // that ALL identifiers
- // in this state
- // are base classes;
- // it doesn't check to see
- // that the first parenthesis
- // has been seen.
-
- // This is bad - it should
- // probably be more strict
- // about what to accept.
-
- g_curClassBases.inSort(yytext);
- generateClassOrGlobalLink(*g_code,yytext);
- // codify(yytext);
- }
-
- ":" {
- codify(yytext);
-
- // Assume this will
- // be a one-line suite;
- // found counter-example
- // in SuiteStart.
-
- // Push a class scope
-
- ClassDef *classDefToAdd = createClassDef("<code>",1,1,g_curClassName,ClassDef::Class,0,0,FALSE);
- g_codeClassSDict.append(g_curClassName,classDefToAdd);
- char *s=g_curClassBases.first();
- while (s)
- {
- const ClassDef *baseDefToAdd=g_codeClassSDict[s];
-
- // Try to find class in global
- // scope
- if (baseDefToAdd==0)
- {
- baseDefToAdd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
- }
-
- if (baseDefToAdd && baseDefToAdd!=classDefToAdd)
- {
- classDefToAdd->insertBaseClass(const_cast<ClassDef*>(baseDefToAdd),s,Public,Normal);
- }
-
- s=g_curClassBases.next();
- }
-
- // Reset class-parsing variables.
- g_curClassName.resize(0);
- g_curClassBases.clear();
-
- g_noSuiteFound = TRUE;
- BEGIN( SuiteStart );
- }
-}
-
-
-<FunctionDec>{
- {IDENTIFIER} {
- generateFunctionLink(*g_code,yytext);
- }
-
- {B}"(" {
- codify(yytext);
- BEGIN( FunctionParams );
- }
-}
-
-<FunctionParams>{
- ({BB}|",") {
- // Parses delimiters
- codify(yytext);
- }
-
- ({IDENTIFIER}|{PARAMNONEMPTY}+) {
- codify(yytext);
- }
-
- ")" {
- codify(yytext);
- }
-
- "\n" {
- codifyLines(yytext);
- }
-
- ":" {
- codify(yytext);
-
- // Assume this will
- // be a one-line suite;
- // found counter-example
- // in SuiteStart.
- g_noSuiteFound = TRUE;
- BEGIN( SuiteStart );
- }
-}
-
-<Body,Suite>{
-
- {KEYWORD} {
- // Position-sensitive rules!
- // Must come AFTER keyword-triggered rules
- // Must come BEFORE identifier NONEMPTY-like rules
- // to syntax highlight.
-
- startFontClass("keyword");
- codify(yytext);
- endFontClass();
- }
-
- {FLOWKW} {
- if (g_currentMemberDef && g_currentMemberDef->isFunction())
- {
- g_currentMemberDef->incrementFlowKeyWordCount();
- }
- startFontClass("keywordflow");
- codify(yytext);
- endFontClass();
- }
- ({IDENTIFIER}".")*{IDENTIFIER}/"(" {
- generateClassOrGlobalLink(*g_code,yytext);
- }
- ({IDENTIFIER}".")+{IDENTIFIER} {
- generateClassOrGlobalLink(*g_code,yytext,TRUE);
- }
- {IDENTIFIER} { codify(yytext); }
-
-}
-
-
-
-<SuiteStart>{
-
- {BB} {
- codify(yytext);
- }
- "pass" {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- BEGIN(Body);
- }
- {KEYWORD} {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
-
- // No indentation necessary
- g_noSuiteFound = FALSE;
- }
-
- {FLOWKW} {
- if (g_currentMemberDef && g_currentMemberDef->isFunction())
- {
- g_currentMemberDef->incrementFlowKeyWordCount();
- }
- startFontClass("keywordflow");
- codifyLines(yytext);
- endFontClass();
-
- // No indentation necessary
- g_noSuiteFound = FALSE;
- }
- {IDENTIFIER} {
- codify(yytext);
- }
-
-
- {POUNDCOMMENT} {
- if (YY_START==SingleQuoteString ||
- YY_START==DoubleQuoteString ||
- YY_START==TripleString
- )
- {
- REJECT;
- }
- yy_push_state(YY_START);
- BEGIN(DocBlock);
- g_docBlock=yytext;
- }
-
- {NEWLINE} {
- codifyLines(yytext);
- if ( g_noSuiteFound )
- {
- // printf("New suite to capture! [%d]\n", g_yyLineNr);
- BEGIN ( SuiteCaptureIndent );
- }
- }
-}
-
-<SuiteCaptureIndent>{
- "\n"|({BB}"\n") {
- // Blankline - ignore, keep looking for indentation.
- codifyLines(yytext);
- }
-
- {BB} {
- // This state lasts momentarily,
- // to check the indentation
- // level that is about to be
- // used.
- codifyLines(yytext);
- g_indents.push(yyleng);
- // printf("Captured indent of %d [line %d]\n", yyleng, g_yyLineNr);
- BEGIN( Suite );
- }
-}
-
-<SuiteMaintain>{
-
- {BB}/({NONEMPTY}|{EXPCHAR}) {
- // This implements poor
- // indentation-tracking;
- // should be improved.
- // (translate tabs to space, etc)
- codifyLines(yytext);
- adjustScopesAndSuites((int)yyleng);
- }
-
- "\n"|({BB}"\n") {
- // If this ever succeeds,
- // it means that this is
- // a blank line, and
- // can be ignored.
- codifyLines(yytext);
- }
-
- ""/({NONEMPTY}|{EXPCHAR}) {
- // Default rule; matches
- // the empty string, assuming
- // real text starts here.
- // Just go straight to Body.
- adjustScopesAndSuites(0);
- }
-}
-
-
-<Suite>{NEWLINE} {
- codifyLines(yytext);
- BEGIN( SuiteMaintain );
- }
-<Body>{IDENTIFIER} {
- codify(yytext);
- }
-<Body>{NEWLINE} {
- codifyLines(yytext);
- }
-
-<SingleQuoteString>{ // Single quoted string like 'That\'s a """nice""" string!'
- \\{B}\n { // line continuation
- codifyLines(yytext);
- }
- \\. { // escaped char
- codify(yytext);
- }
- {STRINGPREFIX}?{TRIDOUBLEQUOTE} { // triple double quotes
- codify(yytext);
- }
- "'" { // end of the string
- codify(yytext);
- endFontClass();
- BEGIN(g_stringContext);
- }
- [^"'\n\\]+ { // normal chars
- codify(yytext);
- }
- . { // normal char
- codify(yytext);
- }
-}
-
-<DoubleQuoteString>{ // Double quoted string like "That's \"a '''nice'''\" string!"
- \\{B}\n { // line continuation
- codifyLines(yytext);
- }
- \\. { // escaped char
- codify(yytext);
- }
- {STRINGPREFIX}?{TRISINGLEQUOTE} { // triple single quotes
- codify(yytext);
- }
- "\"" { // end of the string
- codify(yytext);
- endFontClass();
- BEGIN(g_stringContext);
- }
- [^"'\n\\]+ { // normal chars
- codify(yytext);
- }
- . { // normal char
- codify(yytext);
- }
-}
+struct PythonCodeParser::Private
+{
+ yyscan_t yyscanner;
+ pycodeYY_state state;
+};
-<TripleString>{
- {TRIDOUBLEQUOTE} |
- {TRISINGLEQUOTE} {
- codify(yytext);
- if (g_doubleQuote==(yytext[0]=='"'))
- {
- endFontClass();
- BEGIN(g_stringContext);
- }
- }
- {LONGSTRINGBLOCK} {
- codifyLines(yytext);
- }
- \n {
- codifyLines(yytext);
- }
- . {
- codify(yytext);
- }
+PythonCodeParser::PythonCodeParser() : p(std::make_unique<Private>())
+{
+ pycodeYYlex_init_extra(&p->state,&p->yyscanner);
+#ifdef FLEX_DEBUG
+ pycodeYYset_debug(1,p->yyscanner);
+#endif
+ resetCodeParserState();
}
- /*
-<*>({NONEMPTY}|{EXPCHAR}|{BB}) { // This should go one character at a time.
- codify(yytext);
- // printf("[pycode] '%s' [ state %d ] [line %d] no match\n",
- // yytext, YY_START, g_yyLineNr);
-
- //endFontClass();
- BEGIN(Body);
- }
- */
-
-<*>{STRINGPREFIX}?{TRISINGLEQUOTE} {
- if (YY_START==SingleQuoteString) REJECT;
- startFontClass("stringliteral");
- g_stringContext=YY_START;
- g_doubleQuote=yytext[yyleng-1]=='"';
- codify(yytext);
- BEGIN(TripleString);
- }
-<*>{STRINGPREFIX}?{TRIDOUBLEQUOTE} {
- if (YY_START==DoubleQuoteString) REJECT;
- startFontClass("stringliteral");
- g_stringContext=YY_START;
- g_doubleQuote=yytext[yyleng-1]=='"';
- codify(yytext);
- BEGIN(TripleString);
- }
-<*>{STRINGPREFIX}?"'" { // single quoted string
- if (YY_START==SingleQuoteString ||
- YY_START==DoubleQuoteString ||
- YY_START==TripleString
- )
- {
- REJECT;
- }
- startFontClass("stringliteral");
- g_stringContext=YY_START;
- codify(yytext);
- BEGIN(SingleQuoteString);
- }
-<*>{STRINGPREFIX}?"\"" { // double quoted string
- if (YY_START==SingleQuoteString ||
- YY_START==DoubleQuoteString ||
- YY_START==TripleString
- )
- {
- REJECT;
- }
- startFontClass("stringliteral");
- g_stringContext=YY_START;
- codify(yytext);
- BEGIN(DoubleQuoteString);
- }
-<DocBlock>.* { // contents of current comment line
- g_docBlock+=yytext;
- }
-<DocBlock>"\n"{B}("#") { // comment block (next line is also comment line)
- g_docBlock+=yytext;
- }
-<DocBlock>{NEWLINE} { // comment block ends at the end of this line
- // remove special comment (default config)
- if (Config_getBool(STRIP_CODE_COMMENTS))
- {
- g_yyLineNr+=((QCString)g_docBlock).contains('\n');
- g_endComment=TRUE;
- }
- else // do not remove comment
- {
- startFontClass("comment");
- codifyLines(g_docBlock);
- endFontClass();
- }
- unput(*yytext);
- yy_pop_state();
- }
-<*>{POUNDCOMMENT}.* {
- if (YY_START==SingleQuoteString ||
- YY_START==DoubleQuoteString ||
- YY_START==TripleString
- )
- {
- REJECT;
- }
- yy_push_state(YY_START);
- BEGIN(DocBlock);
- g_docBlock=yytext;
- }
-<*>"#".* { // normal comment
- if (YY_START==SingleQuoteString ||
- YY_START==DoubleQuoteString ||
- YY_START==TripleString
- )
- {
- REJECT;
- }
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
-<*>{NEWLINE} {
- if (g_endComment)
- {
- g_endComment=FALSE;
- }
- else
- {
- codifyLines(yytext);
- }
- //printf("[pycode] %d NEWLINE [line %d] no match\n",
- // YY_START, g_yyLineNr);
-
- //endFontClass();
- BEGIN(Body);
- }
-
-<*>[ \t]+ {
- codify(yytext);
- BEGIN(Body);
- }
-<*>. {
- codify(yytext);
- // printf("[pycode] '%s' [ state %d ] [line %d] no match\n",
- // yytext, YY_START, g_yyLineNr);
-
- //endFontClass();
- BEGIN(Body);
- }
-
-<*><<EOF>> {
- if (YY_START == DocBlock) {
- if (!Config_getBool(STRIP_CODE_COMMENTS))
- {
- startFontClass("comment");
- codifyLines(g_docBlock);
- endFontClass();
- }
- }
- yyterminate();
- }
-%%
-
-/*@ ----------------------------------------------------------------------------
- */
-
-void resetPythonCodeParserState()
+PythonCodeParser::~PythonCodeParser()
{
- g_codeClassSDict.setAutoDelete(TRUE);
- g_codeClassSDict.clear();
- g_currentDefinition = 0;
- g_currentMemberDef = 0;
- g_doubleStringIsDoc = FALSE;
- g_paramParens = 0;
- g_indents.clear();
- BEGIN( Body );
+ pycodeYYlex_destroy(p->yyscanner);
}
-/*!
- Examines current stack of white-space indentations;
- re-syncs the parser with the correct scope.
-*/
-static void adjustScopesAndSuites(unsigned indentLength)
+void PythonCodeParser::resetCodeParserState()
{
- // States to pop
- if (!g_indents.isEmpty() && indentLength < g_indents.top())
- {
- while (!g_indents.isEmpty() && indentLength < g_indents.top())
- {
- // printf("Exited scope indent of [%d]\n", g_indents.top());
- g_indents.pop(); // Pop the old suite's indentation
-
- g_currentMemberDef=0;
- if (g_currentDefinition)
- g_currentDefinition=g_currentDefinition->getOuterScope();
- }
- }
-
- // Are there any remaining indentation levels for suites?
- if (!g_indents.isEmpty())
- {
- BEGIN( Suite );
- }
- else
- {
- BEGIN( Body );
- }
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->codeClassMap.clear();
+ yyextra->currentDefinition = 0;
+ yyextra->currentMemberDef = 0;
+ yyextra->doubleStringIsDoc = FALSE;
+ yyextra->paramParens = 0;
+ while (!yyextra->indents.empty()) yyextra->indents.pop();
+ BEGIN( Body );
}
-void parsePythonCode(CodeOutputInterface &od,const char * /*className*/,
- const QCString &s,bool exBlock, const char *exName,
- FileDef *fd,int startLine,int endLine,bool inlineFragment,
- const MemberDef *,bool,const Definition *searchCtx,bool collectXRefs)
+void PythonCodeParser::parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ SrcLangExt /*lang*/,
+ bool isExampleBlock,
+ const char *exampleName,
+ FileDef *fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ const MemberDef *memberDef,
+ bool showLineNumbers,
+ const Definition *searchCtx,
+ bool collectXRefs
+ )
{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//printf("***parseCode()\n");
-
- //--------------------------------------
- if (s.isEmpty()) return;
- printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
- g_codeClassSDict.setAutoDelete(TRUE);
- g_code = &od;
- g_inputString = s;
- g_inputPosition = 0;
- g_currentFontClass = 0;
- g_needsTermination = FALSE;
- g_searchCtx=searchCtx;
- g_collectXRefs=collectXRefs;
+
+ if (input.isEmpty()) return;
+ printlex(yy_flex_debug, TRUE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
+ yyextra->code = &codeOutIntf;
+ yyextra->inputString = input;
+ yyextra->inputPosition = 0;
+ yyextra->currentFontClass = 0;
+ yyextra->needsTermination = FALSE;
+ yyextra->searchCtx=searchCtx;
+ yyextra->collectXRefs=collectXRefs;
if (startLine!=-1)
- g_yyLineNr = startLine;
+ yyextra->yyLineNr = startLine;
else
- g_yyLineNr = 1;
+ yyextra->yyLineNr = 1;
if (endLine!=-1)
- g_inputLines = endLine+1;
+ yyextra->inputLines = endLine+1;
else
- g_inputLines = g_yyLineNr + countLines() - 1;
-
-
- g_exampleBlock = exBlock;
- g_exampleName = exName;
- g_sourceFileDef = fd;
+ yyextra->inputLines = yyextra->yyLineNr + countLines(yyscanner) - 1;
+
+
+ yyextra->exampleBlock = isExampleBlock;
+ yyextra->exampleName = exampleName;
+ yyextra->sourceFileDef = fileDef;
+ yyextra->symbolResolver.setFileScope(fileDef);
bool cleanupSourceDef = FALSE;
- if (exBlock && fd==0)
+ if (yyextra->exampleBlock && fileDef==0)
{
// create a dummy filedef for the example
- g_sourceFileDef = createFileDef("",(exName?exName:"generated"));
+ yyextra->sourceFileDef = createFileDef("",(exampleName?exampleName:"generated"));
cleanupSourceDef = TRUE;
}
- if (g_sourceFileDef)
+ if (yyextra->sourceFileDef)
{
- setCurrentDoc("l00001");
+ setCurrentDoc(yyscanner,"l00001");
}
- g_includeCodeFragment = inlineFragment;
- // Starts line 1 on the output
- startCodeLine();
+ yyextra->includeCodeFragment = inlineFragment;
+ // Starts line 1 on the output
+ startCodeLine(yyscanner);
- pycodeYYrestart( pycodeYYin );
+ pycodeYYrestart(0,yyscanner);
- pycodeYYlex();
+ pycodeYYlex(yyscanner);
- if (!g_indents.isEmpty())
+ if (!yyextra->indents.empty())
{
// printf("Exited pysourceparser in inconsistent state!\n");
}
- if (g_needsTermination)
+ if (yyextra->needsTermination)
{
- endCodeLine();
+ endCodeLine(yyscanner);
}
if (cleanupSourceDef)
{
// delete the temporary file definition used for this example
- delete g_sourceFileDef;
- g_sourceFileDef=0;
+ delete yyextra->sourceFileDef;
+ yyextra->sourceFileDef=0;
}
- printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
- return;
+ // write the tooltips
+ TooltipManager::instance().writeTooltips(codeOutIntf);
+ printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
}
-//----------------------------------------------------------------------------
-
-void PythonCodeParser::parseCode(CodeOutputInterface &codeOutIntf,
- const char *scopeName,
- const QCString &input,
- SrcLangExt /*lang*/,
- bool isExampleBlock,
- const char *exampleName,
- FileDef *fileDef,
- int startLine,
- int endLine,
- bool inlineFragment,
- const MemberDef *memberDef,
- bool showLineNumbers,
- const Definition *searchCtx,
- bool collectXRefs
- )
-{
- ::parsePythonCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
- fileDef,startLine,endLine,inlineFragment,memberDef,
- showLineNumbers,searchCtx,collectXRefs);
-}
-
-void PythonCodeParser::resetCodeParserState()
-{
- ::resetPythonCodeParserState();
-}
-
-
+#if USE_STATE2STRING
#include "pycode.l.h"
+#endif
diff --git a/src/pyscanner.h b/src/pyscanner.h
index d6e8672..4f0ae38 100644
--- a/src/pyscanner.h
+++ b/src/pyscanner.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -36,13 +36,10 @@ class PythonOutlineParser : public OutlineParserInterface
public:
PythonOutlineParser();
virtual ~PythonOutlineParser();
- void startTranslationUnit(const char *) {}
- void finishTranslationUnit() {}
- void parseInput(const char * fileName,
- const char *fileBuf,
+ void parseInput(const char * fileName,
+ const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool sameTranslationUnit,
- QStrList &filesInSameTranslationUnit);
+ ClangTUParser *clangParser);
bool needsPreprocessing(const QCString &extension) const;
void parsePrototype(const char *text);
private:
diff --git a/src/pyscanner.l b/src/pyscanner.l
index c2a8a88..4a9552e 100644
--- a/src/pyscanner.l
+++ b/src/pyscanner.l
@@ -25,6 +25,9 @@
%option prefix="pyscannerYY"
%option reentrant
%option extra-type="struct pyscannerYY_state *"
+%top{
+#include <stdint.h>
+}
%{
@@ -51,7 +54,6 @@
#include "defargs.h"
#include "language.h"
#include "commentscan.h"
-#include "pycode.h"
#include "arguments.h"
#include "markdown.h"
@@ -62,6 +64,8 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
+#define USE_STATE2STRING 0
+
/* ----------------------------------------------------------------- */
struct pyscannerYY_state
@@ -70,7 +74,7 @@ struct pyscannerYY_state
CommentScanner commentScanner;
OutlineParserInterface *thisParser = 0;
const char * inputString = 0;
- int inputPosition = 0;
+ yy_size_t inputPosition = 0;
Protection protection = Public;
std::shared_ptr<Entry> current_root;
std::shared_ptr<Entry> current;
@@ -93,6 +97,7 @@ struct pyscannerYY_state
QGString * copyString = 0;
int indent = 0;
int curIndent = 0;
+ int commentIndent = 0;
bool importTuple = FALSE;
QDict<QCString> packageNameCache;
char atomStart = 0;
@@ -108,10 +113,13 @@ struct pyscannerYY_state
int search_count = 0;
QCString argType;
bool funcParamsEnd = FALSE;
+ std::vector<QCString> decorators;
};
//-----------------------------------------------------------------------------
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
static inline int computeIndent(const char *s);
@@ -134,7 +142,8 @@ static void initSpecialBlock(yyscan_t yyscanner);
static void searchFoundDef(yyscan_t yyscanner);
static void searchFoundClass(yyscan_t yyscanner);
static QCString findPackageScope(yyscan_t yyscanner,const char *fileName);
-static int yyread(yyscan_t yyscanner,char *buf,int max_size);
+
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
//-----------------------------------------------------------------------------
/* ----------------------------------------------------------------- */
@@ -167,6 +176,7 @@ NONEMPTYEXP [^ \t\n:]
PARAMNONEMPTY [^ \t\n():]
IDENTIFIER ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*
SCOPE {IDENTIFIER}("."{IDENTIFIER})*
+CALL "("[^)]*")"
BORDER ([^A-Za-z0-9])
TRISINGLEQUOTE {STRINGPREFIX}?"'''"(!)?
@@ -327,6 +337,8 @@ STARTDOCSYMS "##"
"@staticmethod" {
yyextra->stat=TRUE;
}
+ "@"{SCOPE}{CALL}? { // decorator
+ }
{SCRIPTCOMMENT} { // Unix type script comment
if (yyextra->yyLineNr != 1) REJECT;
}
@@ -643,6 +655,7 @@ STARTDOCSYMS "##"
{B}":"{B} { // function without arguments
yyextra->specialBlock = TRUE; // expecting a docstring
yyextra->bodyEntry = yyextra->current;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
BEGIN(FunctionBody);
}
@@ -659,7 +672,7 @@ STARTDOCSYMS "##"
")" { // end of parameter list
if (yyextra->current->argList.empty())
{
- yyextra->current->argList.noParameters=TRUE;
+ yyextra->current->argList.setNoParameters(TRUE);
}
yyextra->current->args = argListToString(yyextra->current->argList);
yyextra->funcParamsEnd = TRUE;
@@ -1244,8 +1257,12 @@ STARTDOCSYMS "##"
QCString actualDoc=yyextra->docBlock;
if (!yyextra->docBlockSpecial) // legacy unformatted docstring
{
- actualDoc.prepend("\\verbatim ");
- actualDoc.append("\\endverbatim ");
+ if (!actualDoc.isEmpty())
+ {
+ stripIndentation(actualDoc,yyextra->commentIndent);
+ actualDoc.prepend("\\verbatim\n");
+ actualDoc.append("\\endverbatim ");
+ }
}
//printf("-------> yyextra->current=%p yyextra->bodyEntry=%p\n",yyextra->current,yyextra->bodyEntry);
handleCommentBlock(yyscanner, actualDoc, FALSE);
@@ -1255,8 +1272,12 @@ STARTDOCSYMS "##"
QCString actualDoc=yyextra->docBlock;
if (!yyextra->docBlockSpecial) // legacy unformatted docstring
{
- actualDoc.prepend("\\verbatim ");
- actualDoc.append("\\endverbatim ");
+ if (!actualDoc.isEmpty())
+ {
+ stripIndentation(actualDoc,yyextra->commentIndent);
+ actualDoc.prepend("\\verbatim\n");
+ actualDoc.append("\\endverbatim ");
+ }
}
actualDoc.prepend("\\namespace "+yyextra->moduleScope+" ");
handleCommentBlock(yyscanner, actualDoc, FALSE);
@@ -1283,18 +1304,7 @@ STARTDOCSYMS "##"
^{BB} { // leading whitespace
- int indent = computeIndent(yytext);
- if (indent>=yyextra->curIndent)
- { // strip yyextra->curIndent amount of whitespace
- int i;
- for (i=0;i<indent-yyextra->curIndent;i++) yyextra->docBlock+=' ';
- DBG_CTX((stderr,"stripping indent %d\n",yyextra->curIndent));
- }
- else
- {
- DBG_CTX((stderr,"not stripping: %d<%d\n",indent,yyextra->curIndent));
- yyextra->docBlock += yytext;
- }
+ yyextra->docBlock += yytext;
}
[^"'\n \t\\]+ {
yyextra->docBlock += yytext;
@@ -1317,7 +1327,6 @@ STARTDOCSYMS "##"
\n/{B}"#" { // continuation of the comment on the next line
yyextra->docBlock+='\n';
yyextra->docBrief = FALSE;
- startCommentBlock(yyscanner,FALSE);
incLineNr(yyscanner);
}
[^#\n]+ { // any other stuff
@@ -1421,7 +1430,7 @@ STARTDOCSYMS "##"
}
<*>"'" {
- fprintf(stderr,"Quote: %d\n",YY_START);
+ //fprintf(stderr,"Quote: %d\n",YY_START);
}
<*>. {
@@ -1435,10 +1444,10 @@ STARTDOCSYMS "##"
//----------------------------------------------------------------------------
-static int yyread(yyscan_t yyscanner,char *buf,int max_size)
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- int c=0;
+ yy_size_t c=0;
const char *p = yyextra->inputString + yyextra->inputPosition;
while ( c < max_size && *p ) { *buf++ = *p++; c++; }
yyextra->inputPosition+=c;
@@ -1466,7 +1475,7 @@ static void initEntry(yyscan_t yyscanner)
yyextra->current->virt = yyextra->virt;
yyextra->current->stat = yyextra->stat;
yyextra->current->lang = SrcLangExt_Python;
- Doxygen::docGroup.initGroupInfo(yyextra->current.get());
+ yyextra->commentScanner.initGroupInfo(yyextra->current.get());
yyextra->stat = FALSE;
}
@@ -1510,7 +1519,7 @@ static void newFunction(yyscan_t yyscanner)
static inline int computeIndent(const char *s)
{
int col=0;
- static int tabSize=Config_getInt(TAB_SIZE);
+ int tabSize=Config_getInt(TAB_SIZE);
const char *p=s;
char c;
while ((c=*p++))
@@ -1611,15 +1620,20 @@ static void handleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool brief
// TODO: Fix me
yyextra->docBlockInBody=FALSE;
+ if (!yyextra->current->doc.isEmpty())
+ {
+ yyextra->current->doc=yyextra->current->doc.stripWhiteSpace()+"\n\n";
+ }
if (yyextra->docBlockInBody && yyextra->previous && !yyextra->previous->doc.isEmpty())
{
yyextra->previous->doc=yyextra->previous->doc.stripWhiteSpace()+"\n\n";
}
int position = 0;
- bool needsEntry;
+ bool needsEntry = false;
int lineNr = brief ? yyextra->current->briefLine : yyextra->current->docLine;
- QCString processedDoc = processMarkdownForCommentBlock(doc,yyextra->yyFileName,lineNr);
+ Markdown markdown(yyextra->yyFileName,lineNr);
+ QCString processedDoc = Config_getBool(MARKDOWN_SUPPORT) ? markdown.process(doc,lineNr) : doc;
while (yyextra->commentScanner.parseCommentBlock(
yyextra->thisParser,
(yyextra->docBlockInBody && yyextra->previous) ? yyextra->previous.get() : yyextra->current.get(),
@@ -1631,7 +1645,8 @@ static void handleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool brief
yyextra->docBlockInBody,
yyextra->protection,
position,
- needsEntry)
+ needsEntry,
+ Config_getBool(MARKDOWN_SUPPORT))
) // need to start a new entry
{
if (needsEntry)
@@ -1671,8 +1686,9 @@ static void initTriDoubleQuoteBlock(yyscan_t yyscanner)
yyextra->docBlockContext = YY_START;
yyextra->docBlockInBody = FALSE;
yyextra->docBlockJavaStyle = TRUE;
- yyextra->docBlockSpecial = yytext[strlen(yytext) - 1]=='!';
+ yyextra->docBlockSpecial = yytext[strlen(yytext) - 1]=='!' || !Config_getBool(PYTHON_DOCSTRING);
yyextra->docBlock.resize(0);
+ yyextra->commentIndent = yyextra->curIndent;
yyextra->doubleQuote = TRUE;
startCommentBlock(yyscanner,FALSE);
}
@@ -1683,8 +1699,9 @@ static void initTriSingleQuoteBlock(yyscan_t yyscanner)
yyextra->docBlockContext = YY_START;
yyextra->docBlockInBody = FALSE;
yyextra->docBlockJavaStyle = TRUE;
- yyextra->docBlockSpecial = yytext[strlen(yytext) - 1]=='!';
+ yyextra->docBlockSpecial = yytext[strlen(yytext) - 1]=='!' || !Config_getBool(PYTHON_DOCSTRING);
yyextra->docBlock.resize(0);
+ yyextra->commentIndent = yyextra->curIndent;
yyextra->doubleQuote = FALSE;
startCommentBlock(yyscanner,FALSE);
}
@@ -1697,7 +1714,8 @@ static void initSpecialBlock(yyscan_t yyscanner)
yyextra->docBlockJavaStyle = TRUE;
yyextra->docBrief = TRUE;
yyextra->docBlock.resize(0);
- startCommentBlock(yyscanner,TRUE);
+ yyextra->commentIndent = yyextra->curIndent;
+ startCommentBlock(yyscanner,FALSE);
}
static void searchFoundDef(yyscan_t yyscanner)
@@ -1738,13 +1756,13 @@ static void parseCompounds(yyscan_t yyscanner,std::shared_ptr<Entry> rt)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//printf("parseCompounds(%s)\n",rt->name.data());
- for (int i=0; i<rt->children().size(); ++i)
+ for (size_t i=0; i<rt->children().size(); ++i)
{
std::shared_ptr<Entry> ce = rt->children()[i];
if (!ce->program.isEmpty())
{
- //printf("-- %s ---------\n%s\n---------------\n",
- // ce->name.data(),ce->program.data());
+ //fprintf(stderr,"parseCompounds: -- %s (line %d) ---------\n%s\n---------------\n",
+ // ce->name.data(), ce->bodyLine, ce->program.data());
// init scanner state
yyextra->inputString = ce->program;
yyextra->inputPosition = 0;
@@ -1767,13 +1785,13 @@ static void parseCompounds(yyscan_t yyscanner,std::shared_ptr<Entry> rt)
initEntry(yyscanner);
QCString name = ce->name;
- Doxygen::docGroup.enterCompound(yyextra->yyFileName,yyextra->yyLineNr,name);
+ yyextra->commentScanner.enterCompound(yyextra->yyFileName,yyextra->yyLineNr,name);
pyscannerYYlex(yyscanner) ;
yyextra->lexInit=TRUE;
ce->program.resize(0);
- Doxygen::docGroup.leaveCompound(yyextra->yyFileName,yyextra->yyLineNr,name);
+ yyextra->commentScanner.leaveCompound(yyextra->yyFileName,yyextra->yyLineNr,name);
}
parseCompounds(yyscanner,ce);
@@ -1831,7 +1849,7 @@ static void parseMain(yyscan_t yyscanner, const char *fileName,const char *fileB
initParser(yyscanner);
- Doxygen::docGroup.enterFile(yyextra->yyFileName,yyextra->yyLineNr);
+ yyextra->commentScanner.enterFile(yyextra->yyFileName,yyextra->yyLineNr);
yyextra->current->reset();
initEntry(yyscanner);
@@ -1840,7 +1858,7 @@ static void parseMain(yyscan_t yyscanner, const char *fileName,const char *fileB
pyscannerYYlex(yyscanner);
yyextra->lexInit=TRUE;
- Doxygen::docGroup.leaveFile(yyextra->yyFileName,yyextra->yyLineNr);
+ yyextra->commentScanner.leaveFile(yyextra->yyFileName,yyextra->yyLineNr);
yyextra->current_root->program.resize(0);
@@ -1863,7 +1881,7 @@ static void parsePrototype(yyscan_t yyscanner,const QCString &text)
yyextra->packageCommentAllowed = FALSE;
const char *orgInputString;
- int orgInputPosition;
+ yy_size_t orgInputPosition;
YY_BUFFER_STATE orgState;
// save scanner state
@@ -1923,8 +1941,7 @@ PythonOutlineParser::~PythonOutlineParser()
void PythonOutlineParser::parseInput(const char *fileName,
const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool /*sameTranslationUnit*/,
- QStrList & /*filesInSameTranslationUnit*/)
+ ClangTUParser * /*clangParser*/)
{
struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
yyextra->thisParser = this;
@@ -1949,4 +1966,6 @@ void PythonOutlineParser::parsePrototype(const char *text)
//----------------------------------------------------------------------------
+#if USE_STATE2STRING
#include "pyscanner.l.h"
+#endif
diff --git a/src/reflist.cpp b/src/reflist.cpp
index 016ef49..5840138 100644
--- a/src/reflist.cpp
+++ b/src/reflist.cpp
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,196 +13,117 @@
*
*/
+#include <algorithm>
+
#include <stdio.h>
#include "reflist.h"
#include "util.h"
#include "ftextstream.h"
#include "definition.h"
+#include "sortdict.h"
+#include "config.h"
-/*! Create a list of items that are cross referenced with documentation blocks
- * @param listName String representing the name of the list.
- * @param pageTitle String representing the title of the list page.
- * @param secTitle String representing the title of the section.
- */
-RefList::RefList(const char *listName,
- const char *pageTitle,
- const char *secTitle
- )
-{
- m_itemList = 0;
- m_dict = 0;
- m_dictIterator = 0;
- m_id = 0;
- m_listName = listName;
- m_fileName = convertNameToFile(listName,FALSE,TRUE);
- m_pageTitle = pageTitle;
- m_secTitle = secTitle;
-}
-
-/*! Destroy the todo list. Currently not called! */
-RefList::~RefList()
+RefList::RefList(const char *listName, const char *pageTitle, const char *secTitle) :
+ m_listName(listName), m_fileName(convertNameToFile(listName,FALSE,TRUE)),
+ m_pageTitle(pageTitle), m_secTitle(secTitle)
{
- delete m_dictIterator;
- delete m_dict;
- delete m_itemList;
}
-/*! Adds a new item to the list.
- * \returns A unique id for this item.
- */
-int RefList::addRefItem()
+RefItem *RefList::add()
{
- if (m_dict==0)
- {
- m_dict = new QIntDict<RefItem>(1009);
- m_dict->setAutoDelete(TRUE);
- m_dictIterator = new QIntDictIterator<RefItem>(*m_dict);
- }
- RefItem *item = new RefItem;
m_id++;
- m_dict->insert(m_id,item);
- return m_id;
-}
-
-/*! Returns an item given it's id that is obtained with addRefItem()
- * \param itemId item's identifier.
- * \returns A pointer to the todo item's structure.
- */
-RefItem *RefList::getRefItem(int itemId)
-{
- return m_dict ? m_dict->find(itemId) : 0;
-}
-
-/*! Returns the first item in the dictionary or 0 if
- * non is available.
- * Items are not sorted.
- */
-RefItem *RefList::getFirstRefItem()
-{
- return m_dictIterator ? m_dictIterator->toFirst() : 0;
-}
-
-/*! Returns the next item in the dictionary or 0 if
- * we are at the end of the list.
- * Items are not sorted.
- */
-RefItem *RefList::getNextRefItem()
-{
- return m_dictIterator ? m_dictIterator->operator++() : 0;
-}
-
-/*! Returns the name of the list as set in the constructor. */
-QCString RefList::listName() const
-{
- return m_listName;
-}
-
-QCString RefList::fileName() const
-{
- return m_fileName;
+ std::unique_ptr<RefItem> item = std::make_unique<RefItem>(m_id,this);
+ RefItem *result = item.get();
+ m_entries.push_back(std::move(item));
+ m_lookup.insert({m_id,result});
+ return result;
}
-QCString RefList::pageTitle() const
+RefItem *RefList::find(int itemId)
{
- return m_pageTitle;
+ auto it = m_lookup.find(itemId);
+ return it!=m_lookup.end() ? it->second : nullptr;
}
-QCString RefList::sectionTitle() const
+bool RefList::isEnabled() const
{
- return m_secTitle;
+ if (m_listName=="todo" && !Config_getBool(GENERATE_TODOLIST)) return false;
+ else if (m_listName=="test" && !Config_getBool(GENERATE_TESTLIST)) return false;
+ else if (m_listName=="bug" && !Config_getBool(GENERATE_BUGLIST)) return false;
+ else if (m_listName=="deprecated" && !Config_getBool(GENERATE_DEPRECATEDLIST)) return false;
+ return true;
}
-void RefList::insertIntoList(const char *key,RefItem *item)
-{
- if (m_itemList==0)
- {
- m_itemList = new SortedRefItems(1009);
- }
- RefItem *ri = m_itemList->find(key);
- if (ri==0)
- {
- m_itemList->append(key,item);
- }
- else // item already added to the list (i.e. multiple item for the same
- // entity)
- {
- if (ri!=item)
- {
- // We also have to check if the item is not already in the "extra" list
- QListIterator<RefItem> li(ri->extraItems);
- RefItem *extraItem;
- bool doubleItem = false;
- for (li.toFirst();(extraItem=li.current());++li)
- {
- if (item == extraItem) doubleItem = true;
- }
- if (!doubleItem) ri->extraItems.append(item);
- }
- }
-}
-
-
void RefList::generatePage()
{
- if (m_itemList==0) return;
- m_itemList->sort();
- SDict<RefItem>::Iterator it(*m_itemList);
- RefItem *item;
+ if (!isEnabled()) return;
+
+ std::sort(m_entries.begin(),m_entries.end(),
+ [](std::unique_ptr<RefItem> &left,std::unique_ptr<RefItem> &right)
+ { return qstricmp(left->title(),right->title()) < 0; });
+ //RefItem *item;
QCString doc;
+ int cnt = 0;
doc += "<dl class=\"reflist\">";
- for (it.toFirst();(item=it.current());++it)
+ QCString lastGroup;
+ bool first=true;
+ for (const std::unique_ptr<RefItem> &item : m_entries)
{
- doc += " <dt>";
- doc += "\n";
- if (item->scope)
+ if (!item->name()) continue;
+ cnt++;
+ bool startNewGroup = item->group()!=lastGroup;
+ if (startNewGroup)
{
- if (item->scope->name() != "<globalScope>")
+ if (!first)
{
- doc += "\\_setscope ";
- doc += item->scope->name();
- doc += " ";
+ doc += "</dd>";
+ first=false;
}
+ doc += " <dt>";
+ doc += "\n";
+ if (item->scope())
+ {
+ if (item->scope()->name() != "<globalScope>")
+ {
+ doc += "\\_setscope ";
+ doc += item->scope()->name();
+ doc += " ";
+ }
+ }
+ doc += item->prefix();
+ doc += " \\_internalref ";
+ doc += item->name();
+ // escape \'s in title, see issue #5901
+ QCString escapedTitle = substitute(item->title(),"\\","\\\\");
+ doc += " \""+escapedTitle+"\" ";
+ // write declaration in case a function with arguments
+ if (!item->args().isEmpty())
+ {
+ // escape @'s in argument list, needed for Java annotations (see issue #6208)
+ // escape \'s in argument list (see issue #6533)
+ doc += substitute(substitute(item->args(),"@","@@"),"\\","\\\\");
+ }
+ doc += "</dt><dd>";
}
- doc += item->prefix;
- doc += " \\_internalref ";
- doc += item->name;
- // escape \'s in title, see issue #5901
- QCString escapedTitle = substitute(item->title,"\\","\\\\");
- if (item->scope &&
- (item->scope->definitionType()==Definition::TypeClass ||
- item->scope->definitionType()==Definition::TypeNamespace ||
- item->scope->definitionType()==Definition::TypeMember ||
- item->scope->definitionType()==Definition::TypePackage)
- )
- {
- // prevent Obj-C names in e.g. todo list are seen as emoji
- escapedTitle = substitute(escapedTitle,":","&Colon;");
- }
- doc += " \""+escapedTitle+"\" ";
- // write declaration in case a function with arguments
- if (!item->args.isEmpty())
+ else
{
- // escape @'s in argument list, needed for Java annotations (see issue #6208)
- // escape \'s in argument list (see issue #6533)
- doc += substitute(substitute(item->args,"@","@@"),"\\","\\\\");
+ doc += "<p>";
}
- doc += "</dt><dd> \\anchor ";
- doc += item->listAnchor;
+ doc += " \\anchor ";
+ doc += item->anchor();
doc += " ";
- doc += item->text;
- QListIterator<RefItem> li(item->extraItems);
- RefItem *extraItem;
- for (li.toFirst();(extraItem=li.current());++li)
- {
- doc += "<p> \\anchor ";
- doc += extraItem->listAnchor;
- doc += " ";
- doc += extraItem->text;
- }
+ doc += item->text();
+ lastGroup = item->group();
+ first = false;
+ }
+ if (!first)
+ {
doc += "</dd>";
}
doc += "</dl>\n";
//printf("generatePage('%s')\n",doc.data());
- addRelatedPage(m_listName,m_pageTitle,doc,m_fileName,1,std::vector<ListItemInfo>(),0,0,TRUE);
+ if (cnt>0)
+ {
+ addRelatedPage(m_listName,m_pageTitle,doc,m_fileName,1,1,RefItemVector(),0,0,TRUE);
+ }
}
-
diff --git a/src/reflist.h b/src/reflist.h
index d064c58..0ced63b 100644
--- a/src/reflist.h
+++ b/src/reflist.h
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,46 +16,61 @@
#ifndef _REFLIST_H
#define _REFLIST_H
+#include <vector>
+#include <unordered_map>
+#include <memory>
+
#include <qintdict.h>
#include <qlist.h>
-#include "sortdict.h"
+#include "linkedmap.h"
class Definition;
+class RefList;
/** This struct represents an item in the list of references. */
-struct RefItem
-{
- RefItem() : scope(0) {}
- QCString text; //!< text of the item.
- QCString listAnchor; //!< anchor in the list
-
- QCString prefix; //!< type prefix for the name
- Definition *scope; //!< scope to use for references.
- QCString name; //!< name of the entity containing the reference
- QCString title; //!< display name of the entity
- QCString args; //!< optional arguments for the entity (if function)
- //bool written;
- QList<RefItem> extraItems; //!< more items belonging to the same entity
-};
-
-/** List of items sorted by title */
-class SortedRefItems : public SDict<RefItem>
+class RefItem
{
public:
- SortedRefItems(int size=17) : SDict<RefItem>(size) {}
- virtual ~SortedRefItems() {}
+ RefItem(int id,RefList *list) : m_id(id), m_list(list) {}
+
+ void setText (const char *text) { m_text = text; }
+ void setAnchor(const char *anchor) { m_anchor = anchor; }
+ void setPrefix(const char *prefix) { m_prefix = prefix; }
+ void setName (const char *name) { m_name = name; }
+ void setTitle (const char *title) { m_title = title; }
+ void setArgs (const char *args) { m_args = args; }
+ void setGroup (const char *group) { m_group = group; }
+ void setScope (const Definition *scope) { m_scope = scope; }
+
+ QCString text() const { return m_text; }
+ QCString anchor() const { return m_anchor; }
+ QCString prefix() const { return m_prefix; }
+ QCString name() const { return m_name; }
+ QCString title() const { return m_title; }
+ QCString args() const { return m_args; }
+ QCString group() const { return m_group; }
+ int id() const { return m_id; }
+ RefList *list() const { return m_list; }
+ const Definition *scope() const { return m_scope; }
+
private:
- int compareValues(const RefItem *r1,const RefItem *r2) const
- {
- return qstricmp(r1->title,r2->title);
- }
+ int m_id = 0; //!< unique identifier for this item within its list
+ RefList *m_list; //!< list owning this item
+ QCString m_text; //!< text of the item.
+ QCString m_anchor; //!< anchor in the list
+ QCString m_prefix; //!< type prefix for the name
+ QCString m_name; //!< name of the entity containing the reference
+ QCString m_title; //!< display name of the entity
+ QCString m_args; //!< optional arguments for the entity (if function)
+ QCString m_group; //!< group id used to combine item under a single header
+ const Definition *m_scope = 0; //!< scope to use for references.
};
-/** List of cross-referenced items
- *
+/** List of cross-referenced items
+ *
* This class represents a list of items that are put
- * at a certain point in the documentation by some special command
- * and are collected in a list. The items cross-reference the
+ * at a certain point in the documentation by some special command
+ * and are collected in a list. The items cross-reference the
* documentation and the list.
*
* Examples are the todo list, the test list and the bug list,
@@ -67,31 +79,57 @@ class SortedRefItems : public SDict<RefItem>
class RefList
{
public:
- int addRefItem();
- RefItem *getRefItem(int todoItemId);
- RefItem *getFirstRefItem();
- RefItem *getNextRefItem();
- QCString listName() const;
- QCString fileName() const;
- QCString pageTitle() const;
- QCString sectionTitle() const;
-
- RefList(const char *listName,
- const char *pageTitle,const char *secTitle
- );
- ~RefList();
- void insertIntoList(const char *key,RefItem *item);
+ /*! Create a list of items that are cross referenced with documentation blocks
+ * @param listName String representing the name of the list.
+ * @param pageTitle String representing the title of the list page.
+ * @param secTitle String representing the title of the section.
+ */
+ RefList(const char *listName, const char *pageTitle, const char *secTitle);
+ bool isEnabled() const;
+
+ /*! Adds a new item to the list.
+ * @returns A unique id for this item.
+ */
+ RefItem *add();
+
+ /*! Returns an item given it's id that is obtained with addRefItem()
+ * @param itemId item's identifier.
+ * @returns A pointer to the todo item's structure.
+ */
+ RefItem *find(int itemId);
+
+ QCString listName() const { return m_listName; }
+ QCString fileName() const { return m_fileName; }
+ QCString pageTitle() const { return m_pageTitle; }
+ QCString sectionTitle() const { return m_secTitle; }
+
void generatePage();
private:
- int m_id;
+ int m_id = 0;
QCString m_listName;
QCString m_fileName;
QCString m_pageTitle;
QCString m_secTitle;
- SortedRefItems *m_itemList;
- QIntDict<RefItem> *m_dict;
- QIntDictIterator<RefItem> *m_dictIterator;
+ std::vector< std::unique_ptr< RefItem > > m_entries;
+ std::unordered_map< int, RefItem* > m_lookup;
+};
+
+class RefListManager : public LinkedMap<RefList>
+{
+ public:
+ static RefListManager &instance()
+ {
+ static RefListManager rlm;
+ return rlm;
+ }
+
+ private:
+ RefListManager() {}
+ RefListManager(const RefListManager &other) = delete;
+ RefListManager &operator=(const RefListManager &other) = delete;
};
+using RefItemVector = std::vector<RefItem*>;
+
#endif
diff --git a/src/res2cc_cmd.py b/src/res2cc_cmd.py
index 86d999d..f6321f6 100755
--- a/src/res2cc_cmd.py
+++ b/src/res2cc_cmd.py
@@ -58,6 +58,7 @@ class File(object):
if ext=='.lum': return LumFile(directory,subdir,fname)
if ext=='.luma': return LumaFile(directory,subdir,fname)
if ext=='.css': return CSSFile(directory,subdir,fname)
+ if ext=='.svg': return SVGFile(directory,subdir,fname)
return VerbatimFile(directory,subdir,fname)
class VerbatimFile(File):
@@ -76,6 +77,14 @@ class CSSFile(File):
def writeDirEntry(self,outputFile):
print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::CSS }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+class SVGFile(File):
+ def __init__(self,directory,subdir,fileName):
+ File.__init__(self,directory,subdir,fileName,"r")
+ def writeContents(self,outputFile):
+ self.writeBytes(self.inputFile.read(),outputFile)
+ def writeDirEntry(self,outputFile):
+ print(" { \"%s\", \"%s\", %s_data, %s_len, Resource::SVG }," % (self.subdir,self.fileName,self.bareName,self.bareName), file=outputFile)
+
class LumFile(File):
def __init__(self,directory,subdir,fileName):
File.__init__(self,directory,subdir,fileName,"r")
@@ -107,13 +116,10 @@ def main():
print("#include \"resourcemgr.h\"\n",file=outputFile)
for f in files:
f.writeContents(outputFile)
- print("static Resource resourceDir[] =",file=outputFile)
- print("{",file=outputFile)
+ print("void initResources() { ResourceMgr::instance().registerResources({",file=outputFile)
for f in files:
f.writeDirEntry(outputFile)
- print("};",file=outputFile)
- print("static int resourceDir_len = %s;" % len(files), file=outputFile)
- print("void initResources() { ResourceMgr::instance().registerResources(resourceDir,resourceDir_len); }",file=outputFile)
+ print("});}",file=outputFile)
if __name__ == '__main__':
main()
diff --git a/src/resourcemgr.cpp b/src/resourcemgr.cpp
index 8cb831e..36ce30d 100644
--- a/src/resourcemgr.cpp
+++ b/src/resourcemgr.cpp
@@ -12,7 +12,8 @@
* input used in their production; they are not affected by this license.
*
*/
-#include <qdict.h>
+
+#include <map>
#include <qfile.h>
#include <qcstring.h>
#include <qglobal.h>
@@ -28,8 +29,7 @@
class ResourceMgr::Private
{
public:
- Private() : resources(257) {}
- QDict<Resource> resources;
+ std::map<std::string,Resource> resources;
};
ResourceMgr &ResourceMgr::instance()
@@ -38,37 +38,34 @@ ResourceMgr &ResourceMgr::instance()
return theInstance;
}
-ResourceMgr::ResourceMgr()
+ResourceMgr::ResourceMgr() : p(std::make_unique<Private>())
{
- p = new Private;
}
ResourceMgr::~ResourceMgr()
{
- delete p;
}
-void ResourceMgr::registerResources(const Resource resources[],int numResources)
+void ResourceMgr::registerResources(std::initializer_list<Resource> resources)
{
- for (int i=0;i<numResources;i++)
+ for (auto &res : resources)
{
- p->resources.insert(resources[i].name,&resources[i]);
+ p->resources.insert({res.name,res});
}
}
bool ResourceMgr::writeCategory(const char *categoryName,const char *targetDir) const
{
- QDictIterator<Resource> it(p->resources);
- const Resource *res;
- for (it.toFirst();(res=it.current());++it)
+ for (auto &kv : p->resources)
{
- if (qstrcmp(res->category,categoryName)==0)
+ Resource &res = kv.second;
+ if (qstrcmp(res.category,categoryName)==0)
{
- QCString pathName = QCString(targetDir)+"/"+res->name;
+ QCString pathName = QCString(targetDir)+"/"+res.name;
QFile f(pathName);
- if (!f.open(IO_WriteOnly) || f.writeBlock((const char *)res->data,res->size)!=res->size)
+ if (!f.open(IO_WriteOnly) || f.writeBlock((const char *)res.data,res.size)!=res.size)
{
- err("Failed to write resource '%s' to directory '%s'\n",res->name,targetDir);
+ err("Failed to write resource '%s' to directory '%s'\n",res.name,targetDir);
return FALSE;
}
}
@@ -97,14 +94,14 @@ bool ResourceMgr::copyResourceAs(const char *name,const char *targetDir,const ch
{
QCString n = name;
n = n.left(n.length()-4)+".png"; // replace .lum by .png
- uchar *p = (uchar*)res->data;
- int width = (p[0]<<8)+p[1];
- int height = (p[2]<<8)+p[3];
+ uchar *data = (uchar*)res->data;
+ ushort width = (data[0]<<8)+data[1];
+ ushort height = (data[2]<<8)+data[3];
ColoredImgDataItem images[2];
images[0].name = n;
images[0].width = width;
images[0].height = height;
- images[0].content = &p[4];
+ images[0].content = &data[4];
images[0].alpha = 0;
images[1].name = 0; // terminator
writeColoredImgData(targetDir,images);
@@ -115,15 +112,15 @@ bool ResourceMgr::copyResourceAs(const char *name,const char *targetDir,const ch
{
QCString n = name;
n = n.left(n.length()-5)+".png"; // replace .luma by .png
- uchar *p = (uchar*)res->data;
- int width = (p[0]<<8)+p[1];
- int height = (p[2]<<8)+p[3];
+ uchar *data = (uchar*)res->data;
+ ushort width = (data[0]<<8)+data[1];
+ ushort height = (data[2]<<8)+data[3];
ColoredImgDataItem images[2];
images[0].name = n;
images[0].width = width;
images[0].height = height;
- images[0].content = &p[4];
- images[0].alpha = &p[4+width*height];
+ images[0].content = &data[4];
+ images[0].alpha = &data[4+width*height];
images[1].name = 0; // terminator
writeColoredImgData(targetDir,images);
return TRUE;
@@ -144,12 +141,24 @@ bool ResourceMgr::copyResourceAs(const char *name,const char *targetDir,const ch
}
else
{
- t << substitute(buf,"$doxygenversion",getVersion());
+ t << substitute(buf,"$doxygenversion",getDoxygenVersion());
}
return TRUE;
}
}
break;
+ case Resource::SVG:
+ {
+ QFile f(pathName);
+ if (f.open(IO_WriteOnly))
+ {
+ QCString buf(res->size+1);
+ memcpy(buf.rawData(),res->data,res->size);
+ FTextStream t(&f);
+ t << replaceColorMarkers(buf);
+ return TRUE;
+ }
+ }
}
}
else
@@ -166,7 +175,9 @@ bool ResourceMgr::copyResource(const char *name,const char *targetDir) const
const Resource *ResourceMgr::get(const char *name) const
{
- return p->resources.find(name);
+ auto it = p->resources.find(name);
+ if (it!=p->resources.end()) return &it->second;
+ return 0;
}
QCString ResourceMgr::getAsString(const char *name) const
diff --git a/src/resourcemgr.h b/src/resourcemgr.h
index 6e1587d..2d7ad9b 100644
--- a/src/resourcemgr.h
+++ b/src/resourcemgr.h
@@ -15,12 +15,15 @@
#ifndef RESOURCEMGR_H
#define RESOURCEMGR_H
+#include <memory>
+#include <initializer_list>
+
#include <qcstring.h>
/** @brief Compiled resource */
struct Resource
{
- enum Type { Verbatim, Luminance, LumAlpha, CSS };
+ enum Type { Verbatim, Luminance, LumAlpha, CSS, SVG };
const char *category;
const char *name;
const unsigned char *data;
@@ -36,7 +39,7 @@ class ResourceMgr
static ResourceMgr &instance();
/** Registers an array of resources */
- void registerResources(const Resource resources[],int numResources);
+ void registerResources(std::initializer_list<Resource> resources);
/** Writes all resource belonging to a given category to a given target directory */
bool writeCategory(const char *categoryName,const char *targetDir) const;
@@ -57,7 +60,7 @@ class ResourceMgr
ResourceMgr();
~ResourceMgr();
class Private;
- Private *p;
+ std::unique_ptr<Private> p;
};
#endif
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
index 471cf85..2bd2c29 100644
--- a/src/rtfdocvisitor.cpp
+++ b/src/rtfdocvisitor.cpp
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -44,13 +44,13 @@ static QCString align(DocHtmlCell *cell)
{
HtmlAttribList attrs = cell->attribs();
uint i;
- for (i=0; i<attrs.count(); ++i)
+ for (i=0; i<attrs.count(); ++i)
{
if (attrs.at(i)->name.lower()=="align")
{
- if (attrs.at(i)->value.lower()=="center")
+ if (attrs.at(i)->value.lower()=="center")
return "\\qc ";
- else if (attrs.at(i)->value.lower()=="right")
+ else if (attrs.at(i)->value.lower()=="right")
return "\\qr ";
else return "";
}
@@ -59,8 +59,8 @@ static QCString align(DocHtmlCell *cell)
}
RTFDocVisitor::RTFDocVisitor(FTextStream &t,CodeOutputInterface &ci,
- const char *langExt)
- : DocVisitor(DocVisitor_RTF), m_t(t), m_ci(ci), m_insidePre(FALSE),
+ const char *langExt)
+ : DocVisitor(DocVisitor_RTF), m_t(t), m_ci(ci), m_insidePre(FALSE),
m_hide(FALSE), m_indentLevel(0), m_lastIsPara(FALSE), m_langExt(langExt)
{
}
@@ -71,7 +71,7 @@ QCString RTFDocVisitor::getStyle(const char *name)
n.sprintf("%s%d",name,m_indentLevel);
StyleData *sd = rtf_Style[n];
ASSERT(sd!=0);
- return sd->reference;
+ return sd->reference();
}
void RTFDocVisitor::incIndentLevel()
@@ -213,7 +213,7 @@ void RTFDocVisitor::visit(DocLineBreak *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visit(DocLineBreak)}\n");
- m_t << "\\par" << endl;
+ m_t << "\\par" << endl;
m_lastIsPara=TRUE;
}
@@ -306,37 +306,36 @@ void RTFDocVisitor::visit(DocVerbatim *s)
m_t << "{" << endl;
m_t << "\\par" << endl;
m_t << rtf_Style_Reset << getStyle("CodeExample");
- Doxygen::parserManager->getCodeParser(lang)
- .parseCode(m_ci,s->context(),s->text(),langExt,
- s->isExample(),s->exampleFile());
- //m_t << "\\par" << endl;
+ getCodeParser(lang).parseCode(m_ci,s->context(),s->text(),langExt,
+ s->isExample(),s->exampleFile());
+ //m_t << "\\par" << endl;
m_t << "}" << endl;
break;
- case DocVerbatim::Verbatim:
+ case DocVerbatim::Verbatim:
m_t << "{" << endl;
m_t << "\\par" << endl;
m_t << rtf_Style_Reset << getStyle("CodeExample");
filter(s->text(),TRUE);
- //m_t << "\\par" << endl;
+ //m_t << "\\par" << endl;
m_t << "}" << endl;
break;
- case DocVerbatim::RtfOnly:
- m_t << s->text();
+ case DocVerbatim::RtfOnly:
+ m_t << s->text();
break;
- case DocVerbatim::HtmlOnly:
- case DocVerbatim::LatexOnly:
- case DocVerbatim::XmlOnly:
+ case DocVerbatim::HtmlOnly:
+ case DocVerbatim::LatexOnly:
+ case DocVerbatim::XmlOnly:
case DocVerbatim::ManOnly:
case DocVerbatim::DocbookOnly:
/* nothing */
break;
- case DocVerbatim::Dot:
+ case DocVerbatim::Dot:
{
static int dotindex = 1;
QCString fileName(4096);
- fileName.sprintf("%s%d%s",
- (Config_getString(RTF_OUTPUT)+"/inline_dotgraph_").data(),
+ fileName.sprintf("%s%d%s",
+ (Config_getString(RTF_OUTPUT)+"/inline_dotgraph_").data(),
dotindex++,
".dot"
);
@@ -355,13 +354,13 @@ void RTFDocVisitor::visit(DocVerbatim *s)
if (Config_getBool(DOT_CLEANUP)) file.remove();
}
break;
- case DocVerbatim::Msc:
+ case DocVerbatim::Msc:
{
static int mscindex = 1;
QCString baseName(4096);
baseName.sprintf("%s%d%s",
- (Config_getString(RTF_OUTPUT)+"/inline_mscgraph_").data(),
+ (Config_getString(RTF_OUTPUT)+"/inline_mscgraph_").data(),
mscindex++,
".msc"
);
@@ -427,14 +426,13 @@ void RTFDocVisitor::visit(DocInclude *inc)
switch(inc->type())
{
case DocInclude::IncWithLines:
- {
+ {
m_t << "{" << endl;
m_t << "\\par" << endl;
m_t << rtf_Style_Reset << getStyle("CodeExample");
QFileInfo cfi( inc->file() );
FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
inc->text(),
langExt,
inc->isExample(),
@@ -451,12 +449,11 @@ void RTFDocVisitor::visit(DocInclude *inc)
m_t << "}" << endl;
}
break;
- case DocInclude::Include:
+ case DocInclude::Include:
m_t << "{" << endl;
m_t << "\\par" << endl;
m_t << rtf_Style_Reset << getStyle("CodeExample");
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
inc->text(),langExt,inc->isExample(),
inc->exampleFile(),
0, // fileDef
@@ -473,8 +470,14 @@ void RTFDocVisitor::visit(DocInclude *inc)
case DocInclude::DontIncWithLines:
case DocInclude::HtmlInclude:
case DocInclude::LatexInclude:
+ case DocInclude::ManInclude:
+ case DocInclude::XmlInclude:
+ case DocInclude::DocbookInclude:
break;
- case DocInclude::VerbInclude:
+ case DocInclude::RtfInclude:
+ m_t << inc->text();
+ break;
+ case DocInclude::VerbInclude:
m_t << "{" << endl;
m_t << "\\par" << endl;
m_t << rtf_Style_Reset << getStyle("CodeExample");
@@ -486,8 +489,7 @@ void RTFDocVisitor::visit(DocInclude *inc)
m_t << "{" << endl;
if (!m_lastIsPara) m_t << "\\par" << endl;
m_t << rtf_Style_Reset << getStyle("CodeExample");
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
extractBlock(inc->text(),inc->blockId()),
langExt,
@@ -503,13 +505,12 @@ void RTFDocVisitor::visit(DocInclude *inc)
m_t << "{" << endl;
if (!m_lastIsPara) m_t << "\\par" << endl;
m_t << rtf_Style_Reset << getStyle("CodeExample");
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
extractBlock(inc->text(),inc->blockId()),
langExt,
inc->isExample(),
- inc->exampleFile(),
+ inc->exampleFile(),
fd,
lineBlock(inc->text(),inc->blockId()),
-1, // endLine
@@ -521,8 +522,8 @@ void RTFDocVisitor::visit(DocInclude *inc)
m_t << "}";
}
break;
- case DocInclude::SnippetDoc:
- case DocInclude::IncludeDoc:
+ case DocInclude::SnippetDoc:
+ case DocInclude::IncludeDoc:
err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
"Please create a bug report\n",__FILE__);
break;
@@ -538,7 +539,7 @@ void RTFDocVisitor::visit(DocIncOperator *op)
QCString locLangExt = getFileNameExtension(op->includeFileName());
if (locLangExt.isEmpty()) locLangExt = m_langExt;
SrcLangExt langExt = getLanguageFromFileName(locLangExt);
- if (op->isFirst())
+ if (op->isFirst())
{
if (!m_hide)
{
@@ -549,10 +550,10 @@ void RTFDocVisitor::visit(DocIncOperator *op)
pushEnabled();
m_hide = TRUE;
}
- if (op->type()!=DocIncOperator::Skip)
+ if (op->type()!=DocIncOperator::Skip)
{
popEnabled();
- if (!m_hide)
+ if (!m_hide)
{
FileDef *fd = 0;
if (!op->includeFileName().isEmpty())
@@ -561,8 +562,7 @@ void RTFDocVisitor::visit(DocIncOperator *op)
fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
}
- Doxygen::parserManager->getCodeParser(locLangExt)
- .parseCode(m_ci,op->context(),op->text(),langExt,
+ getCodeParser(locLangExt).parseCode(m_ci,op->context(),op->text(),langExt,
op->isExample(),op->exampleFile(),
fd, // fileDef
op->line(), // startLine
@@ -576,7 +576,7 @@ void RTFDocVisitor::visit(DocIncOperator *op)
pushEnabled();
m_hide=TRUE;
}
- if (op->isLast())
+ if (op->isLast())
{
popEnabled();
if (!m_hide)
@@ -598,7 +598,7 @@ void RTFDocVisitor::visit(DocFormula *f)
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visit(DocFormula)}\n");
bool bDisplay = !f->isInline();
- if (bDisplay)
+ if (bDisplay)
{
m_t << "\\par";
m_t << "{";
@@ -607,7 +607,7 @@ void RTFDocVisitor::visit(DocFormula *f)
m_t << "\\qc";
}
m_t << "{ \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"" << f->relPath() << f->name() << ".png\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt Image}}";
- if (bDisplay)
+ if (bDisplay)
{
m_t << "\\par}";
}
@@ -630,7 +630,7 @@ void RTFDocVisitor::visit(DocCite *cite)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocCite)}\n");
- if (!cite->file().isEmpty())
+ if (!cite->file().isEmpty())
{
startLink(cite->ref(),cite->file(),cite->anchor());
}
@@ -639,7 +639,7 @@ void RTFDocVisitor::visit(DocCite *cite)
m_t << "{\\b ";
}
filter(cite->text());
- if (!cite->file().isEmpty())
+ if (!cite->file().isEmpty())
{
endLink(cite->ref());
}
@@ -671,7 +671,7 @@ void RTFDocVisitor::visitPost(DocAutoList *)
if (!m_lastIsPara) m_t << "\\par";
m_t << "}" << endl;
m_lastIsPara=TRUE;
- if (!m_indentLevel) m_t << "\\par";
+ if (!m_indentLevel) m_t << "\\par" << endl;
}
void RTFDocVisitor::visitPre(DocAutoListItem *)
@@ -694,13 +694,13 @@ void RTFDocVisitor::visitPre(DocAutoListItem *)
m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocAutoListItem *)
+void RTFDocVisitor::visitPost(DocAutoListItem *)
{
decIndentLevel();
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocAutoListItem)}\n");
}
-void RTFDocVisitor::visitPre(DocPara *)
+void RTFDocVisitor::visitPre(DocPara *)
{
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocPara)}\n");
}
@@ -714,7 +714,7 @@ void RTFDocVisitor::visitPost(DocPara *p)
!(p->parent() && // and for parameters & sections
p->parent()->kind()==DocNode::Kind_ParamSect
)
- )
+ )
{
m_t << "\\par" << endl;
m_lastIsPara=TRUE;
@@ -726,7 +726,7 @@ void RTFDocVisitor::visitPre(DocRoot *r)
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocRoot)}\n");
if (r->indent()) incIndentLevel();
- m_t << "{" << rtf_Style["BodyText"]->reference << endl;
+ m_t << "{" << rtf_Style["BodyText"]->reference() << endl;
}
void RTFDocVisitor::visitPost(DocRoot *r)
@@ -746,24 +746,24 @@ void RTFDocVisitor::visitPre(DocSimpleSect *s)
if (!m_lastIsPara) m_t << "\\par" << endl;
m_t << "{"; // start desc
//m_t << "{\\b "; // start bold
- m_t << "{" << rtf_Style["Heading5"]->reference << endl;
+ m_t << "{" << rtf_Style["Heading5"]->reference() << endl;
switch(s->type())
{
- case DocSimpleSect::See:
+ case DocSimpleSect::See:
m_t << theTranslator->trSeeAlso(); break;
- case DocSimpleSect::Return:
+ case DocSimpleSect::Return:
m_t << theTranslator->trReturns(); break;
- case DocSimpleSect::Author:
+ case DocSimpleSect::Author:
m_t << theTranslator->trAuthor(TRUE,TRUE); break;
- case DocSimpleSect::Authors:
+ case DocSimpleSect::Authors:
m_t << theTranslator->trAuthor(TRUE,FALSE); break;
- case DocSimpleSect::Version:
+ case DocSimpleSect::Version:
m_t << theTranslator->trVersion(); break;
- case DocSimpleSect::Since:
+ case DocSimpleSect::Since:
m_t << theTranslator->trSince(); break;
- case DocSimpleSect::Date:
+ case DocSimpleSect::Date:
m_t << theTranslator->trDate(); break;
- case DocSimpleSect::Note:
+ case DocSimpleSect::Note:
m_t << theTranslator->trNote(); break;
case DocSimpleSect::Warning:
m_t << theTranslator->trWarning(); break;
@@ -850,7 +850,7 @@ void RTFDocVisitor::visitPre(DocSimpleListItem *)
incIndentLevel();
}
-void RTFDocVisitor::visitPost(DocSimpleListItem *)
+void RTFDocVisitor::visitPost(DocSimpleListItem *)
{
decIndentLevel();
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleListItem)}\n");
@@ -869,7 +869,7 @@ void RTFDocVisitor::visitPre(DocSection *s)
int level = QMIN(s->level()+1,4);
heading.sprintf("Heading%d",level);
// set style
- m_t << rtf_Style[heading]->reference << endl;
+ m_t << rtf_Style[heading]->reference() << endl;
// make table of contents entry
filter(s->title());
m_t << endl << "\\par" << "}" << endl;
@@ -879,7 +879,7 @@ void RTFDocVisitor::visitPre(DocSection *s)
m_lastIsPara=TRUE;
}
-void RTFDocVisitor::visitPost(DocSection *)
+void RTFDocVisitor::visitPost(DocSection *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSection)}\n");
@@ -892,12 +892,12 @@ void RTFDocVisitor::visitPre(DocHtmlList *l)
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlList)}\n");
m_t << "{" << endl;
- rtf_listItemInfo[m_indentLevel].isEnum = l->type()==DocHtmlList::Ordered;
+ rtf_listItemInfo[m_indentLevel].isEnum = l->type()==DocHtmlList::Ordered;
rtf_listItemInfo[m_indentLevel].number = 1;
m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocHtmlList *)
+void RTFDocVisitor::visitPost(DocHtmlList *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlList)}\n");
@@ -925,7 +925,7 @@ void RTFDocVisitor::visitPre(DocHtmlListItem *)
m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocHtmlListItem *)
+void RTFDocVisitor::visitPost(DocHtmlListItem *)
{
decIndentLevel();
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlListItem)}\n");
@@ -940,7 +940,7 @@ void RTFDocVisitor::visitPre(DocHtmlDescList *)
//m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocHtmlDescList *)
+void RTFDocVisitor::visitPost(DocHtmlDescList *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescList)}\n");
@@ -955,11 +955,11 @@ void RTFDocVisitor::visitPre(DocHtmlDescTitle *)
DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescTitle)}\n");
//m_t << "\\par" << endl;
//m_t << "{\\b ";
- m_t << "{" << rtf_Style["Heading5"]->reference << endl;
+ m_t << "{" << rtf_Style["Heading5"]->reference() << endl;
m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocHtmlDescTitle *)
+void RTFDocVisitor::visitPost(DocHtmlDescTitle *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescTitle)}\n");
@@ -976,7 +976,7 @@ void RTFDocVisitor::visitPre(DocHtmlDescData *)
m_t << "{" << rtf_Style_Reset << getStyle("DescContinue");
}
-void RTFDocVisitor::visitPost(DocHtmlDescData *)
+void RTFDocVisitor::visitPost(DocHtmlDescData *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescData)}\n");
@@ -994,7 +994,7 @@ void RTFDocVisitor::visitPre(DocHtmlTable *)
m_lastIsPara=TRUE;
}
-void RTFDocVisitor::visitPost(DocHtmlTable *)
+void RTFDocVisitor::visitPost(DocHtmlTable *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlTable)}\n");
@@ -1010,7 +1010,7 @@ void RTFDocVisitor::visitPre(DocHtmlCaption *)
m_t << "{Table \\field\\flddirty{\\*\\fldinst { SEQ Table \\\\*Arabic }}{\\fldrslt {\\noproof 1}} ";
}
-void RTFDocVisitor::visitPost(DocHtmlCaption *)
+void RTFDocVisitor::visitPost(DocHtmlCaption *)
{
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlCaption)}\n");
m_t << "}\n\\par" << endl;
@@ -1045,7 +1045,7 @@ void RTFDocVisitor::visitPre(DocHtmlRow *r)
m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocHtmlRow *)
+void RTFDocVisitor::visitPost(DocHtmlRow *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlRow)}\n");
@@ -1063,7 +1063,7 @@ void RTFDocVisitor::visitPre(DocHtmlCell *c)
m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocHtmlCell *)
+void RTFDocVisitor::visitPost(DocHtmlCell *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlCell)}\n");
@@ -1085,7 +1085,7 @@ void RTFDocVisitor::visitPre(DocInternal *)
//m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocInternal *)
+void RTFDocVisitor::visitPost(DocInternal *)
{
if (m_hide) return;
//DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocInternal)}\n");
@@ -1101,14 +1101,30 @@ void RTFDocVisitor::visitPre(DocHRef *href)
DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHRef)}\n");
if (Config_getBool(RTF_HYPERLINKS))
{
- m_t << "{\\field "
- "{\\*\\fldinst "
- "{ HYPERLINK \"" << href->url() << "\" "
- "}{}"
- "}"
- "{\\fldrslt "
- "{\\cs37\\ul\\cf2 ";
-
+ if (href->url().startsWith("#CITEREF"))
+ {
+ // when starting with #CITEREF it is a doxygen generated "url"a
+ // so a local link
+ QCString cite;
+ cite = "citelist_" + href->url().right(href->url().length()-1);
+ m_t << "{\\field "
+ "{\\*\\fldinst "
+ "{ HYPERLINK \\\\l \"" << rtfFormatBmkStr(cite) << "\" "
+ "}{}"
+ "}"
+ "{\\fldrslt "
+ "{\\cs37\\ul\\cf2 ";
+ }
+ else
+ {
+ m_t << "{\\field "
+ "{\\*\\fldinst "
+ "{ HYPERLINK \"" << href->url() << "\" "
+ "}{}"
+ "}"
+ "{\\fldrslt "
+ "{\\cs37\\ul\\cf2 ";
+ }
}
else
{
@@ -1117,12 +1133,12 @@ void RTFDocVisitor::visitPre(DocHRef *href)
m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocHRef *)
+void RTFDocVisitor::visitPost(DocHRef *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHRef)}\n");
if (Config_getBool(RTF_HYPERLINKS))
- {
+ {
m_t << "}"
"}"
"}";
@@ -1144,13 +1160,13 @@ void RTFDocVisitor::visitPre(DocHtmlHeader *header)
int level = QMIN(header->level(),5);
heading.sprintf("Heading%d",level);
// set style
- m_t << rtf_Style[heading]->reference;
+ m_t << rtf_Style[heading]->reference();
// make open table of contents entry that will be closed in visitPost method
m_t << "{\\tc\\tcl" << level << " ";
m_lastIsPara=FALSE;
}
-void RTFDocVisitor::visitPost(DocHtmlHeader *)
+void RTFDocVisitor::visitPost(DocHtmlHeader *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlHeader)}\n");
@@ -1242,7 +1258,7 @@ void RTFDocVisitor::visitPre(DocDotFile *df)
writeDotFile(df);
}
-void RTFDocVisitor::visitPost(DocDotFile *df)
+void RTFDocVisitor::visitPost(DocDotFile *df)
{
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocDotFile)}\n");
includePicturePostRTF(true, df->hasCaption());
@@ -1253,7 +1269,7 @@ void RTFDocVisitor::visitPre(DocMscFile *df)
writeMscFile(df);
}
-void RTFDocVisitor::visitPost(DocMscFile *df)
+void RTFDocVisitor::visitPost(DocMscFile *df)
{
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocMscFile)}\n");
includePicturePostRTF(true, df->hasCaption());
@@ -1278,7 +1294,7 @@ void RTFDocVisitor::visitPre(DocLink *lnk)
startLink(lnk->ref(),lnk->file(),lnk->anchor());
}
-void RTFDocVisitor::visitPost(DocLink *lnk)
+void RTFDocVisitor::visitPost(DocLink *lnk)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocLink)}\n");
@@ -1302,7 +1318,7 @@ void RTFDocVisitor::visitPre(DocRef *ref)
if (!ref->hasLinkText()) filter(ref->targetTitle());
}
-void RTFDocVisitor::visitPost(DocRef *ref)
+void RTFDocVisitor::visitPost(DocRef *ref)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocRef)}\n");
@@ -1316,7 +1332,7 @@ void RTFDocVisitor::visitPre(DocSecRefItem *)
DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSecRefItem)}\n");
}
-void RTFDocVisitor::visitPost(DocSecRefItem *)
+void RTFDocVisitor::visitPost(DocSecRefItem *)
{
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSecRefItem)}\n");
}
@@ -1332,7 +1348,7 @@ void RTFDocVisitor::visitPre(DocSecRefList *)
m_lastIsPara=TRUE;
}
-void RTFDocVisitor::visitPost(DocSecRefList *)
+void RTFDocVisitor::visitPost(DocSecRefList *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSecRefList)}\n");
@@ -1353,7 +1369,7 @@ void RTFDocVisitor::visitPost(DocSecRefList *)
// }
//}
//
-//void RTFDocVisitor::visitPost(DocLanguage *l)
+//void RTFDocVisitor::visitPost(DocLanguage *l)
//{
// DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocLanguage)}\n");
// QCString langId = Config_getEnum(OUTPUT_LANGUAGE);
@@ -1370,16 +1386,16 @@ void RTFDocVisitor::visitPre(DocParamSect *s)
m_t << "{"; // start param list
if (!m_lastIsPara) m_t << "\\par" << endl;
//m_t << "{\\b "; // start bold
- m_t << "{" << rtf_Style["Heading5"]->reference << endl;
+ m_t << "{" << rtf_Style["Heading5"]->reference() << endl;
switch(s->type())
{
- case DocParamSect::Param:
+ case DocParamSect::Param:
m_t << theTranslator->trParameters(); break;
- case DocParamSect::RetVal:
+ case DocParamSect::RetVal:
m_t << theTranslator->trReturnValues(); break;
- case DocParamSect::Exception:
+ case DocParamSect::Exception:
m_t << theTranslator->trExceptions(); break;
- case DocParamSect::TemplateParam:
+ case DocParamSect::TemplateParam:
m_t << theTranslator->trTemplateParameters(); break;
default:
ASSERT(0);
@@ -1416,7 +1432,7 @@ void RTFDocVisitor::visitPost(DocParamSect *s)
void RTFDocVisitor::visitPre(DocParamList *pl)
{
- static int columnPos[4][5] =
+ static int columnPos[4][5] =
{ { 2, 25, 100, 100, 100 }, // no inout, no type
{ 3, 14, 35, 100, 100 }, // inout, no type
{ 3, 25, 50, 100, 100 }, // no inout, type
@@ -1503,11 +1519,11 @@ void RTFDocVisitor::visitPre(DocParamList *pl)
{
if (type->kind()==DocNode::Kind_Word)
{
- visit((DocWord*)type);
+ visit((DocWord*)type);
}
else if (type->kind()==DocNode::Kind_LinkedWord)
{
- visit((DocLinkedWord*)type);
+ visit((DocLinkedWord*)type);
}
else if (type->kind()==DocNode::Kind_Sep)
{
@@ -1519,7 +1535,7 @@ void RTFDocVisitor::visitPre(DocParamList *pl)
m_t << "\\cell }";
}
}
-
+
if (useTable)
{
@@ -1537,11 +1553,11 @@ void RTFDocVisitor::visitPre(DocParamList *pl)
if (!first) m_t << ","; else first=FALSE;
if (param->kind()==DocNode::Kind_Word)
{
- visit((DocWord*)param);
+ visit((DocWord*)param);
}
else if (param->kind()==DocNode::Kind_LinkedWord)
{
- visit((DocLinkedWord*)param);
+ visit((DocLinkedWord*)param);
}
}
m_t << "} ";
@@ -1596,7 +1612,7 @@ void RTFDocVisitor::visitPre(DocXRefItem *x)
}
m_t << "{"; // start param list
//m_t << "{\\b "; // start bold
- m_t << "{" << rtf_Style["Heading5"]->reference << endl;
+ m_t << "{" << rtf_Style["Heading5"]->reference() << endl;
if (Config_getBool(RTF_HYPERLINKS) && !anonymousEnum)
{
QCString refName;
@@ -1615,7 +1631,7 @@ void RTFDocVisitor::visitPre(DocXRefItem *x)
m_t << "{\\field "
"{\\*\\fldinst "
- "{ HYPERLINK \\\\l \"" << refName << "\" "
+ "{ HYPERLINK \\\\l \"" << rtfFormatBmkStr(refName) << "\" "
"}{}"
"}"
"{\\fldrslt "
@@ -1655,7 +1671,7 @@ void RTFDocVisitor::visitPre(DocInternalRef *ref)
startLink("",ref->file(),ref->anchor());
}
-void RTFDocVisitor::visitPost(DocInternalRef *)
+void RTFDocVisitor::visitPost(DocInternalRef *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocInternalRef)}\n");
@@ -1682,7 +1698,7 @@ void RTFDocVisitor::visitPre(DocHtmlBlockQuote *)
if (!m_lastIsPara) m_t << "\\par" << endl;
m_t << "{"; // start desc
incIndentLevel();
- m_t << rtf_Style_Reset << getStyle("DescContinue");
+ m_t << rtf_Style_Reset << getStyle("DescContinue");
}
void RTFDocVisitor::visitPost(DocHtmlBlockQuote *)
@@ -1724,7 +1740,7 @@ void RTFDocVisitor::visitPost(DocParBlock *)
//}
void RTFDocVisitor::filter(const char *str,bool verbatim)
-{
+{
if (str)
{
const unsigned char *p=(const unsigned char *)str;
@@ -1755,7 +1771,7 @@ void RTFDocVisitor::filter(const char *str,bool verbatim)
case '\\': m_t << "\\\\"; break;
case '\n': if (verbatim)
{
- m_t << "\\par" << endl;
+ m_t << "\\par" << endl;
}
else
{
@@ -1836,7 +1852,7 @@ void RTFDocVisitor::writeDotFile(const QCString &filename, bool hasCaption)
if ((i=baseName.findRev('/'))!=-1)
{
baseName=baseName.right(baseName.length()-i-1);
- }
+ }
QCString outDir = Config_getString(RTF_OUTPUT);
writeDotGraphFromFile(filename,outDir,baseName,GOF_BITMAP);
QCString imgExt = getDotImageExtension();
@@ -1854,7 +1870,7 @@ void RTFDocVisitor::writeMscFile(const QCString &fileName, bool hasCaption)
if ((i=baseName.findRev('/'))!=-1)
{
baseName=baseName.right(baseName.length()-i-1);
- }
+ }
QCString outDir = Config_getString(RTF_OUTPUT);
writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
includePicturePreRTF(baseName + ".png", true, hasCaption);
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 79411c6..94b6893 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Parker Waechter & Dimitri van Heesch.
*
@@ -48,8 +48,6 @@
#include "filename.h"
#include "namespacedef.h"
-static bool DoxyCodeLineOpen = FALSE;
-
//#define DBG_RTF(x) x;
#define DBG_RTF(x)
@@ -61,28 +59,45 @@ static QCString dateToRTFDateString()
d.date().year(), d.date().month(), d.date().day(),
d.time().hour(),d.time().minute(),d.time().second());
return result;
-}
+}
-RTFGenerator::RTFGenerator() : OutputGenerator()
+RTFGenerator::RTFGenerator() : OutputGenerator(Config_getString(RTF_OUTPUT))
{
- m_dir=Config_getString(RTF_OUTPUT);
- m_col=0;
- //insideTabbing=FALSE;
- m_listLevel = 0;
- m_bstartedBody = FALSE;
- m_omitParagraph = FALSE;
- m_numCols = 0;
- m_prettyCode=Config_getBool(RTF_SOURCE_CODE);
+}
+
+RTFGenerator::RTFGenerator(const RTFGenerator &og) : OutputGenerator(og)
+{
+}
+
+RTFGenerator &RTFGenerator::operator=(const RTFGenerator &og)
+{
+ OutputGenerator::operator=(og);
+ return *this;
+}
+
+std::unique_ptr<OutputGenerator> RTFGenerator::clone() const
+{
+ return std::make_unique<RTFGenerator>(*this);
}
RTFGenerator::~RTFGenerator()
{
}
+void RTFGenerator::setRelativePath(const QCString &path)
+{
+ m_relPath = path;
+}
+
+void RTFGenerator::setSourceFileName(const QCString &name)
+{
+ m_sourceFileName = name;
+}
+
void RTFGenerator::writeStyleSheetFile(QFile &file)
{
FTextStream t(&file);
- t << "# Generated by doxygen " << getVersion() << "\n\n";
+ t << "# Generated by doxygen " << getDoxygenVersion() << "\n\n";
t << "# This file describes styles used for generating RTF output.\n";
t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
t << "# Remove a hash to activate a line.\n\n";
@@ -99,7 +114,7 @@ void RTFGenerator::writeStyleSheetFile(QFile &file)
void RTFGenerator::writeExtensionsFile(QFile &file)
{
FTextStream t(&file);
- t << "# Generated by doxygen " << getVersion() << "\n\n";
+ t << "# Generated by doxygen " << getDoxygenVersion() << "\n\n";
t << "# This file describes extensions used for generating RTF output.\n";
t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
t << "# Remove a hash to activate a line.\n\n";
@@ -164,21 +179,26 @@ void RTFGenerator::init()
while(def->reference != 0)
{
if (def->definition == 0)
+ {
err("Internal: rtf_Style_Default[%s] has no definition.\n", def->name);
- StyleData* styleData = new StyleData(def->reference, def->definition);
- rtf_Style.insert(def->name, styleData);
+ }
+ else
+ {
+ StyleData* styleData = new StyleData(def->reference, def->definition);
+ rtf_Style.insert(def->name, styleData);
+ }
def++;
}
// overwrite some (or all) definitions from file
- QCString &rtfStyleSheetFile = Config_getString(RTF_STYLESHEET_FILE);
+ QCString rtfStyleSheetFile = Config_getString(RTF_STYLESHEET_FILE);
if (!rtfStyleSheetFile.isEmpty())
{
loadStylesheet(rtfStyleSheetFile, rtf_Style);
}
// If user has defined an extension file, load its contents.
- QCString &rtfExtensionsFile = Config_getString(RTF_EXTENSIONS_FILE);
+ QCString rtfExtensionsFile = Config_getString(RTF_EXTENSIONS_FILE);
if (!rtfExtensionsFile.isEmpty())
{
loadExtensions(rtfExtensionsFile);
@@ -273,21 +293,20 @@ void RTFGenerator::beginRTFDocument()
// sort styles ascending by \s-number via an intermediate QArray
QDictIterator<StyleData> iter(rtf_Style);
- const StyleData* style;
+ const StyleData* style = 0;
unsigned maxIndex = 0;
for(; (style = iter.current()); ++iter)
{
- unsigned index = style->index;
+ uint index = style->index();
if (maxIndex < index) maxIndex = index;
}
- QArray<const StyleData*> array(maxIndex + 1);
- array.fill(0);
+ std::vector<const StyleData*> array(maxIndex + 1, 0);
ASSERT(maxIndex < array.size());
iter.toFirst();
for(; (style = iter.current()); ++iter)
{
- unsigned index = style->index;
+ uint index = style->index();
if (array.at(index) != 0)
{
QCString key(iter.currentKey());
@@ -297,12 +316,14 @@ void RTFGenerator::beginRTFDocument()
}
// write array elements
- unsigned size = array.size();
- for(unsigned i = 0; i < size; i++)
+ size_t size = array.size();
+ for(size_t i = 0; i < size; i++)
{
- const StyleData* style = array.at(i);
+ style = array.at(i);
if (style != 0)
- t <<"{" << style->reference << style->definition << ";}\n";
+ {
+ t <<"{" << style->reference() << style->definition() << ";}\n";
+ }
}
t <<"}" << endl;
@@ -328,7 +349,7 @@ void RTFGenerator::beginRTFChapter()
t <<"\\sect\\sbkpage\n";
//t <<"\\sect\\sectd\\sbkpage\n";
- t << rtf_Style["Heading1"]->reference << "\n";
+ t << rtf_Style["Heading1"]->reference() << "\n";
}
void RTFGenerator::beginRTFSection()
@@ -340,18 +361,18 @@ void RTFGenerator::beginRTFSection()
// if we are compact, no extra page breaks...
if (Config_getBool(COMPACT_RTF))
{
- // t <<"\\sect\\sectd\\sbknone\n";
t <<"\\sect\\sbknone\n";
rtfwriteRuler_emboss();
}
else
+ {
t <<"\\sect\\sbkpage\n";
- //t <<"\\sect\\sectd\\sbkpage\n";
+ }
- t << rtf_Style["Heading2"]->reference << "\n";
+ t << rtf_Style["Heading2"]->reference() << "\n";
}
-void RTFGenerator::startFile(const char *name,const char *,const char *)
+void RTFGenerator::startFile(const char *name,const char *,const char *,int)
{
//setEncoding(QCString().sprintf("CP%s",theTranslator->trRTFansicp()));
QCString fileName=name;
@@ -359,6 +380,8 @@ void RTFGenerator::startFile(const char *name,const char *,const char *)
if (fileName.right(4)!=".rtf" ) fileName+=".rtf";
startPlainFile(fileName);
+ setRelativePath(m_relPath);
+ setSourceFileName(stripPath(fileName));
beginRTFDocument();
}
@@ -368,6 +391,7 @@ void RTFGenerator::endFile()
t << "}";
endPlainFile();
+ setSourceFileName("");
}
void RTFGenerator::startProjectNumber()
@@ -447,15 +471,12 @@ void RTFGenerator::startIndexSection(IndexSections is)
case isModuleDocumentation:
{
//Module Documentation
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- bool found=FALSE;
- for (gli.toFirst();(gd=gli.current()) && !found;++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (!gd->isReference())
{
beginRTFChapter();
- found=TRUE;
+ break;
}
}
}
@@ -463,15 +484,12 @@ void RTFGenerator::startIndexSection(IndexSections is)
case isDirDocumentation:
{
//Directory Documentation
- SDict<DirDef>::Iterator dli(*Doxygen::directories);
- DirDef *dd;
- bool found=FALSE;
- for (dli.toFirst();(dd=dli.current()) && !found;++dli)
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
if (dd->isLinkableInProject())
{
beginRTFChapter();
- found=TRUE;
+ break;
}
}
}
@@ -479,15 +497,12 @@ void RTFGenerator::startIndexSection(IndexSections is)
case isNamespaceDocumentation:
{
// Namespace Documentation
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- bool found=FALSE;
- for (nli.toFirst();(nd=nli.current()) && !found;++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
if (nd->isLinkableInProject())
{
beginRTFChapter();
- found=TRUE;
+ break;
}
}
}
@@ -495,18 +510,16 @@ void RTFGenerator::startIndexSection(IndexSections is)
case isClassDocumentation:
{
//Compound Documentation
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- if (cd->isLinkableInProject() &&
+ if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope()
+ !cd->isEmbeddedInOuterScope() &&
+ !cd->isAlias()
)
{
beginRTFChapter();
- found=TRUE;
+ break;
}
}
}
@@ -515,13 +528,9 @@ void RTFGenerator::startIndexSection(IndexSections is)
{
//File Documentation
bool isFirst=TRUE;
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
if (fd->isLinkableInProject())
{
@@ -533,6 +542,10 @@ void RTFGenerator::startIndexSection(IndexSections is)
}
}
}
+ if (!isFirst)
+ {
+ break;
+ }
}
}
break;
@@ -561,9 +574,9 @@ void RTFGenerator::startIndexSection(IndexSections is)
void RTFGenerator::endIndexSection(IndexSections is)
{
bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
- bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
- static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
- static QCString projectName = Config_getString(PROJECT_NAME);
+ bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
+ QCString projectName = Config_getString(PROJECT_NAME);
switch (is)
{
@@ -576,18 +589,18 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isTitlePageAuthor:
{
- t << " doxygen.}\n";
+ t << " doxygen" << getDoxygenVersion() << ".}\n";
t << "{\\creatim " << dateToRTFDateString() << "}\n}";
DBG_RTF(t << "{\\comment end of infoblock}\n");
// setup for this section
t << rtf_Style_Reset <<"\n";
t <<"\\sectd\\pgnlcrm\n";
- t <<"{\\footer "<<rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
+ t <<"{\\footer "<<rtf_Style["Footer"]->reference() << "{\\chpgn}}\n";
// the title entry
DBG_RTF(t << "{\\comment begin title page}\n")
- t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style
+ t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference() << endl; // set to title style
t << "\\vertalc\\qc\\par\\par\\par\\par\\par\\par\\par\n";
if (rtf_logoFilename)
@@ -600,7 +613,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
t << rtf_company << "\\par\\par\n";
}
- t << rtf_Style_Reset << rtf_Style["Title"]->reference << endl; // set to title style
+ t << rtf_Style_Reset << rtf_Style["Title"]->reference() << endl; // set to title style
if (rtf_title)
// User has overridden document title in extensions file
t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt " << rtf_title << "}}\\par" << endl;
@@ -608,12 +621,12 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
DocText *root = validatingParseText(projectName);
t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt ";
- writeDoc(root,0,0);
+ writeDoc(root,0,0,0);
t << "}}\\par" << endl;
-
+
}
- t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style
+ t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference() << endl; // set to title style
t << "\\par\n";
if (rtf_documentType)
{
@@ -625,7 +638,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
}
t << "\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\n";
- t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to subtitle style
+ t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference() << endl; // set to subtitle style
if (rtf_author)
t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt "<< rtf_author << " }}\\par" << endl;
else
@@ -641,7 +654,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
DBG_RTF(t << "{\\comment Table of contents}\n")
t << "\\vertalt\n";
t << rtf_Style_Reset << endl;
- t << rtf_Style["Heading1"]->reference;
+ t << rtf_Style["Heading1"]->reference();
t << theTranslator->trRTFTableOfContents() << "\\par"<< endl;
t << rtf_Style_Reset << "\\par" << endl;
t << "{\\field\\fldedit {\\*\\fldinst TOC \\\\f \\\\*MERGEFORMAT}{\\fldrslt Table of contents}}\\par\n";
@@ -688,7 +701,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}" << endl;
}
-
+
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isClassHierarchyIndex:
@@ -724,14 +737,18 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isModuleDocumentation:
{
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
+ bool first=true;
t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (!gd->isReference())
{
t << "\\par " << rtf_Style_Reset << endl;
+ if (!first)
+ {
+ beginRTFSection();
+ }
+ first=false;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << gd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -741,14 +758,18 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isDirDocumentation:
{
- SDict<DirDef>::Iterator dli(*Doxygen::directories);
- DirDef *dd;
+ bool first=true;
t << "{\\tc \\v " << theTranslator->trDirDocumentation() << "}"<< endl;
- for (dli.toFirst();(dd=dli.current());++dli)
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
if (dd->isLinkableInProject())
{
t << "\\par " << rtf_Style_Reset << endl;
+ if (!first)
+ {
+ beginRTFSection();
+ }
+ first=false;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << dd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -758,39 +779,27 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isNamespaceDocumentation:
{
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- bool found=FALSE;
- for (nli.toFirst();(nd=nli.current()) && !found;++nli)
- {
- if (nd->isLinkableInProject())
- {
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << nd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- found=TRUE;
- }
- }
- while ((nd=nli.current()))
+ bool first=true;
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- if (nd->isLinkableInProject())
+ if (nd->isLinkableInProject() && !nd->isAlias())
{
t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
+ if (!first)
+ {
+ beginRTFSection();
+ }
+ first=false;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << nd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
}
- ++nli;
}
}
break;
case isClassDocumentation:
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd=0;
- bool found=FALSE;
+ bool first=true;
if (fortranOpt)
{
t << "{\\tc \\v " << theTranslator->trTypeDocumentation() << "}"<< endl;
@@ -799,29 +808,20 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
t << "{\\tc \\v " << theTranslator->trClassDocumentation() << "}"<< endl;
}
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- if (cd->isLinkableInProject() &&
+ if (cd->isLinkableInProject() &&
cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope()
+ !cd->isEmbeddedInOuterScope() &&
+ !cd->isAlias()
)
{
t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << cd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- found=TRUE;
- }
- }
- for (;(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() &&
- cd->templateMaster()==0 &&
- !cd->isEmbeddedInOuterScope()
- )
- {
- t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
+ if (!first)
+ {
+ beginRTFSection();
+ }
+ first=false;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << cd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -834,41 +834,25 @@ void RTFGenerator::endIndexSection(IndexSections is)
bool isFirst=TRUE;
t << "{\\tc \\v " << theTranslator->trFileDocumentation() << "}"<< endl;
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
if (fd->isLinkableInProject())
{
- if (isFirst)
+ t << "\\par " << rtf_Style_Reset << endl;
+ if (!isFirst)
{
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << fd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
- {
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"" << fd->getSourceFileBase() << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
- isFirst=FALSE;
+ beginRTFSection();
}
- else
+ isFirst=FALSE;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << fd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
{
t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << fd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
- {
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"" << fd->getSourceFileBase() << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"" << fd->getSourceFileBase() << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
}
}
}
@@ -878,20 +862,16 @@ void RTFGenerator::endIndexSection(IndexSections is)
case isExampleDocumentation:
{
//t << "}\n";
+ bool isFirst=true;
t << "{\\tc \\v " << theTranslator->trExampleDocumentation() << "}"<< endl;
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=pdi.toFirst();
- if (pd)
- {
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << pd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
- for (++pdi;(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::exampleLinkedMap)
{
t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
+ if (!isFirst)
+ {
+ beginRTFSection();
+ }
+ isFirst=false;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
t << pd->getOutputFileBase();
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
@@ -903,10 +883,8 @@ void RTFGenerator::endIndexSection(IndexSections is)
//#error "fix me in the same way as the latex index..."
//t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}"<< endl;
//t << "}"<< endl;
- //PageSDict::Iterator pdi(*Doxygen::pageSDict);
- //PageDef *pd=pdi.toFirst();
//bool first=TRUE;
- //for (pdi.toFirst();(pd=pdi.current());++pdi)
+ //for (const auto *pd : Doxygen::pageLinkedMap)
//{
// if (!pd->getGroupDef() && !pd->isReference())
// {
@@ -927,7 +905,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isEndIndex:
beginRTFChapter();
- t << rtf_Style["Heading1"]->reference;
+ t << rtf_Style["Heading1"]->reference();
t << theTranslator->trRTFGeneralIndex() << "\\par "<< endl;
t << rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trRTFGeneralIndex() << "}" << endl;
@@ -953,8 +931,7 @@ void RTFGenerator::lastIndexPage()
t <<"\\sect \\sectd \\sbknone\n";
// set new footer with arabic numbers
- t <<"{\\footer "<< rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
- //t << rtf_Style["Heading1"]->reference << "\n";
+ t <<"{\\footer "<< rtf_Style["Footer"]->reference() << "{\\chpgn}}\n";
}
@@ -1212,7 +1189,7 @@ void RTFGenerator::startSubsection()
t <<"\n";
DBG_RTF(t << "{\\comment Begin SubSection}\n")
t << rtf_Style_Reset;
- t << rtf_Style["Heading3"]->reference << "\n";
+ t << rtf_Style["Heading3"]->reference() << "\n";
}
void RTFGenerator::endSubsection()
@@ -1227,7 +1204,7 @@ void RTFGenerator::startSubsubsection()
t << "\n";
DBG_RTF(t << "{\\comment Begin SubSubSection}\n")
t << "{" << endl;
- t << rtf_Style_Reset << rtf_Style["Heading4"]->reference << "\n";
+ t << rtf_Style_Reset << rtf_Style["Heading4"]->reference() << "\n";
}
void RTFGenerator::endSubsubsection()
@@ -1245,22 +1222,22 @@ void RTFGenerator::endSubsubsection()
// t << "}";
//}
-//void RTFGenerator::startTable(bool,int colNumbers)
+//void RTFGenerator::startTable(bool,int colNumbers)
//{
// DBG_RTF(t << "{\\comment startTable}\n";)
// m_numCols=colNumbers;
// t << "\\par\n";
//}
//
-//void RTFGenerator::endTable(bool hasCaption)
-//{
+//void RTFGenerator::endTable(bool hasCaption)
+//{
// DBG_RTF(t << "{\\comment endTable}\n";)
-// if (!hasCaption)
-// t << "\n\\pard \\widctlpar\\intbl\\adjustright\n{\\row }\n";
-// t << "\\pard\n" << endl;
+// if (!hasCaption)
+// t << "\n\\pard \\widctlpar\\intbl\\adjustright\n{\\row }\n";
+// t << "\\pard\n" << endl;
//}
//
-//void RTFGenerator::startCaption()
+//void RTFGenerator::startCaption()
//{
// DBG_RTF(t << "{\\comment startCaption}\n";)
// endTableRow();
@@ -1269,15 +1246,15 @@ void RTFGenerator::endSubsubsection()
// nextTableColumn();
//}
//
-//void RTFGenerator::endCaption()
+//void RTFGenerator::endCaption()
//{
// DBG_RTF(t << "{\\comment endCaption}\n";)
// endTableColumn();
// endTableRow();
//}
//
-//void RTFGenerator::nextTableRow()
-//{
+//void RTFGenerator::nextTableRow()
+//{
// DBG_RTF(t << "{\\comment nextTableRow}\n";)
// ASSERT(m_numCols>0 && m_numCols<25);
// uint columnWidth=rtf_pageWidth/m_numCols;
@@ -1285,7 +1262,7 @@ void RTFGenerator::endSubsubsection()
// "\\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 "
// "\\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\\brdrs\\brdrw10 "
// "\\trbrdrv\\brdrs\\brdrw10 "<<endl;
-// for (int i=0;i<m_numCols;i++)
+// for (int i=0;i<m_numCols;i++)
// {
// t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 \\clbrdrl\\brdrs\\brdrw10 "
// "\\clbrdrb\\brdrs\\brdrw10 \\clbrdrr \\brdrs\\brdrw10 \\cltxlrtb "
@@ -1293,21 +1270,21 @@ void RTFGenerator::endSubsubsection()
// }
// t << "\\pard \\widctlpar\\intbl\\adjustright\n{";
//}
-//
-//void RTFGenerator::endTableRow()
-//{
+//
+//void RTFGenerator::endTableRow()
+//{
// DBG_RTF(t << "{\\comment endTableRow}\n";)
// t << "\n\\pard \\widctlpar\\intbl\\adjustright\n{\\row }\n";
//}
-//
-//void RTFGenerator::nextTableColumn()
+//
+//void RTFGenerator::nextTableColumn()
//{
// DBG_RTF(t << "{\\comment nextTableColumn}\n";)
// t << "{ ";
//}
//
-//void RTFGenerator::endTableColumn()
-//{
+//void RTFGenerator::endTableColumn()
+//{
// DBG_RTF(t << "{\\comment endTableColumn}\n";)
// t << " \\cell }";
//}
@@ -1435,7 +1412,7 @@ void RTFGenerator::startTitleHead(const char *)
DBG_RTF(t <<"{\\comment startTitleHead}" << endl)
// beginRTFSection();
- t << rtf_Style_Reset << rtf_Style["Heading2"]->reference << endl;
+ t << rtf_Style_Reset << rtf_Style["Heading2"]->reference() << endl;
}
void RTFGenerator::endTitleHead(const char *fileName,const char *name)
@@ -1480,15 +1457,15 @@ void RTFGenerator::startGroupHeader(int extraIndent)
t << rtf_Style_Reset;
if (extraIndent==2)
{
- t << rtf_Style["Heading5"]->reference;
+ t << rtf_Style["Heading5"]->reference();
}
else if (extraIndent==1)
{
- t << rtf_Style["Heading4"]->reference;
+ t << rtf_Style["Heading4"]->reference();
}
else // extraIndent==0
{
- t << rtf_Style["Heading3"]->reference;
+ t << rtf_Style["Heading3"]->reference();
}
t << endl;
}
@@ -1514,10 +1491,10 @@ void RTFGenerator::startMemberDoc(const char *clname,
addIndexItem(memname,clname);
addIndexItem(clname,memname);
}
- t << rtf_Style_Reset << rtf_Style[showInline ? "Heading5" : "Heading4"]->reference;
+ t << rtf_Style_Reset << rtf_Style[showInline ? "Heading5" : "Heading4"]->reference();
//styleStack.push(rtf_Style_Heading4);
t << "{" << endl;
- //printf("RTFGenerator::startMemberDoc() '%s'\n",rtf_Style["Heading4"]->reference);
+ //printf("RTFGenerator::startMemberDoc() '%s'\n",rtf_Style["Heading4"]->reference());
startBold();
t << endl;
}
@@ -1527,7 +1504,7 @@ void RTFGenerator::endMemberDoc(bool)
DBG_RTF(t << "{\\comment endMemberDoc}" << endl)
//const char *style = styleStack.pop();
//printf("RTFGenerator::endMemberDoc() '%s'\n",style);
- //ASSERT(style==rtf_Style["Heading4"]->reference);
+ //ASSERT(style==rtf_Style["Heading4"]->reference());
endBold();
t << "}" << endl;
newParagraph();
@@ -1686,7 +1663,7 @@ void RTFGenerator::endDescForItem()
//}
-void RTFGenerator::startSection(const char *,const char *title,SectionInfo::SectionType type)
+void RTFGenerator::startSection(const char *,const char *title,SectionType type)
{
DBG_RTF(t << "{\\comment (startSection)}" << endl)
t << "{";
@@ -1694,24 +1671,24 @@ void RTFGenerator::startSection(const char *,const char *title,SectionInfo::Sect
int num=4;
switch(type)
{
- case SectionInfo::Page: num=2; break;
- case SectionInfo::Section: num=3; break;
- case SectionInfo::Subsection: num=4; break;
- case SectionInfo::Subsubsection: num=4; break;
- case SectionInfo::Paragraph: num=4; break;
+ case SectionType::Page: num=2; break;
+ case SectionType::Section: num=3; break;
+ case SectionType::Subsection: num=4; break;
+ case SectionType::Subsubsection: num=4; break;
+ case SectionType::Paragraph: num=4; break;
default: ASSERT(0); break;
}
QCString heading;
heading.sprintf("Heading%d",num);
// set style
- t << rtf_Style[heading]->reference;
+ t << rtf_Style[heading]->reference();
// make table of contents entry
t << "{\\tc\\tcl" << num << " \\v ";
docify(title);
t << "}" << endl;
}
-void RTFGenerator::endSection(const char *lab,SectionInfo::SectionType)
+void RTFGenerator::endSection(const char *lab,SectionType)
{
DBG_RTF(t << "{\\comment (endSection)}" << endl)
// make bookmark
@@ -1862,7 +1839,7 @@ void RTFGenerator::endClassDiagram(const ClassDiagram &d,
newParagraph();
// create a png file
- d.writeImage(t,m_dir,m_relPath,fileName,FALSE);
+ d.writeImage(t,dir(),m_relPath,fileName,FALSE);
// display the file
t << "{" << endl;
@@ -1918,22 +1895,15 @@ void RTFGenerator::writeRTFReference(const char *label)
t << " \\\\*MERGEFORMAT}{\\fldrslt pagenum}}";
}
-void RTFGenerator::startCodeFragment()
+void RTFGenerator::startCodeFragment(const char *)
{
DBG_RTF(t << "{\\comment (startCodeFragment) }" << endl)
t << "{" << endl;
- //newParagraph();
t << rtf_Style_Reset << rtf_Code_DepthStyle();
- //styleStack.push(rtf_Style_CodeExample);
}
-void RTFGenerator::endCodeFragment()
+void RTFGenerator::endCodeFragment(const char *)
{
- //newParagraph();
- //styleStack.pop();
- //printf("RTFGenerator::endCodeFragment() top=%s\n",styleStack.top());
- //t << rtf_Style_Reset << styleStack.top() << endl;
- //endCodeLine checks is there is still an open code line, if so closes it.
endCodeLine();
DBG_RTF(t << "{\\comment (endCodeFragment) }" << endl)
@@ -2012,7 +1982,7 @@ void RTFGenerator::startDescTable(const char *title)
{
DBG_RTF(t << "{\\comment (startDescTable) }" << endl)
t << "{\\par" << endl;
- t << "{" << rtf_Style["Heading5"]->reference << endl;
+ t << "{" << rtf_Style["Heading5"]->reference() << endl;
docify(title);
t << ":\\par}" << endl;
t << rtf_Style_Reset << rtf_DList_DepthStyle();
@@ -2100,40 +2070,40 @@ void RTFGenerator::decrementIndentLevel()
const char * RTFGenerator::rtf_CList_DepthStyle()
{
QCString n=makeIndexName("ListContinue",m_listLevel);
- return rtf_Style[n]->reference;
+ return rtf_Style[n]->reference();
}
// a style for list formatted as a "latext style" table of contents
const char * RTFGenerator::rtf_LCList_DepthStyle()
{
QCString n=makeIndexName("LatexTOC",m_listLevel);
- return rtf_Style[n]->reference;
+ return rtf_Style[n]->reference();
}
// a style for list formatted as a "bullet" style
const char * RTFGenerator::rtf_BList_DepthStyle()
{
QCString n=makeIndexName("ListBullet",m_listLevel);
- return rtf_Style[n]->reference;
+ return rtf_Style[n]->reference();
}
// a style for list formatted as a "enumeration" style
const char * RTFGenerator::rtf_EList_DepthStyle()
{
QCString n=makeIndexName("ListEnum",m_listLevel);
- return rtf_Style[n]->reference;
+ return rtf_Style[n]->reference();
}
const char * RTFGenerator::rtf_DList_DepthStyle()
{
QCString n=makeIndexName("DescContinue",m_listLevel);
- return rtf_Style[n]->reference;
+ return rtf_Style[n]->reference();
}
const char * RTFGenerator::rtf_Code_DepthStyle()
{
QCString n=makeIndexName("CodeExample",m_listLevel);
- return rtf_Style[n]->reference;
+ return rtf_Style[n]->reference();
}
void RTFGenerator::startTextBlock(bool dense)
@@ -2143,11 +2113,11 @@ void RTFGenerator::startTextBlock(bool dense)
t << rtf_Style_Reset;
if (dense) // no spacing between "paragraphs"
{
- t << rtf_Style["DenseText"]->reference;
+ t << rtf_Style["DenseText"]->reference();
}
else // some spacing
{
- t << rtf_Style["BodyText"]->reference;
+ t << rtf_Style["BodyText"]->reference();
}
}
@@ -2463,7 +2433,7 @@ static bool preProcessFile(QDir &d,QCString &infName, FTextStream &t, bool bIncl
{
// null terminate at the last '}'
//char *str = strrchr(buffer,'}');
- int pos = lineBuf.findRev('}');
+ pos = lineBuf.findRev('}');
if (pos != -1)
lineBuf.at(pos) = '\0';
@@ -2490,7 +2460,7 @@ void RTFGenerator::endDotGraph(DotClassGraph &g)
newParagraph();
QCString fn =
- g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString(RTF_OUTPUT),m_fileName,m_relPath,TRUE,FALSE);
+ g.writeGraph(t,GOF_BITMAP,EOF_Rtf,dir(),fileName(),m_relPath,TRUE,FALSE);
// display the file
t << "{" << endl;
@@ -2513,8 +2483,7 @@ void RTFGenerator::endInclDepGraph(DotInclDepGraph &g)
{
newParagraph();
- QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString(RTF_OUTPUT),
- m_fileName,m_relPath,FALSE);
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,dir(),fileName(),m_relPath,FALSE);
// display the file
t << "{" << endl;
@@ -2544,8 +2513,7 @@ void RTFGenerator::endCallGraph(DotCallGraph &g)
{
newParagraph();
- QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString(RTF_OUTPUT),
- m_fileName,m_relPath,FALSE);
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,dir(),fileName(),m_relPath,FALSE);
// display the file
t << "{" << endl;
@@ -2567,8 +2535,7 @@ void RTFGenerator::endDirDepGraph(DotDirDeps &g)
{
newParagraph();
- QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString(RTF_OUTPUT),
- m_fileName,m_relPath,FALSE);
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,dir(),fileName(),m_relPath,FALSE);
// display the file
t << "{" << endl;
@@ -2681,7 +2648,7 @@ void RTFGenerator::startMemberGroupHeader(bool hasHeader)
DBG_RTF(t << "{\\comment startMemberGroupHeader}" << endl)
t << "{" << endl;
if (hasHeader) incrementIndentLevel();
- t << rtf_Style_Reset << rtf_Style["GroupHeader"]->reference;
+ t << rtf_Style_Reset << rtf_Style["GroupHeader"]->reference();
}
void RTFGenerator::endMemberGroupHeader()
@@ -2791,36 +2758,36 @@ void RTFGenerator::exceptionEntry(const char* prefix,bool closeBracket)
t << " ";
}
-void RTFGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *)
+void RTFGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *,int)
{
RTFDocVisitor *visitor = new RTFDocVisitor(t,*this,ctx?ctx->getDefFileExtension():QCString(""));
n->accept(visitor);
- delete visitor;
+ delete visitor;
m_omitParagraph = TRUE;
}
-void RTFGenerator::rtfwriteRuler_doubleline()
-{
+void RTFGenerator::rtfwriteRuler_doubleline()
+{
DBG_RTF(t << "{\\comment (rtfwriteRuler_doubleline)}" << endl)
- t << "{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}" << endl;
+ t << "{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}" << endl;
}
-void RTFGenerator::rtfwriteRuler_emboss()
-{
+void RTFGenerator::rtfwriteRuler_emboss()
+{
DBG_RTF(t << "{\\comment (rtfwriteRuler_emboss)}" << endl)
- t << "{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}" << endl;
+ t << "{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}" << endl;
}
-void RTFGenerator::rtfwriteRuler_thick()
-{
+void RTFGenerator::rtfwriteRuler_thick()
+{
DBG_RTF(t << "{\\comment (rtfwriteRuler_thick)}" << endl)
- t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}" << endl;
+ t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}" << endl;
}
-void RTFGenerator::rtfwriteRuler_thin()
-{
+void RTFGenerator::rtfwriteRuler_thin()
+{
DBG_RTF(t << "{\\comment (rtfwriteRuler_thin)}" << endl)
- t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl;
+ t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl;
}
#if 0
@@ -2833,9 +2800,9 @@ void RTFGenerator::postProcess(QByteArray &a)
for (i=0;i<a.size();i++)
{
unsigned char c = (unsigned char)a.at(i);
-
+
// treat characters > 0x80 as multibyte characters, except when they
- // are control characters
+ // are control characters
if (c>0x80 || (mbFlag && c!='\\' && c!='{' && c!='}'))
{
char s[10];
@@ -2858,7 +2825,7 @@ void RTFGenerator::startConstraintList(const char *header)
{
DBG_RTF(t << "{\\comment (startConstraintList)}" << endl)
t << "{"; // ends at endConstraintList
- t << "{";
+ t << "{";
startBold();
newParagraph();
docify(header);
@@ -2926,15 +2893,15 @@ void RTFGenerator::endIndexListItem()
t << "\\par" << endl;
}
-void RTFGenerator::startInlineHeader()
+void RTFGenerator::startInlineHeader()
{
DBG_RTF(t << "{\\comment (startInlineHeader)}" << endl)
t << "{" << endl;
- t << rtf_Style_Reset << rtf_Style["Heading5"]->reference;
+ t << rtf_Style_Reset << rtf_Style["Heading5"]->reference();
startBold();
}
-void RTFGenerator::endInlineHeader()
+void RTFGenerator::endInlineHeader()
{
DBG_RTF(t << "{\\comment (endInlineHeader)}" << endl)
endBold();
@@ -2946,7 +2913,7 @@ void RTFGenerator::startMemberDocSimple(bool isEnum)
{
DBG_RTF(t << "{\\comment (startMemberDocSimple)}" << endl)
t << "{\\par" << endl;
- t << "{" << rtf_Style["Heading5"]->reference << endl;
+ t << "{" << rtf_Style["Heading5"]->reference() << endl;
if (isEnum)
{
t << theTranslator->trEnumerationValues();
@@ -3025,23 +2992,44 @@ void RTFGenerator::endInlineMemberDoc()
t << "\\cell }{\\row }" << endl;
}
-void RTFGenerator::writeLineNumber(const char *,const char *,const char *,int l)
+void RTFGenerator::writeLineNumber(const char *ref,const char *fileName,const char *anchor,int l)
{
- DoxyCodeLineOpen = TRUE;
+ bool rtfHyperlinks = Config_getBool(RTF_HYPERLINKS);
+
+ m_doxyCodeLineOpen = true;
QCString lineNumber;
lineNumber.sprintf("%05d",l);
- t << lineNumber << " ";
+ if (m_prettyCode)
+ {
+ if (fileName && !m_sourceFileName.isEmpty() && rtfHyperlinks)
+ {
+ QCString lineAnchor;
+ lineAnchor.sprintf("_l%05d",l);
+ lineAnchor.prepend(stripExtensionGeneral(m_sourceFileName, ".rtf"));
+ t << "{\\bkmkstart ";
+ t << rtfFormatBmkStr(lineAnchor);
+ t << "}";
+ t << "{\\bkmkend ";
+ t << rtfFormatBmkStr(lineAnchor);
+ t << "}" << endl;
+ }
+ t << lineNumber << " ";
+ }
+ else
+ {
+ t << l << " ";
+ }
m_col=0;
}
void RTFGenerator::startCodeLine(bool)
{
- DoxyCodeLineOpen = TRUE;
+ m_doxyCodeLineOpen = true;
m_col=0;
}
void RTFGenerator::endCodeLine()
{
- if (DoxyCodeLineOpen) lineBreak();
- DoxyCodeLineOpen = FALSE;
+ if (m_doxyCodeLineOpen) lineBreak();
+ m_doxyCodeLineOpen = false;
}
void RTFGenerator::startLabels()
diff --git a/src/rtfgen.h b/src/rtfgen.h
index c6cb76b..0aebd15 100644
--- a/src/rtfgen.h
+++ b/src/rtfgen.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Parker Waechter & Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,6 +18,7 @@
#ifndef RTFGEN_H
#define RTFGEN_H
+#include "config.h"
#include "outputgen.h"
class QFile;
@@ -27,29 +28,28 @@ class RTFGenerator : public OutputGenerator
{
public:
RTFGenerator();
- ~RTFGenerator();
+ RTFGenerator(const RTFGenerator &);
+ RTFGenerator &operator=(const RTFGenerator &);
+ virtual ~RTFGenerator();
+ virtual std::unique_ptr<OutputGenerator> clone() const;
+
static void init();
static void writeStyleSheetFile(QFile &f);
static void writeExtensionsFile(QFile &file);
+ OutputType type() const { return RTF; }
- void enable()
- { if (m_genStack->top()) m_active=*m_genStack->top(); else m_active=TRUE; }
- void disable() { m_active=FALSE; }
- void enableIf(OutputType o) { if (o==RTF) enable(); }
- void disableIf(OutputType o) { if (o==RTF) disable(); }
- void disableIfNot(OutputType o) { if (o!=RTF) disable(); }
- bool isEnabled(OutputType o) { return (o==RTF && m_active); }
- OutputGenerator *get(OutputType o) { return (o==RTF) ? this : 0; }
+ void setRelativePath(const QCString &path);
+ void setSourceFileName(const QCString &sourceFileName);
- void writeDoc(DocNode *,const Definition *,const MemberDef *);
+ void writeDoc(DocNode *,const Definition *,const MemberDef *,int);
- void startFile(const char *name,const char *manName,const char *title);
+ void startFile(const char *name,const char *manName,const char *title,int id);
void writeSearchInfo() {}
void writeFooter(const char *) {}
void endFile();
void clearBuffer();
//void postProcess(QByteArray &);
-
+
void startIndexSection(IndexSections);
void endIndexSection(IndexSections);
void writePageLink(const char *,bool);
@@ -59,7 +59,7 @@ class RTFGenerator : public OutputGenerator
void startTitleHead(const char *);
void startTitle();
void endTitleHead(const char *,const char *name);
- void endTitle() {}
+ void endTitle() {}
void newParagraph();
void startParagraph(const char *classDef);
@@ -100,13 +100,13 @@ class RTFGenerator : public OutputGenerator
void endItemListItem();
void startMemberSections() {}
- void endMemberSections() {}
+ void endMemberSections() {}
void startHeaderSection() {}
void endHeaderSection() {}
void startMemberHeader(const char *,int) { startGroupHeader(FALSE); }
void endMemberHeader() { endGroupHeader(FALSE); }
- void startMemberSubtitle();
- void endMemberSubtitle();
+ void startMemberSubtitle();
+ void endMemberSubtitle();
void startMemberDocList() {}
void endMemberDocList() {}
void startMemberList();
@@ -123,10 +123,10 @@ class RTFGenerator : public OutputGenerator
void insertMemberAlignLeft(int,bool){}
void writeRuler() { rtfwriteRuler_thin(); }
-
+
void writeAnchor(const char *fileName,const char *name);
- void startCodeFragment();
- void endCodeFragment();
+ void startCodeFragment(const char *style);
+ void endCodeFragment(const char *style);
void writeLineNumber(const char *,const char *,const char *,int l);
void startCodeLine(bool);
void endCodeLine();
@@ -145,7 +145,7 @@ class RTFGenerator : public OutputGenerator
void endDoxyAnchor(const char *,const char *);
void writeChar(char c);
void writeLatexSpacing() {};//{ t << "\\hspace{0.3cm}"; }
- void writeStartAnnoItem(const char *type,const char *file,
+ void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name);
void writeEndAnnoItem(const char *name);
void startSubsection();
@@ -159,7 +159,7 @@ class RTFGenerator : public OutputGenerator
void startMemberDescription(const char *,const char *,bool);
void endMemberDescription();
- void startMemberDeclaration() {}
+ void startMemberDeclaration() {}
void endMemberDeclaration(const char *,const char *) {}
void writeInheritedSectionTitle(const char *,const char *,const char *,
const char *,const char *,const char *) {}
@@ -171,8 +171,8 @@ class RTFGenerator : public OutputGenerator
//void writeDescItem();
void startDescForItem();
void endDescForItem();
- void startSection(const char *,const char *,SectionInfo::SectionType);
- void endSection(const char *,SectionInfo::SectionType);
+ void startSection(const char *,const char *,SectionType);
+ void endSection(const char *,SectionType);
void addIndexItem(const char *,const char *);
void startIndent();
void endIndent();
@@ -191,7 +191,7 @@ class RTFGenerator : public OutputGenerator
void startContents() {}
void endContents() {}
void writeNonBreakableSpace(int);
-
+
void startDescTable(const char *title);
void endDescTable();
void startDescTableRow();
@@ -200,7 +200,7 @@ class RTFGenerator : public OutputGenerator
void endDescTableTitle();
void startDescTableData();
void endDescTableData();
-
+
void startDotGraph();
void endDotGraph(DotClassGraph &);
void startInclDepGraph();
@@ -219,7 +219,7 @@ class RTFGenerator : public OutputGenerator
void endMemberGroupDocs();
void startMemberGroup();
void endMemberGroup(bool);
-
+
void startTextBlock(bool dense);
void endTextBlock(bool);
void lastIndexPage();
@@ -266,11 +266,8 @@ class RTFGenerator : public OutputGenerator
void addWord(const char *,bool) {}
static bool preProcessFileInplace(const char *path,const char *name);
-
- private:
- RTFGenerator(const RTFGenerator &);
- RTFGenerator &operator=(const RTFGenerator &);
+ private:
const char *rtf_BList_DepthStyle();
const char *rtf_CList_DepthStyle();
const char *rtf_EList_DepthStyle();
@@ -279,15 +276,6 @@ class RTFGenerator : public OutputGenerator
const char *rtf_Code_DepthStyle();
void incrementIndentLevel();
void decrementIndentLevel();
- int m_col;
- bool m_prettyCode;
-
- bool m_bstartedBody; // has startbody been called yet?
- int m_listLevel; // // RTF does not really have a additive indent...manually set list level.
- bool m_omitParagraph; // should a the next paragraph command be ignored?
- int m_numCols; // number of columns in a table
- QCString m_relPath;
-
void beginRTFDocument();
void beginRTFChapter();
void beginRTFSection();
@@ -296,7 +284,16 @@ class RTFGenerator : public OutputGenerator
void rtfwriteRuler_thick();
void rtfwriteRuler_thin();
void writeRTFReference(const char *label);
- //char *getMultiByte(int c);
+
+ QCString m_sourceFileName;
+ int m_col = 0;
+ bool m_prettyCode = Config_getBool(RTF_SOURCE_CODE);
+ bool m_bstartedBody = false; // has startbody been called yet?
+ int m_listLevel = 0; // // RTF does not really have a additive indent...manually set list level.
+ bool m_omitParagraph = false; // should a the next paragraph command be ignored?
+ int m_numCols = 0; // number of columns in a table
+ QCString m_relPath;
+ bool m_doxyCodeLineOpen = false;
};
#endif
diff --git a/src/rtfstyle.cpp b/src/rtfstyle.cpp
index 47a8166..98581bb 100644
--- a/src/rtfstyle.cpp
+++ b/src/rtfstyle.cpp
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -224,27 +224,22 @@ Rtf_Style_Default rtf_Style_Default[] =
}
};
-const QRegExp StyleData::s_clause("\\\\s[0-9]+\\s*");
+static const QRegExp s_clause("\\\\s[0-9]+\\s*");
StyleData::StyleData(const char* reference, const char* definition)
{
- int start = s_clause.match(reference); ASSERT(start >= 0);
- reference += start;
- index = (int)atol(reference + 2); ASSERT(index > 0);
+ const char *ref = reference;
- ASSERT(reference != 0);
- size_t size = 1 + strlen(reference);
- memcpy(this->reference = new char[size], reference, size);
+ int start = s_clause.match(ref); ASSERT(start >= 0);
+ ref += start;
+ m_index = (int)atol(ref + 2); ASSERT(m_index > 0);
- ASSERT(definition != 0);
- size = 1 + strlen(definition);
- memcpy(this->definition = new char[size], definition, size);
+ m_reference = ref;
+ m_definition = definition;
}
StyleData::~StyleData()
{
- delete[] reference;
- delete[] definition;
}
bool StyleData::setStyle(const char* s, const char* styleName)
@@ -261,7 +256,7 @@ bool StyleData::setStyle(const char* s, const char* styleName)
return FALSE;
}
s += start;
- index = (int)atol(s + 2); ASSERT(index > 0);
+ m_index = (int)atol(s + 2); ASSERT(m_index > 0);
// search for the end of pure formatting codes
const char* end = s + len;
@@ -299,16 +294,10 @@ bool StyleData::setStyle(const char* s, const char* styleName)
else // plain name without leading \\snext
break;
}
- delete[] reference;
- reference = new char[ref_len + 1];
- memcpy(reference, s, ref_len);
- reference[ref_len] = 0;
+ m_reference = s;
if (haveNewDefinition)
{
- delete[] definition;
- size_t size = 1 + strlen(end);
- definition = new char[size];
- memcpy(definition, end, size);
+ m_definition = end;
}
return TRUE;
}
diff --git a/src/rtfstyle.h b/src/rtfstyle.h
index 1058351..d45972c 100644
--- a/src/rtfstyle.h
+++ b/src/rtfstyle.h
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -63,15 +60,18 @@ struct StyleData
// to define a tag in the header reference + definition is required
// to use a tag in the body of the document only reference is required
- unsigned index; // index in style-sheet, i.e. number in s-clause
- char* reference; // everything required to apply the style
- char* definition; // additional tags like \snext and style name
-
- StyleData(const char* reference, const char* definition);
- ~StyleData();
- bool setStyle(const char* s, const char* styleName);
-
- static const QRegExp s_clause;
+ public:
+ StyleData(const char* reference, const char* definition);
+ ~StyleData();
+ bool setStyle(const char* s, const char* styleName);
+ const char *reference() const { return m_reference.c_str(); }
+ const char *definition() const { return m_definition.c_str(); }
+ uint index() const { return m_index; }
+
+ private:
+ uint m_index; // index in style-sheet, i.e. number in s-clause
+ std::string m_reference; // everything required to apply the style
+ std::string m_definition; // additional tags like \snext and style name
};
extern QDict<StyleData> rtf_Style;
diff --git a/src/scanner.h b/src/scanner.h
index 70df660..cefc934 100644
--- a/src/scanner.h
+++ b/src/scanner.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -23,7 +23,7 @@
/** \brief C-like language parser using state-based lexical scanning.
*
* This is the language parser for doxygen. It is somewhat fuzzy and
- * supports C++ and various languages that are closely related to C++,
+ * supports C++ and various languages that are closely related to C++,
* such as C, C#, Objective-C, Java, PHP, and IDL.
*/
class COutlineParser : public OutlineParserInterface
@@ -31,13 +31,10 @@ class COutlineParser : public OutlineParserInterface
public:
COutlineParser();
virtual ~COutlineParser();
- void startTranslationUnit(const char *fileName);
- void finishTranslationUnit();
void parseInput(const char *fileName,
const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool sameTranslationUnit,
- QStrList &filesInSameTranslationUnit);
+ ClangTUParser *clangParser);
bool needsPreprocessing(const QCString &extension) const;
void parsePrototype(const char *text);
private:
diff --git a/src/scanner.l b/src/scanner.l
index 187a9ff..66437bc 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -1,12 +1,12 @@
/*****************************************************************************
*
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,11 +18,14 @@
%option prefix="scannerYY"
%option reentrant
%option extra-type="struct scannerYY_state *"
+%top{
+#include <stdint.h>
+}
%{
/*
- * includes
+ * includes
*/
#include <algorithm>
@@ -35,7 +38,6 @@
#include <ctype.h>
#include <qarray.h>
-#include <qstack.h>
#include <qregexp.h>
#include <qfile.h>
@@ -48,7 +50,6 @@
#include "defargs.h"
#include "language.h"
#include "commentscan.h"
-#include "code.h"
#include "arguments.h"
#include "clangparser.h"
@@ -57,6 +58,11 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
+#define USE_STATE2STRING 0
+
+static AtomicInt anonCount;
+static AtomicInt anonNSCount;
+
struct scannerYY_state
{
OutlineParserInterface *thisParser;
@@ -102,8 +108,6 @@ struct scannerYY_state
int yyBegLineNr = 1 ;
int yyColNr = 1 ;
int yyBegColNr = 1 ;
- int anonCount = 0 ;
- int anonNSCount = 0 ;
QCString yyFileName;
MethodTypes mtype = Method;
bool stat = false;
@@ -157,7 +161,6 @@ struct scannerYY_state
QGString *pCopyHereDocGString = 0;
QGString *pCopyRawGString = 0;
QGString *pSkipVerbString = 0;
- QStack<Grouping> autoGroupStack;
bool insideFormula = false;
bool insideTryBlock = false;
@@ -188,12 +191,16 @@ struct scannerYY_state
int column = 0;
- int fencedSize = 0;
+ uint fencedSize = 0;
bool nestedComment = false;
std::vector< std::pair<Entry*,std::shared_ptr<Entry> > > outerScopeEntries;
+
+ ClangTUParser * clangParser = 0;
};
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
//-----------------------------------------------------------------------------
// forward declarations for stateless functions
@@ -216,19 +223,19 @@ static bool checkForKnRstyleC(yyscan_t yyscanner);
static void splitKnRArg(yyscan_t yyscanner,QCString &oldStyleArgPtr,QCString &oldStyleArgName);
static void addKnRArgInfo(yyscan_t yyscanner,const QCString &type,const QCString &name,
const QCString &brief,const QCString &docs);
-static int yyread(yyscan_t yyscanner,char *buf,int max_size);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
/* ----------------------------------------------------------------- */
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
%}
/* start command character */
-CMD ("\\"|"@")
+CMD ("\\"|"@")
BN [ \t\n\r]
-BL [ \t\r]*"\n"
+BL [ \t\r]*"\n"
B [ \t]
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)(((~|!){BN}*)?{ID})
@@ -237,7 +244,7 @@ CSSCOPENAME (({ID}?{BN}*"."{BN}*)*)((~{BN}*)?{ID})
PRE [pP][rR][eE]
CODE [cC][oO][dD][eE]
CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
-PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
+PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
PHPUSEKW ("public"|"private"|"protected")
IDLATTR ("["[^\]]*"]"){BN}*
TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
@@ -245,7 +252,7 @@ RAWBEGIN (u|U|L|u8)?R\"[^ \t\(\)\\]{0,16}"("
RAWEND ")"[^ \t\(\)\\]{0,16}\"
ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++"
ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
-LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
+LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"|"<=>"
BITOP "&"|"|"|"^"|"<<"|">>"|"~"
OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
@@ -255,138 +262,139 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
%x AlignAs
%x AlignAsEnd
-%x Define
-%x DefineEnd
-%x CompoundName
-%x ClassVar
-%x CSConstraintName
-%x CSConstraintType
-%x CSIndexer
-%x ClassCategory
-%x ClassTemplSpec
+%x Define
+%x DefineEnd
+%x CompoundName
+%x ClassVar
+%x CSConstraintName
+%x CSConstraintType
+%x CSIndexer
+%x ClassCategory
+%x ClassTemplSpec
%x CliPropertyType
%x CliPropertyIndex
%x CliOverride
-%x Bases
-%x BasesProt
-%x NextSemi
-%x BitFields
-%x EnumBaseType
-%x FindMembers
-%x FindMembersPHP
-%x FindMemberName
+%x Bases
+%x BasesProt
+%x NextSemi
+%x BitFields
+%x EnumBaseType
+%x FindMembers
+%x FindMembersPHP
+%x FindMemberName
%x FindFields
%x FindFieldArg
-%x Function
-%x FuncRound
-%x ExcpRound
-%x ExcpList
-%x FuncQual
+%x Function
+%x FuncRound
+%x ExcpRound
+%x ExcpList
+%x FuncQual
%x TrailingReturn
-%x Operator
-%x Array
-%x ReadBody
-%x ReadNSBody
-%x ReadBodyIntf
-%x Using
-%x UsingAlias
-%x UsingAliasEnd
-%x UsingDirective
-%x SkipCurly
-%x SkipCurlyCpp
-%x SkipCurlyEndDoc
+%x Operator
+%x Array
+%x ReadBody
+%x ReadNSBody
+%x ReadBodyIntf
+%x Using
+%x UsingAlias
+%x UsingAliasEnd
+%x UsingDirective
+%x SkipCurly
+%x SkipCurlyCpp
+%x SkipCurlyEndDoc
%x SkipString
%x SkipPHPString
-%x SkipInits
-%x SkipC11Inits
+%x SkipInits
+%x SkipC11Inits
%x SkipC11Attribute
-%x SkipCPP
-%x SkipCPPBlock
-%x SkipComment
-%x SkipCxxComment
+%x SkipCPP
+%x SkipCPPBlock
+%x SkipComment
+%x SkipCxxComment
%x SkipCurlyBlock
%x SkipRoundBlock
-%x Sharp
-%x SkipRound
-%x SkipSquare
-%x SkipRemainder
+%x Sharp
+%x SkipRound
+%x SkipSquare
+%x SkipRemainder
%x StaticAssert
%x DeclType
-%x TypedefName
-%x TryFunctionBlock
-%x TryFunctionBlockEnd
-%x Comment
-%x PackageName
-%x JavaImport
-%x PHPUse
-%x PHPUseAs
-%x CSAccessorDecl
-%x CSGeneric
-%x PreLineCtrl
-%x DefinePHP
-%x DefinePHPEnd
-%x OldStyleArgs
-%x SkipVerbString
+%x TypedefName
+%x TryFunctionBlock
+%x TryFunctionBlockEnd
+%x Comment
+%x PackageName
+%x JavaImport
+%x PHPUse
+%x PHPUseAs
+%x CSAccessorDecl
+%x CSGeneric
+%x PreLineCtrl
+%x DefinePHP
+%x DefinePHPEnd
+%x OldStyleArgs
+%x SkipVerbString
%x ObjCMethod
%x ObjCReturnType
%x ObjCParams
%x ObjCParamType
%x ObjCProtocolList
-%x ObjCPropAttr
-%x ObjCSkipStatement
-%x QtPropType
-%x QtPropName
-%x QtPropAttr
-%x QtPropRead
-%x QtPropWrite
-%x ReadInitializer
-%x UNOIDLAttributeBlock
-%x GetCallType
-%x CppQuote
-%x EndCppQuote
+%x ObjCPropAttr
+%x ObjCSkipStatement
+%x QtPropType
+%x QtPropName
+%x QtPropAttr
+%x QtPropRead
+%x QtPropWrite
+%x ReadInitializer
+%x ReadInitializerPtr
+%x UNOIDLAttributeBlock
+%x GetCallType
+%x CppQuote
+%x EndCppQuote
%x MemberSpec
%x MemberSpecSkip
-%x EndTemplate
-%x FuncPtr
-%x FuncPtrOperator
-%x EndFuncPtr
-%x ReadFuncArgType
-%x ReadTempArgs
-%x IDLUnionCase
-%x NSAliasName
-%x NSAliasArg
-%x CopyString
-%x CopyPHPString
-%x CopyGString
-%x CopyPHPGString
-%x CopyRound
-%x CopyCurly
-%x GCopyRound
-%x GCopySquare
-%x GCopyCurly
-%x SkipUnionSwitch
-%x Specialization
-%x SpecializationSingleQuote
-%x SpecializationDoubleQuote
-%x FuncPtrInit
-%x FuncFunc
-%x FuncFuncEnd
-%x FuncFuncType
-%x FuncFuncArray
+%x EndTemplate
+%x FuncPtr
+%x FuncPtrOperator
+%x EndFuncPtr
+%x ReadFuncArgType
+%x ReadTempArgs
+%x IDLUnionCase
+%x NSAliasName
+%x NSAliasArg
+%x CopyString
+%x CopyPHPString
+%x CopyGString
+%x CopyPHPGString
+%x CopyRound
+%x CopyCurly
+%x GCopyRound
+%x GCopySquare
+%x GCopyCurly
+%x SkipUnionSwitch
+%x Specialization
+%x SpecializationSingleQuote
+%x SpecializationDoubleQuote
+%x FuncPtrInit
+%x FuncFunc
+%x FuncFuncEnd
+%x FuncFuncType
+%x FuncFuncArray
%x CopyArgString
%x CopyArgPHPString
-%x CopyArgRound
-%x CopyArgSharp
-%x CopyArgComment
-%x CopyArgCommentLine
-%x CopyArgVerbatim
-%x HereDoc
-%x HereDocEnd
-%x CopyHereDoc
-%x CopyHereDocEnd
-%x RawString
-%x RawGString
-%x CSString
+%x CopyArgRound
+%x CopyArgSharp
+%x CopyArgComment
+%x CopyArgCommentLine
+%x CopyArgVerbatim
+%x HereDoc
+%x HereDocEnd
+%x CopyHereDoc
+%x CopyHereDocEnd
+%x RawString
+%x RawGString
+%x CSString
%x IDLAttribute
%x IDLProp
@@ -411,417 +419,421 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
/** comment parsing states */
-%x DocLine
-%x DocBlock
+%x DocLine
+%x DocBlock
%x DocCopyBlock
%%
-<NextSemi>"{" {
- yyextra->curlyCount=0;
- yyextra->needsSemi = TRUE;
- BEGIN(SkipCurlyBlock);
- }
-<NextSemi>"(" {
- yyextra->roundCount=0;
- BEGIN(SkipRoundBlock);
- }
-<SkipRoundBlock>"(" {
- ++yyextra->roundCount;
- }
-<SkipRoundBlock>")" {
- if (yyextra->roundCount )
- --yyextra->roundCount ;
- else
- BEGIN( NextSemi ) ;
- }
-<SkipCurlyBlock>"{" {
- ++yyextra->curlyCount ;
- }
-<SkipCurlyBlock>"}" {
- if( yyextra->curlyCount )
- {
- --yyextra->curlyCount ;
- }
- else if (yyextra->needsSemi)
- {
- BEGIN( NextSemi );
- }
- else
- {
- BEGIN( FindMembers );
- }
- }
-<NextSemi>\' {
- if (yyextra->insidePHP)
- {
- yyextra->lastStringContext=NextSemi;
- BEGIN(SkipPHPString);
- }
- }
-<NextSemi>{CHARLIT} { if (yyextra->insidePHP) REJECT; }
-<NextSemi>\" {
- yyextra->lastStringContext=NextSemi;
- BEGIN(SkipString);
- }
-<NextSemi>[;,] {
- unput(*yytext);
- BEGIN( FindMembers );
- }
-<BitFields>[;,] {
- unput(*yytext);
- BEGIN( FindMembers );
- }
+<NextSemi>"{" {
+ yyextra->curlyCount=0;
+ yyextra->needsSemi = TRUE;
+ BEGIN(SkipCurlyBlock);
+ }
+<NextSemi>"(" {
+ yyextra->roundCount=0;
+ BEGIN(SkipRoundBlock);
+ }
+<SkipRoundBlock>"(" {
+ ++yyextra->roundCount;
+ }
+<SkipRoundBlock>")" {
+ if (yyextra->roundCount )
+ --yyextra->roundCount ;
+ else
+ BEGIN( NextSemi ) ;
+ }
+<SkipCurlyBlock>"{" {
+ ++yyextra->curlyCount ;
+ }
+<SkipCurlyBlock>"}" {
+ if( yyextra->curlyCount )
+ {
+ --yyextra->curlyCount ;
+ }
+ else if (yyextra->needsSemi)
+ {
+ BEGIN( NextSemi );
+ }
+ else
+ {
+ BEGIN( FindMembers );
+ }
+ }
+<NextSemi>\' {
+ if (yyextra->insidePHP)
+ {
+ yyextra->lastStringContext=NextSemi;
+ BEGIN(SkipPHPString);
+ }
+ }
+<NextSemi>{CHARLIT} { if (yyextra->insidePHP) REJECT; }
+<NextSemi>\" {
+ yyextra->lastStringContext=NextSemi;
+ BEGIN(SkipString);
+ }
+<NextSemi>[;,] {
+ unput(*yytext);
+ BEGIN( FindMembers );
+ }
+<BitFields>[;,] {
+ unput(*yytext);
+ BEGIN( FindMembers );
+ }
<EnumBaseType>[{;,] {
yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
- unput(*yytext);
- BEGIN( ClassVar );
+ unput(*yytext);
+ BEGIN( ClassVar );
}
-<FindMembers>"<?php" { // PHP code with unsupported extension?
+<FindMembers>"<?php" { // PHP code with unsupported extension?
yyextra->insidePHP = TRUE;
- }
+ }
<FindMembersPHP>"<?"("php"?) { // PHP code start
BEGIN( FindMembers );
- }
+ }
<FindMembersPHP>"<script"{BN}+"language"{BN}*"="{BN}*['"]?"php"['"]?{BN}*">" { // PHP code start
- lineCount(yyscanner) ;
+ lineCount(yyscanner) ;
BEGIN( FindMembers );
- }
+ }
<FindMembers>"?>"|"</script>" { // PHP code end
- if (yyextra->insidePHP)
- BEGIN( FindMembersPHP );
- else
- REJECT;
+ if (yyextra->insidePHP)
+ BEGIN( FindMembersPHP );
+ else
+ REJECT;
}
<FindMembersPHP>[^\n<]+ { // Non-PHP code text, ignore
- }
+ }
<FindMembersPHP>\n { // Non-PHP code text, ignore
lineCount(yyscanner);
- }
+ }
<FindMembersPHP>. { // Non-PHP code text, ignore
- }
-<FindMembers>{PHPKW} { if (yyextra->insidePHP)
- BEGIN( NextSemi );
- else
- REJECT;
- }
-<FindMembers>"%{"[^\n]* { // Mozilla XPIDL lang-specific block
- if (!yyextra->insideIDL)
- REJECT;
- }
-<FindMembers>"%}" { // Mozilla XPIDL lang-specific block end
- if (!yyextra->insideIDL)
- REJECT;
- }
-<FindMembers>{B}*("properties"){BN}*":"{BN}* { // IDL or Borland C++ builder property
- yyextra->current->mtype = yyextra->mtype = Property;
- yyextra->current->protection = yyextra->protection = Public ;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
+ }
+<FindMembers>{PHPKW} { if (yyextra->insidePHP)
+ BEGIN( NextSemi );
+ else
+ REJECT;
+ }
+<FindMembers>"%{"[^\n]* { // Mozilla XPIDL lang-specific block
+ if (!yyextra->insideIDL)
+ REJECT;
+ }
+<FindMembers>"%}" { // Mozilla XPIDL lang-specific block end
+ if (!yyextra->insideIDL)
+ REJECT;
+ }
+<FindMembers>{B}*("properties"){BN}*":"{BN}* { // IDL or Borland C++ builder property
+ yyextra->current->mtype = yyextra->mtype = Property;
+ yyextra->current->protection = yyextra->protection = Public ;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
<FindMembers>{B}*"k_dcop"{BN}*":"{BN}* { yyextra->current->mtype = yyextra->mtype = DCOP;
- yyextra->current->protection = yyextra->protection = Public ;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
+ yyextra->current->protection = yyextra->protection = Public ;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
<FindMembers>{B}*("signals"|"Q_SIGNALS"){BN}*":"{BN}* { yyextra->current->mtype = yyextra->mtype = Signal;
-
- yyextra->current->protection = yyextra->protection = Public ;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
+
+ yyextra->current->protection = yyextra->protection = Public ;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
<FindMembers>{B}*"public"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* {
- yyextra->current->protection = yyextra->protection = Public ;
- yyextra->current->mtype = yyextra->mtype = Slot;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner);
- }
+ yyextra->current->protection = yyextra->protection = Public ;
+ yyextra->current->mtype = yyextra->mtype = Slot;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner);
+ }
<FindMembers>{B}*"protected"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* {
- yyextra->current->protection = yyextra->protection = Protected ;
- yyextra->current->mtype = yyextra->mtype = Slot;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner);
- }
+ yyextra->current->protection = yyextra->protection = Protected ;
+ yyextra->current->mtype = yyextra->mtype = Slot;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner);
+ }
<FindMembers>{B}*"private"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* {
- yyextra->current->protection = yyextra->protection = Private ;
- yyextra->current->mtype = yyextra->mtype = Slot;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner);
- }
-<FindMembers>{B}*("public"|"methods"|"__published"){BN}*":"{BN}* {
- yyextra->current->protection = yyextra->protection = Public ;
- yyextra->current->mtype = yyextra->mtype = Method;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
+ yyextra->current->protection = yyextra->protection = Private ;
+ yyextra->current->mtype = yyextra->mtype = Slot;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*("public"|"methods"|"__published"){BN}*":"{BN}* {
+ yyextra->current->protection = yyextra->protection = Public ;
+ yyextra->current->mtype = yyextra->mtype = Method;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
<FindMembers>{B}*"internal"{BN}*":"{BN}* { // for now treat C++/CLI's internal as package...
- if (yyextra->insideCli)
- {
- yyextra->current->protection = yyextra->protection = Package ;
- yyextra->current->mtype = yyextra->mtype = Method;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
- else
- {
- REJECT;
- }
- }
-<FindMembers>{B}*"protected"{BN}*":"{BN}* {
- yyextra->current->protection = yyextra->protection = Protected ;
- yyextra->current->mtype = yyextra->mtype = Method;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
-<FindMembers>{B}*"private"{BN}*":"{BN}* {
- yyextra->current->protection = yyextra->protection = Private ;
- yyextra->current->mtype = yyextra->mtype = Method;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
-<FindMembers>{B}*"event"{BN}+ {
- if (yyextra->insideCli)
- {
- // C++/CLI event
- lineCount(yyscanner) ;
- yyextra->current->mtype = yyextra->mtype = Event;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->curlyCount=0;
- BEGIN( CliPropertyType );
- }
- else if (yyextra->insideCS)
- {
- lineCount(yyscanner) ;
- yyextra->current->mtype = Event;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- }
- else
- {
- REJECT;
- }
- }
-<FindMembers>{B}*"property"{BN}+ {
- if (yyextra->insideCli)
- {
- // C++/CLI property
- lineCount(yyscanner) ;
- yyextra->current->mtype = yyextra->mtype = Property;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->curlyCount=0;
- BEGIN( CliPropertyType );
- }
- else
- {
- REJECT;
- }
- }
-<CliPropertyType>{ID} {
- addType(yyscanner);
- yyextra->current->name = yytext;
- }
-<CliPropertyType>"[" { // C++/CLI indexed property
- yyextra->current->args = "[";
- BEGIN( CliPropertyIndex );
- }
-<CliPropertyType>"{" {
- yyextra->curlyCount=0;
- //printf("event: '%s' '%s'\n",yyextra->current->type.data(),yyextra->current->name.data());
- BEGIN( CSAccessorDecl );
- }
-<CliPropertyType>";" {
- unput(*yytext);
- BEGIN( FindMembers );
- }
-<CliPropertyType>\n {
+ if (yyextra->insideCli)
+ {
+ yyextra->current->protection = yyextra->protection = Package ;
+ yyextra->current->mtype = yyextra->mtype = Method;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<FindMembers>{B}*"protected"{BN}*":"{BN}* {
+ yyextra->current->protection = yyextra->protection = Protected ;
+ yyextra->current->mtype = yyextra->mtype = Method;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
+<FindMembers>{B}*"private"{BN}*":"{BN}* {
+ yyextra->current->protection = yyextra->protection = Private ;
+ yyextra->current->mtype = yyextra->mtype = Method;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
+<FindMembers>{B}*"event"{BN}+ {
+ if (yyextra->insideCli)
+ {
+ // C++/CLI event
+ lineCount(yyscanner) ;
+ yyextra->current->mtype = yyextra->mtype = Event;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->curlyCount=0;
+ BEGIN( CliPropertyType );
+ }
+ else if (yyextra->insideCS)
+ {
+ lineCount(yyscanner) ;
+ yyextra->current->mtype = Event;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<FindMembers>{B}*"property"{BN}+ {
+ if (yyextra->insideCli)
+ {
+ // C++/CLI property
+ lineCount(yyscanner) ;
+ yyextra->current->mtype = yyextra->mtype = Property;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->curlyCount=0;
+ BEGIN( CliPropertyType );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<CliPropertyType>{ID} {
+ addType(yyscanner);
+ yyextra->current->name = yytext;
+ }
+<CliPropertyType>"[" { // C++/CLI indexed property
+ yyextra->current->args = "[";
+ BEGIN( CliPropertyIndex );
+ }
+<CliPropertyType>"{" {
+ yyextra->curlyCount=0;
+ //printf("event: '%s' '%s'\n",yyextra->current->type.data(),yyextra->current->name.data());
+ BEGIN( CSAccessorDecl );
+ }
+<CliPropertyType>";" {
+ unput(*yytext);
+ BEGIN( FindMembers );
+ }
+<CliPropertyType>\n {
lineCount(yyscanner);
- }
-<CliPropertyType>{B}* {
- }
-<CliPropertyType>. {
- addType(yyscanner);
- yyextra->current->type += yytext;
- }
-<CliPropertyIndex>"]" {
+ }
+<CliPropertyType>{B}* {
+ }
+<CliPropertyType>. {
+ addType(yyscanner);
+ yyextra->current->type += yytext;
+ }
+<CliPropertyIndex>"]" {
BEGIN( CliPropertyType );
- yyextra->current->args+=yytext;
- }
-<CliPropertyIndex>. {
- yyextra->current->args+=yytext;
- }
+ yyextra->current->args+=yytext;
+ }
+<CliPropertyIndex>. {
+ yyextra->current->args+=yytext;
+ }
/*
-<FindMembers>{B}*"property"{BN}+ {
+<FindMembers>{B}*"property"{BN}+ {
if (!yyextra->current->type.isEmpty())
- {
- REJECT;
+ {
+ REJECT;
}
- else
- {
+ else
+ {
yyextra->current->mtype = yyextra->mtype = Property;
lineCount(yyscanner);
- }
+ }
}
*/
-<FindMembers>{B}*"@private"{BN}+ {
- yyextra->current->protection = yyextra->protection = Private ;
- yyextra->current->mtype = yyextra->mtype = Method;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
-<FindMembers>{B}*"@protected"{BN}+ {
- yyextra->current->protection = yyextra->protection = Protected ;
- yyextra->current->mtype = yyextra->mtype = Method;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
-<FindMembers>{B}*"@public"{BN}+ {
- yyextra->current->protection = yyextra->protection = Public ;
- yyextra->current->mtype = yyextra->mtype = Method;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- lineCount(yyscanner) ;
- }
-<FindMembers>[\-+]{BN}* {
- if (!yyextra->insideObjC)
- {
- REJECT;
- }
- else
- {
- lineCount(yyscanner);
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->current->section = Entry::FUNCTION_SEC;
- yyextra->current->protection = yyextra->protection = Public ;
- yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
- yyextra->insideObjC = TRUE;
- yyextra->current->virt = Virtual;
- yyextra->current->stat=yytext[0]=='+';
- yyextra->current->mtype = yyextra->mtype = Method;
- yyextra->current->type.resize(0);
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->argList.clear();
- BEGIN( ObjCMethod );
- }
- }
-<ObjCMethod>"(" { // start of method's return type
- BEGIN( ObjCReturnType );
- }
-<ObjCMethod>{ID} { // found method name
- if (yyextra->current->type.isEmpty())
- {
- yyextra->current->type = "id";
- }
- yyextra->current->name = yytext;
- if (yyextra->insideCpp || yyextra->insideObjC)
- {
- yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext);
- }
- }
-<ObjCMethod>":"{B}* { // start of parameter list
- yyextra->current->name += ':';
- Argument a;
- yyextra->current->argList.push_back(a);
- BEGIN( ObjCParams );
- }
-<ObjCReturnType>[^)]* { // TODO: check if nested braches are possible.
- yyextra->current->type = yytext;
- }
-<ObjCReturnType>")" {
- BEGIN( ObjCMethod );
- }
-<ObjCParams>({ID})?{BN}*":" { // Keyword of parameter
- QCString keyw = yytext;
- keyw=keyw.left(keyw.length()-1).stripWhiteSpace(); // strip :
- if (keyw.isEmpty())
- {
- yyextra->current->name += " :";
- }
- else
- {
- yyextra->current->name += keyw+":";
- }
- if (yyextra->current->argList.back().type.isEmpty())
- {
- yyextra->current->argList.back().type="id";
- }
- Argument a;
- a.attrib=(QCString)"["+keyw+"]";
- yyextra->current->argList.push_back(a);
- }
-<ObjCParams>{ID}{BN}* { // name of parameter
- lineCount(yyscanner);
- yyextra->current->argList.back().name=QCString(yytext).stripWhiteSpace();
- }
-<ObjCParams>","{BN}*"..." { // name of parameter
- lineCount(yyscanner);
- // do we want the comma as part of the name?
- //yyextra->current->name += ",";
- Argument a;
- a.attrib="[,]";
- a.type="...";
- yyextra->current->argList.push_back(a);
- }
+<FindMembers>{B}*"@private"{BN}+ {
+ yyextra->current->protection = yyextra->protection = Private ;
+ yyextra->current->mtype = yyextra->mtype = Method;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
+<FindMembers>{B}*"@protected"{BN}+ {
+ yyextra->current->protection = yyextra->protection = Protected ;
+ yyextra->current->mtype = yyextra->mtype = Method;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
+<FindMembers>{B}*"@public"{BN}+ {
+ yyextra->current->protection = yyextra->protection = Public ;
+ yyextra->current->mtype = yyextra->mtype = Method;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ lineCount(yyscanner) ;
+ }
+<FindMembers>[\-+]{BN}* {
+ if (!yyextra->insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ lineCount(yyscanner);
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->current->section = Entry::FUNCTION_SEC;
+ yyextra->current->protection = yyextra->protection = Public ;
+ yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
+ yyextra->insideObjC = TRUE;
+ yyextra->current->virt = Virtual;
+ yyextra->current->stat=yytext[0]=='+';
+ yyextra->current->mtype = yyextra->mtype = Method;
+ yyextra->current->type.resize(0);
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->argList.clear();
+ BEGIN( ObjCMethod );
+ }
+ }
+<ObjCMethod>"(" { // start of method's return type
+ BEGIN( ObjCReturnType );
+ }
+<ObjCMethod>{ID} { // found method name
+ if (yyextra->current->type.isEmpty())
+ {
+ yyextra->current->type = "id";
+ }
+ yyextra->current->name = yytext;
+ if (yyextra->clangParser && (yyextra->insideCpp || yyextra->insideObjC))
+ {
+ yyextra->current->id = yyextra->clangParser->lookup(yyextra->yyLineNr,yytext);
+ }
+ }
+<ObjCMethod>":"{B}* { // start of parameter list
+ yyextra->current->name += ':';
+ Argument a;
+ yyextra->current->argList.push_back(a);
+ BEGIN( ObjCParams );
+ }
+<ObjCReturnType>[^)]* { // TODO: check if nested braches are possible.
+ yyextra->current->type = yytext;
+ }
+<ObjCReturnType>")" {
+ BEGIN( ObjCMethod );
+ }
+<ObjCParams>({ID})?{BN}*":" { // Keyword of parameter
+ QCString keyw = yytext;
+ keyw=keyw.left(keyw.length()-1).stripWhiteSpace(); // strip :
+ if (keyw.isEmpty())
+ {
+ yyextra->current->name += " :";
+ }
+ else
+ {
+ yyextra->current->name += keyw+":";
+ }
+ if (yyextra->current->argList.back().type.isEmpty())
+ {
+ yyextra->current->argList.back().type="id";
+ }
+ Argument a;
+ a.attrib=(QCString)"["+keyw+"]";
+ yyextra->current->argList.push_back(a);
+ }
+<ObjCParams>{ID}{BN}* { // name of parameter
+ lineCount(yyscanner);
+ yyextra->current->argList.back().name=QCString(yytext).stripWhiteSpace();
+ }
+<ObjCParams>","{BN}*"..." { // name of parameter
+ lineCount(yyscanner);
+ // do we want the comma as part of the name?
+ //yyextra->current->name += ",";
+ Argument a;
+ a.attrib="[,]";
+ a.type="...";
+ yyextra->current->argList.push_back(a);
+ }
/*
-<ObjCParams>":" {
- yyextra->current->name += ':';
- }
+<ObjCParams>":" {
+ yyextra->current->name += ':';
+ }
*/
-<ObjCParams>"(" {
- yyextra->roundCount=0;
- yyextra->current->argList.back().type.resize(0);
- BEGIN( ObjCParamType );
- }
+<ObjCParams>"(" {
+ yyextra->roundCount=0;
+ yyextra->current->argList.back().type.resize(0);
+ BEGIN( ObjCParamType );
+ }
<ObjCParamType>"(" {
yyextra->roundCount++;
- yyextra->current->argList.back().type+=yytext;
+ yyextra->current->argList.back().type+=yytext;
}
-<ObjCParamType>")"/{B}* {
+<ObjCParamType>")"/{B}* {
if (yyextra->roundCount<=0)
{
BEGIN( ObjCParams );
@@ -831,211 +843,221 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
yyextra->current->argList.back().type+=yytext;
yyextra->roundCount--;
}
- }
-<ObjCParamType>[^()]* {
- yyextra->current->argList.back().type+=QCString(yytext).stripWhiteSpace();
- }
-<ObjCMethod,ObjCParams>";" { // end of method declaration
- if (!yyextra->current->argList.empty() && yyextra->current->argList.back().type.isEmpty())
- {
- yyextra->current->argList.back().type="id";
- }
+ }
+<ObjCParamType>[^()]* {
+ yyextra->current->argList.back().type+=QCString(yytext).stripWhiteSpace();
+ }
+<ObjCMethod,ObjCParams>";" { // end of method declaration
+ if (!yyextra->current->argList.empty() && yyextra->current->argList.back().type.isEmpty())
+ {
+ yyextra->current->argList.back().type="id";
+ }
if (yyextra->current->argList.empty()) // method without parameters
{
- yyextra->current->argList.noParameters = TRUE;
+ yyextra->current->argList.setNoParameters(TRUE);
}
- yyextra->current->args = argListToString(yyextra->current->argList);
- //printf("argList=%s\n",yyextra->current->args.data());
- unput(';');
- BEGIN( Function );
+ yyextra->current->args = argListToString(yyextra->current->argList);
+ //printf("argList=%s\n",yyextra->current->args.data());
+ unput(';');
+ BEGIN( Function );
}
-<ObjCMethod,ObjCParams>(";"{BN}+)?"{" { // start of a method body
- lineCount(yyscanner);
+<ObjCMethod,ObjCParams>(";"{BN}+)?"{" { // start of a method body
+ lineCount(yyscanner);
//printf("Type=%s Name=%s args=%s\n",
- // yyextra->current->type.data(),yyextra->current->name.data(),argListToString(yyextra->current->argList).data()
- // );
- if (!yyextra->current->argList.empty() && yyextra->current->argList.back().type.isEmpty())
- {
- yyextra->current->argList.back().type="id";
- }
+ // yyextra->current->type.data(),yyextra->current->name.data(),argListToString(yyextra->current->argList).data()
+ // );
+ if (!yyextra->current->argList.empty() && yyextra->current->argList.back().type.isEmpty())
+ {
+ yyextra->current->argList.back().type="id";
+ }
if (yyextra->current->argList.empty()) // method without parameters
{
- yyextra->current->argList.noParameters = TRUE;
+ yyextra->current->argList.setNoParameters(TRUE);
}
- yyextra->current->args = argListToString(yyextra->current->argList);
+ yyextra->current->args = argListToString(yyextra->current->argList);
unput('{');
- BEGIN( Function );
- }
+ BEGIN( Function );
+ }
<FindMembers>{B}*"sequence"{BN}*"<"{BN}* {
- if (yyextra->insideSlice)
- {
+ if (yyextra->insideSlice)
+ {
lineCount(yyscanner);
- yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
yyextra->current->fileName = yyextra->yyFileName ;
- yyextra->current->startLine = yyextra->yyLineNr ;
- yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->startLine = yyextra->yyLineNr ;
+ yyextra->current->startColumn = yyextra->yyColNr;
yyextra->current->args.resize(0);
- yyextra->current->section = Entry::TYPEDEF_SEC ;
+ yyextra->current->section = Entry::TYPEDEF_SEC ;
yyextra->isTypedef = TRUE;
- BEGIN( SliceSequence );
- }
- else
- REJECT;
- }
+ BEGIN( SliceSequence );
+ }
+ else
+ REJECT;
+ }
<FindMembers>{B}*"dictionary"{BN}*"<"{BN}* {
- if (yyextra->insideSlice)
- {
+ if (yyextra->insideSlice)
+ {
lineCount(yyscanner);
- yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
yyextra->current->fileName = yyextra->yyFileName ;
- yyextra->current->startLine = yyextra->yyLineNr ;
- yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->startLine = yyextra->yyLineNr ;
+ yyextra->current->startColumn = yyextra->yyColNr;
yyextra->current->args.resize(0);
- yyextra->current->section = Entry::TYPEDEF_SEC ;
+ yyextra->current->section = Entry::TYPEDEF_SEC ;
yyextra->isTypedef = TRUE;
- BEGIN( SliceDictionary );
- }
- else
- REJECT;
- }
-<FindMembers>{BN}{1,80} {
- lineCount(yyscanner);
- }
-<FindMembers>"@"({ID}".")*{ID}{BN}*"(" {
- if (yyextra->insideJava) // Java annotation
- {
- lineCount(yyscanner);
- yyextra->lastSkipRoundContext = YY_START;
- yyextra->roundCount=0;
- BEGIN( SkipRound );
- }
- else if (qstrncmp(yytext,"@property",9)==0) // ObjC 2.0 property
- {
- yyextra->current->mtype = yyextra->mtype = Property;
- yyextra->current->spec|=Entry::Readable | Entry::Writable | Entry::Assign;
- yyextra->current->protection = Public ;
- unput('(');
- BEGIN( ObjCPropAttr );
- }
- else
- {
- REJECT;
- }
- }
-<ObjCPropAttr>"getter="{ID} {
+ BEGIN( SliceDictionary );
+ }
+ else
+ REJECT;
+ }
+<FindMembers>{BN}{1,80} {
+ lineCount(yyscanner);
+ }
+<FindMembers>"@"({ID}".")*{ID}{BN}*"(" {
+ if (yyextra->insideJava) // Java annotation
+ {
+ lineCount(yyscanner);
+ yyextra->lastSkipRoundContext = YY_START;
+ yyextra->roundCount=0;
+ BEGIN( SkipRound );
+ }
+ else if (qstrncmp(yytext,"@property",9)==0) // ObjC 2.0 property
+ {
+ yyextra->current->mtype = yyextra->mtype = Property;
+ yyextra->current->spec|=Entry::Readable | Entry::Writable | Entry::Assign;
+ yyextra->current->protection = Public ;
+ unput('(');
+ BEGIN( ObjCPropAttr );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<ObjCPropAttr>"getter="{ID} {
yyextra->current->read = yytext+7;
- }
-<ObjCPropAttr>"setter="{ID} {
+ }
+<ObjCPropAttr>"setter="{ID} {
yyextra->current->write = yytext+7;
- }
-<ObjCPropAttr>"readonly" {
- yyextra->current->spec&=~Entry::Writable;
- }
-<ObjCPropAttr>"readwrite" { // default
- }
-<ObjCPropAttr>"assign" { // default
- }
+ }
+<ObjCPropAttr>"readonly" {
+ yyextra->current->spec&=~Entry::Writable;
+ }
+<ObjCPropAttr>"readwrite" { // default
+ }
+<ObjCPropAttr>"assign" { // default
+ }
<ObjCPropAttr>"unsafe_unretained" {
- yyextra->current->spec&=~Entry::Assign;
- yyextra->current->spec|=Entry::Unretained;
- }
-<ObjCPropAttr>"retain" {
- yyextra->current->spec&=~Entry::Assign;
- yyextra->current->spec|=Entry::Retain;
- }
-<ObjCPropAttr>"copy" {
- yyextra->current->spec&=~Entry::Assign;
- yyextra->current->spec|=Entry::Copy;
- }
+ yyextra->current->spec&=~Entry::Assign;
+ yyextra->current->spec|=Entry::Unretained;
+ }
+<ObjCPropAttr>"retain" {
+ yyextra->current->spec&=~Entry::Assign;
+ yyextra->current->spec|=Entry::Retain;
+ }
+<ObjCPropAttr>"copy" {
+ yyextra->current->spec&=~Entry::Assign;
+ yyextra->current->spec|=Entry::Copy;
+ }
<ObjCPropAttr>"weak" {
- yyextra->current->spec&=~Entry::Assign;
- yyextra->current->spec|=Entry::Weak;
+ yyextra->current->spec&=~Entry::Assign;
+ yyextra->current->spec|=Entry::Weak;
}
<ObjCPropAttr>"strong" {
- yyextra->current->spec&=~Entry::Assign;
- yyextra->current->spec|=Entry::Strong;
- }
-<ObjCPropAttr>"nonatomic" {
- yyextra->current->spec|=Entry::NonAtomic;
- }
-<ObjCPropAttr>")" {
- BEGIN(FindMembers);
- }
-<FindMembers>"@"{ID} {
- if (yyextra->insideJava) // Java annotation
- {
- // skip annotation
- }
- else if (qstrcmp(yytext,"@property")==0) // ObjC 2.0 property
- {
- yyextra->current->mtype = yyextra->mtype = Property;
- yyextra->current->spec|=Entry::Writable | Entry::Readable;
- yyextra->current->protection = Public ;
- }
- else if (qstrcmp(yytext,"@synthesize")==0)
- {
- BEGIN( ObjCSkipStatement );
- }
- else if (qstrcmp(yytext,"@dynamic")==0)
- {
- BEGIN( ObjCSkipStatement );
- }
- else
- {
- REJECT;
- }
- }
-<ObjCSkipStatement>";" {
- BEGIN(FindMembers);
- }
-<PackageName>{ID}(("."|"\\"){ID})* {
- yyextra->isTypedef=FALSE;
- //printf("Found namespace %s lang=%d\n",yytext,yyextra->current->lang);
- yyextra->current->name = yytext;
- yyextra->current->name = substitute(yyextra->current->name,".","::");
- yyextra->current->name = substitute(yyextra->current->name,"\\","::");
- yyextra->current->section = Entry::NAMESPACE_SEC;
- yyextra->current->type = "namespace" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner);
- }
-<PackageName>";" {
+ yyextra->current->spec&=~Entry::Assign;
+ yyextra->current->spec|=Entry::Strong;
+ }
+<ObjCPropAttr>"nonatomic" {
+ yyextra->current->spec|=Entry::NonAtomic;
+ }
+<ObjCPropAttr>")" {
+ BEGIN(FindMembers);
+ }
+<FindMembers>"@"{ID} {
+ if (yyextra->insideJava) // Java annotation
+ {
+ // skip annotation
+ }
+ else if (qstrcmp(yytext,"@property")==0) // ObjC 2.0 property
+ {
+ yyextra->current->mtype = yyextra->mtype = Property;
+ yyextra->current->spec|=Entry::Writable | Entry::Readable;
+ yyextra->current->protection = Public ;
+ }
+ else if (qstrcmp(yytext,"@synthesize")==0)
+ {
+ BEGIN( ObjCSkipStatement );
+ }
+ else if (qstrcmp(yytext,"@dynamic")==0)
+ {
+ BEGIN( ObjCSkipStatement );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<ObjCSkipStatement>";" {
+ BEGIN(FindMembers);
+ }
+<PackageName>{ID}(("."|"\\"){ID})* {
+ yyextra->isTypedef=FALSE;
+ //printf("Found namespace %s lang=%d\n",yytext,yyextra->current->lang);
+ yyextra->current->name = yytext;
+ yyextra->current->name = substitute(yyextra->current->name,".","::");
+ yyextra->current->name = substitute(yyextra->current->name,"\\","::");
+ yyextra->current->section = Entry::NAMESPACE_SEC;
+ yyextra->current->type = "namespace" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner);
+ }
+<PackageName>";" {
std::shared_ptr<Entry> tmp = yyextra->current;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
yyextra->current_root = tmp;
- initEntry(yyscanner);
- BEGIN(FindMembers);
- }
-<PackageName>"{" {
- yyextra->curlyCount=0;
- BEGIN( ReadNSBody );
- }
-<FindMembers>{B}*"initonly"{BN}+ {
- yyextra->current->type += " initonly ";
- if (yyextra->insideCli) yyextra->current->spec |= Entry::Initonly;
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"static"{BN}+ { yyextra->current->type += " static ";
- yyextra->current->stat = TRUE;
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"extern"{BN}+ {
- yyextra->current->stat = FALSE;
- yyextra->current->explicitExternal = TRUE;
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"const"{BN}+ { yyextra->current->type += " const ";
- if (yyextra->insideCS) yyextra->current->stat = TRUE;
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"virtual"{BN}+ { yyextra->current->type += " virtual ";
- yyextra->current->virt = Virtual;
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"constexpr"{BN}+ {
+ initEntry(yyscanner);
+ BEGIN(FindMembers);
+ }
+<PackageName>"{" {
+ yyextra->curlyCount=0;
+ BEGIN( ReadNSBody );
+ }
+<FindMembers>{B}*"initonly"{BN}+ {
+ yyextra->current->type += " initonly ";
+ if (yyextra->insideCli) yyextra->current->spec |= Entry::Initonly;
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*"static"{BN}+ { yyextra->current->type += " static ";
+ yyextra->current->stat = TRUE;
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*"extern"{BN}+ {
+ yyextra->current->stat = FALSE;
+ yyextra->current->explicitExternal = TRUE;
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*"const"{BN}+ { if (yyextra->insideCS)
+ {
+ yyextra->current->type += " const ";
+ if (yyextra->insideCS) yyextra->current->stat = TRUE;
+ lineCount(yyscanner);
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<FindMembers>{B}*"virtual"{BN}+ { yyextra->current->type += " virtual ";
+ yyextra->current->virt = Virtual;
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*"constexpr"{BN}+ {
if (yyextra->insideCpp)
{
yyextra->current->type += " constexpr ";
@@ -1046,289 +1068,300 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
{
REJECT;
}
- }
-<FindMembers>{B}*"published"{BN}+ { // UNO IDL published keyword
- if (yyextra->insideIDL)
- {
- lineCount(yyscanner);
- yyextra->current->spec |= Entry::Published;
- }
- else
- {
- REJECT;
- }
- }
-<FindMembers>{B}*"abstract"{BN}+ {
- if (!yyextra->insidePHP)
- {
- yyextra->current->type += " abstract ";
- if (!yyextra->insideJava)
- {
+ }
+<FindMembers>{B}*"published"{BN}+ { // UNO IDL published keyword
+ if (yyextra->insideIDL)
+ {
+ lineCount(yyscanner);
+ yyextra->current->spec |= Entry::Published;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<FindMembers>{B}*"abstract"{BN}+ {
+ if (!yyextra->insidePHP)
+ {
+ yyextra->current->type += " abstract ";
+ if (!yyextra->insideJava)
+ {
yyextra->current->virt = Pure;
- }
- else
- {
+ }
+ else
+ {
yyextra->current->spec|=Entry::Abstract;
- }
- }
- else
- {
- yyextra->current->spec|=Entry::Abstract;
- }
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"inline"{BN}+ { yyextra->current->spec|=Entry::Inline;
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"mutable"{BN}+ { yyextra->current->spec|=Entry::Mutable;
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"explicit"{BN}+ { yyextra->current->spec|=Entry::Explicit;
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"local"{BN}+ { yyextra->current->spec|=Entry::Local;
- lineCount(yyscanner);
- }
-<FindMembers>{B}*"@required"{BN}+ { // Objective C 2.0 protocol required section
+ }
+ }
+ else
+ {
+ yyextra->current->spec|=Entry::Abstract;
+ }
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*"inline"{BN}+ { yyextra->current->spec|=Entry::Inline;
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*"mutable"{BN}+ { yyextra->current->spec|=Entry::Mutable;
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*"explicit"{BN}+ { yyextra->current->spec|=Entry::Explicit;
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*"local"{BN}+ { yyextra->current->spec|=Entry::Local;
+ lineCount(yyscanner);
+ }
+<FindMembers>{B}*"@required"{BN}+ { // Objective C 2.0 protocol required section
yyextra->current->spec=(yyextra->current->spec & ~Entry::Optional) | Entry::Required;
- lineCount(yyscanner);
+ lineCount(yyscanner);
}
-<FindMembers>{B}*"@optional"{BN}+ { // Objective C 2.0 protocol optional section
+<FindMembers>{B}*"@optional"{BN}+ { // Objective C 2.0 protocol optional section
yyextra->current->spec=(yyextra->current->spec & ~Entry::Required) | Entry::Optional;
- lineCount(yyscanner);
+ lineCount(yyscanner);
}
/*
-<FindMembers>{B}*"import"{BN}+ { // IDL import keyword
- BEGIN( NextSemi );
- }
+<FindMembers>{B}*"import"{BN}+ { // IDL import keyword
+ BEGIN( NextSemi );
+ }
*/
-<FindMembers>{B}*"typename"{BN}+ { lineCount(yyscanner); }
-<FindMembers>{B}*"namespace"{BN}*/[^a-z_A-Z0-9] {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::NAMESPACE_SEC;
- yyextra->current->type = "namespace" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner);
- if (yyextra->insidePHP)
- {
- BEGIN( PackageName );
- }
- else
- {
- BEGIN( CompoundName );
- }
- }
-<FindMembers>{B}*"module"{BN}+ {
- lineCount(yyscanner);
+<FindMembers>{B}*"typename"{BN}+ { lineCount(yyscanner); }
+<FindMembers>{B}*"namespace"{BN}*/[^a-z_A-Z0-9] {
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::NAMESPACE_SEC;
+ yyextra->current->type = "namespace" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner);
+ if (yyextra->insidePHP)
+ {
+ BEGIN( PackageName );
+ }
+ else
+ {
+ BEGIN( CompoundName );
+ }
+ }
+<FindMembers>{B}*"module"{BN}+ {
+ lineCount(yyscanner);
if (yyextra->insideIDL || yyextra->insideSlice)
- {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::NAMESPACE_SEC;
- yyextra->current->type = "module" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( CompoundName );
- }
- else if (yyextra->insideD)
- {
- lineCount(yyscanner);
- BEGIN(PackageName);
- }
- else
- {
- addType(yyscanner);
- yyextra->current->name = QCString(yytext).stripWhiteSpace();
- }
- }
-<FindMembers>{B}*"library"{BN}+ {
- lineCount(yyscanner);
+ {
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::NAMESPACE_SEC;
+ yyextra->current->type = "module" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( CompoundName );
+ }
+ else if (yyextra->insideD)
+ {
+ lineCount(yyscanner);
+ BEGIN(PackageName);
+ }
+ else
+ {
+ addType(yyscanner);
+ yyextra->current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{B}*"library"{BN}+ {
+ lineCount(yyscanner);
+ if (yyextra->insideIDL)
+ {
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::NAMESPACE_SEC;
+ yyextra->current->type = "library" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( CompoundName );
+ }
+ else
+ {
+ addType(yyscanner);
+ yyextra->current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{B}*"constants"{BN}+ { // UNO IDL constant group
+ lineCount(yyscanner);
+ if (yyextra->insideIDL)
+ {
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::NAMESPACE_SEC;
+ yyextra->current->type = "constants";
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( CompoundName );
+ }
+ else
+ {
+ addType(yyscanner);
+ yyextra->current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{BN}*("service"){BN}+ { // UNO IDL service
+ lineCount(yyscanner);
if (yyextra->insideIDL)
- {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::NAMESPACE_SEC;
- yyextra->current->type = "library" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( CompoundName );
- }
- else
- {
- addType(yyscanner);
- yyextra->current->name = QCString(yytext).stripWhiteSpace();
- }
- }
-<FindMembers>{B}*"constants"{BN}+ { // UNO IDL constant group
- lineCount(yyscanner);
- if (yyextra->insideIDL)
- {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::NAMESPACE_SEC;
- yyextra->current->type = "constants";
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( CompoundName );
- }
- else
- {
- addType(yyscanner);
- yyextra->current->name = QCString(yytext).stripWhiteSpace();
- }
- }
-<FindMembers>{BN}*("service"){BN}+ { // UNO IDL service
- lineCount(yyscanner);
- if (yyextra->insideIDL)
- {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
- yyextra->current->spec = Entry::Service |
- // preserve UNO IDL [optional] or published
- (yyextra->current->spec & (Entry::Optional|Entry::Published));
- addType(yyscanner);
- yyextra->current->type += " service " ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( CompoundName );
- }
- else // TODO is addType right? just copy/pasted
- {
- addType(yyscanner);
- yyextra->current->name = QCString(yytext).stripWhiteSpace();
- }
- }
-<FindMembers>{BN}*("singleton"){BN}+ { // UNO IDL singleton
- lineCount(yyscanner);
- if (yyextra->insideIDL)
- {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
- yyextra->current->spec = Entry::Singleton |
- (yyextra->current->spec & Entry::Published); // preserve
- addType(yyscanner);
- yyextra->current->type += " singleton " ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( CompoundName );
- }
- else // TODO is addType right? just copy/pasted
- {
- addType(yyscanner);
- yyextra->current->name = QCString(yytext).stripWhiteSpace();
- }
- }
-<FindMembers>{BN}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba/UNO IDL/Java/Slice interface
- lineCount(yyscanner);
+ {
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->current->spec = Entry::Service |
+ // preserve UNO IDL [optional] or published
+ (yyextra->current->spec & (Entry::Optional|Entry::Published));
+ addType(yyscanner);
+ yyextra->current->type += " service " ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( CompoundName );
+ }
+ else // TODO is addType right? just copy/pasted
+ {
+ addType(yyscanner);
+ yyextra->current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{BN}*("singleton"){BN}+ { // UNO IDL singleton
+ lineCount(yyscanner);
+ if (yyextra->insideIDL)
+ {
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->current->spec = Entry::Singleton |
+ (yyextra->current->spec & Entry::Published); // preserve
+ addType(yyscanner);
+ yyextra->current->type += " singleton " ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( CompoundName );
+ }
+ else // TODO is addType right? just copy/pasted
+ {
+ addType(yyscanner);
+ yyextra->current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{BN}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba/UNO IDL/Java/Slice interface
+ lineCount(yyscanner);
if (yyextra->insideIDL || yyextra->insideJava || yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideSlice)
- {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
- yyextra->current->spec = Entry::Interface |
+ {
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->current->spec = Entry::Interface |
// preserve UNO IDL [optional], published, Slice local
(yyextra->current->spec & (Entry::Optional|Entry::Published|Entry::Local));
- addType(yyscanner);
- yyextra->current->type += " interface" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( CompoundName );
- }
- else
- {
- addType(yyscanner);
- yyextra->current->name = QCString(yytext).stripWhiteSpace();
- }
- }
-<FindMembers>{B}*"@implementation"{BN}+ { // Objective-C class implementation
- lineCount(yyscanner);
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::OBJCIMPL_SEC;
- yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
- yyextra->insideObjC = TRUE;
- yyextra->current->protection = yyextra->protection = Public ;
- addType(yyscanner);
- yyextra->current->type += " implementation" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( CompoundName );
- }
-<FindMembers>{B}*"@interface"{BN}+ { // Objective-C class interface, or Java attribute
- lineCount(yyscanner);
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
+ addType(yyscanner);
+ yyextra->current->type += " interface" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( CompoundName );
+ }
+ else
+ {
+ addType(yyscanner);
+ yyextra->current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{B}*"@implementation"{BN}+ { // Objective-C class implementation
+ lineCount(yyscanner);
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::OBJCIMPL_SEC;
+ yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
+ yyextra->insideObjC = TRUE;
+ yyextra->current->protection = yyextra->protection = Public ;
+ addType(yyscanner);
+ yyextra->current->type += " implementation" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( CompoundName );
+ }
+<FindMembers>{B}*"@interface"{BN}+ { // Objective-C class interface, or Java attribute
+ lineCount(yyscanner);
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
yyextra->current->spec = Entry::Interface;
- if (!yyextra->insideJava)
- {
- yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
- yyextra->insideObjC = TRUE;
- }
- yyextra->current->protection = yyextra->protection = Public ;
- addType(yyscanner);
- yyextra->current->type += " interface" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( CompoundName );
- }
-<FindMembers>{B}*"@protocol"{BN}+ { // Objective-C protocol definition
- lineCount(yyscanner);
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
+ if (!yyextra->insideJava)
+ {
+ yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
+ yyextra->insideObjC = TRUE;
+ }
+ yyextra->current->protection = yyextra->protection = Public ;
+ addType(yyscanner);
+ yyextra->current->type += " interface" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( CompoundName );
+ }
+<FindMembers>{B}*"@protocol"{BN}+ { // Objective-C protocol definition
+ lineCount(yyscanner);
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
yyextra->current->spec = Entry::Protocol;
- yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
- yyextra->insideObjC = TRUE;
- yyextra->current->protection = yyextra->protection = Public ;
- addType(yyscanner);
- yyextra->current->type += " protocol" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( CompoundName );
- }
-<FindMembers>{B}*"exception"{BN}+ { // Corba IDL/Slice exception
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
+ yyextra->insideObjC = TRUE;
+ yyextra->current->protection = yyextra->protection = Public ;
+ addType(yyscanner);
+ yyextra->current->type += " protocol" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( CompoundName );
+ }
+<FindMembers>{B}*"exception"{BN}+ { // Corba IDL/Slice exception
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
// preserve UNO IDL, Slice local
- yyextra->current->spec = Entry::Exception |
- (yyextra->current->spec & Entry::Published) |
- (yyextra->current->spec & Entry::Local);
- addType(yyscanner);
- yyextra->current->type += " exception" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner);
- BEGIN( CompoundName );
- }
+ yyextra->current->spec = Entry::Exception |
+ (yyextra->current->spec & Entry::Published) |
+ (yyextra->current->spec & Entry::Local);
+ addType(yyscanner);
+ yyextra->current->type += " exception" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner);
+ BEGIN( CompoundName );
+ }
<FindMembers>"@class" | // for Objective C class declarations
<FindMembers>{B}*{TYPEDEFPREFIX}"class{" |
-<FindMembers>{B}*{TYPEDEFPREFIX}"class"{BN}+ {
+<FindMembers>{B}*{TYPEDEFPREFIX}"class"{BN}+ {
QCString decl = yytext;
- yyextra->isTypedef=decl.find("typedef")!=-1;
+ yyextra->isTypedef=decl.find("typedef")!=-1;
bool isConst=decl.find("const")!=-1;
bool isVolatile=decl.find("volatile")!=-1;
- yyextra->current->section = Entry::CLASS_SEC;
- addType(yyscanner);
+ yyextra->current->section = Entry::CLASS_SEC;
+ addType(yyscanner);
uint64 spec = yyextra->current->spec;
- if (yyextra->insidePHP && yyextra->current->spec&Entry::Abstract)
- {
- // convert Abstract to AbstractClass
- yyextra->current->spec=(yyextra->current->spec&~Entry::Abstract)|Entry::AbstractClass;
- }
+ if (yyextra->insidePHP && yyextra->current->spec&Entry::Abstract)
+ {
+ // convert Abstract to AbstractClass
+ yyextra->current->spec=(yyextra->current->spec&~Entry::Abstract)|Entry::AbstractClass;
+ }
if (yyextra->insideSlice && spec&Entry::Local)
{
yyextra->current->spec|=Entry::Local;
@@ -1341,103 +1374,107 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
{
yyextra->current->type += " volatile";
}
- yyextra->current->type += " class" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- if (yytext[0]=='@')
- {
- yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
- yyextra->insideObjC = TRUE;
- }
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
+ yyextra->current->type += " class" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ if (yytext[0]=='@')
+ {
+ yyextra->language = yyextra->current->lang = SrcLangExt_ObjC;
+ yyextra->insideObjC = TRUE;
+ }
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
<FindMembers>{B}*"value class{" | // C++/CLI extension
<FindMembers>{B}*"value class"{BN}+ {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
yyextra->current->spec = Entry::Value;
- addType(yyscanner);
- yyextra->current->type += " value class" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
+ addType(yyscanner);
+ yyextra->current->type += " value class" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
<FindMembers>{B}*"ref class{" | // C++/CLI extension
<FindMembers>{B}*"ref class"{BN}+ {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
yyextra->current->spec = Entry::Ref;
- addType(yyscanner);
- yyextra->current->type += " ref class" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
+ addType(yyscanner);
+ yyextra->current->type += " ref class" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
<FindMembers>{B}*"interface class{" | // C++/CLI extension
<FindMembers>{B}*"interface class"{BN}+ {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
yyextra->current->spec = Entry::Interface;
- addType(yyscanner);
- yyextra->current->type += " interface class" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
-<FindMembers>{B}*"coclass"{BN}+ {
- if (yyextra->insideIDL)
- {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
- addType(yyscanner);
- yyextra->current->type += " coclass" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- BEGIN( CompoundName ) ;
- }
- else
- {
- addType(yyscanner);
- yyextra->current->name = yytext;
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- lineCount(yyscanner);
- }
- }
-<FindMembers>{B}*{TYPEDEFPREFIX}"struct{" |
-<FindMembers>{B}*{TYPEDEFPREFIX}"struct"/{BN}+ {
+ addType(yyscanner);
+ yyextra->current->type += " interface class" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*"coclass"{BN}+ {
+ if (yyextra->insideIDL)
+ {
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
+ addType(yyscanner);
+ yyextra->current->type += " coclass" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ BEGIN( CompoundName ) ;
+ }
+ else
+ {
+ addType(yyscanner);
+ yyextra->current->name = yytext;
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ lineCount(yyscanner);
+ }
+ }
+<FindMembers>{B}*{TYPEDEFPREFIX}"struct{" |
+<FindMembers>{B}*{TYPEDEFPREFIX}"struct"/{BN}+ {
QCString decl = yytext;
- yyextra->isTypedef=decl.find("typedef")!=-1;
+ yyextra->isTypedef=decl.find("typedef")!=-1;
bool isConst=decl.find("const")!=-1;
bool isVolatile=decl.find("volatile")!=-1;
- uint64 spec = yyextra->current->spec;
- yyextra->current->section = Entry::CLASS_SEC ;
+ yyextra->current->section = Entry::CLASS_SEC ;
// preserve UNO IDL & Inline attributes, Slice local
- yyextra->current->spec = Entry::Struct |
- (yyextra->current->spec & Entry::Published) |
+ yyextra->current->spec = Entry::Struct |
+ (yyextra->current->spec & Entry::Published) |
(yyextra->current->spec & Entry::Inline) |
- (yyextra->current->spec & Entry::Local);
- // bug 582676: can be a struct nested in an interface so keep yyextra->insideObjC state
- //yyextra->current->objc = yyextra->insideObjC = FALSE;
- addType(yyscanner);
+ (yyextra->current->spec & Entry::Local);
+ // bug 582676: can be a struct nested in an interface so keep yyextra->insideObjC state
+ //yyextra->current->objc = yyextra->insideObjC = FALSE;
+ addType(yyscanner);
if (isConst)
{
yyextra->current->type += " const";
@@ -1446,71 +1483,75 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
{
yyextra->current->type += " volatile";
}
- yyextra->current->type += " struct" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
+ yyextra->current->type += " struct" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
<FindMembers>{B}*"value struct{" | // C++/CLI extension
<FindMembers>{B}*"value struct"{BN}+ {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
yyextra->current->spec = Entry::Struct | Entry::Value;
- addType(yyscanner);
- yyextra->current->type += " value struct" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
+ addType(yyscanner);
+ yyextra->current->type += " value struct" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
<FindMembers>{B}*"ref struct{" | // C++/CLI extension
<FindMembers>{B}*"ref struct"{BN}+ {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
yyextra->current->spec = Entry::Struct | Entry::Ref;
- addType(yyscanner);
- yyextra->current->type += " ref struct" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
+ addType(yyscanner);
+ yyextra->current->type += " ref struct" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
<FindMembers>{B}*"interface struct{" | // C++/CLI extension
<FindMembers>{B}*"interface struct"{BN}+ {
- yyextra->isTypedef=FALSE;
- yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->isTypedef=FALSE;
+ yyextra->current->section = Entry::CLASS_SEC;
yyextra->current->spec = Entry::Struct | Entry::Interface;
- addType(yyscanner);
- yyextra->current->type += " interface struct";
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
+ addType(yyscanner);
+ yyextra->current->type += " interface struct";
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
<FindMembers>{B}*{TYPEDEFPREFIX}"union{" |
-<FindMembers>{B}*{TYPEDEFPREFIX}"union"{BN}+ {
+<FindMembers>{B}*{TYPEDEFPREFIX}"union"{BN}+ {
QCString decl=yytext;
- yyextra->isTypedef=decl.find("typedef")!=-1;
+ yyextra->isTypedef=decl.find("typedef")!=-1;
bool isConst=decl.find("const")!=-1;
bool isVolatile=decl.find("volatile")!=-1;
- yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->current->section = Entry::CLASS_SEC;
yyextra->current->spec = Entry::Union;
- // bug 582676: can be a struct nested in an interface so keep yyextra->insideObjC state
- //yyextra->current->objc = yyextra->insideObjC = FALSE;
- addType(yyscanner);
+ // bug 582676: can be a struct nested in an interface so keep yyextra->insideObjC state
+ //yyextra->current->objc = yyextra->insideObjC = FALSE;
+ addType(yyscanner);
if (isConst)
{
yyextra->current->type += " const";
@@ -1519,244 +1560,239 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
{
yyextra->current->type += " volatile";
}
- yyextra->current->type += " union" ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
+ yyextra->current->type += " union" ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
<FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?"{" |
<FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?{BN}+ { // for IDL: typedef [something] enum
QCString text=yytext;
- yyextra->isTypedef = text.find("typedef")!=-1;
+ yyextra->isTypedef = text.find("typedef")!=-1;
bool isStrongEnum = text.find("struct")!=-1 || text.find("class")!=-1 || yyextra->insideCS;
- if (yyextra->insideJava)
- {
- yyextra->current->section = Entry::CLASS_SEC;
- yyextra->current->spec = Entry::Enum;
- }
- else
- {
- yyextra->current->section = Entry::ENUM_SEC ;
- }
- addType(yyscanner);
- yyextra->current->type += " enum";
+ if (yyextra->insideJava)
+ {
+ yyextra->current->section = Entry::CLASS_SEC;
+ yyextra->current->spec = Entry::Enum;
+ }
+ else
+ {
+ yyextra->current->section = Entry::ENUM_SEC ;
+ }
+ addType(yyscanner);
+ yyextra->current->type += " enum";
if (isStrongEnum)
{
yyextra->current->spec |= Entry::Strong;
}
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner) ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner) ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
<Operator>"("{BN}*")"({BN}*"<"[^>]*">"){BN}*/"(" { // A::operator()<int>(int arg)
- lineCount(yyscanner);
- yyextra->current->name += "()";
- BEGIN( FindMembers );
- }
-<Operator>"("{BN}*")"{BN}*/"(" {
- lineCount(yyscanner);
- yyextra->current->name += yytext ;
- yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
- BEGIN( FindMembers ) ;
- }
-<Operator>";" { // can occur when importing members
- unput(';');
- BEGIN( FindMembers ) ;
- }
-<Operator>[^(] {
- lineCount(yyscanner);
- yyextra->current->name += *yytext ;
- }
-<Operator>"<>" { /* skip guided templ specifiers */ }
-<Operator>"(" {
- yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
- unput(*yytext);
- BEGIN( FindMembers ) ;
- }
-<FindMembers>("template"|"generic")({BN}*)"<"/[>]? { // generic is a C++/CLI extension
- lineCount(yyscanner);
- ArgumentList al;
- //yyextra->current->spec |= (yytext[0]=='g') ? Entry::Generic : Entry::Template;
- yyextra->current->tArgLists.push_back(al);
- yyextra->currentArgumentList = &yyextra->current->tArgLists.back();
- yyextra->templateStr="<";
- yyextra->fullArgString = yyextra->templateStr;
- yyextra->copyArgString = &yyextra->templateStr;
- yyextra->currentArgumentContext = FindMembers;
- BEGIN( ReadTempArgs );
- }
+ lineCount(yyscanner);
+ yyextra->current->name += "()";
+ BEGIN( FindMembers );
+ }
+<Operator>"("{BN}*")"{BN}*/"(" {
+ lineCount(yyscanner);
+ yyextra->current->name += yytext ;
+ yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
+ BEGIN( FindMembers ) ;
+ }
+<Operator>";" { // can occur when importing members
+ unput(';');
+ BEGIN( FindMembers ) ;
+ }
+<Operator>[^(] {
+ lineCount(yyscanner);
+ yyextra->current->name += *yytext ;
+ }
+<Operator>"<>" { /* skip guided templ specifiers */ }
+<Operator>"(" {
+ yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
+ unput(*yytext);
+ BEGIN( FindMembers ) ;
+ }
+<FindMembers>("template"|"generic")({BN}*)"<"/[>]? { // generic is a C++/CLI extension
+ lineCount(yyscanner);
+ ArgumentList al;
+ //yyextra->current->spec |= (yytext[0]=='g') ? Entry::Generic : Entry::Template;
+ yyextra->current->tArgLists.push_back(al);
+ yyextra->currentArgumentList = &yyextra->current->tArgLists.back();
+ yyextra->templateStr="<";
+ yyextra->fullArgString = yyextra->templateStr;
+ yyextra->copyArgString = &yyextra->templateStr;
+ yyextra->currentArgumentContext = FindMembers;
+ BEGIN( ReadTempArgs );
+ }
<FindMembers>"namespace"{BN}+/{ID}{BN}*"=" { // namespace alias
- lineCount(yyscanner);
- BEGIN( NSAliasName );
- }
-<NSAliasName>{ID} {
- yyextra->aliasName = yytext;
- BEGIN( NSAliasArg );
- }
-<NSAliasArg>({ID}"::")*{ID} {
- //printf("Inserting namespace alias %s::%s->%s\n",yyextra->current_root->name.data(),yyextra->aliasName.data(),yytext);
- //if (yyextra->current_root->name.isEmpty())
- //{
+ lineCount(yyscanner);
+ BEGIN( NSAliasName );
+ }
+<NSAliasName>{ID} {
+ yyextra->aliasName = yytext;
+ BEGIN( NSAliasArg );
+ }
+<NSAliasArg>({ID}"::")*{ID} {
+ //printf("Inserting namespace alias %s::%s->%s\n",yyextra->current_root->name.data(),yyextra->aliasName.data(),yytext);
// TODO: namespace aliases are now treated as global entities
// while they should be aware of the scope they are in
- Doxygen::namespaceAliasDict.insert(yyextra->aliasName,new QCString(yytext));
- //}
- //else
- //{
- // Doxygen::namespaceAliasDict.insert(yyextra->current_root->name+"::"+yyextra->aliasName,
- // new QCString(yyextra->current_root->name+"::"+yytext));
- //}
- }
-<NSAliasArg>";" {
- BEGIN( FindMembers );
- }
+ Doxygen::namespaceAliasMap.insert({yyextra->aliasName.data(),std::string(yytext)});
+ }
+<NSAliasArg>";" {
+ BEGIN( FindMembers );
+ }
<PHPUse>({ID}{BN}*"\\"{BN}*)*{ID}/{BN}+"as" {
- lineCount(yyscanner);
- yyextra->aliasName=yytext;
- BEGIN(PHPUseAs);
- }
-<PHPUse>({ID}{BN}*"\\"{BN}*)*{ID} {
- lineCount(yyscanner);
- yyextra->current->name=removeRedundantWhiteSpace(substitute(yytext,"\\","::"));
- //printf("PHP: adding use relation: %s\n",yyextra->current->name.data());
- yyextra->current->fileName = yyextra->yyFileName;
+ lineCount(yyscanner);
+ yyextra->aliasName=yytext;
+ BEGIN(PHPUseAs);
+ }
+<PHPUse>({ID}{BN}*"\\"{BN}*)*{ID} {
+ lineCount(yyscanner);
+ yyextra->current->name=removeRedundantWhiteSpace(substitute(yytext,"\\","::"));
+ //printf("PHP: adding use relation: %s\n",yyextra->current->name.data());
+ yyextra->current->fileName = yyextra->yyFileName;
// add a using declaration
- yyextra->current->section=Entry::USINGDECL_SEC;
- yyextra->current_root->copyToSubEntry(yyextra->current);
+ yyextra->current->section=Entry::USINGDECL_SEC;
+ yyextra->current_root->copyToSubEntry(yyextra->current);
// also add it as a using directive
- yyextra->current->section=Entry::USINGDIR_SEC;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- yyextra->aliasName.resize(0);
- }
-<PHPUseAs>{BN}+"as"{BN}+ {
- lineCount(yyscanner);
- }
+ yyextra->current->section=Entry::USINGDIR_SEC;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ yyextra->aliasName.resize(0);
+ }
+<PHPUseAs>{BN}+"as"{BN}+ {
+ lineCount(yyscanner);
+ }
<PHPUseAs>{PHPUSEKW} {
}
-<PHPUseAs>{ID} {
- //printf("PHP: adding use as relation: %s->%s\n",yytext,yyextra->aliasName.data());
+<PHPUseAs>{ID} {
+ //printf("PHP: adding use as relation: %s->%s\n",yytext,yyextra->aliasName.data());
if (!yyextra->aliasName.isEmpty())
{
- Doxygen::namespaceAliasDict.insert(yytext,
- new QCString(removeRedundantWhiteSpace(
- substitute(yyextra->aliasName,"\\","::"))));
- }
- yyextra->aliasName.resize(0);
- }
-<PHPUse,PHPUseAs>[,;] {
- if (*yytext==',')
- {
- BEGIN(PHPUse);
- }
- else
- {
- BEGIN(FindMembers);
- }
- }
-<JavaImport>({ID}{BN}*"."{BN}*)+"*" { // package import => add as a using directive
- lineCount(yyscanner);
- QCString scope=yytext;
- yyextra->current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-1),".","::"));
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->section=Entry::USINGDIR_SEC;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- BEGIN(Using);
- }
-<JavaImport>({ID}{BN}*"."{BN}*)+{ID} { // class import => add as a using declaration
+ Doxygen::namespaceAliasMap.insert({yytext,
+ std::string(removeRedundantWhiteSpace(
+ substitute(yyextra->aliasName,"\\","::")).data())});
+ }
+ yyextra->aliasName.resize(0);
+ }
+<PHPUse,PHPUseAs>[,;] {
+ if (*yytext==',')
+ {
+ BEGIN(PHPUse);
+ }
+ else
+ {
+ BEGIN(FindMembers);
+ }
+ }
+<JavaImport>({ID}{BN}*"."{BN}*)+"*" { // package import => add as a using directive
lineCount(yyscanner);
- QCString scope=yytext;
- yyextra->current->name=removeRedundantWhiteSpace(substitute(scope,".","::"));
- yyextra->current->fileName = yyextra->yyFileName;
- if (yyextra->insideD)
- {
- yyextra->current->section=Entry::USINGDIR_SEC;
- }
- else
- {
- //printf("import name = %s -> %s\n",yytext,yyextra->current->name.data());
- yyextra->current->section=Entry::USINGDECL_SEC;
- }
+ QCString scope=yytext;
+ yyextra->current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-1),".","::"));
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->section=Entry::USINGDIR_SEC;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ BEGIN(Using);
+ }
+<JavaImport>({ID}{BN}*"."{BN}*)+{ID} { // class import => add as a using declaration
+ lineCount(yyscanner);
+ QCString scope=yytext;
+ yyextra->current->name=removeRedundantWhiteSpace(substitute(scope,".","::"));
+ yyextra->current->fileName = yyextra->yyFileName;
+ if (yyextra->insideD)
+ {
+ yyextra->current->section=Entry::USINGDIR_SEC;
+ }
+ else
+ {
+ //printf("import name = %s -> %s\n",yytext,yyextra->current->name.data());
+ yyextra->current->section=Entry::USINGDECL_SEC;
+ }
yyextra->previous = yyextra->current;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- BEGIN(Using);
- }
-<FindMembers>"using"{BN}+ {
- yyextra->current->startLine=yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- lineCount(yyscanner);
- BEGIN(Using);
- }
-<Using>"namespace"{BN}+ { lineCount(yyscanner); BEGIN(UsingDirective); }
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ BEGIN(Using);
+ }
+<FindMembers>"using"{BN}+ {
+ yyextra->current->startLine=yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ lineCount(yyscanner);
+ BEGIN(Using);
+ }
+<Using>"namespace"{BN}+ { lineCount(yyscanner); BEGIN(UsingDirective); }
<Using>({ID}{BN}*("::"|"."){BN}*)*({ID}|{OPERATOR}) {
lineCount(yyscanner);
- yyextra->current->name=yytext;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->section=Entry::USINGDECL_SEC;
+ yyextra->current->name=yytext;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->section=Entry::USINGDECL_SEC;
yyextra->current->startLine = yyextra->yyLineNr;
yyextra->previous = yyextra->current;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- if (yyextra->insideCS) /* Hack: in C# a using declaration and
- directive have the same syntax, so we
- also add it as a using directive here
- */
- {
- yyextra->current->name=yytext;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->section=Entry::USINGDIR_SEC;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- }
- BEGIN(Using);
- }
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ if (yyextra->insideCS) /* Hack: in C# a using declaration and
+ directive have the same syntax, so we
+ also add it as a using directive here
+ */
+ {
+ yyextra->current->name=yytext;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->section=Entry::USINGDIR_SEC;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ }
+ BEGIN(Using);
+ }
<Using>"=" { // C++11 style template alias?
BEGIN(UsingAlias);
}
-<UsingAlias>";" {
+<UsingAlias>";" {
yyextra->previous->section=Entry::VARIABLE_SEC;
yyextra->previous->type = "typedef "+yyextra->previous->args;
- yyextra->previous->type=yyextra->previous->type.simplifyWhiteSpace();
+ yyextra->previous->type=yyextra->previous->type.simplifyWhiteSpace();
yyextra->previous->args.resize(0);
- yyextra->previous->name=yyextra->previous->name.stripWhiteSpace();
- yyextra->previous->bodyLine = yyextra->yyLineNr;
+ yyextra->previous->name=yyextra->previous->name.stripWhiteSpace();
+ yyextra->previous->bodyLine = yyextra->yyLineNr;
+ yyextra->previous->bodyColumn = yyextra->yyColNr;
yyextra->previous->spec |= Entry::Alias;
- BEGIN(FindMembers);
+ BEGIN(FindMembers);
}
<UsingAlias>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- yyextra->docBlockContext = UsingAliasEnd;
- yyextra->docBlockInBody = FALSE;
- yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
- ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
+ yyextra->docBlockContext = UsingAliasEnd;
+ yyextra->docBlockInBody = FALSE;
+ yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock=indent;
- lineCount(yyscanner);
-
- yyextra->docBlockTerm = ';';
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(yyscanner,TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(yyscanner,FALSE);
- BEGIN( DocBlock );
- }
- }
+ lineCount(yyscanner);
+
+ yyextra->docBlockTerm = ';';
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(yyscanner,TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(yyscanner,FALSE);
+ BEGIN( DocBlock );
+ }
+ }
<UsingAlias>">>" {
yyextra->previous->args+="> >"; // see bug769552
}
@@ -1775,294 +1811,301 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
unput(';');
BEGIN(UsingAlias);
}
-<UsingDirective>{SCOPENAME} { yyextra->current->name=removeRedundantWhiteSpace(yytext);
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->section=Entry::USINGDIR_SEC;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- BEGIN(Using);
- }
-<Using>";" { BEGIN(FindMembers); }
-<FindMembers>{SCOPENAME}{BN}*"<>" { // guided template decl
- QCString n=yytext;
- addType(yyscanner);
- yyextra->current->name=n.left(n.length()-2);
- }
-<FindMembers>{SCOPENAME}{BN}*/"<" { // Note: this could be a return type!
+<UsingDirective>{SCOPENAME} { yyextra->current->name=removeRedundantWhiteSpace(yytext);
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->section=Entry::USINGDIR_SEC;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ BEGIN(Using);
+ }
+<Using>";" { BEGIN(FindMembers); }
+<FindMembers>{SCOPENAME}{BN}*"<>" { // guided template decl
+ QCString n=yytext;
+ addType(yyscanner);
+ yyextra->current->name=n.left(n.length()-2);
+ }
+<FindMembers>{SCOPENAME}{BN}*/"<" { // Note: this could be a return type!
+ yyextra->roundCount=0;
+ yyextra->sharpCount=0;
+ lineCount(yyscanner);
+ addType(yyscanner);
+ yyextra->current->name=yytext;
+ yyextra->current->name=yyextra->current->name.stripWhiteSpace();
+ //yyextra->current->scopeSpec.resize(0);
+ // yyextra->currentTemplateSpec = &yyextra->current->scopeSpec;
+ if (nameIsOperator(yyextra->current->name))
+ BEGIN( Operator );
+ else
+ BEGIN( EndTemplate );
+ }
+<FindMemberName>{SCOPENAME}{BN}*/"<" {
+ yyextra->sharpCount=0;
yyextra->roundCount=0;
- yyextra->sharpCount=0;
- lineCount(yyscanner);
- addType(yyscanner);
- yyextra->current->name=yytext;
- yyextra->current->name=yyextra->current->name.stripWhiteSpace();
- //yyextra->current->scopeSpec.resize(0);
- // yyextra->currentTemplateSpec = &yyextra->current->scopeSpec;
- if (nameIsOperator(yyextra->current->name))
- BEGIN( Operator );
- else
- BEGIN( EndTemplate );
- }
-<FindMemberName>{SCOPENAME}{BN}*/"<" {
- yyextra->sharpCount=0;
- yyextra->roundCount=0;
- lineCount(yyscanner);
- yyextra->current->name+=((QCString)yytext).stripWhiteSpace();
- //yyextra->current->memberSpec.resize(0);
- // yyextra->currentTemplateSpec = &yyextra->current->memberSpec;
- if (nameIsOperator(yyextra->current->name))
- BEGIN( Operator );
- else
- BEGIN( EndTemplate );
- }
-<EndTemplate>"<<<" {
- if (!yyextra->insidePHP)
- {
- REJECT;
- }
- else
- {
+ lineCount(yyscanner);
+ yyextra->current->name+=((QCString)yytext).stripWhiteSpace();
+ //yyextra->current->memberSpec.resize(0);
+ // yyextra->currentTemplateSpec = &yyextra->current->memberSpec;
+ if (nameIsOperator(yyextra->current->name))
+ BEGIN( Operator );
+ else
+ BEGIN( EndTemplate );
+ }
+<EndTemplate>"<<<" {
+ if (!yyextra->insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
yyextra->lastHereDocContext = YY_START;
- BEGIN(HereDoc);
- }
- }
-<ClassTemplSpec,EndTemplate>"<<" {
- yyextra->current->name+=yytext;
- // *yyextra->currentTemplateSpec+=yytext;
- }
-<EndTemplate>"<" {
+ BEGIN(HereDoc);
+ }
+ }
+<ClassTemplSpec,EndTemplate>"<<" {
+ yyextra->current->name+=yytext;
+ // *yyextra->currentTemplateSpec+=yytext;
+ }
+<EndTemplate>"<" {
if (yyextra->roundCount==0)
{
- // *yyextra->currentTemplateSpec+='<';
- yyextra->sharpCount++;
- }
- yyextra->current->name+=yytext;
- }
-<ClassTemplSpec,EndTemplate>">>" {
- if (yyextra->insideJava || yyextra->insideCS || yyextra->insideCli || yyextra->roundCount==0)
- {
- unput('>');
- unput(' ');
- unput('>');
- }
- else
- {
- yyextra->current->name+=yytext;
- }
- // *yyextra->currentTemplateSpec+=yytext;
- }
-<EndTemplate>">" {
- yyextra->current->name+='>';
- // *yyextra->currentTemplateSpec+='>';
- if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
- {
- //printf("Found %s\n",yyextra->current->name.data());
- BEGIN(FindMembers);
- }
- }
-<EndTemplate>">"{BN}*"(" {
- lineCount(yyscanner);
- yyextra->current->name+='>';
- // *yyextra->currentTemplateSpec+='>';
- if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
- {
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->current->args = "(";
- yyextra->currentArgumentContext = FuncQual;
- yyextra->fullArgString = yyextra->current->args.copy();
- yyextra->copyArgString = &yyextra->current->args;
- //printf("Found %s\n",yyextra->current->name.data());
- BEGIN( ReadFuncArgType ) ;
- }
- }
+ // *yyextra->currentTemplateSpec+='<';
+ yyextra->sharpCount++;
+ }
+ yyextra->current->name+=yytext;
+ }
+<ClassTemplSpec,EndTemplate>">>" {
+ if (yyextra->insideJava || yyextra->insideCS || yyextra->insideCli || yyextra->roundCount==0)
+ {
+ unput('>');
+ unput(' ');
+ unput('>');
+ }
+ else
+ {
+ yyextra->current->name+=yytext;
+ }
+ // *yyextra->currentTemplateSpec+=yytext;
+ }
+<EndTemplate>">" {
+ yyextra->current->name+='>';
+ // *yyextra->currentTemplateSpec+='>';
+ if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
+ {
+ //printf("Found %s\n",yyextra->current->name.data());
+ BEGIN(FindMembers);
+ }
+ }
+<EndTemplate>">"{BN}*"(" {
+ lineCount(yyscanner);
+ yyextra->current->name+='>';
+ // *yyextra->currentTemplateSpec+='>';
+ if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
+ {
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->current->args = "(";
+ yyextra->currentArgumentContext = FuncQual;
+ yyextra->fullArgString = yyextra->current->args.copy();
+ yyextra->copyArgString = &yyextra->current->args;
+ //printf("Found %s\n",yyextra->current->name.data());
+ BEGIN( ReadFuncArgType ) ;
+ }
+ }
<EndTemplate>">"{BN}*/"("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+ { // function pointer returning a template instance
- lineCount(yyscanner);
- yyextra->current->name+='>';
+ lineCount(yyscanner);
+ yyextra->current->name+='>';
if (yyextra->roundCount==0)
{
- BEGIN(FindMembers);
- }
- }
-<EndTemplate>">"{BN}*/"::" {
- lineCount(yyscanner);
- yyextra->current->name+='>';
- // *yyextra->currentTemplateSpec+='>';
- if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
- {
- BEGIN(FindMemberName);
- }
- }
+ BEGIN(FindMembers);
+ }
+ }
+<EndTemplate>">"{BN}*/"::" {
+ lineCount(yyscanner);
+ yyextra->current->name+='>';
+ // *yyextra->currentTemplateSpec+='>';
+ if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
+ {
+ BEGIN(FindMemberName);
+ }
+ }
<ClassTemplSpec,EndTemplate>"(" { yyextra->current->name+=*yytext;
- yyextra->roundCount++;
+ yyextra->roundCount++;
}
<ClassTemplSpec,EndTemplate>")" { yyextra->current->name+=*yytext;
- if (yyextra->roundCount>0) yyextra->roundCount--;
- }
-<EndTemplate>. {
- yyextra->current->name+=*yytext;
- // *yyextra->currentTemplateSpec+=*yytext;
- }
-<FindMembers>"define"{BN}*"("{BN}*["'] {
- if (yyextra->insidePHP)
- {
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( DefinePHP );
- }
- else
- REJECT;
- }
+ if (yyextra->roundCount>0) yyextra->roundCount--;
+ }
+<EndTemplate>. {
+ yyextra->current->name+=*yytext;
+ // *yyextra->currentTemplateSpec+=*yytext;
+ }
+<FindMembers>"define"{BN}*"("{BN}*["'] {
+ if (yyextra->insidePHP)
+ {
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( DefinePHP );
+ }
+ else
+ REJECT;
+ }
<CopyHereDoc>{ID} { // PHP heredoc
- yyextra->delimiter = yytext;
+ yyextra->delimiter = yytext;
*yyextra->pCopyHereDocGString += yytext;
- BEGIN(CopyHereDocEnd);
+ BEGIN(CopyHereDocEnd);
}
-<CopyHereDoc>"'"{ID}/"'" { // PHP nowdoc
- yyextra->delimiter = &yytext[1];
+<CopyHereDoc>"'"{ID}/"'" { // PHP nowdoc
+ yyextra->delimiter = &yytext[1];
*yyextra->pCopyHereDocGString += yytext;
- BEGIN(CopyHereDocEnd);
- }
-<HereDoc>{ID} { // PHP heredoc
- yyextra->delimiter = yytext;
- BEGIN(HereDocEnd);
- }
-<HereDoc>"'"{ID}/"'" { // PHP nowdoc
- yyextra->delimiter = &yytext[1];
- BEGIN(HereDocEnd);
- }
-<HereDocEnd>^{ID} { // id at start of the line could mark the end of the block
- if (yyextra->delimiter==yytext) // it is the end marker
- {
- BEGIN(yyextra->lastHereDocContext);
- }
- }
-<HereDocEnd>. { }
-<CopyHereDocEnd>^{ID} { // id at start of the line could mark the end of the block
+ BEGIN(CopyHereDocEnd);
+ }
+<HereDoc>{ID} { // PHP heredoc
+ yyextra->delimiter = yytext;
+ BEGIN(HereDocEnd);
+ }
+<HereDoc>"'"{ID}/"'" { // PHP nowdoc
+ yyextra->delimiter = &yytext[1];
+ BEGIN(HereDocEnd);
+ }
+<HereDocEnd>^{ID} { // id at start of the line could mark the end of the block
+ if (yyextra->delimiter==yytext) // it is the end marker
+ {
+ BEGIN(yyextra->lastHereDocContext);
+ }
+ }
+<HereDocEnd>. { }
+<CopyHereDocEnd>^{ID} { // id at start of the line could mark the end of the block
*yyextra->pCopyHereDocGString += yytext;
- if (yyextra->delimiter==yytext) // it is the end marker
- {
- BEGIN(yyextra->lastHereDocContext);
- }
- }
-<CopyHereDocEnd>\n {
+ if (yyextra->delimiter==yytext) // it is the end marker
+ {
+ BEGIN(yyextra->lastHereDocContext);
+ }
+ }
+<CopyHereDocEnd>\n {
lineCount(yyscanner);
*yyextra->pCopyHereDocGString += yytext;
}
-<CopyHereDocEnd>{ID} {
+<CopyHereDocEnd>{ID} {
*yyextra->pCopyHereDocGString += yytext;
}
-<CopyHereDocEnd>. {
+<CopyHereDocEnd>. {
*yyextra->pCopyHereDocGString += yytext;
}
-<FindMembers>"Q_OBJECT" { // Qt object macro
- }
-<FindMembers>"Q_PROPERTY" { // Qt property declaration
- yyextra->current->protection = Public ; // see bug734245 & bug735462
- yyextra->current->mtype = yyextra->mtype = Property;
- yyextra->current->type.resize(0);
- BEGIN(QtPropType);
- }
-<QtPropType>"(" { // start of property arguments
- }
-<QtPropAttr>")" { // end of property arguments
- unput(';');
- BEGIN(FindMembers);
- }
-<QtPropType>"const"|"volatile"|"unsigned"|"signed"|"long"|"short" {
- yyextra->current->type+=yytext;
- }
-<QtPropType>{B}+ {
- yyextra->current->type+=yytext;
- }
-<QtPropType>({TSCOPE}"::")*{TSCOPE} {
- yyextra->current->type+=yytext;
- BEGIN(QtPropName);
- }
-<QtPropName>{ID} {
- yyextra->current->name=yytext;
- BEGIN(QtPropAttr);
- }
-<QtPropAttr>"READ" {
- yyextra->current->spec |= Entry::Readable;
- BEGIN(QtPropRead);
- }
-<QtPropAttr>"WRITE" {
- yyextra->current->spec |= Entry::Writable;
- BEGIN(QtPropWrite);
- }
-<QtPropAttr>"RESET"{B}+{ID} { // reset method => not supported yet
- }
-<QtPropAttr>"SCRIPTABLE"{B}+{ID} { // scriptable property => not supported yet
- }
-<QtPropAttr>"DESIGNABLE"{B}+{ID} { // designable property => not supported yet
- }
-<QtPropRead>{ID} {
- yyextra->current->read = yytext;
- BEGIN(QtPropAttr);
- }
-<QtPropWrite>{ID} {
- yyextra->current->write = yytext;
- BEGIN(QtPropAttr);
- }
+<FindMembers>"Q_OBJECT" { // Qt object macro
+ }
+<FindMembers>"Q_PROPERTY" { // Qt property declaration
+ yyextra->current->protection = Public ; // see bug734245 & bug735462
+ yyextra->current->mtype = yyextra->mtype = Property;
+ yyextra->current->type.resize(0);
+ BEGIN(QtPropType);
+ }
+<QtPropType>"(" { // start of property arguments
+ }
+<QtPropAttr>")" { // end of property arguments
+ unput(';');
+ BEGIN(FindMembers);
+ }
+<QtPropType>{B}+ {
+ yyextra->current->name+=yytext;
+ }
+<QtPropType>"*" {
+ yyextra->current->type+= yyextra->current->name;
+ yyextra->current->type+= yytext;
+ yyextra->current->name="";
+ }
+<QtPropType>({TSCOPE}"::")*{TSCOPE} {
+ yyextra->current->type+= yyextra->current->name;
+ yyextra->current->name=yytext;
+ }
+<QtPropType,QtPropAttr>{B}+"READ"{B}+ {
+ yyextra->current->spec |= Entry::Readable;
+ BEGIN(QtPropRead);
+ }
+<QtPropType,QtPropAttr>{B}+"WRITE"{B}+ {
+ yyextra->current->spec |= Entry::Writable;
+ BEGIN(QtPropWrite);
+ }
+<QtPropType,QtPropAttr>{B}+"MEMBER"{B}+{ID} | // member property => not supported yet
+<QtPropType,QtPropAttr>{B}+"RESET"{B}+{ID} | // reset method => not supported yet
+<QtPropType,QtPropAttr>{B}+"SCRIPTABLE"{B}+{ID} | // scriptable property => not supported yet
+<QtPropType,QtPropAttr>{B}+"DESIGNABLE"{B}+{ID} | // designable property => not supported yet
+<QtPropType,QtPropAttr>{B}+"NOTIFY"{B}+{ID} | // notify property => not supported yet
+<QtPropType,QtPropAttr>{B}+"REVISION"{B}+{ID} | // revision property => not supported yet
+<QtPropType,QtPropAttr>{B}+"STORED"{B}+{ID} | // stored property => not supported yet
+<QtPropType,QtPropAttr>{B}+"USER"{B}+{ID} | // user property => not supported yet
+<QtPropType,QtPropAttr>{B}+"CONSTANT"{B} | // constant property => not supported yet
+<QtPropType,QtPropAttr>{B}+"FINAL"{B} { // final property => not supported yet
+ BEGIN(QtPropAttr);
+ }
+<QtPropRead>{ID} {
+ yyextra->current->read = yytext;
+ BEGIN(QtPropAttr);
+ }
+<QtPropWrite>{ID} {
+ yyextra->current->write = yytext;
+ BEGIN(QtPropAttr);
+ }
<FindMembers>"friend"{BN}+("class"|"union"|"struct"){BN}+ {
- yyextra->current->name=yytext;
- BEGIN(FindMembers);
- }
-<FindMembers,FindMemberName>{SCOPENAME} {
- if (yyextra->insideCpp || yyextra->insideObjC)
+ yyextra->current->name=yytext;
+ BEGIN(FindMembers);
+ }
+<FindMembers,FindMemberName>{SCOPENAME} {
+
+ if (yyextra->clangParser && (yyextra->insideCpp || yyextra->insideObjC))
{
- yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext);
+ yyextra->current->id = yyextra->clangParser->lookup(yyextra->yyLineNr,yytext);
}
- yyextra->yyBegColNr=yyextra->yyColNr;
- yyextra->yyBegLineNr=yyextra->yyLineNr;
- lineCount(yyscanner);
+ yyextra->yyBegColNr=yyextra->yyColNr;
+ yyextra->yyBegLineNr=yyextra->yyLineNr;
+ lineCount(yyscanner);
if (yyextra->insideIDL && yyleng==9 && qstrcmp(yytext,"cpp_quote")==0)
- {
- BEGIN(CppQuote);
- }
- else if ((yyextra->insideIDL || yyextra->insideJava || yyextra->insideD) && yyleng==6 && qstrcmp(yytext,"import")==0)
- {
- if (yyextra->insideIDL)
- BEGIN(NextSemi);
- else // yyextra->insideJava or yyextra->insideD
- BEGIN(JavaImport);
- }
- else if (yyextra->insidePHP && qstrcmp(yytext,"use")==0)
- {
- BEGIN(PHPUse);
- }
- else if (yyextra->insideJava && qstrcmp(yytext,"package")==0)
- {
- lineCount(yyscanner);
- BEGIN(PackageName);
- }
- else if (yyextra->insideIDL && qstrcmp(yytext,"case")==0)
- {
- BEGIN(IDLUnionCase);
- }
- else if (yyextra->insideTryBlock && qstrcmp(yytext,"catch")==0)
- {
- yyextra->insideTryBlock=FALSE;
- BEGIN(TryFunctionBlock);
- }
+ {
+ BEGIN(CppQuote);
+ }
+ else if ((yyextra->insideIDL || yyextra->insideJava || yyextra->insideD) && yyleng==6 && qstrcmp(yytext,"import")==0)
+ {
+ if (yyextra->insideIDL)
+ BEGIN(NextSemi);
+ else // yyextra->insideJava or yyextra->insideD
+ BEGIN(JavaImport);
+ }
+ else if (yyextra->insidePHP && qstrcmp(yytext,"use")==0)
+ {
+ BEGIN(PHPUse);
+ }
+ else if (yyextra->insideJava && qstrcmp(yytext,"package")==0)
+ {
+ lineCount(yyscanner);
+ BEGIN(PackageName);
+ }
+ else if (yyextra->insideIDL && qstrcmp(yytext,"case")==0)
+ {
+ BEGIN(IDLUnionCase);
+ }
+ else if (yyextra->insideTryBlock && qstrcmp(yytext,"catch")==0)
+ {
+ yyextra->insideTryBlock=FALSE;
+ BEGIN(TryFunctionBlock);
+ }
else if (yyextra->insideCpp && qstrcmp(yytext,"alignas")==0)
{
yyextra->lastAlignAsContext = YY_START;
BEGIN(AlignAs);
}
- else if (yyextra->insideJS && qstrcmp(yytext,"var")==0)
- { // javascript variable
- yyextra->current->type="var";
- }
- else if (yyextra->insideJS && qstrcmp(yytext,"function")==0)
- { // javascript function
- yyextra->current->type="function";
- }
- else if (yyextra->insideCS && qstrcmp(yytext,"this")==0)
- {
- // C# indexer
- addType(yyscanner);
- yyextra->current->name="this";
- BEGIN(CSIndexer);
- }
+ else if (yyextra->insideJS && qstrcmp(yytext,"var")==0)
+ { // javascript variable
+ yyextra->current->type="var";
+ }
+ else if (yyextra->insideJS && qstrcmp(yytext,"function")==0)
+ { // javascript function
+ yyextra->current->type="function";
+ }
+ else if (yyextra->insideCS && qstrcmp(yytext,"this")==0)
+ {
+ // C# indexer
+ addType(yyscanner);
+ yyextra->current->name="this";
+ BEGIN(CSIndexer);
+ }
else if (yyextra->insideCpp && qstrcmp(yytext,"static_assert")==0)
{
// C++11 static_assert
@@ -2071,7 +2114,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
else if (yyextra->insideCpp && qstrcmp(yytext,"decltype")==0)
{
// C++11 decltype(x)
- yyextra->current->type+=yytext;
+ yyextra->current->type+=yytext;
BEGIN(DeclType);
}
else if (yyextra->insideSlice && qstrcmp(yytext,"optional")==0)
@@ -2087,88 +2130,88 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
yyextra->lastModifierContext = YY_START;
BEGIN(SliceOptional);
}
- else
- {
- if (YY_START==FindMembers)
- {
- addType(yyscanner);
- }
- bool javaLike = yyextra->insideJava || yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideJS;
- if (javaLike && qstrcmp(yytext,"public")==0)
- {
- yyextra->current->protection = Public;
- }
- else if (javaLike && qstrcmp(yytext,"protected")==0)
- {
- yyextra->current->protection = Protected;
- }
- else if ((yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideJS) && qstrcmp(yytext,"internal")==0)
- {
- yyextra->current->protection = Package;
- }
- else if (javaLike && qstrcmp(yytext,"private")==0)
- {
- yyextra->current->protection = Private;
- }
- else if (javaLike && qstrcmp(yytext,"static")==0)
- {
- if (YY_START==FindMembers)
- yyextra->current->name = yytext;
- else
- yyextra->current->name += yytext;
- yyextra->current->stat = TRUE;
- }
- else
- {
- if (YY_START==FindMembers)
- yyextra->current->name = yytext;
- else
- yyextra->current->name += yytext;
- if (yyextra->current->name.left(7)=="static ")
- {
- yyextra->current->stat = TRUE;
- yyextra->current->name= yyextra->current->name.mid(7);
- }
- else if (yyextra->current->name.left(7)=="inline ")
- {
- if (yyextra->current->type.isEmpty())
- {
- yyextra->current->type="inline";
- }
- else
- {
- yyextra->current->type+="inline ";
- }
- yyextra->current->name= yyextra->current->name.mid(7);
- }
- else if (yyextra->current->name.left(6)=="const ")
- {
- if (yyextra->current->type.isEmpty())
- {
- yyextra->current->type="const";
- }
- else
- {
- yyextra->current->type+="const ";
- }
- yyextra->current->name=yyextra->current->name.mid(6);
- }
- }
- QCString tmp=yytext;
- if (nameIsOperator(tmp))
+ else
+ {
+ if (YY_START==FindMembers)
+ {
+ addType(yyscanner);
+ }
+ bool javaLike = yyextra->insideJava || yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideJS;
+ if (javaLike && qstrcmp(yytext,"public")==0)
{
- BEGIN( Operator );
+ yyextra->current->protection = Public;
}
- else
+ else if (javaLike && qstrcmp(yytext,"protected")==0)
{
- yyextra->externC=FALSE; // see bug759247
- BEGIN(FindMembers);
+ yyextra->current->protection = Protected;
}
- }
- }
+ else if ((yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideJS) && qstrcmp(yytext,"internal")==0)
+ {
+ yyextra->current->protection = Package;
+ }
+ else if (javaLike && qstrcmp(yytext,"private")==0)
+ {
+ yyextra->current->protection = Private;
+ }
+ else if (javaLike && qstrcmp(yytext,"static")==0)
+ {
+ if (YY_START==FindMembers)
+ yyextra->current->name = yytext;
+ else
+ yyextra->current->name += yytext;
+ yyextra->current->stat = TRUE;
+ }
+ else
+ {
+ if (YY_START==FindMembers)
+ yyextra->current->name = yytext;
+ else
+ yyextra->current->name += yytext;
+ if (yyextra->current->name.left(7)=="static ")
+ {
+ yyextra->current->stat = TRUE;
+ yyextra->current->name= yyextra->current->name.mid(7);
+ }
+ else if (yyextra->current->name.left(7)=="inline ")
+ {
+ if (yyextra->current->type.isEmpty())
+ {
+ yyextra->current->type="inline";
+ }
+ else
+ {
+ yyextra->current->type+="inline ";
+ }
+ yyextra->current->name= yyextra->current->name.mid(7);
+ }
+ else if (yyextra->current->name.left(6)=="const ")
+ {
+ if (yyextra->current->type.isEmpty())
+ {
+ yyextra->current->type="const";
+ }
+ else
+ {
+ yyextra->current->type+="const ";
+ }
+ yyextra->current->name=yyextra->current->name.mid(6);
+ }
+ }
+ QCString tmp=yytext;
+ if (nameIsOperator(tmp))
+ {
+ BEGIN( Operator );
+ }
+ else
+ {
+ yyextra->externC=FALSE; // see bug759247
+ BEGIN(FindMembers);
+ }
+ }
+ }
<StaticAssert>"(" {
- yyextra->lastSkipRoundContext = FindMembers;
- yyextra->roundCount=0;
+ yyextra->lastSkipRoundContext = FindMembers;
+ yyextra->roundCount=0;
BEGIN(SkipRound);
}
<StaticAssert>{BN}+ { lineCount(yyscanner); }
@@ -2177,10 +2220,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
BEGIN(FindMembers);
}
<DeclType>"(" {
- yyextra->current->type+=yytext;
- yyextra->lastRoundContext=FindMembers;
- yyextra->pCopyRoundString=&yyextra->current->type;
- yyextra->roundCount=0;
+ yyextra->current->type+=yytext;
+ yyextra->lastRoundContext=FindMembers;
+ yyextra->pCopyRoundString=&yyextra->current->type;
+ yyextra->roundCount=0;
BEGIN(CopyRound);
}
<DeclType>{BN}+ { lineCount(yyscanner); }
@@ -2188,426 +2231,446 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
unput(*yytext);
BEGIN(FindMembers);
}
-<CSIndexer>"["[^\n\]]*"]" {
- yyextra->current->name+=removeRedundantWhiteSpace(yytext);
- BEGIN(FindMembers);
- }
-<FindMembers>[0-9]{ID} { // some number where we did not expect one
- }
-<FindMembers>"." {
- if (yyextra->insideJava || yyextra->insideCS || yyextra->insideD)
- {
- yyextra->current->name+=".";
- }
- }
-<FindMembers>"::" {
- yyextra->current->name+=yytext;
- }
-<CppQuote>"("{B}*"\"" {
- yyextra->insideCppQuote=TRUE;
- BEGIN(FindMembers);
- }
+<CSIndexer>"["[^\n\]]*"]" {
+ yyextra->current->name+=removeRedundantWhiteSpace(yytext);
+ BEGIN(FindMembers);
+ }
+<FindMembers>[0-9]{ID} { // some number where we did not expect one
+ }
+<FindMembers>"." {
+ if (yyextra->insideJava || yyextra->insideCS || yyextra->insideD)
+ {
+ yyextra->current->name+=".";
+ }
+ }
+<FindMembers>"::" {
+ yyextra->current->name+=yytext;
+ }
+<CppQuote>"("{B}*"\"" {
+ yyextra->insideCppQuote=TRUE;
+ BEGIN(FindMembers);
+ }
<IDLUnionCase>"::"
-<IDLUnionCase>":" { BEGIN(FindMembers); }
-<IDLUnionCase>\n { lineCount(yyscanner); }
+<IDLUnionCase>":" { BEGIN(FindMembers); }
+<IDLUnionCase>\n { lineCount(yyscanner); }
<IDLUnionCase>.
-<TryFunctionBlock>\n { lineCount(yyscanner); }
-<TryFunctionBlock>"{" {
- yyextra->curlyCount=0;
- yyextra->lastCurlyContext = TryFunctionBlockEnd ;
- BEGIN( SkipCurly );
- }
+<TryFunctionBlock>\n { lineCount(yyscanner); }
+<TryFunctionBlock>"{" {
+ yyextra->curlyCount=0;
+ yyextra->lastCurlyContext = TryFunctionBlockEnd ;
+ BEGIN( SkipCurly );
+ }
<TryFunctionBlock>.
-<TryFunctionBlockEnd>{BN}*"catch" { lineCount(yyscanner); BEGIN(TryFunctionBlock); // {BN}* added to fix bug 611193
- }
-<TryFunctionBlockEnd>\n { unput(*yytext); // rule added to fix bug id 601138
- BEGIN( FindMembers );
- }
-<TryFunctionBlockEnd>. { unput(*yytext);
- BEGIN( FindMembers );
- }
-<EndCppQuote>")" {
- yyextra->insideCppQuote=FALSE;
- BEGIN(FindMembers);
- }
-<FindMembers,FindFields>{B}*"#" { if (yyextra->insidePHP)
- REJECT;
- yyextra->lastCPPContext = YY_START;
- BEGIN( SkipCPP ) ;
- }
-<FindMembers,FindFields>{B}*"#"{B}*("cmake")?"define" {
- if (yyextra->insidePHP)
- REJECT;
- yyextra->current->bodyLine = yyextra->yyLineNr;
+<TryFunctionBlockEnd>{BN}*"catch" { lineCount(yyscanner); BEGIN(TryFunctionBlock); // {BN}* added to fix bug 611193
+ }
+<TryFunctionBlockEnd>\n { unput(*yytext); // rule added to fix bug id 601138
+ BEGIN( FindMembers );
+ }
+<TryFunctionBlockEnd>. { unput(*yytext);
+ BEGIN( FindMembers );
+ }
+<EndCppQuote>")" {
+ yyextra->insideCppQuote=FALSE;
+ BEGIN(FindMembers);
+ }
+<FindMembers,FindFields>{B}*"#" { if (yyextra->insidePHP)
+ REJECT;
+ yyextra->lastCPPContext = YY_START;
+ BEGIN( SkipCPP ) ;
+ }
+<FindMembers,FindFields>{B}*"#"{B}*("cmake")?"define" {
+ if (yyextra->insidePHP)
+ REJECT;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
yyextra->lastDefineContext = YY_START;
- BEGIN( Define );
- }
-<FindMembers,ReadBody,ReadNSBody,ReadBodyIntf,SkipCurly,SkipCurlyCpp>{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */
+ BEGIN( Define );
+ }
+<FindMembers,ReadBody,ReadNSBody,ReadBodyIntf,SkipCurly,SkipCurlyCpp>{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */
yyextra->yyLineNr = atoi(&yytext[1]);
- //printf("setting line number to %d\n",yyextra->yyLineNr);
- yyextra->lastPreLineCtrlContext = YY_START;
- if (YY_START==ReadBody ||
- YY_START==ReadNSBody ||
- YY_START==ReadBodyIntf)
- {
- yyextra->current->program+=yytext;
- }
- BEGIN( PreLineCtrl );
- }
-<PreLineCtrl>"\""[^\n\"]*"\"" {
- yyextra->yyFileName = stripQuotes(yytext);
- if (yyextra->lastPreLineCtrlContext==ReadBody ||
- yyextra->lastPreLineCtrlContext==ReadNSBody ||
- yyextra->lastPreLineCtrlContext==ReadBodyIntf)
- {
- yyextra->current->program+=yytext;
- }
- }
-<PreLineCtrl>. {
- if (yyextra->lastPreLineCtrlContext==ReadBody ||
- yyextra->lastPreLineCtrlContext==ReadNSBody ||
- yyextra->lastPreLineCtrlContext==ReadBodyIntf)
- {
- yyextra->current->program+=yytext;
- }
- }
-<PreLineCtrl>\n {
- if (yyextra->lastPreLineCtrlContext==ReadBody ||
- yyextra->lastPreLineCtrlContext==ReadNSBody ||
- yyextra->lastPreLineCtrlContext==ReadBodyIntf)
- {
- yyextra->current->program+=yytext;
- }
+ //printf("setting line number to %d\n",yyextra->yyLineNr);
+ yyextra->lastPreLineCtrlContext = YY_START;
+ if (YY_START==ReadBody ||
+ YY_START==ReadNSBody ||
+ YY_START==ReadBodyIntf)
+ {
+ yyextra->current->program+=yytext;
+ }
+ BEGIN( PreLineCtrl );
+ }
+<PreLineCtrl>"\""[^\n\"]*"\"" {
+ yyextra->yyFileName = stripQuotes(yytext);
+ if (yyextra->lastPreLineCtrlContext==ReadBody ||
+ yyextra->lastPreLineCtrlContext==ReadNSBody ||
+ yyextra->lastPreLineCtrlContext==ReadBodyIntf)
+ {
+ yyextra->current->program+=yytext;
+ }
+ }
+<PreLineCtrl>. {
+ if (yyextra->lastPreLineCtrlContext==ReadBody ||
+ yyextra->lastPreLineCtrlContext==ReadNSBody ||
+ yyextra->lastPreLineCtrlContext==ReadBodyIntf)
+ {
+ yyextra->current->program+=yytext;
+ }
+ }
+<PreLineCtrl>\n {
+ if (yyextra->lastPreLineCtrlContext==ReadBody ||
+ yyextra->lastPreLineCtrlContext==ReadNSBody ||
+ yyextra->lastPreLineCtrlContext==ReadBodyIntf)
+ {
+ yyextra->current->program+=yytext;
+ }
lineCount(yyscanner);
- BEGIN( yyextra->lastPreLineCtrlContext );
- }
+ BEGIN( yyextra->lastPreLineCtrlContext );
+ }
<SkipCPP>.
-<SkipCPP>\\[\r]*"\n"[\r]* { lineCount(yyscanner); }
-<SkipCPP>[\r]*\n[\r]* { lineCount(yyscanner);
- BEGIN( yyextra->lastCPPContext) ;
- }
-<Define>{ID}{B}*"(" {
- yyextra->current->name = yytext;
- yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
- yyextra->current->args = "(";
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->currentArgumentContext = DefineEnd;
- yyextra->fullArgString=yyextra->current->args.copy();
- yyextra->copyArgString=&yyextra->current->args;
- BEGIN( ReadFuncArgType ) ;
- }
+<SkipCPP>\\[\r]*"\n"[\r]* { lineCount(yyscanner); }
+<SkipCPP>[\r]*\n[\r]* { lineCount(yyscanner);
+ BEGIN( yyextra->lastCPPContext) ;
+ }
+<Define>{ID}{B}*"(" {
+ yyextra->current->name = yytext;
+ yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
+ yyextra->current->args = "(";
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->currentArgumentContext = DefineEnd;
+ yyextra->fullArgString=yyextra->current->args.copy();
+ yyextra->copyArgString=&yyextra->current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
/*
-<DefineArg>")" {
- //printf("Define with args\n");
- yyextra->current->args += ')';
- BEGIN( DefineEnd );
- }
-<DefineArg>. {
- yyextra->current->args += *yytext;
- }
+<DefineArg>")" {
+ //printf("Define with args\n");
+ yyextra->current->args += ')';
+ BEGIN( DefineEnd );
+ }
+<DefineArg>. {
+ yyextra->current->args += *yytext;
+ }
*/
-<Define>{ID} {
- //printf("Define '%s' without args\n",yytext);
- if (yyextra->insideCpp || yyextra->insideObjC)
- {
- yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext);
- }
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->current->name = yytext;
- BEGIN(DefineEnd);
- }
-<DefineEnd>\n {
- //printf("End define: doc=%s docFile=%s docLine=%d\n",yyextra->current->doc.data(),yyextra->current->docFile.data(),yyextra->current->docLine);
+<Define>{ID} {
+ //printf("Define '%s' without args\n",yytext);
+ if (yyextra->clangParser && (yyextra->insideCpp || yyextra->insideObjC))
+ {
+ yyextra->current->id = yyextra->clangParser->lookup(yyextra->yyLineNr,yytext);
+ }
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->current->name = yytext;
+ BEGIN(DefineEnd);
+ }
+<DefineEnd>\n {
+ //printf("End define: doc=%s docFile=%s docLine=%d\n",yyextra->current->doc.data(),yyextra->current->docFile.data(),yyextra->current->docLine);
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->type.resize(0);
+ yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ yyextra->current->section = Entry::DEFINE_SEC;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
lineCount(yyscanner);
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->type.resize(0);
- yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- yyextra->current->section = Entry::DEFINE_SEC;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- BEGIN(yyextra->lastDefineContext);
- }
-<DefinePHPEnd>";" {
- //printf("End define\n");
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->type.resize(0);
+ initEntry(yyscanner);
+ BEGIN(yyextra->lastDefineContext);
+ }
+<DefinePHPEnd>";" {
+ //printf("End define\n");
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->type.resize(0);
yyextra->current->type = "const";
QCString init = yyextra->current->initializer.data();
- init = init.simplifyWhiteSpace();
- init = init.left(init.length()-1);
+ init = init.simplifyWhiteSpace();
+ init = init.left(init.length()-1);
yyextra->current->initializer = init;
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- yyextra->current->section = Entry::VARIABLE_SEC;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- BEGIN(FindMembers);
- }
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ yyextra->current->section = Entry::VARIABLE_SEC;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ BEGIN(FindMembers);
+ }
<DefinePHPEnd>.
-<DefineEnd>\\[\r]?\n {
+<DefineEnd>\\[\r]?\n {
lineCount(yyscanner);
- }
-<DefineEnd>\" {
- if (yyextra->insideIDL && yyextra->insideCppQuote)
- {
- BEGIN(EndCppQuote);
- }
- else
- {
- yyextra->lastStringContext=DefineEnd;
- BEGIN(SkipString);
- }
- }
-<DefineEnd>.
-<DefinePHP>{ID}["']{BN}*","{BN}* {
- yyextra->current->name = yytext;
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
- yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1);
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->lastRoundContext = DefinePHPEnd;
- yyextra->pCopyRoundGString = &yyextra->current->initializer;
- yyextra->roundCount = 0;
- BEGIN( GCopyRound );
- }
-
-<FindMembers>[\^%] { // ^ and % are C++/CLI extensions
- if (yyextra->insideCli)
- {
- addType(yyscanner);
- yyextra->current->name = yytext ;
- }
- else
- {
- REJECT;
- }
- }
-<FindMembers>[*&]+ {
- yyextra->current->name += yytext ;
- addType(yyscanner);
- }
-<FindMembers,MemberSpec,Function,NextSemi,EnumBaseType,BitFields,ReadInitializer,OldStyleArgs,DefinePHPEnd>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- if (yyextra->current->bodyLine==-1)
- {
- yyextra->current->bodyLine=yyextra->yyLineNr;
- }
- yyextra->docBlockContext = YY_START;
- yyextra->docBlockInBody = FALSE;
- yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
- ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
+ }
+<DefineEnd>\" {
+ if (yyextra->insideIDL && yyextra->insideCppQuote)
+ {
+ BEGIN(EndCppQuote);
+ }
+ else
+ {
+ yyextra->lastStringContext=DefineEnd;
+ BEGIN(SkipString);
+ }
+ }
+<DefineEnd>.
+<DefinePHP>{ID}["']{BN}*","{BN}* {
+ yyextra->current->name = yytext;
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
+ yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1);
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->lastRoundContext = DefinePHPEnd;
+ yyextra->pCopyRoundGString = &yyextra->current->initializer;
+ yyextra->roundCount = 0;
+ BEGIN( GCopyRound );
+ }
+
+<FindMembers>[\^%] { // ^ and % are C++/CLI extensions
+ if (yyextra->insideCli)
+ {
+ addType(yyscanner);
+ yyextra->current->name = yytext ;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<FindMembers>[*&]+ {
+ yyextra->current->name += yytext ;
+ addType(yyscanner);
+ }
+<FindMembers,MemberSpec,Function,NextSemi,EnumBaseType,BitFields,ReadInitializer,ReadInitializerPtr,OldStyleArgs,DefinePHPEnd>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
+ if (yyextra->current->bodyLine==-1)
+ {
+ yyextra->current->bodyLine=yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ }
+ yyextra->docBlockContext = YY_START;
+ yyextra->docBlockInBody = FALSE;
+ yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock=indent;
//printf("indent=%d\n",computeIndent(yytext+1,yyextra->column));
- lineCount(yyscanner);
+ lineCount(yyscanner);
- yyextra->docBlockTerm = ';';
+ yyextra->docBlockTerm = ';';
if (YY_START==EnumBaseType && yyextra->current->section==Entry::ENUM_SEC)
{
yyextra->current->bitfields = ":"+yyextra->current->args;
yyextra->current->args.resize(0);
yyextra->current->section=Entry::VARIABLE_SEC;
}
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(yyscanner,TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(yyscanner,FALSE);
- BEGIN( DocBlock );
- }
- }
-<MemberSpec,FindFields,FindMembers,NextSemi,EnumBaseType,BitFields,ReadInitializer,OldStyleArgs>","{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- yyextra->docBlockContext = YY_START;
- yyextra->docBlockInBody = FALSE;
- yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
- ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(yyscanner,TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(yyscanner,FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+<MemberSpec,FindFields,FindMembers,NextSemi,EnumBaseType,BitFields,ReadInitializer,ReadInitializerPtr,OldStyleArgs>","{BN}*("/**"|"//!"|"/*!"|"///")"<" {
+ yyextra->docBlockContext = YY_START;
+ yyextra->docBlockInBody = FALSE;
+ yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock=indent;
- lineCount(yyscanner);
+ lineCount(yyscanner);
- yyextra->docBlockTerm = ',';
+ yyextra->docBlockTerm = ',';
if (YY_START==EnumBaseType && yyextra->current->section==Entry::ENUM_SEC)
{
yyextra->current->bitfields = ":"+yyextra->current->args;
yyextra->current->args.resize(0);
yyextra->current->section=Entry::VARIABLE_SEC;
}
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(yyscanner,TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(yyscanner,FALSE);
- BEGIN( DocBlock );
- }
- }
-<DefineEnd,FindFields,FindFieldArg,ReadInitializer,OldStyleArgs>{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- if (yyextra->current->bodyLine==-1)
- {
- yyextra->current->bodyLine=yyextra->yyLineNr;
- }
- yyextra->docBlockContext = YY_START;
- yyextra->docBlockInBody = FALSE;
- yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
- ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(yyscanner,TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(yyscanner,FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+<DefineEnd,FindFields,FindFieldArg,ReadInitializer,ReadInitializerPtr,OldStyleArgs>{BN}*("/**"|"//!"|"/*!"|"///")"<" {
+ if (yyextra->current->bodyLine==-1)
+ {
+ yyextra->current->bodyLine=yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ }
+ yyextra->docBlockContext = YY_START;
+ yyextra->docBlockInBody = FALSE;
+ yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock=indent;
- lineCount(yyscanner);
-
- yyextra->docBlockTerm = 0;
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(yyscanner,TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(yyscanner,FALSE);
- BEGIN( DocBlock );
- }
- }
-
-<FindMembers,FindFields>("//"([!/]){B}*{CMD}"{")|("/*"([!*]){B}*{CMD}"{") {
- //handleGroupStartCommand(yyextra->current->name);
+ lineCount(yyscanner);
+
+ yyextra->docBlockTerm = 0;
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(yyscanner,TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(yyscanner,FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+
+<FindMembers,FindFields>("//"([!/]){B}*{CMD}"{")|("/*"([!*]){B}*{CMD}"{") {
+ //handleGroupStartCommand(yyextra->current->name);
if (yyextra->previous && yyextra->previous->section==Entry::GROUPDOC_SEC)
- {
- // link open command to the group defined in the yyextra->previous entry
- Doxygen::docGroup.open(yyextra->previous.get(),yyextra->yyFileName,yyextra->yyLineNr);
- }
- else
- {
- // link open command to the yyextra->current entry
- Doxygen::docGroup.open(yyextra->current.get(),yyextra->yyFileName,yyextra->yyLineNr);
- }
- //yyextra->current = tmp;
- initEntry(yyscanner);
- if (yytext[1]=='/')
- {
- if (yytext[2]=='!' || yytext[2]=='/')
- {
- yyextra->docBlockContext = YY_START;
- yyextra->docBlockInBody = FALSE;
- yyextra->docBlockAutoBrief = FALSE;
- yyextra->docBlock.resize(0);
- yyextra->docBlockTerm = 0;
- startCommentBlock(yyscanner,TRUE);
- BEGIN(DocLine);
- }
- else
- {
- yyextra->lastCContext=YY_START;
- BEGIN(SkipCxxComment);
- }
- }
- else
- {
- if (yytext[2]=='!' || yytext[2]=='*')
- {
- yyextra->docBlockContext = YY_START;
- yyextra->docBlockInBody = FALSE;
- yyextra->docBlock.resize(0);
- yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
- ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
- yyextra->docBlockTerm = 0;
- startCommentBlock(yyscanner,FALSE);
- BEGIN(DocBlock);
- }
- else
- {
- yyextra->lastCContext=YY_START;
- BEGIN(SkipComment);
- }
- }
- }
-<FindMembers,FindFields,ReadInitializer>"//"([!/]){B}*{CMD}"}".*|"/*"([!*]){B}*{CMD}"}"[^*]*"*/" {
- bool insideEnum = YY_START==FindFields || (YY_START==ReadInitializer && yyextra->lastInitializerContext==FindFields); // see bug746226
- Doxygen::docGroup.close(yyextra->current.get(),yyextra->yyFileName,yyextra->yyLineNr,insideEnum);
- lineCount(yyscanner);
- }
-<FindMembers>"=" { // in PHP code this could also be due to "<?="
- yyextra->current->bodyLine = yyextra->yyLineNr;
+ {
+ // link open command to the group defined in the yyextra->previous entry
+ yyextra->commentScanner.open(yyextra->previous.get(),yyextra->yyFileName,yyextra->yyLineNr);
+ }
+ else
+ {
+ // link open command to the yyextra->current entry
+ yyextra->commentScanner.open(yyextra->current.get(),yyextra->yyFileName,yyextra->yyLineNr);
+ }
+ //yyextra->current = tmp;
+ initEntry(yyscanner);
+ if (yytext[1]=='/')
+ {
+ if (yytext[2]=='!' || yytext[2]=='/')
+ {
+ yyextra->docBlockContext = YY_START;
+ yyextra->docBlockInBody = FALSE;
+ yyextra->docBlockAutoBrief = FALSE;
+ yyextra->docBlock.resize(0);
+ yyextra->docBlockTerm = 0;
+ startCommentBlock(yyscanner,TRUE);
+ BEGIN(DocLine);
+ }
+ else
+ {
+ yyextra->lastCContext=YY_START;
+ BEGIN(SkipCxxComment);
+ }
+ }
+ else
+ {
+ if (yytext[2]=='!' || yytext[2]=='*')
+ {
+ yyextra->docBlockContext = YY_START;
+ yyextra->docBlockInBody = FALSE;
+ yyextra->docBlock.resize(0);
+ yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
+ yyextra->docBlockTerm = 0;
+ startCommentBlock(yyscanner,FALSE);
+ BEGIN(DocBlock);
+ }
+ else
+ {
+ yyextra->lastCContext=YY_START;
+ BEGIN(SkipComment);
+ }
+ }
+ }
+<FindMembers,FindFields,ReadInitializer,ReadInitializerPtr>"//"([!/]){B}*{CMD}"}".*|"/*"([!*]){B}*{CMD}"}"[^*]*"*/" {
+ bool insideEnum = YY_START==FindFields || ((YY_START==ReadInitializer || YY_START==ReadInitializerPtr) && yyextra->lastInitializerContext==FindFields); // see bug746226
+ yyextra->commentScanner.close(yyextra->current.get(),yyextra->yyFileName,yyextra->yyLineNr,insideEnum);
+ lineCount(yyscanner);
+ }
+<FindMembers>"=>" {
+ if (!yyextra->insideCS) REJECT;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->current->initializer = yytext;
+ yyextra->lastInitializerContext = YY_START;
+ yyextra->initBracketCount=0;
+ yyextra->current->mtype = yyextra->mtype = Property;
+ yyextra->current->spec |= Entry::Gettable;
+ BEGIN(ReadInitializerPtr);
+ }
+<FindMembers>"=" { // in PHP code this could also be due to "<?="
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
yyextra->current->initializer = yytext;
- yyextra->lastInitializerContext = YY_START;
- yyextra->initBracketCount=0;
- BEGIN(ReadInitializer);
- }
-<UNOIDLAttributeBlock>{BN}*[gs]"et"{BN}+"raises"{BN}*"("{BN}*{SCOPENAME}{BN}*(","{BN}*{SCOPENAME}{BN}*)*")"{BN}*";" {
- lineCount(yyscanner);
- yyextra->current->exception += " ";
- yyextra->current->exception += removeRedundantWhiteSpace(yytext);
- }
-<UNOIDLAttributeBlock>"}" {
- yyextra->current->exception += " }";
- BEGIN(FindMembers);
- }
+ yyextra->lastInitializerContext = YY_START;
+ yyextra->initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+<UNOIDLAttributeBlock>{BN}*[gs]"et"{BN}+"raises"{BN}*"("{BN}*{SCOPENAME}{BN}*(","{BN}*{SCOPENAME}{BN}*)*")"{BN}*";" {
+ lineCount(yyscanner);
+ yyextra->current->exception += " ";
+ yyextra->current->exception += removeRedundantWhiteSpace(yytext);
+ }
+<UNOIDLAttributeBlock>"}" {
+ yyextra->current->exception += " }";
+ BEGIN(FindMembers);
+ }
/* Read initializer rules */
-<ReadInitializer>"(" {
- yyextra->lastRoundContext=YY_START;
- yyextra->pCopyRoundGString=&yyextra->current->initializer;
- yyextra->roundCount=0;
- yyextra->current->initializer+=*yytext;
- BEGIN(GCopyRound);
- }
-<ReadInitializer>"[" {
+<ReadInitializer,ReadInitializerPtr>"(" {
+ yyextra->lastRoundContext=YY_START;
+ yyextra->pCopyRoundGString=&yyextra->current->initializer;
+ yyextra->roundCount=0;
+ yyextra->current->initializer+=*yytext;
+ BEGIN(GCopyRound);
+ }
+<ReadInitializer,ReadInitializerPtr>"[" {
if (!yyextra->insidePHP) REJECT;
yyextra->lastSquareContext=YY_START;
yyextra->pCopySquareGString=&yyextra->current->initializer;
yyextra->squareCount=0;
- yyextra->current->initializer+=*yytext;
+ yyextra->current->initializer+=*yytext;
BEGIN(GCopySquare);
}
-<ReadInitializer>"{" {
- yyextra->lastCurlyContext=YY_START;
- yyextra->pCopyCurlyGString=&yyextra->current->initializer;
- yyextra->curlyCount=0;
- yyextra->current->initializer+=*yytext;
- BEGIN(GCopyCurly);
- }
-<ReadInitializer>[;,] {
- //printf(">> initializer '%s' <<\n",yyextra->current->initializer.data());
+<ReadInitializer,ReadInitializerPtr>"{" {
+ yyextra->lastCurlyContext=YY_START;
+ yyextra->pCopyCurlyGString=&yyextra->current->initializer;
+ yyextra->curlyCount=0;
+ yyextra->current->initializer+=*yytext;
+ BEGIN(GCopyCurly);
+ }
+<ReadInitializer,ReadInitializerPtr>[;,] {
+ //printf(">> initializer '%s' <<\n",yyextra->current->initializer.data());
if (*yytext==';' && (yyextra->current_root->spec&Entry::Enum))
- {
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- yyextra->current->section = Entry::VARIABLE_SEC;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- BEGIN(FindMembers);
- }
- else if (*yytext==';' || (yyextra->lastInitializerContext==FindFields && yyextra->initBracketCount==0)) // yyextra->initBracketCount==0 was added for bug 665778
- {
- unput(*yytext);
- BEGIN(yyextra->lastInitializerContext);
- }
- else if (*yytext==',' && yyextra->initBracketCount==0) // for "int a=0,b=0"
- {
- unput(*yytext);
- BEGIN(yyextra->lastInitializerContext);
- }
- else
- {
- yyextra->current->initializer+=*yytext;
- }
- }
-<ReadInitializer>{RAWBEGIN} { // C++11 raw string
+ {
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ yyextra->current->section = Entry::VARIABLE_SEC;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ BEGIN(FindMembers);
+ }
+ else if (*yytext==';' || (yyextra->lastInitializerContext==FindFields && yyextra->initBracketCount==0)) // yyextra->initBracketCount==0 was added for bug 665778
+ {
+ unput(*yytext);
+ if (YY_START == ReadInitializerPtr) yyextra->current->initializer.resize(0);
+ BEGIN(yyextra->lastInitializerContext);
+ }
+ else if (*yytext==',' && yyextra->initBracketCount==0) // for "int a=0,b=0"
+ {
+ unput(*yytext);
+ if (YY_START == ReadInitializerPtr) yyextra->current->initializer.resize(0);
+ BEGIN(yyextra->lastInitializerContext);
+ }
+ else
+ {
+ yyextra->current->initializer+=*yytext;
+ }
+ }
+<ReadInitializer,ReadInitializerPtr>{RAWBEGIN} { // C++11 raw string
if (!yyextra->insideCpp)
- {
+ {
REJECT;
}
else
@@ -2644,7 +2707,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
<RawString>{RAWEND} {
*yyextra->pCopyRawString+=yytext;
- yyextra->fullArgString+=yytext;
+ yyextra->fullArgString+=yytext;
QCString delimiter = yytext+1;
delimiter=delimiter.left(delimiter.length()-1);
if (delimiter==yyextra->delimiter)
@@ -2654,265 +2717,265 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
<RawString>[^)]+ {
*yyextra->pCopyRawString+=yytext;
- yyextra->fullArgString+=yytext;
+ yyextra->fullArgString+=yytext;
}
<RawString>. {
*yyextra->pCopyRawString+=yytext;
- yyextra->fullArgString+=yytext;
+ yyextra->fullArgString+=yytext;
}
<RawString>\n {
*yyextra->pCopyRawString+=yytext;
- yyextra->fullArgString+=yytext;
+ yyextra->fullArgString+=yytext;
lineCount(yyscanner);
}
-<ReadInitializer>\" {
- if (yyextra->insideIDL && yyextra->insideCppQuote)
- {
- BEGIN(EndCppQuote);
- }
- else
- {
+<ReadInitializer,ReadInitializerPtr>\" {
+ if (yyextra->insideIDL && yyextra->insideCppQuote)
+ {
+ BEGIN(EndCppQuote);
+ }
+ else
+ {
yyextra->lastStringContext=YY_START;
- yyextra->current->initializer+=yytext;
- yyextra->pCopyQuotedGString=&yyextra->current->initializer;
- BEGIN(CopyGString);
- }
- }
-<ReadInitializer>"->" {
- yyextra->current->initializer+=yytext;
- }
-<ReadInitializer>"<<" {
- yyextra->current->initializer+=yytext;
- }
-<ReadInitializer>">>" {
- yyextra->current->initializer+=yytext;
- }
-<ReadInitializer>[<\[{(] {
- yyextra->initBracketCount++;
- yyextra->current->initializer+=*yytext;
- }
-<ReadInitializer>[>\]})] {
- yyextra->initBracketCount--;
- yyextra->current->initializer+=*yytext;
- }
-<ReadInitializer>\' {
- if (yyextra->insidePHP)
- {
- yyextra->current->initializer+=yytext;
+ yyextra->current->initializer+=yytext;
+ yyextra->pCopyQuotedGString=&yyextra->current->initializer;
+ BEGIN(CopyGString);
+ }
+ }
+<ReadInitializer,ReadInitializerPtr>"->" {
+ yyextra->current->initializer+=yytext;
+ }
+<ReadInitializer,ReadInitializerPtr>"<<" {
+ yyextra->current->initializer+=yytext;
+ }
+<ReadInitializer,ReadInitializerPtr>">>" {
+ yyextra->current->initializer+=yytext;
+ }
+<ReadInitializer,ReadInitializerPtr>[<\[{(] {
+ yyextra->initBracketCount++;
+ yyextra->current->initializer+=*yytext;
+ }
+<ReadInitializer,ReadInitializerPtr>[>\]})] {
+ yyextra->initBracketCount--;
+ yyextra->current->initializer+=*yytext;
+ }
+<ReadInitializer,ReadInitializerPtr>\' {
+ if (yyextra->insidePHP)
+ {
+ yyextra->current->initializer+=yytext;
yyextra->pCopyQuotedGString = &yyextra->current->initializer;
yyextra->lastStringContext=YY_START;
- BEGIN(CopyPHPGString);
- }
- else
- {
- yyextra->current->initializer+=yytext;
- }
- }
-<ReadInitializer>{CHARLIT} {
- if (yyextra->insidePHP)
- {
- REJECT;
- }
- else
- {
- yyextra->current->initializer+=yytext;
- }
- }
-<ReadInitializer>\n {
- yyextra->current->initializer+=*yytext;
+ BEGIN(CopyPHPGString);
+ }
+ else
+ {
+ yyextra->current->initializer+=yytext;
+ }
+ }
+<ReadInitializer,ReadInitializerPtr>{CHARLIT} {
+ if (yyextra->insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ yyextra->current->initializer+=yytext;
+ }
+ }
+<ReadInitializer,ReadInitializerPtr>\n {
+ yyextra->current->initializer+=*yytext;
lineCount(yyscanner);
- }
-<ReadInitializer>"@\"" {
- //printf("yyextra->insideCS=%d\n",yyextra->insideCS);
- yyextra->current->initializer+=yytext;
- if (!yyextra->insideCS && !yyextra->insideObjC)
- {
- REJECT;
- }
- else
- {
- // C#/ObjC verbatim string
- yyextra->lastSkipVerbStringContext=YY_START;
- yyextra->pSkipVerbString=&yyextra->current->initializer;
- BEGIN(SkipVerbString);
- }
- }
-<SkipVerbString>[^\n"]+ {
- *yyextra->pSkipVerbString+=yytext;
- }
-<SkipVerbString>"\"\"" { // quote escape
- *yyextra->pSkipVerbString+=yytext;
- }
-<SkipVerbString>"\"" {
- *yyextra->pSkipVerbString+=*yytext;
- BEGIN(yyextra->lastSkipVerbStringContext);
- }
-<SkipVerbString>\n {
- *yyextra->pSkipVerbString+=*yytext;
+ }
+<ReadInitializer,ReadInitializerPtr>"@\"" {
+ //printf("yyextra->insideCS=%d\n",yyextra->insideCS);
+ yyextra->current->initializer+=yytext;
+ if (!yyextra->insideCS && !yyextra->insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ // C#/ObjC verbatim string
+ yyextra->lastSkipVerbStringContext=YY_START;
+ yyextra->pSkipVerbString=&yyextra->current->initializer;
+ BEGIN(SkipVerbString);
+ }
+ }
+<SkipVerbString>[^\n"]+ {
+ *yyextra->pSkipVerbString+=yytext;
+ }
+<SkipVerbString>"\"\"" { // quote escape
+ *yyextra->pSkipVerbString+=yytext;
+ }
+<SkipVerbString>"\"" {
+ *yyextra->pSkipVerbString+=*yytext;
+ BEGIN(yyextra->lastSkipVerbStringContext);
+ }
+<SkipVerbString>\n {
+ *yyextra->pSkipVerbString+=*yytext;
lineCount(yyscanner);
- }
-<SkipVerbString>. {
- *yyextra->pSkipVerbString+=*yytext;
- }
-<ReadInitializer>"?>" {
- if (yyextra->insidePHP)
- BEGIN( FindMembersPHP );
- else
- yyextra->current->initializer+=yytext;
- }
-<ReadInitializer>. {
- yyextra->current->initializer+=*yytext;
- }
+ }
+<SkipVerbString>. {
+ *yyextra->pSkipVerbString+=*yytext;
+ }
+<ReadInitializer,ReadInitializerPtr>"?>" {
+ if (yyextra->insidePHP)
+ BEGIN( FindMembersPHP );
+ else
+ yyextra->current->initializer+=yytext;
+ }
+<ReadInitializer,ReadInitializerPtr>. {
+ yyextra->current->initializer+=*yytext;
+ }
/* generic quoted string copy rules */
-<CopyString,CopyPHPString>\\. {
- *yyextra->pCopyQuotedString+=yytext;
- }
-<CopyString>\" {
- *yyextra->pCopyQuotedString+=*yytext;
- BEGIN( yyextra->lastStringContext );
- }
-<CopyPHPString>\' {
- *yyextra->pCopyQuotedString+=*yytext;
- BEGIN( yyextra->lastStringContext );
- }
+<CopyString,CopyPHPString>\\. {
+ *yyextra->pCopyQuotedString+=yytext;
+ }
+<CopyString>\" {
+ *yyextra->pCopyQuotedString+=*yytext;
+ BEGIN( yyextra->lastStringContext );
+ }
+<CopyPHPString>\' {
+ *yyextra->pCopyQuotedString+=*yytext;
+ BEGIN( yyextra->lastStringContext );
+ }
<CopyString,CopyPHPString>"/*"|"*/"|"//" {
- *yyextra->pCopyQuotedString+=yytext;
- }
-<CopyString,CopyPHPString>\n {
- *yyextra->pCopyQuotedString+=*yytext;
+ *yyextra->pCopyQuotedString+=yytext;
+ }
+<CopyString,CopyPHPString>\n {
+ *yyextra->pCopyQuotedString+=*yytext;
lineCount(yyscanner);
- }
-<CopyString,CopyPHPString>. {
- *yyextra->pCopyQuotedString+=*yytext;
- }
+ }
+<CopyString,CopyPHPString>. {
+ *yyextra->pCopyQuotedString+=*yytext;
+ }
/* generic quoted growable string copy rules */
-<CopyGString,CopyPHPGString>\\. {
- *yyextra->pCopyQuotedGString+=yytext;
- }
-<CopyGString>\" {
- *yyextra->pCopyQuotedGString+=*yytext;
- BEGIN( yyextra->lastStringContext );
- }
-<CopyPHPGString>\' {
- *yyextra->pCopyQuotedGString+=*yytext;
- BEGIN( yyextra->lastStringContext );
- }
-<CopyGString,CopyPHPGString>"<?php" { // we had an odd number of quotes.
- *yyextra->pCopyQuotedGString += yytext;
- BEGIN( yyextra->lastStringContext );
- }
+<CopyGString,CopyPHPGString>\\. {
+ *yyextra->pCopyQuotedGString+=yytext;
+ }
+<CopyGString>\" {
+ *yyextra->pCopyQuotedGString+=*yytext;
+ BEGIN( yyextra->lastStringContext );
+ }
+<CopyPHPGString>\' {
+ *yyextra->pCopyQuotedGString+=*yytext;
+ BEGIN( yyextra->lastStringContext );
+ }
+<CopyGString,CopyPHPGString>"<?php" { // we had an odd number of quotes.
+ *yyextra->pCopyQuotedGString += yytext;
+ BEGIN( yyextra->lastStringContext );
+ }
<CopyGString,CopyPHPGString>"/*"|"*/"|"//" {
- *yyextra->pCopyQuotedGString+=yytext;
- }
-<CopyGString,CopyPHPGString>\n {
- *yyextra->pCopyQuotedGString+=*yytext;
+ *yyextra->pCopyQuotedGString+=yytext;
+ }
+<CopyGString,CopyPHPGString>\n {
+ *yyextra->pCopyQuotedGString+=*yytext;
lineCount(yyscanner);
- }
-<CopyGString,CopyPHPGString>. {
- *yyextra->pCopyQuotedGString+=*yytext;
- }
+ }
+<CopyGString,CopyPHPGString>. {
+ *yyextra->pCopyQuotedGString+=*yytext;
+ }
/* generic round bracket list copy rules */
-<CopyRound>\" {
- *yyextra->pCopyRoundString+=*yytext;
- yyextra->pCopyQuotedString=yyextra->pCopyRoundString;
- yyextra->lastStringContext=YY_START;
- BEGIN(CopyString);
- }
-<CopyRound>"(" {
- *yyextra->pCopyRoundString+=*yytext;
- yyextra->roundCount++;
- }
-<CopyRound>")" {
- *yyextra->pCopyRoundString+=*yytext;
- if (--yyextra->roundCount<0)
- BEGIN(yyextra->lastRoundContext);
- }
-<CopyRound>\n {
+<CopyRound>\" {
+ *yyextra->pCopyRoundString+=*yytext;
+ yyextra->pCopyQuotedString=yyextra->pCopyRoundString;
+ yyextra->lastStringContext=YY_START;
+ BEGIN(CopyString);
+ }
+<CopyRound>"(" {
+ *yyextra->pCopyRoundString+=*yytext;
+ yyextra->roundCount++;
+ }
+<CopyRound>")" {
+ *yyextra->pCopyRoundString+=*yytext;
+ if (--yyextra->roundCount<0)
+ BEGIN(yyextra->lastRoundContext);
+ }
+<CopyRound>\n {
lineCount(yyscanner);
- *yyextra->pCopyRoundString+=*yytext;
- }
-<CopyRound>\' {
- if (yyextra->insidePHP)
- {
- yyextra->current->initializer+=yytext;
+ *yyextra->pCopyRoundString+=*yytext;
+ }
+<CopyRound>\' {
+ if (yyextra->insidePHP)
+ {
+ yyextra->current->initializer+=yytext;
yyextra->pCopyQuotedString = yyextra->pCopyRoundString;
yyextra->lastStringContext=YY_START;
- BEGIN(CopyPHPString);
- }
- else
- {
- *yyextra->pCopyRoundString+=yytext;
- }
- }
-<CopyRound>{CHARLIT} {
+ BEGIN(CopyPHPString);
+ }
+ else
+ {
+ *yyextra->pCopyRoundString+=yytext;
+ }
+ }
+<CopyRound>{CHARLIT} {
if (yyextra->insidePHP)
- {
- REJECT;
- }
- else
- {
- *yyextra->pCopyRoundString+=yytext;
- }
- }
-<CopyRound>[^"'()\n]+ {
- *yyextra->pCopyRoundString+=yytext;
- }
-<CopyRound>. {
- *yyextra->pCopyRoundString+=*yytext;
- }
+ {
+ REJECT;
+ }
+ else
+ {
+ *yyextra->pCopyRoundString+=yytext;
+ }
+ }
+<CopyRound>[^"'()\n,]+ {
+ *yyextra->pCopyRoundString+=yytext;
+ }
+<CopyRound>. {
+ *yyextra->pCopyRoundString+=*yytext;
+ }
/* generic round bracket list copy rules for growable strings */
-<GCopyRound>\" {
- *yyextra->pCopyRoundGString+=*yytext;
- yyextra->pCopyQuotedGString=yyextra->pCopyRoundGString;
- yyextra->lastStringContext=YY_START;
- BEGIN(CopyGString);
- }
-<GCopyRound>"(" {
- *yyextra->pCopyRoundGString+=*yytext;
- yyextra->roundCount++;
- }
-<GCopyRound>")" {
- *yyextra->pCopyRoundGString+=*yytext;
- if (--yyextra->roundCount<0)
- BEGIN(yyextra->lastRoundContext);
- }
-<GCopyRound>\n {
+<GCopyRound>\" {
+ *yyextra->pCopyRoundGString+=*yytext;
+ yyextra->pCopyQuotedGString=yyextra->pCopyRoundGString;
+ yyextra->lastStringContext=YY_START;
+ BEGIN(CopyGString);
+ }
+<GCopyRound>"(" {
+ *yyextra->pCopyRoundGString+=*yytext;
+ yyextra->roundCount++;
+ }
+<GCopyRound>")" {
+ *yyextra->pCopyRoundGString+=*yytext;
+ if (--yyextra->roundCount<0)
+ BEGIN(yyextra->lastRoundContext);
+ }
+<GCopyRound>\n {
lineCount(yyscanner);
- *yyextra->pCopyRoundGString+=*yytext;
- }
-<GCopyRound>\' {
- if (yyextra->insidePHP)
- {
- yyextra->current->initializer+=yytext;
+ *yyextra->pCopyRoundGString+=*yytext;
+ }
+<GCopyRound>\' {
+ if (yyextra->insidePHP)
+ {
+ yyextra->current->initializer+=yytext;
yyextra->pCopyQuotedGString = yyextra->pCopyRoundGString;
yyextra->lastStringContext=YY_START;
- BEGIN(CopyPHPGString);
- }
- else
- {
- *yyextra->pCopyRoundGString+=yytext;
- }
- }
-<GCopyRound>{CHARLIT} {
+ BEGIN(CopyPHPGString);
+ }
+ else
+ {
+ *yyextra->pCopyRoundGString+=yytext;
+ }
+ }
+<GCopyRound>{CHARLIT} {
if (yyextra->insidePHP)
- {
- REJECT;
- }
- else
- {
- *yyextra->pCopyRoundGString+=yytext;
- }
- }
-<GCopyRound>[^"'()\n/]+ {
- *yyextra->pCopyRoundGString+=yytext;
- }
-<GCopyRound>. {
- *yyextra->pCopyRoundGString+=*yytext;
- }
+ {
+ REJECT;
+ }
+ else
+ {
+ *yyextra->pCopyRoundGString+=yytext;
+ }
+ }
+<GCopyRound>[^"'()\n\/,]+ {
+ *yyextra->pCopyRoundGString+=yytext;
+ }
+<GCopyRound>. {
+ *yyextra->pCopyRoundGString+=*yytext;
+ }
/* generic square bracket list copy rules for growable strings, we should only enter here in case of php, left the test part as in GCopyRound to keep it compatible with the round bracket version */
<GCopySquare>\" {
@@ -2937,7 +3000,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
<GCopySquare>\' {
if (yyextra->insidePHP)
{
- yyextra->current->initializer+=yytext;
+ yyextra->current->initializer+=yytext;
yyextra->pCopyQuotedGString = yyextra->pCopySquareGString;
yyextra->lastStringContext=YY_START;
BEGIN(CopyPHPGString);
@@ -2947,17 +3010,17 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
*yyextra->pCopySquareGString+=yytext;
}
}
-<GCopySquare>{CHARLIT} {
+<GCopySquare>{CHARLIT} {
if (yyextra->insidePHP)
{
REJECT;
}
else
{
- *yyextra->pCopySquareGString+=yytext;
+ *yyextra->pCopySquareGString+=yytext;
}
}
-<GCopySquare>[^"\[\]\n/]+ {
+<GCopySquare>[^"\[\]\n\/,]+ {
*yyextra->pCopySquareGString+=yytext;
}
<GCopySquare>. {
@@ -2965,229 +3028,230 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
/* generic curly bracket list copy rules */
-<CopyCurly>\" {
- *yyextra->pCopyCurlyString+=*yytext;
- yyextra->pCopyQuotedString=yyextra->pCopyCurlyString;
- yyextra->lastStringContext=YY_START;
- BEGIN(CopyString);
- }
-<CopyCurly>\' {
- *yyextra->pCopyCurlyString+=*yytext;
- if (yyextra->insidePHP)
- {
- yyextra->pCopyQuotedString=yyextra->pCopyCurlyString;
- yyextra->lastStringContext=YY_START;
- BEGIN(CopyPHPString);
- }
- }
-<CopyCurly>"{" {
- *yyextra->pCopyCurlyString+=*yytext;
- yyextra->curlyCount++;
- }
-<CopyCurly>"}" {
- *yyextra->pCopyCurlyString+=*yytext;
- if (--yyextra->curlyCount<0)
- BEGIN(yyextra->lastCurlyContext);
- }
-<CopyCurly>{CHARLIT} { if (yyextra->insidePHP)
- {
- REJECT;
- }
- else
- {
- *yyextra->pCopyCurlyString+=yytext;
- }
- }
-<CopyCurly>[^"'{}\/\n]+ {
- *yyextra->pCopyCurlyString+=yytext;
- }
-<CopyCurly>"/" { *yyextra->pCopyCurlyString+=yytext; }
-<CopyCurly>\n {
+<CopyCurly>\" {
+ *yyextra->pCopyCurlyString+=*yytext;
+ yyextra->pCopyQuotedString=yyextra->pCopyCurlyString;
+ yyextra->lastStringContext=YY_START;
+ BEGIN(CopyString);
+ }
+<CopyCurly>\' {
+ *yyextra->pCopyCurlyString+=*yytext;
+ if (yyextra->insidePHP)
+ {
+ yyextra->pCopyQuotedString=yyextra->pCopyCurlyString;
+ yyextra->lastStringContext=YY_START;
+ BEGIN(CopyPHPString);
+ }
+ }
+<CopyCurly>"{" {
+ *yyextra->pCopyCurlyString+=*yytext;
+ yyextra->curlyCount++;
+ }
+<CopyCurly>"}" {
+ *yyextra->pCopyCurlyString+=*yytext;
+ if (--yyextra->curlyCount<0)
+ BEGIN(yyextra->lastCurlyContext);
+ }
+<CopyCurly>{CHARLIT} { if (yyextra->insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *yyextra->pCopyCurlyString+=yytext;
+ }
+ }
+<CopyCurly>[^"'{}\/\n,]+ {
+ *yyextra->pCopyCurlyString+=yytext;
+ }
+<CopyCurly>"/" { *yyextra->pCopyCurlyString+=yytext; }
+<CopyCurly>\n {
lineCount(yyscanner);
- *yyextra->pCopyCurlyString+=*yytext;
- }
-<CopyCurly>. {
- *yyextra->pCopyCurlyString+=*yytext;
- }
+ *yyextra->pCopyCurlyString+=*yytext;
+ }
+<CopyCurly>. {
+ *yyextra->pCopyCurlyString+=*yytext;
+ }
/* generic curly bracket list copy rules for growable strings */
<GCopyCurly>^"#"{B}+[0-9]+{B}+"\""[^\"\n]+"\""{B}+"1"{B}*\n? { // start of included file marker
}
<GCopyCurly>^"#"{B}+[0-9]+{B}+"\""[^\"\n]+"\""{B}+"2"{B}*\n? { // end of included file marker
- QCString line = QCString(yytext);
- int s = line.find(' ');
- int e = line.find('"',s);
- yyextra->yyLineNr = line.mid(s,e-s).toInt();
- if (yytext[yyleng-1]=='\n')
- {
+ QCString line = QCString(yytext);
+ int s = line.find(' ');
+ int e = line.find('"',s);
+ yyextra->yyLineNr = line.mid(s,e-s).toInt();
+ if (yytext[yyleng-1]=='\n')
+ {
lineCount(yyscanner);
yyextra->column=0;
- }
- }
-<GCopyCurly>\" {
- *yyextra->pCopyCurlyGString+=*yytext;
- yyextra->pCopyQuotedGString=yyextra->pCopyCurlyGString;
- yyextra->lastStringContext=YY_START;
- BEGIN(CopyGString);
- }
-<GCopyCurly>\' {
- *yyextra->pCopyCurlyGString+=*yytext;
- if (yyextra->insidePHP)
- {
- yyextra->pCopyQuotedGString=yyextra->pCopyCurlyGString;
- yyextra->lastStringContext=YY_START;
- BEGIN(CopyPHPGString);
- }
- }
-<GCopyCurly>"{" {
- *yyextra->pCopyCurlyGString+=*yytext;
- yyextra->curlyCount++;
- }
-<GCopyCurly>"}" {
- *yyextra->pCopyCurlyGString+=*yytext;
- if (--yyextra->curlyCount<0)
- BEGIN(yyextra->lastCurlyContext);
- }
-<GCopyCurly>{CHARLIT} { if (yyextra->insidePHP)
- {
- REJECT;
- }
- else
- {
- *yyextra->pCopyCurlyGString+=yytext;
- }
- }
-<GCopyCurly>[^"'{}\/\n,]+ {
- *yyextra->pCopyCurlyGString+=yytext;
- }
-<GCopyCurly>[,]+ {
- *yyextra->pCopyCurlyGString+=yytext;
- }
-<GCopyCurly>"/" { *yyextra->pCopyCurlyGString+=yytext; }
-<GCopyCurly>\n {
+ }
+ }
+<GCopyCurly>\" {
+ *yyextra->pCopyCurlyGString+=*yytext;
+ yyextra->pCopyQuotedGString=yyextra->pCopyCurlyGString;
+ yyextra->lastStringContext=YY_START;
+ BEGIN(CopyGString);
+ }
+<GCopyCurly>\' {
+ *yyextra->pCopyCurlyGString+=*yytext;
+ if (yyextra->insidePHP)
+ {
+ yyextra->pCopyQuotedGString=yyextra->pCopyCurlyGString;
+ yyextra->lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ }
+<GCopyCurly>"{" {
+ *yyextra->pCopyCurlyGString+=*yytext;
+ yyextra->curlyCount++;
+ }
+<GCopyCurly>"}" {
+ *yyextra->pCopyCurlyGString+=*yytext;
+ if (--yyextra->curlyCount<0)
+ BEGIN(yyextra->lastCurlyContext);
+ }
+<GCopyCurly>{CHARLIT} { if (yyextra->insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *yyextra->pCopyCurlyGString+=yytext;
+ }
+ }
+<GCopyCurly>[^"'{}\/\n,]+ {
+ *yyextra->pCopyCurlyGString+=yytext;
+ }
+<GCopyCurly>[,]+ {
+ *yyextra->pCopyCurlyGString+=yytext;
+ }
+<GCopyCurly>"/" { *yyextra->pCopyCurlyGString+=yytext; }
+<GCopyCurly>\n {
lineCount(yyscanner);
- *yyextra->pCopyCurlyGString+=*yytext;
- }
-<GCopyCurly>. {
- *yyextra->pCopyCurlyGString+=*yytext;
- }
+ *yyextra->pCopyCurlyGString+=*yytext;
+ }
+<GCopyCurly>. {
+ *yyextra->pCopyCurlyGString+=*yytext;
+ }
/* ---------------------- */
-<FindMembers>":" {
- if (yyextra->current->type.isEmpty() &&
+<FindMembers>":" {
+ if (yyextra->current->type.isEmpty() &&
yyextra->current->name=="enum") // see bug 69041, C++11 style anon enum: 'enum : unsigned int {...}'
- {
+ {
yyextra->current->section=Entry::ENUM_SEC;
- yyextra->current->name.resize(0);
+ yyextra->current->name.resize(0);
yyextra->current->args.resize(0);
- BEGIN(EnumBaseType);
- }
- else
+ BEGIN(EnumBaseType);
+ }
+ else
{
if (yyextra->current->type.isEmpty()) // anonymous padding field, e.g. "int :7;"
- {
- addType(yyscanner);
- yyextra->current->name.sprintf("__pad%d__",yyextra->padCount++);
- }
- BEGIN(BitFields);
- yyextra->current->bitfields+=":";
- }
- }
-<BitFields>. {
- yyextra->current->bitfields+=*yytext;
- }
-<EnumBaseType>. {
- yyextra->current->args+=*yytext;
- }
-<EnumBaseType>\n {
+ {
+ addType(yyscanner);
+ yyextra->current->name.sprintf("__pad%d__",yyextra->padCount++);
+ }
+ BEGIN(BitFields);
+ yyextra->current->bitfields+=":";
+ }
+ }
+<BitFields>. {
+ yyextra->current->bitfields+=*yytext;
+ }
+<EnumBaseType>. {
+ yyextra->current->args+=*yytext;
+ }
+<EnumBaseType>\n {
lineCount(yyscanner);
- yyextra->current->args+=' ';
- }
-<FindMembers>[;,] {
- QCString oldType = yyextra->current->type;
- if (yyextra->current->bodyLine==-1)
- {
- yyextra->current->bodyLine = yyextra->yyLineNr;
- }
+ yyextra->current->args+=' ';
+ }
+<FindMembers>[;,] {
+ QCString oldType = yyextra->current->type;
+ if (yyextra->current->bodyLine==-1)
+ {
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ }
if ( yyextra->insidePHP && yyextra->current->type.left(3) == "var" )
{
yyextra->current->type = yyextra->current->type.mid(3);
}
- if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
- {
- yyextra->current->type.prepend("typedef ");
- }
- bool stat = yyextra->current->stat;
- if (!yyextra->current->name.isEmpty() && yyextra->current->section!=Entry::ENUM_SEC)
- {
- yyextra->current->type=yyextra->current->type.simplifyWhiteSpace();
- yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args);
- yyextra->current->name=yyextra->current->name.stripWhiteSpace();
- if (yyextra->current->section==Entry::CLASS_SEC) // remove spec for "struct Bla bla;"
- {
- yyextra->current->spec = 0;
- }
- yyextra->current->section = Entry::VARIABLE_SEC ;
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyBegLineNr;
- yyextra->current->startColumn = yyextra->yyBegColNr;
- yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
+ if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
+ {
+ yyextra->current->type.prepend("typedef ");
+ }
+ bool stat = yyextra->current->stat;
+ if (!yyextra->current->name.isEmpty() && yyextra->current->section!=Entry::ENUM_SEC)
+ {
+ yyextra->current->type=yyextra->current->type.simplifyWhiteSpace();
+ yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args);
+ yyextra->current->name=yyextra->current->name.stripWhiteSpace();
+ if (yyextra->current->section==Entry::CLASS_SEC) // remove spec for "struct Bla bla;"
+ {
+ yyextra->current->spec = 0;
+ }
+ yyextra->current->section = Entry::VARIABLE_SEC ;
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyBegLineNr;
+ yyextra->current->startColumn = yyextra->yyBegColNr;
+ yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
initEntry(yyscanner);
- }
- if ( *yytext == ',')
- {
- yyextra->current->stat = stat; // the static attribute holds for all variables
- yyextra->current->name.resize(0);
- yyextra->current->args.resize(0);
- yyextra->current->brief.resize(0);
- yyextra->current->doc.resize(0);
- yyextra->current->initializer.resize(0);
- yyextra->current->bitfields.resize(0);
- int i=oldType.length();
- while (i>0 && (oldType[i-1]=='*' || oldType[i-1]=='&' || oldType[i-1]==' ')) i--;
- yyextra->current->type = oldType.left(i);
- }
- else
- {
+ }
+ if ( *yytext == ',')
+ {
+ yyextra->current->stat = stat; // the static attribute holds for all variables
+ yyextra->current->name.resize(0);
+ yyextra->current->args.resize(0);
+ yyextra->current->brief.resize(0);
+ yyextra->current->doc.resize(0);
+ yyextra->current->initializer.resize(0);
+ yyextra->current->bitfields.resize(0);
+ int i=oldType.length();
+ while (i>0 && (oldType[i-1]=='*' || oldType[i-1]=='&' || oldType[i-1]==' ')) i--;
+ yyextra->current->type = oldType.left(i);
+ }
+ else
+ {
yyextra->mtype = Method;
yyextra->virt = Normal;
- yyextra->current->groups.clear();
- initEntry(yyscanner);
- }
- }
+ yyextra->current->groups.clear();
+ initEntry(yyscanner);
+ }
+ }
-<FindMembers>"[" {
+<FindMembers>"[" {
if (yyextra->insideSlice)
{
- yyextra->squareCount=1;
+ yyextra->squareCount=1;
yyextra->lastSquareContext = YY_START;
yyextra->current->metaData += "[";
BEGIN( SliceMetadata );
}
- else if (!yyextra->insideCS &&
- (yyextra->current->name.isEmpty() ||
- yyextra->current->name=="typedef"
- )
- ) // IDL function property
- {
- yyextra->squareCount=1;
- yyextra->lastSquareContext = YY_START;
- yyextra->idlAttr.resize(0);
- yyextra->idlProp.resize(0);
- yyextra->current->mtype = yyextra->mtype;
-
- if (Config_getBool(IDL_PROPERTY_SUPPORT) &&
- yyextra->current->mtype == Property)
- { // we are yyextra->inside the properties section of a dispinterface
- yyextra->odlProp = true;
- yyextra->current->spec |= Entry::Gettable;
- yyextra->current->spec |= Entry::Settable;
- }
-
- BEGIN( IDLAttribute );
- }
+ else if (!yyextra->insideCS &&
+ (yyextra->current->name.isEmpty() ||
+ yyextra->current->name=="typedef"
+ )
+ ) // IDL function property
+ {
+ yyextra->squareCount=1;
+ yyextra->lastSquareContext = YY_START;
+ yyextra->idlAttr.resize(0);
+ yyextra->idlProp.resize(0);
+ yyextra->current->mtype = yyextra->mtype;
+
+ if (Config_getBool(IDL_PROPERTY_SUPPORT) &&
+ yyextra->current->mtype == Property)
+ { // we are yyextra->inside the properties section of a dispinterface
+ yyextra->odlProp = true;
+ yyextra->current->spec |= Entry::Gettable;
+ yyextra->current->spec |= Entry::Settable;
+ }
+
+ BEGIN( IDLAttribute );
+ }
else if (yyextra->insideCS &&
yyextra->current->name.isEmpty())
{
@@ -3198,20 +3262,20 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
yyextra->current->args.resize(0);
BEGIN( SkipSquare );
}
- else
- {
- yyextra->current->args += yytext ;
- yyextra->squareCount=1;
- yyextra->externC=FALSE; // see bug759247
- BEGIN( Array ) ;
- }
- }
+ else
+ {
+ yyextra->current->args += yytext ;
+ yyextra->squareCount=1;
+ yyextra->externC=FALSE; // see bug759247
+ BEGIN( Array ) ;
+ }
+ }
<SliceMetadata>"[" { // Global metadata.
- yyextra->squareCount++;
+ yyextra->squareCount++;
yyextra->current->metaData += "[";
}
<SliceMetadata>{BN}* {
- lineCount(yyscanner);
+ lineCount(yyscanner);
}
<SliceMetadata>\"[^\"]*\" {
yyextra->current->metaData += yytext;
@@ -3240,293 +3304,294 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
BEGIN (yyextra->lastModifierContext);
}
}
-<IDLAttribute>"]" {
- // end of IDL function attribute
- if (--yyextra->squareCount<=0)
- {
- lineCount(yyscanner);
- if (yyextra->current->mtype == Property)
- BEGIN( IDLPropName );
- else
- BEGIN( yyextra->lastSquareContext );
- }
- }
-<IDLAttribute>"propput" {
+<IDLAttribute>"]" {
+ // end of IDL function attribute
+ if (--yyextra->squareCount<=0)
+ {
+ lineCount(yyscanner);
+ if (yyextra->current->mtype == Property)
+ BEGIN( IDLPropName );
+ else
+ BEGIN( yyextra->lastSquareContext );
+ }
+ }
+<IDLAttribute>"propput" {
if (Config_getBool(IDL_PROPERTY_SUPPORT))
- {
- yyextra->current->mtype = Property;
- }
- yyextra->current->spec |= Entry::Settable;
- }
-<IDLAttribute>"propget" {
+ {
+ yyextra->current->mtype = Property;
+ }
+ yyextra->current->spec |= Entry::Settable;
+ }
+<IDLAttribute>"propget" {
if (Config_getBool(IDL_PROPERTY_SUPPORT))
- {
- yyextra->current->mtype = Property;
- }
- yyextra->current->spec |= Entry::Gettable;
- }
+ {
+ yyextra->current->mtype = Property;
+ }
+ yyextra->current->spec |= Entry::Gettable;
+ }
<IDLAttribute>"property" { // UNO IDL property
- yyextra->current->spec |= Entry::Property;
- }
+ yyextra->current->spec |= Entry::Property;
+ }
<IDLAttribute>"attribute" { // UNO IDL attribute
- yyextra->current->spec |= Entry::Attribute;
- }
+ yyextra->current->spec |= Entry::Attribute;
+ }
<IDLAttribute>"optional" { // on UNO IDL interface/service/attribute/property
yyextra->current->spec |= Entry::Optional;
}
<IDLAttribute>"readonly" { // on UNO IDL attribute or property
- if (Config_getBool(IDL_PROPERTY_SUPPORT) && yyextra->odlProp)
- {
- yyextra->current->spec ^= Entry::Settable;
- }
- else
- {
- yyextra->current->spec |= Entry::Readonly;
- }
- }
+ if (Config_getBool(IDL_PROPERTY_SUPPORT) && yyextra->odlProp)
+ {
+ yyextra->current->spec ^= Entry::Settable;
+ }
+ else
+ {
+ yyextra->current->spec |= Entry::Readonly;
+ }
+ }
<IDLAttribute>"bound" { // on UNO IDL attribute or property
- yyextra->current->spec |= Entry::Bound;
- }
+ yyextra->current->spec |= Entry::Bound;
+ }
<IDLAttribute>"removable" { // on UNO IDL property
- yyextra->current->spec |= Entry::Removable;
- }
+ yyextra->current->spec |= Entry::Removable;
+ }
<IDLAttribute>"constrained" { // on UNO IDL property
- yyextra->current->spec |= Entry::Constrained;
- }
+ yyextra->current->spec |= Entry::Constrained;
+ }
<IDLAttribute>"transient" { // on UNO IDL property
- yyextra->current->spec |= Entry::Transient;
- }
+ yyextra->current->spec |= Entry::Transient;
+ }
<IDLAttribute>"maybevoid" { // on UNO IDL property
- yyextra->current->spec |= Entry::MaybeVoid;
- }
+ yyextra->current->spec |= Entry::MaybeVoid;
+ }
<IDLAttribute>"maybedefault" { // on UNO IDL property
- yyextra->current->spec |= Entry::MaybeDefault;
- }
+ yyextra->current->spec |= Entry::MaybeDefault;
+ }
<IDLAttribute>"maybeambiguous" { // on UNO IDL property
- yyextra->current->spec |= Entry::MaybeAmbiguous;
- }
-<IDLAttribute>. {
- }
-<IDLPropName>{BN}*{ID}{BN}* {
- // return type (probably HRESULT) - skip it
-
- if (yyextra->odlProp)
- { // property type
- yyextra->idlProp = yytext;
- }
- }
-<IDLPropName>{ID}{BN}*"(" {
- yyextra->current->name = yytext;
- yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- BEGIN( IDLProp );
- }
-<IDLPropName>{BN}*"("{BN}*{ID}{BN}*")"{BN}* {
- if (yyextra->odlProp)
- {
- yyextra->idlProp += yytext;
- }
- }
-<IDLPropName>{ID}{BN}*/";" {
- if (yyextra->odlProp)
- {
- yyextra->current->name = yytext;
- yyextra->idlProp = yyextra->idlProp.stripWhiteSpace();
- yyextra->odlProp = false;
-
- BEGIN( IDLProp );
- }
- }
-<IDLProp>{BN}*"["[^\]]*"]"{BN}* { // attribute of a parameter
- yyextra->idlAttr = yytext;
- yyextra->idlAttr=yyextra->idlAttr.stripWhiteSpace();
- }
-<IDLProp>{ID} { // property type
- yyextra->idlProp = yytext;
- }
-<IDLProp>{BN}*{ID}{BN}*"," { // Rare: Another parameter ([propput] HRESULT Item(int index, [in] Type theRealProperty);)
- if (!yyextra->current->args)
- yyextra->current->args = "(";
- else
- yyextra->current->args += ", ";
- yyextra->current->args += yyextra->idlAttr;
- yyextra->current->args += " ";
- yyextra->current->args += yyextra->idlProp; // prop was actually type of extra parameter
- yyextra->current->args += " ";
- yyextra->current->args += yytext;
- yyextra->current->args = yyextra->current->args.left(yyextra->current->args.length() - 1); // strip comma
- yyextra->idlProp.resize(0);
- yyextra->idlAttr.resize(0);
- BEGIN( IDLProp );
- }
-<IDLProp>{BN}*{ID}{BN}*")"{BN}* {
- // the parameter name for the property - just skip.
- }
-<IDLProp>";" {
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->type = yyextra->idlProp;
- yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
- if (yyextra->current->args)
- yyextra->current->args += ")";
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- yyextra->current->section = Entry::VARIABLE_SEC;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- BEGIN( FindMembers );
- }
-<IDLProp>. { // spaces, *, or other stuff
- //yyextra->idlProp+=yytext;
- }
-<Array>"]" { yyextra->current->args += *yytext ;
- if (--yyextra->squareCount<=0)
- BEGIN( FindMembers ) ;
- }
-<FuncFuncArray>"]" { yyextra->current->args += *yytext ;
- if (--yyextra->squareCount<=0)
- BEGIN( Function ) ;
- }
-<Array,FuncFuncArray>"[" { yyextra->current->args += *yytext ;
- yyextra->squareCount++;
- }
-<Array,FuncFuncArray>. { yyextra->current->args += *yytext ; }
-<SkipSquare>"[" { yyextra->squareCount++; }
-<SkipSquare>"]" {
- if (--yyextra->squareCount<=0)
- BEGIN( yyextra->lastSquareContext );
- }
-<SkipSquare>\" {
- yyextra->lastStringContext=YY_START;
- BEGIN( SkipString );
- }
+ yyextra->current->spec |= Entry::MaybeAmbiguous;
+ }
+<IDLAttribute>. {
+ }
+<IDLPropName>{BN}*{ID}{BN}* {
+ // return type (probably HRESULT) - skip it
+
+ if (yyextra->odlProp)
+ { // property type
+ yyextra->idlProp = yytext;
+ }
+ }
+<IDLPropName>{ID}{BN}*"(" {
+ yyextra->current->name = yytext;
+ yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ BEGIN( IDLProp );
+ }
+<IDLPropName>{BN}*"("{BN}*{ID}{BN}*")"{BN}* {
+ if (yyextra->odlProp)
+ {
+ yyextra->idlProp += yytext;
+ }
+ }
+<IDLPropName>{ID}{BN}*/";" {
+ if (yyextra->odlProp)
+ {
+ yyextra->current->name = yytext;
+ yyextra->idlProp = yyextra->idlProp.stripWhiteSpace();
+ yyextra->odlProp = false;
+
+ BEGIN( IDLProp );
+ }
+ }
+<IDLProp>{BN}*"["[^\]]*"]"{BN}* { // attribute of a parameter
+ yyextra->idlAttr = yytext;
+ yyextra->idlAttr=yyextra->idlAttr.stripWhiteSpace();
+ }
+<IDLProp>{ID} { // property type
+ yyextra->idlProp = yytext;
+ }
+<IDLProp>{BN}*{ID}{BN}*"," { // Rare: Another parameter ([propput] HRESULT Item(int index, [in] Type theRealProperty);)
+ if (!yyextra->current->args)
+ yyextra->current->args = "(";
+ else
+ yyextra->current->args += ", ";
+ yyextra->current->args += yyextra->idlAttr;
+ yyextra->current->args += " ";
+ yyextra->current->args += yyextra->idlProp; // prop was actually type of extra parameter
+ yyextra->current->args += " ";
+ yyextra->current->args += yytext;
+ yyextra->current->args = yyextra->current->args.left(yyextra->current->args.length() - 1); // strip comma
+ yyextra->idlProp.resize(0);
+ yyextra->idlAttr.resize(0);
+ BEGIN( IDLProp );
+ }
+<IDLProp>{BN}*{ID}{BN}*")"{BN}* {
+ // the parameter name for the property - just skip.
+ }
+<IDLProp>";" {
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->type = yyextra->idlProp;
+ yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
+ if (yyextra->current->args)
+ yyextra->current->args += ")";
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ yyextra->current->section = Entry::VARIABLE_SEC;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ BEGIN( FindMembers );
+ }
+<IDLProp>. { // spaces, *, or other stuff
+ //yyextra->idlProp+=yytext;
+ }
+<Array>"]" { yyextra->current->args += *yytext ;
+ if (--yyextra->squareCount<=0)
+ BEGIN( FindMembers ) ;
+ }
+<FuncFuncArray>"]" { yyextra->current->args += *yytext ;
+ if (--yyextra->squareCount<=0)
+ BEGIN( Function ) ;
+ }
+<Array,FuncFuncArray>"[" { yyextra->current->args += *yytext ;
+ yyextra->squareCount++;
+ }
+<Array,FuncFuncArray>. { yyextra->current->args += *yytext ; }
+<SkipSquare>"[" { yyextra->squareCount++; }
+<SkipSquare>"]" {
+ if (--yyextra->squareCount<=0)
+ BEGIN( yyextra->lastSquareContext );
+ }
+<SkipSquare>\" {
+ yyextra->lastStringContext=YY_START;
+ BEGIN( SkipString );
+ }
<SkipSquare>[^\n\[\]\"]+
-<FindMembers>"<" { addType(yyscanner);
- yyextra->current->type += yytext ;
- BEGIN( Sharp ) ;
- }
-<Sharp>">" { yyextra->current->type += *yytext ;
- if (--yyextra->sharpCount<=0)
- BEGIN( FindMembers ) ;
- }
-<Sharp>"<" { yyextra->current->type += *yytext ;
- yyextra->sharpCount++;
- }
-<Sharp>{BN}+ {
+<FindMembers>"<" { addType(yyscanner);
+ yyextra->current->type += yytext ;
+ BEGIN( Sharp ) ;
+ }
+<Sharp>">" { yyextra->current->type += *yytext ;
+ if (--yyextra->sharpCount<=0)
+ BEGIN( FindMembers ) ;
+ }
+<Sharp>"<" { yyextra->current->type += *yytext ;
+ yyextra->sharpCount++;
+ }
+<Sharp>{BN}+ {
yyextra->current->type += ' ';
- lineCount(yyscanner);
- }
-<Sharp>. { yyextra->current->type += *yytext ; }
-<FindFields>{ID} {
- if (yyextra->insideCpp || yyextra->insideObjC)
- {
- yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext);
- }
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->current->name = yytext;
- }
-<FindFields>"(" {
- // Java enum initializer
- unput('(');
- yyextra->lastInitializerContext = YY_START;
- yyextra->initBracketCount=0;
+ lineCount(yyscanner);
+ }
+<Sharp>. { yyextra->current->type += *yytext ; }
+<FindFields>{ID} {
+ if (yyextra->clangParser && (yyextra->insideCpp || yyextra->insideObjC))
+ {
+ yyextra->current->id = yyextra->clangParser->lookup(yyextra->yyLineNr,yytext);
+ }
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->current->name = yytext;
+ }
+<FindFields>"(" {
+ // Java enum initializer
+ unput('(');
+ yyextra->lastInitializerContext = YY_START;
+ yyextra->initBracketCount=0;
yyextra->current->initializer = "=";
- BEGIN(ReadInitializer);
- }
-<FindFields>"=" {
- yyextra->lastInitializerContext = YY_START;
- yyextra->initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+<FindFields>"=" {
+ yyextra->lastInitializerContext = YY_START;
+ yyextra->initBracketCount=0;
yyextra->current->initializer = yytext;
- BEGIN(ReadInitializer);
- }
+ BEGIN(ReadInitializer);
+ }
<FindFields>";" {
- if (yyextra->insideJava) // yyextra->last enum field in Java class
- {
- if (!yyextra->current->name.isEmpty())
- {
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- if (!(yyextra->current_root->spec&Entry::Enum))
- {
- yyextra->current->type = "@"; // enum marker
- }
- yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- yyextra->current->section = Entry::VARIABLE_SEC;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- }
-
- BEGIN( FindMembers );
- }
- else
- {
- REJECT;
- }
- }
-<SkipRemainder>\n {
+ if (yyextra->insideJava) // yyextra->last enum field in Java class
+ {
+ if (!yyextra->current->name.isEmpty())
+ {
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ if (!(yyextra->current_root->spec&Entry::Enum))
+ {
+ yyextra->current->type = "@"; // enum marker
+ }
+ yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ yyextra->current->section = Entry::VARIABLE_SEC;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ }
+
+ BEGIN( FindMembers );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<SkipRemainder>\n {
lineCount(yyscanner);
}
<SkipRemainder>[^\n]*
-<FindFields>"," {
- //printf("adding '%s' '%s' '%s' to enum '%s' (mGrpId=%d)\n",
- // yyextra->current->type.data(), yyextra->current->name.data(),
- // yyextra->current->args.data(), yyextra->current_root->name.data(),yyextra->current->mGrpId);
- if (!yyextra->current->name.isEmpty())
- {
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyLineNr;
- yyextra->current->startColumn = yyextra->yyColNr;
- if (!(yyextra->current_root->spec&Entry::Enum))
- {
- yyextra->current->type = "@"; // enum marker
- }
- yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- yyextra->current->section = Entry::VARIABLE_SEC;
- // add to the scope of the enum
- if (!yyextra->insideCS && !yyextra->insideJava &&
- !(yyextra->current_root->spec&Entry::Strong))
+<FindFields>"," {
+ //printf("adding '%s' '%s' '%s' to enum '%s' (mGrpId=%d)\n",
+ // yyextra->current->type.data(), yyextra->current->name.data(),
+ // yyextra->current->args.data(), yyextra->current_root->name.data(),yyextra->current->mGrpId);
+ if (!yyextra->current->name.isEmpty())
+ {
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyLineNr;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ if (!(yyextra->current_root->spec&Entry::Enum))
+ {
+ yyextra->current->type = "@"; // enum marker
+ }
+ yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ yyextra->current->section = Entry::VARIABLE_SEC;
+ // add to the scope of the enum
+ if (!yyextra->insideCS && !yyextra->insideJava &&
+ !(yyextra->current_root->spec&Entry::Strong))
// for C# and Java 1.5+ enum values always have to be explicitly qualified,
// same for C++11 style enums (enum class Name {})
- {
- // add to the scope surrounding the enum (copy!)
+ {
+ // add to the scope surrounding the enum (copy!)
// we cannot during it directly as that would invalidate the iterator in parseCompounds.
//printf("*** adding outer scope entry for %s\n",yyextra->current->name.data());
yyextra->outerScopeEntries.emplace_back(yyextra->current_root->parent(), std::make_shared<Entry>(*yyextra->current));
- }
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- }
- else // probably a redundant ,
- {
- yyextra->current->reset();
- initEntry(yyscanner);
- }
- }
-<FindFields>"[" { // attribute list in IDL
- yyextra->squareCount=1;
- yyextra->lastSquareContext = YY_START;
- BEGIN(SkipSquare);
- }
+ }
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ }
+ else // probably a redundant ,
+ {
+ yyextra->current->reset();
+ initEntry(yyscanner);
+ }
+ }
+<FindFields>"[" { // attribute list in IDL
+ yyextra->squareCount=1;
+ yyextra->lastSquareContext = YY_START;
+ BEGIN(SkipSquare);
+ }
/*
-<FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); }
+<FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); }
*/
-<ReadBody,ReadNSBody,ReadBodyIntf>[^\r\n\#{}"@'/<]* { yyextra->current->program += yytext ; }
-<ReadBody,ReadNSBody,ReadBodyIntf>"//".* { yyextra->current->program += yytext ; }
-<ReadBody,ReadNSBody,ReadBodyIntf>"#".* { if (!yyextra->insidePHP)
- REJECT;
- // append PHP comment.
- yyextra->current->program += yytext ;
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>@\" { yyextra->current->program += yytext ;
+<ReadBody,ReadNSBody,ReadBodyIntf>[^\r\n\#{}"@'/<]* { yyextra->current->program += yytext ; }
+<ReadBody,ReadNSBody,ReadBodyIntf>"//".* { yyextra->current->program += yytext ; }
+<ReadBody,ReadNSBody,ReadBodyIntf>"#".* { if (!yyextra->insidePHP)
+ REJECT;
+ // append PHP comment.
+ yyextra->current->program += yytext ;
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>@\" { yyextra->current->program += yytext ;
yyextra->pSkipVerbString = &yyextra->current->program;
yyextra->lastSkipVerbStringContext=YY_START;
BEGIN( SkipVerbString );
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>"<<<" { if (yyextra->insidePHP)
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>"<<<" { if (yyextra->insidePHP)
{
- yyextra->current->program += yytext ;
+ yyextra->current->program += yytext ;
yyextra->pCopyHereDocGString = &yyextra->current->program;
yyextra->lastHereDocContext=YY_START;
BEGIN( CopyHereDoc );
@@ -3535,61 +3600,61 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
{
REJECT;
}
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>\" { yyextra->current->program += yytext ;
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>\" { yyextra->current->program += yytext ;
yyextra->pCopyQuotedGString = &yyextra->current->program;
yyextra->lastStringContext=YY_START;
BEGIN( CopyGString );
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{B}* { yyextra->current->program += yytext ;
- yyextra->lastContext = YY_START ;
- BEGIN( Comment ) ;
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{BL} { yyextra->current->program += yytext ;
- ++yyextra->yyLineNr ;
- yyextra->lastContext = YY_START ;
- BEGIN( Comment ) ;
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>"'" {
- if (!yyextra->insidePHP)
- {
- yyextra->current->program += yytext;
- }
- else
- { // begin of single quoted string
- yyextra->current->program += yytext;
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{B}* { yyextra->current->program += yytext ;
+ yyextra->lastContext = YY_START ;
+ BEGIN( Comment ) ;
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{BL} { yyextra->current->program += yytext ;
+ ++yyextra->yyLineNr ;
+ yyextra->lastContext = YY_START ;
+ BEGIN( Comment ) ;
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>"'" {
+ if (!yyextra->insidePHP)
+ {
+ yyextra->current->program += yytext;
+ }
+ else
+ { // begin of single quoted string
+ yyextra->current->program += yytext;
yyextra->pCopyQuotedGString = &yyextra->current->program;
yyextra->lastStringContext=YY_START;
- BEGIN(CopyPHPGString);
- }
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>{CHARLIT} {
- if (yyextra->insidePHP)
- {
- REJECT; // for PHP code single quotes
- // are used for strings of arbitrary length
- }
- else
- {
- yyextra->current->program += yytext;
- }
+ BEGIN(CopyPHPGString);
+ }
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>{CHARLIT} {
+ if (yyextra->insidePHP)
+ {
+ REJECT; // for PHP code single quotes
+ // are used for strings of arbitrary length
+ }
+ else
+ {
+ yyextra->current->program += yytext;
+ }
}
<ReadBody,ReadNSBody,ReadBodyIntf>"{" { yyextra->current->program += yytext ;
- ++yyextra->curlyCount ;
- }
-<ReadBodyIntf>"}" {
- yyextra->current->program += yytext ;
- --yyextra->curlyCount ;
- }
-<ReadBody,ReadNSBody>"}" { //err("ReadBody count=%d\n",yyextra->curlyCount);
- if ( yyextra->curlyCount>0 )
- {
- yyextra->current->program += yytext ;
- --yyextra->curlyCount ;
- }
- else
- {
- yyextra->current->endBodyLine = yyextra->yyLineNr;
+ ++yyextra->curlyCount ;
+ }
+<ReadBodyIntf>"}" {
+ yyextra->current->program += yytext ;
+ --yyextra->curlyCount ;
+ }
+<ReadBody,ReadNSBody>"}" { //err("ReadBody count=%d\n",yyextra->curlyCount);
+ if ( yyextra->curlyCount>0 )
+ {
+ yyextra->current->program += yytext ;
+ --yyextra->curlyCount ;
+ }
+ else
+ {
+ yyextra->current->endBodyLine = yyextra->yyLineNr;
std::shared_ptr<Entry> original_root = yyextra->current_root; // save root this namespace is in
if (yyextra->current->section == Entry::NAMESPACE_SEC && yyextra->current->type == "namespace")
{
@@ -3616,10 +3681,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
yyextra->current->name = yyextra->current->name.left(split_point);
if (!yyextra->current_root->name.isEmpty()) yyextra->current->name.prepend(yyextra->current_root->name+"::");
- std::shared_ptr<Entry> tmp = yyextra->current;
yyextra->current_root->moveToSubEntryAndKeep(yyextra->current);
- yyextra->current_root = tmp;
-
+ yyextra->current_root = yyextra->current;
yyextra->current = new_current;
}
// restore documentation values
@@ -3630,811 +3693,817 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
yyextra->current->briefLine = briefLine;
yyextra->current->briefFile = briefFile;
}
- QCString &cn = yyextra->current->name;
- QCString rn = yyextra->current_root->name.copy();
- //printf("cn='%s' rn='%s' yyextra->isTypedef=%d\n",cn.data(),rn.data(),yyextra->isTypedef);
- if (!cn.isEmpty() && !rn.isEmpty())
- {
- prependScope(yyscanner);
- }
- if (yyextra->isTypedef && cn.isEmpty())
- {
- //printf("Typedef Name\n");
- BEGIN( TypedefName );
- }
- else
- {
- if ((yyextra->current->section == Entry::ENUM_SEC) || (yyextra->current->spec&Entry::Enum))
- {
- yyextra->current->program+=','; // add field terminator
- }
- // add compound definition to the tree
- yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args);
- // was: yyextra->current->args.simplifyWhiteSpace();
- yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- //printf("adding '%s' '%s' '%s' brief=%s yyextra->insideObjC=%d %x\n",yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data(),yyextra->current->brief.data(),yyextra->insideObjC,yyextra->current->section);
- if (yyextra->insideObjC &&
- ((yyextra->current->spec&Entry::Interface) || (yyextra->current->spec==Entry::Category))
- ) // method definition follows
- {
- BEGIN( ReadBodyIntf ) ;
- }
- else
- {
- yyextra->memspecEntry = yyextra->current;
- yyextra->current_root->copyToSubEntry( yyextra->current ) ;
- if (yyextra->current->section==Entry::NAMESPACE_SEC ||
- (yyextra->current->spec==Entry::Interface) ||
- yyextra->insideJava || yyextra->insidePHP || yyextra->insideCS || yyextra->insideD || yyextra->insideJS ||
+ QCString &cn = yyextra->current->name;
+ QCString rn = yyextra->current_root->name.copy();
+ //printf("cn='%s' rn='%s' yyextra->isTypedef=%d\n",cn.data(),rn.data(),yyextra->isTypedef);
+ if (!cn.isEmpty() && !rn.isEmpty())
+ {
+ prependScope(yyscanner);
+ }
+ if (yyextra->isTypedef && cn.isEmpty())
+ {
+ //printf("Typedef Name\n");
+ BEGIN( TypedefName );
+ }
+ else
+ {
+ if ((yyextra->current->section == Entry::ENUM_SEC) || (yyextra->current->spec&Entry::Enum))
+ {
+ yyextra->current->program+=','; // add field terminator
+ }
+ // add compound definition to the tree
+ yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args);
+ // was: yyextra->current->args.simplifyWhiteSpace();
+ yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ //printf("adding '%s' '%s' '%s' brief=%s yyextra->insideObjC=%d %x\n",yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data(),yyextra->current->brief.data(),yyextra->insideObjC,yyextra->current->section);
+ if (yyextra->insideObjC &&
+ ((yyextra->current->spec&Entry::Interface) || (yyextra->current->spec==Entry::Category))
+ ) // method definition follows
+ {
+ BEGIN( ReadBodyIntf ) ;
+ }
+ else
+ {
+ yyextra->memspecEntry = yyextra->current;
+ yyextra->current_root->moveToSubEntryAndKeep( yyextra->current ) ;
+ yyextra->current = std::make_shared<Entry>(*yyextra->current);
+ if (yyextra->current->section==Entry::NAMESPACE_SEC ||
+ (yyextra->current->spec==Entry::Interface) ||
+ yyextra->insideJava || yyextra->insidePHP || yyextra->insideCS || yyextra->insideD || yyextra->insideJS ||
yyextra->insideSlice
- )
- { // namespaces and interfaces and java classes ends with a closing bracket without semicolon
+ )
+ { // namespaces and interfaces and java classes ends with a closing bracket without semicolon
yyextra->current->reset();
yyextra->current_root = original_root; // restore scope from before namespace descent
- initEntry(yyscanner);
- yyextra->memspecEntry.reset();
- BEGIN( FindMembers ) ;
- }
- else
- {
+ initEntry(yyscanner);
+ yyextra->memspecEntry.reset();
+ BEGIN( FindMembers ) ;
+ }
+ else
+ {
static QRegExp re("@[0-9]+$");
- if (!yyextra->isTypedef && yyextra->memspecEntry &&
+ if (!yyextra->isTypedef && yyextra->memspecEntry &&
yyextra->memspecEntry->name.find(re)==-1) // not typedef or anonymous type (see bug691071)
- {
- // enabled the next two lines for bug 623424
- yyextra->current->doc.resize(0);
- yyextra->current->brief.resize(0);
- }
- BEGIN( MemberSpec ) ;
- }
- }
- }
- }
- }
-<ReadBody>"}"{BN}+"typedef"{BN}+ { //err("ReadBody count=%d\n",yyextra->curlyCount);
- lineCount(yyscanner);
- if ( yyextra->curlyCount>0 )
- {
- yyextra->current->program += yytext ;
- --yyextra->curlyCount ;
- }
- else
- {
- yyextra->isTypedef = TRUE;
- yyextra->current->endBodyLine = yyextra->yyLineNr;
- QCString &cn = yyextra->current->name;
- QCString rn = yyextra->current_root->name.copy();
- if (!cn.isEmpty() && !rn.isEmpty())
- {
- prependScope(yyscanner);
- }
- BEGIN( TypedefName );
- }
- }
-<TypedefName>("const"|"volatile"){BN} { // late "const" or "volatile" keyword
- lineCount(yyscanner);
- yyextra->current->type.prepend(yytext);
- }
-<TypedefName>{ID} {
- if ((yyextra->current->section == Entry::ENUM_SEC) || (yyextra->current->spec&Entry::Enum))
- {
- yyextra->current->program+=","; // add field terminator
- }
- yyextra->current->name=yytext;
- prependScope(yyscanner);
- yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
- yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
- //printf("Adding compound %s %s %s\n",yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data());
- if (!yyextra->firstTypedefEntry)
- {
- yyextra->firstTypedefEntry = yyextra->current;
- }
- yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
- initEntry(yyscanner);
- yyextra->isTypedef=TRUE; // to undo reset by initEntry(yyscanner)
- BEGIN(MemberSpecSkip);
- }
-<TypedefName>";" { /* typedef of anonymous type */
- yyextra->current->name.sprintf("@%d",yyextra->anonCount++);
- if ((yyextra->current->section == Entry::ENUM_SEC) || (yyextra->current->spec&Entry::Enum))
- {
- yyextra->current->program+=','; // add field terminator
- }
- // add compound definition to the tree
- yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
- yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
- yyextra->memspecEntry = yyextra->current;
- yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
- initEntry(yyscanner);
- unput(';');
- BEGIN( MemberSpec ) ;
- }
+ {
+ // enabled the next two lines for bug 623424
+ yyextra->current->doc.resize(0);
+ yyextra->current->brief.resize(0);
+ }
+ BEGIN( MemberSpec ) ;
+ }
+ }
+ }
+ }
+ }
+<ReadBody>"}"{BN}+"typedef"{BN}+ { //err("ReadBody count=%d\n",yyextra->curlyCount);
+ lineCount(yyscanner);
+ if ( yyextra->curlyCount>0 )
+ {
+ yyextra->current->program += yytext ;
+ --yyextra->curlyCount ;
+ }
+ else
+ {
+ yyextra->isTypedef = TRUE;
+ yyextra->current->endBodyLine = yyextra->yyLineNr;
+ QCString &cn = yyextra->current->name;
+ QCString rn = yyextra->current_root->name.copy();
+ if (!cn.isEmpty() && !rn.isEmpty())
+ {
+ prependScope(yyscanner);
+ }
+ BEGIN( TypedefName );
+ }
+ }
+<TypedefName>("const"|"volatile"){BN} { // late "const" or "volatile" keyword
+ lineCount(yyscanner);
+ yyextra->current->type.prepend(yytext);
+ }
+<TypedefName>{ID} {
+ if ((yyextra->current->section == Entry::ENUM_SEC) || (yyextra->current->spec&Entry::Enum))
+ {
+ yyextra->current->program+=","; // add field terminator
+ }
+ yyextra->current->name=yytext;
+ prependScope(yyscanner);
+ yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
+ yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
+ //printf("Adding compound %s %s %s\n",yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data());
+ if (!yyextra->firstTypedefEntry)
+ {
+ yyextra->firstTypedefEntry = yyextra->current;
+ }
+ yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
+ initEntry(yyscanner);
+ yyextra->isTypedef=TRUE; // to undo reset by initEntry(yyscanner)
+ BEGIN(MemberSpecSkip);
+ }
+<TypedefName>";" { /* typedef of anonymous type */
+ yyextra->current->name.sprintf("@%d",anonCount++);
+ if ((yyextra->current->section == Entry::ENUM_SEC) || (yyextra->current->spec&Entry::Enum))
+ {
+ yyextra->current->program+=','; // add field terminator
+ }
+ // add compound definition to the tree
+ yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
+ yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
+ yyextra->memspecEntry = yyextra->current;
+ yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
+ initEntry(yyscanner);
+ unput(';');
+ BEGIN( MemberSpec ) ;
+ }
<MemberSpec>([*&]*{BN}*)*{ID}{BN}*("["[^\]\n]*"]")* { // the [] part could be improved.
- lineCount(yyscanner);
- int i=0,l=(int)yyleng,j;
- while (i<l && (!isId(yytext[i]))) i++;
- yyextra->msName = QCString(yytext).right(l-i).stripWhiteSpace();
- j=yyextra->msName.find("[");
- if (j!=-1)
- {
- yyextra->msArgs=yyextra->msName.right(yyextra->msName.length()-j);
- yyextra->msName=yyextra->msName.left(j);
- }
- yyextra->msType=QCString(yytext).left(i);
-
- // handle *pName in: typedef { ... } name, *pName;
- if (yyextra->firstTypedefEntry)
- {
- if (yyextra->firstTypedefEntry->spec&Entry::Struct)
- {
- yyextra->msType.prepend("struct "+yyextra->firstTypedefEntry->name);
- }
- else if (yyextra->firstTypedefEntry->spec&Entry::Union)
- {
- yyextra->msType.prepend("union "+yyextra->firstTypedefEntry->name);
- }
- else if (yyextra->firstTypedefEntry->section==Entry::ENUM_SEC)
- {
- yyextra->msType.prepend("enum "+yyextra->firstTypedefEntry->name);
- }
- else
- {
- yyextra->msType.prepend(yyextra->firstTypedefEntry->name);
- }
- }
- }
-<MemberSpec>"(" { // function with struct return type
- addType(yyscanner);
- yyextra->current->name = yyextra->msName;
- yyextra->current->spec = 0;
- unput('(');
- BEGIN(FindMembers);
- }
-<MemberSpec>[,;] {
- if (yyextra->msName.isEmpty() && !yyextra->current->name.isEmpty())
- {
- // see if the compound does not have a name or is yyextra->inside another
- // anonymous compound. If so we insert a
- // special 'anonymous' variable.
- //Entry *p=yyextra->current_root;
+ lineCount(yyscanner);
+ int i=0,l=(int)yyleng,j;
+ while (i<l && (!isId(yytext[i]))) i++;
+ yyextra->msName = QCString(yytext).right(l-i).stripWhiteSpace();
+ j=yyextra->msName.find("[");
+ if (j!=-1)
+ {
+ yyextra->msArgs=yyextra->msName.right(yyextra->msName.length()-j);
+ yyextra->msName=yyextra->msName.left(j);
+ }
+ yyextra->msType=QCString(yytext).left(i);
+
+ // handle *pName in: typedef { ... } name, *pName;
+ if (yyextra->firstTypedefEntry)
+ {
+ if (yyextra->firstTypedefEntry->spec&Entry::Struct)
+ {
+ yyextra->msType.prepend("struct "+yyextra->firstTypedefEntry->name);
+ }
+ else if (yyextra->firstTypedefEntry->spec&Entry::Union)
+ {
+ yyextra->msType.prepend("union "+yyextra->firstTypedefEntry->name);
+ }
+ else if (yyextra->firstTypedefEntry->section==Entry::ENUM_SEC)
+ {
+ yyextra->msType.prepend("enum "+yyextra->firstTypedefEntry->name);
+ }
+ else
+ {
+ yyextra->msType.prepend(yyextra->firstTypedefEntry->name);
+ }
+ }
+ }
+<MemberSpec>"(" { // function with struct return type
+ addType(yyscanner);
+ yyextra->current->name = yyextra->msName;
+ yyextra->current->spec = 0;
+ unput('(');
+ BEGIN(FindMembers);
+ }
+<MemberSpec>[,;] {
+ if (yyextra->msName.isEmpty() && !yyextra->current->name.isEmpty())
+ {
+ // see if the compound does not have a name or is yyextra->inside another
+ // anonymous compound. If so we insert a
+ // special 'anonymous' variable.
+ //Entry *p=yyextra->current_root;
const Entry *p=yyextra->current.get();
- while (p)
- {
- // only look for class scopes, not namespace scopes
- if ((p->section & Entry::COMPOUND_MASK) && !p->name.isEmpty())
- {
- //printf("Trying scope '%s'\n",p->name.data());
- int i=p->name.findRev("::");
- int pi = (i==-1) ? 0 : i+2;
- if (p->name.at(pi)=='@')
- {
- // anonymous compound yyextra->inside -> insert dummy variable name
- //printf("Adding anonymous variable for scope %s\n",p->name.data());
- yyextra->msName.sprintf("@%d",yyextra->anonCount++);
- break;
- }
- }
- //p=p->parent;
- if (p==yyextra->current.get()) p=yyextra->current_root.get(); else p=p->parent();
- }
- }
- //printf("yyextra->msName=%s yyextra->current->name=%s\n",yyextra->msName.data(),yyextra->current->name.data());
- if (!yyextra->msName.isEmpty()
- /*&& yyextra->msName!=yyextra->current->name*/) // skip typedef T {} T;, removed due to bug608493
- {
- bool typedefHidesStruct = Config_getBool(TYPEDEF_HIDES_STRUCT);
- // case 1: typedef struct _S { ... } S_t;
- // -> omit typedef and use S_t as the struct name
- if (typedefHidesStruct &&
- yyextra->isTypedef &&
- ((yyextra->current->spec&(Entry::Struct|Entry::Union)) ||
- yyextra->current->section==Entry::ENUM_SEC )&&
- yyextra->msType.stripWhiteSpace().isEmpty() &&
- yyextra->memspecEntry)
- {
- yyextra->memspecEntry->name=yyextra->msName;
- }
- else // case 2: create a typedef field
- {
+ while (p)
+ {
+ // only look for class scopes, not namespace scopes
+ if ((p->section & Entry::COMPOUND_MASK) && !p->name.isEmpty())
+ {
+ //printf("Trying scope '%s'\n",p->name.data());
+ int i=p->name.findRev("::");
+ int pi = (i==-1) ? 0 : i+2;
+ if (p->name.at(pi)=='@')
+ {
+ // anonymous compound yyextra->inside -> insert dummy variable name
+ //printf("Adding anonymous variable for scope %s\n",p->name.data());
+ yyextra->msName.sprintf("@%d",anonCount++);
+ break;
+ }
+ }
+ //p=p->parent;
+ if (p==yyextra->current.get()) p=yyextra->current_root.get(); else p=p->parent();
+ }
+ }
+ //printf("yyextra->msName=%s yyextra->current->name=%s\n",yyextra->msName.data(),yyextra->current->name.data());
+ if (!yyextra->msName.isEmpty()
+ /*&& yyextra->msName!=yyextra->current->name*/) // skip typedef T {} T;, removed due to bug608493
+ {
+ bool typedefHidesStruct = Config_getBool(TYPEDEF_HIDES_STRUCT);
+ // case 1: typedef struct _S { ... } S_t;
+ // -> omit typedef and use S_t as the struct name
+ if (typedefHidesStruct &&
+ yyextra->isTypedef &&
+ ((yyextra->current->spec&(Entry::Struct|Entry::Union)) ||
+ yyextra->current->section==Entry::ENUM_SEC )&&
+ yyextra->msType.stripWhiteSpace().isEmpty() &&
+ yyextra->memspecEntry)
+ {
+ yyextra->memspecEntry->name=yyextra->msName;
+ }
+ else // case 2: create a typedef field
+ {
std::shared_ptr<Entry> varEntry=std::make_shared<Entry>();
- varEntry->lang = yyextra->language;
- varEntry->protection = yyextra->current->protection ;
- varEntry->mtype = yyextra->current->mtype;
- varEntry->virt = yyextra->current->virt;
- varEntry->stat = yyextra->current->stat;
- varEntry->section = Entry::VARIABLE_SEC;
- varEntry->name = yyextra->msName.stripWhiteSpace();
- varEntry->type = yyextra->current->type.simplifyWhiteSpace()+" ";
- varEntry->args = yyextra->msArgs;
- if (yyextra->isTypedef)
- {
- varEntry->type.prepend("typedef ");
- // //printf("yyextra->current->name = %s %s\n",yyextra->current->name.data(),yyextra->msName.data());
- }
- if (typedefHidesStruct &&
- yyextra->isTypedef &&
- (yyextra->current->spec&(Entry::Struct|Entry::Union)) &&
- yyextra->memspecEntry
- ) // case 1: use S_t as type for pS_t in "typedef struct _S {} S_t, *pS_t;"
- {
- varEntry->type+=yyextra->memspecEntry->name+yyextra->msType;
- }
- else // case 2: use _S as type for for pS_t
- {
- varEntry->type+=yyextra->current->name+yyextra->msType;
- }
- varEntry->fileName = yyextra->yyFileName;
- varEntry->startLine = yyextra->yyLineNr;
- varEntry->startColumn = yyextra->yyColNr;
- varEntry->doc = yyextra->current->doc.copy();
- varEntry->brief = yyextra->current->brief.copy();
- varEntry->mGrpId = yyextra->current->mGrpId;
+ varEntry->lang = yyextra->language;
+ varEntry->protection = yyextra->current->protection ;
+ varEntry->mtype = yyextra->current->mtype;
+ varEntry->virt = yyextra->current->virt;
+ varEntry->stat = yyextra->current->stat;
+ varEntry->section = Entry::VARIABLE_SEC;
+ varEntry->name = yyextra->msName.stripWhiteSpace();
+ varEntry->type = yyextra->current->type.simplifyWhiteSpace()+" ";
+ varEntry->args = yyextra->msArgs;
+ if (yyextra->isTypedef)
+ {
+ varEntry->type.prepend("typedef ");
+ // //printf("yyextra->current->name = %s %s\n",yyextra->current->name.data(),yyextra->msName.data());
+ }
+ if (typedefHidesStruct &&
+ yyextra->isTypedef &&
+ (yyextra->current->spec&(Entry::Struct|Entry::Union)) &&
+ yyextra->memspecEntry
+ ) // case 1: use S_t as type for pS_t in "typedef struct _S {} S_t, *pS_t;"
+ {
+ varEntry->type+=yyextra->memspecEntry->name+yyextra->msType;
+ }
+ else // case 2: use _S as type for for pS_t
+ {
+ varEntry->type+=yyextra->current->name+yyextra->msType;
+ }
+ varEntry->fileName = yyextra->yyFileName;
+ varEntry->startLine = yyextra->yyLineNr;
+ varEntry->startColumn = yyextra->yyColNr;
+ varEntry->doc = yyextra->current->doc.copy();
+ varEntry->brief = yyextra->current->brief.copy();
+ varEntry->mGrpId = yyextra->current->mGrpId;
varEntry->initializer = yyextra->current->initializer;
varEntry->groups = yyextra->current->groups;
varEntry->sli = yyextra->current->sli;
- //printf("Add: type='%s',name='%s',args='%s' brief=%s doc=%s\n",
- // varEntry->type.data(),varEntry->name.data(),
- // varEntry->args.data(),varEntry->brief.data(),varEntry->doc.data());
- yyextra->current_root->moveToSubEntryAndKeep(varEntry);
- }
- }
- if (*yytext==';') // end of a struct/class ...
- {
- if (!yyextra->isTypedef && yyextra->msName.isEmpty() && yyextra->memspecEntry && (yyextra->current->section&Entry::COMPOUND_MASK))
- { // case where a class/struct has a doc block after it
- if (!yyextra->current->doc.isEmpty())
- {
- yyextra->memspecEntry->doc += yyextra->current->doc;
- }
- if (!yyextra->current->brief.isEmpty())
- {
- yyextra->memspecEntry->brief += yyextra->current->brief;
- }
- }
- yyextra->msType.resize(0);
- yyextra->msName.resize(0);
- yyextra->msArgs.resize(0);
- yyextra->isTypedef=FALSE;
- yyextra->firstTypedefEntry.reset();
- yyextra->memspecEntry.reset();
- yyextra->current->reset();
- initEntry(yyscanner);
- BEGIN( FindMembers );
- }
- else
- {
- yyextra->current->doc.resize(0);
- yyextra->current->brief.resize(0);
- }
-
- }
-<MemberSpec>"=" {
- yyextra->lastInitializerContext=YY_START;
- yyextra->initBracketCount=0;
+ //printf("Add: type='%s',name='%s',args='%s' brief=%s doc=%s\n",
+ // varEntry->type.data(),varEntry->name.data(),
+ // varEntry->args.data(),varEntry->brief.data(),varEntry->doc.data());
+ yyextra->current_root->moveToSubEntryAndKeep(varEntry);
+ }
+ }
+ if (*yytext==';') // end of a struct/class ...
+ {
+ if (!yyextra->isTypedef && yyextra->msName.isEmpty() && yyextra->memspecEntry && (yyextra->current->section&Entry::COMPOUND_MASK))
+ { // case where a class/struct has a doc block after it
+ if (!yyextra->current->doc.isEmpty())
+ {
+ yyextra->memspecEntry->doc += yyextra->current->doc;
+ }
+ if (!yyextra->current->brief.isEmpty())
+ {
+ yyextra->memspecEntry->brief += yyextra->current->brief;
+ }
+ }
+ yyextra->msType.resize(0);
+ yyextra->msName.resize(0);
+ yyextra->msArgs.resize(0);
+ yyextra->isTypedef=FALSE;
+ yyextra->firstTypedefEntry.reset();
+ yyextra->memspecEntry.reset();
+ yyextra->current->reset();
+ initEntry(yyscanner);
+ BEGIN( FindMembers );
+ }
+ else
+ {
+ yyextra->current->doc.resize(0);
+ yyextra->current->brief.resize(0);
+ }
+
+ }
+<MemberSpec>"=" {
+ yyextra->lastInitializerContext=YY_START;
+ yyextra->initBracketCount=0;
yyextra->current->initializer = yytext;
- BEGIN(ReadInitializer);
- /* BEGIN(MemberSpecSkip); */
- }
+ BEGIN(ReadInitializer);
+ /* BEGIN(MemberSpecSkip); */
+ }
/*
-<MemberSpecSkip>"{" {
- yyextra->curlyCount=0;
- yyextra->lastCurlyContext = MemberSpecSkip;
- yyextra->previous = yyextra->current;
- BEGIN(SkipCurly);
- }
+<MemberSpecSkip>"{" {
+ yyextra->curlyCount=0;
+ yyextra->lastCurlyContext = MemberSpecSkip;
+ yyextra->previous = yyextra->current;
+ BEGIN(SkipCurly);
+ }
*/
-<MemberSpecSkip>"," { BEGIN(MemberSpec); }
-<MemberSpecSkip>";" { unput(';'); BEGIN(MemberSpec); }
+<MemberSpecSkip>"," { BEGIN(MemberSpec); }
+<MemberSpecSkip>";" { unput(';'); BEGIN(MemberSpec); }
<ReadBody,ReadNSBody,ReadBodyIntf>{BN}{1,80} { yyextra->current->program += yytext ;
- lineCount(yyscanner) ;
- }
-<ReadBodyIntf>"@end"/[^a-z_A-Z0-9] { // end of Objective C block
- yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
- initEntry(yyscanner);
- yyextra->language = yyextra->current->lang = SrcLangExt_Cpp; // see bug746361
- yyextra->insideObjC=FALSE;
- BEGIN( FindMembers );
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>. { yyextra->current->program += yytext ; }
+ lineCount(yyscanner) ;
+ }
+<ReadBodyIntf>"@end"/[^a-z_A-Z0-9] { // end of Objective C block
+ yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
+ initEntry(yyscanner);
+ yyextra->language = yyextra->current->lang = SrcLangExt_Cpp; // see bug746361
+ yyextra->insideObjC=FALSE;
+ BEGIN( FindMembers );
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>. { yyextra->current->program += yytext ; }
<FindMembers>"("/{BN}*"::"*{BN}*({TSCOPE}{BN}*"::")*{TSCOPE}{BN}*")"{BN}*"(" | /* typedef void (A<int>::func_t)(args...) */
<FindMembers>("("({BN}*"::"*{BN}*{TSCOPE}{BN}*"::")*({BN}*[*&\^]{BN}*)+)+ { /* typedef void (A::*ptr_t)(args...) or int (*func(int))[], the ^ is for Obj-C blocks */
- if (yyextra->insidePHP) // reference parameter
- {
- REJECT
- }
- else
- {
- yyextra->current->bodyLine = yyextra->yyLineNr;
- lineCount(yyscanner);
- addType(yyscanner);
- yyextra->funcPtrType=yytext;
- yyextra->roundCount=0;
- //yyextra->current->type += yytext;
- BEGIN( FuncPtr );
- }
- }
-<FuncPtr>{SCOPENAME} {
- yyextra->current->name = yytext;
- if (nameIsOperator(yyextra->current->name))
- {
- BEGIN( FuncPtrOperator );
- }
- else
- {
- if (yyextra->current->name=="const" || yyextra->current->name=="volatile")
- {
- yyextra->funcPtrType += yyextra->current->name;
- }
- else
- {
- BEGIN( EndFuncPtr );
- }
- }
- }
-<FuncPtr>. {
- //printf("error: FuncPtr '%c' unexpected at line %d of %s\n",*yytext,yyextra->yyLineNr,yyextra->yyFileName);
- }
-<FuncPtrOperator>"("{BN}*")"{BN}*/"(" {
- yyextra->current->name += yytext;
- yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
- lineCount(yyscanner);
- }
-<FuncPtrOperator>\n {
+ if (yyextra->insidePHP) // reference parameter
+ {
+ REJECT
+ }
+ else
+ {
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ lineCount(yyscanner);
+ addType(yyscanner);
+ yyextra->funcPtrType=yytext;
+ yyextra->roundCount=0;
+ //yyextra->current->type += yytext;
+ BEGIN( FuncPtr );
+ }
+ }
+<FuncPtr>{SCOPENAME} {
+ yyextra->current->name = yytext;
+ if (nameIsOperator(yyextra->current->name))
+ {
+ BEGIN( FuncPtrOperator );
+ }
+ else
+ {
+ if (yyextra->current->name=="const" || yyextra->current->name=="volatile")
+ {
+ yyextra->funcPtrType += yyextra->current->name;
+ }
+ else
+ {
+ BEGIN( EndFuncPtr );
+ }
+ }
+ }
+<FuncPtr>. {
+ //printf("error: FuncPtr '%c' unexpected at line %d of %s\n",*yytext,yyextra->yyLineNr,yyextra->yyFileName);
+ }
+<FuncPtrOperator>"("{BN}*")"{BN}*/"(" {
+ yyextra->current->name += yytext;
+ yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
lineCount(yyscanner);
- yyextra->current->name += *yytext;
- }
-<FuncPtrOperator>"(" {
- unput(*yytext);
- BEGIN( EndFuncPtr );
- }
-<FuncPtrOperator>. {
- yyextra->current->name += *yytext;
- }
-<EndFuncPtr>")"{BN}*/";" { // a variable with extra braces
- lineCount(yyscanner);
- yyextra->current->type+=yyextra->funcPtrType.data()+1;
- BEGIN(FindMembers);
- }
-<EndFuncPtr>")"{BN}*/"(" { // a function pointer
- lineCount(yyscanner);
- yyextra->current->type+=yyextra->funcPtrType+")";
- BEGIN(FindMembers);
- }
-<EndFuncPtr>")"{BN}*/"[" { // an array of variables
- lineCount(yyscanner);
- yyextra->current->type+=yyextra->funcPtrType.data();
- yyextra->current->args += ")";
- BEGIN(FindMembers);
- }
-<EndFuncPtr>"(" { // a function returning a function or
+ }
+<FuncPtrOperator>\n {
+ lineCount(yyscanner);
+ yyextra->current->name += *yytext;
+ }
+<FuncPtrOperator>"(" {
+ unput(*yytext);
+ BEGIN( EndFuncPtr );
+ }
+<FuncPtrOperator>. {
+ yyextra->current->name += *yytext;
+ }
+<EndFuncPtr>")"{BN}*/";" { // a variable with extra braces
+ lineCount(yyscanner);
+ yyextra->current->type+=yyextra->funcPtrType.data()+1;
+ BEGIN(FindMembers);
+ }
+<EndFuncPtr>")"{BN}*/"(" { // a function pointer
+ lineCount(yyscanner);
+ yyextra->current->type+=yyextra->funcPtrType+")";
+ BEGIN(FindMembers);
+ }
+<EndFuncPtr>")"{BN}*/"[" { // an array of variables
+ lineCount(yyscanner);
+ yyextra->current->type+=yyextra->funcPtrType.data();
+ yyextra->current->args += ")";
+ BEGIN(FindMembers);
+ }
+<EndFuncPtr>"(" { // a function returning a function or
// a function returning a pointer to an array
- yyextra->current->args += *yytext ;
- //yyextra->roundCount=0;
- //BEGIN( FuncFunc );
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->currentArgumentContext = FuncFuncEnd;
- yyextra->fullArgString=yyextra->current->args.copy();
- yyextra->copyArgString=&yyextra->current->args;
- BEGIN( ReadFuncArgType ) ;
- }
-<EndFuncPtr>"["[^\n\]]*"]" {
- yyextra->funcPtrType+=yytext;
- }
-<EndFuncPtr>")" {
- BEGIN(FindMembers);
- }
-<FuncFunc>"(" {
- yyextra->current->args += *yytext ;
- ++yyextra->roundCount;
- }
-<FuncFunc>")" {
- yyextra->current->args += *yytext ;
- if ( yyextra->roundCount )
- --yyextra->roundCount;
- else
- {
- BEGIN(FuncFuncEnd);
- }
- }
-<FuncFuncEnd>")"{BN}*"(" {
- lineCount(yyscanner);
- yyextra->current->type+=yyextra->funcPtrType+")(";
- BEGIN(FuncFuncType);
- }
-<FuncFuncEnd>")"{BN}*/[;{] {
- lineCount(yyscanner);
- yyextra->current->type+=yyextra->funcPtrType.data()+1;
- BEGIN(Function);
- }
-<FuncFuncEnd>")"{BN}*/"[" { // function returning a pointer to an array
+ yyextra->current->args += *yytext ;
+ //yyextra->roundCount=0;
+ //BEGIN( FuncFunc );
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->currentArgumentContext = FuncFuncEnd;
+ yyextra->fullArgString=yyextra->current->args.copy();
+ yyextra->copyArgString=&yyextra->current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+<EndFuncPtr>"["[^\n\]]*"]" {
+ yyextra->funcPtrType+=yytext;
+ }
+<EndFuncPtr>")" {
+ BEGIN(FindMembers);
+ }
+<FuncFunc>"(" {
+ yyextra->current->args += *yytext ;
+ ++yyextra->roundCount;
+ }
+<FuncFunc>")" {
+ yyextra->current->args += *yytext ;
+ if ( yyextra->roundCount )
+ --yyextra->roundCount;
+ else
+ {
+ BEGIN(FuncFuncEnd);
+ }
+ }
+<FuncFuncEnd>")"{BN}*"(" {
+ lineCount(yyscanner);
+ yyextra->current->type+=yyextra->funcPtrType+")(";
+ BEGIN(FuncFuncType);
+ }
+<FuncFuncEnd>")"{BN}*/[;{] {
lineCount(yyscanner);
- yyextra->current->type+=yyextra->funcPtrType;
- yyextra->current->args+=")";
- BEGIN(FuncFuncArray);
- }
-<FuncFuncEnd>. {
- yyextra->current->args += *yytext;
- }
-<FuncFuncType>"(" {
- yyextra->current->type += *yytext;
- yyextra->roundCount++;
- }
-<FuncFuncType>")" {
- yyextra->current->type += *yytext;
- if (yyextra->roundCount)
- --yyextra->roundCount;
- else
- BEGIN(Function);
- }
-<FuncFuncType>{BN}*","{BN}* { lineCount(yyscanner) ; yyextra->current->type += ", " ; }
-<FuncFuncType>{BN}+ { lineCount(yyscanner) ; yyextra->current->type += ' ' ; }
-<FuncFuncType>. {
- yyextra->current->type += *yytext;
- }
+ yyextra->current->type+=yyextra->funcPtrType.data()+1;
+ BEGIN(Function);
+ }
+<FuncFuncEnd>")"{BN}*/"[" { // function returning a pointer to an array
+ lineCount(yyscanner);
+ yyextra->current->type+=yyextra->funcPtrType;
+ yyextra->current->args+=")";
+ BEGIN(FuncFuncArray);
+ }
+<FuncFuncEnd>. {
+ yyextra->current->args += *yytext;
+ }
+<FuncFuncType>"(" {
+ yyextra->current->type += *yytext;
+ yyextra->roundCount++;
+ }
+<FuncFuncType>")" {
+ yyextra->current->type += *yytext;
+ if (yyextra->roundCount)
+ --yyextra->roundCount;
+ else
+ BEGIN(Function);
+ }
+<FuncFuncType>{BN}*","{BN}* { lineCount(yyscanner) ; yyextra->current->type += ", " ; }
+<FuncFuncType>{BN}+ { lineCount(yyscanner) ; yyextra->current->type += ' ' ; }
+<FuncFuncType>. {
+ yyextra->current->type += *yytext;
+ }
<FindMembers>"("/{BN}*{ID}{BN}*"*"{BN}*{ID}*")"{BN}*"(" { // for catching typedef void (__stdcall *f)() like definitions
- if (yyextra->current->type.left(7)=="typedef" && yyextra->current->bodyLine==-1)
- // the bodyLine check is to prevent this guard to be true more than once
- {
- yyextra->current->bodyLine = yyextra->yyLineNr;
- BEGIN( GetCallType );
- }
- else if (!yyextra->current->name.isEmpty()) // normal function
- {
- yyextra->current->args = yytext;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->currentArgumentContext = FuncQual;
- yyextra->fullArgString=yyextra->current->args.copy();
- yyextra->copyArgString=&yyextra->current->args;
- BEGIN( ReadFuncArgType ) ;
- //printf(">>> Read function arguments!\n");
- }
- }
-<GetCallType>{BN}*{ID}{BN}*"*" {
- lineCount(yyscanner);
- addType(yyscanner);
- yyextra->funcPtrType="(";
- yyextra->funcPtrType+=yytext;
- yyextra->roundCount=0;
- BEGIN( FuncPtr );
- }
-<FindMembers>"(" {
+ if (yyextra->current->type.left(7)=="typedef" && yyextra->current->bodyLine==-1)
+ // the bodyLine check is to prevent this guard to be true more than once
+ {
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ BEGIN( GetCallType );
+ }
+ else if (!yyextra->current->name.isEmpty()) // normal function
+ {
+ yyextra->current->args = yytext;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->currentArgumentContext = FuncQual;
+ yyextra->fullArgString=yyextra->current->args.copy();
+ yyextra->copyArgString=&yyextra->current->args;
+ BEGIN( ReadFuncArgType ) ;
+ //printf(">>> Read function arguments!\n");
+ }
+ }
+<GetCallType>{BN}*{ID}{BN}*"*" {
+ lineCount(yyscanner);
+ addType(yyscanner);
+ yyextra->funcPtrType="(";
+ yyextra->funcPtrType+=yytext;
+ yyextra->roundCount=0;
+ BEGIN( FuncPtr );
+ }
+<FindMembers>"(" {
if (!yyextra->current->name.isEmpty())
- {
- yyextra->current->args = yytext;
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->currentArgumentContext = FuncQual;
- yyextra->fullArgString=yyextra->current->args.copy();
- yyextra->copyArgString=&yyextra->current->args;
- BEGIN( ReadFuncArgType ) ;
- //printf(">>> Read function arguments yyextra->current->argList.size()=%d\n",yyextra->current->argList.size());
- }
- }
+ {
+ yyextra->current->args = yytext;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->currentArgumentContext = FuncQual;
+ yyextra->fullArgString=yyextra->current->args.copy();
+ yyextra->copyArgString=&yyextra->current->args;
+ BEGIN( ReadFuncArgType ) ;
+ //printf(">>> Read function arguments yyextra->current->argList.size()=%d\n",yyextra->current->argList.size());
+ }
+ }
/*
-<FindMembers>"("{BN}*("void"{BN}*)?")" {
- lineCount(yyscanner);
- yyextra->current->args = "()";
- BEGIN( FuncQual );
- }
+<FindMembers>"("{BN}*("void"{BN}*)?")" {
+ lineCount(yyscanner);
+ yyextra->current->args = "()";
+ BEGIN( FuncQual );
+ }
*/
/*- Function argument reading rules ---------------------------------------*/
-<ReadFuncArgType>[^ \/\r\t\n\)\(\"\'#]+ { *yyextra->copyArgString+=yytext;
- yyextra->fullArgString+=yytext;
- }
-<CopyArgString,CopyArgPHPString>[^\n\\\"\']+ { *yyextra->copyArgString+=yytext;
- yyextra->fullArgString+=yytext;
- }
-<CopyArgRound>[^\/\n\)\(\"\']+ {
- *yyextra->copyArgString+=yytext;
- yyextra->fullArgString+=yytext;
- }
-<ReadFuncArgType,ReadTempArgs>{BN}* {
- *yyextra->copyArgString+=" ";
- yyextra->fullArgString+=" ";
- lineCount(yyscanner);
- }
-<ReadFuncArgType,CopyArgRound,CopyArgSharp,ReadTempArgs>{RAWBEGIN} {
+<ReadFuncArgType>[^ \/\r\t\n\)\(\"\'#]+ { *yyextra->copyArgString+=yytext;
+ yyextra->fullArgString+=yytext;
+ }
+<CopyArgString,CopyArgPHPString>[^\n\\\"\']+ { *yyextra->copyArgString+=yytext;
+ yyextra->fullArgString+=yytext;
+ }
+<CopyArgRound>[^\/\n\)\(\"\']+ {
+ *yyextra->copyArgString+=yytext;
+ yyextra->fullArgString+=yytext;
+ }
+<ReadFuncArgType,ReadTempArgs>{BN}* {
+ *yyextra->copyArgString+=" ";
+ yyextra->fullArgString+=" ";
+ lineCount(yyscanner);
+ }
+<ReadFuncArgType,CopyArgRound,CopyArgSharp,ReadTempArgs>{RAWBEGIN} {
yyextra->delimiter = yytext+2;
yyextra->delimiter=yyextra->delimiter.left(yyextra->delimiter.length()-1);
yyextra->lastRawStringContext = YY_START;
yyextra->pCopyRawString = yyextra->copyArgString;
*yyextra->pCopyRawString+=yytext;
- yyextra->fullArgString+=yytext;
+ yyextra->fullArgString+=yytext;
BEGIN(RawString);
}
-<ReadFuncArgType,CopyArgRound,CopyArgSharp,ReadTempArgs>\" {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- yyextra->lastCopyArgStringContext = YY_START;
- BEGIN( CopyArgString );
- }
-<ReadFuncArgType,ReadTempArgs>"(" {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- yyextra->argRoundCount=0;
- yyextra->lastCopyArgContext = YY_START;
- BEGIN( CopyArgRound );
- }
-<ReadFuncArgType>")" {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- stringToArgumentList(yyextra->language, yyextra->fullArgString,yyextra->current->argList);
- if (yyextra->insideJS)
- {
- fixArgumentListForJavaScript(yyextra->current->argList);
- }
+<ReadFuncArgType,CopyArgRound,CopyArgSharp,ReadTempArgs>\" {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ yyextra->lastCopyArgStringContext = YY_START;
+ BEGIN( CopyArgString );
+ }
+<ReadFuncArgType,ReadTempArgs>"(" {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ yyextra->argRoundCount=0;
+ yyextra->lastCopyArgContext = YY_START;
+ BEGIN( CopyArgRound );
+ }
+<ReadFuncArgType>")" {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ yyextra->current->argList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
+ if (yyextra->insideJS)
+ {
+ fixArgumentListForJavaScript(yyextra->current->argList);
+ }
handleParametersCommentBlocks(yyscanner,yyextra->current->argList);
- /* remember the yyextra->current documentation block, since
- we could overwrite it with the documentation of
- a function argument, which we then have to correct later
- on
- */
- yyextra->docBackup = yyextra->current->doc;
- yyextra->briefBackup = yyextra->current->brief;
-
- BEGIN( yyextra->currentArgumentContext );
- }
- /* a special comment */
-<ReadFuncArgType,ReadTempArgs>("/*"[*!]|"//"[/!])("<"?) {
+ /* remember the yyextra->current documentation block, since
+ we could overwrite it with the documentation of
+ a function argument, which we then have to correct later
+ on
+ */
+ yyextra->docBackup = yyextra->current->doc;
+ yyextra->briefBackup = yyextra->current->brief;
+
+ BEGIN( yyextra->currentArgumentContext );
+ }
+ /* a special comment */
+<ReadFuncArgType,ReadTempArgs>("/*"[*!]|"//"[/!])("<"?) {
if (yyextra->currentArgumentContext==DefineEnd)
- {
- // for defines we interpret a comment
- // as documentation for the define
- int i;for (i=(int)yyleng-1;i>=0;i--)
- {
- unput(yytext[i]);
- }
- stringToArgumentList(yyextra->language, yyextra->fullArgString,yyextra->current->argList);
+ {
+ // for defines we interpret a comment
+ // as documentation for the define
+ int i;for (i=(int)yyleng-1;i>=0;i--)
+ {
+ unput(yytext[i]);
+ }
+ yyextra->current->argList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
handleParametersCommentBlocks(yyscanner,yyextra->current->argList);
- BEGIN( yyextra->currentArgumentContext );
- }
- else // not a define
- {
- // for functions we interpret a comment
- // as documentation for the argument
- yyextra->fullArgString+=yytext;
- yyextra->lastCopyArgChar=0;
- yyextra->lastCommentInArgContext=YY_START;
- if (yytext[1]=='/')
- BEGIN( CopyArgCommentLine );
- else
- BEGIN( CopyArgComment );
- }
- }
- /* a non-special comment */
-<ReadFuncArgType,ReadTempArgs>"/**/" { /* empty comment */ }
-<ReadFuncArgType,ReadTempArgs>"/*" {
- yyextra->lastCContext = YY_START;
- BEGIN( SkipComment );
- }
-<ReadFuncArgType,ReadTempArgs>"//" {
- yyextra->lastCContext = YY_START;
- BEGIN( SkipCxxComment );
- }
+ BEGIN( yyextra->currentArgumentContext );
+ }
+ else // not a define
+ {
+ // for functions we interpret a comment
+ // as documentation for the argument
+ yyextra->fullArgString+=yytext;
+ yyextra->lastCopyArgChar=0;
+ yyextra->lastCommentInArgContext=YY_START;
+ if (yytext[1]=='/')
+ BEGIN( CopyArgCommentLine );
+ else
+ BEGIN( CopyArgComment );
+ }
+ }
+ /* a non-special comment */
+<ReadFuncArgType,ReadTempArgs>"/**/" { /* empty comment */ }
+<ReadFuncArgType,ReadTempArgs>"/*" {
+ yyextra->lastCContext = YY_START;
+ BEGIN( SkipComment );
+ }
+<ReadFuncArgType,ReadTempArgs>"//" {
+ yyextra->lastCContext = YY_START;
+ BEGIN( SkipCxxComment );
+ }
/*
-<ReadFuncArgType,ReadTempArgs>"'#" { if (yyextra->insidePHP)
+<ReadFuncArgType,ReadTempArgs>"'#" { if (yyextra->insidePHP)
REJECT;
- *yyextra->copyArgString+=yytext;
- yyextra->fullArgString+=yytext;
- }
-<ReadFuncArgType,ReadTempArgs>"#" {
- if (!yyextra->insidePHP)
- REJECT;
- yyextra->lastCContext = YY_START;
- BEGIN( SkipCxxComment );
- }
+ *yyextra->copyArgString+=yytext;
+ yyextra->fullArgString+=yytext;
+ }
+<ReadFuncArgType,ReadTempArgs>"#" {
+ if (!yyextra->insidePHP)
+ REJECT;
+ yyextra->lastCContext = YY_START;
+ BEGIN( SkipCxxComment );
+ }
*/
- /* ')' followed by a special comment */
-<ReadFuncArgType>")"{BN}*("/*"[*!]|"//"[/!])"<" {
- lineCount(yyscanner);
+ /* ')' followed by a special comment */
+<ReadFuncArgType>")"{BN}*("/*"[*!]|"//"[/!])"<" {
+ lineCount(yyscanner);
if (yyextra->currentArgumentContext==DefineEnd)
- {
- // for defines we interpret a comment
- // as documentation for the define
- int i;for (i=(int)yyleng-1;i>0;i--)
- {
- unput(yytext[i]);
- }
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- stringToArgumentList(yyextra->language, yyextra->fullArgString,yyextra->current->argList);
+ {
+ // for defines we interpret a comment
+ // as documentation for the define
+ int i;for (i=(int)yyleng-1;i>0;i--)
+ {
+ unput(yytext[i]);
+ }
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ yyextra->current->argList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
handleParametersCommentBlocks(yyscanner,yyextra->current->argList);
- BEGIN( yyextra->currentArgumentContext );
- }
- else
- {
- // for functions we interpret a comment
- // as documentation for the yyextra->last argument
- yyextra->lastCopyArgChar=*yytext;
- QCString text=&yytext[1];
- text=text.stripWhiteSpace();
- yyextra->lastCommentInArgContext=YY_START;
- yyextra->fullArgString+=text;
- if (text.find("//")!=-1)
- BEGIN( CopyArgCommentLine );
- else
- BEGIN( CopyArgComment );
- }
- }
-<CopyArgComment>^{B}*"*"+/{BN}+
-<CopyArgComment>[^\n\\\@\*]+ { yyextra->fullArgString+=yytext; }
-<CopyArgComment>"*/" { yyextra->fullArgString+=yytext;
- if (yyextra->lastCopyArgChar!=0)
- unput(yyextra->lastCopyArgChar);
- BEGIN( yyextra->lastCommentInArgContext );
- }
-<CopyArgCommentLine>\n { yyextra->fullArgString+=yytext;
+ BEGIN( yyextra->currentArgumentContext );
+ }
+ else
+ {
+ // for functions we interpret a comment
+ // as documentation for the yyextra->last argument
+ yyextra->lastCopyArgChar=*yytext;
+ QCString text=&yytext[1];
+ text=text.stripWhiteSpace();
+ yyextra->lastCommentInArgContext=YY_START;
+ yyextra->fullArgString+=text;
+ if (text.find("//")!=-1)
+ BEGIN( CopyArgCommentLine );
+ else
+ BEGIN( CopyArgComment );
+ }
+ }
+<CopyArgComment>^{B}*"*"+/{BN}+
+<CopyArgComment>[^\n\\\@\*]+ { yyextra->fullArgString+=yytext; }
+<CopyArgComment>"*/" { yyextra->fullArgString+=yytext;
+ if (yyextra->lastCopyArgChar!=0)
+ unput(yyextra->lastCopyArgChar);
+ BEGIN( yyextra->lastCommentInArgContext );
+ }
+<CopyArgCommentLine>\n { yyextra->fullArgString+=yytext;
lineCount(yyscanner);
- if (yyextra->lastCopyArgChar!=0)
- unput(yyextra->lastCopyArgChar);
- BEGIN( yyextra->lastCommentInArgContext );
- }
-<CopyArgCommentLine>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!)
- yyextra->docBlockName=&yytext[1];
- yyextra->fullArgString+=yytext;
- BEGIN(CopyArgVerbatim);
- }
-<CopyArgCommentLine>{CMD}("f$"|"f["|"f{") {
- yyextra->docBlockName=&yytext[1];
- if (yyextra->docBlockName.at(1)=='[')
- {
- yyextra->docBlockName.at(1)='}';
- }
- if (yyextra->docBlockName.at(1)=='{')
- {
- yyextra->docBlockName.at(1)='}';
- }
- yyextra->fullArgString+=yytext;
- BEGIN(CopyArgVerbatim);
- }
-<CopyArgVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9\-] { // end of verbatim block
- yyextra->fullArgString+=yytext;
- if (yytext[1]=='f') // end of formula
- {
- BEGIN(CopyArgCommentLine);
- }
- if (&yytext[4]==yyextra->docBlockName)
- {
- BEGIN(CopyArgCommentLine);
- }
- }
-<CopyArgCommentLine>[^\\\@\n]+ { yyextra->fullArgString+=yytext; }
-<CopyArgCommentLine>. { yyextra->fullArgString+=*yytext; }
-<CopyArgComment,CopyArgVerbatim>\n { yyextra->fullArgString+=*yytext; lineCount(yyscanner); }
-<CopyArgComment,CopyArgVerbatim>. { yyextra->fullArgString+=*yytext; }
+ if (yyextra->lastCopyArgChar!=0)
+ unput(yyextra->lastCopyArgChar);
+ BEGIN( yyextra->lastCommentInArgContext );
+ }
+<CopyArgCommentLine>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"rtfonly"|"docbookonly"|"dot"|"code")/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!)
+ yyextra->docBlockName=&yytext[1];
+ yyextra->fullArgString+=yytext;
+ BEGIN(CopyArgVerbatim);
+ }
+<CopyArgCommentLine>{CMD}("f$"|"f["|"f{") {
+ yyextra->docBlockName=&yytext[1];
+ if (yyextra->docBlockName.at(1)=='[')
+ {
+ yyextra->docBlockName.at(1)='}';
+ }
+ if (yyextra->docBlockName.at(1)=='{')
+ {
+ yyextra->docBlockName.at(1)='}';
+ }
+ yyextra->fullArgString+=yytext;
+ BEGIN(CopyArgVerbatim);
+ }
+<CopyArgVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"endrtfonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9\-] { // end of verbatim block
+ yyextra->fullArgString+=yytext;
+ if (yytext[1]=='f') // end of formula
+ {
+ BEGIN(CopyArgCommentLine);
+ }
+ if (&yytext[4]==yyextra->docBlockName)
+ {
+ BEGIN(CopyArgCommentLine);
+ }
+ }
+<CopyArgCommentLine>[^\\\@\n]+ { yyextra->fullArgString+=yytext; }
+<CopyArgCommentLine>. { yyextra->fullArgString+=*yytext; }
+<CopyArgComment,CopyArgVerbatim>\n { yyextra->fullArgString+=*yytext; lineCount(yyscanner); }
+<CopyArgComment,CopyArgVerbatim>. { yyextra->fullArgString+=*yytext; }
<CopyArgComment>{CMD}("brief"|"short"){B}+ {
- warn(yyextra->yyFileName,yyextra->yyLineNr,
- "Ignoring %cbrief command inside argument documentation",*yytext
- );
+ warn(yyextra->yyFileName,yyextra->yyLineNr,
+ "Ignoring %cbrief command inside argument documentation",*yytext
+ );
yyextra->fullArgString+=' ';
}
-<ReadTempArgs>"<" {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- yyextra->argSharpCount=1;
- BEGIN( CopyArgSharp );
- }
-<ReadTempArgs>">" {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- //printf("end template list '%s'\n",yyextra->copyArgString->data());
- stringToArgumentList(yyextra->language, yyextra->fullArgString,*yyextra->currentArgumentList);
- BEGIN( yyextra->currentArgumentContext );
- }
-<CopyArgRound>"(" {
- yyextra->argRoundCount++;
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- }
-<CopyArgRound>")" {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- if (yyextra->argRoundCount>0)
- yyextra->argRoundCount--;
- else
- BEGIN( yyextra->lastCopyArgContext );
- }
+<ReadTempArgs>"<" {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ yyextra->argSharpCount=1;
+ BEGIN( CopyArgSharp );
+ }
+<ReadTempArgs>">" {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ //printf("end template list '%s'\n",yyextra->copyArgString->data());
+ *yyextra->currentArgumentList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
+ BEGIN( yyextra->currentArgumentContext );
+ }
+<CopyArgRound>"(" {
+ yyextra->argRoundCount++;
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ }
+<CopyArgRound>")" {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ if (yyextra->argRoundCount>0)
+ yyextra->argRoundCount--;
+ else
+ BEGIN( yyextra->lastCopyArgContext );
+ }
<CopyArgSharp>"(" {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- yyextra->argRoundCount=0;
- yyextra->lastCopyArgContext = YY_START;
- BEGIN( CopyArgRound );
- }
-<CopyArgSharp>"<" {
- yyextra->argSharpCount++;
- //printf("yyextra->argSharpCount++=%d copy\n",yyextra->argSharpCount);
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- }
-<CopyArgSharp>">" {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- yyextra->argSharpCount--;
- if (yyextra->argSharpCount>0)
- {
- //printf("yyextra->argSharpCount--=%d copy\n",yyextra->argSharpCount);
- }
- else
- {
- BEGIN( ReadTempArgs );
- //printf("end of yyextra->argSharpCount\n");
- }
- }
-<CopyArgString,CopyArgPHPString>\\. {
- *yyextra->copyArgString+=yytext;
- yyextra->fullArgString+=yytext;
- }
-<CopyArgString>\" {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- BEGIN( yyextra->lastCopyArgStringContext );
- }
-<CopyArgPHPString>\' {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- BEGIN( yyextra->lastCopyArgStringContext );
- }
-<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>{CHARLIT} {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ yyextra->argRoundCount=0;
+ yyextra->lastCopyArgContext = YY_START;
+ BEGIN( CopyArgRound );
+ }
+<CopyArgSharp>"<" {
+ yyextra->argSharpCount++;
+ //printf("yyextra->argSharpCount++=%d copy\n",yyextra->argSharpCount);
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ }
+<CopyArgSharp>">" {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ yyextra->argSharpCount--;
+ if (yyextra->argSharpCount>0)
+ {
+ //printf("yyextra->argSharpCount--=%d copy\n",yyextra->argSharpCount);
+ }
+ else
+ {
+ BEGIN( ReadTempArgs );
+ //printf("end of yyextra->argSharpCount\n");
+ }
+ }
+<CopyArgString,CopyArgPHPString>\\. {
+ *yyextra->copyArgString+=yytext;
+ yyextra->fullArgString+=yytext;
+ }
+<CopyArgString>\" {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ BEGIN( yyextra->lastCopyArgStringContext );
+ }
+<CopyArgPHPString>\' {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ BEGIN( yyextra->lastCopyArgStringContext );
+ }
+<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>{CHARLIT} {
if (yyextra->insidePHP)
- {
- REJECT;
- }
- else
- {
- *yyextra->copyArgString+=yytext;
- yyextra->fullArgString+=yytext;
- }
- }
-<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>\' {
- *yyextra->copyArgString+=yytext;
- yyextra->fullArgString+=yytext;
- if (yyextra->insidePHP)
- {
- yyextra->lastCopyArgStringContext=YY_START;
- BEGIN(CopyArgPHPString);
- }
- }
-<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>\n {
+ {
+ REJECT;
+ }
+ else
+ {
+ *yyextra->copyArgString+=yytext;
+ yyextra->fullArgString+=yytext;
+ }
+ }
+<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>\' {
+ *yyextra->copyArgString+=yytext;
+ yyextra->fullArgString+=yytext;
+ if (yyextra->insidePHP)
+ {
+ yyextra->lastCopyArgStringContext=YY_START;
+ BEGIN(CopyArgPHPString);
+ }
+ }
+<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>\n {
lineCount(yyscanner);
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- }
-<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>. {
- *yyextra->copyArgString+=*yytext;
- yyextra->fullArgString+=*yytext;
- }
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ }
+<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>. {
+ *yyextra->copyArgString+=*yytext;
+ yyextra->fullArgString+=*yytext;
+ }
/*------------------------------------------------------------------------*/
-<FuncRound>"(" { yyextra->current->args += *yytext ;
- ++yyextra->roundCount ;
- }
-<FuncRound>")" { yyextra->current->args += *yytext ;
- if ( yyextra->roundCount )
- --yyextra->roundCount ;
- else
- BEGIN( FuncQual ) ;
- }
+<FuncRound>"(" { yyextra->current->args += *yytext ;
+ ++yyextra->roundCount ;
+ }
+<FuncRound>")" { yyextra->current->args += *yytext ;
+ if ( yyextra->roundCount )
+ --yyextra->roundCount ;
+ else
+ BEGIN( FuncQual ) ;
+ }
/*
-<FuncQual>"#" { if (yyextra->insidePHP)
- REJECT;
- yyextra->lastCPPContext = YY_START;
- BEGIN(SkipCPP);
- }
+<FuncQual>"#" { if (yyextra->insidePHP)
+ REJECT;
+ yyextra->lastCPPContext = YY_START;
+ BEGIN(SkipCPP);
+ }
*/
<FuncQual>[{:;,] {
- if ( qstrcmp(yytext,";")==0 &&
- yyextra->insidePHP &&
- !containsWord(yyextra->current->type,"function") )
+ if ( qstrcmp(yytext,";")==0 &&
+ yyextra->insidePHP &&
+ !containsWord(yyextra->current->type,"function") )
{
yyextra->current->reset();
initEntry(yyscanner);
@@ -4446,423 +4515,445 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
}
<FuncQual>{BN}*"abstract"{BN}* { // pure virtual member function
- lineCount(yyscanner) ;
+ lineCount(yyscanner) ;
yyextra->current->virt = Pure;
- yyextra->current->args += " override ";
+ yyextra->current->args += " override ";
}
<FuncQual,TrailingReturn>{BN}*"override"{BN}* { // C++11 overridden virtual member function
- lineCount(yyscanner) ;
+ lineCount(yyscanner) ;
yyextra->current->spec |= Entry::Override;
- yyextra->current->args += " override ";
+ yyextra->current->args += " override ";
BEGIN(FuncQual);
}
<FuncQual,TrailingReturn>{BN}*"final"{BN}* { // C++11 final method
- lineCount(yyscanner) ;
+ lineCount(yyscanner) ;
yyextra->current->spec |= Entry::Final;
- yyextra->current->args += " final ";
+ yyextra->current->args += " final ";
BEGIN(FuncQual);
}
<FuncQual>{BN}*"sealed"{BN}* { // sealed member function
- lineCount(yyscanner) ;
+ lineCount(yyscanner) ;
yyextra->current->spec |= Entry::Sealed;
- yyextra->current->args += " sealed ";
+ yyextra->current->args += " sealed ";
}
<FuncQual>{BN}*"new"{BN}* { // new member function
- lineCount(yyscanner) ;
+ lineCount(yyscanner) ;
yyextra->current->spec |= Entry::New;
- yyextra->current->args += " new ";
- }
-<FuncQual>{BN}*"const"{BN}* { // const member function
- lineCount(yyscanner) ;
- yyextra->current->args += " const ";
- yyextra->current->argList.constSpecifier=TRUE;
- }
-<FuncQual>{BN}*"volatile"{BN}* { // volatile member function
- lineCount(yyscanner) ;
- yyextra->current->args += " volatile ";
- yyextra->current->argList.volatileSpecifier=TRUE;
- }
-<FuncQual>{BN}*"noexcept"{BN}* { // noexcept qualifier
- lineCount(yyscanner) ;
- yyextra->current->args += " noexcept ";
- yyextra->current->spec |= Entry::NoExcept;
- }
-<FuncQual>{BN}*"noexcept"{BN}*"(" { // noexcept expression
- lineCount(yyscanner) ;
- yyextra->current->args += " noexcept(";
- yyextra->current->spec |= Entry::NoExcept;
- yyextra->lastRoundContext=FuncQual;
- yyextra->pCopyRoundString=&yyextra->current->args;
- yyextra->roundCount=0;
+ yyextra->current->args += " new ";
+ }
+<FuncQual>{BN}*"const"{BN}* { // const member function
+ lineCount(yyscanner) ;
+ yyextra->current->args += " const ";
+ yyextra->current->argList.setConstSpecifier(TRUE);
+ }
+<FuncQual>{BN}*"volatile"{BN}* { // volatile member function
+ lineCount(yyscanner) ;
+ yyextra->current->args += " volatile ";
+ yyextra->current->argList.setVolatileSpecifier(TRUE);
+ }
+<FuncQual>{BN}*"noexcept"{BN}* { // noexcept qualifier
+ lineCount(yyscanner) ;
+ yyextra->current->args += " noexcept ";
+ yyextra->current->spec |= Entry::NoExcept;
+ }
+<FuncQual>{BN}*"noexcept"{BN}*"(" { // noexcept expression
+ lineCount(yyscanner) ;
+ yyextra->current->args += " noexcept(";
+ yyextra->current->spec |= Entry::NoExcept;
+ yyextra->lastRoundContext=FuncQual;
+ yyextra->pCopyRoundString=&yyextra->current->args;
+ yyextra->roundCount=0;
BEGIN(CopyRound);
}
<FuncQual>{BN}*"&" {
yyextra->current->args += " &";
- yyextra->current->argList.refQualifier=RefQualifierLValue;
+ yyextra->current->argList.setRefQualifier(RefQualifierLValue);
}
<FuncQual>{BN}*"&&" {
yyextra->current->args += " &&";
- yyextra->current->argList.refQualifier=RefQualifierRValue;
+ yyextra->current->argList.setRefQualifier(RefQualifierRValue);
}
-<FuncQual,TrailingReturn>{BN}*"="{BN}*"0"{BN}* { // pure virtual member function
- lineCount(yyscanner) ;
- yyextra->current->args += " = 0";
- yyextra->current->virt = Pure;
- yyextra->current->argList.pureSpecifier=TRUE;
+<FuncQual,TrailingReturn>{BN}*"="{BN}*"0"{BN}* { // pure virtual member function
+ lineCount(yyscanner) ;
+ yyextra->current->args += " = 0";
+ yyextra->current->virt = Pure;
+ yyextra->current->argList.setPureSpecifier(TRUE);
BEGIN(FuncQual);
- }
+ }
<FuncQual,TrailingReturn>{BN}*"="{BN}*"delete"{BN}* { // C++11 explicitly delete member
lineCount(yyscanner);
yyextra->current->args += " = delete";
- yyextra->current->spec |= Entry::Delete;
- yyextra->current->argList.isDeleted=TRUE;
+ yyextra->current->spec |= Entry::Delete;
+ yyextra->current->argList.setIsDeleted(TRUE);
BEGIN(FuncQual);
}
<FuncQual,TrailingReturn>{BN}*"="{BN}*"default"{BN}* { // C++11 explicitly defaulted constructor/assignment operator
lineCount(yyscanner);
yyextra->current->args += " = default";
- yyextra->current->spec |= Entry::Default;
+ yyextra->current->spec |= Entry::Default;
BEGIN(FuncQual);
}
<FuncQual>{BN}*"->"{BN}* {
lineCount(yyscanner);
- yyextra->current->argList.trailingReturnType = " -> ";
+ yyextra->current->argList.setTrailingReturnType(" -> ");
yyextra->current->args += " -> ";
+ yyextra->roundCount=0;
BEGIN(TrailingReturn);
}
<TrailingReturn>[{;] {
+ if (yyextra->roundCount>0) REJECT;
unput(*yytext);
BEGIN(FuncQual);
}
+<TrailingReturn>"(" {
+ yyextra->roundCount++;
+ yyextra->current->argList.setTrailingReturnType(yyextra->current->argList.trailingReturnType()+yytext);
+ yyextra->current->args+=yytext;
+ }
+<TrailingReturn>")" {
+ if (yyextra->roundCount>0)
+ {
+ yyextra->roundCount--;
+ }
+ else
+ {
+ warn(yyextra->yyFileName,yyextra->yyLineNr,
+ "Found ')' without opening '(' for trailing return type '%s)...'",
+ yyextra->current->argList.trailingReturnType().data());
+ }
+ yyextra->current->argList.setTrailingReturnType(yyextra->current->argList.trailingReturnType()+yytext);
+ yyextra->current->args+=yytext;
+ }
<TrailingReturn>. {
- yyextra->current->argList.trailingReturnType+=yytext;
+ yyextra->current->argList.setTrailingReturnType(yyextra->current->argList.trailingReturnType()+yytext);
yyextra->current->args+=yytext;
}
<TrailingReturn>\n {
lineCount(yyscanner);
- yyextra->current->argList.trailingReturnType+=yytext;
+ yyextra->current->argList.setTrailingReturnType(yyextra->current->argList.trailingReturnType()+yytext);
yyextra->current->args+=' ';
}
-<FuncRound,FuncFunc>{BN}*","{BN}* {
- lineCount(yyscanner) ;
- yyextra->current->args += ", " ;
- }
-<FuncQual,FuncRound,FuncFunc>{BN}+ {
- lineCount(yyscanner) ;
- yyextra->current->args += ' ' ;
- }
+<FuncRound,FuncFunc>{BN}*","{BN}* {
+ lineCount(yyscanner) ;
+ yyextra->current->args += ", " ;
+ }
+<FuncQual,FuncRound,FuncFunc>{BN}+ {
+ lineCount(yyscanner) ;
+ yyextra->current->args += ' ' ;
+ }
<Function,FuncQual,FuncRound,FuncFunc>"#" { if (yyextra->insidePHP)
- REJECT;
- yyextra->lastCPPContext = YY_START;
- BEGIN(SkipCPP);
- }
-<FuncQual>"=" {
- if (yyextra->insideCli &&
- (yyextra->current_root->section&Entry::COMPOUND_MASK)
- )
- {
- BEGIN(CliOverride);
- }
- else
- {
+ REJECT;
+ yyextra->lastCPPContext = YY_START;
+ BEGIN(SkipCPP);
+ }
+<FuncQual>"=" {
+ if (yyextra->insideCli &&
+ (yyextra->current_root->section&Entry::COMPOUND_MASK)
+ )
+ {
+ BEGIN(CliOverride);
+ }
+ else
+ {
// typically an initialized function pointer
- yyextra->lastInitializerContext=YY_START;
- yyextra->initBracketCount=0;
+ yyextra->lastInitializerContext=YY_START;
+ yyextra->initBracketCount=0;
yyextra->current->initializer = yytext;
- BEGIN(ReadInitializer);
- }
- }
-<CliOverride>{ID} {
- }
-<CliOverride>"{" {
- unput(*yytext);
- BEGIN(FuncQual);
- }
-<CliOverride>\n {
+ BEGIN(ReadInitializer);
+ }
+ }
+<CliOverride>{ID} {
+ }
+<CliOverride>"{" {
+ unput(*yytext);
+ BEGIN(FuncQual);
+ }
+<CliOverride>\n {
lineCount(yyscanner);
- }
-<CliOverride>. {
- }
-<FuncPtrInit>[{;] {
- unput(*yytext);
- BEGIN(FuncQual);
- }
-<FuncPtrInit>\" {
- yyextra->current->args += *yytext;
- yyextra->pCopyQuotedString=&yyextra->current->args;
- yyextra->lastStringContext=FuncPtrInit;
- BEGIN(CopyString);
- }
-<FuncPtrInit>\' {
- yyextra->current->args += *yytext;
- if (yyextra->insidePHP)
- {
- yyextra->pCopyQuotedString=&yyextra->current->args;
- yyextra->lastStringContext=FuncPtrInit;
- BEGIN(CopyPHPString);
- }
- }
-<FuncPtrInit>{CHARLIT} {
+ }
+<CliOverride>. {
+ }
+<FuncPtrInit>[{;] {
+ unput(*yytext);
+ BEGIN(FuncQual);
+ }
+<FuncPtrInit>\" {
+ yyextra->current->args += *yytext;
+ yyextra->pCopyQuotedString=&yyextra->current->args;
+ yyextra->lastStringContext=FuncPtrInit;
+ BEGIN(CopyString);
+ }
+<FuncPtrInit>\' {
+ yyextra->current->args += *yytext;
+ if (yyextra->insidePHP)
+ {
+ yyextra->pCopyQuotedString=&yyextra->current->args;
+ yyextra->lastStringContext=FuncPtrInit;
+ BEGIN(CopyPHPString);
+ }
+ }
+<FuncPtrInit>{CHARLIT} {
if (yyextra->insidePHP)
- {
- REJECT;
- }
- else
- {
- yyextra->current->args += yytext;
- }
- }
-<FuncPtrInit>{ID} {
- yyextra->current->args += yytext;
- }
-<FuncPtrInit>. {
- yyextra->current->args += *yytext;
- }
-<FuncPtrInit>\n {
- yyextra->current->args += *yytext;
+ {
+ REJECT;
+ }
+ else
+ {
+ yyextra->current->args += yytext;
+ }
+ }
+<FuncPtrInit>{ID} {
+ yyextra->current->args += yytext;
+ }
+<FuncPtrInit>. {
+ yyextra->current->args += *yytext;
+ }
+<FuncPtrInit>\n {
+ yyextra->current->args += *yytext;
lineCount(yyscanner);
- }
-<FuncQual>{ID} { // typically a K&R style C function
+ }
+<FuncQual>{ID} { // typically a K&R style C function
if (yyextra->insideCS && qstrcmp(yytext,"where")==0)
- {
- // type constraint for a method
- yyextra->current->typeConstr.clear();
- yyextra->current->typeConstr.push_back(Argument());
- yyextra->lastCSConstraint = YY_START;
- BEGIN( CSConstraintName );
- }
- else if (checkForKnRstyleC(yyscanner))
- {
- yyextra->current->args = yytext;
- yyextra->oldStyleArgType.resize(0);
- BEGIN(OldStyleArgs);
- }
- else
- {
- yyextra->current->args += yytext;
- }
- }
-<OldStyleArgs>[,;] {
- QCString oldStyleArgPtr;
- QCString oldStyleArgName;
- splitKnRArg(yyscanner,oldStyleArgPtr,oldStyleArgName);
- QCString doc,brief;
- if (yyextra->current->doc!=yyextra->docBackup)
- {
+ {
+ // type constraint for a method
+ yyextra->current->typeConstr.clear();
+ yyextra->current->typeConstr.push_back(Argument());
+ yyextra->lastCSConstraint = YY_START;
+ BEGIN( CSConstraintName );
+ }
+ else if (checkForKnRstyleC(yyscanner))
+ {
+ yyextra->current->args = yytext;
+ yyextra->oldStyleArgType.resize(0);
+ BEGIN(OldStyleArgs);
+ }
+ else
+ {
+ yyextra->current->args += yytext;
+ }
+ }
+<OldStyleArgs>[,;] {
+ QCString oldStyleArgPtr;
+ QCString oldStyleArgName;
+ splitKnRArg(yyscanner,oldStyleArgPtr,oldStyleArgName);
+ QCString doc,brief;
+ if (yyextra->current->doc!=yyextra->docBackup)
+ {
doc=yyextra->current->doc.copy();
- yyextra->current->doc=yyextra->docBackup;
- }
- if (yyextra->current->brief!=yyextra->briefBackup)
- {
+ yyextra->current->doc=yyextra->docBackup;
+ }
+ if (yyextra->current->brief!=yyextra->briefBackup)
+ {
brief=yyextra->current->brief.copy();
- yyextra->current->brief=yyextra->briefBackup;
- }
- addKnRArgInfo(yyscanner,yyextra->oldStyleArgType+oldStyleArgPtr,
- oldStyleArgName,brief,doc);
- yyextra->current->args.resize(0);
- if (*yytext==';') yyextra->oldStyleArgType.resize(0);
- }
-<OldStyleArgs>{ID} { yyextra->current->args += yytext; }
-<OldStyleArgs>"{" {
+ yyextra->current->brief=yyextra->briefBackup;
+ }
+ addKnRArgInfo(yyscanner,yyextra->oldStyleArgType+oldStyleArgPtr,
+ oldStyleArgName,brief,doc);
+ yyextra->current->args.resize(0);
+ if (*yytext==';') yyextra->oldStyleArgType.resize(0);
+ }
+<OldStyleArgs>{ID} { yyextra->current->args += yytext; }
+<OldStyleArgs>"{" {
if (yyextra->current->argList.empty())
{
- yyextra->current->argList.noParameters=TRUE;
- }
- yyextra->current->args = argListToString(yyextra->current->argList);
- unput('{');
- BEGIN(FuncQual);
- }
-<OldStyleArgs>. { yyextra->current->args += *yytext; }
-<FuncQual,FuncRound,FuncFunc>. { yyextra->current->args += *yytext; }
-<FuncQual>{BN}*"try:" |
-<FuncQual>{BN}*"try"{BN}+ { /* try-function-block */
- yyextra->insideTryBlock=TRUE;
- lineCount(yyscanner);
- if (yytext[yyleng-1]==':')
- {
- unput(':');
- BEGIN( Function );
- }
- }
-<FuncQual>{BN}*"throw"{BN}*"(" { // C++ style throw clause
- yyextra->current->exception = " throw (" ;
- yyextra->roundCount=0;
- lineCount(yyscanner) ;
- BEGIN( ExcpRound ) ;
- }
+ yyextra->current->argList.setNoParameters(TRUE);
+ }
+ yyextra->current->args = argListToString(yyextra->current->argList);
+ unput('{');
+ BEGIN(FuncQual);
+ }
+<OldStyleArgs>. { yyextra->current->args += *yytext; }
+<FuncQual,FuncRound,FuncFunc>. { yyextra->current->args += *yytext; }
+<FuncQual>{BN}*"try:" |
+<FuncQual>{BN}*"try"{BN}+ { /* try-function-block */
+ yyextra->insideTryBlock=TRUE;
+ lineCount(yyscanner);
+ if (yytext[yyleng-1]==':')
+ {
+ unput(':');
+ BEGIN( Function );
+ }
+ }
+<FuncQual>{BN}*"throw"{BN}*"(" { // C++ style throw clause
+ yyextra->current->exception = " throw (" ;
+ yyextra->roundCount=0;
+ lineCount(yyscanner) ;
+ BEGIN( ExcpRound ) ;
+ }
<FuncQual>{BN}*"raises"{BN}*"(" {
- yyextra->current->exception = " raises (" ;
- lineCount(yyscanner) ;
- yyextra->roundCount=0;
- BEGIN( ExcpRound ) ;
- }
-<FuncQual>{BN}*"throws"{BN}+ { // Java style throw clause
- yyextra->current->exception = " throws " ;
- lineCount(yyscanner) ;
- BEGIN( ExcpList );
- }
-<ExcpRound>"(" { yyextra->current->exception += *yytext ;
- ++yyextra->roundCount ;
- }
-<ExcpRound>")" { yyextra->current->exception += *yytext ;
- if ( yyextra->roundCount )
- --yyextra->roundCount ;
- else
- BEGIN( FuncQual ) ;
- }
-<ExcpRound>. {
- yyextra->current->exception += *yytext;
- }
-<ExcpList>"{" {
- unput('{'); BEGIN( FuncQual );
- }
-<ExcpList>";" {
- unput(';'); BEGIN( FuncQual );
- }
-<ExcpList>"\n" {
- yyextra->current->exception += ' ';
+ yyextra->current->exception = " raises (" ;
+ lineCount(yyscanner) ;
+ yyextra->roundCount=0;
+ BEGIN( ExcpRound ) ;
+ }
+<FuncQual>{BN}*"throws"{BN}+ { // Java style throw clause
+ yyextra->current->exception = " throws " ;
+ lineCount(yyscanner) ;
+ BEGIN( ExcpList );
+ }
+<ExcpRound>"(" { yyextra->current->exception += *yytext ;
+ ++yyextra->roundCount ;
+ }
+<ExcpRound>")" { yyextra->current->exception += *yytext ;
+ if ( yyextra->roundCount )
+ --yyextra->roundCount ;
+ else
+ BEGIN( FuncQual ) ;
+ }
+<ExcpRound>. {
+ yyextra->current->exception += *yytext;
+ }
+<ExcpList>"{" {
+ unput('{'); BEGIN( FuncQual );
+ }
+<ExcpList>";" {
+ unput(';'); BEGIN( FuncQual );
+ }
+<ExcpList>"\n" {
+ yyextra->current->exception += ' ';
lineCount(yyscanner);
- }
-<ExcpList>. {
- yyextra->current->exception += *yytext;
- }
-<Function>"(" { yyextra->current->type += yyextra->current->name ;
- yyextra->current->name = yyextra->current->args ;
- yyextra->current->args = yytext ;
- yyextra->roundCount=0;
- BEGIN( FuncRound ) ;
- }
-<Function>":" {
- if (!yyextra->insidePHP) BEGIN(SkipInits);
- }
-<Function>[;{,] {
- yyextra->current->name=yyextra->current->name.simplifyWhiteSpace();
- yyextra->current->type=yyextra->current->type.simplifyWhiteSpace();
- yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args);
- // was: yyextra->current->args.simplifyWhiteSpace();
- yyextra->current->fileName = yyextra->yyFileName;
- yyextra->current->startLine = yyextra->yyBegLineNr;
- yyextra->current->startColumn = yyextra->yyBegColNr;
- static QRegExp re("([^)]*[*&][^)]*)"); // (...*...)
- if (*yytext!=';' || (yyextra->current_root->section&Entry::COMPOUND_MASK) )
- {
- int tempArg=yyextra->current->name.find('<');
- int ts=yyextra->current->type.find('<');
- int te=yyextra->current->type.findRev('>');
- int ti=yyextra->current->type.find(re,0);
-
- // bug677315: A<int(void *, char *)> get(); is not a function pointer
- bool isFunction = ti==-1 || // not a (...*...) pattern
- (ts!=-1 && ts<te && ts<ti && ti<te); // (...*...) is part of a template argument list
-
- //printf("type=%s ts=%d te=%d ti=%d isFunction=%d\n",
- // yyextra->current->type.data(),ts,te,ti,isFunction);
- QCString tempName;
- if (tempArg==-1) tempName=yyextra->current->name; else tempName=yyextra->current->name.left(tempArg);
- if (!yyextra->current->type.isEmpty() &&
- (!isFunction || yyextra->current->type.left(8)=="typedef "))
- {
- //printf("Scanner.l: found in class variable: '%s' '%s' '%s'\n", yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data());
- if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
- {
- yyextra->current->type.prepend("typedef ");
- }
- yyextra->current->section = Entry::VARIABLE_SEC ;
- }
- else
- {
- //printf("Scanner.l: found in class function: '%s' '%s' '%s'\n", yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data());
- yyextra->current->section = Entry::FUNCTION_SEC ;
- yyextra->current->proto = *yytext==';';
- }
- }
- else // a global function prototype or function variable
- {
- //printf("Scanner.l: prototype? type='%s' name='%s' args='%s'\n",yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data());
- if (!yyextra->current->type.isEmpty() &&
- (yyextra->current->type.find(re,0)!=-1 || yyextra->current->type.left(8)=="typedef "))
- {
- if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
- {
- yyextra->current->type.prepend("typedef ");
- }
- //printf("Scanner.l: found function variable!\n");
- yyextra->current->section = Entry::VARIABLE_SEC;
- }
- else
- {
- //printf("Scanner.l: found prototype\n");
- yyextra->current->section = Entry::FUNCTION_SEC;
- yyextra->current->proto = TRUE;
- }
- }
- //printf("Adding entry '%s'\n",yyextra->current->name.data());
- if ( yyextra->insidePHP)
- {
- if (findAndRemoveWord(yyextra->current->type,"final"))
- {
- yyextra->current->spec |= Entry::Final;
- }
- if (findAndRemoveWord(yyextra->current->type,"abstract"))
- {
- yyextra->current->spec |= Entry::Abstract;
- }
- }
- if ( yyextra->insidePHP && !containsWord(yyextra->current->type,"function"))
- {
- initEntry(yyscanner);
- if ( *yytext == '{' )
- {
- yyextra->lastCurlyContext = FindMembers;
- yyextra->curlyCount=0;
- BEGIN( SkipCurly );
- }
- else
- {
- BEGIN( FindMembers );
- }
- }
- else
- {
- if ( yyextra->insidePHP)
- {
- findAndRemoveWord(yyextra->current->type,"function");
- }
- yyextra->previous = yyextra->current;
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- initEntry(yyscanner);
- // Objective C 2.0: Required/Optional section
- if (yyextra->previous->spec & (Entry::Optional | Entry::Required))
- {
- yyextra->current->spec |= yyextra->previous->spec & (Entry::Optional|Entry::Required);
- }
- yyextra->lastCurlyContext = FindMembers;
- if ( *yytext == ',' )
- {
- yyextra->current->type = yyextra->previous->type;
- // we need to strip any trailing * and & (see bugs 623023 and 649103 for test cases)
- int i=yyextra->current->type.length();
- while (i>0 && (yyextra->current->type[i-1]=='*' || yyextra->current->type[i-1]=='&' || yyextra->current->type[i-1]==' ')) i--;
- yyextra->current->type = yyextra->current->type.left(i);
- }
- if ( *yytext == '{' )
- {
- if ( !yyextra->insidePHP && (yyextra->current_root->section & Entry::COMPOUND_MASK) )
- {
- yyextra->previous->spec |= Entry::Inline;
- }
- //addToBody(yytext);
- yyextra->curlyCount=0;
- BEGIN( SkipCurly ) ;
- }
- else
- {
- if (yyextra->previous->section!=Entry::VARIABLE_SEC)
- yyextra->previous->bodyLine=-1; // a function/member declaration
- BEGIN( FindMembers ) ;
- }
- }
+ }
+<ExcpList>. {
+ yyextra->current->exception += *yytext;
+ }
+<Function>"(" { yyextra->current->type += yyextra->current->name ;
+ yyextra->current->name = yyextra->current->args ;
+ yyextra->current->args = yytext ;
+ yyextra->roundCount=0;
+ BEGIN( FuncRound ) ;
+ }
+<Function>":" {
+ if (!yyextra->insidePHP) BEGIN(SkipInits);
+ }
+<Function>[;{,] {
+ yyextra->current->name=yyextra->current->name.simplifyWhiteSpace();
+ yyextra->current->type=yyextra->current->type.simplifyWhiteSpace();
+ yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args);
+ // was: yyextra->current->args.simplifyWhiteSpace();
+ yyextra->current->fileName = yyextra->yyFileName;
+ yyextra->current->startLine = yyextra->yyBegLineNr;
+ yyextra->current->startColumn = yyextra->yyBegColNr;
+ static QRegExp re("([^)]*[*&][^)]*)"); // (...*...)
+ int ts=yyextra->current->type.find('<');
+ int te=yyextra->current->type.findRev('>');
+ int ti=yyextra->current->type.find(re,0);
+
+ // bug677315: A<int(void *, char *)> get(); is not a function pointer
+ bool isFunction = ti==-1 || // not a (...*...) pattern
+ (ts!=-1 && ts<te && ts<ti && ti<te); // (...*...) is part of a template argument list
+ bool isVariable = (!yyextra->current->type.isEmpty() &&
+ (!isFunction || yyextra->current->type.left(8)=="typedef "));
+
+ //printf("type=%s ts=%d te=%d ti=%d isFunction=%d\n",
+ // yyextra->current->type.data(),ts,te,ti,isFunction);
+
+ if (*yytext!=';' || (yyextra->current_root->section&Entry::COMPOUND_MASK) )
+ {
+ int tempArg=yyextra->current->name.find('<');
+ QCString tempName;
+ if (tempArg==-1) tempName=yyextra->current->name; else tempName=yyextra->current->name.left(tempArg);
+ if (isVariable)
+ {
+ //printf("Scanner.l: found in class variable: '%s' '%s' '%s'\n", yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data());
+ if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
+ {
+ yyextra->current->type.prepend("typedef ");
+ }
+ yyextra->current->section = Entry::VARIABLE_SEC ;
+ }
+ else
+ {
+ //printf("Scanner.l: found in class function: '%s' '%s' '%s'\n", yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data());
+ yyextra->current->section = Entry::FUNCTION_SEC ;
+ yyextra->current->proto = *yytext==';';
+ }
+ }
+ else // a global function prototype or function variable
+ {
+ //printf("Scanner.l: prototype? type='%s' name='%s' args='%s'\n",yyextra->current->type.data(),yyextra->current->name.data(),yyextra->current->args.data());
+ if (isVariable)
+ {
+ if (yyextra->isTypedef && yyextra->current->type.left(8)!="typedef ")
+ {
+ yyextra->current->type.prepend("typedef ");
+ }
+ //printf("Scanner.l: found function variable!\n");
+ yyextra->current->section = Entry::VARIABLE_SEC;
+ }
+ else
+ {
+ //printf("Scanner.l: found prototype\n");
+ yyextra->current->section = Entry::FUNCTION_SEC;
+ yyextra->current->proto = TRUE;
+ }
+ }
+ //printf("Adding entry '%s'\n",yyextra->current->name.data());
+ if ( yyextra->insidePHP)
+ {
+ if (findAndRemoveWord(yyextra->current->type,"final"))
+ {
+ yyextra->current->spec |= Entry::Final;
+ }
+ if (findAndRemoveWord(yyextra->current->type,"abstract"))
+ {
+ yyextra->current->spec |= Entry::Abstract;
+ }
+ }
+ if ( yyextra->insidePHP && !containsWord(yyextra->current->type,"function"))
+ {
+ initEntry(yyscanner);
+ if ( *yytext == '{' )
+ {
+ yyextra->lastCurlyContext = FindMembers;
+ yyextra->curlyCount=0;
+ BEGIN( SkipCurly );
+ }
+ else
+ {
+ BEGIN( FindMembers );
+ }
+ }
+ else
+ {
+ if ( yyextra->insidePHP)
+ {
+ findAndRemoveWord(yyextra->current->type,"function");
+ }
+ yyextra->previous = yyextra->current;
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ initEntry(yyscanner);
+ // Objective C 2.0: Required/Optional section
+ if (yyextra->previous->spec & (Entry::Optional | Entry::Required))
+ {
+ yyextra->current->spec |= yyextra->previous->spec & (Entry::Optional|Entry::Required);
+ }
+ yyextra->lastCurlyContext = FindMembers;
+ if ( *yytext == ',' )
+ {
+ yyextra->current->type = yyextra->previous->type;
+ // we need to strip any trailing * and & (see bugs 623023 and 649103 for test cases)
+ int i=yyextra->current->type.length();
+ while (i>0 && (yyextra->current->type[i-1]=='*' || yyextra->current->type[i-1]=='&' || yyextra->current->type[i-1]==' ')) i--;
+ yyextra->current->type = yyextra->current->type.left(i);
+ }
+ if ( *yytext == '{' )
+ {
+ if ( !yyextra->insidePHP && (yyextra->current_root->section & Entry::COMPOUND_MASK) )
+ {
+ yyextra->previous->spec |= Entry::Inline;
+ }
+ //addToBody(yytext);
+ yyextra->curlyCount=0;
+ BEGIN( SkipCurly ) ;
+ }
+ else
+ {
+ if (yyextra->previous->section!=Entry::VARIABLE_SEC)
+ yyextra->previous->bodyLine=-1; // a function/member declaration
+ BEGIN( FindMembers ) ;
+ }
+ }
}
<SkipInits>">"{BN}*"{" { // C++11 style initializer (see bug 790788)
lineCount(yyscanner);
@@ -4878,7 +4969,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
++yyextra->curlyCount;
}
<SkipC11Inits>"}" {
- if ( --yyextra->curlyCount<=0 )
+ if ( --yyextra->curlyCount<=0 )
{
BEGIN(SkipInits);
}
@@ -4886,118 +4977,116 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
<SkipC11Attribute>"]]" {
BEGIN(yyextra->lastC11AttributeContext);
}
-<SkipInits>"{" { // C++11 style initializer
- unput('{');
- BEGIN( Function );
- }
-<SkipCurly>"{" {
- //addToBody(yytext);
- ++yyextra->curlyCount ;
- }
+<SkipInits>"{" { // C++11 style initializer
+ unput('{');
+ BEGIN( Function );
+ }
+<SkipCurly>"{" {
+ //addToBody(yytext);
+ ++yyextra->curlyCount ;
+ }
<SkipCurly>"}"/{BN}*("/*!"|"/**"|"//!"|"///")"<!--" | /* see bug710917 */
-<SkipCurly>"}" {
- //addToBody(yytext);
- if( yyextra->curlyCount )
- {
- --yyextra->curlyCount ;
- }
- else
- {
- if (!yyextra->current->sli.empty() && yyextra->previous) // copy special list items
- {
+<SkipCurly>"}" {
+ //addToBody(yytext);
+ if( yyextra->curlyCount )
+ {
+ --yyextra->curlyCount ;
+ }
+ else
+ {
+ if (!yyextra->current->sli.empty() && yyextra->previous) // copy special list items
+ {
yyextra->previous->sli = yyextra->current->sli;
- yyextra->current->sli.clear();
- }
- if (yyextra->previous) yyextra->previous->endBodyLine=yyextra->yyLineNr;
- BEGIN( yyextra->lastCurlyContext ) ;
- }
- }
-<SkipCurly>"}"{BN}*("/*!"|"/**"|"//!"|"///")"<" {
- lineCount(yyscanner);
- if ( yyextra->curlyCount )
- {
- //addToBody(yytext);
- --yyextra->curlyCount ;
- }
- else
- {
- yyextra->current->endBodyLine=yyextra->yyLineNr;
- // take yyextra->previous out of yyextra->current_root and move it into yyextra->current
- yyextra->tempEntry = yyextra->current; // remember yyextra->current
- yyextra->current_root->moveFromSubEntry(yyextra->previous.get(),yyextra->current);
- yyextra->previous.reset();
-
- yyextra->docBlockContext = SkipCurlyEndDoc;
- yyextra->docBlockInBody = FALSE;
- yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
- ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
- yyextra->docBlock.resize(0);
- yyextra->docBlockTerm = '}';
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(yyscanner,TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(yyscanner,FALSE);
- BEGIN( DocBlock );
- }
- }
- }
+ yyextra->current->sli.clear();
+ }
+ if (yyextra->previous) yyextra->previous->endBodyLine=yyextra->yyLineNr;
+ BEGIN( yyextra->lastCurlyContext ) ;
+ }
+ }
+<SkipCurly>"}"{BN}*("/*!"|"/**"|"//!"|"///")"<" {
+ lineCount(yyscanner);
+ if ( yyextra->curlyCount )
+ {
+ //addToBody(yytext);
+ --yyextra->curlyCount ;
+ }
+ else
+ {
+ yyextra->current->endBodyLine=yyextra->yyLineNr;
+ yyextra->tempEntry = yyextra->current; // temporarily switch to the previous entry
+ yyextra->current = yyextra->previous;
+
+ yyextra->docBlockContext = SkipCurlyEndDoc;
+ yyextra->docBlockInBody = FALSE;
+ yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
+ yyextra->docBlock.resize(0);
+ yyextra->docBlockTerm = '}';
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(yyscanner,TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(yyscanner,FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+ }
<SkipCurlyEndDoc>"}"{BN}*("/*!"|"/**"|"//!"|"///")"<" { // desc is followed by another one
- yyextra->docBlockContext = SkipCurlyEndDoc;
- yyextra->docBlockInBody = FALSE;
- yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
- ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
- yyextra->docBlock.resize(0);
- yyextra->docBlockTerm = '}';
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(yyscanner,TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(yyscanner,FALSE);
- BEGIN( DocBlock );
- }
- }
-<SkipCurlyEndDoc>"}" {
- //addToBody("}");
+ yyextra->docBlockContext = SkipCurlyEndDoc;
+ yyextra->docBlockInBody = FALSE;
+ yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
+ yyextra->docBlock.resize(0);
+ yyextra->docBlockTerm = '}';
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(yyscanner,TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(yyscanner,FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+<SkipCurlyEndDoc>"}" {
+ //addToBody("}");
if (yyextra->tempEntry) // we can only switch back to yyextra->current if no new item was created
- {
- yyextra->current = yyextra->tempEntry;
- yyextra->tempEntry.reset();
- }
- BEGIN( yyextra->lastCurlyContext );
- }
-<SkipCurly>\" {
- //addToBody(yytext);
- yyextra->lastStringContext=SkipCurly;
- BEGIN( SkipString );
- }
-<SkipCurly>^{B}*"#" {
- if (yyextra->insidePHP)
- REJECT;
- //addToBody(yytext);
- BEGIN( SkipCurlyCpp );
- }
-<SkipCurly,SkipC11Inits,SkipInits,SkipC11Attribute>\n {
+ {
+ yyextra->current = yyextra->tempEntry;
+ yyextra->tempEntry.reset();
+ }
+ BEGIN( yyextra->lastCurlyContext );
+ }
+<SkipCurly>\" {
+ //addToBody(yytext);
+ yyextra->lastStringContext=SkipCurly;
+ BEGIN( SkipString );
+ }
+<SkipCurly>^{B}*"#" {
+ if (yyextra->insidePHP)
+ REJECT;
+ //addToBody(yytext);
+ BEGIN( SkipCurlyCpp );
+ }
+<SkipCurly,SkipC11Inits,SkipInits,SkipC11Attribute>\n {
lineCount(yyscanner);
- //addToBody(yytext);
- }
-<SkipCurly,SkipCurlyCpp,ReadInitializer>"<<<" {
- if (!yyextra->insidePHP)
- {
- REJECT;
- }
- else
- {
+ //addToBody(yytext);
+ }
+<SkipCurly,SkipCurlyCpp,ReadInitializer,ReadInitializerPtr>"<<<" {
+ if (!yyextra->insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
yyextra->lastHereDocContext = YY_START;
- BEGIN(HereDoc);
- }
- }
+ BEGIN(HereDoc);
+ }
+ }
<SkipCurly,SkipCurlyCpp>{B}*{RAWBEGIN} {
QCString raw=QCString(yytext).stripWhiteSpace();
yyextra->delimiter = raw.data()+2;
@@ -5010,191 +5099,191 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
<SkipCurly,SkipCurlyCpp>[^\n#"'@\\/{}<]+ {
lineCount(yyscanner); // for yyextra->column updates
- //addToBody(yytext);
- }
-<SkipCurlyCpp>\n {
- //addToBody(yytext);
+ //addToBody(yytext);
+ }
+<SkipCurlyCpp>\n {
+ //addToBody(yytext);
lineCount(yyscanner);
- yyextra->lastCurlyContext = FindMembers;
- BEGIN( SkipCurly );
- }
-<SkipCurlyCpp>\\[\r]*"\n"[\r]* {
- //addToBody(yytext);
+ yyextra->lastCurlyContext = FindMembers;
+ BEGIN( SkipCurly );
+ }
+<SkipCurlyCpp>\\[\r]*"\n"[\r]* {
+ //addToBody(yytext);
lineCount(yyscanner);
- }
-<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>"/*" {
- //addToBody(yytext);
- yyextra->lastCContext = YY_START;
- BEGIN(SkipComment);
- }
+ }
+<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>"/*" {
+ //addToBody(yytext);
+ yyextra->lastCContext = YY_START;
+ BEGIN(SkipComment);
+ }
<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>"//" {
- //addToBody(yytext);
- yyextra->lastCContext = YY_START;
- BEGIN(SkipCxxComment);
- }
+ //addToBody(yytext);
+ yyextra->lastCContext = YY_START;
+ BEGIN(SkipCxxComment);
+ }
<SkipInits,SkipC11Inits,SkipC11Attribute>"(" {
yyextra->roundCount=0;
yyextra->lastSkipRoundContext=YY_START;
BEGIN(SkipRound);
}
-<SkipInits,SkipC11Inits,SkipC11Attribute>\" {
- yyextra->lastStringContext=YY_START;
- BEGIN( SkipString );
- }
-<SkipInits>; {
- warn(yyextra->yyFileName,yyextra->yyLineNr,
- "Found ';' while parsing initializer list! "
- "(doxygen could be confused by a macro call without semicolon)"
- );
- BEGIN( FindMembers );
- }
+<SkipInits,SkipC11Inits,SkipC11Attribute>\" {
+ yyextra->lastStringContext=YY_START;
+ BEGIN( SkipString );
+ }
+<SkipInits>; {
+ warn(yyextra->yyFileName,yyextra->yyLineNr,
+ "Found ';' while parsing initializer list! "
+ "(doxygen could be confused by a macro call without semicolon)"
+ );
+ BEGIN( FindMembers );
+ }
<SkipInits,SkipCurly,SkipCurlyCpp>"#" {
- if (!yyextra->insidePHP)
- REJECT;
- //addToBody(yytext);
- yyextra->lastCContext = YY_START;
- BEGIN(SkipCxxComment);
- }
+ if (!yyextra->insidePHP)
+ REJECT;
+ //addToBody(yytext);
+ yyextra->lastCContext = YY_START;
+ BEGIN(SkipCxxComment);
+ }
<SkipInits,SkipCurly,SkipCurlyCpp>@\" {
- if (!yyextra->insideCS) REJECT;
- // C# verbatim string
- yyextra->lastSkipVerbStringContext=YY_START;
- yyextra->pSkipVerbString=&yyextra->current->initializer;
- BEGIN(SkipVerbString);
- }
-<SkipInits,SkipCurly,SkipCurlyCpp>{CHARLIT} {
+ if (!yyextra->insideCS) REJECT;
+ // C# verbatim string
+ yyextra->lastSkipVerbStringContext=YY_START;
+ yyextra->pSkipVerbString=&yyextra->current->initializer;
+ BEGIN(SkipVerbString);
+ }
+<SkipInits,SkipCurly,SkipCurlyCpp>{CHARLIT} {
if (yyextra->insidePHP) REJECT;
}
-<SkipInits,SkipCurly,SkipCurlyCpp>\' {
- if (yyextra->insidePHP)
- {
- yyextra->lastStringContext=YY_START;
- BEGIN(SkipPHPString);
- }
- }
-<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>. { }
-<SkipString,SkipPHPString>\\. { }
-<SkipString>\" {
- BEGIN( yyextra->lastStringContext );
- }
-<SkipPHPString>\' {
- BEGIN( yyextra->lastStringContext );
- }
+<SkipInits,SkipCurly,SkipCurlyCpp>\' {
+ if (yyextra->insidePHP)
+ {
+ yyextra->lastStringContext=YY_START;
+ BEGIN(SkipPHPString);
+ }
+ }
+<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>. { }
+<SkipString,SkipPHPString>\\. { }
+<SkipString>\" {
+ BEGIN( yyextra->lastStringContext );
+ }
+<SkipPHPString>\' {
+ BEGIN( yyextra->lastStringContext );
+ }
<SkipString,SkipPHPString>"/*"|"*/"|"//" { }
-<SkipString,SkipPHPString>\n {
+<SkipString,SkipPHPString>\n {
lineCount(yyscanner);
- }
-<SkipString,SkipPHPString>. { }
-<CompoundName>":" { // for "class : public base {} var;" construct, see bug 608359
- unput(':');
- BEGIN(ClassVar);
- }
-<CompoundName>";" {
- yyextra->current->section = Entry::EMPTY_SEC ;
- yyextra->current->type.resize(0) ;
- yyextra->current->name.resize(0) ;
- yyextra->current->args.resize(0) ;
- yyextra->current->argList.clear();
- BEGIN( FindMembers ) ;
- }
-<Bases>";" {
- if (yyextra->insideIDL && (yyextra->current->spec & (Entry::Singleton |
- Entry::Service)))
- {
- // in UNO IDL a service or singleton may be defined
- // completely like this: "service Foo : XFoo;"
- if (!yyextra->current->name.isEmpty() && !yyextra->current_root->name.isEmpty())
- {
- prependScope(yyscanner);
- }
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- // there can be only one base class here
- if (!yyextra->baseName.isEmpty())
- {
- yyextra->current->extends.push_back(
- BaseInfo(yyextra->baseName,Public,Normal));
- yyextra->baseName.resize(0);
- }
- yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
+ }
+<SkipString,SkipPHPString>. { }
+<CompoundName>":" { // for "class : public base {} var;" construct, see bug 608359
+ unput(':');
+ BEGIN(ClassVar);
+ }
+<CompoundName>";" {
+ yyextra->current->section = Entry::EMPTY_SEC ;
+ yyextra->current->type.resize(0) ;
+ yyextra->current->name.resize(0) ;
+ yyextra->current->args.resize(0) ;
+ yyextra->current->argList.clear();
+ BEGIN( FindMembers ) ;
+ }
+<Bases>";" {
+ if (yyextra->insideIDL && (yyextra->current->spec & (Entry::Singleton |
+ Entry::Service)))
+ {
+ // in UNO IDL a service or singleton may be defined
+ // completely like this: "service Foo : XFoo;"
+ if (!yyextra->current->name.isEmpty() && !yyextra->current_root->name.isEmpty())
+ {
+ prependScope(yyscanner);
+ }
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ // there can be only one base class here
+ if (!yyextra->baseName.isEmpty())
+ {
+ yyextra->current->extends.push_back(
+ BaseInfo(yyextra->baseName,Public,Normal));
+ yyextra->baseName.resize(0);
+ }
+ yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
initEntry(yyscanner);
- }
- else
- {
- yyextra->current->section = Entry::EMPTY_SEC ;
- yyextra->current->type.resize(0) ;
- yyextra->current->name.resize(0) ;
- yyextra->current->args.resize(0) ;
- yyextra->current->argList.clear();
- }
- BEGIN( FindMembers ) ;
- }
-<CompoundName>{SCOPENAME}/{BN}*"<" {
- yyextra->sharpCount = 0;
- yyextra->current->name = yytext ;
- if (yyextra->current->spec & Entry::Protocol)
- {
- yyextra->current->name+="-p";
- }
- lineCount(yyscanner);
- yyextra->lastClassTemplSpecContext = ClassVar;
- if (yyextra->insideObjC) // protocol list
- {
- BEGIN( ObjCProtocolList );
- }
- else if (yyextra->insideCS) // C# generic class
- {
+ }
+ else
+ {
+ yyextra->current->section = Entry::EMPTY_SEC ;
+ yyextra->current->type.resize(0) ;
+ yyextra->current->name.resize(0) ;
+ yyextra->current->args.resize(0) ;
+ yyextra->current->argList.clear();
+ }
+ BEGIN( FindMembers ) ;
+ }
+<CompoundName>{SCOPENAME}/{BN}*"<" {
+ yyextra->sharpCount = 0;
+ yyextra->current->name = yytext ;
+ if (yyextra->current->spec & Entry::Protocol)
+ {
+ yyextra->current->name+="-p";
+ }
+ lineCount(yyscanner);
+ yyextra->lastClassTemplSpecContext = ClassVar;
+ if (yyextra->insideObjC) // protocol list
+ {
+ BEGIN( ObjCProtocolList );
+ }
+ else if (yyextra->insideCS) // C# generic class
+ {
//yyextra->current->name+="-g";
- BEGIN( CSGeneric );
- }
- else // C++ template specialization
- {
- yyextra->roundCount=0;
- BEGIN( ClassTemplSpec );
- }
- }
-<CSGeneric>"<" {
- ArgumentList al;
- // check bug 612858 before enabling the next line
- //yyextra->current->spec |= Entry::Template;
- yyextra->current->tArgLists.push_back(al);
- yyextra->currentArgumentList = &yyextra->current->tArgLists.back();
- yyextra->templateStr="<";
- yyextra->current->name += "<";
- yyextra->fullArgString = yyextra->templateStr;
- yyextra->copyArgString = &yyextra->current->name;
- //yyextra->copyArgString = &yyextra->templateStr;
- yyextra->currentArgumentContext = ClassVar;
- BEGIN( ReadTempArgs );
- }
-<ObjCProtocolList>"<" {
- yyextra->insideProtocolList=TRUE;
- BEGIN( Bases );
- }
-<ClassTemplSpec>">"({BN}*"::"{BN}*{SCOPENAME})? {
- yyextra->current->name += yytext;
- lineCount(yyscanner);
- if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
- {
- yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
- if (yyextra->current->spec & Entry::Protocol)
- { // Objective-C protocol
- unput('{'); // fake start of body
- BEGIN( ClassVar );
- }
- else
- {
- BEGIN( yyextra->lastClassTemplSpecContext );
- }
- }
- }
-<ClassTemplSpec>"<" {
- yyextra->current->name += yytext;
- if (yyextra->roundCount==0) yyextra->sharpCount++;
- }
-<ClassTemplSpec>. {
- yyextra->current->name += yytext;
- }
-<CompoundName>{SCOPENAME}{BN}*";" { // forward declaration
+ BEGIN( CSGeneric );
+ }
+ else // C++ template specialization
+ {
+ yyextra->roundCount=0;
+ BEGIN( ClassTemplSpec );
+ }
+ }
+<CSGeneric>"<" {
+ ArgumentList al;
+ // check bug 612858 before enabling the next line
+ //yyextra->current->spec |= Entry::Template;
+ yyextra->current->tArgLists.push_back(al);
+ yyextra->currentArgumentList = &yyextra->current->tArgLists.back();
+ yyextra->templateStr="<";
+ yyextra->current->name += "<";
+ yyextra->fullArgString = yyextra->templateStr;
+ yyextra->copyArgString = &yyextra->current->name;
+ //yyextra->copyArgString = &yyextra->templateStr;
+ yyextra->currentArgumentContext = ClassVar;
+ BEGIN( ReadTempArgs );
+ }
+<ObjCProtocolList>"<" {
+ yyextra->insideProtocolList=TRUE;
+ BEGIN( Bases );
+ }
+<ClassTemplSpec>">"({BN}*"::"{BN}*{SCOPENAME})? {
+ yyextra->current->name += yytext;
+ lineCount(yyscanner);
+ if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
+ {
+ yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
+ if (yyextra->current->spec & Entry::Protocol)
+ { // Objective-C protocol
+ unput('{'); // fake start of body
+ BEGIN( ClassVar );
+ }
+ else
+ {
+ BEGIN( yyextra->lastClassTemplSpecContext );
+ }
+ }
+ }
+<ClassTemplSpec>"<" {
+ yyextra->current->name += yytext;
+ if (yyextra->roundCount==0) yyextra->sharpCount++;
+ }
+<ClassTemplSpec>. {
+ yyextra->current->name += yytext;
+ }
+<CompoundName>{SCOPENAME}{BN}*";" { // forward declaration
if (!yyextra->current->tArgLists.empty())
{
// found a forward template declaration, this has
@@ -5202,54 +5291,54 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
yyextra->current->name = yytext;
yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
//printf("template class declaration for %s!\n",yyextra->current->name.data());
- QCString rn = yyextra->current_root->name.copy();
- //printf("cn='%s' rn='%s' yyextra->isTypedef=%d\n",cn.data(),rn.data(),yyextra->isTypedef);
- if (!yyextra->current->name.isEmpty() && !rn.isEmpty())
- {
- prependScope(yyscanner);
- }
+ QCString rn = yyextra->current_root->name.copy();
+ //printf("cn='%s' rn='%s' yyextra->isTypedef=%d\n",cn.data(),rn.data(),yyextra->isTypedef);
+ if (!yyextra->current->name.isEmpty() && !rn.isEmpty())
+ {
+ prependScope(yyscanner);
+ }
yyextra->current->spec|=Entry::ForwardDecl;
yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
}
- else if (yyextra->insideIDL &&
- (((yyextra->current_root->spec & (Entry::Interface |
- Entry::Service)) &&
- (yyextra->current->spec & Entry::Interface)) ||
- ((yyextra->current_root->spec & (Entry::Service |
- Entry::Singleton)) &&
- (yyextra->current->spec & Entry::Service))))
- {
- // interface yyextra->inside of UNO IDL service or interface
- // service yyextra->inside of UNO IDL service or singleton
- // there may be documentation on the member,
- // so do not throw it away...
- yyextra->current->name = yytext;
- yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
- yyextra->current->section = (yyextra->current->spec & Entry::Interface)
- ? Entry::EXPORTED_INTERFACE_SEC
- : Entry::INCLUDED_SERVICE_SEC;
-// yyextra->current->section = Entry::MEMBERDOC_SEC;
- yyextra->current->spec &= ~(Entry::Interface|Entry::Service); // FIXME: horrible: Interface == Gettable, so need to clear it - actually we're mixing values from different enums in this case... granted only Optional and Interface are actually valid in this context but urgh...
- yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
- }
-
- unput(';');
- yyextra->current->reset();
- initEntry(yyscanner);
+ else if (yyextra->insideIDL &&
+ (((yyextra->current_root->spec & (Entry::Interface |
+ Entry::Service)) &&
+ (yyextra->current->spec & Entry::Interface)) ||
+ ((yyextra->current_root->spec & (Entry::Service |
+ Entry::Singleton)) &&
+ (yyextra->current->spec & Entry::Service))))
+ {
+ // interface yyextra->inside of UNO IDL service or interface
+ // service yyextra->inside of UNO IDL service or singleton
+ // there may be documentation on the member,
+ // so do not throw it away...
+ yyextra->current->name = yytext;
+ yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
+ yyextra->current->section = (yyextra->current->spec & Entry::Interface)
+ ? Entry::EXPORTED_INTERFACE_SEC
+ : Entry::INCLUDED_SERVICE_SEC;
+// yyextra->current->section = Entry::MEMBERDOC_SEC;
+ yyextra->current->spec &= ~(Entry::Interface|Entry::Service); // FIXME: horrible: Interface == Gettable, so need to clear it - actually we're mixing values from different enums in this case... granted only Optional and Interface are actually valid in this context but urgh...
+ yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
+ }
+
+ unput(';');
+ yyextra->current->reset();
+ initEntry(yyscanner);
if (yyextra->insideObjC) // see bug746361
{
- yyextra->language = yyextra->current->lang = SrcLangExt_Cpp;
+ yyextra->language = yyextra->current->lang = SrcLangExt_Cpp;
yyextra->insideObjC = FALSE;
}
- if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
- {
- yyextra->current->type.prepend("typedef");
- }
- BEGIN( FindMembers );
- }
-<CompoundName>{SCOPENAME}/{BN}*"(" {
- yyextra->current->name = yytext ;
- lineCount(yyscanner);
+ if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
+ {
+ yyextra->current->type.prepend("typedef");
+ }
+ BEGIN( FindMembers );
+ }
+<CompoundName>{SCOPENAME}/{BN}*"(" {
+ yyextra->current->name = yytext ;
+ lineCount(yyscanner);
if (yyextra->insideCpp && yyextra->current->name=="alignas") // C++11
{
yyextra->lastAlignAsContext = YY_START;
@@ -5263,186 +5352,186 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
BEGIN( ClassVar );
}
- }
-<AlignAs>"(" { yyextra->roundCount=0;
- BEGIN( AlignAsEnd );
+ }
+<AlignAs>"(" { yyextra->roundCount=0;
+ BEGIN( AlignAsEnd );
}
<AlignAs>\n { lineCount(yyscanner); }
<AlignAs>.
<AlignAsEnd>"(" { yyextra->roundCount++; }
-<AlignAsEnd>")" { if (--yyextra->roundCount<0)
+<AlignAsEnd>")" { if (--yyextra->roundCount<0)
{
- BEGIN( yyextra->lastAlignAsContext );
+ BEGIN( yyextra->lastAlignAsContext );
}
}
<AlignAsEnd>\n { lineCount(yyscanner); }
<AlignAsEnd>.
-<CompoundName>{SCOPENAME}/{BN}*"," { // multiple forward declarations on one line
+<CompoundName>{SCOPENAME}/{BN}*"," { // multiple forward declarations on one line
// e.g. @protocol A,B;
- yyextra->current->reset();
- initEntry(yyscanner);
- }
-<CompoundName>{SCOPENAME} {
- yyextra->current->name = yytext ;
- if (yyextra->insideCpp || yyextra->insideObjC)
- {
- yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext);
- }
- lineCount(yyscanner);
- if (yyextra->current->spec & Entry::Protocol)
- {
- yyextra->current->name += "-p";
- }
- if ((yyextra->current->spec & Entry::Protocol) ||
- yyextra->current->section == Entry::OBJCIMPL_SEC)
- {
- unput('{'); // fake start of body
- }
- BEGIN( ClassVar );
- }
-<CompoundName>{CSSCOPENAME} { // C# style scope
- yyextra->current->name = substitute(yytext,".","::");
- lineCount(yyscanner);
- BEGIN( ClassVar );
- }
-<ClassVar>{SCOPENAME}{BN}*/"(" {
- if (yyextra->insideIDL && qstrncmp(yytext,"switch",6)==0 && !isId(yytext[6]))
- {
- // Corba IDL style union
- yyextra->roundCount=0;
- BEGIN(SkipUnionSwitch);
- }
- else
- {
- addType(yyscanner);
- yyextra->current->name = yytext;
- yyextra->current->name = yyextra->current->name.stripWhiteSpace();
- lineCount(yyscanner);
- BEGIN( FindMembers );
- }
- }
-<ClassVar>"," {
- if (yyextra->isTypedef)
- {
- // multiple types in one typedef
- unput(',');
- yyextra->current->type.prepend("typedef ");
- BEGIN(FindMembers);
- }
- else
- {
- // Multiple class forward declaration
- }
- }
+ yyextra->current->reset();
+ initEntry(yyscanner);
+ }
+<CompoundName>{SCOPENAME} {
+ yyextra->current->name = yytext ;
+ if (yyextra->clangParser && (yyextra->insideCpp || yyextra->insideObjC))
+ {
+ yyextra->current->id = yyextra->clangParser->lookup(yyextra->yyLineNr,yytext);
+ }
+ lineCount(yyscanner);
+ if (yyextra->current->spec & Entry::Protocol)
+ {
+ yyextra->current->name += "-p";
+ }
+ if ((yyextra->current->spec & Entry::Protocol) ||
+ yyextra->current->section == Entry::OBJCIMPL_SEC)
+ {
+ unput('{'); // fake start of body
+ }
+ BEGIN( ClassVar );
+ }
+<CompoundName>{CSSCOPENAME} { // C# style scope
+ yyextra->current->name = substitute(yytext,".","::");
+ lineCount(yyscanner);
+ BEGIN( ClassVar );
+ }
+<ClassVar>{SCOPENAME}{BN}*/"(" {
+ if (yyextra->insideIDL && qstrncmp(yytext,"switch",6)==0 && !isId(yytext[6]))
+ {
+ // Corba IDL style union
+ yyextra->roundCount=0;
+ BEGIN(SkipUnionSwitch);
+ }
+ else
+ {
+ addType(yyscanner);
+ yyextra->current->name = yytext;
+ yyextra->current->name = yyextra->current->name.stripWhiteSpace();
+ lineCount(yyscanner);
+ BEGIN( FindMembers );
+ }
+ }
+<ClassVar>"," {
+ if (yyextra->isTypedef)
+ {
+ // multiple types in one typedef
+ unput(',');
+ yyextra->current->type.prepend("typedef ");
+ BEGIN(FindMembers);
+ }
+ else
+ {
+ // Multiple class forward declaration
+ }
+ }
<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") {
- if (yyextra->insideCli)
- {
- if (yytext[0]=='s') // sealed
- yyextra->current->spec |= Entry::SealedClass;
- else // abstract
- yyextra->current->spec |= Entry::AbstractClass;
- BEGIN( ClassVar );
- }
- else
- {
- REJECT;
- }
- }
-<ClassVar>{ID} {
- if (yyextra->insideCpp || yyextra->insideObjC)
- {
- yyextra->current->id = ClangParser::instance()->lookup(yyextra->yyLineNr,yytext);
- }
- if (yyextra->insideIDL && qstrcmp(yytext,"switch")==0)
- {
- // Corba IDL style union
- yyextra->roundCount=0;
- BEGIN(SkipUnionSwitch);
- }
- else if ((yyextra->insideJava || yyextra->insidePHP || yyextra->insideJS || yyextra->insideSlice) && (qstrcmp(yytext,"implements")==0 || qstrcmp(yytext,"extends")==0))
- {
- yyextra->current->type.resize(0);
- yyextra->baseProt=Public;
+ if (yyextra->insideCli)
+ {
+ if (yytext[0]=='s') // sealed
+ yyextra->current->spec |= Entry::SealedClass;
+ else // abstract
+ yyextra->current->spec |= Entry::AbstractClass;
+ BEGIN( ClassVar );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<ClassVar>{ID} {
+ if (yyextra->clangParser && (yyextra->insideCpp || yyextra->insideObjC))
+ {
+ yyextra->current->id = yyextra->clangParser->lookup(yyextra->yyLineNr,yytext);
+ }
+ if (yyextra->insideIDL && qstrcmp(yytext,"switch")==0)
+ {
+ // Corba IDL style union
+ yyextra->roundCount=0;
+ BEGIN(SkipUnionSwitch);
+ }
+ else if ((yyextra->insideJava || yyextra->insidePHP || yyextra->insideJS || yyextra->insideSlice) && (qstrcmp(yytext,"implements")==0 || qstrcmp(yytext,"extends")==0))
+ {
+ yyextra->current->type.resize(0);
+ yyextra->baseProt=Public;
yyextra->baseVirt=Normal;
- yyextra->baseName.resize(0);
- BEGIN( BasesProt ) ;
- }
- else if (yyextra->insideCS && qstrcmp(yytext,"where")==0) // C# type constraint
- {
+ yyextra->baseName.resize(0);
+ BEGIN( BasesProt ) ;
+ }
+ else if (yyextra->insideCS && qstrcmp(yytext,"where")==0) // C# type constraint
+ {
yyextra->current->typeConstr.clear();
- yyextra->current->typeConstr.push_back(Argument());
- yyextra->lastCSConstraint = YY_START;
- BEGIN( CSConstraintName );
- }
- else if (yyextra->insideCli && qstrcmp(yytext,"abstract")==0)
- {
- yyextra->current->spec|=Entry::Abstract;
- }
- else if (yyextra->insideCli && qstrcmp(yytext,"sealed")==0)
- {
- yyextra->current->spec|=Entry::Sealed;
- }
+ yyextra->current->typeConstr.push_back(Argument());
+ yyextra->lastCSConstraint = YY_START;
+ BEGIN( CSConstraintName );
+ }
+ else if (yyextra->insideCli && qstrcmp(yytext,"abstract")==0)
+ {
+ yyextra->current->spec|=Entry::Abstract;
+ }
+ else if (yyextra->insideCli && qstrcmp(yytext,"sealed")==0)
+ {
+ yyextra->current->spec|=Entry::Sealed;
+ }
else if (qstrcmp(yytext,"final")==0)
{
yyextra->current->spec|=Entry::Final;
}
- else
- {
- if (yyextra->current->section == Entry::ENUM_SEC)
- { // found "enum a b" -> variable
- yyextra->current->section = Entry::VARIABLE_SEC ;
- }
- yyextra->current->type += ' ' ;
- yyextra->current->type += yyextra->current->name ;
- yyextra->current->name = yytext ;
-
- if (nameIsOperator(yyextra->current->name))
- {
- BEGIN( Operator );
- }
- }
- }
-<ClassVar>[(\[] {
- if (yyextra->insideObjC && *yytext=='(') // class category
- {
- yyextra->current->name+='(';
+ else
+ {
+ if (yyextra->current->section == Entry::ENUM_SEC)
+ { // found "enum a b" -> variable
+ yyextra->current->section = Entry::VARIABLE_SEC ;
+ }
+ yyextra->current->type += ' ' ;
+ yyextra->current->type += yyextra->current->name ;
+ yyextra->current->name = yytext ;
+
+ if (nameIsOperator(yyextra->current->name))
+ {
+ BEGIN( Operator );
+ }
+ }
+ }
+<ClassVar>[(\[] {
+ if (yyextra->insideObjC && *yytext=='(') // class category
+ {
+ yyextra->current->name+='(';
//if (yyextra->current->section!=Entry::OBJCIMPL_SEC)
//{
- yyextra->current->spec|=Entry::Category;
+ yyextra->current->spec|=Entry::Category;
//}
- BEGIN( ClassCategory );
- }
- else
- {
+ BEGIN( ClassCategory );
+ }
+ else
+ {
// probably a function anyway
unput(*yytext);
- BEGIN( FindMembers );
- }
- }
+ BEGIN( FindMembers );
+ }
+ }
<CSConstraintType,CSConstraintName>"/**/" { /* empty comment */ }
-<CSConstraintType,CSConstraintName>("/*"[*!]|"//"[/!])("<"?) { // special comment
+<CSConstraintType,CSConstraintName>("/*"[*!]|"//"[/!])("<"?) { // special comment
yyextra->fullArgString.resize(0);
- yyextra->lastCopyArgChar='#'; // end marker
- yyextra->lastCommentInArgContext=YY_START;
- if (yytext[1]=='/')
- BEGIN( CopyArgCommentLine );
- else
- BEGIN( CopyArgComment );
- }
-<CSConstraintType,CSConstraintName>"#" { // artificially inserted token to signal end of comment block
+ yyextra->lastCopyArgChar='#'; // end marker
+ yyextra->lastCommentInArgContext=YY_START;
+ if (yytext[1]=='/')
+ BEGIN( CopyArgCommentLine );
+ else
+ BEGIN( CopyArgComment );
+ }
+<CSConstraintType,CSConstraintName>"#" { // artificially inserted token to signal end of comment block
yyextra->current->typeConstr.back().docs = yyextra->fullArgString;
- }
-<CSConstraintType>"{" { // end of type constraint reached
+ }
+<CSConstraintType>"{" { // end of type constraint reached
// parse documentation of the constraints
handleParametersCommentBlocks(yyscanner,yyextra->current->typeConstr);
- unput('{');
- BEGIN( yyextra->lastCSConstraint );
- }
+ unput('{');
+ BEGIN( yyextra->lastCSConstraint );
+ }
<CSConstraintType,CSConstraintName>";" {
handleParametersCommentBlocks(yyscanner,yyextra->current->typeConstr);
- unput(';');
- BEGIN( yyextra->lastCSConstraint );
- }
+ unput(';');
+ BEGIN( yyextra->lastCSConstraint );
+ }
<CSConstraintName>":" {
BEGIN( CSConstraintType );
}
@@ -5450,10 +5539,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
// parameter name
yyextra->current->typeConstr.back().name=yytext;
}
-<CSConstraintType>"where" { // another constraint for a different param
- yyextra->current->typeConstr.push_back(Argument());
+<CSConstraintType>"where" { // another constraint for a different param
+ yyextra->current->typeConstr.push_back(Argument());
BEGIN( CSConstraintName );
- }
+ }
<CSConstraintType>({ID}".")*{ID}("<"{ID}">")?("()")? {
if (yyextra->current->typeConstr.back().type.isEmpty())
// first type constraint for this parameter
@@ -5468,299 +5557,300 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
yyextra->current->typeConstr.back().type=yytext;
}
}
-<CSConstraintName,CSConstraintType>\n {
+<CSConstraintName,CSConstraintType>\n {
lineCount(yyscanner);
- }
-<CSConstraintName,CSConstraintType>. {
- }
-<ClassCategory>{ID} {
- yyextra->current->name+=yytext;
- }
-<ClassCategory>")"/{BN}*"{" {
- yyextra->current->name+=')';
- BEGIN( ClassVar );
- }
-<ClassCategory>")"/{BN}*"<" {
- yyextra->current->name+=')';
- BEGIN( ObjCProtocolList );
- }
-<ClassCategory>")" {
- yyextra->current->name+=')';
- if ((yyextra->current->section & Entry::Protocol) ||
- yyextra->current->section == Entry::OBJCIMPL_SEC)
- {
- unput('{'); // fake start of body
- }
- else // category has no variables so push back an empty body
- {
- unput('}');
- unput('{');
- }
- BEGIN( ClassVar );
- }
-<ClassVar>":" {
+ }
+<CSConstraintName,CSConstraintType>. {
+ }
+<ClassCategory>{ID} {
+ yyextra->current->name+=yytext;
+ }
+<ClassCategory>")"/{BN}*"{" {
+ yyextra->current->name+=')';
+ BEGIN( ClassVar );
+ }
+<ClassCategory>")"/{BN}*"<" {
+ yyextra->current->name+=')';
+ BEGIN( ObjCProtocolList );
+ }
+<ClassCategory>")" {
+ yyextra->current->name+=')';
+ if ((yyextra->current->section & Entry::Protocol) ||
+ yyextra->current->section == Entry::OBJCIMPL_SEC)
+ {
+ unput('{'); // fake start of body
+ }
+ else // category has no variables so push back an empty body
+ {
+ unput('}');
+ unput('{');
+ }
+ BEGIN( ClassVar );
+ }
+<ClassVar>":" {
if (yyextra->current->section==Entry::VARIABLE_SEC) // enum A B:2, see bug 748208
{
yyextra->current->bitfields+=":";
yyextra->current->args.resize(0);
BEGIN(BitFields);
}
- else if (yyextra->current->section==Entry::ENUM_SEC) // enum E:2, see bug 313527,
+ else if (yyextra->current->section==Entry::ENUM_SEC) // enum E:2, see bug 313527,
// or C++11 style enum: 'E : unsigned int {...}'
- {
- yyextra->current->args.resize(0);
- BEGIN(EnumBaseType);
- }
- else
- {
- yyextra->current->type.resize(0);
- if ((yyextra->current->spec & Entry::Interface) ||
- (yyextra->current->spec & Entry::Struct) ||
- (yyextra->current->spec & Entry::Ref) ||
- (yyextra->current->spec & Entry::Value) ||
- yyextra->insidePHP || yyextra->insideCS || yyextra->insideD || yyextra->insideObjC || yyextra->insideIDL
- )
- yyextra->baseProt=Public;
- else
- yyextra->baseProt=Private;
- yyextra->baseVirt=Normal;
- yyextra->baseName.resize(0);
- BEGIN( BasesProt ) ;
- }
- }
-<ClassVar>[;=*&] {
- unput(*yytext);
- if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
- {
- yyextra->current->type.prepend("typedef");
- }
- if ((yytext[0]=='*' || yytext[0]=='&') &&
- yyextra->current->section == Entry::ENUM_SEC)
- { // found "enum a *b" -> variable
- yyextra->current->section = Entry::VARIABLE_SEC ;
- }
- BEGIN( FindMembers );
- }
+ {
+ yyextra->current->args.resize(0);
+ BEGIN(EnumBaseType);
+ }
+ else
+ {
+ yyextra->current->type.resize(0);
+ if ((yyextra->current->spec & Entry::Interface) ||
+ (yyextra->current->spec & Entry::Struct) ||
+ (yyextra->current->spec & Entry::Ref) ||
+ (yyextra->current->spec & Entry::Value) ||
+ yyextra->insidePHP || yyextra->insideCS || yyextra->insideD || yyextra->insideObjC || yyextra->insideIDL
+ )
+ yyextra->baseProt=Public;
+ else
+ yyextra->baseProt=Private;
+ yyextra->baseVirt=Normal;
+ yyextra->baseName.resize(0);
+ BEGIN( BasesProt ) ;
+ }
+ }
+<ClassVar>[;=*&] {
+ unput(*yytext);
+ if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
+ {
+ yyextra->current->type.prepend("typedef");
+ }
+ if ((yytext[0]=='*' || yytext[0]=='&') &&
+ yyextra->current->section == Entry::ENUM_SEC)
+ { // found "enum a *b" -> variable
+ yyextra->current->section = Entry::VARIABLE_SEC ;
+ }
+ BEGIN( FindMembers );
+ }
<Bases,ClassVar>"///"/[^/] {
- if (!yyextra->insideObjC)
- {
- REJECT;
- }
- else
- {
- lineCount(yyscanner);
- yyextra->current->program+=yytext;
+ if (!yyextra->insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ lineCount(yyscanner);
+ yyextra->current->program+=yytext;
yyextra->current->fileName = yyextra->yyFileName ;
- yyextra->current->startLine = yyextra->yyLineNr ;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->curlyCount=0;
- BEGIN( ReadBodyIntf );
- }
- }
+ yyextra->current->startLine = yyextra->yyLineNr ;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->curlyCount=0;
+ BEGIN( ReadBodyIntf );
+ }
+ }
<Bases,ClassVar>("//"{B}*)?"/**"/[^/*] |
<Bases,ClassVar>("//"{B}*)?"/*!" |
<Bases,ClassVar>"//!" |
-<Bases,ClassVar>[\-+]{BN}* {
- if (!yyextra->insideObjC)
- {
- REJECT;
- }
- else
- {
- lineCount(yyscanner);
- yyextra->current->program+=yytext;
+<Bases,ClassVar>[\-+]{BN}* {
+ if (!yyextra->insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ lineCount(yyscanner);
+ yyextra->current->program+=yytext;
yyextra->current->fileName = yyextra->yyFileName ;
- yyextra->current->startLine = yyextra->yyLineNr ;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->curlyCount=0;
- BEGIN( ReadBodyIntf );
- }
- }
-<CompoundName,ClassVar>{B}*"{"{B}* {
+ yyextra->current->startLine = yyextra->yyLineNr ;
+ yyextra->current->startColumn = yyextra->yyColNr;
+ yyextra->curlyCount=0;
+ BEGIN( ReadBodyIntf );
+ }
+ }
+<CompoundName,ClassVar>{B}*"{"{B}* {
+ yyextra->current->program.resize(0);
yyextra->current->fileName = yyextra->yyFileName ;
- yyextra->current->startLine = yyextra->yyLineNr ;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
- if (yyextra->current->name.isEmpty() && !yyextra->isTypedef) // anonymous compound
- {
- if (yyextra->current->section==Entry::NAMESPACE_SEC) // allow reopening of anonymous namespaces
- {
- if (Config_getBool(EXTRACT_ANON_NSPACES)) // use visible name
- {
- yyextra->current->name="anonymous_namespace{"+stripPath(yyextra->current->fileName)+"}";
- }
- else // use invisible name
- {
- yyextra->current->name.sprintf("@%d",yyextra->anonNSCount);
- }
- }
- else
- {
- yyextra->current->name.sprintf("@%d",yyextra->anonCount++);
- }
- }
- yyextra->curlyCount=0;
- if (yyextra->current_root && // not a nested struct yyextra->inside an @interface section
- !(yyextra->current_root->spec & Entry::Interface) &&
- ((yyextra->current->spec & (Entry::Interface | Entry::Protocol | Entry::Category) ||
- yyextra->current->section==Entry::OBJCIMPL_SEC)
- ) &&
- yyextra->insideObjC
- )
- { // ObjC body that ends with @end
- BEGIN( ReadBodyIntf );
- }
- else if (yyextra->current->section==Entry::NAMESPACE_SEC)
- { // namespace body
- BEGIN( ReadNSBody );
- }
- else
- { // class body
- BEGIN( ReadBody ) ;
- }
- }
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
+ if (yyextra->current->name.isEmpty() && !yyextra->isTypedef) // anonymous compound
+ {
+ if (yyextra->current->section==Entry::NAMESPACE_SEC) // allow reopening of anonymous namespaces
+ {
+ if (Config_getBool(EXTRACT_ANON_NSPACES)) // use visible name
+ {
+ yyextra->current->name="anonymous_namespace{"+stripPath(yyextra->current->fileName)+"}";
+ }
+ else // use invisible name
+ {
+ yyextra->current->name.sprintf("@%d",anonNSCount.load());
+ }
+ }
+ else
+ {
+ yyextra->current->name.sprintf("@%d",anonCount++);
+ }
+ }
+ yyextra->curlyCount=0;
+ if (yyextra->current_root && // not a nested struct yyextra->inside an @interface section
+ !(yyextra->current_root->spec & Entry::Interface) &&
+ ((yyextra->current->spec & (Entry::Interface | Entry::Protocol | Entry::Category) ||
+ yyextra->current->section==Entry::OBJCIMPL_SEC)
+ ) &&
+ yyextra->insideObjC
+ )
+ { // ObjC body that ends with @end
+ BEGIN( ReadBodyIntf );
+ }
+ else if (yyextra->current->section==Entry::NAMESPACE_SEC)
+ { // namespace body
+ BEGIN( ReadNSBody );
+ }
+ else
+ { // class body
+ BEGIN( ReadBody ) ;
+ }
+ }
<BasesProt>"virtual"{BN}+ { lineCount(yyscanner); yyextra->baseVirt = Virtual; }
<BasesProt>"public"{BN}+ { lineCount(yyscanner); yyextra->baseProt = Public; }
<BasesProt>"protected"{BN}+ { lineCount(yyscanner); yyextra->baseProt = Protected; }
<BasesProt>"internal"{BN}+ { if (!yyextra->insideCli) REJECT ; lineCount(yyscanner); yyextra->baseProt = Package; }
<BasesProt>"private"{BN}+ { lineCount(yyscanner); yyextra->baseProt = Private; }
-<BasesProt>{BN} { lineCount(yyscanner); }
-<BasesProt>. { unput(*yytext); BEGIN(Bases); }
-<Bases>("\\")?({ID}"\\")*{ID} { // PHP namespace token, not sure if interspacing is allowed but it gives problems (see bug 640847)
+<BasesProt>{BN} { lineCount(yyscanner); }
+<BasesProt>. { unput(*yytext); BEGIN(Bases); }
+<Bases>("\\")?({ID}"\\")*{ID} { // PHP namespace token, not sure if interspacing is allowed but it gives problems (see bug 640847)
if (!yyextra->insidePHP)
- {
- REJECT;
- }
- else // PHP base class of the form \Ns\Cl or Ns\Cl
- {
- lineCount(yyscanner);
- QCString bn=yytext;
- bn = substitute(bn,"\\","::");
- yyextra->baseName += bn;
- yyextra->current->args += ' ';
- yyextra->current->args += yytext;
- }
- }
-<Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID} {
- lineCount(yyscanner);
+ {
+ REJECT;
+ }
+ else // PHP base class of the form \Ns\Cl or Ns\Cl
+ {
+ lineCount(yyscanner);
+ QCString bn=yytext;
+ bn = substitute(bn,"\\","::");
+ yyextra->baseName += bn;
+ yyextra->current->args += ' ';
+ yyextra->current->args += yytext;
+ }
+ }
+<Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID} {
+ lineCount(yyscanner);
QCString baseScope = yytext;
if (yyextra->insideCS && baseScope.stripWhiteSpace()=="where")
- {
- // type constraint for a class
+ {
+ // type constraint for a class
yyextra->current->typeConstr.clear();
- yyextra->current->typeConstr.push_back(Argument());
- yyextra->lastCSConstraint = YY_START;
- BEGIN( CSConstraintName );
- }
- else
- {
- yyextra->baseName+=yytext;
- yyextra->current->args += ' ';
- yyextra->current->args += yytext;
- }
- }
-<Bases>{BN}*{ID}("."{ID})* { // Java style class
- QCString name = substitute(yytext,".","::");
- yyextra->baseName += name;
- yyextra->current->args += ' ';
- yyextra->current->args += name;
- }
-<ClassVar,Bases>\n/{BN}*[^{, \t\n] {
- if (!yyextra->insideObjC)
- {
- REJECT;
- }
- else
- {
+ yyextra->current->typeConstr.push_back(Argument());
+ yyextra->lastCSConstraint = YY_START;
+ BEGIN( CSConstraintName );
+ }
+ else
+ {
+ yyextra->baseName+=yytext;
+ yyextra->current->args += ' ';
+ yyextra->current->args += yytext;
+ }
+ }
+<Bases>{BN}*{ID}("."{ID})* { // Java style class
+ QCString name = substitute(yytext,".","::");
+ yyextra->baseName += name;
+ yyextra->current->args += ' ';
+ yyextra->current->args += name;
+ }
+<ClassVar,Bases>\n/{BN}*[^{, \t\n] {
+ if (!yyextra->insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
lineCount(yyscanner);
- unput('{');
- }
- }
-<ClassVar,Bases>"@end" { // empty ObjC interface
- unput('d'); // insert fake body: {}@end
- unput('n');
- unput('e');
- unput('@');
- unput('}');
- unput('{');
- }
-<ClassVar>"<" { yyextra->current->name += *yytext;
- yyextra->sharpCount=1;
- yyextra->roundCount=0;
- yyextra->lastSkipSharpContext = YY_START;
- yyextra->specName = &yyextra->current->name;
- BEGIN ( Specialization );
- }
+ unput('{');
+ }
+ }
+<ClassVar,Bases>"@end" { // empty ObjC interface
+ unput('d'); // insert fake body: {}@end
+ unput('n');
+ unput('e');
+ unput('@');
+ unput('}');
+ unput('{');
+ }
+<ClassVar>"<" { yyextra->current->name += *yytext;
+ yyextra->sharpCount=1;
+ yyextra->roundCount=0;
+ yyextra->lastSkipSharpContext = YY_START;
+ yyextra->specName = &yyextra->current->name;
+ BEGIN ( Specialization );
+ }
<Bases>{BN}*"<" {
lineCount(yyscanner);
- yyextra->sharpCount=1;
- yyextra->roundCount=0;
- yyextra->lastSkipSharpContext = YY_START;
- if (yyextra->insideObjC) // start of protocol list
- {
- unput(',');
- }
- else // template specialization
- {
- //if (yyextra->insideCS) // generic
- //{
- // yyextra->baseName+="-g";
- //}
+ yyextra->sharpCount=1;
+ yyextra->roundCount=0;
+ yyextra->lastSkipSharpContext = YY_START;
+ if (yyextra->insideObjC) // start of protocol list
+ {
+ unput(',');
+ }
+ else // template specialization
+ {
+ //if (yyextra->insideCS) // generic
+ //{
+ // yyextra->baseName+="-g";
+ //}
yyextra->templateStr = yytext;
- yyextra->specName = &yyextra->templateStr;
- BEGIN ( Specialization );
- }
- }
-<Specialization>"<" { *yyextra->specName += *yytext;
- if (yyextra->roundCount==0) yyextra->sharpCount++;
- }
-<Specialization>">" {
- *yyextra->specName += *yytext;
- if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
- {
- yyextra->baseName+=removeRedundantWhiteSpace(*yyextra->specName);
- BEGIN(yyextra->lastSkipSharpContext);
- }
- }
-<Specialization>{BN}+ { lineCount(yyscanner); *yyextra->specName +=' '; }
-<Specialization>"<<" { *yyextra->specName += yytext; }
-<Specialization>">>"/{B}*"::" { // M$ C++ extension to allow >> to close a template...
- unput('>');
- unput(' ');
- unput('>');
- }
-<Specialization>">>" {
+ yyextra->specName = &yyextra->templateStr;
+ BEGIN ( Specialization );
+ }
+ }
+<Specialization>"<" { *yyextra->specName += *yytext;
+ if (yyextra->roundCount==0) yyextra->sharpCount++;
+ }
+<Specialization>">" {
+ *yyextra->specName += *yytext;
+ if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
+ {
+ yyextra->baseName+=removeRedundantWhiteSpace(*yyextra->specName);
+ BEGIN(yyextra->lastSkipSharpContext);
+ }
+ }
+<Specialization>{BN}+ { lineCount(yyscanner); *yyextra->specName +=' '; }
+<Specialization>"<<" { *yyextra->specName += yytext; }
+<Specialization>">>"/{B}*"::" { // M$ C++ extension to allow >> to close a template...
+ unput('>');
+ unput(' ');
+ unput('>');
+ }
+<Specialization>">>" {
if (yyextra->insideCS) // for C# >> ends a nested template
- {
- REJECT;
- }
- else // for C++ >> is a bitshift
- // operator and > > would end
- // a nested template.
- // We require the bitshift to be enclosed in braces.
- // See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
- {
- if (yyextra->roundCount>0)
- {
- *yyextra->specName += yytext;
- }
- else
- {
- unput('>');
- unput(' ');
- unput('>');
- }
- }
- }
-<Specialization>"typename"{BN}+ { lineCount(yyscanner); }
-<Specialization>"(" { *yyextra->specName += *yytext; yyextra->roundCount++; }
-<Specialization>")" { *yyextra->specName += *yytext; yyextra->roundCount--; }
-
-<Specialization>"\\\\" { *yyextra->specName += *yytext;}
-<Specialization>"\\'" { *yyextra->specName += *yytext;}
-<Specialization>"\\\"" { *yyextra->specName += *yytext;}
-<Specialization>"'" { *yyextra->specName += *yytext;BEGIN(SpecializationSingleQuote);}
-<Specialization>"\"" { *yyextra->specName += *yytext;BEGIN(SpecializationDoubleQuote);}
+ {
+ REJECT;
+ }
+ else // for C++ >> is a bitshift
+ // operator and > > would end
+ // a nested template.
+ // We require the bitshift to be enclosed in braces.
+ // See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
+ {
+ if (yyextra->roundCount>0)
+ {
+ *yyextra->specName += yytext;
+ }
+ else
+ {
+ unput('>');
+ unput(' ');
+ unput('>');
+ }
+ }
+ }
+<Specialization>"typename"{BN}+ { lineCount(yyscanner); }
+<Specialization>"(" { *yyextra->specName += *yytext; yyextra->roundCount++; }
+<Specialization>")" { *yyextra->specName += *yytext; yyextra->roundCount--; }
+
+<Specialization>"\\\\" { *yyextra->specName += *yytext;}
+<Specialization>"\\'" { *yyextra->specName += *yytext;}
+<Specialization>"\\\"" { *yyextra->specName += *yytext;}
+<Specialization>"'" { *yyextra->specName += *yytext;BEGIN(SpecializationSingleQuote);}
+<Specialization>"\"" { *yyextra->specName += *yytext;BEGIN(SpecializationDoubleQuote);}
<SpecializationSingleQuote,SpecializationDoubleQuote>"\\\\" { *yyextra->specName += *yytext;}
<SpecializationSingleQuote>"\\'" { *yyextra->specName += *yytext;}
<SpecializationSingleQuote>"'" { *yyextra->specName += *yytext; BEGIN(Specialization);}
@@ -5768,152 +5858,154 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
<SpecializationDoubleQuote>"\"" { *yyextra->specName += *yytext; BEGIN(Specialization);}
<SpecializationSingleQuote,SpecializationDoubleQuote>. { *yyextra->specName += *yytext;}
-<Specialization>. {
- *yyextra->specName += *yytext;
- }
-<SkipRound>"(" { ++yyextra->roundCount; }
-<SkipRound>")" { if (--yyextra->roundCount<0)
- BEGIN ( yyextra->lastSkipRoundContext );
- }
-<SkipRound>\" {
- yyextra->lastStringContext=SkipRound;
- BEGIN(SkipString);
- }
-<Bases>","|(">"({BN}*"{")?)|({BN}+"implements"{BN}*) { lineCount(yyscanner);
+<Specialization>. {
+ *yyextra->specName += *yytext;
+ }
+<SkipRound>"(" { ++yyextra->roundCount; }
+<SkipRound>")" { if (--yyextra->roundCount<0)
+ BEGIN ( yyextra->lastSkipRoundContext );
+ }
+<SkipRound>\" {
+ yyextra->lastStringContext=SkipRound;
+ BEGIN(SkipString);
+ }
+<Bases>","|(">"({BN}*"{")?)|({BN}+"implements"{BN}*) { lineCount(yyscanner);
if (yyextra->insideProtocolList)
- {
- yyextra->baseName+="-p";
- }
- else
- {
- yyextra->current->args += ',' ;
- }
- yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
- if (!yyextra->baseName.isEmpty())
- {
- yyextra->current->extends.push_back(
- BaseInfo(yyextra->baseName,yyextra->baseProt,yyextra->baseVirt)
- );
- }
- if ((yyextra->current->spec & (Entry::Interface|Entry::Struct)) ||
- yyextra->insideJava || yyextra->insidePHP || yyextra->insideCS ||
- yyextra->insideD || yyextra->insideObjC || yyextra->insideIDL || yyextra->insideSlice)
- {
- yyextra->baseProt=Public;
- }
- else
- {
- yyextra->baseProt=Private;
- }
- yyextra->baseVirt=Normal;
- yyextra->baseName.resize(0);
+ {
+ yyextra->baseName+="-p";
+ }
+ else
+ {
+ yyextra->current->args += ',' ;
+ }
+ yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
+ if (!yyextra->baseName.isEmpty())
+ {
+ yyextra->current->extends.push_back(
+ BaseInfo(yyextra->baseName,yyextra->baseProt,yyextra->baseVirt)
+ );
+ }
+ if ((yyextra->current->spec & (Entry::Interface|Entry::Struct)) ||
+ yyextra->insideJava || yyextra->insidePHP || yyextra->insideCS ||
+ yyextra->insideD || yyextra->insideObjC || yyextra->insideIDL || yyextra->insideSlice)
+ {
+ yyextra->baseProt=Public;
+ }
+ else
+ {
+ yyextra->baseProt=Private;
+ }
+ yyextra->baseVirt=Normal;
+ yyextra->baseName.resize(0);
if (*yytext=='>')
- { // end of a ObjC protocol list
- yyextra->insideProtocolList=FALSE;
- if (yyleng==1)
- {
- unput('{'); // dummy start body
- }
- else
- {
- yyless(1);
- }
- }
- else
- {
- if (*yytext==',' && yyextra->insideObjC) // Begin of protocol list
- {
- yyextra->insideProtocolList=TRUE;
- }
- BEGIN(BasesProt);
- }
- }
-<Bases>{B}*"{"{B}* { yyextra->current->fileName = yyextra->yyFileName ;
- yyextra->current->startLine = yyextra->yyLineNr ;
- yyextra->current->startColumn = yyextra->yyColNr;
- yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
- if (!yyextra->baseName.isEmpty())
- yyextra->current->extends.push_back(
- BaseInfo(yyextra->baseName,yyextra->baseProt,yyextra->baseVirt)
- );
- yyextra->curlyCount=0;
- if (yyextra->insideObjC)
- {
- BEGIN( ReadBodyIntf );
- }
- else
- {
- BEGIN( ReadBody ) ;
- }
- }
-<SkipUnionSwitch>{B}*"(" {
- yyextra->roundCount++;
- }
-<SkipUnionSwitch>")" {
- if (--yyextra->roundCount==0)
- {
- BEGIN(ClassVar);
- }
- }
-<SkipUnionSwitch>\n { lineCount(yyscanner); }
-<SkipUnionSwitch>.
-<Comment>{BN}+ { yyextra->current->program += yytext ;
- lineCount(yyscanner) ;
- }
-<Comment>"/*" { yyextra->current->program += yytext ; }
-<Comment>"//" { yyextra->current->program += yytext ; }
-<Comment>{CMD}("code"|"verbatim") {
+ { // end of a ObjC protocol list
+ yyextra->insideProtocolList=FALSE;
+ if (yyleng==1)
+ {
+ unput('{'); // dummy start body
+ }
+ else
+ {
+ yyless(1);
+ }
+ }
+ else
+ {
+ if (*yytext==',' && yyextra->insideObjC) // Begin of protocol list
+ {
+ yyextra->insideProtocolList=TRUE;
+ }
+ BEGIN(BasesProt);
+ }
+ }
+<Bases>{B}*"{"{B}* {
+ yyextra->current->program.resize(0);
+ yyextra->current->fileName = yyextra->yyFileName ;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
+ if (!yyextra->baseName.isEmpty())
+ yyextra->current->extends.push_back(
+ BaseInfo(yyextra->baseName,yyextra->baseProt,yyextra->baseVirt)
+ );
+ yyextra->curlyCount=0;
+ if (yyextra->insideObjC)
+ {
+ BEGIN( ReadBodyIntf );
+ }
+ else
+ {
+ BEGIN( ReadBody ) ;
+ }
+ }
+<SkipUnionSwitch>{B}*"(" {
+ yyextra->roundCount++;
+ }
+<SkipUnionSwitch>")" {
+ if (--yyextra->roundCount==0)
+ {
+ BEGIN(ClassVar);
+ }
+ }
+<SkipUnionSwitch>\n { lineCount(yyscanner); }
+<SkipUnionSwitch>.
+<Comment>{BN}+ { yyextra->current->program += yytext ;
+ lineCount(yyscanner) ;
+ }
+<Comment>"/*" { yyextra->current->program += yytext ; }
+<Comment>"//" { yyextra->current->program += yytext ; }
+<Comment>{CMD}("code"|"verbatim") {
yyextra->insideCode=TRUE;
- yyextra->current->program += yytext ;
- }
-<Comment>{CMD}("endcode"|"endverbatim") {
+ yyextra->current->program += yytext ;
+ }
+<Comment>{CMD}("endcode"|"endverbatim") {
yyextra->insideCode=FALSE;
- yyextra->current->program += yytext ;
- }
-<Comment>[^ \.\t\r\n\/\*]+ { yyextra->current->program += yytext ; }
-<Comment>"*/" { yyextra->current->program += yytext ;
- if (!yyextra->insideCode) BEGIN( yyextra->lastContext ) ;
- }
-<Comment>. { yyextra->current->program += *yytext ; }
-
-<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,SkipC11Inits,SkipC11Attribute,Bases,OldStyleArgs>("//"{B}*)?"/*!" {
- //printf("Start doc block at %d\n",yyextra->yyLineNr);
- if (!yyextra->current->doc.isEmpty())
- {
- yyextra->current->doc+="\n\n";
- }
- else
- {
- yyextra->current->docLine = yyextra->yyLineNr;
- yyextra->current->docFile = yyextra->yyFileName;
- }
-
- yyextra->lastDocContext = YY_START;
- if (yyextra->current_root->section & Entry::SCOPE_MASK)
- {
- yyextra->current->inside = yyextra->current_root->name+"::";
- }
- yyextra->docBlockContext = YY_START;
- yyextra->docBlockInBody = YY_START==SkipCurly;
- yyextra->docBlockAutoBrief = Config_getBool(QT_AUTOBRIEF);
+ yyextra->current->program += yytext ;
+ }
+<Comment>[^ \.\t\r\n\/\*]+ { yyextra->current->program += yytext ; }
+<Comment>"*/" { yyextra->current->program += yytext ;
+ if (!yyextra->insideCode) BEGIN( yyextra->lastContext ) ;
+ }
+<Comment>. { yyextra->current->program += *yytext ; }
+
+<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,SkipC11Inits,SkipC11Attribute,Bases,OldStyleArgs>("//"{B}*)?"/*!" {
+ //printf("Start doc block at %d\n",yyextra->yyLineNr);
+ if (!yyextra->current->doc.isEmpty())
+ {
+ yyextra->current->doc+="\n\n";
+ }
+ else
+ {
+ yyextra->current->docLine = yyextra->yyLineNr;
+ yyextra->current->docFile = yyextra->yyFileName;
+ }
+
+ yyextra->lastDocContext = YY_START;
+ if (yyextra->current_root->section & Entry::SCOPE_MASK)
+ {
+ yyextra->current->inside = yyextra->current_root->name+"::";
+ }
+ yyextra->docBlockContext = YY_START;
+ yyextra->docBlockInBody = YY_START==SkipCurly;
+ yyextra->docBlockAutoBrief = Config_getBool(QT_AUTOBRIEF);
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock=indent;
- if (yyextra->docBlockAutoBrief)
- {
- yyextra->current->briefLine = yyextra->yyLineNr;
- yyextra->current->briefFile = yyextra->yyFileName;
- }
- startCommentBlock(yyscanner,FALSE);
- BEGIN( DocBlock );
- }
+ if (yyextra->docBlockAutoBrief)
+ {
+ yyextra->current->briefLine = yyextra->yyLineNr;
+ yyextra->current->briefFile = yyextra->yyFileName;
+ }
+ startCommentBlock(yyscanner,FALSE);
+ BEGIN( DocBlock );
+ }
<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>"/**"[*]+{BL} {
- bool javadocBanner = Config_getBool(JAVADOC_BANNER);
+ bool javadocBanner = Config_getBool(JAVADOC_BANNER);
lineCount(yyscanner);
- if( javadocBanner )
+ if( javadocBanner )
{
yyextra->lastDocContext = YY_START;
@@ -5943,183 +6035,185 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
else
{
- yyextra->current->program += yytext ;
- yyextra->lastContext = YY_START ;
- BEGIN( Comment ) ;
- }
- }
+ yyextra->current->program += yytext ;
+ yyextra->lastContext = YY_START ;
+ BEGIN( Comment ) ;
+ }
+ }
<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>("//"{B}*)?"/**"/[^/*] {
- yyextra->lastDocContext = YY_START;
+ yyextra->lastDocContext = YY_START;
- //printf("Found comment block at %s:%d\n",yyextra->yyFileName,yyextra->yyLineNr);
- if (yyextra->current_root->section & Entry::SCOPE_MASK)
+ //printf("Found comment block at %s:%d\n",yyextra->yyFileName,yyextra->yyLineNr);
+ if (yyextra->current_root->section & Entry::SCOPE_MASK)
{
- yyextra->current->inside = yyextra->current_root->name+"::";
+ yyextra->current->inside = yyextra->current_root->name+"::";
}
- yyextra->current->docLine = yyextra->yyLineNr;
- yyextra->current->docFile = yyextra->yyFileName;
- yyextra->docBlockContext = YY_START;
- yyextra->docBlockInBody = YY_START==SkipCurly;
+ yyextra->current->docLine = yyextra->yyLineNr;
+ yyextra->current->docFile = yyextra->yyFileName;
+ yyextra->docBlockContext = YY_START;
+ yyextra->docBlockInBody = YY_START==SkipCurly;
bool javadocAutoBrief = Config_getBool(JAVADOC_AUTOBRIEF);
- yyextra->docBlockAutoBrief = javadocAutoBrief;
+ yyextra->docBlockAutoBrief = javadocAutoBrief;
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock=indent;
- if (yyextra->docBlockAutoBrief)
- {
- yyextra->current->briefLine = yyextra->yyLineNr;
- yyextra->current->briefFile = yyextra->yyFileName;
- }
- startCommentBlock(yyscanner,FALSE);
- BEGIN( DocBlock );
- }
-<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"//!" {
- yyextra->lastDocContext = YY_START;
- if (yyextra->current_root->section & Entry::SCOPE_MASK)
+ if (yyextra->docBlockAutoBrief)
+ {
+ yyextra->current->briefLine = yyextra->yyLineNr;
+ yyextra->current->briefFile = yyextra->yyFileName;
+ }
+ startCommentBlock(yyscanner,FALSE);
+ BEGIN( DocBlock );
+ }
+<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"//!" {
+ yyextra->lastDocContext = YY_START;
+ if (yyextra->current_root->section & Entry::SCOPE_MASK)
{
- yyextra->current->inside = yyextra->current_root->name+"::";
+ yyextra->current->inside = yyextra->current_root->name+"::";
}
- yyextra->docBlockContext = YY_START;
- yyextra->docBlockInBody = YY_START==SkipCurly;
- yyextra->docBlockAutoBrief = FALSE;
+ yyextra->docBlockContext = YY_START;
+ yyextra->docBlockInBody = YY_START==SkipCurly;
+ yyextra->docBlockAutoBrief = FALSE;
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock=indent;
- startCommentBlock(yyscanner,yyextra->current->brief.isEmpty());
- BEGIN( DocLine );
- }
-<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"///"/[^/] {
- yyextra->lastDocContext = YY_START;
- if (yyextra->current_root->section & Entry::SCOPE_MASK)
+ startCommentBlock(yyscanner,yyextra->current->brief.isEmpty());
+ BEGIN( DocLine );
+ }
+<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"///"/[^/] {
+ yyextra->lastDocContext = YY_START;
+ if (yyextra->current_root->section & Entry::SCOPE_MASK)
{
- yyextra->current->inside = yyextra->current_root->name+"::";
+ yyextra->current->inside = yyextra->current_root->name+"::";
}
- yyextra->docBlockContext = YY_START;
- yyextra->docBlockInBody = YY_START==SkipCurly;
- yyextra->docBlockAutoBrief = FALSE;
+ yyextra->docBlockContext = YY_START;
+ yyextra->docBlockInBody = YY_START==SkipCurly;
+ yyextra->docBlockAutoBrief = FALSE;
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock=indent;
- startCommentBlock(yyscanner,yyextra->current->brief.isEmpty());
- BEGIN( DocLine );
- }
+ startCommentBlock(yyscanner,yyextra->current->brief.isEmpty());
+ BEGIN( DocLine );
+ }
<FindMembers>"extern"{BN}*"\"C"("++")?"\""{BN}*("{")? {
- lineCount(yyscanner);
- yyextra->externC=TRUE;
- }
-<FindMembers>"{" {
- if (yyextra->externC)
- {
- yyextra->externC=FALSE;
- }
- else if (yyextra->insideCS &&
- !yyextra->current->name.isEmpty() &&
- !yyextra->current->type.isEmpty())
- {
- if (containsWord(yyextra->current->type,"event")) // event
- {
- yyextra->current->mtype = yyextra->mtype = Event;
- }
- else // property
- {
- yyextra->current->mtype = yyextra->mtype = Property;
- }
- yyextra->current->bodyLine = yyextra->yyLineNr;
- yyextra->curlyCount=0;
- BEGIN( CSAccessorDecl );
- }
- else if (yyextra->insideIDL && (yyextra->current->spec & Entry::Attribute))
- {
- // UNO IDL: attributes may have setter and getter
- // exception specifications
- yyextra->current->exception = " {";
- BEGIN(UNOIDLAttributeBlock);
- }
- else
- {
- if ((yyextra->insideJava || yyextra->insideCS || yyextra->insideD) &&
- yyextra->current->name.isEmpty()
- )
- {
- // static Java initializer
- yyextra->needsSemi = FALSE;
- if (yyextra->current->stat)
- {
- yyextra->current->name="[static initializer]";
- yyextra->current->type.resize(0);
- }
- else
- {
- yyextra->current->name="[instance initializer]";
- }
- unput(*yytext);
- BEGIN( Function );
- }
- else
- {
- // pre C++11 code -> ignore the initializer
+ lineCount(yyscanner);
+ yyextra->externC=TRUE;
+ }
+<FindMembers>"{" {
+ if (yyextra->externC)
+ {
+ yyextra->externC=FALSE;
+ }
+ else if (yyextra->insideCS &&
+ !yyextra->current->name.isEmpty() &&
+ !yyextra->current->type.isEmpty())
+ {
+ if (containsWord(yyextra->current->type,"event")) // event
+ {
+ yyextra->current->mtype = yyextra->mtype = Event;
+ }
+ else // property
+ {
+ yyextra->current->mtype = yyextra->mtype = Property;
+ }
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
+ yyextra->curlyCount=0;
+ BEGIN( CSAccessorDecl );
+ }
+ else if (yyextra->insideIDL && (yyextra->current->spec & Entry::Attribute))
+ {
+ // UNO IDL: attributes may have setter and getter
+ // exception specifications
+ yyextra->current->exception = " {";
+ BEGIN(UNOIDLAttributeBlock);
+ }
+ else
+ {
+ if ((yyextra->insideJava || yyextra->insideCS || yyextra->insideD) &&
+ yyextra->current->name.isEmpty()
+ )
+ {
+ // static Java initializer
+ yyextra->needsSemi = FALSE;
+ if (yyextra->current->stat)
+ {
+ yyextra->current->name="[static initializer]";
+ yyextra->current->type.resize(0);
+ }
+ else
+ {
+ yyextra->current->name="[instance initializer]";
+ }
+ unput(*yytext);
+ BEGIN( Function );
+ }
+ else
+ {
+ // pre C++11 code -> ignore the initializer
//yyextra->needsSemi = TRUE;
- //yyextra->current->type.resize(0);
- //yyextra->current->name.resize(0);
- //yyextra->current->args.resize(0);
- //yyextra->current->argList.clear();
- //yyextra->curlyCount=0;
- //BEGIN( SkipCurlyBlock );
+ //yyextra->current->type.resize(0);
+ //yyextra->current->name.resize(0);
+ //yyextra->current->args.resize(0);
+ //yyextra->current->argList.clear();
+ //yyextra->curlyCount=0;
+ //BEGIN( SkipCurlyBlock );
// C++11 style initializer list
- yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyLine = yyextra->yyLineNr;
+ yyextra->current->bodyColumn = yyextra->yyColNr;
yyextra->current->initializer = yytext;
- yyextra->lastInitializerContext = YY_START;
- yyextra->initBracketCount=1;
- BEGIN(ReadInitializer);
- }
- }
- }
-<CSAccessorDecl>"{" { yyextra->curlyCount++; }
-<CSAccessorDecl>"}"{B}*"=" {
- // fall back to next rule if it's not the right bracket
- if (yyextra->curlyCount != 0) REJECT;
- yyextra->current->initializer = "=";
- yyextra->current->endBodyLine=yyextra->yyLineNr;
- yyextra->lastInitializerContext = FindMembers;
- BEGIN(ReadInitializer);
- }
-<CSAccessorDecl>"}" {
- if (yyextra->curlyCount)
- {
- yyextra->curlyCount--;
- }
- else
- {
- yyextra->mtype = Method;
+ yyextra->lastInitializerContext = YY_START;
+ yyextra->initBracketCount=1;
+ BEGIN(ReadInitializer);
+ }
+ }
+ }
+<CSAccessorDecl>"{" { yyextra->curlyCount++; }
+<CSAccessorDecl>"}"{B}*"=" {
+ // fall back to next rule if it's not the right bracket
+ if (yyextra->curlyCount != 0) REJECT;
+ yyextra->current->initializer = "=";
+ yyextra->current->endBodyLine=yyextra->yyLineNr;
+ yyextra->lastInitializerContext = FindMembers;
+ BEGIN(ReadInitializer);
+ }
+<CSAccessorDecl>"}" {
+ if (yyextra->curlyCount)
+ {
+ yyextra->curlyCount--;
+ }
+ else
+ {
+ yyextra->mtype = Method;
yyextra->virt = Normal;
- // not really important, but while we are at it
- yyextra->current->endBodyLine=yyextra->yyLineNr;
+ // not really important, but while we are at it
+ yyextra->current->endBodyLine=yyextra->yyLineNr;
unput(';');
- BEGIN(FindMembers);
- }
- }
-<CSAccessorDecl>"private "{BN}*"set" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::PrivateSettable; }
-<CSAccessorDecl>"protected "{BN}*"set" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::ProtectedSettable; }
-<CSAccessorDecl>"private "{BN}*"get" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::PrivateGettable; }
-<CSAccessorDecl>"protected "{BN}*"get" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::ProtectedGettable; }
-<CSAccessorDecl>"set" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Settable; }
-<CSAccessorDecl>"get" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Gettable; }
-<CSAccessorDecl>"add" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Addable; }
-<CSAccessorDecl>"remove" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Removable; }
-<CSAccessorDecl>"raise" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Raisable; }
-<CSAccessorDecl>"\"" { BEGIN(CSString);}
-<CSAccessorDecl>"." {}
-<CSAccessorDecl>\n { lineCount(yyscanner); }
-<CSString>"\"" { BEGIN(CSAccessorDecl);}
-<CSString>"//" {} // Otherwise the rule <*>"//" will kick in
-<CSString>"/*" {} // Otherwise the rule <*>"/*" will kick in
-<CSString>\n { lineCount(yyscanner); }
-<CSString>"." {}
+ BEGIN(FindMembers);
+ }
+ }
+<CSAccessorDecl>"private "{BN}*"set" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::PrivateSettable; }
+<CSAccessorDecl>"protected "{BN}*"set" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::ProtectedSettable; }
+<CSAccessorDecl>"private "{BN}*"get" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::PrivateGettable; }
+<CSAccessorDecl>"protected "{BN}*"get" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::ProtectedGettable; }
+<CSAccessorDecl>"set" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Settable; }
+<CSAccessorDecl>"get" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Gettable; }
+<CSAccessorDecl>"add" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Addable; }
+<CSAccessorDecl>"remove" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Removable; }
+<CSAccessorDecl>"raise" { if (yyextra->curlyCount==0) yyextra->current->spec |= Entry::Raisable; }
+<CSAccessorDecl>"\"" { BEGIN(CSString);}
+<CSAccessorDecl>"." {}
+<CSAccessorDecl>\n { lineCount(yyscanner); }
+<CSString>"\"" { BEGIN(CSAccessorDecl);}
+<CSString>"//" {} // Otherwise the rule <*>"//" will kick in
+<CSString>"/*" {} // Otherwise the rule <*>"/*" will kick in
+<CSString>\n { lineCount(yyscanner); }
+<CSString>"." {}
/* ---- Slice-specific rules ------ */
@@ -6187,80 +6281,80 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
/* ---- Single line comments ------ */
<DocLine>[^\n]*"\n"[ \t]*"//"[/!][<]? { // continuation of multiline C++-style comment
- yyextra->docBlock+=yytext;
+ yyextra->docBlock+=yytext;
int markerLen = yytext[yyleng-1]=='<' ? 4 : 3;
- yyextra->docBlock.resize(yyextra->docBlock.length() - markerLen);
+ yyextra->docBlock.resize(yyextra->docBlock.length() - markerLen);
lineCount(yyscanner);
}
-<DocLine>{B}*"///"[/]+{B}*/"\n" { // ignore marker line (see bug700345)
- handleCommentBlock(yyscanner,yyextra->docBlock.data(),yyextra->current->brief.isEmpty());
- BEGIN( yyextra->docBlockContext );
- }
-<DocLine>[^\n]*/"\n"{B}*"//"[!/]{B}*{CMD}"}" { // next line is an end group marker, see bug 752712
- yyextra->docBlock+=yytext;
- handleCommentBlock(yyscanner,yyextra->docBlock.data(),yyextra->current->brief.isEmpty());
- BEGIN( yyextra->docBlockContext );
- }
-<DocLine>[^\n]*/"\n" { // whole line
- yyextra->docBlock+=yytext;
- handleCommentBlock(yyscanner,yyextra->docBlock.data(),yyextra->current->brief.isEmpty());
- BEGIN( yyextra->docBlockContext );
- }
+<DocLine>{B}*"///"[/]+{B}*/"\n" { // ignore marker line (see bug700345)
+ handleCommentBlock(yyscanner,yyextra->docBlock.data(),yyextra->current->brief.isEmpty());
+ BEGIN( yyextra->docBlockContext );
+ }
+<DocLine>[^\n]*/"\n"{B}*"//"[!/]{B}*{CMD}"}" { // next line is an end group marker, see bug 752712
+ yyextra->docBlock+=yytext;
+ handleCommentBlock(yyscanner,yyextra->docBlock.data(),yyextra->current->brief.isEmpty());
+ BEGIN( yyextra->docBlockContext );
+ }
+<DocLine>[^\n]*/"\n" { // whole line
+ yyextra->docBlock+=yytext;
+ handleCommentBlock(yyscanner,yyextra->docBlock.data(),yyextra->current->brief.isEmpty());
+ BEGIN( yyextra->docBlockContext );
+ }
/* ---- Comments blocks ------ */
-<DocBlock>"*"*"*/" { // end of comment block
- handleCommentBlock(yyscanner,yyextra->docBlock.data(),FALSE);
- BEGIN(yyextra->docBlockContext);
- }
-<DocBlock>^{B}*"*"+/[^/] {
+<DocBlock>"*"*"*/" { // end of comment block
+ handleCommentBlock(yyscanner,yyextra->docBlock.data(),FALSE);
+ BEGIN(yyextra->docBlockContext);
+ }
+<DocBlock>^{B}*"*"+/[^/] {
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock+=indent;
- }
-<DocBlock>^{B}*("//")?{B}*"*"+/[^//a-z_A-Z0-9*] { // start of a comment line
+ }
+<DocBlock>^{B}*("//")?{B}*"*"+/[^//a-z_A-Z0-9*] { // start of a comment line
QCString indent;
indent.fill(' ',computeIndent(yytext,yyextra->column));
yyextra->docBlock+=indent;
- }
-<DocBlock>^{B}*("//"){B}* { // strip embedded C++ comments if at the start of a line
- }
-<DocBlock>"//" { // slashes in the middle of a comment block
- yyextra->docBlock+=yytext;
- }
-<DocBlock>"/*" { // start of a new comment in the
+ }
+<DocBlock>^{B}*("//"){B}* { // strip embedded C++ comments if at the start of a line
+ }
+<DocBlock>"//" { // slashes in the middle of a comment block
+ yyextra->docBlock+=yytext;
+ }
+<DocBlock>"/*" { // start of a new comment in the
// middle of a comment block
- yyextra->docBlock+=yytext;
- }
+ yyextra->docBlock+=yytext;
+ }
<DocBlock>({CMD}{CMD}){ID}/[^a-z_A-Z0-9] { // escaped command
- yyextra->docBlock+=yytext;
- }
-<DocBlock>{CMD}("f$"|"f["|"f{") {
yyextra->docBlock+=yytext;
- yyextra->docBlockName=&yytext[1];
- if (yyextra->docBlockName.at(1)=='{')
- {
- yyextra->docBlockName.at(1)='}';
- }
+ }
+<DocBlock>{CMD}("f$"|"f["|"f{") {
+ yyextra->docBlock+=yytext;
+ yyextra->docBlockName=&yytext[1];
+ if (yyextra->docBlockName.at(1)=='{')
+ {
+ yyextra->docBlockName.at(1)='}';
+ }
yyextra->fencedSize=0;
yyextra->nestedComment=FALSE;
- BEGIN(DocCopyBlock);
+ BEGIN(DocCopyBlock);
}
-<DocBlock>{B}*"<"{PRE}">" {
+<DocBlock>{B}*"<"{PRE}">" {
yyextra->docBlock+=yytext;
- yyextra->docBlockName="<pre>";
+ yyextra->docBlockName="<pre>";
yyextra->fencedSize=0;
yyextra->nestedComment=FALSE;
- BEGIN(DocCopyBlock);
- }
-<DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!)
+ BEGIN(DocCopyBlock);
+ }
+<DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"rtfonly"|"docbookonly"|"dot"|"code")/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!)
yyextra->docBlock+=yytext;
- yyextra->docBlockName=&yytext[1];
+ yyextra->docBlockName=&yytext[1];
yyextra->fencedSize=0;
yyextra->nestedComment=FALSE;
- BEGIN(DocCopyBlock);
- }
+ BEGIN(DocCopyBlock);
+ }
<DocBlock>^({B}*"*"+)?{B}{0,3}"~~~"[~]* {
QCString pat = substitute(yytext,"*"," ");
@@ -6279,86 +6373,86 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
BEGIN(DocCopyBlock);
}
<DocBlock>{B}*"<code>" {
- if (yyextra->insideCS)
- {
- yyextra->docBlock+=yytext;
- yyextra->docBlockName="<code>";
+ if (yyextra->insideCS)
+ {
+ yyextra->docBlock+=yytext;
+ yyextra->docBlockName="<code>";
yyextra->nestedComment=FALSE;
- BEGIN(DocCopyBlock);
- }
- else
- {
- REJECT;
- }
- }
-<DocBlock>[^@*~\/\\\n]+ { // any character that isn't special
- yyextra->docBlock+=yytext;
- }
-<DocBlock>\n { // newline
+ BEGIN(DocCopyBlock);
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<DocBlock>[^@*~\/\\\n]+ { // any character that isn't special
+ yyextra->docBlock+=yytext;
+ }
+<DocBlock>\n { // newline
lineCount(yyscanner);
- yyextra->docBlock+=*yytext;
- }
-<DocBlock>. { // command block
- yyextra->docBlock+=*yytext;
- }
+ yyextra->docBlock+=*yytext;
+ }
+<DocBlock>. { // command block
+ yyextra->docBlock+=*yytext;
+ }
/* ---- Copy verbatim sections ------ */
-<DocCopyBlock>"</"{PRE}">" { // end of a <pre> block
- yyextra->docBlock+=yytext;
- if (yyextra->docBlockName=="<pre>")
- {
- BEGIN(DocBlock);
- }
- }
-<DocCopyBlock>"</"{CODE}">" { // end of a <code> block
- yyextra->docBlock+=yytext;
- if (yyextra->docBlockName=="<code>")
- {
- BEGIN(DocBlock);
- }
- }
+<DocCopyBlock>"</"{PRE}">" { // end of a <pre> block
+ yyextra->docBlock+=yytext;
+ if (yyextra->docBlockName=="<pre>")
+ {
+ BEGIN(DocBlock);
+ }
+ }
+<DocCopyBlock>"</"{CODE}">" { // end of a <code> block
+ yyextra->docBlock+=yytext;
+ if (yyextra->docBlockName=="<code>")
+ {
+ BEGIN(DocBlock);
+ }
+ }
<DocCopyBlock>[\\@]("f$"|"f]"|"f}") {
- yyextra->docBlock+=yytext;
- BEGIN(DocBlock);
- }
-<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block
- yyextra->docBlock+=yytext;
- if (&yytext[4]==yyextra->docBlockName)
- {
- BEGIN(DocBlock);
- }
- }
-<DocCopyBlock>^{B}*"*"+/{BN}+ { // start of a comment line
- if (yyextra->docBlockName=="verbatim")
- {
- REJECT;
- }
- else if (yyextra->docBlockName=="code")
- {
- REJECT;
- }
+ yyextra->docBlock+=yytext;
+ BEGIN(DocBlock);
+ }
+<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"endrtfonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block
+ yyextra->docBlock+=yytext;
+ if (&yytext[4]==yyextra->docBlockName)
+ {
+ BEGIN(DocBlock);
+ }
+ }
+<DocCopyBlock>^{B}*"*"+/{BN}+ { // start of a comment line
+ if (yyextra->docBlockName=="verbatim")
+ {
+ REJECT;
+ }
+ else if (yyextra->docBlockName=="code")
+ {
+ REJECT;
+ }
else
{
QCString indent;
indent.fill(' ',computeIndent(yytext,0));
yyextra->docBlock+=indent;
}
- }
-<DocCopyBlock>^{B}*"*"+/{B}+"*"{BN}* { // start of a comment line with two *'s
- if (yyextra->docBlockName=="code")
+ }
+<DocCopyBlock>^{B}*"*"+/{B}+"*"{BN}* { // start of a comment line with two *'s
+ if (yyextra->docBlockName=="code")
{
QCString indent;
indent.fill(' ',computeIndent(yytext,0));
yyextra->docBlock+=indent;
}
else
- {
- REJECT;
- }
- }
-<DocCopyBlock>^{B}*"*"+/({ID}|"(") { // Assume *var or *(... is part of source code (see bug723516)
- if (yyextra->docBlockName=="code")
+ {
+ REJECT;
+ }
+ }
+<DocCopyBlock>^{B}*"*"+/({ID}|"(") { // Assume *var or *(... is part of source code (see bug723516)
+ if (yyextra->docBlockName=="code")
{
QCString indent;
indent.fill(' ',computeIndent(yytext,-1));
@@ -6369,8 +6463,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
REJECT;
}
}
-<DocCopyBlock>^{B}*"*"+/{BN}* { // start of a comment line with one *
- if (yyextra->docBlockName=="code")
+<DocCopyBlock>^{B}*"*"+/{BN}* { // start of a comment line with one *
+ if (yyextra->docBlockName=="code")
{
QCString indent;
if (yyextra->nestedComment) // keep * it is part of the code
@@ -6385,10 +6479,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
}
else
- {
- REJECT;
- }
- }
+ {
+ REJECT;
+ }
+ }
<DocCopyBlock>^({B}*"*"+)?{B}{0,3}"~~~"[~]* {
QCString pat = substitute(yytext,"*"," ");
yyextra->docBlock+=pat;
@@ -6405,10 +6499,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
BEGIN(DocBlock);
}
}
-<DocCopyBlock>[^\<@/*\]~\$\\\n]+ { // any character that is not special
- yyextra->docBlock+=yytext;
- }
-<DocCopyBlock>"/*"|"*/"|"//" {
+<DocCopyBlock>[^\<@/*\]~\$\\\n]+ { // any character that is not special
+ yyextra->docBlock+=yytext;
+ }
+<DocCopyBlock>"/*"|"*/"|"//" {
if (yytext[1]=='*')
{
yyextra->nestedComment=TRUE;
@@ -6417,110 +6511,117 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
{
yyextra->nestedComment=FALSE;
}
- yyextra->docBlock+=yytext;
- }
-<DocCopyBlock>\n { // newline
- yyextra->docBlock+=*yytext;
+ yyextra->docBlock+=yytext;
+ }
+<DocCopyBlock>\n { // newline
+ yyextra->docBlock+=*yytext;
lineCount(yyscanner);
- }
-<DocCopyBlock>. { // any other character
- yyextra->docBlock+=*yytext;
- }
-<DocCopyBlock><<EOF>> {
- warn(yyextra->yyFileName,yyextra->yyLineNr,
- "reached end of file while inside a '%s' block!\n"
- "The command that should end the block seems to be missing!\n",
- yyextra->docBlockName.data());
- yyterminate();
- }
+ }
+<DocCopyBlock>. { // any other character
+ yyextra->docBlock+=*yytext;
+ }
+<DocCopyBlock><<EOF>> {
+ warn(yyextra->yyFileName,yyextra->yyLineNr,
+ "reached end of file while inside a '%s' block!\n"
+ "The command that should end the block seems to be missing!\n",
+ yyextra->docBlockName.data());
+ yyterminate();
+ }
/* ------------- Prototype parser -------------- */
-<Prototype>"operator"{B}*"("{B}*")" {
- yyextra->current->name+=yytext;
- }
-<Prototype>"(" {
- yyextra->current->args+=*yytext;
- yyextra->currentArgumentContext = PrototypeQual;
- yyextra->fullArgString = yyextra->current->args.copy();
- yyextra->copyArgString = &yyextra->current->args;
- BEGIN( ReadFuncArgType ) ;
- }
-<Prototype>"("({ID}"::")*({B}*[&*])+ {
- yyextra->current->type+=yyextra->current->name+yytext;
- yyextra->current->name.resize(0);
- BEGIN( PrototypePtr );
- }
-<PrototypePtr>{SCOPENAME} {
- yyextra->current->name+=yytext;
- }
-<PrototypePtr>"(" {
- yyextra->current->args+=*yytext;
- yyextra->currentArgumentContext = PrototypeQual;
- yyextra->fullArgString = yyextra->current->args.copy();
- yyextra->copyArgString = &yyextra->current->args;
- BEGIN( ReadFuncArgType ) ;
- }
-<PrototypePtr>")" {
- yyextra->current->type+=')';
- BEGIN( Prototype );
- }
-<PrototypePtr>. {
- yyextra->current->name+=yytext;
- }
-<PrototypeQual>"{" {
- BEGIN( PrototypeSkipLine);
- }
-<PrototypeQual>{B}*"const"{B}* {
- yyextra->current->args += " const ";
- yyextra->current->argList.constSpecifier=TRUE;
- }
-<PrototypeQual>{B}*"volatile"{B}* {
- yyextra->current->args += " volatile ";
- yyextra->current->argList.volatileSpecifier=TRUE;
- }
-<PrototypeQual>{B}*"="{B}*"0"{B}* {
- yyextra->current->args += " = 0";
- yyextra->current->virt = Pure;
- yyextra->current->argList.pureSpecifier=TRUE;
- }
-<PrototypeQual>"throw"{B}*"(" {
- yyextra->current->exception = "throw(";
- BEGIN(PrototypeExc);
- }
-<PrototypeExc>")" {
- yyextra->current->exception += ')';
- BEGIN(PrototypeQual);
- }
-<PrototypeExc>. {
- yyextra->current->exception += *yytext;
- }
-<PrototypeQual>. {
- yyextra->current->args += *yytext;
- }
-<Prototype>. {
- yyextra->current->name += *yytext;
- }
-<PrototypeSkipLine>. {
- }
-
-
-
-
-<SkipCxxComment>.*"\\\n" { // line continuation
- if (yyextra->insideCS)
- {
- REJECT;
- }
- else
- {
+<Prototype>"operator"{B}*"("{B}*")" {
+ yyextra->current->name+=yytext;
+ }
+<Prototype>"(" {
+ yyextra->current->args+=*yytext;
+ yyextra->currentArgumentContext = PrototypeQual;
+ yyextra->fullArgString = yyextra->current->args.copy();
+ yyextra->copyArgString = &yyextra->current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+<Prototype>"("({ID}"::")*({B}*[&*])+ {
+ if (yyextra->insidePHP) // reference parameter
+ {
+ REJECT;
+ }
+ else
+ {
+ yyextra->current->type+=yyextra->current->name+yytext;
+ yyextra->current->name.resize(0);
+ BEGIN( PrototypePtr );
+ }
+ }
+<PrototypePtr>{SCOPENAME} {
+ yyextra->current->name+=yytext;
+ }
+<PrototypePtr>"(" {
+ yyextra->current->args+=*yytext;
+ yyextra->currentArgumentContext = PrototypeQual;
+ yyextra->fullArgString = yyextra->current->args.copy();
+ yyextra->copyArgString = &yyextra->current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+<PrototypePtr>")" {
+ yyextra->current->type+=')';
+ BEGIN( Prototype );
+ }
+<PrototypePtr>. {
+ yyextra->current->name+=yytext;
+ }
+<PrototypeQual>"{" {
+ BEGIN( PrototypeSkipLine);
+ }
+<PrototypeQual>{B}*"const"{B}* {
+ yyextra->current->args += " const ";
+ yyextra->current->argList.setConstSpecifier(TRUE);
+ }
+<PrototypeQual>{B}*"volatile"{B}* {
+ yyextra->current->args += " volatile ";
+ yyextra->current->argList.setVolatileSpecifier(TRUE);
+ }
+<PrototypeQual>{B}*"="{B}*"0"{B}* {
+ yyextra->current->args += " = 0";
+ yyextra->current->virt = Pure;
+ yyextra->current->argList.setPureSpecifier(TRUE);
+ }
+<PrototypeQual>"throw"{B}*"(" {
+ yyextra->current->exception = "throw(";
+ BEGIN(PrototypeExc);
+ }
+<PrototypeExc>")" {
+ yyextra->current->exception += ')';
+ BEGIN(PrototypeQual);
+ }
+<PrototypeExc>. {
+ yyextra->current->exception += *yytext;
+ }
+<PrototypeQual>. {
+ yyextra->current->args += *yytext;
+ }
+<Prototype>. {
+ yyextra->current->name += *yytext;
+ }
+<PrototypeSkipLine>. {
+ }
+
+
+
+
+<SkipCxxComment>.*"\\\n" { // line continuation
+ if (yyextra->insideCS)
+ {
+ REJECT;
+ }
+ else
+ {
lineCount(yyscanner);
- }
- }
-<SkipCxxComment>.*/\n {
- BEGIN( yyextra->lastCContext ) ;
- }
+ }
+ }
+<SkipCxxComment>.*/\n {
+ BEGIN( yyextra->lastCContext ) ;
+ }
<SkipComment>[^\*\n]+
/* ------------ Generic rules -------------- */
@@ -6532,66 +6633,66 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
BEGIN( SkipC11Attribute );
}
-<*>\n { lineCount(yyscanner); }
-<*>\" {
- if (yyextra->insideIDL && yyextra->insideCppQuote)
- {
- BEGIN(EndCppQuote);
- }
- }
-<*>"#" {
- if (!yyextra->insidePHP)
- REJECT;
- yyextra->lastCContext = YY_START ;
- BEGIN( SkipCxxComment ) ;
- }
-<*>\' {
- if (yyextra->insidePHP)
- {
- yyextra->lastStringContext=YY_START;
- BEGIN(SkipPHPString);
- }
- }
-<*>\" {
- if (yyextra->insidePHP)
- {
- yyextra->lastStringContext=YY_START;
- BEGIN(SkipString);
- }
- }
+<*>\n { lineCount(yyscanner); }
+<*>\" {
+ if (yyextra->insideIDL && yyextra->insideCppQuote)
+ {
+ BEGIN(EndCppQuote);
+ }
+ }
+<*>"#" {
+ if (!yyextra->insidePHP)
+ REJECT;
+ yyextra->lastCContext = YY_START ;
+ BEGIN( SkipCxxComment ) ;
+ }
+<*>\' {
+ if (yyextra->insidePHP)
+ {
+ yyextra->lastStringContext=YY_START;
+ BEGIN(SkipPHPString);
+ }
+ }
+<*>\" {
+ if (yyextra->insidePHP)
+ {
+ yyextra->lastStringContext=YY_START;
+ BEGIN(SkipString);
+ }
+ }
<*>\? {
- if (yyextra->insideCS && (YY_START != SkipRound))
- {
- if (yyextra->current->type.isEmpty())
- {
- if (yyextra->current->name.isEmpty())
- yyextra->current->name="?";
- else
- yyextra->current->name+="?";
- }
- else
- {
- yyextra->current->type+="?";
- }
- }
- }
+ if (yyextra->insideCS && (YY_START != SkipRound))
+ {
+ if (yyextra->current->type.isEmpty())
+ {
+ if (yyextra->current->name.isEmpty())
+ yyextra->current->name="?";
+ else
+ yyextra->current->name+="?";
+ }
+ else
+ {
+ yyextra->current->type+="?";
+ }
+ }
+ }
<*>.
<SkipComment>"//"|"/*"
-<*>"/*" { yyextra->lastCContext = YY_START ;
- BEGIN( SkipComment ) ;
- }
-<SkipComment>{B}*"*/" { BEGIN( yyextra->lastCContext ) ; }
-<*>"//" {
- yyextra->lastCContext = YY_START ;
- BEGIN( SkipCxxComment ) ;
- }
+<*>"/*" { yyextra->lastCContext = YY_START ;
+ BEGIN( SkipComment ) ;
+ }
+<SkipComment>{B}*"*/" { BEGIN( yyextra->lastCContext ) ; }
+<*>"//" {
+ yyextra->lastCContext = YY_START ;
+ BEGIN( SkipCxxComment ) ;
+ }
%%
//----------------------------------------------------------------------------
-static int yyread(yyscan_t yyscanner,char *buf,int max_size)
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- int c=0;
+ yy_size_t c=0;
while( c < max_size && yyextra->inputString[yyextra->inputPosition] )
{
*buf = yyextra->inputString[yyextra->inputPosition++] ;
@@ -6617,9 +6718,7 @@ static void initParser(yyscan_t yyscanner)
yyextra->virt = Normal;
yyextra->baseVirt = Normal;
yyextra->isTypedef = FALSE;
- yyextra->autoGroupStack.clear();
yyextra->insideTryBlock = FALSE;
- yyextra->autoGroupStack.setAutoDelete(TRUE);
yyextra->insideFormula = FALSE;
yyextra->insideCode=FALSE;
yyextra->insideCli=Config_getBool(CPP_CLI_SUPPORT);
@@ -6631,7 +6730,7 @@ static void initParser(yyscan_t yyscanner)
static void initEntry(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (yyextra->insideJava)
+ if (yyextra->insideJava)
{
yyextra->protection = (yyextra->current_root->spec & (Entry::Interface|Entry::Enum)) ? Public : Package;
}
@@ -6641,7 +6740,7 @@ static void initEntry(yyscan_t yyscanner)
yyextra->current->stat = yyextra->stat;
yyextra->current->lang = yyextra->language;
//printf("*** initEntry(yyscanner) yyextra->language=%d\n",yyextra->language);
- Doxygen::docGroup.initGroupInfo(yyextra->current.get());
+ yyextra->commentScanner.initGroupInfo(yyextra->current.get());
yyextra->isTypedef=FALSE;
}
@@ -6655,15 +6754,15 @@ static void lineCount(yyscan_t yyscanner)
const char *p;
for (p = yytext ; *p ; ++p )
{
- if (*p=='\n')
+ if (*p=='\n')
{
yyextra->yyLineNr++,yyextra->column=0,yyextra->yyColNr=1;
}
- else if (*p=='\t')
+ else if (*p=='\t')
{
yyextra->column+=tabSize - (yyextra->column%tabSize);
}
- else
+ else
{
yyextra->column++,yyextra->yyColNr++;
}
@@ -6690,14 +6789,14 @@ static void addType(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
uint tl=yyextra->current->type.length();
- if( tl>0 && !yyextra->current->name.isEmpty() && yyextra->current->type.at(tl-1)!='.')
+ if( tl>0 && !yyextra->current->name.isEmpty() && yyextra->current->type.at(tl-1)!='.')
{
yyextra->current->type += ' ' ;
}
yyextra->current->type += yyextra->current->name ;
yyextra->current->name.resize(0) ;
tl=yyextra->current->type.length();
- if( tl>0 && !yyextra->current->args.isEmpty() && yyextra->current->type.at(tl-1)!='.')
+ if( tl>0 && !yyextra->current->args.isEmpty() && yyextra->current->type.at(tl-1)!='.')
{
yyextra->current->type += ' ' ;
}
@@ -6738,7 +6837,7 @@ static void setContext(yyscan_t yyscanner)
yyextra->language = getLanguageFromFileName(yyextra->yyFileName);
yyextra->insideIDL = yyextra->language==SrcLangExt_IDL;
yyextra->insideJava = yyextra->language==SrcLangExt_Java;
- yyextra->insideCS = yyextra->language==SrcLangExt_CSharp;
+ yyextra->insideCS = yyextra->language==SrcLangExt_CSharp;
yyextra->insideD = yyextra->language==SrcLangExt_D;
yyextra->insidePHP = yyextra->language==SrcLangExt_PHP;
yyextra->insideObjC = yyextra->language==SrcLangExt_ObjC;
@@ -6748,7 +6847,7 @@ static void setContext(yyscan_t yyscanner)
//printf("setContext(%s) yyextra->insideIDL=%d yyextra->insideJava=%d yyextra->insideCS=%d "
// "yyextra->insideD=%d yyextra->insidePHP=%d yyextra->insideObjC=%d\n",
// yyextra->yyFileName.data(),yyextra->insideIDL,yyextra->insideJava,yyextra->insideCS,yyextra->insideD,yyextra->insidePHP,yyextra->insideObjC
- // );
+ // );
}
//-----------------------------------------------------------------------------
@@ -6795,7 +6894,7 @@ static void splitKnRArg(yyscan_t yyscanner,QCString &oldStyleArgPtr,QCString &ol
{
static QRegExp re("([^)]*)");
int bi1 = yyextra->current->args.findRev(re);
- int bi2 = bi1!=-1 ? yyextra->current->args.findRev(re,bi1-1) : -1;
+ int bi2 = bi1!=-1 ? yyextra->current->args.findRev(re,bi1-1) : -1;
char c;
if (bi1!=-1 && bi2!=-1) // found something like "int (*func)(int arg)"
{
@@ -6824,7 +6923,6 @@ static void splitKnRArg(yyscan_t yyscanner,QCString &oldStyleArgPtr,QCString &ol
else // normal "int *var"
{
int l=si,i=l-1,j;
- char c;
// look for start of name in "type *name"
while (i>=0 && isId(yyextra->current->args.at(i))) i--;
j=i+1;
@@ -6833,13 +6931,13 @@ static void splitKnRArg(yyscan_t yyscanner,QCString &oldStyleArgPtr,QCString &ol
i++;
if (i!=l)
{
- yyextra->oldStyleArgType=yyextra->current->args.left(i);
- oldStyleArgPtr=yyextra->current->args.mid(i,j-i);
- oldStyleArgName=yyextra->current->args.mid(j).stripWhiteSpace();
+ yyextra->oldStyleArgType=yyextra->current->args.left(i);
+ oldStyleArgPtr=yyextra->current->args.mid(i,j-i);
+ oldStyleArgName=yyextra->current->args.mid(j).stripWhiteSpace();
}
else
{
- oldStyleArgName=yyextra->current->args.copy().stripWhiteSpace();
+ oldStyleArgName=yyextra->current->args.copy().stripWhiteSpace();
}
}
}
@@ -6877,7 +6975,7 @@ static void addKnRArgInfo(yyscan_t yyscanner,const QCString &type,const QCString
a.type=type.stripWhiteSpace();
if (a.type.left(9)=="register ") // strip keyword
{
- a.type=a.type.mid(9);
+ a.type=a.type.mid(9);
}
a.name=name.stripWhiteSpace();
if (!brief.isEmpty() && !docs.isEmpty())
@@ -6890,7 +6988,7 @@ static void addKnRArgInfo(yyscan_t yyscanner,const QCString &type,const QCString
}
else
{
- a.docs=docs;
+ a.docs=docs;
}
}
}
@@ -6926,15 +7024,15 @@ static void startCommentBlock(yyscan_t yyscanner,bool brief)
yyextra->current->docLine = yyextra->yyLineNr;
}
}
-
+
//----------------------------------------------------------------------------
static void newEntry(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- if (yyextra->tempEntry==0) // if temp entry is not 0, it holds yyextra->current,
- // and yyextra->current is actually replaced by yyextra->previous which was
- // already added to yyextra->current_root, so we should not add it again
+ if (yyextra->tempEntry==0) // if temp entry is not 0, it holds yyextra->current,
+ // and yyextra->current is actually replaced by yyextra->previous which was
+ // already added to yyextra->current_root, so we should not add it again
// (see bug723314)
{
yyextra->previous = yyextra->current;
@@ -6967,24 +7065,27 @@ static void handleCommentBlock(yyscan_t yyscanner,const QCString &doc,bool brief
int position=0;
bool needsEntry=FALSE;
- QCString processedDoc = processMarkdownForCommentBlock(stripIndentation(doc),yyextra->yyFileName,lineNr);
+ Markdown markdown(yyextra->yyFileName,lineNr);
+ QCString strippedDoc = stripIndentation(doc);
+ QCString processedDoc = Config_getBool(MARKDOWN_SUPPORT) ? markdown.process(strippedDoc,lineNr) : strippedDoc;
while (yyextra->commentScanner.parseCommentBlock(
- yyextra->thisParser,
- yyextra->docBlockInBody && yyextra->previous ? yyextra->previous.get() : yyextra->current.get(),
- processedDoc, // text
- yyextra->yyFileName, // file
- lineNr, // line of block start
- yyextra->docBlockInBody ? FALSE : brief, // isBrief
- yyextra->docBlockInBody ? FALSE : yyextra->docBlockAutoBrief, // isJavaDocStyle
- yyextra->docBlockInBody, // isInBody
- yyextra->protection,
+ yyextra->thisParser,
+ yyextra->docBlockInBody && yyextra->previous ? yyextra->previous.get() : yyextra->current.get(),
+ processedDoc, // text
+ yyextra->yyFileName, // file
+ lineNr, // line of block start
+ yyextra->docBlockInBody ? FALSE : brief, // isBrief
+ yyextra->docBlockInBody ? FALSE : yyextra->docBlockAutoBrief, // isJavaDocStyle
+ yyextra->docBlockInBody, // isInBody
+ yyextra->protection,
position,
- needsEntry
+ needsEntry,
+ Config_getBool(MARKDOWN_SUPPORT)
)
)
{
//printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position);
- if (needsEntry)
+ if (needsEntry)
{
QCString docFile = yyextra->current->docFile;
newEntry(yyscanner);
@@ -7028,26 +7129,27 @@ static void handleParametersCommentBlocks(yyscan_t yyscanner,ArgumentList &al)
//printf("handleParametersCommentBlock [%s]\n",doc.data());
while (yyextra->commentScanner.parseCommentBlock(
- yyextra->thisParser,
- yyextra->current.get(),
- a.docs, // text
- yyextra->yyFileName, // file
- yyextra->current->docLine, // line of block start
- FALSE,
- FALSE,
- FALSE,
- yyextra->protection,
- position,
- needsEntry
- )
- )
+ yyextra->thisParser,
+ yyextra->current.get(),
+ a.docs, // text
+ yyextra->yyFileName, // file
+ yyextra->current->docLine, // line of block start
+ FALSE,
+ FALSE,
+ FALSE,
+ yyextra->protection,
+ position,
+ needsEntry,
+ Config_getBool(MARKDOWN_SUPPORT)
+ )
+ )
{
- //printf("handleParametersCommentBlock position=%d [%s]\n",position,doc.data()+position);
- if (needsEntry) newEntry(yyscanner);
+ //printf("handleParametersCommentBlock position=%d [%s]\n",position,doc.data()+position);
+ if (needsEntry) newEntry(yyscanner);
}
if (needsEntry)
{
- newEntry(yyscanner);
+ newEntry(yyscanner);
}
a.docs = yyextra->current->doc;
@@ -7080,14 +7182,14 @@ static void parseCompounds(yyscan_t yyscanner,const std::shared_ptr<Entry> &rt)
yyextra->inputString = ce->program;
yyextra->inputPosition = 0;
if (ce->section==Entry::ENUM_SEC || (ce->spec&Entry::Enum))
- BEGIN( FindFields ) ;
+ BEGIN( FindFields ) ;
else
- BEGIN( FindMembers ) ;
+ BEGIN( FindMembers ) ;
yyextra->current_root = ce;
yyextra->yyFileName = ce->fileName;
//setContext();
- yyextra->yyLineNr = ce->startLine ;
- yyextra->yyColNr = ce->startColumn ;
+ yyextra->yyLineNr = ce->bodyLine;
+ yyextra->yyColNr = ce->bodyColumn;
yyextra->insideObjC = ce->lang==SrcLangExt_ObjC;
//printf("---> Inner block starts at line %d objC=%d\n",yyextra->yyLineNr,yyextra->insideObjC);
yyextra->current = std::make_shared<Entry>();
@@ -7106,44 +7208,44 @@ static void parseCompounds(yyscan_t yyscanner,const std::shared_ptr<Entry> &rt)
if( ce->section==Entry::CLASS_SEC ) // class
{
if (yyextra->insidePHP || yyextra->insideD || yyextra->insideJS || yyextra->insideIDL || yyextra->insideSlice)
- {
- yyextra->current->protection = yyextra->protection = Public ;
- }
- else if (yyextra->insideJava)
- {
+ {
+ yyextra->current->protection = yyextra->protection = Public ;
+ }
+ else if (yyextra->insideJava)
+ {
yyextra->current->protection = yyextra->protection = (ce->spec & (Entry::Interface|Entry::Enum)) ? Public : Package;
- }
- else if (ce->spec&(Entry::Interface | Entry::Ref | Entry::Value | Entry::Struct | Entry::Union))
- {
- if (ce->lang==SrcLangExt_ObjC)
- {
- yyextra->current->protection = yyextra->protection = Protected ;
- }
- else
- {
- yyextra->current->protection = yyextra->protection = Public ;
- }
- }
- else
- {
+ }
+ else if (ce->spec&(Entry::Interface | Entry::Ref | Entry::Value | Entry::Struct | Entry::Union))
+ {
+ if (ce->lang==SrcLangExt_ObjC)
+ {
+ yyextra->current->protection = yyextra->protection = Protected ;
+ }
+ else
+ {
+ yyextra->current->protection = yyextra->protection = Public ;
+ }
+ }
+ else
+ {
yyextra->current->protection = yyextra->protection = Private ;
- }
+ }
}
else if (ce->section == Entry::ENUM_SEC ) // enum
{
- yyextra->current->protection = yyextra->protection = ce->protection;
+ yyextra->current->protection = yyextra->protection = ce->protection;
}
else if (!ce->name.isEmpty() && ce->name.at(ni)=='@') // unnamed union or namespace
{
- if (ce->section == Entry::NAMESPACE_SEC ) // unnamed namespace
- {
+ if (ce->section == Entry::NAMESPACE_SEC ) // unnamed namespace
+ {
yyextra->current->stat = yyextra->stat = TRUE;
- }
- yyextra->current->protection = yyextra->protection = ce->protection;
+ }
+ yyextra->current->protection = yyextra->protection = ce->protection;
}
else // named struct, union, protocol, category
{
- yyextra->current->protection = yyextra->protection = Public ;
+ yyextra->current->protection = yyextra->protection = Public ;
}
yyextra->mtype = Method;
yyextra->virt = Normal;
@@ -7153,20 +7255,20 @@ static void parseCompounds(yyscan_t yyscanner,const std::shared_ptr<Entry> &rt)
//memberGroupRelates.resize(0);
//memberGroupInside.resize(0);
QCString name = ce->name;
- Doxygen::docGroup.enterCompound(yyextra->yyFileName,yyextra->yyLineNr,name);
-
+ yyextra->commentScanner.enterCompound(yyextra->yyFileName,yyextra->yyLineNr,name);
+
scannerYYlex(yyscanner);
yyextra->lexInit=TRUE;
//forceEndGroup();
- Doxygen::docGroup.leaveCompound(yyextra->yyFileName,yyextra->yyLineNr,name);
-
+ yyextra->commentScanner.leaveCompound(yyextra->yyFileName,yyextra->yyLineNr,name);
+
ce->program.resize(0);
//if (depthIf>0)
//{
- // warn(yyextra->yyFileName,yyextra->yyLineNr,"Documentation block ended in the middle of a conditional section!");
+ // warn(yyextra->yyFileName,yyextra->yyLineNr,"Documentation block ended in the middle of a conditional section!");
//}
}
parseCompounds(yyscanner,ce);
@@ -7179,8 +7281,7 @@ static void parseMain(yyscan_t yyscanner,
const char *fileName,
const char *fileBuf,
const std::shared_ptr<Entry> &rt,
- bool sameTranslationUnit,
- QStrList & filesInSameTranslationUnit)
+ ClangTUParser *clangParser)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
initParser(yyscanner);
@@ -7190,7 +7291,6 @@ static void parseMain(yyscan_t yyscanner,
yyextra->column = 0;
scannerYYrestart(0,yyscanner);
- //yyextra->anonCount = 0; // don't reset per file
//depthIf = 0;
yyextra->protection = Public;
yyextra->mtype = Method;
@@ -7201,25 +7301,14 @@ static void parseMain(yyscan_t yyscanner,
yyextra->yyBegLineNr = 1;
yyextra->yyBegColNr = 0;
yyextra->yyFileName = fileName;
+ yyextra->clangParser = clangParser;
setContext(yyscanner);
- bool processWithClang = yyextra->insideCpp || yyextra->insideObjC;
- if (processWithClang)
- {
- if (!sameTranslationUnit) // new file
- {
- ClangParser::instance()->start(fileName,filesInSameTranslationUnit);
- }
- else
- {
- ClangParser::instance()->switchToFile(fileName);
- }
- }
rt->lang = yyextra->language;
msg("Parsing file %s...\n",yyextra->yyFileName.data());
yyextra->current_root = rt;
initParser(yyscanner);
- Doxygen::docGroup.enterFile(yyextra->yyFileName,yyextra->yyLineNr);
+ yyextra->commentScanner.enterFile(yyextra->yyFileName,yyextra->yyLineNr);
yyextra->current = std::make_shared<Entry>();
//printf("yyextra->current=%p yyextra->current_root=%p\n",yyextra->current,yyextra->current_root);
int sec=guessSection(yyextra->yyFileName);
@@ -7249,13 +7338,13 @@ static void parseMain(yyscan_t yyscanner,
}
//forceEndGroup();
- Doxygen::docGroup.leaveFile(yyextra->yyFileName,yyextra->yyLineNr);
+ yyextra->commentScanner.leaveFile(yyextra->yyFileName,yyextra->yyLineNr);
rt->program.resize(0);
parseCompounds(yyscanner,rt);
- yyextra->anonNSCount++;
+ anonNSCount++;
// add additional entries that were created during processing
for (auto &kv: yyextra->outerScopeEntries)
@@ -7273,7 +7362,7 @@ static void parsePrototype(yyscan_t yyscanner,const QCString &text)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//printf("**** parsePrototype(%s) begin\n",text.data());
- if (text.isEmpty())
+ if (text.isEmpty())
{
warn(yyextra->yyFileName,yyextra->yyLineNr,"Empty prototype found!");
return;
@@ -7286,11 +7375,11 @@ static void parsePrototype(yyscan_t yyscanner,const QCString &text)
const char *orgInputString;
int orgInputPosition;
YY_BUFFER_STATE orgState;
-
+
// save scanner state
orgState = YY_CURRENT_BUFFER;
yy_switch_to_buffer(yy_create_buffer(0, YY_BUF_SIZE, yyscanner), yyscanner);
- orgInputString = yyextra->inputString;
+ orgInputString = yyextra->inputString;
orgInputPosition = yyextra->inputPosition;
// set new string
@@ -7310,7 +7399,7 @@ static void parsePrototype(yyscan_t yyscanner,const QCString &text)
YY_BUFFER_STATE tmpState = YY_CURRENT_BUFFER;
yy_switch_to_buffer(orgState, yyscanner);
yy_delete_buffer(tmpState, yyscanner);
- yyextra->inputString = orgInputString;
+ yyextra->inputString = orgInputString;
yyextra->inputPosition = orgInputPosition;
@@ -7350,33 +7439,17 @@ COutlineParser::~COutlineParser()
scannerYYlex_destroy(p->yyscanner);
}
-void COutlineParser::startTranslationUnit(const char *)
-{
-}
-
-void COutlineParser::finishTranslationUnit()
-{
- struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
- bool processWithClang = yyextra->insideCpp || yyextra->insideObjC;
- if (processWithClang)
- {
- ClangParser::instance()->finish();
- }
-}
-
void COutlineParser::parseInput(const char *fileName,
const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool sameTranslationUnit,
- QStrList & filesInSameTranslationUnit)
+ ClangTUParser *clangParser)
{
struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
yyextra->thisParser = this;
printlex(yy_flex_debug, TRUE, __FILE__, fileName);
- ::parseMain(p->yyscanner, fileName,fileBuf,root,
- sameTranslationUnit,filesInSameTranslationUnit);
+ ::parseMain(p->yyscanner,fileName,fileBuf,root,clangParser);
printlex(yy_flex_debug, FALSE, __FILE__, fileName);
}
@@ -7387,7 +7460,7 @@ bool COutlineParser::needsPreprocessing(const QCString &extension) const
QCString fe=extension.lower();
SrcLangExt lang = getLanguageFromFileName(extension);
return (SrcLangExt_Cpp == lang) ||
- !( fe==".java" || fe==".as" || fe==".d" || fe==".php" ||
+ !( fe==".java" || fe==".as" || fe==".d" || fe==".php" ||
fe==".php4" || fe==".inc" || fe==".phtml"|| fe==".php5"
);
}
@@ -7399,4 +7472,6 @@ void COutlineParser::parsePrototype(const char *text)
//----------------------------------------------------------------------------
+#if USE_STATE2STRING
#include "scanner.l.h"
+#endif
diff --git a/src/scopedtypevariant.h b/src/scopedtypevariant.h
new file mode 100644
index 0000000..d544434
--- /dev/null
+++ b/src/scopedtypevariant.h
@@ -0,0 +1,292 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SCOPEDTYPEVARIANT_H
+#define SCOPEDTYPEVARIANT_H
+
+#include <utility>
+#include <vector>
+#include <qcstring.h>
+#include "definition.h"
+
+//! Class representing a local class definition found while
+//! generating syntax highlighted code.
+class LocalDef
+{
+ public:
+ void insertBaseClass(const QCString &name) { m_baseClasses.push_back(name); }
+ std::vector<QCString> baseClasses() const { return m_baseClasses; }
+ private:
+ std::vector<QCString> m_baseClasses;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! Variant class for a scoped type.
+ *
+ * Variants:
+ * - Dummy: a type used for hiding a global type.
+ * - Local: a locally defined type (e.g. found inside a function)
+ * - Global: a globally defined type (processed by doxygen in an earlier pass).
+ */
+class ScopedTypeVariant
+{
+ public:
+ //! possible variant types
+ enum Variant
+ {
+ Global,
+ Local,
+ Dummy
+ };
+ //! default constructor for creating a variant of type Dummy
+ ScopedTypeVariant() : m_variant(Dummy)
+ {
+ m_u.globalDef = 0;
+ }
+ //! constructor for creating a variant of type Global
+ explicit ScopedTypeVariant(const Definition *d)
+ {
+ if (d)
+ {
+ m_name = d->name();
+ m_variant = Global;
+ m_u.globalDef = d;
+ }
+ else
+ {
+ m_variant = Dummy;
+ m_u.globalDef = 0;
+ }
+ }
+ //! constructor for creating a variant of type Local
+ explicit ScopedTypeVariant(const QCString &name)
+ {
+ m_name = name;
+ m_variant = Local;
+ m_u.localDef = new LocalDef;
+ }
+ //! copy constructor
+ ScopedTypeVariant(const ScopedTypeVariant &stv)
+ {
+ m_variant = stv.m_variant;
+ m_name = stv.m_name;
+ if (m_variant==Local)
+ {
+ m_u.localDef = new LocalDef(*stv.m_u.localDef);
+ }
+ else if (m_variant==Global)
+ {
+ m_u.globalDef = stv.m_u.globalDef;
+ }
+ }
+ //! move constructor
+ ScopedTypeVariant(ScopedTypeVariant &&stv) noexcept : ScopedTypeVariant()
+ {
+ swap(*this,stv);
+ }
+ //! assignment operator
+ ScopedTypeVariant &operator=(ScopedTypeVariant stv)
+ {
+ swap(*this,stv);
+ return *this;
+ }
+ //! destructor
+ ~ScopedTypeVariant()
+ {
+ if (m_variant==Local)
+ {
+ delete m_u.localDef;
+ }
+ }
+ //! swap function
+ friend void swap(ScopedTypeVariant &first,ScopedTypeVariant &second)
+ {
+ using std::swap; // enable ADL
+ swap(first.m_variant,second.m_variant);
+ swap(first.m_name,second.m_name);
+ swap(first.m_u.globalDef,second.m_u.globalDef);
+ }
+ //! Turn the variant into a Global type
+ void setGlobal(const Definition *def)
+ {
+ if (m_variant==Local)
+ {
+ delete m_u.localDef;
+ }
+ m_variant = Global;
+ m_name = def->name();
+ m_u.globalDef = def;
+ }
+ //! Turn the variant into a Local type
+ LocalDef *setLocal(const QCString &name)
+ {
+ if (m_variant==Local)
+ {
+ delete m_u.localDef;
+ }
+ m_variant = Local;
+ m_name = name;
+ m_u.localDef = new LocalDef;
+ return m_u.localDef;
+ }
+ //! Turn the variant into a Dummy type
+ void setDummy()
+ {
+ if (m_variant==Local)
+ {
+ delete m_u.localDef;
+ }
+ m_variant = Dummy;
+ m_name = "";
+ m_u.localDef=0;
+ }
+ Variant type() const { return m_variant; }
+ QCString name() const { return m_name; }
+ LocalDef *localDef() const { return m_variant==Local ? m_u.localDef : 0; }
+ const Definition *globalDef() const { return m_variant==Global ? m_u.globalDef : 0; }
+
+ private:
+ Variant m_variant;
+ QCString m_name;
+ union
+ {
+ const Definition *globalDef;
+ LocalDef *localDef;
+ } m_u;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! Represents a stack of variable to class mappings as found in the
+ * code. Each scope is enclosed in pushScope() and popScope() calls.
+ * Variables are added by calling addVariables() and one can search
+ * for variable using findVariable().
+ */
+class VariableContext
+{
+ public:
+ using Scope = std::unordered_map<std::string,ScopedTypeVariant>;
+
+ void pushScope()
+ {
+ m_scopes.push_back(Scope());
+ }
+ void popScope()
+ {
+ if (!m_scopes.empty())
+ {
+ m_scopes.pop_back();
+ }
+ }
+ void clear()
+ {
+ m_scopes.clear();
+ m_globalScope.clear();
+ }
+ void clearExceptGlobal()
+ {
+ m_scopes.clear();
+ }
+ void addVariable(const QCString &name,ScopedTypeVariant stv)
+ {
+ Scope *scope = m_scopes.empty() ? &m_globalScope : &m_scopes.back();
+ scope->emplace(std::make_pair(name.str(),std::move(stv))); // add it to a list
+ }
+ const ScopedTypeVariant *findVariable(const QCString &name)
+ {
+ const ScopedTypeVariant *result = 0;
+ if (name.isEmpty()) return result;
+
+ // search from inner to outer scope
+ auto it = std::rbegin(m_scopes);
+ while (it != std::rend(m_scopes))
+ {
+ auto it2 = it->find(name.str());
+ if (it2 != std::end(*it))
+ {
+ result = &it2->second;
+ return result;
+ }
+ ++it;
+ }
+ // nothing found -> also try the global scope
+ auto it2 = m_globalScope.find(name.str());
+ if (it2 != m_globalScope.end())
+ {
+ result = &it2->second;
+ }
+ return result;
+ }
+ bool atGlobalScope() const { return m_scopes.empty(); }
+
+ private:
+ Scope m_globalScope;
+ std::vector<Scope> m_scopes;
+};
+
+//-----------------------------------------------------------------------------
+
+/** Represents the call context */
+class CallContext
+{
+ public:
+ struct Ctx
+ {
+ Ctx(const QCString &name_,const QCString &type_) : name(name_), type(type_) {}
+ QCString name;
+ QCString type;
+ ScopedTypeVariant stv;
+ };
+
+ CallContext()
+ {
+ clear();
+ }
+ void setScope(const ScopedTypeVariant &stv)
+ {
+ Ctx &ctx = m_stvList.back();
+ ctx.stv=std::move(stv);
+ }
+ void pushScope(const QCString &name_,const QCString &type_)
+ {
+ m_stvList.push_back(Ctx(name_,type_));
+ }
+ void popScope(QCString &name_,QCString &type_)
+ {
+ if (m_stvList.size()>1)
+ {
+ const Ctx &ctx = m_stvList.back();
+ name_ = ctx.name;
+ type_ = ctx.type;
+ m_stvList.pop_back();
+ }
+ }
+ void clear()
+ {
+ m_stvList.clear();
+ m_stvList.push_back(Ctx("",""));
+ }
+ const ScopedTypeVariant getScope() const
+ {
+ return m_stvList.back().stv;
+ }
+
+ private:
+ std::vector<Ctx> m_stvList;
+};
+
+
+#endif
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
index eee1aa1..89f1681 100644
--- a/src/searchindex.cpp
+++ b/src/searchindex.cpp
@@ -1,8 +1,6 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -15,6 +13,7 @@
*
*/
+
#include <ctype.h>
#include <assert.h>
@@ -31,12 +30,17 @@
#include "message.h"
#include "version.h"
#include "groupdef.h"
-#include "classlist.h"
#include "filedef.h"
#include "memberdef.h"
#include "filename.h"
#include "membername.h"
#include "resourcemgr.h"
+#include "namespacedef.h"
+#include "classdef.h"
+
+//---------------------------------------------------------------------------------------------
+// the following part is for the server based search engine
+//---------------------------------------------------------------------------------------------
// file format: (all multi-byte values are stored in big endian format)
// 4 byte header
@@ -49,41 +53,33 @@
// (4 bytes index to url string + 4 bytes frequency counter)
// for each url: a \0 terminated string
-const int numIndexEntries = 256*256;
+const size_t numIndexEntries = 256*256;
//--------------------------------------------------------------------
-IndexWord::IndexWord(const char *word) : m_word(word), m_urls(17)
+IndexWord::IndexWord(QCString word) : m_word(word)
{
- m_urls.setAutoDelete(TRUE);
//printf("IndexWord::IndexWord(%s)\n",word);
}
void IndexWord::addUrlIndex(int idx,bool hiPriority)
{
//printf("IndexWord::addUrlIndex(%d,%d)\n",idx,hiPriority);
- URLInfo *ui = m_urls.find(idx);
- if (ui==0)
+ auto it = m_urls.find(idx);
+ if (it==m_urls.end())
{
//printf("URLInfo::URLInfo(%d)\n",idx);
- ui=new URLInfo(idx,0);
- m_urls.insert(idx,ui);
+ it = m_urls.insert(std::make_pair(idx,URLInfo(idx,0))).first;
}
- ui->freq+=2;
- if (hiPriority) ui->freq|=1; // mark as high priority document
+ it->second.freq+=2;
+ if (hiPriority) it->second.freq|=1; // mark as high priority document
}
//--------------------------------------------------------------------
-SearchIndex::SearchIndex() : SearchIndexIntf(Internal),
- m_words(328829), m_index(numIndexEntries), m_url2IdMap(10007), m_urls(10007), m_urlIndex(-1)
+SearchIndex::SearchIndex() : SearchIndexIntf(Internal)
{
- int i;
- m_words.setAutoDelete(TRUE);
- m_url2IdMap.setAutoDelete(TRUE);
- m_urls.setAutoDelete(TRUE);
- m_index.setAutoDelete(TRUE);
- for (i=0;i<numIndexEntries;i++) m_index.insert(i,new QList<IndexWord>);
+ m_index.resize(numIndexEntries);
}
void SearchIndex::setCurrentDoc(const Definition *ctx,const char *anchor,bool isSourceFile)
@@ -91,7 +87,7 @@ void SearchIndex::setCurrentDoc(const Definition *ctx,const char *anchor,bool is
if (ctx==0) return;
assert(!isSourceFile || ctx->definitionType()==Definition::TypeFile);
//printf("SearchIndex::setCurrentDoc(%s,%s,%s)\n",name,baseName,anchor);
- QCString url=isSourceFile ? (dynamic_cast<const FileDef*>(ctx))->getSourceFileBase() : ctx->getOutputFileBase();
+ QCString url=isSourceFile ? (toFileDef(ctx))->getSourceFileBase() : ctx->getOutputFileBase();
url+=Config_getString(HTML_FILE_EXTENSION);
QCString baseUrl = url;
if (anchor) url+=QCString("#")+anchor;
@@ -99,7 +95,7 @@ void SearchIndex::setCurrentDoc(const Definition *ctx,const char *anchor,bool is
QCString name=ctx->qualifiedName();
if (ctx->definitionType()==Definition::TypeMember)
{
- const MemberDef *md = dynamic_cast<const MemberDef *>(ctx);
+ const MemberDef *md = toMemberDef(ctx);
name.prepend((md->getLanguage()==SrcLangExt_Fortran ?
theTranslator->trSubprogram(TRUE,TRUE) :
theTranslator->trMember(TRUE,TRUE))+" ");
@@ -116,7 +112,7 @@ void SearchIndex::setCurrentDoc(const Definition *ctx,const char *anchor,bool is
{
case Definition::TypePage:
{
- const PageDef *pd = dynamic_cast<const PageDef *>(ctx);
+ const PageDef *pd = toPageDef(ctx);
if (pd->hasTitle())
{
name = theTranslator->trPage(TRUE,TRUE)+" "+pd->title();
@@ -129,7 +125,7 @@ void SearchIndex::setCurrentDoc(const Definition *ctx,const char *anchor,bool is
break;
case Definition::TypeClass:
{
- const ClassDef *cd = dynamic_cast<const ClassDef *>(ctx);
+ const ClassDef *cd = toClassDef(ctx);
name.prepend(cd->compoundTypeString()+" ");
}
break;
@@ -151,7 +147,7 @@ void SearchIndex::setCurrentDoc(const Definition *ctx,const char *anchor,bool is
break;
case Definition::TypeGroup:
{
- const GroupDef *gd = dynamic_cast<const GroupDef *>(ctx);
+ const GroupDef *gd = toGroupDef(ctx);
if (gd->groupTitle())
{
name = theTranslator->trGroup(TRUE,TRUE)+" "+gd->groupTitle();
@@ -167,16 +163,16 @@ void SearchIndex::setCurrentDoc(const Definition *ctx,const char *anchor,bool is
}
}
- int *pIndex = m_url2IdMap.find(baseUrl);
- if (pIndex==0)
+ auto it = m_url2IdMap.find(baseUrl.str());
+ if (it == m_url2IdMap.end())
{
++m_urlIndex;
- m_url2IdMap.insert(baseUrl,new int(m_urlIndex));
- m_urls.insert(m_urlIndex,new URL(name,url));
+ m_url2IdMap.insert(std::make_pair(baseUrl.str(),m_urlIndex));
+ m_urls.insert(std::make_pair(m_urlIndex,URL(name,url)));
}
else
{
- m_urls.insert(*pIndex,new URL(name,url));
+ m_urls.insert(std::make_pair(it->second,URL(name,url)));
}
}
@@ -208,17 +204,16 @@ void SearchIndex::addWord(const char *word,bool hiPriority,bool recurse)
if (word==0 || word[0]=='\0') return;
QCString wStr = QCString(word).lower();
//printf("SearchIndex::addWord(%s,%d) wStr=%s\n",word,hiPriority,wStr.data());
- IndexWord *w = m_words[wStr];
- if (w==0)
+ int idx=charsToIndex(wStr);
+ if (idx<0 || idx>=static_cast<int>(m_index.size())) return;
+ auto it = m_words.find(wStr.str());
+ if (it==m_words.end())
{
- int idx=charsToIndex(wStr);
//fprintf(stderr,"addWord(%s) at index %d\n",word,idx);
- if (idx<0) return;
- w = new IndexWord(wStr);
- m_index[idx]->append(w);
- m_words.insert(wStr,w);
+ m_index[idx].push_back(IndexWord(wStr));
+ it = m_words.insert({ wStr.str(), static_cast<int>(m_index[idx].size())-1 }).first;
}
- w->addUrlIndex(m_urlIndex,hiPriority);
+ m_index[idx][it->second].addUrlIndex(m_urlIndex,hiPriority);
int i;
bool found=FALSE;
if (!recurse) // the first time we check if we can strip the prefix
@@ -244,12 +239,12 @@ void SearchIndex::addWord(const char *word,bool hiPriority)
addWord(word,hiPriority,FALSE);
}
-static void writeInt(QFile &f,int index)
+static void writeInt(QFile &f,size_t index)
{
- f.putch(((uint)index)>>24);
- f.putch((((uint)index)>>16)&0xff);
- f.putch((((uint)index)>>8)&0xff);
- f.putch(((uint)index)&0xff);
+ f.putch(static_cast<int>(index>>24));
+ f.putch(static_cast<int>((index>>16)&0xff));
+ f.putch(static_cast<int>((index>>8)&0xff));
+ f.putch(static_cast<int>(index&0xff));
}
static void writeString(QFile &f,const char *s)
@@ -261,21 +256,19 @@ static void writeString(QFile &f,const char *s)
void SearchIndex::write(const char *fileName)
{
- int i;
- int size=4; // for the header
+ size_t i;
+ size_t size=4; // for the header
size+=4*numIndexEntries; // for the index
- int wordsOffset = size;
+ size_t wordsOffset = size;
// first pass: compute the size of the wordlist
for (i=0;i<numIndexEntries;i++)
{
- QList<IndexWord> *wlist = m_index[i];
- if (!wlist->isEmpty())
+ const auto &wlist = m_index[i];
+ if (!wlist.empty())
{
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
+ for (const auto &iw : wlist)
{
- int ws = iw->word().length()+1;
+ int ws = iw.word().length()+1;
size+=ws+4; // word + url info list offset
}
size+=1; // zero list terminator
@@ -283,19 +276,17 @@ void SearchIndex::write(const char *fileName)
}
// second pass: compute the offsets in the index
- int indexOffsets[numIndexEntries];
- int offset=wordsOffset;
+ size_t indexOffsets[numIndexEntries];
+ size_t offset=wordsOffset;
for (i=0;i<numIndexEntries;i++)
{
- QList<IndexWord> *wlist = m_index[i];
- if (!wlist->isEmpty())
+ const auto &wlist = m_index[i];
+ if (!wlist.empty())
{
indexOffsets[i]=offset;
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
+ for (const auto &iw : wlist)
{
- offset+= iw->word().length()+1;
+ offset+= iw.word().length()+1;
offset+=4; // word + offset to url info array
}
offset+=1; // zero list terminator
@@ -305,42 +296,36 @@ void SearchIndex::write(const char *fileName)
indexOffsets[i]=0;
}
}
- int padding = size;
+ size_t padding = size;
size = (size+3)&~3; // round up to 4 byte boundary
padding = size - padding;
- //int statsOffset = size;
- //IndexWord *iw;
- int *wordStatOffsets = new int[m_words.count()];
+ std::vector<size_t> wordStatOffsets(m_words.size());
int count=0;
// third pass: compute offset to stats info for each word
for (i=0;i<numIndexEntries;i++)
{
- QList<IndexWord> *wlist = m_index[i];
- if (!wlist->isEmpty())
+ const auto &wlist = m_index[i];
+ if (!wlist.empty())
{
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
+ for (const auto &iw : wlist)
{
//printf("wordStatOffsets[%d]=%d\n",count,size);
wordStatOffsets[count++] = size;
- size+=4+iw->urls().count()*8; // count + (url_index,freq) per url
+ size+=4 + iw.urls().size() * 8; // count + (url_index,freq) per url
}
}
}
- int *urlOffsets = new int[m_urls.count()];
- //int urlsOffset = size;
- QIntDictIterator<URL> udi(m_urls);
- URL *url;
- for (udi.toFirst();(url=udi.current());++udi)
+ std::vector<size_t> urlOffsets(m_urls.size());
+ for (const auto &udi : m_urls)
{
- urlOffsets[udi.currentKey()]=size;
- size+=url->name.length()+1+
- url->url.length()+1;
+ urlOffsets[udi.first]=size;
+ size+=udi.second.name.length()+1+
+ udi.second.url.length()+1;
}
+
//printf("Total size %x bytes (word=%x stats=%x urls=%x)\n",size,wordsOffset,statsOffset,urlsOffset);
QFile f(fileName);
if (f.open(IO_WriteOnly))
@@ -356,14 +341,12 @@ void SearchIndex::write(const char *fileName)
count=0;
for (i=0;i<numIndexEntries;i++)
{
- QList<IndexWord> *wlist = m_index[i];
- if (!wlist->isEmpty())
+ const auto &wlist = m_index[i];
+ if (!wlist.empty())
{
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
+ for (const auto &iw : wlist)
{
- writeString(f,iw->word());
+ writeString(f,iw.word());
writeInt(f,wordStatOffsets[count++]);
}
f.putch(0);
@@ -374,37 +357,29 @@ void SearchIndex::write(const char *fileName)
// write word statistics
for (i=0;i<numIndexEntries;i++)
{
- QList<IndexWord> *wlist = m_index[i];
- if (!wlist->isEmpty())
+ const auto &wlist = m_index[i];
+ if (!wlist.empty())
{
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
+ for (const auto &iw : wlist)
{
- int numUrls = iw->urls().count();
+ size_t numUrls = iw.urls().size();
writeInt(f,numUrls);
- QIntDictIterator<URLInfo> uli(iw->urls());
- URLInfo *ui;
- for (uli.toFirst();(ui=uli.current());++uli)
+ for (const auto &ui : iw.urls())
{
- writeInt(f,urlOffsets[ui->urlIdx]);
- writeInt(f,ui->freq);
+ writeInt(f,urlOffsets[ui.second.urlIdx]);
+ writeInt(f,ui.second.freq);
}
}
}
}
// write urls
- QIntDictIterator<URL> udi(m_urls);
- URL *url;
- for (udi.toFirst();(url=udi.current());++udi)
+ for (const auto &udi : m_urls)
{
- writeString(f,url->name);
- writeString(f,url->url);
+ writeString(f,udi.second.name);
+ writeString(f,udi.second.url);
}
}
- delete[] urlOffsets;
- delete[] wordStatOffsets;
}
@@ -424,29 +399,19 @@ struct SearchDocEntry
struct SearchIndexExternal::Private
{
- Private() : docEntries(12251) {}
- SDict<SearchDocEntry> docEntries;
+ std::map<std::string,SearchDocEntry> docEntries;
SearchDocEntry *current = 0;
};
-SearchIndexExternal::SearchIndexExternal() : SearchIndexIntf(External)
+SearchIndexExternal::SearchIndexExternal() : SearchIndexIntf(External), p(std::make_unique<Private>())
{
- p = new SearchIndexExternal::Private;
- p->docEntries.setAutoDelete(TRUE);
- p->current=0;
-}
-
-SearchIndexExternal::~SearchIndexExternal()
-{
- //printf("p->docEntries.count()=%d\n",p->docEntries.count());
- delete p;
}
static QCString definitionToName(const Definition *ctx)
{
if (ctx && ctx->definitionType()==Definition::TypeMember)
{
- const MemberDef *md = dynamic_cast<const MemberDef*>(ctx);
+ const MemberDef *md = toMemberDef(ctx);
if (md->isFunction())
return "function";
else if (md->isSlot())
@@ -477,7 +442,7 @@ static QCString definitionToName(const Definition *ctx)
switch(ctx->definitionType())
{
case Definition::TypeClass:
- return (dynamic_cast<const ClassDef*>(ctx))->compoundTypeString();
+ return (toClassDef(ctx))->compoundTypeString();
case Definition::TypeFile:
return "file";
case Definition::TypeNamespace:
@@ -499,29 +464,28 @@ static QCString definitionToName(const Definition *ctx)
void SearchIndexExternal::setCurrentDoc(const Definition *ctx,const char *anchor,bool isSourceFile)
{
- QCString extId = stripPath(Config_getString(EXTERNAL_SEARCH_ID));
- QCString baseName = isSourceFile ? (dynamic_cast<const FileDef*>(ctx))->getSourceFileBase() : ctx->getOutputFileBase();
+ static QCString extId = stripPath(Config_getString(EXTERNAL_SEARCH_ID));
+ QCString baseName = isSourceFile ? (toFileDef(ctx))->getSourceFileBase() : ctx->getOutputFileBase();
QCString url = baseName + Doxygen::htmlFileExtension;
if (anchor) url+=QCString("#")+anchor;
QCString key = extId+";"+url;
- p->current = p->docEntries.find(key);
- //printf("setCurrentDoc(url=%s,isSourceFile=%d) current=%p\n",url.data(),isSourceFile,p->current);
- if (!p->current)
+ auto it = p->docEntries.find(key.str());
+ if (it == p->docEntries.end())
{
- SearchDocEntry *e = new SearchDocEntry;
- e->type = isSourceFile ? QCString("source") : definitionToName(ctx);
- e->name = ctx->qualifiedName();
+ SearchDocEntry e;
+ e.type = isSourceFile ? QCString("source") : definitionToName(ctx);
+ e.name = ctx->qualifiedName();
if (ctx->definitionType()==Definition::TypeMember)
{
- e->args = (dynamic_cast<const MemberDef*>(ctx))->argsString();
+ e.args = (toMemberDef(ctx))->argsString();
}
- e->extId = extId;
- e->url = url;
- p->current = e;
- p->docEntries.append(key,e);
+ e.extId = extId;
+ e.url = url;
+ it = p->docEntries.insert({key.str(),e}).first;
//printf("searchIndexExt %s : %s\n",e->name.data(),e->url.data());
}
+ p->current = &it->second;
}
void SearchIndexExternal::addWord(const char *word,bool hiPriority)
@@ -541,26 +505,25 @@ void SearchIndexExternal::write(const char *fileName)
FTextStream t(&f);
t << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
t << "<add>" << endl;
- SDict<SearchDocEntry>::Iterator it(p->docEntries);
- SearchDocEntry *doc;
- for (it.toFirst();(doc=it.current());++it)
+ for (auto &kv : p->docEntries)
{
- doc->normalText.addChar(0); // make sure buffer ends with a 0 terminator
- doc->importantText.addChar(0); // make sure buffer ends with a 0 terminator
+ SearchDocEntry &doc = kv.second;
+ doc.normalText.addChar(0); // make sure buffer ends with a 0 terminator
+ doc.importantText.addChar(0); // make sure buffer ends with a 0 terminator
t << " <doc>" << endl;
- t << " <field name=\"type\">" << doc->type << "</field>" << endl;
- t << " <field name=\"name\">" << convertToXML(doc->name) << "</field>" << endl;
- if (!doc->args.isEmpty())
+ t << " <field name=\"type\">" << doc.type << "</field>" << endl;
+ t << " <field name=\"name\">" << convertToXML(doc.name) << "</field>" << endl;
+ if (!doc.args.isEmpty())
{
- t << " <field name=\"args\">" << convertToXML(doc->args) << "</field>" << endl;
+ t << " <field name=\"args\">" << convertToXML(doc.args) << "</field>" << endl;
}
- if (!doc->extId.isEmpty())
+ if (!doc.extId.isEmpty())
{
- t << " <field name=\"tag\">" << convertToXML(doc->extId) << "</field>" << endl;
+ t << " <field name=\"tag\">" << convertToXML(doc.extId) << "</field>" << endl;
}
- t << " <field name=\"url\">" << convertToXML(doc->url) << "</field>" << endl;
- t << " <field name=\"keywords\">" << convertToXML(doc->importantText.get()) << "</field>" << endl;
- t << " <field name=\"text\">" << convertToXML(doc->normalText.get()) << "</field>" << endl;
+ t << " <field name=\"url\">" << convertToXML(doc.url) << "</field>" << endl;
+ t << " <field name=\"keywords\">" << convertToXML(doc.importantText.get()) << "</field>" << endl;
+ t << " <field name=\"text\">" << convertToXML(doc.normalText.get()) << "</field>" << endl;
t << " </doc>" << endl;
}
t << "</add>" << endl;
@@ -571,19 +534,96 @@ void SearchIndexExternal::write(const char *fileName)
}
}
-//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------------
// the following part is for the javascript based search engine
+//---------------------------------------------------------------------------------------------
-#include "memberdef.h"
-#include "namespacedef.h"
-#include "pagedef.h"
-#include "classdef.h"
-#include "filedef.h"
-#include "language.h"
-#include "doxygen.h"
-#include "message.h"
+QCString searchName(const Definition *d)
+{
+ return d->definitionType()==Definition::TypeGroup ? QCString(toGroupDef(d)->groupTitle()) :
+ d->definitionType()==Definition::TypePage ? toPageDef(d)->title() :
+ d->localName();
+}
-static SearchIndexInfo g_searchIndexInfo[NUM_SEARCH_INDICES];
+QCString searchId(const Definition *d)
+{
+ QCString s = searchName(d);
+ int c;
+ uint i;
+ QCString result;
+ for (i=0;i<s.length();i++)
+ {
+ c=s.at(i);
+ if (c>0x7f || c<0) // part of multibyte character
+ {
+ result+=(char)c;
+ }
+ else if (isalnum(c)) // simply alpha numerical character
+ {
+ result+=(char)tolower(c);
+ }
+ else // other 'unprintable' characters
+ {
+ char val[4];
+ sprintf(val,"_%02x",(uchar)c);
+ result+=val;
+ }
+ }
+ return result;
+}
+
+
+#define SEARCH_INDEX_ALL 0
+#define SEARCH_INDEX_CLASSES 1
+#define SEARCH_INDEX_INTERFACES 2
+#define SEARCH_INDEX_STRUCTS 3
+#define SEARCH_INDEX_EXCEPTIONS 4
+#define SEARCH_INDEX_NAMESPACES 5
+#define SEARCH_INDEX_FILES 6
+#define SEARCH_INDEX_FUNCTIONS 7
+#define SEARCH_INDEX_VARIABLES 8
+#define SEARCH_INDEX_TYPEDEFS 9
+#define SEARCH_INDEX_SEQUENCES 10
+#define SEARCH_INDEX_DICTIONARIES 11
+#define SEARCH_INDEX_ENUMS 12
+#define SEARCH_INDEX_ENUMVALUES 13
+#define SEARCH_INDEX_PROPERTIES 14
+#define SEARCH_INDEX_EVENTS 15
+#define SEARCH_INDEX_RELATED 16
+#define SEARCH_INDEX_DEFINES 17
+#define SEARCH_INDEX_GROUPS 18
+#define SEARCH_INDEX_PAGES 19
+
+static std::array<SearchIndexInfo,NUM_SEARCH_INDICES> g_searchIndexInfo =
+{ {
+ // index name getText symbolList
+ { /* SEARCH_INDEX_ALL */ "all" , []() { return theTranslator->trAll(); }, {} },
+ { /* SEARCH_INDEX_CLASSES */ "classes" , []() { return theTranslator->trClasses(); }, {} },
+ { /* SEARCH_INDEX_INTERFACES */ "interfaces" , []() { return theTranslator->trSliceInterfaces(); }, {} },
+ { /* SEARCH_INDEX_STRUCTS */ "structs" , []() { return theTranslator->trStructs(); }, {} },
+ { /* SEARCH_INDEX_EXCEPTIONS */ "exceptions" , []() { return theTranslator->trExceptions(); }, {} },
+ { /* SEARCH_INDEX_NAMESPACES */ "namespaces" , []() { return Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
+ theTranslator->trModules() :
+ theTranslator->trNamespace(TRUE,FALSE); }, {} },
+ { /* SEARCH_INDEX_FILES */ "files" , []() { return theTranslator->trFile(TRUE,FALSE); }, {} },
+ { /* SEARCH_INDEX_FUNCTIONS */ "functions" , []() { return Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
+ theTranslator->trOperations() :
+ theTranslator->trFunctions(); }, {} },
+ { /* SEARCH_INDEX_VARIABLES */ "variables" , []() { return Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
+ theTranslator->trConstants() :
+ theTranslator->trVariables(); }, {} },
+ { /* SEARCH_INDEX_TYPEDEFS */ "typedefs" , []() { return theTranslator->trTypedefs(); }, {} },
+ { /* SEARCH_INDEX_SEQUENCES */ "sequences" , []() { return theTranslator->trSequences(); }, {} },
+ { /* SEARCH_INDEX_DICTIONARIES */ "dictionaries", []() { return theTranslator->trDictionaries(); }, {} },
+ { /* SEARCH_INDEX_ENUMS */ "enums" , []() { return theTranslator->trEnumerations(); }, {} },
+ { /* SEARCH_INDEX_ENUMVALUES */ "enumvalues" , []() { return theTranslator->trEnumerationValues(); }, {} },
+ { /* SEARCH_INDEX_PROPERTIES */ "properties" , []() { return theTranslator->trProperties(); }, {} },
+ { /* SEARCH_INDEX_EVENTS */ "events" , []() { return theTranslator->trEvents(); }, {} },
+ { /* SEARCH_INDEX_RELATED */ "related" , []() { return theTranslator->trFriends(); }, {} },
+ { /* SEARCH_INDEX_DEFINES */ "defines" , []() { return theTranslator->trDefines(); }, {} },
+ { /* SEARCH_INDEX_GROUPS */ "groups" , []() { return theTranslator->trGroup(TRUE,FALSE); }, {} },
+ { /* SEARCH_INDEX_PAGES */ "pages" , []() { return theTranslator->trPage(TRUE,FALSE); }, {} }
+} };
static void addMemberToSearchIndex(const MemberDef *md)
{
@@ -603,55 +643,56 @@ static void addMemberToSearchIndex(const MemberDef *md)
QCString n = md->name();
if (!n.isEmpty())
{
- uint letter = getUtf8CodeToLower(n,0);
+ char letter[MAX_UTF8_CHAR_SIZE];
+ getUtf8Char(n,letter,CaseModifier::ToLower);
bool isFriendToHide = hideFriendCompounds &&
(QCString(md->typeString())=="friend class" ||
QCString(md->typeString())=="friend struct" ||
QCString(md->typeString())=="friend union");
if (!(md->isFriend() && isFriendToHide))
{
- g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_ALL].add(letter,md);
}
if (md->isFunction() || md->isSlot() || md->isSignal())
{
- g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].add(letter,md);
}
else if (md->isVariable())
{
- g_searchIndexInfo[SEARCH_INDEX_VARIABLES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_VARIABLES].add(letter,md);
}
else if (md->isSequence())
{
- g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].add(letter,md);
}
else if (md->isDictionary())
{
- g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].add(letter,md);
}
else if (md->isTypedef())
{
- g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].add(letter,md);
}
else if (md->isEnumerate())
{
- g_searchIndexInfo[SEARCH_INDEX_ENUMS].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_ENUMS].add(letter,md);
}
else if (md->isEnumValue())
{
- g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].add(letter,md);
}
else if (md->isProperty())
{
- g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].add(letter,md);
}
else if (md->isEvent())
{
- g_searchIndexInfo[SEARCH_INDEX_EVENTS].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_EVENTS].add(letter,md);
}
else if (md->isRelated() || md->isForeign() ||
(md->isFriend() && !isFriendToHide))
{
- g_searchIndexInfo[SEARCH_INDEX_RELATED].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_RELATED].add(letter,md);
}
}
}
@@ -664,264 +705,165 @@ static void addMemberToSearchIndex(const MemberDef *md)
QCString n = md->name();
if (!n.isEmpty())
{
- uint letter = getUtf8CodeToLower(n,0);
- g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,md);
+ char letter[MAX_UTF8_CHAR_SIZE];
+ getUtf8Char(n,letter,CaseModifier::ToLower);
+ g_searchIndexInfo[SEARCH_INDEX_ALL].add(letter,md);
if (md->isFunction())
{
- g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].add(letter,md);
}
else if (md->isVariable())
{
- g_searchIndexInfo[SEARCH_INDEX_VARIABLES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_VARIABLES].add(letter,md);
}
else if (md->isSequence())
{
- g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].add(letter,md);
}
else if (md->isDictionary())
{
- g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].add(letter,md);
}
else if (md->isTypedef())
{
- g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].add(letter,md);
}
else if (md->isEnumerate())
{
- g_searchIndexInfo[SEARCH_INDEX_ENUMS].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_ENUMS].add(letter,md);
}
else if (md->isEnumValue())
{
- g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].add(letter,md);
}
else if (md->isDefine())
{
- g_searchIndexInfo[SEARCH_INDEX_DEFINES].symbolList.append(letter,md);
+ g_searchIndexInfo[SEARCH_INDEX_DEFINES].add(letter,md);
}
}
}
}
-// see also function convertToId() in search.js, which should match in
-// behaviour
-static QCString searchId(const QCString &s)
-{
- int c;
- uint i;
- QCString result;
- for (i=0;i<s.length();i++)
- {
- c=s.at(i);
- if (c>0x7f || c<0) // part of multibyte character
- {
- result+=(char)c;
- }
- else if (isalnum(c)) // simply alpha numerical character
- {
- result+=(char)tolower(c);
- }
- else // other 'unprintable' characters
- {
- char val[4];
- sprintf(val,"_%02x",(uchar)c);
- result+=val;
- }
- }
- return result;
-}
+//---------------------------------------------------------------------------------------------
void createJavaScriptSearchIndex()
{
- bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
-
- // set index names
- g_searchIndexInfo[SEARCH_INDEX_ALL].name = "all";
- g_searchIndexInfo[SEARCH_INDEX_CLASSES].name = "classes";
- g_searchIndexInfo[SEARCH_INDEX_INTERFACES].name = "interfaces";
- g_searchIndexInfo[SEARCH_INDEX_STRUCTS].name = "structs";
- g_searchIndexInfo[SEARCH_INDEX_EXCEPTIONS].name = "exceptions";
- g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].name = "namespaces";
- g_searchIndexInfo[SEARCH_INDEX_FILES].name = "files";
- g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].name = "functions";
- g_searchIndexInfo[SEARCH_INDEX_VARIABLES].name = "variables";
- g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].name = "typedefs";
- g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].name = "sequences";
- g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].name = "dictionaries";
- g_searchIndexInfo[SEARCH_INDEX_ENUMS].name = "enums";
- g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].name = "enumvalues";
- g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].name = "properties";
- g_searchIndexInfo[SEARCH_INDEX_EVENTS].name = "events";
- g_searchIndexInfo[SEARCH_INDEX_RELATED].name = "related";
- g_searchIndexInfo[SEARCH_INDEX_DEFINES].name = "defines";
- g_searchIndexInfo[SEARCH_INDEX_GROUPS].name = "groups";
- g_searchIndexInfo[SEARCH_INDEX_PAGES].name = "pages";
-
- // set index texts
- g_searchIndexInfo[SEARCH_INDEX_ALL].text = theTranslator->trAll();
- g_searchIndexInfo[SEARCH_INDEX_CLASSES].text = theTranslator->trClasses();
- g_searchIndexInfo[SEARCH_INDEX_INTERFACES].text = theTranslator->trSliceInterfaces();
- g_searchIndexInfo[SEARCH_INDEX_STRUCTS].text = theTranslator->trStructs();
- g_searchIndexInfo[SEARCH_INDEX_EXCEPTIONS].text = theTranslator->trExceptions();
- g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].text = sliceOpt ? theTranslator->trModules() :
- theTranslator->trNamespace(TRUE,FALSE);
- g_searchIndexInfo[SEARCH_INDEX_FILES].text = theTranslator->trFile(TRUE,FALSE);
- g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].text = sliceOpt ? theTranslator->trOperations() :
- theTranslator->trFunctions();
- g_searchIndexInfo[SEARCH_INDEX_VARIABLES].text = sliceOpt ? theTranslator->trConstants() :
- theTranslator->trVariables();
- g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].text = theTranslator->trTypedefs();
- g_searchIndexInfo[SEARCH_INDEX_SEQUENCES].text = theTranslator->trSequences();
- g_searchIndexInfo[SEARCH_INDEX_DICTIONARIES].text = theTranslator->trDictionaries();
- g_searchIndexInfo[SEARCH_INDEX_ENUMS].text = theTranslator->trEnumerations();
- g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].text = theTranslator->trEnumerationValues();
- g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].text = theTranslator->trProperties();
- g_searchIndexInfo[SEARCH_INDEX_EVENTS].text = theTranslator->trEvents();
- g_searchIndexInfo[SEARCH_INDEX_RELATED].text = theTranslator->trFriends();
- g_searchIndexInfo[SEARCH_INDEX_DEFINES].text = theTranslator->trDefines();
- g_searchIndexInfo[SEARCH_INDEX_GROUPS].text = theTranslator->trGroup(TRUE,FALSE);
- g_searchIndexInfo[SEARCH_INDEX_PAGES].text = theTranslator->trPage(TRUE,FALSE);
-
- // add symbols to letter -> symbol list map
-
// index classes
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- uint letter = getUtf8CodeToLower(cd->localName(),0);
- if (cd->isLinkable() && isId(letter))
+ char letter[MAX_UTF8_CHAR_SIZE];
+ getUtf8Char(cd->localName(),letter,CaseModifier::ToLower);
+ if (cd->isLinkable())
{
- g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,cd);
- if (sliceOpt)
+ g_searchIndexInfo[SEARCH_INDEX_ALL].add(letter,cd.get());
+ if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
{
if (cd->compoundType()==ClassDef::Interface)
{
- g_searchIndexInfo[SEARCH_INDEX_INTERFACES].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_INTERFACES].add(letter,cd.get());
}
else if (cd->compoundType()==ClassDef::Struct)
{
- g_searchIndexInfo[SEARCH_INDEX_STRUCTS].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_STRUCTS].add(letter,cd.get());
}
else if (cd->compoundType()==ClassDef::Exception)
{
- g_searchIndexInfo[SEARCH_INDEX_EXCEPTIONS].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_EXCEPTIONS].add(letter,cd.get());
}
else // cd->compoundType()==ClassDef::Class
{
- g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_CLASSES].add(letter,cd.get());
}
}
else // non slice optimisation: group all types under classes
{
- g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd);
+ g_searchIndexInfo[SEARCH_INDEX_CLASSES].add(letter,cd.get());
}
}
}
// index namespaces
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for (;(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
- uint letter = getUtf8CodeToLower(nd->name(),0);
- if (nd->isLinkable() && isId(letter))
+ char letter[MAX_UTF8_CHAR_SIZE];
+ getUtf8Char(nd->name(),letter,CaseModifier::ToLower);
+ if (nd->isLinkable())
{
- g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,nd);
- g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].symbolList.append(letter,nd);
+ g_searchIndexInfo[SEARCH_INDEX_ALL].add(letter,nd.get());
+ g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].add(letter,nd.get());
}
}
// index files
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
- uint letter = getUtf8CodeToLower(fd->name(),0);
- if (fd->isLinkable() && isId(letter))
+ char letter[MAX_UTF8_CHAR_SIZE];
+ getUtf8Char(fd->name(),letter,CaseModifier::ToLower);
+ if (fd->isLinkable())
{
- g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,fd);
- g_searchIndexInfo[SEARCH_INDEX_FILES].symbolList.append(letter,fd);
+ g_searchIndexInfo[SEARCH_INDEX_ALL].add(letter,fd.get());
+ g_searchIndexInfo[SEARCH_INDEX_FILES].add(letter,fd.get());
}
}
}
// index class members
{
- MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
- MemberName *mn;
// for each member name
- for (mnli.toFirst();(mn=mnli.current());++mnli)
+ for (const auto &mn : *Doxygen::memberNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
// for each member definition
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
- addMemberToSearchIndex(md);
+ addMemberToSearchIndex(md.get());
}
}
}
// index file/namespace members
{
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
- MemberName *mn;
// for each member name
- for (fnli.toFirst();(mn=fnli.current());++fnli)
+ for (const auto &mn : *Doxygen::functionNameLinkedMap)
{
- MemberDef *md;
- MemberNameIterator mni(*mn);
// for each member definition
- for (mni.toFirst();(md=mni.current());++mni)
+ for (const auto &md : *mn)
{
- addMemberToSearchIndex(md);
+ addMemberToSearchIndex(md.get());
}
}
}
// index groups
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
if (gd->isLinkable())
{
QCString title = gd->groupTitle();
if (!title.isEmpty()) // TODO: able searching for all word in the title
{
- uchar charCode = title.at(0);
- uint letter = charCode<128 ? tolower(charCode) : charCode;
- if (isId(letter))
- {
- g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,gd);
- g_searchIndexInfo[SEARCH_INDEX_GROUPS].symbolList.append(letter,gd);
- }
+ char letter[MAX_UTF8_CHAR_SIZE];
+ getUtf8Char(title,letter,CaseModifier::ToLower);
+ g_searchIndexInfo[SEARCH_INDEX_ALL].add(letter,gd.get());
+ g_searchIndexInfo[SEARCH_INDEX_GROUPS].add(letter,gd.get());
}
}
}
// index pages
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
if (pd->isLinkable())
{
QCString title = pd->title();
if (!title.isEmpty())
{
- uchar charCode = title.at(0);
- uint letter = charCode<128 ? tolower(charCode) : charCode;
- if (isId(letter))
- {
- g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,pd);
- g_searchIndexInfo[SEARCH_INDEX_PAGES].symbolList.append(letter,pd);
- }
+ char letter[MAX_UTF8_CHAR_SIZE];
+ getUtf8Char(title,letter,CaseModifier::ToLower);
+ g_searchIndexInfo[SEARCH_INDEX_ALL].add(letter,pd.get());
+ g_searchIndexInfo[SEARCH_INDEX_PAGES].add(letter,pd.get());
}
}
}
@@ -930,47 +872,45 @@ void createJavaScriptSearchIndex()
QCString title = Doxygen::mainPage->title();
if (!title.isEmpty())
{
- uchar charCode = title.at(0);
- uint letter = charCode<128 ? tolower(charCode) : charCode;
- if (isId(letter))
- {
- g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,Doxygen::mainPage);
- g_searchIndexInfo[SEARCH_INDEX_PAGES].symbolList.append(letter,Doxygen::mainPage);
- }
+ char letter[MAX_UTF8_CHAR_SIZE];
+ getUtf8Char(title,letter,CaseModifier::ToLower);
+ g_searchIndexInfo[SEARCH_INDEX_ALL].add(letter,Doxygen::mainPage.get());
+ g_searchIndexInfo[SEARCH_INDEX_PAGES].add(letter,Doxygen::mainPage.get());
}
}
// sort all lists
- int i;
- for (i=0;i<NUM_SEARCH_INDICES;i++)
+ for (auto &sii : g_searchIndexInfo) // for each index
{
- SIntDict<SearchIndexList>::Iterator it(g_searchIndexInfo[i].symbolList);
- SearchIndexList *sl;
- for (it.toFirst();(sl=it.current());++it)
+ for (auto &kv : sii.symbolMap) // for each symbol in the index
{
- sl->sort();
+ // sort the symbols (first on "search" name, and then on full name)
+ std::sort(kv.second.begin(),
+ kv.second.end(),
+ [](const Definition *d1,const Definition *d2)
+ {
+ int eq = qstricmp(searchName(d1),searchName(d2)); // search name first
+ return eq==0 ? qstricmp(d1->name(),d2->name())<0 : eq<0; // then full name
+ });
}
}
}
void writeJavaScriptSearchIndex()
{
- int i;
int cnt = 0;
// write index files
QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
- for (i=0;i<NUM_SEARCH_INDICES;i++) // for each index
+ for (auto &sii : g_searchIndexInfo)
{
- SIntDict<SearchIndexList>::Iterator it(g_searchIndexInfo[i].symbolList);
- SearchIndexList *sl;
int p=0;
- for (it.toFirst();(sl=it.current());++it,++p) // for each letter
+ for (const auto &kv : sii.symbolMap)
{
QCString baseName;
- baseName.sprintf("%s_%x",g_searchIndexInfo[i].name.data(),p);
+ baseName.sprintf("%s_%x",sii.name.data(),p);
- QCString fileName = searchDirName + "/"+baseName+".html";
+ QCString fileName = searchDirName + "/"+baseName+Doxygen::htmlFileExtension;
QCString dataFileName = searchDirName + "/"+baseName+".js";
QFile outFile(fileName);
@@ -982,9 +922,10 @@ void writeJavaScriptSearchIndex()
t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
" \"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
- t << "<html><head><title></title>" << endl;
+ t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">" << endl;
+ t << "<head><title></title>" << endl;
t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
- t << "<meta name=\"generator\" content=\"Doxygen " << getVersion() << "\"/>" << endl;
+ t << "<meta name=\"generator\" content=\"Doxygen " << getDoxygenVersion() << "\"/>" << endl;
t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl;
t << "<script type=\"text/javascript\" src=\"" << baseName << ".js\"></script>" << endl;
t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl;
@@ -993,24 +934,30 @@ void writeJavaScriptSearchIndex()
t << "<div id=\"SRIndex\">" << endl;
t << "<div class=\"SRStatus\" id=\"Loading\">" << theTranslator->trLoading() << "</div>" << endl;
t << "<div id=\"SRResults\"></div>" << endl; // here the results will be inserted
- t << "<script type=\"text/javascript\"><!--" << endl;
- t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */\n";
+ t << "<script type=\"text/javascript\">" << endl;
+ t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */\n";
t << "createResults();" << endl; // this function will insert the results
- t << "/* @license-end */\n";
- t << "--></script>" << endl;
+ t << "/* @license-end */\n";
+ t << "</script>" << endl;
t << "<div class=\"SRStatus\" id=\"Searching\">"
<< theTranslator->trSearching() << "</div>" << endl;
t << "<div class=\"SRStatus\" id=\"NoMatches\">"
<< theTranslator->trNoMatches() << "</div>" << endl;
- t << "<script type=\"text/javascript\"><!--" << endl;
- t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */\n";
+ t << "<script type=\"text/javascript\">" << endl;
+ t << "/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */\n";
t << "document.getElementById(\"Loading\").style.display=\"none\";" << endl;
t << "document.getElementById(\"NoMatches\").style.display=\"none\";" << endl;
t << "var searchResults = new SearchResults(\"searchResults\");" << endl;
t << "searchResults.Search();" << endl;
- t << "/* @license-end */\n";
- t << "--></script>" << endl;
+ t << "window.addEventListener(\"message\", function(event) {" << endl;
+ t << " if (event.data == \"take_focus\") {" << endl;
+ t << " var elem = searchResults.NavNext(0);" << endl;
+ t << " if (elem) elem.focus();" << endl;
+ t << " }" << endl;
+ t << "});" << endl;
+ t << "/* @license-end */\n";
+ t << "</script>" << endl;
t << "</div>" << endl; // SRIndex
t << "</body>" << endl;
t << "</html>" << endl;
@@ -1031,44 +978,61 @@ void writeJavaScriptSearchIndex()
ti << "[" << endl;
bool firstEntry=TRUE;
- SDict<SearchDefinitionList>::Iterator li(*sl);
- SearchDefinitionList *dl;
- int itemCount=0;
- for (li.toFirst();(dl=li.current());++li)
+ int childCount=0;
+ QCString lastName;
+ const Definition *prevScope = 0;
+ for (auto it = kv.second.begin(); it!=kv.second.end();)
{
- Definition *d = dl->getFirst();
+ const Definition *d = *it;
+ QCString sname = searchName(d);
+ QCString id = searchId(d);
- if (!firstEntry)
+ if (sname!=lastName) // this item has a different search word
{
- ti << "," << endl;
+ if (!firstEntry)
+ {
+ ti << "]]]";
+ ti << "," << endl;
+ }
+ firstEntry=FALSE;
+
+ ti << " ['" << id << "_" << cnt++ << "',['" << convertToXML(sname) << "',[";
+ childCount=0;
+ prevScope=0;
}
- firstEntry=FALSE;
- ti << " ['" << dl->id() << "_" << cnt++ << "',['" << convertToXML(dl->name()) << "',[";
+ ++it;
+ const Definition *scope = d->getOuterScope();
+ const Definition *next = it!=kv.second.end() ? *it : 0;
+ const Definition *nextScope = 0;
+ const MemberDef *md = toMemberDef(d);
+ if (next) nextScope = next->getOuterScope();
+ QCString anchor = d->anchor();
- if (dl->count()==1) // item with a unique name
+ if (childCount>0)
{
- MemberDef *md = dynamic_cast<MemberDef*>(d);
- QCString anchor = d->anchor();
-
- ti << "'" << externalRef("../",d->getReference(),TRUE)
- << d->getOutputFileBase() << Doxygen::htmlFileExtension;
- if (!anchor.isEmpty())
- {
- ti << "#" << anchor;
- }
- ti << "',";
+ ti << "],[";
+ }
+ ti << "'" << externalRef("../",d->getReference(),TRUE)
+ << addHtmlExtensionIfMissing(d->getOutputFileBase());
+ if (!anchor.isEmpty())
+ {
+ ti << "#" << anchor;
+ }
+ ti << "',";
- static bool extLinksInWindow = Config_getBool(EXT_LINKS_IN_WINDOW);
- if (!extLinksInWindow || d->getReference().isEmpty())
- {
- ti << "1,";
- }
- else
- {
- ti << "0,";
- }
+ static bool extLinksInWindow = Config_getBool(EXT_LINKS_IN_WINDOW);
+ if (!extLinksInWindow || d->getReference().isEmpty())
+ {
+ ti << "1,";
+ }
+ else
+ {
+ ti << "0,";
+ }
+ if (lastName!=sname && (next==0 || searchName(next)!=sname)) // unique name
+ {
if (d->getOuterScope()!=Doxygen::globalScope)
{
ti << "'" << convertToXML(d->getOuterScope()->name()) << "'";
@@ -1086,127 +1050,84 @@ void writeJavaScriptSearchIndex()
{
ti << "''";
}
- ti << "]]";
}
- else // multiple items with the same name
+ else // multiple entries with the same name
{
- QListIterator<Definition> di(*dl);
- bool overloadedFunction = FALSE;
- Definition *prevScope = 0;
- int childCount=0;
- for (di.toFirst();(d=di.current());)
+ bool found=FALSE;
+ bool overloadedFunction = ((prevScope!=0 && scope==prevScope) ||
+ (scope && scope==nextScope)) && md && (md->isFunction() || md->isSlot());
+ QCString prefix;
+ if (md) prefix=convertToXML(md->localName());
+ if (overloadedFunction) // overloaded member function
{
- ++di;
- Definition *scope = d->getOuterScope();
- Definition *next = di.current();
- Definition *nextScope = 0;
- MemberDef *md = dynamic_cast<MemberDef*>(d);
- if (next) nextScope = next->getOuterScope();
- QCString anchor = d->anchor();
-
- if (childCount>0)
- {
- ti << "],[";
- }
- ti << "'" << externalRef("../",d->getReference(),TRUE)
- << d->getOutputFileBase() << Doxygen::htmlFileExtension;
- if (!anchor.isEmpty())
- {
- ti << "#" << anchor;
- }
- ti << "',";
-
- static bool extLinksInWindow = Config_getBool(EXT_LINKS_IN_WINDOW);
- if (!extLinksInWindow || d->getReference().isEmpty())
- {
- ti << "1,";
- }
- else
- {
- ti << "0,";
- }
- bool found=FALSE;
- overloadedFunction = ((prevScope!=0 && scope==prevScope) ||
- (scope && scope==nextScope)
- ) && md &&
- (md->isFunction() || md->isSlot());
- QCString prefix;
- if (md) prefix=convertToXML(md->localName());
- if (overloadedFunction) // overloaded member function
- {
- prefix+=convertToXML(md->argsString());
- // show argument list to disambiguate overloaded functions
- }
- else if (md) // unique member function
- {
- prefix+="()"; // only to show it is a function
- }
- QCString name;
- if (d->definitionType()==Definition::TypeClass)
- {
- name = convertToXML((dynamic_cast<ClassDef*>(d))->displayName());
- found = TRUE;
- }
- else if (d->definitionType()==Definition::TypeNamespace)
- {
- name = convertToXML((dynamic_cast<NamespaceDef*>(d))->displayName());
- found = TRUE;
- }
- else if (scope==0 || scope==Doxygen::globalScope) // in global scope
+ prefix+=convertToXML(md->argsString());
+ // show argument list to disambiguate overloaded functions
+ }
+ else if (md) // unique member function
+ {
+ prefix+="()"; // only to show it is a function
+ }
+ QCString name;
+ if (d->definitionType()==Definition::TypeClass)
+ {
+ name = convertToXML((toClassDef(d))->displayName());
+ found = TRUE;
+ }
+ else if (d->definitionType()==Definition::TypeNamespace)
+ {
+ name = convertToXML((toNamespaceDef(d))->displayName());
+ found = TRUE;
+ }
+ else if (scope==0 || scope==Doxygen::globalScope) // in global scope
+ {
+ if (md)
{
- if (md)
+ const FileDef *fd = md->getBodyDef();
+ if (fd==0) fd = md->resolveAlias()->getFileDef();
+ if (fd)
{
- const FileDef *fd = md->getBodyDef();
- if (fd==0) fd = md->resolveAlias()->getFileDef();
- if (fd)
- {
- if (!prefix.isEmpty()) prefix+=":&#160;";
- name = prefix + convertToXML(fd->localName());
- found = TRUE;
- }
+ if (!prefix.isEmpty()) prefix+=":&#160;";
+ name = prefix + convertToXML(fd->localName());
+ found = TRUE;
}
}
- else if (md && (md->resolveAlias()->getClassDef() || md->resolveAlias()->getNamespaceDef()))
- // member in class or namespace scope
- {
- SrcLangExt lang = md->getLanguage();
- name = convertToXML(d->getOuterScope()->qualifiedName())
- + getLanguageSpecificSeparator(lang) + prefix;
- found = TRUE;
- }
- else if (scope) // some thing else? -> show scope
- {
- name = prefix + convertToXML(scope->name());
- found = TRUE;
- }
- if (!found) // fallback
- {
- name = prefix + "("+theTranslator->trGlobalNamespace()+")";
- }
-
- ti << "'" << name << "'";
-
- prevScope = scope;
- childCount++;
}
+ else if (md && (md->resolveAlias()->getClassDef() || md->resolveAlias()->getNamespaceDef()))
+ // member in class or namespace scope
+ {
+ SrcLangExt lang = md->getLanguage();
+ name = convertToXML(d->getOuterScope()->qualifiedName())
+ + getLanguageSpecificSeparator(lang) + prefix;
+ found = TRUE;
+ }
+ else if (scope) // some thing else? -> show scope
+ {
+ name = prefix + convertToXML(scope->name());
+ found = TRUE;
+ }
+ if (!found) // fallback
+ {
+ name = prefix + "("+theTranslator->trGlobalNamespace()+")";
+ }
+
+ ti << "'" << name << "'";
- ti << "]]";
+ prevScope = scope;
+ childCount++;
}
- ti << "]";
- itemCount++;
+ lastName = sname;
}
if (!firstEntry)
{
- ti << endl;
+ ti << "]]]" << endl;
}
-
ti << "];" << endl;
-
}
else
{
err("Failed to open file '%s' for writing...\n",fileName.data());
}
+ p++;
}
}
@@ -1217,72 +1138,66 @@ void writeJavaScriptSearchIndex()
FTextStream t(&f);
t << "var indexSectionsWithContent =" << endl;
t << "{" << endl;
- bool first=TRUE;
int j=0;
- for (i=0;i<NUM_SEARCH_INDICES;i++)
+ for (const auto &sii : g_searchIndexInfo)
{
- if (g_searchIndexInfo[i].symbolList.count()>0)
+ if (!sii.symbolMap.empty())
{
- if (!first) t << "," << endl;
+ if (j>0) t << "," << endl;
t << " " << j << ": \"";
- SIntDict<SearchIndexList>::Iterator it(g_searchIndexInfo[i].symbolList);
- SearchIndexList *sl;
- for (it.toFirst();(sl=it.current());++it) // for each letter
+ for (const auto &kv : sii.symbolMap)
{
- if ( sl->letter() == '"' ) t << QString( QChar( '\\' ) ).utf8();
- t << QString( QChar( sl->letter() ) ).utf8();
+ if ( kv.first == "\"" ) t << "\\";
+ t << kv.first.c_str();
}
t << "\"";
- first=FALSE;
j++;
}
}
- if (!first) t << "\n";
+ if (j>0) t << "\n";
t << "};" << endl << endl;
t << "var indexSectionNames =" << endl;
t << "{" << endl;
- first=TRUE;
j=0;
- for (i=0;i<NUM_SEARCH_INDICES;i++)
+ for (const auto &sii : g_searchIndexInfo)
{
- if (g_searchIndexInfo[i].symbolList.count()>0)
+ if (!sii.symbolMap.empty())
{
- if (!first) t << "," << endl;
- t << " " << j << ": \"" << g_searchIndexInfo[i].name << "\"";
- first=FALSE;
+ if (j>0) t << "," << endl;
+ t << " " << j << ": \"" << sii.name << "\"";
j++;
}
}
- if (!first) t << "\n";
+ if (j>0) t << "\n";
t << "};" << endl << endl;
t << "var indexSectionLabels =" << endl;
t << "{" << endl;
- first=TRUE;
j=0;
- for (i=0;i<NUM_SEARCH_INDICES;i++)
+ for (const auto &sii : g_searchIndexInfo)
{
- if (g_searchIndexInfo[i].symbolList.count()>0)
+ if (!sii.symbolMap.empty())
{
- if (!first) t << "," << endl;
- t << " " << j << ": \"" << convertToXML(g_searchIndexInfo[i].text) << "\"";
- first=FALSE;
+ if (j>0) t << "," << endl;
+ t << " " << j << ": \"" << convertToXML(sii.getText()) << "\"";
j++;
}
}
- if (!first) t << "\n";
+ if (j>0) t << "\n";
t << "};" << endl << endl;
}
ResourceMgr::instance().copyResource("search.js",searchDirName);
}
+
{
- QFile f(searchDirName+"/nomatches.html");
+ QFile f(searchDirName+"/nomatches"+Doxygen::htmlFileExtension);
if (f.open(IO_WriteOnly))
{
FTextStream t(&f);
t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" "
"\"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
- t << "<html><head><title></title>" << endl;
+ t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">" << endl;
+ t << "<head><title></title>" << endl;
t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl;
t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl;
@@ -1299,53 +1214,23 @@ void writeJavaScriptSearchIndex()
Doxygen::indexList->addStyleSheetFile("search/search.js");
}
-const SearchIndexInfo *getSearchIndices()
+void SearchIndexInfo::add(const std::string &letter,const Definition *def)
{
- return g_searchIndexInfo;
-}
-
-//---------------------------------------------------------------------------------------------
-
-SearchIndexList::SearchIndexList(uint letter)
- : SDict< SearchDefinitionList >(17,FALSE), m_letter(letter)
-{
- setAutoDelete(TRUE);
-}
-
-SearchIndexList::~SearchIndexList()
-{
-}
-
-void SearchIndexList::append(const Definition *d)
-{
- QCString dispName = d->localName();
- SearchDefinitionList *l = find(dispName);
- if (l==0)
+ //printf("%p: %s->%s (full=%s)\n",this,letter.data(),searchName(def).data(),def->name().data());
+ auto it = symbolMap.find(letter);
+ if (it!=symbolMap.end())
{
- if (d->definitionType()==Definition::TypeGroup)
- {
- dispName = (dynamic_cast<const GroupDef*>(d))->groupTitle();
- }
- else if (d->definitionType()==Definition::TypePage)
- {
- dispName = (dynamic_cast<const PageDef*>(d))->title();
- }
- l=new SearchDefinitionList(searchId(dispName),dispName);
- SDict< SearchDefinitionList >::append(dispName,l);
+ it->second.push_back(def);
+ }
+ else
+ {
+ symbolMap.insert(std::make_pair(letter,std::vector<const Definition*>({def})));
}
- l->append(d);
-}
-
-uint SearchIndexList::letter() const
-{
- return m_letter;
}
-int SearchIndexList::compareValues(const SearchDefinitionList *md1, const SearchDefinitionList *md2) const
+const std::array<SearchIndexInfo,NUM_SEARCH_INDICES> &getSearchIndices()
{
- QCString n1 = md1->getFirst()->localName();
- QCString n2 = md2->getFirst()->localName();
- return qstricmp(n1.data(),n2.data());
+ return g_searchIndexInfo;
}
//---------------------------------------------------------------------------------------------
diff --git a/src/searchindex.h b/src/searchindex.h
index 923973c..9039f00 100644
--- a/src/searchindex.h
+++ b/src/searchindex.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -15,21 +13,20 @@
*
*/
-#ifndef _SEARCHINDEX_H
-#define _SEARCHINDEX_H
+#ifndef SEARCHINDEX_H
+#define SEARCHINDEX_H
+
+#include <memory>
+#include <vector>
+#include <map>
+#include <unordered_map>
+#include <string>
+#include <array>
+#include <functional>
-#include <qintdict.h>
-#include <qlist.h>
-#include <qdict.h>
-#include <qintdict.h>
-#include <qvector.h>
-#include "sortdict.h"
-#include "definition.h"
-#include "util.h"
+#include <qcstring.h>
-class FTextStream;
class Definition;
-class MemberDef;
/*! Initialize the search indexer */
void initSearchIndexer();
@@ -40,7 +37,7 @@ void finalizeSearchIndexer();
struct URL
{
- URL(const char *n,const char *u) : name(n), url(u) {}
+ URL(QCString n,QCString u) : name(n), url(u) {}
QCString name;
QCString url;
};
@@ -56,14 +53,15 @@ struct URLInfo
class IndexWord
{
public:
- IndexWord(const char *word);
+ using URLInfoMap = std::unordered_map<int,URLInfo>;
+ IndexWord(QCString word);
void addUrlIndex(int,bool);
- const QIntDict<URLInfo> &urls() const { return m_urls; }
+ URLInfoMap urls() const { return m_urls; }
QCString word() const { return m_word; }
private:
QCString m_word;
- QIntDict<URLInfo> m_urls;
+ URLInfoMap m_urls;
};
class SearchIndexIntf
@@ -84,16 +82,16 @@ class SearchIndex : public SearchIndexIntf
{
public:
SearchIndex();
- void setCurrentDoc(const Definition *ctx,const char *anchor,bool isSourceFile);
- void addWord(const char *word,bool hiPriority);
- void write(const char *file);
+ void setCurrentDoc(const Definition *ctx,const char *anchor,bool isSourceFile) override;
+ void addWord(const char *word,bool hiPriority) override;
+ void write(const char *file) override;
private:
void addWord(const char *word,bool hiPrio,bool recurse);
- QDict<IndexWord> m_words;
- QVector< QList<IndexWord> > m_index;
- QDict<int> m_url2IdMap;
- QIntDict<URL> m_urls;
- int m_urlIndex;
+ std::unordered_map<std::string,int> m_words;
+ std::vector< std::vector< IndexWord> > m_index;
+ std::unordered_map<std::string,int> m_url2IdMap;
+ std::map<int,URL> m_urls;
+ int m_urlIndex = -1;
};
@@ -102,71 +100,33 @@ class SearchIndexExternal : public SearchIndexIntf
struct Private;
public:
SearchIndexExternal();
- ~SearchIndexExternal();
void setCurrentDoc(const Definition *ctx,const char *anchor,bool isSourceFile);
void addWord(const char *word,bool hiPriority);
void write(const char *file);
private:
- Private *p;
+ std::unique_ptr<Private> p;
};
//------- client side search index ----------------------
-#define SEARCH_INDEX_ALL 0
-#define SEARCH_INDEX_CLASSES 1
-#define SEARCH_INDEX_INTERFACES 2
-#define SEARCH_INDEX_STRUCTS 3
-#define SEARCH_INDEX_EXCEPTIONS 4
-#define SEARCH_INDEX_NAMESPACES 5
-#define SEARCH_INDEX_FILES 6
-#define SEARCH_INDEX_FUNCTIONS 7
-#define SEARCH_INDEX_VARIABLES 8
-#define SEARCH_INDEX_TYPEDEFS 9
-#define SEARCH_INDEX_SEQUENCES 10
-#define SEARCH_INDEX_DICTIONARIES 11
-#define SEARCH_INDEX_ENUMS 12
-#define SEARCH_INDEX_ENUMVALUES 13
-#define SEARCH_INDEX_PROPERTIES 14
-#define SEARCH_INDEX_EVENTS 15
-#define SEARCH_INDEX_RELATED 16
-#define SEARCH_INDEX_DEFINES 17
-#define SEARCH_INDEX_GROUPS 18
-#define SEARCH_INDEX_PAGES 19
-#define NUM_SEARCH_INDICES 20
-
-class SearchDefinitionList : public QList<Definition>
-{
- public:
- SearchDefinitionList(const QCString &id,const QCString &name) : m_id(id), m_name(name) {}
- QCString id() const { return m_id; }
- QCString name() const { return m_name; }
- private:
- QCString m_id;
- QCString m_name;
-};
+#define NUM_SEARCH_INDICES 20
-class SearchIndexList : public SDict< SearchDefinitionList >
-{
- public:
- typedef const Definition ElementType;
- SearchIndexList(uint letter);
- ~SearchIndexList();
- void append(const Definition *d);
- uint letter() const;
- private:
- int compareValues(const SearchDefinitionList *md1, const SearchDefinitionList *md2) const;
- uint m_letter;
-};
+QCString searchId(const Definition *d);
+QCString searchName(const Definition *d);
+
+using SearchIndexList = std::vector<const Definition *>;
+using SearchIndexMap = std::map<std::string,SearchIndexList>;
struct SearchIndexInfo
{
- LetterToIndexMap<SearchIndexList> symbolList;
+ void add(const std::string &letter,const Definition *def);
QCString name;
- QCString text;
+ std::function<QCString()> getText;
+ SearchIndexMap symbolMap;
};
void createJavaScriptSearchIndex();
void writeJavaScriptSearchIndex();
-const SearchIndexInfo *getSearchIndices();
+const std::array<SearchIndexInfo,NUM_SEARCH_INDICES> &getSearchIndices();
#endif
diff --git a/src/section.h b/src/section.h
index 9e6c695..74eb04b 100644
--- a/src/section.h
+++ b/src/section.h
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,42 +16,144 @@
#ifndef SECTION_H
#define SECTION_H
-#include "sortdict.h"
+#include <string>
+#include <unordered_map>
+
+#include <qcstring.h>
+
+#include "linkedmap.h"
class Definition;
-/** Class representing a section in a page */
-struct SectionInfo
+//! enum representing the various types of sections and entities that can be referred to.
+enum class SectionType
{
- enum SectionType { Page = 0,
- Section = 1,
- Subsection = 2,
- Subsubsection = 3,
- Paragraph = 4,
- Anchor = 5,
- Table = 6
- };
- SectionInfo(const char *f,const int lin,const char *l,const char *t,
- SectionType st,int lev,const char *r=0) :
- label(l), title(t), type(st), ref(r), definition(0),
- fileName(f), lineNr(lin), generated(FALSE), level(lev) {}
- QCString label;
- QCString title;
- SectionType type;
- QCString ref;
- Definition *definition;
- QCString fileName;
- int lineNr;
- bool generated;
- int level;
+ Page = 0,
+ Section = 1,
+ Subsection = 2,
+ Subsubsection = 3,
+ Paragraph = 4,
+ Anchor = 5,
+ Table = 6
};
-/** Unsorted dictionary of SectionInfo objects. */
-class SectionDict : public SDict<SectionInfo>
+//! return true if type is a section, and false if it is a page, anchor or table.
+inline constexpr bool isSection(SectionType type)
+{
+ return (type==SectionType::Section ||
+ type==SectionType::Subsection ||
+ type==SectionType::Subsubsection ||
+ type==SectionType::Paragraph);
+}
+
+//! class that provide information about a section.
+class SectionInfo
{
public:
- SectionDict(int size) : SDict<SectionInfo>(size) {}
- ~SectionDict() {}
+ SectionInfo(const char *label, const char *fileName, int lineNr,
+ const char *title, SectionType type, int level,const char *ref) :
+ m_label(label), m_title(title), m_type(type), m_ref(ref),
+ m_lineNr(lineNr), m_fileName(fileName), m_level(level)
+ {
+ //printf("SectionInfo(%p)\n",this);
+ }
+ ~SectionInfo()
+ {
+ //printf("~SectionInfo(%p)\n",this);
+ }
+
+ // getters
+ QCString label() const { return m_label; }
+ QCString title() const { return m_title; }
+ SectionType type() const { return m_type; }
+ QCString ref() const { return m_ref; }
+ int lineNr() const { return m_lineNr; }
+ QCString fileName() const { return m_fileName; }
+ bool generated() const { return m_generated; }
+ int level() const { return m_level; }
+ Definition *definition() const { return m_definition; }
+
+ // setters
+ void setFileName(const char *fn) { m_fileName = fn; }
+ void setType(SectionType t) { m_type = t; }
+ void setGenerated(bool b) { m_generated = b; }
+ void setDefinition(Definition *d) { m_definition = d; }
+
+ private:
+ QCString m_label;
+ QCString m_title;
+ SectionType m_type;
+ QCString m_ref;
+ int m_lineNr;
+ QCString m_fileName;
+ bool m_generated = false;
+ int m_level;
+ Definition *m_definition = 0;
};
+//! class that represents a list of constant references to sections.
+class SectionRefs
+{
+ using SectionInfoVec = std::vector<const SectionInfo*>;
+ public:
+ using const_iterator = SectionInfoVec::const_iterator;
+
+ //! Returns a constant pointer to the section info given a section label or nullptr
+ //! if no section with the given label can be found.
+ const SectionInfo *find(const char *label) const
+ {
+ auto it = m_lookup.find(label);
+ return it!=m_lookup.end() ? it->second : nullptr;
+ }
+
+ //! Adds a non-owning section reference.
+ void add(const SectionInfo *si)
+ {
+ m_lookup.insert({toStdString(si->label()),si});
+ m_entries.push_back(si);
+ }
+
+ const_iterator begin() const { return m_entries.cbegin(); }
+ const_iterator end() const { return m_entries.cend(); }
+ bool empty() const { return m_entries.empty(); }
+ size_t size() const { return m_entries.size(); }
+
+ private:
+ SectionInfoVec m_entries;
+ std::unordered_map< std::string, const SectionInfo* > m_lookup;
+};
+
+//! singleton class that owns the list of all sections
+class SectionManager : public LinkedMap<SectionInfo>
+{
+ public:
+ //! Add a new section given the data of an existing section.
+ //! Returns a non-owning pointer to the newly added section.
+ SectionInfo *add(const SectionInfo &si)
+ {
+ return LinkedMap<SectionInfo>::add(si.label(),si.fileName(),si.lineNr(),si.title(),si.type(),si.level(),si.ref());
+ }
+
+ //! Add a new section
+ //! Return a non-owning pointer to the newly added section
+ SectionInfo *add(const char *label, const char *fileName, int lineNr,
+ const char *title, SectionType type, int level,const char *ref=0)
+ {
+ return LinkedMap<SectionInfo>::add(label,fileName,lineNr,title,type,level,ref);
+ }
+
+ //! returns a reference to the singleton
+ static SectionManager &instance()
+ {
+ static SectionManager sm;
+ return sm;
+ }
+
+ private:
+ SectionManager() {}
+ SectionManager(const SectionManager &other) = delete;
+ SectionManager &operator=(const SectionManager &other) = delete;
+};
+
+
#endif
diff --git a/src/sortdict.h b/src/sortdict.h
index 203ae5e..907cb78 100644
--- a/src/sortdict.h
+++ b/src/sortdict.h
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -26,7 +26,7 @@
#define AUTORESIZE 1
#if AUTORESIZE
-const uint SDict_primes[] =
+const uint SDict_primes[] =
{
17,
29,
@@ -71,10 +71,9 @@ const uint SDict_primes[] =
#endif
template<class T> class SDict;
-template<class T> class SIntDict;
-/** internal wrapper class that redirects compareValues() to the
- * dictionary
+/** internal wrapper class that redirects compareValues() to the
+ * dictionary
*/
template<class T>
class SList : public QList<T>
@@ -87,20 +86,20 @@ class SList : public QList<T>
return m_owner->compareValues(item1,item2);
}
private:
- SDict<T> *m_owner;
+ SDict<T> *m_owner;
};
-/** Ordered dictionary of elements of type T.
+/** Ordered dictionary of elements of type T.
* Internally uses a QList<T> and a QDict<T>.
*/
template<class T>
-class SDict
+class SDict
{
private:
SList<T> *m_list;
QDict<T> *m_dict;
- int m_sizeIndex;
-
+ uint m_sizeIndex;
+
public:
/*! Create an ordered dictionary.
* \param size The size of the dictionary. Should be a prime number for
@@ -108,7 +107,7 @@ class SDict
* \param caseSensitive indicated whether the keys should be sorted
* in a case sensitive way.
*/
- SDict(int size=17,bool caseSensitive=TRUE) : m_sizeIndex(0)
+ SDict(uint size=17,bool caseSensitive=TRUE) : m_sizeIndex(0)
{
m_list = new SList<T>(this);
#if AUTORESIZE
@@ -120,7 +119,7 @@ class SDict
}
/*! Destroys the dictionary */
- virtual ~SDict()
+ virtual ~SDict()
{
delete m_list;
delete m_dict;
@@ -182,7 +181,7 @@ class SDict
}
/*! Sorts the members of the dictionary. First appending a number
- * of members and then sorting them is faster (O(NlogN) than using
+ * of members and then sorting them is faster (O(NlogN) than using
* inSort() for each member (O(N^2)).
*/
void sort()
@@ -224,10 +223,10 @@ class SDict
m_list->setAutoDelete(val);
}
- /*! Looks up a compound given its key.
+ /*! Looks up a compound given its key.
* \param key The key to identify this element.
* \return The requested compound or zero if it cannot be found.
- * \sa append()
+ * \sa append()
*/
T *find(const char *key)
{
@@ -274,10 +273,10 @@ class SDict
m_list->clear();
m_dict->clear();
}
-
+
/*! Returns the number of items stored in the dictionary
*/
- int count() const
+ uint count() const
{
return m_list->count();
}
@@ -302,16 +301,16 @@ class SDict
delete m_li;
}
- /*! Set the iterator to the first element in the list.
- * \return The first compound, or zero if the list was empty.
+ /*! Set the iterator to the first element in the list.
+ * \return The first compound, or zero if the list was empty.
*/
T *toFirst() const
{
return m_li->toFirst();
}
- /*! Set the iterator to the last element in the list.
- * \return The first compound, or zero if the list was empty.
+ /*! Set the iterator to the last element in the list.
+ * \return The first compound, or zero if the list was empty.
*/
T *toLast() const
{
@@ -323,7 +322,7 @@ class SDict
{
return m_li->current();
}
-
+
/*! Moves the iterator to the next element.
* \return the new "current" element, or zero if the iterator was
* already pointing at the last element.
@@ -366,16 +365,16 @@ class SDict
delete m_di;
}
- /*! Set the iterator to the first element in the list.
- * \return The first compound, or zero if the list was empty.
+ /*! Set the iterator to the first element in the list.
+ * \return The first compound, or zero if the list was empty.
*/
T *toFirst() const
{
return m_di->toFirst();
}
- /*! Set the iterator to the last element in the list.
- * \return The first compound, or zero if the list was empty.
+ /*! Set the iterator to the last element in the list.
+ * \return The first compound, or zero if the list was empty.
*/
T *toLast() const
{
@@ -387,322 +386,13 @@ class SDict
{
return m_di->current();
}
-
+
/*! Returns the current key */
QCString currentKey() const
{
return m_di->currentKey();
}
-
- /*! Moves the iterator to the next element.
- * \return the new "current" element, or zero if the iterator was
- * already pointing at the last element.
- */
- T *operator++()
- {
- return m_di->operator++();
- }
-
- /*! Moves the iterator to the previous element.
- * \return the new "current" element, or zero if the iterator was
- * already pointing at the first element.
- */
- T *operator--()
- {
- return m_di->operator--();
- }
-
- private:
- QDictIterator<T> *m_di;
- };
-};
-
-/** internal wrapper class that redirects compareValues() to the
- * dictionary
- */
-template<class T>
-class SIntList : public QList<T>
-{
- public:
- SIntList(SIntDict<T> *owner) : m_owner(owner) {}
- virtual ~SIntList() {}
- private:
- int compareValues(const T *item1,const T *item2) const
- {
- return m_owner->compareValues(item1,item2);
- }
- SIntDict<T> *m_owner;
-};
-
-/** Ordered dictionary of elements of type T.
- * Internally uses a QList<T> and a QIntDict<T>.
- */
-template<class T>
-class SIntDict
-{
- private:
- SIntList<T> *m_list;
- QIntDict<T> *m_dict;
- int m_sizeIndex;
-
- public:
- /*! Create an ordered dictionary.
- * \param size The size of the dictionary. Should be a prime number for
- * best distribution of elements.
- */
- SIntDict(int size=17) : m_sizeIndex(0)
- {
- m_list = new SIntList<T>(this);
-#if AUTORESIZE
- while ((uint)size>SDict_primes[m_sizeIndex]) m_sizeIndex++;
- m_dict = new QIntDict<T>(SDict_primes[m_sizeIndex]);
-#else
- m_dict = new QIntDict<T>(size);
-#endif
- }
-
- /*! Destroys the dictionary */
- virtual ~SIntDict()
- {
- delete m_list;
- delete m_dict;
- }
-
- /*! Appends a compound to the dictionary. The element is owned by the
- * dictionary.
- * \param key The unique key to use to quickly find the item later on.
- * \param d The compound to add.
- * \sa find()
- */
- void append(int key,const T *d)
- {
- m_list->append(d);
- m_dict->insert(key,d);
-#if AUTORESIZE
- if (m_dict->size()>SDict_primes[m_sizeIndex])
- {
- m_dict->resize(SDict_primes[++m_sizeIndex]);
- }
-#endif
- }
-
- /*! Prepend a compound to the dictionary. The element is owned by the
- * dictionary.
- * \param key The unique key to use to quickly find the item later on.
- * \param d The compound to add.
- * \sa find()
- */
- void prepend(int key,const T *d)
- {
- m_list->prepend(d);
- m_dict->insert(key,d);
-#if AUTORESIZE
- if (m_dict->size()>SDict_primes[m_sizeIndex])
- {
- m_dict->resize(SDict_primes[++m_sizeIndex]);
- }
-#endif
- }
-
- /*! Remove an item from the dictionary */
- bool remove(int key)
- {
- T *item = m_dict->take(key);
- return item ? m_list->remove(item) : FALSE;
- }
-
- /*! Sorts the members of the dictionary. First appending a number
- * of members and then sorting them is faster (O(NlogN) than using
- * inSort() for each member (O(N^2)).
- */
- void sort()
- {
- m_list->sort();
- }
-
- /*! Inserts a compound into the dictionary in a sorted way.
- * \param key The unique key to use to quickly find the item later on.
- * \param d The compound to add.
- * \sa find()
- */
- void inSort(int key,const T *d)
- {
- m_list->inSort(d);
- m_dict->insert(key,d);
-#if AUTORESIZE
- if (m_dict->size()>SDict_primes[m_sizeIndex])
- {
- m_dict->resize(SDict_primes[++m_sizeIndex]);
- }
-#endif
- }
-
- /*! Indicates whether or not the dictionary owns its elements */
- void setAutoDelete(bool val)
- {
- m_list->setAutoDelete(val);
- }
-
- /*! Looks up a compound given its key.
- * \param key The key to identify this element.
- * \return The requested compound or zero if it cannot be found.
- * \sa append()
- */
- T *find(int key)
- {
- return m_dict->find(key);
- }
-
- /*! Equivalent to find(). */
- T *operator[](int key) const
- {
- return m_dict->find(key);
- }
-
- /*! Returns the item at position \a i in the sorted dictionary */
- T *at(uint i)
- {
- return m_list->at(i);
- }
-
- /*! Function that is used to compare two items when sorting.
- * Overload this to properly sort items.
- * \sa inSort()
- */
- virtual int compareValues(const T *item1,const T *item2) const
- {
- return item1!=item2;
- }
-
- /*! Clears the dictionary. Will delete items if setAutoDelete() was
- * set to \c TRUE.
- * \sa setAutoDelete
- */
- void clear()
- {
- m_list->clear();
- m_dict->clear();
- }
-
- /*! Returns the number of items stored in the dictionary
- */
- int count() const
- {
- return m_list->count();
- }
-
- class Iterator; // first forward declare
- friend class Iterator; // then make it a friend
- /*! Simple iterator for SDict. It iterates in the order in which the
- * elements are stored.
- */
- class Iterator
- {
- public:
- /*! Create an iterator given the dictionary. */
- Iterator(const SIntDict<T> &dict)
- {
- m_li = new QListIterator<T>(*dict.m_list);
- }
-
- /*! Destroys the dictionary */
- virtual ~Iterator()
- {
- delete m_li;
- }
-
- /*! Set the iterator to the first element in the list.
- * \return The first compound, or zero if the list was empty.
- */
- T *toFirst() const
- {
- return m_li->toFirst();
- }
-
- /*! Set the iterator to the last element in the list.
- * \return The first compound, or zero if the list was empty.
- */
- T *toLast() const
- {
- return m_li->toLast();
- }
-
- /*! Returns the current compound */
- T *current() const
- {
- return m_li->current();
- }
-
- /*! Moves the iterator to the next element.
- * \return the new "current" element, or zero if the iterator was
- * already pointing at the last element.
- */
- T *operator++()
- {
- return m_li->operator++();
- }
-
- /*! Moves the iterator to the previous element.
- * \return the new "current" element, or zero if the iterator was
- * already pointing at the first element.
- */
- T *operator--()
- {
- return m_li->operator--();
- }
-
- private:
- QListIterator<T> *m_li;
- };
-
- class IteratorDict; // first forward declare
- friend class IteratorDict; // then make it a friend
- /*! Simple iterator for SDict. It iterates over the dictionary elements
- * in an unsorted way, but does provide information about the element's key.
- */
- class IteratorDict
- {
- public:
- /*! Create an iterator given the dictionary. */
- IteratorDict(const SIntDict<T> &dict)
- {
- m_di = new QIntDictIterator<T>(*dict.m_dict);
- }
- /*! Destroys the dictionary */
- virtual ~IteratorDict()
- {
- delete m_di;
- }
-
- /*! Set the iterator to the first element in the list.
- * \return The first compound, or zero if the list was empty.
- */
- T *toFirst() const
- {
- return m_di->toFirst();
- }
-
- /*! Set the iterator to the last element in the list.
- * \return The first compound, or zero if the list was empty.
- */
- T *toLast() const
- {
- return m_di->toLast();
- }
-
- /*! Returns the current compound */
- T *current() const
- {
- return m_di->current();
- }
-
- /*! Returns the current key */
- int currentKey() const
- {
- return m_di->currentKey();
- }
-
/*! Moves the iterator to the next element.
* \return the new "current" element, or zero if the iterator was
* already pointing at the last element.
@@ -724,7 +414,7 @@ class SIntDict
private:
QDictIterator<T> *m_di;
};
-
};
+
#endif
diff --git a/src/sqlcode.h b/src/sqlcode.h
index 20e20f7..aa465d7 100644
--- a/src/sqlcode.h
+++ b/src/sqlcode.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2014 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -32,6 +30,8 @@ class Definition;
class SQLCodeParser : public CodeParserInterface
{
public:
+ SQLCodeParser();
+ virtual ~SQLCodeParser();
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
const QCString &input,
@@ -48,6 +48,9 @@ class SQLCodeParser : public CodeParserInterface
bool collectXRefs=TRUE
);
void resetCodeParserState();
+ private:
+ struct Private;
+ std::unique_ptr<Private> p;
};
diff --git a/src/sqlcode.l b/src/sqlcode.l
index 02c2c14..74318bb 100644
--- a/src/sqlcode.l
+++ b/src/sqlcode.l
@@ -1,10 +1,10 @@
/******************************************************************************
*
- * Copyright (C) 1997-2014 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,6 +19,9 @@
%option nounput
%option reentrant
%option extra-type="struct sqlcodeYY_state *"
+%top{
+#include <stdint.h>
+}
%{
@@ -41,11 +44,13 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
+#define USE_STATE2STRING 0
+
struct sqlcodeYY_state
{
CodeOutputInterface * code;
const char *inputString; //!< the code fragment as text
- int inputPosition; //!< read offset during parsing
+ yy_size_t inputPosition; //!< read offset during parsing
int inputLines; //!< number of line in the code fragment
int yyLineNr; //!< current line number
bool needsTermination;
@@ -55,27 +60,29 @@ struct sqlcodeYY_state
QCString exampleName;
QCString classScope;
- FileDef *sourceFileDef;
- Definition *currentDefinition;
- MemberDef *currentMemberDef;
+ const FileDef *sourceFileDef;
+ const Definition *currentDefinition;
+ const MemberDef *currentMemberDef;
bool includeCodeFragment;
const char *currentFontClass;
};
-static void codify(const char* text);
+#if USE_STATE2STRING
static const char *stateToString(int state);
-static void setCurrentDoc(const QCString &anchor,yyscan_t yyscanner);
+#endif
+
+static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor);
static void startCodeLine(yyscan_t yyscanner);
static void endFontClass(yyscan_t yyscanner);
static void endCodeLine(yyscan_t yyscanner);
static void nextCodeLine(yyscan_t yyscanner);
-static void codifyLines(char *text,yyscan_t yyscanner);
-static void startFontClass(const char *s,yyscan_t yyscanner);
+static void codifyLines(yyscan_t yyscanner,const char *text);
+static void startFontClass(yyscan_t yyscanner,const char *s);
static int countLines(yyscan_t yyscanner);
-static int yyread(char *buf,int max_size,yyscan_t yyscanner);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size,yyscanner);
+#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
%}
@@ -103,7 +110,7 @@ typekeyword (?i:"ARRAY"|"BIGINT"|"BINARY"|"BLOB"|"BOOLEAN"|"CHAR"|"CHARACTER
flowkeyword (?i:"CASE"|"IF"|"ELSE"|"BEGIN"|"END"|"WHILE")
-literalkeyword (?i:"FALSE"|"TRUE"|"NULL"|"UNKNOWN")
+literalkeyword (?i:"false"|"true"|"NULL"|"UNKNOWN")
stringliteral (\"[^"]*\")|('[^']*')
number [0-9]+
literals ({literalkeyword}|{stringliteral}|{number})
@@ -119,110 +126,107 @@ commentclose "\*/"
%%
{literals} {
- startFontClass("stringliteral",yyscanner);
- codifyLines(yytext,yyscanner);
+ startFontClass(yyscanner,"stringliteral");
+ codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
}
-
+
{keyword} {
- startFontClass("keyword",yyscanner);
- codifyLines(yytext,yyscanner);
+ startFontClass(yyscanner,"keyword");
+ codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
}
{flowkeyword} {
- startFontClass("keywordflow",yyscanner);
- codifyLines(yytext,yyscanner);
+ startFontClass(yyscanner,"keywordflow");
+ codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
}
{typekeyword} {
- startFontClass("keywordtype",yyscanner);
- codifyLines(yytext,yyscanner);
+ startFontClass(yyscanner,"keywordtype");
+ codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
}
{variable} {
- startFontClass("preprocessor",yyscanner);
- codifyLines(yytext,yyscanner);
+ startFontClass(yyscanner,"preprocessor");
+ codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
}
{simplecomment} {
- startFontClass("comment",yyscanner);
- codifyLines(yytext,yyscanner);
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
}
{commentopen} {
- startFontClass("comment",yyscanner);
- codifyLines(yytext,yyscanner);
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
BEGIN(COMMENT);
}
<COMMENT>. {
- codifyLines(yytext,yyscanner);
-
+ codifyLines(yyscanner,yytext);
+
}
<COMMENT>{nl} {
- codifyLines(yytext,yyscanner);
+ codifyLines(yyscanner,yytext);
}
<COMMENT>{commentclose} {
- codifyLines(yytext,yyscanner);
+ codifyLines(yyscanner,yytext);
endFontClass(yyscanner);
BEGIN(INITIAL);
}
-
+
{idchar} {
- codifyLines(yytext,yyscanner);
+ codifyLines(yyscanner,yytext);
}
{nl} {
- codifyLines(yytext,yyscanner);
+ codifyLines(yyscanner,yytext);
}
+[\x80-\xFF]* { // keep utf8 characters together...
+ codifyLines(yyscanner,yytext);
+ }
. {
- codifyLines(yytext,yyscanner);
+ codifyLines(yyscanner,yytext);
}
%%
-static void codify(const char* text, yyscan_t yyscanner)
-{
- struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- yyextra->code->codify(text);
-}
-
-static void setCurrentDoc(const QCString &anchor, yyscan_t yyscanner)
+static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
if (yyextra->searchCtx)
{
- Doxygen::searchIndex->setCurrentDoc(yyextra->searchCtx,yyextra->searchCtx->anchor(),FALSE);
+ yyextra->code->setCurrentDoc(yyextra->searchCtx,yyextra->searchCtx->anchor(),false);
}
else
{
- Doxygen::searchIndex->setCurrentDoc(yyextra->sourceFileDef,anchor,TRUE);
+ yyextra->code->setCurrentDoc(yyextra->sourceFileDef,anchor,true);
}
}
}
/*! start a new line of code, inserting a line number if yyextra->sourceFileDef
- * is TRUE. If a definition starts at the current line, then the line
+ * is true. If a definition starts at the current line, then the line
* number is linked to the documentation of that definition.
*/
static void startCodeLine(yyscan_t yyscanner)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (yyextra->sourceFileDef)
- {
- Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr);
-
+ {
+ const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr);
+
if (!yyextra->includeCodeFragment && d && d->isLinkableInProject())
{
yyextra->currentDefinition = d;
@@ -235,14 +239,14 @@ static void startCodeLine(yyscan_t yyscanner)
yyextra->code->writeLineNumber(yyextra->currentMemberDef->getReference(),
yyextra->currentMemberDef->getOutputFileBase(),
yyextra->currentMemberDef->anchor(),yyextra->yyLineNr);
- setCurrentDoc(lineAnchor,yyscanner);
+ setCurrentDoc(yyscanner,lineAnchor);
}
else
{
yyextra->code->writeLineNumber(d->getReference(),
d->getOutputFileBase(),
0,yyextra->yyLineNr);
- setCurrentDoc(lineAnchor,yyscanner);
+ setCurrentDoc(yyscanner,lineAnchor);
}
}
else
@@ -250,9 +254,9 @@ static void startCodeLine(yyscan_t yyscanner)
yyextra->code->writeLineNumber(0,0,0,yyextra->yyLineNr);
}
}
-
+
yyextra->code->startCodeLine(yyextra->sourceFileDef);
-
+
if (yyextra->currentFontClass)
{
yyextra->code->startFontClass(yyextra->currentFontClass);
@@ -281,42 +285,43 @@ static void nextCodeLine(yyscan_t yyscanner)
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
const char *fc = yyextra->currentFontClass;
endCodeLine(yyscanner);
- if (yyextra->yyLineNr<yyextra->inputLines)
+ if (yyextra->yyLineNr<yyextra->inputLines)
{
yyextra->currentFontClass = fc;
startCodeLine(yyscanner);
}
}
-static void codifyLines(char *text,yyscan_t yyscanner)
+static void codifyLines(yyscan_t yyscanner,const char *text)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- char *p=text,*sp=p;
+ const char *p=text,*sp=p;
char c;
- bool done=FALSE;
-
+ bool done=false;
while (!done)
{
sp=p;
-
while ((c=*p++) && c!='\n') { }
-
if (c=='\n')
{
yyextra->yyLineNr++;
- *(p-1)='\0';
- yyextra->code->codify(sp);
+ int l = (int)(p-sp-1);
+ char *tmp = (char*)malloc(l+1);
+ memcpy(tmp,sp,l);
+ tmp[l]='\0';
+ yyextra->code->codify(tmp);
+ free(tmp);
nextCodeLine(yyscanner);
}
else
{
yyextra->code->codify(sp);
- done=TRUE;
+ done=true;
}
}
}
-static void startFontClass(const char *s,yyscan_t yyscanner)
+static void startFontClass(yyscan_t yyscanner,const char *s)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
endFontClass(yyscanner);
@@ -331,103 +336,128 @@ static int countLines(yyscan_t yyscanner)
const char *p=yyextra->inputString;
char c;
int count=1;
- while ((c=*p))
- {
- p++ ;
- if (c=='\n') count++;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
}
- if (p>yyextra->inputString && *(p-1)!='\n')
+ if (p>yyextra->inputString && *(p-1)!='\n')
{ // last line does not end with a \n, so we add an extra
// line and explicitly terminate the line after parsing.
- count++,
- yyextra->needsTermination=TRUE;
- }
+ count++,
+ yyextra->needsTermination=true;
+ }
return count;
}
-static int yyread(char *buf,int max_size,yyscan_t yyscanner)
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- int c=0;
- while( c < max_size && yyextra->inputString[yyextra->inputPosition] )
+ yy_size_t inputPosition = yyextra->inputPosition;
+ const char *s = yyextra->inputString + inputPosition;
+ yy_size_t c=0;
+ while( c < max_size && *s )
{
- *buf = yyextra->inputString[yyextra->inputPosition++] ;
- c++; buf++;
+ *buf++ = *s++;
+ c++;
}
+ yyextra->inputPosition += c;
return c;
}
// public interface -----------------------------------------------------------
-static yyscan_t yyscanner;
-static struct sqlcodeYY_state sqlcode_extra;
-
-void parseSqlCode(
- CodeOutputInterface &od,
- const char * /*className*/,
- const QCString &s,
- bool exBlock,
- const char *exName,
- FileDef *fd,
- int startLine,
- int endLine,
- bool inlineFragment,
- const MemberDef *,
- bool,const Definition *searchCtx,
- bool /*collectXRefs*/
- )
-{
- if (s.isEmpty()) return;
-
- sqlcodeYYlex_init_extra(&sqlcode_extra, &yyscanner);
- struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+struct SQLCodeParser::Private
+{
+ yyscan_t yyscanner;
+ sqlcodeYY_state state;
+};
+
+SQLCodeParser::SQLCodeParser() : p(std::make_unique<Private>())
+{
+ sqlcodeYYlex_init_extra(&p->state, &p->yyscanner);
#ifdef FLEX_DEBUG
sqlcodeYYset_debug(1,yyscanner);
#endif
+ resetCodeParserState();
+}
+
+SQLCodeParser::~SQLCodeParser()
+{
+ sqlcodeYYlex_destroy(p->yyscanner);
+}
+
+void SQLCodeParser::resetCodeParserState()
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->currentDefinition = 0;
+ yyextra->currentMemberDef = 0;
+}
+
+void SQLCodeParser::parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ SrcLangExt,
+ bool isExampleBlock,
+ const char *exampleName,
+ FileDef *fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ const MemberDef *memberDef,
+ bool showLineNumbers,
+ const Definition *searchCtx,
+ bool collectXRefs
+ )
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
-
- yyextra->code = &od;
- yyextra->inputString = s;
+ if (input.isEmpty()) return;
+
+ printlex(yy_flex_debug, true, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
+
+ yyextra->code = &codeOutIntf;
+ yyextra->inputString = input;
yyextra->inputPosition = 0;
yyextra->currentFontClass = 0;
- yyextra->needsTermination = FALSE;
+ yyextra->needsTermination = false;
yyextra->searchCtx=searchCtx;
-
+
if (startLine!=-1)
yyextra->yyLineNr = startLine;
else
yyextra->yyLineNr = 1;
-
+
if (endLine!=-1)
yyextra->inputLines = endLine+1;
else
yyextra->inputLines = yyextra->yyLineNr + countLines(yyscanner) - 1;
-
- yyextra->exampleBlock = exBlock;
- yyextra->exampleName = exName;
- yyextra->sourceFileDef = fd;
-
- bool cleanupSourceDef = FALSE;
-
- if (exBlock && fd==0)
+
+ yyextra->exampleBlock = isExampleBlock;
+ yyextra->exampleName = exampleName;
+ yyextra->sourceFileDef = fileDef;
+
+ bool cleanupSourceDef = false;
+
+ if (isExampleBlock && fileDef==0)
{
// create a dummy filedef for the example
- yyextra->sourceFileDef = createFileDef("",(exName?exName:"generated"));
- cleanupSourceDef = TRUE;
+ yyextra->sourceFileDef = createFileDef("",(exampleName?exampleName:"generated"));
+ cleanupSourceDef = true;
}
-
- if (yyextra->sourceFileDef)
+
+ if (yyextra->sourceFileDef)
{
- setCurrentDoc("l00001",yyscanner);
+ setCurrentDoc(yyscanner,"l00001");
}
yyextra->includeCodeFragment = inlineFragment;
- // Starts line 1 on the output
+ // Starts line 1 on the output
startCodeLine(yyscanner);
- sqlcodeYYrestart( yyin,yyscanner );
+ sqlcodeYYrestart( 0, yyscanner );
sqlcodeYYlex(yyscanner);
@@ -441,47 +471,12 @@ void parseSqlCode(
delete yyextra->sourceFileDef;
yyextra->sourceFileDef=0;
}
-
- printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
- sqlcodeYYlex_destroy(yyscanner);
- return;
-}
-void resetSqlCodeParserState()
-{
- struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- yyextra->currentDefinition = 0;
- yyextra->currentMemberDef = 0;
-}
-
-//---------------------------------------------------------------------------------
-
-void SQLCodeParser::parseCode(CodeOutputInterface &codeOutIntf,
- const char *scopeName,
- const QCString &input,
- SrcLangExt,
- bool isExampleBlock,
- const char *exampleName,
- FileDef *fileDef,
- int startLine,
- int endLine,
- bool inlineFragment,
- const MemberDef *memberDef,
- bool showLineNumbers,
- const Definition *searchCtx,
- bool collectXRefs
- )
-{
- parseSqlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
- fileDef,startLine,endLine,inlineFragment,memberDef,
- showLineNumbers,searchCtx,collectXRefs);
-}
-
-void SQLCodeParser::resetCodeParserState()
-{
- resetSqlCodeParserState();
+ printlex(yy_flex_debug, false, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
}
//---------------------------------------------------------------------------------
+#if USE_STATE2STRING
#include "sqlcode.l.h"
+#endif
diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp
index 14a73d8..67adebf 100644
--- a/src/sqlite3gen.cpp
+++ b/src/sqlite3gen.cpp
@@ -501,9 +501,9 @@ const char * table_schema[][2] = {
//////////////////////////////////////////////////////
struct SqlStmt {
- const char *query;
- sqlite3_stmt *stmt;
- sqlite3 *db;
+ const char *query = 0;
+ sqlite3_stmt *stmt = 0;
+ sqlite3 *db = 0;
};
//////////////////////////////////////////////////////
/* If you add a new statement below, make sure to add it to
@@ -854,16 +854,16 @@ class TextGeneratorSqlite3Impl : public TextGeneratorIntf
};
-static bool bindTextParameter(SqlStmt &s,const char *name,const char *value, bool _static=TRUE)
+static bool bindTextParameter(SqlStmt &s,const char *name,const char *value, bool _static=FALSE)
{
int idx = sqlite3_bind_parameter_index(s.stmt, name);
if (idx==0) {
- msg("sqlite3_bind_parameter_index(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
+ err("sqlite3_bind_parameter_index(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
return false;
}
int rv = sqlite3_bind_text(s.stmt, idx, value, -1, _static==TRUE?SQLITE_STATIC:SQLITE_TRANSIENT);
if (rv!=SQLITE_OK) {
- msg("sqlite3_bind_text(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
+ err("sqlite3_bind_text(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
return false;
}
return true;
@@ -873,12 +873,12 @@ static bool bindIntParameter(SqlStmt &s,const char *name,int value)
{
int idx = sqlite3_bind_parameter_index(s.stmt, name);
if (idx==0) {
- msg("sqlite3_bind_parameter_index(%s)[%s] failed to find column: %s\n", name, s.query, sqlite3_errmsg(s.db));
+ err("sqlite3_bind_parameter_index(%s)[%s] failed to find column: %s\n", name, s.query, sqlite3_errmsg(s.db));
return false;
}
int rv = sqlite3_bind_int(s.stmt, idx, value);
if (rv!=SQLITE_OK) {
- msg("sqlite3_bind_int(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
+ err("sqlite3_bind_int(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
return false;
}
return true;
@@ -909,11 +909,11 @@ static int insertPath(QCString name, bool local=TRUE, bool found=TRUE, int type=
name = stripFromPath(name);
- bindTextParameter(path_select,":name",name.data(),FALSE);
+ bindTextParameter(path_select,":name",name.data());
rowid=step(path_select,TRUE,TRUE);
if (rowid==0)
{
- bindTextParameter(path_insert,":name",name.data(),FALSE);
+ bindTextParameter(path_insert,":name",name.data());
bindIntParameter(path_insert,":type",type);
bindIntParameter(path_insert,":local",local?1:0);
bindIntParameter(path_insert,":found",found?1:0);
@@ -924,10 +924,10 @@ static int insertPath(QCString name, bool local=TRUE, bool found=TRUE, int type=
static void recordMetadata()
{
- bindTextParameter(meta_insert,":doxygen_version",getVersion());
- bindTextParameter(meta_insert,":schema_version","0.2.0"); //TODO: this should be a constant somewhere; not sure where
- bindTextParameter(meta_insert,":generated_at",dateToString(TRUE), FALSE);
- bindTextParameter(meta_insert,":generated_on",dateToString(FALSE), FALSE);
+ bindTextParameter(meta_insert,":doxygen_version",getFullVersion());
+ bindTextParameter(meta_insert,":schema_version","0.2.0",TRUE); //TODO: this should be a constant somewhere; not sure where
+ bindTextParameter(meta_insert,":generated_at",dateToString(TRUE));
+ bindTextParameter(meta_insert,":generated_on",dateToString(FALSE));
bindTextParameter(meta_insert,":project_name",Config_getString(PROJECT_NAME));
bindTextParameter(meta_insert,":project_number",Config_getString(PROJECT_NUMBER));
bindTextParameter(meta_insert,":project_brief",Config_getString(PROJECT_BRIEF));
@@ -1155,7 +1155,7 @@ static int prepareStatement(sqlite3 *db, SqlStmt &s)
rc = sqlite3_prepare_v2(db,s.query,-1,&s.stmt,0);
if (rc!=SQLITE_OK)
{
- msg("prepare failed for %s\n%s\n", s.query, sqlite3_errmsg(db));
+ err("prepare failed for %s\n%s\n", s.query, sqlite3_errmsg(db));
s.db = NULL;
return -1;
}
@@ -1218,8 +1218,6 @@ static void pragmaTuning(sqlite3 *db)
static int initializeTables(sqlite3* db)
{
int rc;
- sqlite3_stmt *stmt = 0;
-
msg("Initializing DB schema (tables)...\n");
for (unsigned int k = 0; k < sizeof(table_schema) / sizeof(table_schema[0]); k++)
{
@@ -1228,7 +1226,7 @@ static int initializeTables(sqlite3* db)
rc = sqlite3_exec(db, q, NULL, NULL, &errmsg);
if (rc != SQLITE_OK)
{
- msg("failed to execute query: %s\n\t%s\n", q, errmsg);
+ err("failed to execute query: %s\n\t%s\n", q, errmsg);
return -1;
}
}
@@ -1238,8 +1236,6 @@ static int initializeTables(sqlite3* db)
static int initializeViews(sqlite3* db)
{
int rc;
- sqlite3_stmt *stmt = 0;
-
msg("Initializing DB schema (views)...\n");
for (unsigned int k = 0; k < sizeof(view_schema) / sizeof(view_schema[0]); k++)
{
@@ -1248,7 +1244,7 @@ static int initializeViews(sqlite3* db)
rc = sqlite3_exec(db, q, NULL, NULL, &errmsg);
if (rc != SQLITE_OK)
{
- msg("failed to execute query: %s\n\t%s\n", q, errmsg);
+ err("failed to execute query: %s\n\t%s\n", q, errmsg);
return -1;
}
}
@@ -1268,13 +1264,9 @@ I think the hurdles are:
inner_refid (unless I'm missing a method that would uniformly return
the correct refid for all types).
*/
-static void writeInnerClasses(const ClassSDict *cl, struct Refid outer_refid)
+static void writeInnerClasses(const ClassLinkedRefMap &cl, struct Refid outer_refid)
{
- if (!cl) return;
-
- ClassSDict::Iterator cli(*cl);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : cl)
{
if (!cd->isHidden() && !cd->isAnonymous())
{
@@ -1287,13 +1279,9 @@ static void writeInnerClasses(const ClassSDict *cl, struct Refid outer_refid)
}
}
-static void writeInnerPages(const PageSDict *pl, struct Refid outer_refid)
+static void writeInnerPages(const PageLinkedRefMap &pl, struct Refid outer_refid)
{
- if (!pl) return;
-
- PageSDict::Iterator pli(*pl);
- const PageDef *pd;
- for (pli.toFirst();(pd=pli.current());++pli)
+ for (const auto &pd : pl)
{
struct Refid inner_refid = insertRefid(
pd->getGroupDef() ? pd->getOutputFileBase()+"_"+pd->name() : pd->getOutputFileBase()
@@ -1302,24 +1290,18 @@ static void writeInnerPages(const PageSDict *pl, struct Refid outer_refid)
bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
step(contains_insert);
-
}
}
-static void writeInnerGroups(const GroupList *gl, struct Refid outer_refid)
+static void writeInnerGroups(const GroupList &gl, struct Refid outer_refid)
{
- if (gl)
+ for (const auto &sgd : gl)
{
- GroupListIterator gli(*gl);
- const GroupDef *sgd;
- for (gli.toFirst();(sgd=gli.current());++gli)
- {
- struct Refid inner_refid = insertRefid(sgd->getOutputFileBase());
+ struct Refid inner_refid = insertRefid(sgd->getOutputFileBase());
- bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
- bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
- step(contains_insert);
- }
+ bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
+ bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
+ step(contains_insert);
}
}
@@ -1340,39 +1322,29 @@ static void writeInnerFiles(const FileList *fl, struct Refid outer_refid)
}
}
-static void writeInnerDirs(const DirList *dl, struct Refid outer_refid)
+static void writeInnerDirs(const DirList &dl, struct Refid outer_refid)
{
- if (dl)
+ for (const auto subdir : dl)
{
- QListIterator<DirDef> subdirs(*dl);
- const DirDef *subdir;
- for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
- {
- struct Refid inner_refid = insertRefid(subdir->getOutputFileBase());
+ struct Refid inner_refid = insertRefid(subdir->getOutputFileBase());
- bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
- bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
- step(contains_insert);
- }
+ bindIntParameter(contains_insert,":inner_rowid", inner_refid.rowid);
+ bindIntParameter(contains_insert,":outer_rowid", outer_refid.rowid);
+ step(contains_insert);
}
}
-static void writeInnerNamespaces(const NamespaceSDict *nl, struct Refid outer_refid)
+static void writeInnerNamespaces(const NamespaceLinkedRefMap &nl, struct Refid outer_refid)
{
- if (nl)
+ for (const auto &nd : nl)
{
- NamespaceSDict::Iterator nli(*nl);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ if (!nd->isHidden() && !nd->isAnonymous())
{
- if (!nd->isHidden() && !nd->isAnonymous())
- {
- struct Refid inner_refid = insertRefid(nd->getOutputFileBase());
+ struct Refid inner_refid = insertRefid(nd->getOutputFileBase());
- bindIntParameter(contains_insert,":inner_rowid",inner_refid.rowid);
- bindIntParameter(contains_insert,":outer_rowid",outer_refid.rowid);
- step(contains_insert);
- }
+ bindIntParameter(contains_insert,":inner_rowid",inner_refid.rowid);
+ bindIntParameter(contains_insert,":outer_rowid",outer_refid.rowid);
+ step(contains_insert);
}
}
}
@@ -1430,10 +1402,14 @@ QCString getSQLDocBlock(const Definition *scope,
fileName,
lineNr,
const_cast<Definition*>(scope),
- dynamic_cast<const MemberDef*>(def),
+ toMemberDef(def),
doc,
FALSE,
- FALSE
+ FALSE,
+ 0,
+ FALSE,
+ FALSE,
+ Config_getBool(MARKDOWN_SUPPORT)
);
XMLCodeGenerator codeGen(t);
// create a parse tree visitor for XML
@@ -1450,15 +1426,14 @@ static void getSQLDesc(SqlStmt &s,const char *col,const char *value,const Defini
bindTextParameter(
s,
col,
- getSQLDocBlock(
- def->getOuterScope(),
- def,
- value,
- def->docFile(),
- def->docLine()
- ),
- FALSE
- );
+ getSQLDocBlock(
+ def->getOuterScope(),
+ def,
+ value,
+ def->docFile(),
+ def->docLine()
+ )
+ );
}
////////////////////////////////////////////
@@ -1625,32 +1600,22 @@ static void generateSqlite3ForMember(const MemberDef *md, struct Refid scope_ref
// + source references
// The cross-references in initializers only work when both the src and dst
// are defined.
- MemberSDict *mdict = md->getReferencesMembers();
- if (mdict!=0)
+ auto refList = md->getReferencesMembers();
+ for (const auto &rmd : refList)
{
- MemberSDict::IteratorDict mdi(*mdict);
- const MemberDef *rmd;
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- insertMemberReference(md,rmd, "inline");
- }
+ insertMemberReference(md,rmd, "inline");
}
// + source referenced by
- mdict = md->getReferencedByMembers();
- if (mdict!=0)
+ auto refByList = md->getReferencedByMembers();
+ for (const auto &rmd : refByList)
{
- MemberSDict::IteratorDict mdi(*mdict);
- const MemberDef *rmd;
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- insertMemberReference(rmd,md, "inline");
- }
+ insertMemberReference(rmd,md, "inline");
}
return;
}
bindIntParameter(memberdef_insert,":rowid", refid.rowid);
- bindTextParameter(memberdef_insert,":kind",md->memberTypeName(),FALSE);
+ bindTextParameter(memberdef_insert,":kind",md->memberTypeName());
bindIntParameter(memberdef_insert,":prot",md->protection());
bindIntParameter(memberdef_insert,":static",md->isStatic());
@@ -1672,8 +1637,8 @@ static void generateSqlite3ForMember(const MemberDef *md, struct Refid scope_ref
if (isFunc)
{
const ArgumentList &al = md->argumentList();
- bindIntParameter(memberdef_insert,":const",al.constSpecifier);
- bindIntParameter(memberdef_insert,":volatile",al.volatileSpecifier);
+ bindIntParameter(memberdef_insert,":const",al.constSpecifier());
+ bindIntParameter(memberdef_insert,":volatile",al.volatileSpecifier());
bindIntParameter(memberdef_insert,":explicit",md->isExplicit());
bindIntParameter(memberdef_insert,":inline",md->isInline());
bindIntParameter(memberdef_insert,":final",md->isFinal());
@@ -1740,7 +1705,7 @@ static void generateSqlite3ForMember(const MemberDef *md, struct Refid scope_ref
}
const MemberDef *rmd = md->reimplements();
- if(rmd)
+ if (rmd)
{
QCString qreimplemented_refid = rmd->getOutputFileBase() + "_1" + rmd->anchor();
@@ -1766,7 +1731,7 @@ static void generateSqlite3ForMember(const MemberDef *md, struct Refid scope_ref
linkifyText(TextGeneratorSqlite3Impl(l), def, md->getBodyDef(),md,typeStr);
if (typeStr)
{
- bindTextParameter(memberdef_insert,":type",typeStr,FALSE);
+ bindTextParameter(memberdef_insert,":type",typeStr);
}
if (md->definition())
@@ -1811,7 +1776,7 @@ static void generateSqlite3ForMember(const MemberDef *md, struct Refid scope_ref
if ( md->getScopeString() )
{
- bindTextParameter(memberdef_insert,":scope",md->getScopeString(),FALSE);
+ bindTextParameter(memberdef_insert,":scope",md->getScopeString());
}
// +Brief, detailed and inbody description
@@ -1862,26 +1827,16 @@ static void generateSqlite3ForMember(const MemberDef *md, struct Refid scope_ref
// + source references
// The cross-references in initializers only work when both the src and dst
// are defined.
- MemberSDict *mdict = md->getReferencesMembers();
- if (mdict!=0)
+ auto refList = md->getReferencesMembers();
+ for (const auto &refmd : refList)
{
- MemberSDict::IteratorDict mdi(*mdict);
- const MemberDef *rmd;
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- insertMemberReference(md,rmd, "inline");
- }
+ insertMemberReference(md,refmd, "inline");
}
// + source referenced by
- mdict = md->getReferencedByMembers();
- if (mdict!=0)
+ auto refByList = md->getReferencedByMembers();
+ for (const auto &refmd : refByList)
{
- MemberSDict::IteratorDict mdi(*mdict);
- const MemberDef *rmd;
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- insertMemberReference(rmd,md, "inline");
- }
+ insertMemberReference(refmd,md, "inline");
}
}
@@ -1910,20 +1865,13 @@ static void generateSqlite3Section( const Definition *d,
static void associateAllClassMembers(const ClassDef *cd, struct Refid scope_refid)
{
- if (cd->memberNameInfoSDict())
+ for (auto &mni : cd->memberNameInfoLinkedMap())
{
- MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
- MemberNameInfo *mni;
- for (mnii.toFirst();(mni=mnii.current());++mnii)
+ for (auto &mi : *mni)
{
- MemberNameInfoIterator mii(*mni);
- MemberInfo *mi;
- for (mii.toFirst();(mi=mii.current());++mii)
- {
- MemberDef *md = mi->memberDef;
- QCString qrefid = md->getOutputFileBase() + "_1" + md->anchor();
- associateMember(md, insertRefid(qrefid), scope_refid);
- }
+ MemberDef *md = mi->memberDef();
+ QCString qrefid = md->getOutputFileBase() + "_1" + md->anchor();
+ associateMember(md, insertRefid(qrefid), scope_refid);
}
}
}
@@ -1965,8 +1913,8 @@ static void generateSqlite3ForClass(const ClassDef *cd)
bindIntParameter(compounddef_insert,":rowid", refid.rowid);
bindTextParameter(compounddef_insert,":name",cd->name());
- bindTextParameter(compounddef_insert,":title",cd->title(), FALSE);
- bindTextParameter(compounddef_insert,":kind",cd->compoundTypeString(),FALSE);
+ bindTextParameter(compounddef_insert,":title",cd->title());
+ bindTextParameter(compounddef_insert,":kind",cd->compoundTypeString());
bindIntParameter(compounddef_insert,":prot",cd->protection());
int file_id = insertPath(cd->getDefFileName());
@@ -2010,7 +1958,6 @@ static void generateSqlite3ForClass(const ClassDef *cd)
DBG_CTX(("-----> ClassDef includeInfo for %s\n", nm.data()));
DBG_CTX((" local : %d\n", ii->local));
DBG_CTX((" imported : %d\n", ii->imported));
- DBG_CTX((" indirect : %d\n", ii->indirect));
DBG_CTX(("header: %s\n", ii->fileDef->absFilePath().data()));
DBG_CTX((" file_id : %d\n", file_id));
DBG_CTX((" header_id: %d\n", header_id));
@@ -2028,65 +1975,48 @@ static void generateSqlite3ForClass(const ClassDef *cd)
step(compounddef_insert);
// + list of direct super classes
- if (cd->baseClasses())
+ for (const auto &bcd : cd->baseClasses())
{
- BaseClassListIterator bcli(*cd->baseClasses());
- const BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
- {
- struct Refid base_refid = insertRefid(bcd->classDef->getOutputFileBase());
- struct Refid derived_refid = insertRefid(cd->getOutputFileBase());
- bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
- bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
- bindIntParameter(compoundref_insert,":prot",bcd->prot);
- bindIntParameter(compoundref_insert,":virt",bcd->virt);
- step(compoundref_insert);
- }
+ struct Refid base_refid = insertRefid(bcd.classDef->getOutputFileBase());
+ struct Refid derived_refid = insertRefid(cd->getOutputFileBase());
+ bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
+ bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
+ bindIntParameter(compoundref_insert,":prot",bcd.prot);
+ bindIntParameter(compoundref_insert,":virt",bcd.virt);
+ step(compoundref_insert);
}
// + list of direct sub classes
- if (cd->subClasses())
+ for (const auto &bcd : cd->subClasses())
{
- BaseClassListIterator bcli(*cd->subClasses());
- const BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
- {
- struct Refid derived_refid = insertRefid(bcd->classDef->getOutputFileBase());
- struct Refid base_refid = insertRefid(cd->getOutputFileBase());
- bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
- bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
- bindIntParameter(compoundref_insert,":prot",bcd->prot);
- bindIntParameter(compoundref_insert,":virt",bcd->virt);
- step(compoundref_insert);
- }
+ struct Refid derived_refid = insertRefid(bcd.classDef->getOutputFileBase());
+ struct Refid base_refid = insertRefid(cd->getOutputFileBase());
+ bindIntParameter(compoundref_insert,":base_rowid", base_refid.rowid);
+ bindIntParameter(compoundref_insert,":derived_rowid", derived_refid.rowid);
+ bindIntParameter(compoundref_insert,":prot",bcd.prot);
+ bindIntParameter(compoundref_insert,":virt",bcd.virt);
+ step(compoundref_insert);
}
// + list of inner classes
- writeInnerClasses(cd->getClassSDict(),refid);
+ writeInnerClasses(cd->getClasses(),refid);
// + template argument list(s)
writeTemplateList(cd);
// + member groups
- if (cd->getMemberGroupSDict())
+ for (const auto &mg : cd->getMemberGroups())
{
- MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateSqlite3Section(cd,mg->members(),refid,"user-defined",mg->header(),
- mg->documentation());
- }
+ generateSqlite3Section(cd,mg->members(),refid,"user-defined",mg->header(),
+ mg->documentation());
}
// this is just a list of *local* members
- QListIterator<MemberList> mli(cd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : cd->getMemberLists())
{
if ((ml->listType()&MemberListType_detailedLists)==0)
{
- generateSqlite3Section(cd,ml,refid,"user-defined");
+ generateSqlite3Section(cd,ml.get(),refid,"user-defined");
}
}
@@ -2112,8 +2042,8 @@ static void generateSqlite3ForNamespace(const NamespaceDef *nd)
bindIntParameter(compounddef_insert,":rowid", refid.rowid);
bindTextParameter(compounddef_insert,":name",nd->name());
- bindTextParameter(compounddef_insert,":title",nd->title(), FALSE);
- bindTextParameter(compounddef_insert,":kind","namespace",FALSE);
+ bindTextParameter(compounddef_insert,":title",nd->title());
+ bindTextParameter(compounddef_insert,":kind","namespace");
int file_id = insertPath(nd->getDefFileName());
bindIntParameter(compounddef_insert,":file_id",file_id);
@@ -2126,31 +2056,24 @@ static void generateSqlite3ForNamespace(const NamespaceDef *nd)
step(compounddef_insert);
// + contained class definitions
- writeInnerClasses(nd->getClassSDict(),refid);
+ writeInnerClasses(nd->getClasses(),refid);
// + contained namespace definitions
- writeInnerNamespaces(nd->getNamespaceSDict(),refid);
+ writeInnerNamespaces(nd->getNamespaces(),refid);
// + member groups
- if (nd->getMemberGroupSDict())
+ for (const auto &mg : nd->getMemberGroups())
{
- MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateSqlite3Section(nd,mg->members(),refid,"user-defined",mg->header(),
- mg->documentation());
- }
+ generateSqlite3Section(nd,mg->members(),refid,"user-defined",mg->header(),
+ mg->documentation());
}
// + normal members
- QListIterator<MemberList> mli(nd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : nd->getMemberLists())
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
- generateSqlite3Section(nd,ml,refid,"user-defined");
+ generateSqlite3Section(nd,ml.get(),refid,"user-defined");
}
}
}
@@ -2178,9 +2101,9 @@ static void generateSqlite3ForFile(const FileDef *fd)
if(!refid.created && compounddefExists(refid)){return;}
bindIntParameter(compounddef_insert,":rowid", refid.rowid);
- bindTextParameter(compounddef_insert,":name",fd->name(),FALSE);
- bindTextParameter(compounddef_insert,":title",fd->title(),FALSE);
- bindTextParameter(compounddef_insert,":kind","file",FALSE);
+ bindTextParameter(compounddef_insert,":name",fd->name());
+ bindTextParameter(compounddef_insert,":title",fd->title());
+ bindTextParameter(compounddef_insert,":kind","file");
int file_id = insertPath(fd->getDefFileName());
bindIntParameter(compounddef_insert,":file_id",file_id);
@@ -2226,7 +2149,6 @@ static void generateSqlite3ForFile(const FileDef *fd)
DBG_CTX(("-----> FileDef includeInfo for %s\n", ii->includeName.data()));
DBG_CTX((" local: %d\n", ii->local));
DBG_CTX((" imported: %d\n", ii->imported));
- DBG_CTX((" indirect: %d\n", ii->indirect));
if(ii->fileDef)
{
DBG_CTX(("include: %s\n", ii->fileDef->absFilePath().data()));
@@ -2289,37 +2211,24 @@ static void generateSqlite3ForFile(const FileDef *fd)
}
// + contained class definitions
- if (fd->getClassSDict())
- {
- writeInnerClasses(fd->getClassSDict(),refid);
- }
+ writeInnerClasses(fd->getClasses(),refid);
// + contained namespace definitions
- if (fd->getNamespaceSDict())
- {
- writeInnerNamespaces(fd->getNamespaceSDict(),refid);
- }
+ writeInnerNamespaces(fd->getNamespaces(),refid);
// + member groups
- if (fd->getMemberGroupSDict())
+ for (const auto &mg : fd->getMemberGroups())
{
- MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateSqlite3Section(fd,mg->members(),refid,"user-defined",mg->header(),
+ generateSqlite3Section(fd,mg->members(),refid,"user-defined",mg->header(),
mg->documentation());
- }
}
// + normal members
- QListIterator<MemberList> mli(fd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : fd->getMemberLists())
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
- generateSqlite3Section(fd,ml,refid,"user-defined");
+ generateSqlite3Section(fd,ml.get(),refid,"user-defined");
}
}
}
@@ -2346,8 +2255,8 @@ static void generateSqlite3ForGroup(const GroupDef *gd)
bindIntParameter(compounddef_insert,":rowid", refid.rowid);
bindTextParameter(compounddef_insert,":name",gd->name());
- bindTextParameter(compounddef_insert,":title",gd->groupTitle(), FALSE);
- bindTextParameter(compounddef_insert,":kind","group",FALSE);
+ bindTextParameter(compounddef_insert,":title",gd->groupTitle());
+ bindTextParameter(compounddef_insert,":kind","group");
int file_id = insertPath(gd->getDefFileName());
bindIntParameter(compounddef_insert,":file_id",file_id);
@@ -2375,25 +2284,18 @@ static void generateSqlite3ForGroup(const GroupDef *gd)
writeInnerGroups(gd->getSubGroups(),refid);
// + member groups
- if (gd->getMemberGroupSDict())
+ for (const auto &mg : gd->getMemberGroups())
{
- MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateSqlite3Section(gd,mg->members(),refid,"user-defined",mg->header(),
- mg->documentation());
- }
+ generateSqlite3Section(gd,mg->members(),refid,"user-defined",mg->header(),
+ mg->documentation());
}
// + members
- QListIterator<MemberList> mli(gd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : gd->getMemberLists())
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
- generateSqlite3Section(gd,ml,refid,"user-defined");
+ generateSqlite3Section(gd,ml.get(),refid,"user-defined");
}
}
}
@@ -2413,7 +2315,7 @@ static void generateSqlite3ForDir(const DirDef *dd)
bindIntParameter(compounddef_insert,":rowid", refid.rowid);
bindTextParameter(compounddef_insert,":name",dd->displayName());
- bindTextParameter(compounddef_insert,":kind","dir",FALSE);
+ bindTextParameter(compounddef_insert,":kind","dir");
int file_id = insertPath(dd->getDefFileName(),TRUE,TRUE,2);
bindIntParameter(compounddef_insert,":file_id",file_id);
@@ -2437,7 +2339,7 @@ static void generateSqlite3ForDir(const DirDef *dd)
step(compounddef_insert);
// + files
- writeInnerDirs(&dd->subDirs(),refid);
+ writeInnerDirs(dd->subDirs(),refid);
// + files
writeInnerFiles(dd->getFiles(),refid);
@@ -2473,7 +2375,7 @@ static void generateSqlite3ForPage(const PageDef *pd,bool isExample)
bindTextParameter(compounddef_insert,":name",pd->name());
QCString title;
- if (pd==Doxygen::mainPage) // main page is special
+ if (pd==Doxygen::mainPage.get()) // main page is special
{
if (mainPageHasTitle())
{
@@ -2486,19 +2388,19 @@ static void generateSqlite3ForPage(const PageDef *pd,bool isExample)
}
else
{
- SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+ SectionInfo *si = SectionManager::instance().find(pd->name());
if (si)
{
- title = si->title;
+ title = si->title();
}
if(!title){title = pd->title();}
}
// + title
- bindTextParameter(compounddef_insert,":title",title,FALSE);
+ bindTextParameter(compounddef_insert,":title",title);
- bindTextParameter(compounddef_insert,":kind", isExample ? "example" : "page");
+ bindTextParameter(compounddef_insert,":kind", isExample ? "example" : "page",TRUE);
int file_id = insertPath(pd->getDefFileName());
@@ -2520,29 +2422,36 @@ static void generateSqlite3ForPage(const PageDef *pd,bool isExample)
static sqlite3* openDbConnection()
{
- QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
+ QCString outputDirectory = Config_getString(SQLITE3_OUTPUT);
QDir sqlite3Dir(outputDirectory);
sqlite3 *db;
int rc;
- struct stat buf;
rc = sqlite3_initialize();
if (rc != SQLITE_OK)
{
- msg("sqlite3_initialize failed\n");
+ err("sqlite3_initialize failed\n");
return NULL;
}
+ QCString dbFileName = "doxygen_sqlite3.db";
+ QFileInfo fi(outputDirectory+"/"+dbFileName);
- if (stat (outputDirectory+"/doxygen_sqlite3.db", &buf) == 0)
+ if (fi.exists())
{
- msg("doxygen_sqlite3.db already exists! aborting sqlite3 output generation!\n");
- msg("If you wish to re-generate the database, remove or archive the existing copy first.\n");
- return NULL;
+ if (Config_getBool(SQLITE3_RECREATE_DB))
+ {
+ QDir().remove(fi.absFilePath());
+ }
+ else
+ {
+ err("doxygen_sqlite3.db already exists! Rename, remove, or archive it to regenerate\n");
+ return NULL;
+ }
}
rc = sqlite3_open_v2(
- outputDirectory+"/doxygen_sqlite3.db",
+ fi.absFilePath().utf8(),
&db,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
0
@@ -2550,8 +2459,7 @@ static sqlite3* openDbConnection()
if (rc != SQLITE_OK)
{
sqlite3_close(db);
- msg("database open failed: %s\n", "doxygen_sqlite3.db");
- return NULL;
+ err("Database open failed: %s\n", "doxygen_sqlite3.db");
}
return db;
}
@@ -2594,84 +2502,62 @@ void generateSqlite3()
recordMetadata();
// + classes
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
msg("Generating Sqlite3 output for class %s\n",cd->name().data());
- generateSqlite3ForClass(cd);
+ generateSqlite3ForClass(cd.get());
}
// + namespaces
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
msg("Generating Sqlite3 output for namespace %s\n",nd->name().data());
- generateSqlite3ForNamespace(nd);
+ generateSqlite3ForNamespace(nd.get());
}
// + files
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- const FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
msg("Generating Sqlite3 output for file %s\n",fd->name().data());
- generateSqlite3ForFile(fd);
+ generateSqlite3ForFile(fd.get());
}
}
// + groups
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- const GroupDef *gd;
- for (;(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
msg("Generating Sqlite3 output for group %s\n",gd->name().data());
- generateSqlite3ForGroup(gd);
+ generateSqlite3ForGroup(gd.get());
}
// + page
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- const PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- msg("Generating Sqlite3 output for page %s\n",pd->name().data());
- generateSqlite3ForPage(pd,FALSE);
- }
+ msg("Generating Sqlite3 output for page %s\n",pd->name().data());
+ generateSqlite3ForPage(pd.get(),FALSE);
}
// + dirs
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
- const DirDef *dir;
- DirSDict::Iterator sdi(*Doxygen::directories);
- for (sdi.toFirst();(dir=sdi.current());++sdi)
- {
- msg("Generating Sqlite3 output for dir %s\n",dir->name().data());
- generateSqlite3ForDir(dir);
- }
+ msg("Generating Sqlite3 output for dir %s\n",dd->name().data());
+ generateSqlite3ForDir(dd.get());
}
// + examples
+ for (const auto &pd : *Doxygen::exampleLinkedMap)
{
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- const PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- msg("Generating Sqlite3 output for example %s\n",pd->name().data());
- generateSqlite3ForPage(pd,TRUE);
- }
+ msg("Generating Sqlite3 output for example %s\n",pd->name().data());
+ generateSqlite3ForPage(pd.get(),TRUE);
}
// + main page
if (Doxygen::mainPage)
{
msg("Generating Sqlite3 output for the main page\n");
- generateSqlite3ForPage(Doxygen::mainPage,FALSE);
+ generateSqlite3ForPage(Doxygen::mainPage.get(),FALSE);
}
// TODO: copied from initializeSchema; not certain if we should say/do more
diff --git a/src/symbolmap.h b/src/symbolmap.h
new file mode 100644
index 0000000..0f837d4
--- /dev/null
+++ b/src/symbolmap.h
@@ -0,0 +1,79 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SYMBOLMAP_H
+#define SYMBOLMAP_H
+
+#include <algorithm>
+#include <map>
+#include <vector>
+#include <string>
+#include <utility>
+
+//! Class implementing a symbol map that maps symbol names to objects.
+//! Symbol names do not have to be unique.
+//! Supports adding symbols with add(), removing symbols with remove(), and
+//! finding symbols with find().
+template<class T>
+class SymbolMap
+{
+ public:
+ using Ptr = T *;
+ using Map = std::multimap<std::string,Ptr>;
+ using iterator = typename Map::iterator;
+ using const_iterator = typename Map::const_iterator;
+
+ //! Add a symbol \a def into the map under key \a name
+ void add(const char *name,Ptr def)
+ {
+ m_map.insert({std::string(name),def});
+ }
+
+ //! Remove a symbol \a def from the map that was stored under key \a name
+ void remove(const char *name,Ptr def)
+ {
+ auto range = find(name);
+ for (auto it=range.first; it!=range.second; )
+ {
+ if (it->second==def) it = m_map.erase(it); else ++it;
+ }
+ }
+
+ //! Find the list of symbols stored under key \a name
+ //! Returns a pair of iterators pointing to the start and end of the range of matching symbols
+ std::pair<const_iterator,const_iterator> find(const char *name) const
+ {
+ return m_map.equal_range(name ? name : "");
+ }
+
+ //! Find the list of symbols stored under key \a name
+ //! Returns a pair of iterators pointing to the start and end of the range of matching symbols
+ std::pair<iterator,iterator> find(const char *name)
+ {
+ return m_map.equal_range(name ? name : "");
+ }
+
+ iterator begin() { return m_map.begin(); }
+ iterator end() { return m_map.end(); }
+ const_iterator begin() const { return m_map.cbegin(); }
+ const_iterator end() const { return m_map.cend(); }
+ bool empty() const { return m_map.empty(); }
+ size_t size() const { return m_map.size(); }
+
+ private:
+ Map m_map;
+};
+
+#endif
diff --git a/src/symbolresolver.cpp b/src/symbolresolver.cpp
new file mode 100644
index 0000000..9f80c15
--- /dev/null
+++ b/src/symbolresolver.cpp
@@ -0,0 +1,1114 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <unordered_map>
+#include <string>
+#include <vector>
+
+#include "symbolresolver.h"
+#include "util.h"
+#include "doxygen.h"
+#include "namespacedef.h"
+#include "config.h"
+#include "defargs.h"
+
+static std::mutex g_cacheMutex;
+
+//--------------------------------------------------------------------------------------
+
+/** Helper class representing the stack of items considered while resolving
+ * the scope.
+ */
+class AccessStack
+{
+ /** Element in the stack. */
+ struct AccessElem
+ {
+ AccessElem(const Definition *d,const FileDef *f,const Definition *i,QCString e = QCString()) : scope(d), fileScope(f), item(i), expScope(e) {}
+ const Definition *scope;
+ const FileDef *fileScope;
+ const Definition *item;
+ QCString expScope;
+ };
+ public:
+ void push(const Definition *scope,const FileDef *fileScope,const Definition *item)
+ {
+ m_elements.push_back(AccessElem(scope,fileScope,item));
+ }
+ void push(const Definition *scope,const FileDef *fileScope,const Definition *item,const QCString &expScope)
+ {
+ m_elements.push_back(AccessElem(scope,fileScope,item,expScope));
+ }
+ void pop()
+ {
+ if (!m_elements.empty()) m_elements.pop_back();
+ }
+ bool find(const Definition *scope,const FileDef *fileScope, const Definition *item)
+ {
+ auto it = std::find_if(m_elements.begin(),m_elements.end(),
+ [&](const AccessElem &e) { return e.scope==scope && e.fileScope==fileScope && e.item==item; });
+ return it!=m_elements.end();
+ }
+ bool find(const Definition *scope,const FileDef *fileScope, const Definition *item,const QCString &expScope)
+ {
+ auto it = std::find_if(m_elements.begin(),m_elements.end(),
+ [&](const AccessElem &e) { return e.scope==scope && e.fileScope==fileScope && e.item==item && e.expScope==expScope; });
+ return it!=m_elements.end();
+ }
+ void clear()
+ {
+ m_elements.clear();
+ }
+
+ private:
+ std::vector<AccessElem> m_elements;
+};
+
+//--------------------------------------------------------------------------------------
+
+using VisitedNamespaces = std::unordered_map<std::string,const Definition *>;
+
+//--------------------------------------------------------------------------------------
+
+struct SymbolResolver::Private
+{
+ public:
+ Private(const FileDef *f) : m_fileScope(f) {}
+ void reset()
+ {
+ m_resolvedTypedefs.clear();
+ resolvedType.resize(0);
+ typeDef = 0;
+ templateSpec.resize(0);
+ }
+ void setFileScope(const FileDef *fileScope)
+ {
+ m_fileScope = fileScope;
+ }
+
+ QCString resolvedType;
+ const MemberDef *typeDef = 0;
+ QCString templateSpec;
+
+ const ClassDef *getResolvedClassRec(
+ const Definition *scope, // in
+ const char *n, // in
+ const MemberDef **pTypeDef, // out
+ QCString *pTemplSpec, // out
+ QCString *pResolvedType); // out
+
+ int isAccessibleFrom( AccessStack &accessStack,
+ const Definition *scope,
+ const Definition *item);
+
+ int isAccessibleFromWithExpScope(
+ VisitedNamespaces &visitedNamespaces,
+ AccessStack &accessStack,
+ const Definition *scope,
+ const Definition *item,
+ const QCString &explicitScopePart);
+
+ private:
+ void getResolvedSymbol(const Definition *scope, // in
+ const Definition *d, // in
+ const QCString &explicitScopePart, // in
+ const std::unique_ptr<ArgumentList> &actTemplParams, // in
+ int &minDistance, // input
+ const ClassDef *&bestMatch, // out
+ const MemberDef *&bestTypedef, // out
+ QCString &bestTemplSpec, // out
+ QCString &bestResolvedType // out
+ );
+
+ const ClassDef *newResolveTypedef(
+ const Definition *scope, // in
+ const MemberDef *md, // in
+ const MemberDef **pMemType, // out
+ QCString *pTemplSpec, // out
+ QCString *pResolvedType, // out
+ const std::unique_ptr<ArgumentList> &actTemplParams = std::unique_ptr<ArgumentList>()
+ );
+
+ const Definition *followPath(const Definition *start,const QCString &path);
+
+ const Definition *endOfPathIsUsedClass(LinkedRefMap<const ClassDef> cl,const QCString &localName);
+
+ bool accessibleViaUsingNamespace(StringUnorderedSet &visited,
+ const LinkedRefMap<const NamespaceDef> &nl,
+ const Definition *item,
+ const QCString &explicitScopePart="");
+ bool accessibleViaUsingClass(const LinkedRefMap<const ClassDef> &cl,
+ const Definition *item,
+ const QCString &explicitScopePart=""
+ );
+ QCString substTypedef(const Definition *scope,const QCString &name,
+ const MemberDef **pTypeDef=0);
+
+ const FileDef *m_fileScope;
+ std::unordered_map<std::string,const MemberDef*> m_resolvedTypedefs;
+};
+
+
+
+const ClassDef *SymbolResolver::Private::getResolvedClassRec(
+ const Definition *scope,
+ const char *n,
+ const MemberDef **pTypeDef,
+ QCString *pTemplSpec,
+ QCString *pResolvedType)
+{
+ if (n==0 || *n=='\0') return 0;
+ //static int level=0;
+ //fprintf(stderr,"%d [getResolvedClassRec(%s,%s)\n",level++,scope?scope->name().data():"<global>",n);
+ QCString name;
+ QCString explicitScopePart;
+ QCString strippedTemplateParams;
+ name=stripTemplateSpecifiersFromScope
+ (removeRedundantWhiteSpace(n),TRUE,
+ &strippedTemplateParams);
+ std::unique_ptr<ArgumentList> actTemplParams;
+ if (!strippedTemplateParams.isEmpty()) // template part that was stripped
+ {
+ actTemplParams = stringToArgumentList(scope->getLanguage(),strippedTemplateParams);
+ }
+
+ int qualifierIndex = computeQualifiedIndex(name);
+ //printf("name=%s qualifierIndex=%d\n",name.data(),qualifierIndex);
+ if (qualifierIndex!=-1) // qualified name
+ {
+ // split off the explicit scope part
+ explicitScopePart=name.left(qualifierIndex);
+ // todo: improve namespace alias substitution
+ replaceNamespaceAliases(explicitScopePart,explicitScopePart.length());
+ name=name.mid(qualifierIndex+2);
+ }
+
+ if (name.isEmpty())
+ {
+ //fprintf(stderr,"%d ] empty name\n",--level);
+ return 0; // empty name
+ }
+
+ //printf("Looking for symbol %s\n",name.data());
+ auto range = Doxygen::symbolMap.find(name);
+ // the -g (for C# generics) and -p (for ObjC protocols) are now already
+ // stripped from the key used in the symbolMap, so that is not needed here.
+ if (range.first==range.second)
+ {
+ range = Doxygen::symbolMap.find(name+"-p");
+ if (range.first==range.second)
+ {
+ //fprintf(stderr,"%d ] no such symbol!\n",--level);
+ return 0;
+ }
+ }
+ //printf("found symbol!\n");
+
+ bool hasUsingStatements =
+ (m_fileScope && (!m_fileScope->getUsedNamespaces().empty() ||
+ !m_fileScope->getUsedClasses().empty())
+ );
+ //printf("hasUsingStatements=%d\n",hasUsingStatements);
+ // Since it is often the case that the same name is searched in the same
+ // scope over an over again (especially for the linked source code generation)
+ // we use a cache to collect previous results. This is possible since the
+ // result of a lookup is deterministic. As the key we use the concatenated
+ // scope, the name to search for and the explicit scope prefix. The speedup
+ // achieved by this simple cache can be enormous.
+ int scopeNameLen = scope->name().length()+1;
+ int nameLen = name.length()+1;
+ int explicitPartLen = explicitScopePart.length();
+ int fileScopeLen = hasUsingStatements ? 1+m_fileScope->absFilePath().length() : 0;
+
+ // below is a more efficient coding of
+ // QCString key=scope->name()+"+"+name+"+"+explicitScopePart;
+ QCString key(scopeNameLen+nameLen+explicitPartLen+fileScopeLen+1);
+ char *pk=key.rawData();
+ qstrcpy(pk,scope->name()); *(pk+scopeNameLen-1)='+';
+ pk+=scopeNameLen;
+ qstrcpy(pk,name); *(pk+nameLen-1)='+';
+ pk+=nameLen;
+ qstrcpy(pk,explicitScopePart);
+ pk+=explicitPartLen;
+
+ // if a file scope is given and it contains using statements we should
+ // also use the file part in the key (as a class name can be in
+ // two different namespaces and a using statement in a file can select
+ // one of them).
+ if (hasUsingStatements)
+ {
+ // below is a more efficient coding of
+ // key+="+"+m_fileScope->name();
+ *pk++='+';
+ qstrcpy(pk,m_fileScope->absFilePath());
+ pk+=fileScopeLen-1;
+ }
+ *pk='\0';
+
+ LookupInfo *pval = 0;
+ {
+ std::lock_guard<std::mutex> lock(g_cacheMutex);
+ pval=Doxygen::lookupCache->find(key.str());
+ //printf("Searching for %s result=%p\n",key.data(),pval);
+ if (pval)
+ {
+ //printf("LookupInfo %p %p '%s' %p\n",
+ // pval->classDef, pval->typeDef, pval->templSpec.data(),
+ // pval->resolvedType.data());
+ if (pTemplSpec) *pTemplSpec=pval->templSpec;
+ if (pTypeDef) *pTypeDef=pval->typeDef;
+ if (pResolvedType) *pResolvedType=pval->resolvedType;
+ //fprintf(stderr,"%d ] cachedMatch=%s\n",--level,
+ // pval->classDef?pval->classDef->name().data():"<none>");
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
+ return pval->classDef;
+ }
+ else // not found yet; we already add a 0 to avoid the possibility of
+ // endless recursion.
+ {
+ pval = Doxygen::lookupCache->insert(key.str(),LookupInfo());
+ }
+ }
+
+ const ClassDef *bestMatch=0;
+ const MemberDef *bestTypedef=0;
+ QCString bestTemplSpec;
+ QCString bestResolvedType;
+ int minDistance=10000; // init at "infinite"
+
+ for (auto it=range.first ; it!=range.second; ++it)
+ {
+ Definition *d = it->second;
+ getResolvedSymbol(scope,d,explicitScopePart,actTemplParams,
+ minDistance,bestMatch,bestTypedef,bestTemplSpec,bestResolvedType);
+ }
+
+ if (pTypeDef)
+ {
+ *pTypeDef = bestTypedef;
+ }
+ if (pTemplSpec)
+ {
+ *pTemplSpec = bestTemplSpec;
+ }
+ if (pResolvedType)
+ {
+ *pResolvedType = bestResolvedType;
+ }
+
+ //printf("getResolvedClassRec: bestMatch=%p pval->resolvedType=%s\n",
+ // bestMatch,bestResolvedType.data());
+
+ if (pval)
+ {
+ std::lock_guard<std::mutex> lock(g_cacheMutex);
+ pval->classDef = bestMatch;
+ pval->typeDef = bestTypedef;
+ pval->templSpec = bestTemplSpec;
+ pval->resolvedType = bestResolvedType;
+ }
+ //fprintf(stderr,"%d ] bestMatch=%s distance=%d\n",--level,
+ // bestMatch?bestMatch->name().data():"<none>",minDistance);
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
+ return bestMatch;
+}
+
+void SymbolResolver::Private::getResolvedSymbol(
+ const Definition *scope, // in
+ const Definition *d, // in
+ const QCString &explicitScopePart, // in
+ const std::unique_ptr<ArgumentList> &actTemplParams, // in
+ int &minDistance, // inout
+ const ClassDef *&bestMatch, // out
+ const MemberDef *&bestTypedef, // out
+ QCString &bestTemplSpec, // out
+ QCString &bestResolvedType // out
+ )
+{
+ //fprintf(stderr,"getResolvedSymbol(%s,%s)\n",scope->name().data(),d->qualifiedName().data());
+ // only look at classes and members that are enums or typedefs
+ if (d->definitionType()==Definition::TypeClass ||
+ (d->definitionType()==Definition::TypeMember &&
+ ((toMemberDef(d))->isTypedef() ||
+ (toMemberDef(d))->isEnumerate())
+ )
+ )
+ {
+ VisitedNamespaces visitedNamespaces;
+ AccessStack accessStack;
+ // test accessibility of definition within scope.
+ int distance = isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope,d,explicitScopePart);
+ //fprintf(stderr," %s; distance %s (%p) is %d\n",scope->name().data(),d->name().data(),d,distance);
+ if (distance!=-1) // definition is accessible
+ {
+ // see if we are dealing with a class or a typedef
+ if (d->definitionType()==Definition::TypeClass) // d is a class
+ {
+ const ClassDef *cd = toClassDef(d);
+ //printf("cd=%s\n",cd->name().data());
+ if (!cd->isTemplateArgument()) // skip classes that
+ // are only there to
+ // represent a template
+ // argument
+ {
+ //printf("is not a templ arg\n");
+ if (distance<minDistance) // found a definition that is "closer"
+ {
+ minDistance=distance;
+ bestMatch = cd;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType = cd->qualifiedName();
+ }
+ else if (distance==minDistance &&
+ m_fileScope && bestMatch &&
+ !m_fileScope->getUsedNamespaces().empty() &&
+ d->getOuterScope()->definitionType()==Definition::TypeNamespace &&
+ bestMatch->getOuterScope()==Doxygen::globalScope
+ )
+ {
+ // in case the distance is equal it could be that a class X
+ // is defined in a namespace and in the global scope. When searched
+ // in the global scope the distance is 0 in both cases. We have
+ // to choose one of the definitions: we choose the one in the
+ // namespace if the fileScope imports namespaces and the definition
+ // found was in a namespace while the best match so far isn't.
+ // Just a non-perfect heuristic but it could help in some situations
+ // (kdecore code is an example).
+ minDistance=distance;
+ bestMatch = cd;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType = cd->qualifiedName();
+ }
+ }
+ else
+ {
+ //printf(" is a template argument!\n");
+ }
+ }
+ else if (d->definitionType()==Definition::TypeMember)
+ {
+ const MemberDef *md = toMemberDef(d);
+ //fprintf(stderr," member isTypedef()=%d\n",md->isTypedef());
+ if (md->isTypedef()) // d is a typedef
+ {
+ QCString args=md->argsString();
+ if (args.isEmpty()) // do not expand "typedef t a[4];"
+ {
+ //printf(" found typedef!\n");
+
+ // we found a symbol at this distance, but if it didn't
+ // resolve to a class, we still have to make sure that
+ // something at a greater distance does not match, since
+ // that symbol is hidden by this one.
+ if (distance<minDistance)
+ {
+ QCString spec;
+ QCString type;
+ minDistance=distance;
+ const MemberDef *enumType = 0;
+ const ClassDef *cd = newResolveTypedef(scope,md,&enumType,&spec,&type,actTemplParams);
+ if (cd) // type resolves to a class
+ {
+ //printf(" bestTypeDef=%p spec=%s type=%s\n",md,spec.data(),type.data());
+ bestMatch = cd;
+ bestTypedef = md;
+ bestTemplSpec = spec;
+ bestResolvedType = type;
+ }
+ else if (enumType) // type resolves to a member type
+ {
+ //printf(" is enum\n");
+ bestMatch = 0;
+ bestTypedef = enumType;
+ bestTemplSpec = "";
+ bestResolvedType = enumType->qualifiedName();
+ }
+ else if (md->isReference()) // external reference
+ {
+ bestMatch = 0;
+ bestTypedef = md;
+ bestTemplSpec = spec;
+ bestResolvedType = type;
+ }
+ else
+ {
+ bestMatch = 0;
+ bestTypedef = md;
+ bestTemplSpec.resize(0);
+ bestResolvedType.resize(0);
+ //printf(" no match\n");
+ }
+ }
+ else
+ {
+ //printf(" not the best match %d min=%d\n",distance,minDistance);
+ }
+ }
+ else
+ {
+ //printf(" not a simple typedef\n")
+ }
+ }
+ else if (md->isEnumerate())
+ {
+ if (distance<minDistance)
+ {
+ minDistance=distance;
+ bestMatch = 0;
+ bestTypedef = md;
+ bestTemplSpec = "";
+ bestResolvedType = md->qualifiedName();
+ }
+ }
+ }
+ } // if definition accessible
+ else
+ {
+ //printf(" Not accessible!\n");
+ }
+ } // if definition is a class or member
+ //printf(" bestMatch=%p bestResolvedType=%s\n",bestMatch,bestResolvedType.data());
+}
+
+const ClassDef *SymbolResolver::Private::newResolveTypedef(
+ const Definition *scope, // in
+ const MemberDef *md, // in
+ const MemberDef **pMemType, // out
+ QCString *pTemplSpec, // out
+ QCString *pResolvedType, // out
+ const std::unique_ptr<ArgumentList> &actTemplParams) // in
+{
+ //printf("newResolveTypedef(md=%p,cachedVal=%p)\n",md,md->getCachedTypedefVal());
+ bool isCached = md->isTypedefValCached(); // value already cached
+ if (isCached)
+ {
+ //printf("Already cached %s->%s [%s]\n",
+ // md->name().data(),
+ // md->getCachedTypedefVal()?md->getCachedTypedefVal()->name().data():"<none>",
+ // md->getCachedResolvedTypedef()?md->getCachedResolvedTypedef().data():"<none>");
+
+ if (pTemplSpec) *pTemplSpec = md->getCachedTypedefTemplSpec();
+ if (pResolvedType) *pResolvedType = md->getCachedResolvedTypedef();
+ return md->getCachedTypedefVal();
+ }
+ //printf("new typedef\n");
+ QCString qname = md->qualifiedName();
+ if (m_resolvedTypedefs.find(qname.str())!=m_resolvedTypedefs.end())
+ {
+ return 0; // typedef already done
+ }
+
+ auto typedef_it = m_resolvedTypedefs.insert({qname.str(),md}).first; // put on the trace list
+
+ const ClassDef *typeClass = md->getClassDef();
+ QCString type = md->typeString(); // get the "value" of the typedef
+ if (typeClass && typeClass->isTemplate() &&
+ actTemplParams && !actTemplParams->empty())
+ {
+ type = substituteTemplateArgumentsInString(type,
+ typeClass->templateArguments(),actTemplParams);
+ }
+ QCString typedefValue = type;
+ int tl=type.length();
+ int ip=tl-1; // remove * and & at the end
+ while (ip>=0 && (type.at(ip)=='*' || type.at(ip)=='&' || type.at(ip)==' '))
+ {
+ ip--;
+ }
+ type=type.left(ip+1);
+ type.stripPrefix("const "); // strip leading "const"
+ type.stripPrefix("struct "); // strip leading "struct"
+ type.stripPrefix("union "); // strip leading "union"
+ int sp=0;
+ tl=type.length(); // length may have been changed
+ while (sp<tl && type.at(sp)==' ') sp++;
+ const MemberDef *memTypeDef = 0;
+ const ClassDef *result = getResolvedClassRec(md->getOuterScope(),type,
+ &memTypeDef,0,pResolvedType);
+ // if type is a typedef then return what it resolves to.
+ if (memTypeDef && memTypeDef->isTypedef())
+ {
+ result=newResolveTypedef(m_fileScope,memTypeDef,pMemType,pTemplSpec,0);
+ goto done;
+ }
+ else if (memTypeDef && memTypeDef->isEnumerate() && pMemType)
+ {
+ *pMemType = memTypeDef;
+ }
+
+ //printf("type=%s result=%p\n",type.data(),result);
+ if (result==0)
+ {
+ // try unspecialized version if type is template
+ int si=type.findRev("::");
+ int i=type.find('<');
+ if (si==-1 && i!=-1) // typedef of a template => try the unspecialized version
+ {
+ if (pTemplSpec) *pTemplSpec = type.mid(i);
+ result = getResolvedClassRec(md->getOuterScope(),type.left(i),0,0,pResolvedType);
+ //printf("result=%p pRresolvedType=%s sp=%d ip=%d tl=%d\n",
+ // result,pResolvedType?pResolvedType->data():"<none>",sp,ip,tl);
+ }
+ else if (si!=-1) // A::B
+ {
+ i=type.find('<',si);
+ if (i==-1) // Something like A<T>::B => lookup A::B
+ {
+ i=type.length();
+ }
+ else // Something like A<T>::B<S> => lookup A::B, spec=<S>
+ {
+ if (pTemplSpec) *pTemplSpec = type.mid(i);
+ }
+ result = getResolvedClassRec(md->getOuterScope(),
+ stripTemplateSpecifiersFromScope(type.left(i),FALSE),0,0,pResolvedType);
+ }
+
+ //if (result) ip=si+sp+1;
+ }
+
+done:
+ if (pResolvedType)
+ {
+ if (result)
+ {
+ *pResolvedType = result->qualifiedName();
+ //printf("*pResolvedType=%s\n",pResolvedType->data());
+ if (sp>0) pResolvedType->prepend(typedefValue.left(sp));
+ if (ip<tl-1) pResolvedType->append(typedefValue.right(tl-ip-1));
+ }
+ else
+ {
+ *pResolvedType = typedefValue;
+ }
+ }
+
+ // remember computed value for next time
+ if (result && result->getDefFileName()!="<code>")
+ // this check is needed to prevent that temporary classes that are
+ // introduced while parsing code fragments are being cached here.
+ {
+ //printf("setting cached typedef %p in result %p\n",md,result);
+ //printf("==> %s (%s,%d)\n",result->name().data(),result->getDefFileName().data(),result->getDefLine());
+ //printf("*pResolvedType=%s\n",pResolvedType?pResolvedType->data():"<none>");
+ MemberDefMutable *mdm = toMemberDefMutable(md);
+ if (mdm)
+ {
+ mdm->cacheTypedefVal(result,
+ pTemplSpec ? *pTemplSpec : QCString(),
+ pResolvedType ? *pResolvedType : QCString()
+ );
+ }
+ }
+
+ m_resolvedTypedefs.erase(typedef_it); // remove from the trace list
+
+ return result;
+}
+
+int SymbolResolver::Private::isAccessibleFromWithExpScope(
+ VisitedNamespaces &visitedNamespaces,
+ AccessStack &accessStack,
+ const Definition *scope,
+ const Definition *item,
+ const QCString &explicitScopePart)
+{
+ if (explicitScopePart.isEmpty())
+ {
+ // handle degenerate case where there is no explicit scope.
+ return isAccessibleFrom(accessStack,scope,item);
+ }
+
+ if (accessStack.find(scope,m_fileScope,item,explicitScopePart))
+ {
+ return -1;
+ }
+ accessStack.push(scope,m_fileScope,item,explicitScopePart);
+
+
+ //printf(" <isAccessibleFromWithExpScope(%s,%s,%s)\n",scope?scope->name().data():"<global>",
+ // item?item->name().data():"<none>",
+ // explicitScopePart.data());
+ int result=0; // assume we found it
+ const Definition *newScope = followPath(scope,explicitScopePart);
+ if (newScope) // explicitScope is inside scope => newScope is the result
+ {
+ Definition *itemScope = item->getOuterScope();
+ //printf(" scope traversal successful %s<->%s!\n",itemScope->name().data(),newScope->name().data());
+ //if (newScope && newScope->definitionType()==Definition::TypeClass)
+ //{
+ // ClassDef *cd = (ClassDef *)newScope;
+ // printf("---> Class %s: bases=%p\n",cd->name().data(),cd->baseClasses());
+ //}
+ if (itemScope==newScope) // exact match of scopes => distance==0
+ {
+ //printf("> found it\n");
+ }
+ else if (itemScope && newScope &&
+ itemScope->definitionType()==Definition::TypeClass &&
+ newScope->definitionType()==Definition::TypeClass &&
+ (toClassDef(newScope))->isBaseClass(toClassDef(itemScope),TRUE,0)
+ )
+ {
+ // inheritance is also ok. Example: looking for B::I, where
+ // class A { public: class I {} };
+ // class B : public A {}
+ // but looking for B::I, where
+ // class A { public: class I {} };
+ // class B { public: class I {} };
+ // will find A::I, so we still prefer a direct match and give this one a distance of 1
+ result=1;
+
+ //printf("scope(%s) is base class of newScope(%s)\n",
+ // scope->name().data(),newScope->name().data());
+ }
+ else
+ {
+ int i=-1;
+ if (newScope->definitionType()==Definition::TypeNamespace)
+ {
+ visitedNamespaces.insert({newScope->name().str(),newScope});
+ // this part deals with the case where item is a class
+ // A::B::C but is explicit referenced as A::C, where B is imported
+ // in A via a using directive.
+ //printf("newScope is a namespace: %s!\n",newScope->name().data());
+ const NamespaceDef *nscope = toNamespaceDef(newScope);
+ for (const auto &cd : nscope->getUsedClasses())
+ {
+ //printf("Trying for class %s\n",cd->name().data());
+ if (cd==item)
+ {
+ goto done;
+ }
+ }
+ for (const auto &nd : nscope->getUsedNamespaces())
+ {
+ if (visitedNamespaces.find(nd->name().str())==visitedNamespaces.end())
+ {
+ //printf("Trying for namespace %s\n",nd->name().data());
+ i = isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope,item,nd->name());
+ if (i!=-1)
+ {
+ //printf("> found via explicit scope of used namespace\n");
+ goto done;
+ }
+ }
+ }
+ }
+ // repeat for the parent scope
+ if (scope!=Doxygen::globalScope)
+ {
+ i = isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope->getOuterScope(),item,explicitScopePart);
+ }
+ //printf(" | result=%d\n",i);
+ result = (i==-1) ? -1 : i+2;
+ }
+ }
+ else // failed to resolve explicitScope
+ {
+ //printf(" failed to resolve: scope=%s\n",scope->name().data());
+ if (scope->definitionType()==Definition::TypeNamespace)
+ {
+ const NamespaceDef *nscope = toNamespaceDef(scope);
+ StringUnorderedSet visited;
+ if (accessibleViaUsingNamespace(visited,nscope->getUsedNamespaces(),item,explicitScopePart))
+ {
+ //printf("> found in used namespace\n");
+ goto done;
+ }
+ }
+ if (scope==Doxygen::globalScope)
+ {
+ if (m_fileScope)
+ {
+ StringUnorderedSet visited;
+ if (accessibleViaUsingNamespace(visited,m_fileScope->getUsedNamespaces(),item,explicitScopePart))
+ {
+ //printf("> found in used namespace\n");
+ goto done;
+ }
+ }
+ //printf("> not found\n");
+ result=-1;
+ }
+ else // continue by looking into the parent scope
+ {
+ int i=isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope->getOuterScope(),item,explicitScopePart);
+ //printf("> result=%d\n",i);
+ result= (i==-1) ? -1 : i+2;
+ }
+ }
+
+done:
+ //printf(" > result=%d\n",result);
+ accessStack.pop();
+ return result;
+}
+
+const Definition *SymbolResolver::Private::followPath(const Definition *start,const QCString &path)
+{
+ int is,ps;
+ int l;
+ const Definition *current=start;
+ ps=0;
+ //printf("followPath: start='%s' path='%s'\n",start?start->name().data():"<none>",path.data());
+ // for each part of the explicit scope
+ while ((is=getScopeFragment(path,ps,&l))!=-1)
+ {
+ // try to resolve the part if it is a typedef
+ const MemberDef *memTypeDef=0;
+ QCString qualScopePart = substTypedef(current,path.mid(is,l),&memTypeDef);
+ //printf(" qualScopePart=%s\n",qualScopePart.data());
+ if (memTypeDef)
+ {
+ const ClassDef *type = newResolveTypedef(m_fileScope,memTypeDef,0,0,0);
+ if (type)
+ {
+ //printf("Found type %s\n",type->name().data());
+ return type;
+ }
+ }
+ const Definition *next = current->findInnerCompound(qualScopePart);
+ //printf("++ Looking for %s inside %s result %s\n",
+ // qualScopePart.data(),
+ // current->name().data(),
+ // next?next->name().data():"<null>");
+ if (next==0) // failed to follow the path
+ {
+ //printf("==> next==0!\n");
+ if (current->definitionType()==Definition::TypeNamespace)
+ {
+ next = endOfPathIsUsedClass(
+ (toNamespaceDef(current))->getUsedClasses(),qualScopePart);
+ }
+ else if (current->definitionType()==Definition::TypeFile)
+ {
+ next = endOfPathIsUsedClass(
+ (toFileDef(current))->getUsedClasses(),qualScopePart);
+ }
+ current = next;
+ if (current==0) break;
+ }
+ else // continue to follow scope
+ {
+ current = next;
+ //printf("==> current = %p\n",current);
+ }
+ ps=is+l;
+ }
+ //printf("followPath(start=%s,path=%s) result=%s\n",
+ // start->name().data(),path.data(),current?current->name().data():"<null>");
+ return current; // path could be followed
+}
+
+const Definition *SymbolResolver::Private::endOfPathIsUsedClass(LinkedRefMap<const ClassDef> cl,const QCString &localName)
+{
+ for (const auto &cd : cl)
+ {
+ if (cd->localName()==localName)
+ {
+ return cd;
+ }
+ }
+ return 0;
+}
+
+bool SymbolResolver::Private::accessibleViaUsingNamespace(StringUnorderedSet &visited,
+ const LinkedRefMap<const NamespaceDef> &nl,
+ const Definition *item,
+ const QCString &explicitScopePart)
+{
+ for (const auto &und : nl) // check used namespaces for the class
+ {
+ //printf("[Trying via used namespace %s: count=%d/%d\n",und->name().data(),
+ // count,nl->count());
+ const Definition *sc = explicitScopePart.isEmpty() ? und : followPath(und,explicitScopePart);
+ if (sc && item->getOuterScope()==sc)
+ {
+ //printf("] found it\n");
+ return true;
+ }
+ if (item->getLanguage()==SrcLangExt_Cpp)
+ {
+ QCString key=und->name();
+ if (!und->getUsedNamespaces().empty() && visited.find(key.str())==visited.end())
+ {
+ visited.insert(key.str());
+
+ if (accessibleViaUsingNamespace(visited,und->getUsedNamespaces(),item,explicitScopePart))
+ {
+ //printf("] found it via recursion\n");
+ return true;
+ }
+
+ visited.erase(key.str());
+ }
+ }
+ //printf("] Try via used namespace done\n");
+ }
+ return false;
+}
+
+
+bool SymbolResolver::Private::accessibleViaUsingClass(const LinkedRefMap<const ClassDef> &cl,
+ const Definition *item,
+ const QCString &explicitScopePart)
+{
+ for (const auto &ucd : cl)
+ {
+ //printf("Trying via used class %s\n",ucd->name().data());
+ const Definition *sc = explicitScopePart.isEmpty() ? ucd : followPath(ucd,explicitScopePart);
+ if (sc && sc==item) return true;
+ //printf("Try via used class done\n");
+ }
+ return false;
+}
+
+int SymbolResolver::Private::isAccessibleFrom(AccessStack &accessStack,
+ const Definition *scope,
+ const Definition *item)
+{
+ //printf("<isAccessibleFrom(scope=%s,item=%s itemScope=%s)\n",
+ // scope->name().data(),item->name().data(),item->getOuterScope()->name().data());
+
+ if (accessStack.find(scope,m_fileScope,item))
+ {
+ return -1;
+ }
+ accessStack.push(scope,m_fileScope,item);
+
+ int result=0; // assume we found it
+ int i;
+
+ Definition *itemScope=item->getOuterScope();
+ bool memberAccessibleFromScope =
+ (item->definitionType()==Definition::TypeMember && // a member
+ itemScope && itemScope->definitionType()==Definition::TypeClass && // of a class
+ scope->definitionType()==Definition::TypeClass && // accessible
+ (toClassDef(scope))->isAccessibleMember(toMemberDef(item)) // from scope
+ );
+ bool nestedClassInsideBaseClass =
+ (item->definitionType()==Definition::TypeClass && // a nested class
+ itemScope && itemScope->definitionType()==Definition::TypeClass && // inside a base
+ scope->definitionType()==Definition::TypeClass && // class of scope
+ (toClassDef(scope))->isBaseClass(toClassDef(itemScope),TRUE)
+ );
+
+ if (itemScope==scope || memberAccessibleFromScope || nestedClassInsideBaseClass)
+ {
+ //printf("> found it\n");
+ if (nestedClassInsideBaseClass) result++; // penalty for base class to prevent
+ // this is preferred over nested class in this class
+ // see bug 686956
+ }
+ else if (scope==Doxygen::globalScope)
+ {
+ if (m_fileScope)
+ {
+ if (accessibleViaUsingClass(m_fileScope->getUsedClasses(),item))
+ {
+ //printf("> found via used class\n");
+ goto done;
+ }
+ StringUnorderedSet visited;
+ if (accessibleViaUsingNamespace(visited,m_fileScope->getUsedNamespaces(),item))
+ {
+ //printf("> found via used namespace\n");
+ goto done;
+ }
+ }
+ //printf("> reached global scope\n");
+ result=-1; // not found in path to globalScope
+ }
+ else // keep searching
+ {
+ // check if scope is a namespace, which is using other classes and namespaces
+ if (scope->definitionType()==Definition::TypeNamespace)
+ {
+ const NamespaceDef *nscope = toNamespaceDef(scope);
+ //printf(" %s is namespace with %d used classes\n",nscope->name().data(),nscope->getUsedClasses());
+ if (accessibleViaUsingClass(nscope->getUsedClasses(),item))
+ {
+ //printf("> found via used class\n");
+ goto done;
+ }
+ StringUnorderedSet visited;
+ if (accessibleViaUsingNamespace(visited,nscope->getUsedNamespaces(),item))
+ {
+ //printf("> found via used namespace\n");
+ goto done;
+ }
+ }
+ // repeat for the parent scope
+ i=isAccessibleFrom(accessStack,scope->getOuterScope(),item);
+ //printf("> result=%d\n",i);
+ result= (i==-1) ? -1 : i+2;
+ }
+done:
+ accessStack.pop();
+ return result;
+}
+
+QCString SymbolResolver::Private::substTypedef(
+ const Definition *scope,const QCString &name,
+ const MemberDef **pTypeDef)
+{
+ QCString result=name;
+ if (name.isEmpty()) return result;
+
+ auto range = Doxygen::symbolMap.find(name);
+ if (range.first==range.second)
+ return result; // no matches
+
+ MemberDef *bestMatch=0;
+ int minDistance=10000; // init at "infinite"
+
+ for (auto it = range.first; it!=range.second; ++it)
+ {
+ Definition *d = it->second;
+ // only look at members
+ if (d->definitionType()==Definition::TypeMember)
+ {
+ // that are also typedefs
+ MemberDef *md = toMemberDef(d);
+ if (md->isTypedef()) // d is a typedef
+ {
+ VisitedNamespaces visitedNamespaces;
+ AccessStack accessStack;
+ // test accessibility of typedef within scope.
+ int distance = isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope,d,"");
+ if (distance!=-1 && distance<minDistance)
+ // definition is accessible and a better match
+ {
+ minDistance=distance;
+ bestMatch = md;
+ }
+ }
+ }
+ }
+
+ if (bestMatch)
+ {
+ result = bestMatch->typeString();
+ if (pTypeDef) *pTypeDef=bestMatch;
+ }
+
+ //printf("substTypedef(%s,%s)=%s\n",scope?scope->name().data():"<global>",
+ // name.data(),result.data());
+ return result;
+}
+
+//----------------------------------------------------------------------------------------------
+
+
+SymbolResolver::SymbolResolver(const FileDef *fileScope)
+ : p(std::make_unique<Private>(fileScope))
+{
+}
+
+SymbolResolver::~SymbolResolver()
+{
+}
+
+
+const ClassDef *SymbolResolver::resolveClass(const Definition *scope,
+ const char *name,
+ bool mayBeUnlinkable,
+ bool mayBeHidden)
+{
+ p->reset();
+
+ if (scope==0 ||
+ (scope->definitionType()!=Definition::TypeClass &&
+ scope->definitionType()!=Definition::TypeNamespace
+ ) ||
+ (scope->getLanguage()==SrcLangExt_Java && QCString(name).find("::")!=-1)
+ )
+ {
+ scope=Doxygen::globalScope;
+ }
+ //fprintf(stderr,"------------ resolveClass(scope=%s,name=%s,mayUnlinkable=%d)\n",
+ // scope?scope->name().data():"<global>",
+ // name,
+ // mayBeUnlinkable
+ // );
+ const ClassDef *result;
+ if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
+ {
+ result = getClass(name);
+ }
+ else
+ {
+ result = p->getResolvedClassRec(scope,name,&p->typeDef,&p->templateSpec,&p->resolvedType);
+ if (result==0) // for nested classes imported via tag files, the scope may not
+ // present, so we check the class name directly as well.
+ // See also bug701314
+ {
+ result = getClass(name);
+ }
+ }
+ if (!mayBeUnlinkable && result && !result->isLinkable())
+ {
+ if (!mayBeHidden || !result->isHidden())
+ {
+ //printf("result was %s\n",result?result->name().data():"<none>");
+ result=0; // don't link to artificial/hidden classes unless explicitly allowed
+ }
+ }
+ //fprintf(stderr,"ResolvedClass(%s,%s)=%s\n",scope?scope->name().data():"<global>",
+ // name,result?result->name().data():"<none>");
+ return result;
+}
+
+int SymbolResolver::isAccessibleFrom(const Definition *scope,const Definition *item)
+{
+ p->reset();
+ AccessStack accessStack;
+ return p->isAccessibleFrom(accessStack,scope,item);
+}
+
+int SymbolResolver::isAccessibleFromWithExpScope(const Definition *scope,const Definition *item,
+ const QCString &explicitScopePart)
+{
+ p->reset();
+ VisitedNamespaces visitedNamespaces;
+ AccessStack accessStack;
+ return p->isAccessibleFromWithExpScope(visitedNamespaces,accessStack,scope,item,explicitScopePart);
+}
+
+void SymbolResolver::setFileScope(const FileDef *fileScope)
+{
+ p->setFileScope(fileScope);
+}
+
+const MemberDef *SymbolResolver::getTypedef() const
+{
+ return p->typeDef;
+}
+
+QCString SymbolResolver::getTemplateSpec() const
+{
+ return p->templateSpec;
+}
+
+QCString SymbolResolver::getResolvedType() const
+{
+ return p->resolvedType;
+}
+
diff --git a/src/symbolresolver.h b/src/symbolresolver.h
new file mode 100644
index 0000000..5536c1e
--- /dev/null
+++ b/src/symbolresolver.h
@@ -0,0 +1,104 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SYMBOLRESOLVER_H
+#define SYMBOLRESOLVER_H
+
+#include <memory>
+#include "qcstring.h"
+#include "classdef.h"
+
+class Definition;
+class FileDef;
+class MemberDef;
+
+//! Helper class to find a class definition or check if
+//! A symbol is accessible in a given scope.
+class SymbolResolver
+{
+ public:
+ explicit SymbolResolver(const FileDef *fileScope = 0);
+ ~SymbolResolver();
+
+ // actions
+
+ /** Find the class definition matching name within
+ * the scope set.
+ * @param scope The scope to search from.
+ * @param name The name of the symbol.
+ * @param maybeUnlinkable include unlinkable symbols in the search.
+ * @param mayBeHidden include hidden symbols in the search.
+ * @note As a result of this call the getters getTypedef(),
+ * getTemplateSpec(), and getResolvedType() are set as well.
+ */
+ const ClassDef *resolveClass(const Definition *scope,
+ const char *name,
+ bool maybeUnlinkable=false,
+ bool mayBeHidden=false);
+
+ /** Wrapper around resolveClass that returns a mutable interface to
+ * the class object or a nullptr if the symbol is immutable.
+ */
+ ClassDefMutable *resolveClassMutable(const Definition *scope,
+ const char *name,
+ bool mayBeUnlinkable=false,
+ bool mayBeHidden=false)
+ {
+ return toClassDefMutable(resolveClass(scope,name,mayBeUnlinkable,mayBeHidden));
+ }
+
+ /** Checks if symbol \a item is accessible from within \a scope.
+ * @returns -1 if \a item is not accessible or a number indicating how
+ * many scope levels up the nearest match was found.
+ */
+ int isAccessibleFrom(const Definition *scope,
+ const Definition *item);
+
+ /** Check if symbol \a item is accessible from within \a scope,
+ * where it has to match the \a explicitScopePart.
+ * @returns -1 if \a item is not accessible or a number indicating how
+ * many scope levels up the nearest match was found.
+ */
+ int isAccessibleFromWithExpScope(const Definition *scope,
+ const Definition *item,
+ const QCString &explicitScopePart
+ );
+
+ /** Sets or updates the file scope using when resolving symbols. */
+ void setFileScope(const FileDef *fd);
+
+ // getters
+
+ /** In case a call to resolveClass() resolves to a type member (e.g. an enum)
+ * this method will return it.
+ */
+ const MemberDef *getTypedef() const;
+
+ /** In case a call to resolveClass() points to a template specialization, the
+ * template part is return via this method.
+ */
+ QCString getTemplateSpec() const;
+
+ /** In case a call to resolveClass() points to a typedef or using declaration.
+ * The type name it resolved to is returned via this method.
+ */
+ QCString getResolvedType() const;
+
+ private:
+ struct Private;
+ std::unique_ptr<Private> p;
+};
+
+#endif
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index 3f9a7a1..d5f8d5f 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -1,13 +1,13 @@
/******************************************************************************
*
- *
+ *
*
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -18,22 +18,17 @@
#include "tagreader.h"
+#include <map>
+#include <functional>
+#include <utility>
+#include <algorithm>
+
#include <assert.h>
#include <stdio.h>
#include <stdarg.h>
-#include <algorithm>
-
-
-#include <qxml.h>
-#include <qstack.h>
-#include <qdict.h>
-#include <qfileinfo.h>
-#include <qlist.h>
-#include <qstring.h>
-#include <qcstringlist.h>
+#include "xml.h"
#include "entry.h"
-#include "classdef.h"
#include "doxygen.h"
#include "util.h"
#include "message.h"
@@ -42,438 +37,321 @@
#include "filedef.h"
#include "filename.h"
#include "section.h"
-#include "groupdef.h"
+#include "containers.h"
/** Information about an linkable anchor */
class TagAnchorInfo
{
public:
- TagAnchorInfo(const QCString &f,
- const QCString &l,
- const QCString &t=QCString())
+ TagAnchorInfo(const std::string &f,
+ const std::string &l,
+ const std::string &t=std::string())
: label(l), fileName(f), title(t) {}
- QCString label;
- QCString fileName;
- QCString title;
+ std::string label;
+ std::string fileName;
+ std::string title;
};
-/** List of TagAnchorInfo objects. */
-class TagAnchorInfoList : public QList<TagAnchorInfo>
+/** Container for enum values that are scoped within an enum */
+class TagEnumValueInfo
{
- public:
- TagAnchorInfoList() : QList<TagAnchorInfo>() { setAutoDelete(TRUE); }
- virtual ~TagAnchorInfoList() {}
+ public:
+ std::string name;
+ std::string file;
+ std::string anchor;
+ std::string clangid;
};
-/** Container for enum values that are scoped within an enum */
-class TagEnumValueInfo
+/** Container for include info that can be read from a tagfile */
+class TagIncludeInfo
{
public:
- QCString name;
- QCString file;
- QCString anchor;
- QCString clangid;
+ std::string id;
+ std::string name;
+ std::string text;
+ bool isLocal;
+ bool isImported;
};
/** Container for member specific info that can be read from a tagfile */
class TagMemberInfo
{
public:
- TagMemberInfo() : prot(Public), virt(Normal), isStatic(FALSE)
- { enumValues.setAutoDelete(TRUE); }
- QCString type;
- QCString name;
- QCString anchorFile;
- QCString anchor;
- QCString arglist;
- QCString kind;
- QCString clangId;
- TagAnchorInfoList docAnchors;
- Protection prot;
- Specifier virt;
- bool isStatic;
- QList<TagEnumValueInfo> enumValues;
+ std::string type;
+ std::string name;
+ std::string anchorFile;
+ std::string anchor;
+ std::string arglist;
+ std::string kind;
+ std::string clangId;
+ std::vector<TagAnchorInfo> docAnchors;
+ Protection prot = Public;
+ Specifier virt = Normal;
+ bool isStatic = false;
+ std::vector<TagEnumValueInfo> enumValues;
+};
+
+/** Base class for all compound types */
+class TagCompoundInfo
+{
+ public:
+ enum class CompoundType { Class, Namespace, Package, File, Group, Page, Dir };
+ explicit TagCompoundInfo(CompoundType type) : m_type(type) {}
+ virtual ~TagCompoundInfo() {}
+ CompoundType compoundType() const { return m_type; }
+ std::vector<TagMemberInfo> members;
+ std::string name;
+ std::string filename;
+ std::vector<TagAnchorInfo> docAnchors;
+ private:
+ CompoundType m_type;
};
/** Container for class specific info that can be read from a tagfile */
-class TagClassInfo
+class TagClassInfo : public TagCompoundInfo
{
public:
- enum Kind { None=-1, Class, Struct, Union, Interface, Exception, Protocol, Category, Enum, Service, Singleton };
- TagClassInfo() { templateArguments=0; members.setAutoDelete(TRUE); isObjC=FALSE; kind = None; }
- ~TagClassInfo() { delete templateArguments; }
- QCString name;
- QCString filename;
- QCString clangId;
- QCString anchor;
- TagAnchorInfoList docAnchors;
+ enum class Kind { None=-1, Class, Struct, Union, Interface, Exception, Protocol, Category, Enum, Service, Singleton };
+ TagClassInfo(Kind k) : TagCompoundInfo(CompoundType::Class), kind(k) {}
+ std::string clangId;
+ std::string anchor;
std::vector<BaseInfo> bases;
- QList<TagMemberInfo> members;
- QList<QCString> *templateArguments;
- QCStringList classList;
+ StringVector templateArguments;
+ StringVector classList;
Kind kind;
- bool isObjC;
+ bool isObjC = false;
+ static TagClassInfo *get(std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<TagClassInfo*>(t.get());
+ }
+ static const TagClassInfo *get(const std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<const TagClassInfo*>(t.get());
+ }
};
/** Container for namespace specific info that can be read from a tagfile */
-class TagNamespaceInfo
+class TagNamespaceInfo : public TagCompoundInfo
{
public:
- TagNamespaceInfo() { members.setAutoDelete(TRUE); }
- QCString name;
- QCString filename;
- QCString clangId;
- QCStringList classList;
- QCStringList namespaceList;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
+ TagNamespaceInfo() :TagCompoundInfo(CompoundType::Namespace) {}
+ std::string clangId;
+ StringVector classList;
+ StringVector namespaceList;
+ static TagNamespaceInfo *get(std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<TagNamespaceInfo*>(t.get());
+ }
+ static const TagNamespaceInfo *get(const std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<const TagNamespaceInfo*>(t.get());
+ }
};
/** Container for package specific info that can be read from a tagfile */
-class TagPackageInfo
+class TagPackageInfo : public TagCompoundInfo
{
public:
- TagPackageInfo() { members.setAutoDelete(TRUE); }
- QCString name;
- QCString filename;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
- QCStringList classList;
-};
-
-/** Container for include info that can be read from a tagfile */
-class TagIncludeInfo
-{
- public:
- QCString id;
- QCString name;
- QCString text;
- bool isLocal;
- bool isImported;
+ TagPackageInfo() : TagCompoundInfo(CompoundType::Package) { }
+ StringVector classList;
+ static TagPackageInfo *get(std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<TagPackageInfo*>(t.get());
+ }
+ static const TagPackageInfo *get(const std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<const TagPackageInfo*>(t.get());
+ }
};
/** Container for file specific info that can be read from a tagfile */
-class TagFileInfo
+class TagFileInfo : public TagCompoundInfo
{
public:
- TagFileInfo() { members.setAutoDelete(TRUE); includes.setAutoDelete(TRUE); }
- QCString name;
- QCString path;
- QCString filename;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
- QCStringList classList;
- QCStringList namespaceList;
- QList<TagIncludeInfo> includes;
+ TagFileInfo() : TagCompoundInfo(CompoundType::File) { }
+ std::string path;
+ StringVector classList;
+ StringVector namespaceList;
+ std::vector<TagIncludeInfo> includes;
+ static TagFileInfo *get(std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<TagFileInfo*>(t.get());
+ }
+ static const TagFileInfo *get(const std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<const TagFileInfo*>(t.get());
+ }
};
/** Container for group specific info that can be read from a tagfile */
-class TagGroupInfo
+class TagGroupInfo : public TagCompoundInfo
{
public:
- TagGroupInfo() { members.setAutoDelete(TRUE); }
- QCString name;
- QCString title;
- QCString filename;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
- QCStringList subgroupList;
- QCStringList classList;
- QCStringList namespaceList;
- QCStringList fileList;
- QCStringList pageList;
- QCStringList dirList;
+ TagGroupInfo() : TagCompoundInfo(CompoundType::Group) { }
+ std::string title;
+ StringVector subgroupList;
+ StringVector classList;
+ StringVector namespaceList;
+ StringVector fileList;
+ StringVector pageList;
+ StringVector dirList;
+ static TagGroupInfo *get(std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<TagGroupInfo*>(t.get());
+ }
+ static const TagGroupInfo *get(const std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<const TagGroupInfo*>(t.get());
+ }
};
/** Container for page specific info that can be read from a tagfile */
-class TagPageInfo
+class TagPageInfo : public TagCompoundInfo
{
public:
- QCString name;
- QCString title;
- QCString filename;
- TagAnchorInfoList docAnchors;
+ TagPageInfo() : TagCompoundInfo(CompoundType::Page) {}
+ std::string title;
+ static TagPageInfo *get(std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<TagPageInfo*>(t.get());
+ }
+ static const TagPageInfo *get(const std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<const TagPageInfo*>(t.get());
+ }
};
/** Container for directory specific info that can be read from a tagfile */
-class TagDirInfo
+class TagDirInfo : public TagCompoundInfo
{
public:
- QCString name;
- QCString filename;
- QCString path;
- QCStringList subdirList;
- QCStringList fileList;
- TagAnchorInfoList docAnchors;
+ TagDirInfo() : TagCompoundInfo(CompoundType::Dir) {}
+ std::string path;
+ StringVector subdirList;
+ StringVector fileList;
+ static TagDirInfo *get(std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<TagDirInfo*>(t.get());
+ }
+ static const TagDirInfo *get(const std::unique_ptr<TagCompoundInfo> &t)
+ {
+ return dynamic_cast<const TagDirInfo*>(t.get());
+ }
};
-/** Tag file parser.
+/** Tag file parser.
*
* Reads an XML-structured tagfile and builds up the structure in
- * memory. The method buildLists() is used to transfer/translate
+ * memory. The method buildLists() is used to transfer/translate
* the structures to the doxygen engine.
*/
-class TagFileParser : public QXmlDefaultHandler
+class TagFileParser
{
- enum State { Invalid,
- InClass,
- InFile,
- InNamespace,
- InGroup,
- InPage,
- InMember,
- InEnumValue,
- InPackage,
- InDir,
- InTempArgList
- };
- class StartElementHandler
- {
- typedef void (TagFileParser::*Handler)(const QXmlAttributes &attrib);
- public:
- StartElementHandler(TagFileParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
- void operator()(const QXmlAttributes &attrib) { (m_parent->*m_handler)(attrib); }
- private:
- TagFileParser *m_parent;
- Handler m_handler;
- };
-
- class EndElementHandler
- {
- typedef void (TagFileParser::*Handler)();
- public:
- EndElementHandler(TagFileParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
- void operator()() { (m_parent->*m_handler)(); }
- private:
- TagFileParser *m_parent;
- Handler m_handler;
- };
-
public:
- TagFileParser(const char *tagName) : m_startElementHandlers(17),
- m_endElementHandlers(17),
- m_tagName(tagName)
- {
- m_startElementHandlers.setAutoDelete(TRUE);
- m_endElementHandlers.setAutoDelete(TRUE);
- m_curClass=0;
- m_curFile=0;
- m_curNamespace=0;
- m_curPackage=0;
- m_curGroup=0;
- m_curPage=0;
- m_curDir=0;
- m_curMember=0;
- m_curEnumValue=0;
- m_curIncludes=0;
- m_state = Invalid;
- m_locator = 0;
- }
+ TagFileParser(const char *tagName) : m_tagName(tagName) {}
- void setDocumentLocator ( QXmlLocator * locator )
+ void setDocumentLocator ( const XMLLocator * locator )
{
m_locator = locator;
}
- void setFileName( const QString &fileName )
+ void startDocument()
{
- m_inputFileName = fileName.utf8();
+ m_state = Invalid;
}
- void warn(const char *fmt)
- {
- ::warn(m_inputFileName,m_locator->lineNumber(),fmt);
- }
- void warn(const char *fmt,const char *s)
+ void startElement( const std::string &name, const XMLHandlers::Attributes& attrib );
+ void endElement( const std::string &name );
+ void characters ( const std::string & ch ) { m_curString+=ch; }
+ void error( const std::string &fileName,int lineNr,const std::string &msg)
{
- ::warn(m_inputFileName,m_locator->lineNumber(),fmt,s);
+ ::warn(fileName.c_str(),lineNr,"%s",msg.c_str());
}
- void startCompound( const QXmlAttributes& attrib )
- {
- m_curString = "";
- QString kind = attrib.value("kind");
- QString isObjC = attrib.value("objc");
- if (kind=="class")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Class;
- m_state = InClass;
- }
- else if (kind=="struct")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Struct;
- m_state = InClass;
- }
- else if (kind=="union")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Union;
- m_state = InClass;
- }
- else if (kind=="interface")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Interface;
- m_state = InClass;
- }
- else if (kind=="enum")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Enum;
- m_state = InClass;
- }
- else if (kind=="exception")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Exception;
- m_state = InClass;
- }
- else if (kind=="protocol")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Protocol;
- m_state = InClass;
- }
- else if (kind=="category")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Category;
- m_state = InClass;
- }
- else if (kind=="service")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Service;
- m_state = InClass;
- }
- else if (kind=="singleton")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Singleton;
- m_state = InClass;
- }
- else if (kind=="file")
- {
- m_curFile = new TagFileInfo;
- m_state = InFile;
- }
- else if (kind=="namespace")
- {
- m_curNamespace = new TagNamespaceInfo;
- m_state = InNamespace;
- }
- else if (kind=="group")
- {
- m_curGroup = new TagGroupInfo;
- m_state = InGroup;
- }
- else if (kind=="page")
- {
- m_curPage = new TagPageInfo;
- m_state = InPage;
- }
- else if (kind=="package")
- {
- m_curPackage = new TagPackageInfo;
- m_state = InPackage;
- }
- else if (kind=="dir")
- {
- m_curDir = new TagDirInfo;
- m_state = InDir;
- }
- else
- {
- warn("Unknown compound attribute '%s' found!",kind.data());
- m_state = Invalid;
- }
- if (isObjC=="yes" && m_curClass)
- {
- m_curClass->isObjC = TRUE;
- }
- }
+ void dump();
+ void buildLists(const std::shared_ptr<Entry> &root);
+ void addIncludes();
+ void startCompound( const XMLHandlers::Attributes& attrib );
void endCompound()
{
switch (m_state)
{
- case InClass: m_tagFileClasses.append(m_curClass);
- m_curClass=0; break;
- case InFile: m_tagFileFiles.append(m_curFile);
- m_curFile=0; break;
- case InNamespace: m_tagFileNamespaces.append(m_curNamespace);
- m_curNamespace=0; break;
- case InGroup: m_tagFileGroups.append(m_curGroup);
- m_curGroup=0; break;
- case InPage: m_tagFilePages.append(m_curPage);
- m_curPage=0; break;
- case InDir: m_tagFileDirs.append(m_curDir);
- m_curDir=0; break;
- case InPackage: m_tagFilePackages.append(m_curPackage);
- m_curPackage=0; break;
+ case InClass:
+ case InFile:
+ case InNamespace:
+ case InGroup:
+ case InPage:
+ case InDir:
+ case InPackage:
+ m_tagFileCompounds.push_back(std::move(m_curCompound));
+ break;
default:
- warn("tag 'compound' was not expected!");
+ warn("tag 'compound' was not expected!");
+ break;
}
}
- void startMember( const QXmlAttributes& attrib)
+ void startMember( const XMLHandlers::Attributes& attrib)
{
- m_curMember = new TagMemberInfo;
- m_curMember->kind = attrib.value("kind").utf8();
- QCString protStr = attrib.value("protection").utf8();
- QCString virtStr = attrib.value("virtualness").utf8();
- QCString staticStr = attrib.value("static").utf8();
+ m_curMember = TagMemberInfo();
+ m_curMember.kind = XMLHandlers::value(attrib,"kind");
+ std::string protStr = XMLHandlers::value(attrib,"protection");
+ std::string virtStr = XMLHandlers::value(attrib,"virtualness");
+ std::string staticStr = XMLHandlers::value(attrib,"static");
if (protStr=="protected")
{
- m_curMember->prot = Protected;
+ m_curMember.prot = Protected;
}
else if (protStr=="private")
{
- m_curMember->prot = Private;
+ m_curMember.prot = Private;
}
if (virtStr=="virtual")
{
- m_curMember->virt = Virtual;
+ m_curMember.virt = Virtual;
}
else if (virtStr=="pure")
{
- m_curMember->virt = Pure;
+ m_curMember.virt = Pure;
}
if (staticStr=="yes")
{
- m_curMember->isStatic = TRUE;
+ m_curMember.isStatic = TRUE;
}
- m_stateStack.push(new State(m_state));
+ m_stateStack.push(m_state);
m_state = InMember;
}
void endMember()
{
- m_state = *m_stateStack.top();
- m_stateStack.remove();
+ m_state = m_stateStack.top();
+ m_stateStack.pop();
switch(m_state)
{
- case InClass: m_curClass->members.append(m_curMember); break;
- case InFile: m_curFile->members.append(m_curMember); break;
- case InNamespace: m_curNamespace->members.append(m_curMember); break;
- case InGroup: m_curGroup->members.append(m_curMember); break;
- case InPackage: m_curPackage->members.append(m_curMember); break;
- default: warn("Unexpected tag 'member' found"); break;
+ case InClass:
+ case InFile:
+ case InNamespace:
+ case InGroup:
+ case InPackage:
+ m_curCompound->members.push_back(m_curMember);
+ break;
+ default:
+ warn("Unexpected tag 'member' found");
+ break;
}
}
- void startEnumValue( const QXmlAttributes& attrib)
+ void startEnumValue( const XMLHandlers::Attributes& attrib)
{
if (m_state==InMember)
{
m_curString = "";
- m_curEnumValue = new TagEnumValueInfo;
- m_curEnumValue->file = attrib.value("file").utf8();
- m_curEnumValue->anchor = attrib.value("anchor").utf8();
- m_curEnumValue->clangid = attrib.value("clangid").utf8();
- m_stateStack.push(new State(m_state));
+ m_curEnumValue = TagEnumValueInfo();
+ m_curEnumValue.file = XMLHandlers::value(attrib,"file");
+ m_curEnumValue.anchor = XMLHandlers::value(attrib,"anchor");
+ m_curEnumValue.clangid = XMLHandlers::value(attrib,"clangid");
+ m_stateStack.push(m_state);
m_state = InEnumValue;
}
else
@@ -484,13 +362,13 @@ class TagFileParser : public QXmlDefaultHandler
void endEnumValue()
{
- m_curEnumValue->name = m_curString.stripWhiteSpace();
- m_state = *m_stateStack.top();
- m_stateStack.remove();
+ m_curEnumValue.name = QCString(m_curString).stripWhiteSpace();
+ m_state = m_stateStack.top();
+ m_stateStack.pop();
if (m_state==InMember)
{
- m_curMember->enumValues.append(m_curEnumValue);
- m_curEnumValue=0;
+ m_curMember.enumValues.push_back(m_curEnumValue);
+ m_curEnumValue=TagEnumValueInfo();
}
}
@@ -507,7 +385,7 @@ class TagFileParser : public QXmlDefaultHandler
case InMember:
case InPackage:
case InDir:
- if (QString(m_curString).startsWith("autotoc_md")) return;
+ if (m_curString.rfind("autotoc_md",0)==0) return;
break;
default:
warn("Unexpected tag 'docanchor' found");
@@ -515,14 +393,18 @@ class TagFileParser : public QXmlDefaultHandler
}
switch(m_state)
{
- case InClass: m_curClass->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
- case InFile: m_curFile->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
- case InNamespace: m_curNamespace->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
- case InGroup: m_curGroup->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
- case InPage: m_curPage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
- case InMember: m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
- case InPackage: m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
- case InDir: m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString,m_title)); break;
+ case InClass:
+ case InFile:
+ case InNamespace:
+ case InGroup:
+ case InPage:
+ case InPackage:
+ case InDir:
+ m_curCompound->docAnchors.push_back(TagAnchorInfo(m_fileName,m_curString,m_title));
+ break;
+ case InMember:
+ m_curMember.docAnchors.push_back(TagAnchorInfo(m_fileName,m_curString,m_title));
+ break;
default: break; // will not be reached
}
}
@@ -531,12 +413,24 @@ class TagFileParser : public QXmlDefaultHandler
{
switch(m_state)
{
- case InClass: m_curClass->classList.append(m_curString); break;
- case InFile: m_curFile->classList.append(m_curString); break;
- case InNamespace: m_curNamespace->classList.append(m_curString); break;
- case InGroup: m_curGroup->classList.append(m_curString); break;
- case InPackage: m_curPackage->classList.append(m_curString); break;
- default: warn("Unexpected tag 'class' found"); break;
+ case InClass:
+ TagClassInfo::get(m_curCompound)->classList.push_back(m_curString);
+ break;
+ case InFile:
+ TagFileInfo::get(m_curCompound)->classList.push_back(m_curString);
+ break;
+ case InNamespace:
+ TagNamespaceInfo::get(m_curCompound)->classList.push_back(m_curString);
+ break;
+ case InGroup:
+ TagGroupInfo::get(m_curCompound)->classList.push_back(m_curString);
+ break;
+ case InPackage:
+ TagPackageInfo::get(m_curCompound)->classList.push_back(m_curString);
+ break;
+ default:
+ warn("Unexpected tag 'class' found");
+ break;
}
}
@@ -544,10 +438,18 @@ class TagFileParser : public QXmlDefaultHandler
{
switch(m_state)
{
- case InNamespace: m_curNamespace->classList.append(m_curString); break;
- case InFile: m_curFile->namespaceList.append(m_curString); break;
- case InGroup: m_curGroup->namespaceList.append(m_curString); break;
- default: warn("Unexpected tag 'namespace' found"); break;
+ case InNamespace:
+ TagNamespaceInfo::get(m_curCompound)->namespaceList.push_back(m_curString);
+ break;
+ case InFile:
+ TagFileInfo::get(m_curCompound)->namespaceList.push_back(m_curString);
+ break;
+ case InGroup:
+ TagGroupInfo::get(m_curCompound)->namespaceList.push_back(m_curString);
+ break;
+ default:
+ warn("Unexpected tag 'namespace' found");
+ break;
}
}
@@ -555,9 +457,15 @@ class TagFileParser : public QXmlDefaultHandler
{
switch(m_state)
{
- case InGroup: m_curGroup->fileList.append(m_curString); break;
- case InDir: m_curDir->fileList.append(m_curString); break;
- default: warn("Unexpected tag 'file' found"); break;
+ case InGroup:
+ TagGroupInfo::get(m_curCompound)->fileList.push_back(m_curString);
+ break;
+ case InDir:
+ TagDirInfo::get(m_curCompound)->fileList.push_back(m_curString);
+ break;
+ default:
+ warn("Unexpected tag 'file' found");
+ break;
}
}
@@ -565,8 +473,12 @@ class TagFileParser : public QXmlDefaultHandler
{
switch(m_state)
{
- case InGroup: m_curGroup->fileList.append(m_curString); break;
- default: warn("Unexpected tag 'page' found"); break;
+ case InGroup:
+ TagGroupInfo::get(m_curCompound)->fileList.push_back(m_curString);
+ break;
+ default:
+ warn("Unexpected tag 'page' found");
+ break;
}
}
@@ -574,20 +486,24 @@ class TagFileParser : public QXmlDefaultHandler
{
switch(m_state)
{
- case InDir: m_curDir->subdirList.append(m_curString); break;
- default: warn("Unexpected tag 'dir' found"); break;
+ case InDir:
+ TagDirInfo::get(m_curCompound)->subdirList.push_back(m_curString);
+ break;
+ default:
+ warn("Unexpected tag 'dir' found");
+ break;
}
}
- void startStringValue(const QXmlAttributes& )
+ void startStringValue(const XMLHandlers::Attributes& )
{
m_curString = "";
}
- void startDocAnchor(const QXmlAttributes& attrib )
+ void startDocAnchor(const XMLHandlers::Attributes& attrib )
{
- m_fileName = attrib.value("file").utf8();
- m_title = attrib.value("title").utf8();
+ m_fileName = XMLHandlers::value(attrib,"file");
+ m_title = XMLHandlers::value(attrib,"title");
m_curString = "";
}
@@ -595,7 +511,7 @@ class TagFileParser : public QXmlDefaultHandler
{
if (m_state==InMember)
{
- m_curMember->type = m_curString;
+ m_curMember.type = m_curString;
}
else
{
@@ -607,25 +523,31 @@ class TagFileParser : public QXmlDefaultHandler
{
switch (m_state)
{
- case InClass: m_curClass->name = m_curString; break;
- case InFile: m_curFile->name = m_curString; break;
- case InNamespace: m_curNamespace->name = m_curString; break;
- case InGroup: m_curGroup->name = m_curString; break;
- case InPage: m_curPage->name = m_curString; break;
- case InDir: m_curDir->name = m_curString; break;
- case InMember: m_curMember->name = m_curString; break;
- case InPackage: m_curPackage->name = m_curString; break;
- default: warn("Unexpected tag 'name' found"); break;
+ case InClass:
+ case InFile:
+ case InNamespace:
+ case InGroup:
+ case InPage:
+ case InDir:
+ case InPackage:
+ m_curCompound->name = m_curString;
+ break;
+ case InMember:
+ m_curMember.name = m_curString;
+ break;
+ default:
+ warn("Unexpected tag 'name' found");
+ break;
}
}
- void startBase(const QXmlAttributes& attrib )
+ void startBase(const XMLHandlers::Attributes& attrib )
{
m_curString="";
- if (m_state==InClass && m_curClass)
+ if (m_state==InClass && m_curCompound)
{
- QString protStr = attrib.value("protection");
- QString virtStr = attrib.value("virtualness");
+ std::string protStr = XMLHandlers::value(attrib,"protection");
+ std::string virtStr = XMLHandlers::value(attrib,"virtualness");
Protection prot = Public;
Specifier virt = Normal;
if (protStr=="protected")
@@ -640,7 +562,7 @@ class TagFileParser : public QXmlDefaultHandler
{
virt = Virtual;
}
- m_curClass->bases.push_back(BaseInfo(m_curString,prot,virt));
+ TagClassInfo::get(m_curCompound)->bases.push_back(BaseInfo(m_curString.c_str(),prot,virt));
}
else
{
@@ -650,9 +572,9 @@ class TagFileParser : public QXmlDefaultHandler
void endBase()
{
- if (m_state==InClass && m_curClass)
+ if (m_state==InClass && m_curCompound)
{
- m_curClass->bases.back().name = m_curString;
+ TagClassInfo::get(m_curCompound)->bases.back().name = m_curString;
}
else
{
@@ -660,39 +582,34 @@ class TagFileParser : public QXmlDefaultHandler
}
}
- void startIncludes(const QXmlAttributes& attrib )
+ void startIncludes(const XMLHandlers::Attributes& attrib )
{
- if (m_state==InFile && m_curFile)
+ m_curIncludes = TagIncludeInfo();
+ m_curIncludes.id = XMLHandlers::value(attrib,"id");
+ m_curIncludes.name = XMLHandlers::value(attrib,"name");
+ m_curIncludes.isLocal = XMLHandlers::value(attrib,"local")=="yes";
+ m_curIncludes.isImported = XMLHandlers::value(attrib,"imported")=="yes";
+ m_curString="";
+ }
+
+ void endIncludes()
+ {
+ m_curIncludes.text = m_curString;
+ if (m_state==InFile && m_curCompound)
{
- m_curIncludes = new TagIncludeInfo;
- m_curIncludes->id = attrib.value("id").utf8();
- m_curIncludes->name = attrib.value("name").utf8();
- m_curIncludes->isLocal = attrib.value("local").utf8()=="yes" ? TRUE : FALSE;
- m_curIncludes->isImported = attrib.value("imported").utf8()=="yes" ? TRUE : FALSE;
- m_curFile->includes.append(m_curIncludes);
+ TagFileInfo::get(m_curCompound)->includes.push_back(m_curIncludes);
}
else
{
warn("Unexpected tag 'includes' found");
}
- m_curString="";
- }
-
- void endIncludes()
- {
- m_curIncludes->text = m_curString;
}
void endTemplateArg()
{
- if (m_state==InClass && m_curClass)
+ if (m_state==InClass && m_curCompound)
{
- if (m_curClass->templateArguments==0)
- {
- m_curClass->templateArguments = new QList<QCString>;
- m_curClass->templateArguments->setAutoDelete(TRUE);
- }
- m_curClass->templateArguments->append(new QCString(m_curString));
+ TagClassInfo::get(m_curCompound)->templateArguments.push_back(m_curString);
}
else
{
@@ -704,14 +621,18 @@ class TagFileParser : public QXmlDefaultHandler
{
switch (m_state)
{
- case InClass: m_curClass->filename = m_curString; break;
- case InNamespace: m_curNamespace->filename = m_curString; break;
- case InFile: m_curFile->filename = m_curString; break;
- case InGroup: m_curGroup->filename = m_curString; break;
- case InPage: m_curPage->filename = m_curString; break;
- case InPackage: m_curPackage->filename = m_curString; break;
- case InDir: m_curDir->filename = m_curString; break;
- default: warn("Unexpected tag 'filename' found"); break;
+ case InClass:
+ case InNamespace:
+ case InFile:
+ case InGroup:
+ case InPage:
+ case InPackage:
+ case InDir:
+ m_curCompound->filename = m_curString;
+ break;
+ default:
+ warn("Unexpected tag 'filename' found");
+ break;
}
}
@@ -719,21 +640,27 @@ class TagFileParser : public QXmlDefaultHandler
{
switch (m_state)
{
- case InFile: m_curFile->path = m_curString; break;
- case InDir: m_curDir->path = m_curString; break;
- default: warn("Unexpected tag 'path' found"); break;
+ case InFile:
+ TagFileInfo::get(m_curCompound)->path = m_curString;
+ break;
+ case InDir:
+ TagDirInfo::get(m_curCompound)->path = m_curString;
+ break;
+ default:
+ warn("Unexpected tag 'path' found");
+ break;
}
}
-
+
void endAnchor()
{
if (m_state==InMember)
{
- m_curMember->anchor = m_curString;
+ m_curMember.anchor = m_curString;
}
else if (m_state==InClass)
{
- m_curClass->anchor = m_curString;
+ TagClassInfo::get(m_curCompound)->anchor = m_curString;
}
else
{
@@ -745,15 +672,15 @@ class TagFileParser : public QXmlDefaultHandler
{
if (m_state==InMember)
{
- m_curMember->clangId = m_curString;
+ m_curMember.clangId = m_curString;
}
else if (m_state==InClass)
{
- m_curClass->clangId = m_curString;
+ TagClassInfo::get(m_curCompound)->clangId = m_curString;
}
else if (m_state==InNamespace)
{
- m_curNamespace->clangId = m_curString;
+ TagNamespaceInfo::get(m_curCompound)->clangId = m_curString;
}
else
{
@@ -762,37 +689,44 @@ class TagFileParser : public QXmlDefaultHandler
}
-
+
void endAnchorFile()
{
if (m_state==InMember)
{
- m_curMember->anchorFile = m_curString;
+ m_curMember.anchorFile = m_curString;
}
else
{
warn("Unexpected tag 'anchorfile' found");
}
}
-
+
void endArglist()
{
if (m_state==InMember)
{
- m_curMember->arglist = m_curString;
+ m_curMember.arglist = m_curString;
}
else
{
warn("Unexpected tag 'arglist' found");
}
}
+
void endTitle()
{
switch (m_state)
{
- case InGroup: m_curGroup->title = m_curString; break;
- case InPage: m_curPage->title = m_curString; break;
- default: warn("Unexpected tag 'title' found"); break;
+ case InGroup:
+ TagGroupInfo::get(m_curCompound)->title = m_curString;
+ break;
+ case InPage:
+ TagPageInfo::get(m_curCompound)->title = m_curString;
+ break;
+ default:
+ warn("Unexpected tag 'title' found");
+ break;
}
}
@@ -800,7 +734,7 @@ class TagFileParser : public QXmlDefaultHandler
{
if (m_state==InGroup)
{
- m_curGroup->subgroupList.append(m_curString);
+ TagGroupInfo::get(m_curCompound)->subgroupList.push_back(m_curString);
}
else
{
@@ -808,7 +742,7 @@ class TagFileParser : public QXmlDefaultHandler
}
}
- void startIgnoreElement(const QXmlAttributes& )
+ void startIgnoreElement(const XMLHandlers::Attributes& )
{
}
@@ -816,478 +750,477 @@ class TagFileParser : public QXmlDefaultHandler
{
}
- bool startDocument()
- {
- m_state = Invalid;
+ void buildMemberList(const std::shared_ptr<Entry> &ce,const std::vector<TagMemberInfo> &members);
+ void addDocAnchors(const std::shared_ptr<Entry> &e,const std::vector<TagAnchorInfo> &l);
- m_curClass=0;
- m_curNamespace=0;
- m_curFile=0;
- m_curGroup=0;
- m_curPage=0;
- m_curPackage=0;
- m_curDir=0;
-
- m_stateStack.setAutoDelete(TRUE);
- m_tagFileClasses.setAutoDelete(TRUE);
- m_tagFileFiles.setAutoDelete(TRUE);
- m_tagFileNamespaces.setAutoDelete(TRUE);
- m_tagFileGroups.setAutoDelete(TRUE);
- m_tagFilePages.setAutoDelete(TRUE);
- m_tagFilePackages.setAutoDelete(TRUE);
- m_tagFileDirs.setAutoDelete(TRUE);
-
- m_startElementHandlers.insert("compound", new StartElementHandler(this,&TagFileParser::startCompound));
- m_startElementHandlers.insert("member", new StartElementHandler(this,&TagFileParser::startMember));
- m_startElementHandlers.insert("enumvalue", new StartElementHandler(this,&TagFileParser::startEnumValue));
- m_startElementHandlers.insert("name", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("base", new StartElementHandler(this,&TagFileParser::startBase));
- m_startElementHandlers.insert("filename", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("includes", new StartElementHandler(this,&TagFileParser::startIncludes));
- m_startElementHandlers.insert("path", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("anchorfile", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("anchor", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("clangid", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("arglist", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("title", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("subgroup", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("class", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("namespace", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("file", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("dir", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startDocAnchor));
- m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement));
- m_startElementHandlers.insert("templarg", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("type", new StartElementHandler(this,&TagFileParser::startStringValue));
-
- m_endElementHandlers.insert("compound", new EndElementHandler(this,&TagFileParser::endCompound));
- m_endElementHandlers.insert("member", new EndElementHandler(this,&TagFileParser::endMember));
- m_endElementHandlers.insert("enumvalue", new EndElementHandler(this,&TagFileParser::endEnumValue));
- m_endElementHandlers.insert("name", new EndElementHandler(this,&TagFileParser::endName));
- m_endElementHandlers.insert("base", new EndElementHandler(this,&TagFileParser::endBase));
- m_endElementHandlers.insert("filename", new EndElementHandler(this,&TagFileParser::endFilename));
- m_endElementHandlers.insert("includes", new EndElementHandler(this,&TagFileParser::endIncludes));
- m_endElementHandlers.insert("path", new EndElementHandler(this,&TagFileParser::endPath));
- m_endElementHandlers.insert("anchorfile", new EndElementHandler(this,&TagFileParser::endAnchorFile));
- m_endElementHandlers.insert("anchor", new EndElementHandler(this,&TagFileParser::endAnchor));
- m_endElementHandlers.insert("clangid", new EndElementHandler(this,&TagFileParser::endClangId));
- m_endElementHandlers.insert("arglist", new EndElementHandler(this,&TagFileParser::endArglist));
- m_endElementHandlers.insert("title", new EndElementHandler(this,&TagFileParser::endTitle));
- m_endElementHandlers.insert("subgroup", new EndElementHandler(this,&TagFileParser::endSubgroup));
- m_endElementHandlers.insert("class" , new EndElementHandler(this,&TagFileParser::endClass));
- m_endElementHandlers.insert("namespace", new EndElementHandler(this,&TagFileParser::endNamespace));
- m_endElementHandlers.insert("file", new EndElementHandler(this,&TagFileParser::endFile));
- m_endElementHandlers.insert("dir", new EndElementHandler(this,&TagFileParser::endDir));
- m_endElementHandlers.insert("page", new EndElementHandler(this,&TagFileParser::endPage));
- m_endElementHandlers.insert("docanchor", new EndElementHandler(this,&TagFileParser::endDocAnchor));
- m_endElementHandlers.insert("tagfile", new EndElementHandler(this,&TagFileParser::endIgnoreElement));
- m_endElementHandlers.insert("templarg", new EndElementHandler(this,&TagFileParser::endTemplateArg));
- m_endElementHandlers.insert("type", new EndElementHandler(this,&TagFileParser::endType));
-
- return TRUE;
- }
-
- bool startElement( const QString&, const QString&,
- const QString&name, const QXmlAttributes& attrib )
- {
- //printf("startElement '%s'\n",name.data());
- StartElementHandler *handler = m_startElementHandlers[name.utf8()];
- if (handler)
- {
- (*handler)(attrib);
- }
- else
- {
- warn("Unknown tag '%s' found!",name.data());
- }
- return TRUE;
- }
-
- bool endElement( const QString&, const QString&, const QString& name )
- {
- //printf("endElement '%s'\n",name.data());
- EndElementHandler *handler = m_endElementHandlers[name.utf8()];
- if (handler)
- {
- (*handler)();
- }
- else
- {
- warn("Unknown tag '%s' found!",name.data());
- }
- return TRUE;
- }
-
- bool characters ( const QString & ch )
- {
- m_curString+=ch.utf8();
- return TRUE;
- }
- void dump();
- void buildLists(const std::shared_ptr<Entry> &root);
- void addIncludes();
-
+ enum State { Invalid,
+ InClass,
+ InFile,
+ InNamespace,
+ InGroup,
+ InPage,
+ InMember,
+ InEnumValue,
+ InPackage,
+ InDir,
+ InTempArgList
+ };
private:
- void buildMemberList(const std::shared_ptr<Entry> &ce,QList<TagMemberInfo> &members);
- void addDocAnchors(const std::shared_ptr<Entry> &e,const TagAnchorInfoList &l);
- QList<TagClassInfo> m_tagFileClasses;
- QList<TagFileInfo> m_tagFileFiles;
- QList<TagNamespaceInfo> m_tagFileNamespaces;
- QList<TagGroupInfo> m_tagFileGroups;
- QList<TagPageInfo> m_tagFilePages;
- QList<TagPackageInfo> m_tagFilePackages;
- QList<TagDirInfo> m_tagFileDirs;
- QDict<StartElementHandler> m_startElementHandlers;
- QDict<EndElementHandler> m_endElementHandlers;
- TagClassInfo *m_curClass;
- TagFileInfo *m_curFile;
- TagNamespaceInfo *m_curNamespace;
- TagPackageInfo *m_curPackage;
- TagGroupInfo *m_curGroup;
- TagPageInfo *m_curPage;
- TagDirInfo *m_curDir;
- TagMemberInfo *m_curMember;
- TagEnumValueInfo *m_curEnumValue;
- TagIncludeInfo *m_curIncludes;
- QCString m_curString;
- QCString m_tagName;
- QCString m_fileName;
- QCString m_title;
- State m_state;
- QStack<State> m_stateStack;
- QXmlLocator *m_locator;
- QCString m_inputFileName;
-};
-/** Error handler for the XML tag file parser.
- *
- * Basically dumps all fatal error to stderr using err().
- */
-class TagFileErrorHandler : public QXmlErrorHandler
-{
- public:
- virtual ~TagFileErrorHandler() {}
- bool warning( const QXmlParseException & )
- {
- return FALSE;
- }
- bool error( const QXmlParseException & )
+ void warn(const char *fmt)
{
- return FALSE;
+ std::string fileName = m_locator->fileName();
+ ::warn(fileName.c_str(),m_locator->lineNr(),"%s", fmt);
}
- bool fatalError( const QXmlParseException &exception )
+
+ void warn(const char *fmt,const char *s)
{
- err("Fatal error at line %d column %d: %s\n",
- exception.lineNumber(),exception.columnNumber(),
- exception.message().data());
- return FALSE;
+ std::string fileName = m_locator->fileName();
+ ::warn(fileName.c_str(),m_locator->lineNr(),fmt,s);
}
- QString errorString() { return ""; }
- private:
- QString errorMsg;
+
+ //------------------------------------
+
+ std::vector< std::unique_ptr<TagCompoundInfo> > m_tagFileCompounds;
+ std::unique_ptr<TagCompoundInfo> m_curCompound;
+
+ TagMemberInfo m_curMember;
+ TagEnumValueInfo m_curEnumValue;
+ TagIncludeInfo m_curIncludes;
+
+ std::string m_curString;
+ std::string m_tagName;
+ std::string m_fileName;
+ std::string m_title;
+ State m_state = Invalid;
+ std::stack<State> m_stateStack;
+ const XMLLocator *m_locator = nullptr;
+};
+
+//---------------------------------------------------------------------------------------------------------------
+
+struct ElementCallbacks
+{
+ using StartCallback = std::function<void(TagFileParser&,const XMLHandlers::Attributes&)>;
+ using EndCallback = std::function<void(TagFileParser&)>;
+
+ StartCallback startCb;
+ EndCallback endCb;
+};
+
+ElementCallbacks::StartCallback startCb(void (TagFileParser::*fn)(const XMLHandlers::Attributes &))
+{
+ return [fn](TagFileParser &parser,const XMLHandlers::Attributes &attr) { (parser.*fn)(attr); };
+}
+
+ElementCallbacks::EndCallback endCb(void (TagFileParser::*fn)())
+{
+ return [fn](TagFileParser &parser) { (parser.*fn)(); };
+}
+
+static const std::map< std::string, ElementCallbacks > g_elementHandlers =
+{
+ // name, start element callback, end element callback
+ { "compound", { startCb(&TagFileParser::startCompound ), endCb(&TagFileParser::endCompound ) } },
+ { "member", { startCb(&TagFileParser::startMember ), endCb(&TagFileParser::endMember ) } },
+ { "enumvalue", { startCb(&TagFileParser::startEnumValue ), endCb(&TagFileParser::endEnumValue ) } },
+ { "name", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endName ) } },
+ { "base", { startCb(&TagFileParser::startBase ), endCb(&TagFileParser::endBase ) } },
+ { "filename", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endFilename ) } },
+ { "includes", { startCb(&TagFileParser::startIncludes ), endCb(&TagFileParser::endIncludes ) } },
+ { "path", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endPath ) } },
+ { "anchorfile", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endAnchorFile ) } },
+ { "anchor", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endAnchor ) } },
+ { "clangid", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endClangId ) } },
+ { "arglist", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endArglist ) } },
+ { "title", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endTitle ) } },
+ { "subgroup", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endSubgroup ) } },
+ { "class", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endClass ) } },
+ { "namespace", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endNamespace ) } },
+ { "file", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endFile ) } },
+ { "dir", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endDir ) } },
+ { "page", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endPage ) } },
+ { "docanchor", { startCb(&TagFileParser::startDocAnchor ), endCb(&TagFileParser::endDocAnchor ) } },
+ { "tagfile", { startCb(&TagFileParser::startIgnoreElement), endCb(&TagFileParser::endIgnoreElement) } },
+ { "templarg", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endTemplateArg ) } },
+ { "type", { startCb(&TagFileParser::startStringValue ), endCb(&TagFileParser::endType ) } }
+};
+
+//---------------------------------------------------------------------------------------------------------------
+
+struct CompoundFactory
+{
+ using CreateFunc = std::function<std::unique_ptr<TagCompoundInfo>()>;
+ CompoundFactory(TagFileParser::State s,CreateFunc f) : state(s), make_instance(f) {}
+ TagFileParser::State state;
+ CreateFunc make_instance;
+};
+
+static const std::map< std::string, CompoundFactory > g_compoundFactory =
+{
+ // kind tag state creation function
+ { "class", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Class); } } },
+ { "struct", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Struct); } } },
+ { "union", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Union); } } },
+ { "interface", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Interface); } } },
+ { "enum", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Enum); } } },
+ { "exception", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Exception); } } },
+ { "protocol", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Protocol); } } },
+ { "category", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Category); } } },
+ { "service", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Service); } } },
+ { "singleton", { TagFileParser::InClass, []() { return std::make_unique<TagClassInfo>(TagClassInfo::Kind::Singleton); } } },
+ { "file", { TagFileParser::InFile, []() { return std::make_unique<TagFileInfo>(); } } },
+ { "namespace", { TagFileParser::InNamespace, []() { return std::make_unique<TagNamespaceInfo>(); } } },
+ { "group", { TagFileParser::InGroup, []() { return std::make_unique<TagGroupInfo>(); } } },
+ { "page", { TagFileParser::InPage, []() { return std::make_unique<TagPageInfo>(); } } },
+ { "package", { TagFileParser::InPackage, []() { return std::make_unique<TagPackageInfo>(); } } },
+ { "dir", { TagFileParser::InDir, []() { return std::make_unique<TagDirInfo>(); } } }
};
+//---------------------------------------------------------------------------------------------------------------
+
+void TagFileParser::startElement( const std::string &name, const XMLHandlers::Attributes& attrib )
+{
+ //printf("startElement '%s'\n",name.data());
+ auto it = g_elementHandlers.find(name);
+ if (it!=std::end(g_elementHandlers))
+ {
+ it->second.startCb(*this,attrib);
+ }
+ else
+ {
+ warn("Unknown start tag '%s' found!",name.data());
+ }
+}
+
+void TagFileParser::endElement( const std::string &name )
+{
+ //printf("endElement '%s'\n",name.data());
+ auto it = g_elementHandlers.find(name);
+ if (it!=std::end(g_elementHandlers))
+ {
+ it->second.endCb(*this);
+ }
+ else
+ {
+ warn("Unknown end tag '%s' found!",name.data());
+ }
+}
+
+void TagFileParser::startCompound( const XMLHandlers::Attributes& attrib )
+{
+ m_curString = "";
+ std::string kind = XMLHandlers::value(attrib,"kind");
+ std::string isObjC = XMLHandlers::value(attrib,"objc");
+
+ auto it = g_compoundFactory.find(kind);
+ if (it!=g_compoundFactory.end())
+ {
+ m_curCompound = it->second.make_instance();
+ m_state = it->second.state;
+ }
+ else
+ {
+ warn("Unknown compound attribute '%s' found!",kind.c_str());
+ m_state = Invalid;
+ }
+
+ if (isObjC=="yes" && m_curCompound &&
+ m_curCompound->compoundType()==TagCompoundInfo::CompoundType::Class)
+ {
+ TagClassInfo::get(m_curCompound)->isObjC = TRUE;
+ }
+}
+
/*! Dumps the internal structures. For debugging only! */
void TagFileParser::dump()
{
msg("Result:\n");
- QListIterator<TagClassInfo> lci(m_tagFileClasses);
-
//============== CLASSES
- TagClassInfo *cd;
- for (;(cd=lci.current());++lci)
+ for (const auto &comp : m_tagFileCompounds)
{
- msg("class '%s'\n",cd->name.data());
- msg(" filename '%s'\n",cd->filename.data());
- for (const BaseInfo &bi : cd->bases)
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Class)
{
- msg( " base: %s \n", bi.name.data() );
- }
+ const TagClassInfo *cd = TagClassInfo::get(comp);
+ msg("class '%s'\n",cd->name.data());
+ msg(" filename '%s'\n",cd->filename.data());
+ for (const BaseInfo &bi : cd->bases)
+ {
+ msg( " base: %s \n", bi.name.data() );
+ }
- QListIterator<TagMemberInfo> mci(cd->members);
- TagMemberInfo *md;
- for (;(md=mci.current());++mci)
- {
- msg(" member:\n");
- msg(" kind: '%s'\n",md->kind.data());
- msg(" name: '%s'\n",md->name.data());
- msg(" anchor: '%s'\n",md->anchor.data());
- msg(" arglist: '%s'\n",md->arglist.data());
+ for (const auto &md : cd->members)
+ {
+ msg(" member:\n");
+ msg(" kind: '%s'\n",md.kind.data());
+ msg(" name: '%s'\n",md.name.data());
+ msg(" anchor: '%s'\n",md.anchor.data());
+ msg(" arglist: '%s'\n",md.arglist.data());
+ }
}
}
//============== NAMESPACES
- QListIterator<TagNamespaceInfo> lni(m_tagFileNamespaces);
- TagNamespaceInfo *nd;
- for (;(nd=lni.current());++lni)
+ for (const auto &comp : m_tagFileCompounds)
{
- msg("namespace '%s'\n",nd->name.data());
- msg(" filename '%s'\n",nd->filename.data());
- QCStringList::Iterator it;
- for ( it = nd->classList.begin();
- it != nd->classList.end(); ++it )
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Namespace)
{
- msg( " class: %s \n", (*it).data() );
- }
+ const TagNamespaceInfo *nd = TagNamespaceInfo::get(comp);
- QListIterator<TagMemberInfo> mci(nd->members);
- TagMemberInfo *md;
- for (;(md=mci.current());++mci)
- {
- msg(" member:\n");
- msg(" kind: '%s'\n",md->kind.data());
- msg(" name: '%s'\n",md->name.data());
- msg(" anchor: '%s'\n",md->anchor.data());
- msg(" arglist: '%s'\n",md->arglist.data());
+ msg("namespace '%s'\n",nd->name.data());
+ msg(" filename '%s'\n",nd->filename.data());
+ for (const auto &cls : nd->classList)
+ {
+ msg( " class: %s \n", cls.c_str() );
+ }
+
+ for (const auto &md : nd->members)
+ {
+ msg(" member:\n");
+ msg(" kind: '%s'\n",md.kind.data());
+ msg(" name: '%s'\n",md.name.data());
+ msg(" anchor: '%s'\n",md.anchor.data());
+ msg(" arglist: '%s'\n",md.arglist.data());
+ }
}
}
+
//============== FILES
- QListIterator<TagFileInfo> lfi(m_tagFileFiles);
- TagFileInfo *fd;
- for (;(fd=lfi.current());++lfi)
+ for (const auto &comp : m_tagFileCompounds)
{
- msg("file '%s'\n",fd->name.data());
- msg(" filename '%s'\n",fd->filename.data());
- QCStringList::Iterator it;
- for ( it = fd->namespaceList.begin();
- it != fd->namespaceList.end(); ++it )
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::File)
{
- msg( " namespace: %s \n", (*it).data() );
- }
- for ( it = fd->classList.begin();
- it != fd->classList.end(); ++it )
- {
- msg( " class: %s \n", (*it).data() );
- }
+ const TagFileInfo *fd = TagFileInfo::get(comp);
- QListIterator<TagMemberInfo> mci(fd->members);
- TagMemberInfo *md;
- for (;(md=mci.current());++mci)
- {
- msg(" member:\n");
- msg(" kind: '%s'\n",md->kind.data());
- msg(" name: '%s'\n",md->name.data());
- msg(" anchor: '%s'\n",md->anchor.data());
- msg(" arglist: '%s'\n",md->arglist.data());
- }
+ msg("file '%s'\n",fd->name.data());
+ msg(" filename '%s'\n",fd->filename.data());
+ for (const auto &ns : fd->namespaceList)
+ {
+ msg( " namespace: %s \n", ns.c_str() );
+ }
+ for (const auto &cs : fd->classList)
+ {
+ msg( " class: %s \n", cs.c_str() );
+ }
- QListIterator<TagIncludeInfo> mii(fd->includes);
- TagIncludeInfo *ii;
- for (;(ii=mii.current());++mii)
- {
- msg(" includes id: %s name: %s\n",ii->id.data(),ii->name.data());
+ for (const auto &md : fd->members)
+ {
+ msg(" member:\n");
+ msg(" kind: '%s'\n",md.kind.data());
+ msg(" name: '%s'\n",md.name.data());
+ msg(" anchor: '%s'\n",md.anchor.data());
+ msg(" arglist: '%s'\n",md.arglist.data());
+ }
+
+ for (const auto &ii : fd->includes)
+ {
+ msg(" includes id: %s name: %s\n",ii.id.data(),ii.name.data());
+ }
}
}
//============== GROUPS
- QListIterator<TagGroupInfo> lgi(m_tagFileGroups);
- TagGroupInfo *gd;
- for (;(gd=lgi.current());++lgi)
+ for (const auto &comp : m_tagFileCompounds)
{
- msg("group '%s'\n",gd->name.data());
- msg(" filename '%s'\n",gd->filename.data());
- QCStringList::Iterator it;
- for ( it = gd->namespaceList.begin();
- it != gd->namespaceList.end(); ++it )
- {
- msg( " namespace: %s \n", (*it).data() );
- }
- for ( it = gd->classList.begin();
- it != gd->classList.end(); ++it )
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Group)
{
- msg( " class: %s \n", (*it).data() );
- }
- for ( it = gd->fileList.begin();
- it != gd->fileList.end(); ++it )
- {
- msg( " file: %s \n", (*it).data() );
- }
- for ( it = gd->subgroupList.begin();
- it != gd->subgroupList.end(); ++it )
- {
- msg( " subgroup: %s \n", (*it).data() );
- }
- for ( it = gd->pageList.begin();
- it != gd->pageList.end(); ++it )
- {
- msg( " page: %s \n", (*it).data() );
- }
+ const TagGroupInfo *gd = TagGroupInfo::get(comp);
+ msg("group '%s'\n",gd->name.data());
+ msg(" filename '%s'\n",gd->filename.data());
- QListIterator<TagMemberInfo> mci(gd->members);
- TagMemberInfo *md;
- for (;(md=mci.current());++mci)
- {
- msg(" member:\n");
- msg(" kind: '%s'\n",md->kind.data());
- msg(" name: '%s'\n",md->name.data());
- msg(" anchor: '%s'\n",md->anchor.data());
- msg(" arglist: '%s'\n",md->arglist.data());
+ for (const auto &ns : gd->namespaceList)
+ {
+ msg( " namespace: %s \n", ns.c_str() );
+ }
+ for (const auto &cs : gd->classList)
+ {
+ msg( " class: %s \n", cs.c_str() );
+ }
+ for (const auto &fi : gd->fileList)
+ {
+ msg( " file: %s \n", fi.c_str() );
+ }
+ for (const auto &sg : gd->subgroupList)
+ {
+ msg( " subgroup: %s \n", sg.c_str() );
+ }
+ for (const auto &pg : gd->pageList)
+ {
+ msg( " page: %s \n", pg.c_str() );
+ }
+
+ for (const auto &md : gd->members)
+ {
+ msg(" member:\n");
+ msg(" kind: '%s'\n",md.kind.data());
+ msg(" name: '%s'\n",md.name.data());
+ msg(" anchor: '%s'\n",md.anchor.data());
+ msg(" arglist: '%s'\n",md.arglist.data());
+ }
}
}
+
//============== PAGES
- QListIterator<TagPageInfo> lpi(m_tagFilePages);
- TagPageInfo *pd;
- for (;(pd=lpi.current());++lpi)
+ for (const auto &comp : m_tagFileCompounds)
{
- msg("page '%s'\n",pd->name.data());
- msg(" title '%s'\n",pd->title.data());
- msg(" filename '%s'\n",pd->filename.data());
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Page)
+ {
+ const TagPageInfo *pd = TagPageInfo::get(comp);
+ msg("page '%s'\n",pd->name.data());
+ msg(" title '%s'\n",pd->title.data());
+ msg(" filename '%s'\n",pd->filename.data());
+ }
}
+
//============== DIRS
- QListIterator<TagDirInfo> ldi(m_tagFileDirs);
- TagDirInfo *dd;
- for (;(dd=ldi.current());++ldi)
+ for (const auto &comp : m_tagFileCompounds)
{
- msg("dir '%s'\n",dd->name.data());
- msg(" path '%s'\n",dd->path.data());
- QCStringList::Iterator it;
- for ( it = dd->fileList.begin();
- it != dd->fileList.end(); ++it )
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Dir)
{
- msg( " file: %s \n", (*it).data() );
- }
- for ( it = dd->subdirList.begin();
- it != dd->subdirList.end(); ++it )
- {
- msg( " subdir: %s \n", (*it).data() );
+ const TagDirInfo *dd = TagDirInfo::get(comp);
+ {
+ msg("dir '%s'\n",dd->name.data());
+ msg(" path '%s'\n",dd->path.data());
+ for (const auto &fi : dd->fileList)
+ {
+ msg( " file: %s \n", fi.c_str() );
+ }
+ for (const auto &sd : dd->subdirList)
+ {
+ msg( " subdir: %s \n", sd.c_str() );
+ }
+ }
}
}
}
-void TagFileParser::addDocAnchors(const std::shared_ptr<Entry> &e,const TagAnchorInfoList &l)
+void TagFileParser::addDocAnchors(const std::shared_ptr<Entry> &e,const std::vector<TagAnchorInfo> &l)
{
- QListIterator<TagAnchorInfo> tli(l);
- TagAnchorInfo *ta;
- for (tli.toFirst();(ta=tli.current());++tli)
+ for (const auto &ta : l)
{
- if (Doxygen::sectionDict->find(ta->label)==0)
+ if (SectionManager::instance().find(ta.label.c_str())==0)
{
//printf("New sectionInfo file=%s anchor=%s\n",
// ta->fileName.data(),ta->label.data());
- SectionInfo *si=new SectionInfo(ta->fileName,-1,ta->label,ta->title,
- SectionInfo::Anchor,0,m_tagName);
- Doxygen::sectionDict->append(ta->label,si);
+ SectionInfo *si=SectionManager::instance().add(
+ ta.label.c_str(),ta.fileName.c_str(),-1,ta.title.c_str(),
+ SectionType::Anchor,0,m_tagName.c_str());
e->anchors.push_back(si);
}
else
{
- warn("Duplicate anchor %s found",ta->label.data());
+ warn("Duplicate anchor %s found",ta.label.data());
}
}
}
-void TagFileParser::buildMemberList(const std::shared_ptr<Entry> &ce,QList<TagMemberInfo> &members)
+void TagFileParser::buildMemberList(const std::shared_ptr<Entry> &ce,const std::vector<TagMemberInfo> &members)
{
- QListIterator<TagMemberInfo> mii(members);
- TagMemberInfo *tmi;
- for (;(tmi=mii.current());++mii)
+ for (const auto &tmi : members)
{
std::shared_ptr<Entry> me = std::make_shared<Entry>();
- me->type = tmi->type;
- me->name = tmi->name;
- me->args = tmi->arglist;
+ me->type = tmi.type;
+ me->name = tmi.name;
+ me->args = tmi.arglist;
if (!me->args.isEmpty())
{
- stringToArgumentList(SrcLangExt_Cpp,me->args,me->argList);
+ me->argList = *stringToArgumentList(SrcLangExt_Cpp,me->args);
}
- if (tmi->enumValues.count()>0)
+ if (tmi.enumValues.size()>0)
{
me->spec |= Entry::Strong;
- QListIterator<TagEnumValueInfo> evii(tmi->enumValues);
- TagEnumValueInfo *evi;
- for (evii.toFirst();(evi=evii.current());++evii)
+ for (const auto &evi : tmi.enumValues)
{
std::shared_ptr<Entry> ev = std::make_shared<Entry>();
ev->type = "@";
- ev->name = evi->name;
- ev->id = evi->clangid;
+ ev->name = evi.name;
+ ev->id = evi.clangid;
ev->section = Entry::VARIABLE_SEC;
ev->tagInfoData.tagName = m_tagName;
- ev->tagInfoData.anchor = evi->anchor;
- ev->tagInfoData.fileName = evi->file;
+ ev->tagInfoData.anchor = evi.anchor;
+ ev->tagInfoData.fileName = evi.file;
ev->hasTagInfo = TRUE;
me->moveToSubEntryAndKeep(ev);
}
}
- me->protection = tmi->prot;
- me->virt = tmi->virt;
- me->stat = tmi->isStatic;
+ me->protection = tmi.prot;
+ me->virt = tmi.virt;
+ me->stat = tmi.isStatic;
me->fileName = ce->fileName;
- me->id = tmi->clangId;
+ me->id = tmi.clangId;
if (ce->section == Entry::GROUPDOC_SEC)
{
me->groups.push_back(Grouping(ce->name,Grouping::GROUPING_INGROUP));
}
- addDocAnchors(me,tmi->docAnchors);
+ addDocAnchors(me,tmi.docAnchors);
me->tagInfoData.tagName = m_tagName;
- me->tagInfoData.anchor = tmi->anchor;
- me->tagInfoData.fileName = tmi->anchorFile;
+ me->tagInfoData.anchor = tmi.anchor;
+ me->tagInfoData.fileName = tmi.anchorFile;
me->hasTagInfo = TRUE;
- if (tmi->kind=="define")
+ if (tmi.kind=="define")
{
me->type="#define";
me->section = Entry::DEFINE_SEC;
}
- else if (tmi->kind=="enumvalue")
+ else if (tmi.kind=="enumvalue")
{
me->section = Entry::VARIABLE_SEC;
me->mtype = Method;
}
- else if (tmi->kind=="property")
+ else if (tmi.kind=="property")
{
me->section = Entry::VARIABLE_SEC;
me->mtype = Property;
}
- else if (tmi->kind=="event")
+ else if (tmi.kind=="event")
{
me->section = Entry::VARIABLE_SEC;
me->mtype = Event;
}
- else if (tmi->kind=="variable")
+ else if (tmi.kind=="variable")
{
me->section = Entry::VARIABLE_SEC;
me->mtype = Method;
}
- else if (tmi->kind=="typedef")
+ else if (tmi.kind=="typedef")
{
me->section = Entry::VARIABLE_SEC; //Entry::TYPEDEF_SEC;
me->type.prepend("typedef ");
me->mtype = Method;
}
- else if (tmi->kind=="enumeration")
+ else if (tmi.kind=="enumeration")
{
me->section = Entry::ENUM_SEC;
me->mtype = Method;
}
- else if (tmi->kind=="function")
+ else if (tmi.kind=="function")
{
me->section = Entry::FUNCTION_SEC;
me->mtype = Method;
}
- else if (tmi->kind=="signal")
+ else if (tmi.kind=="signal")
{
me->section = Entry::FUNCTION_SEC;
me->mtype = Signal;
}
- else if (tmi->kind=="prototype")
+ else if (tmi.kind=="prototype")
{
me->section = Entry::FUNCTION_SEC;
me->mtype = Method;
}
- else if (tmi->kind=="friend")
+ else if (tmi.kind=="friend")
{
me->section = Entry::FUNCTION_SEC;
me->type.prepend("friend ");
me->mtype = Method;
}
- else if (tmi->kind=="dcop")
+ else if (tmi.kind=="dcop")
{
me->section = Entry::FUNCTION_SEC;
me->mtype = DCOP;
}
- else if (tmi->kind=="slot")
+ else if (tmi.kind=="slot")
{
me->section = Entry::FUNCTION_SEC;
me->mtype = Slot;
@@ -1310,230 +1243,239 @@ static QCString stripPath(const QCString &s)
}
/*! Injects the info gathered by the XML parser into the Entry tree.
- * This tree contains the information extracted from the input in a
+ * This tree contains the information extracted from the input in a
* "unrelated" form.
*/
void TagFileParser::buildLists(const std::shared_ptr<Entry> &root)
{
// build class list
- QListIterator<TagClassInfo> cit(m_tagFileClasses);
- TagClassInfo *tci;
- for (cit.toFirst();(tci=cit.current());++cit)
+ for (const auto &comp : m_tagFileCompounds)
{
- std::shared_ptr<Entry> ce = std::make_shared<Entry>();
- ce->section = Entry::CLASS_SEC;
- switch (tci->kind)
- {
- case TagClassInfo::Class: break;
- case TagClassInfo::Struct: ce->spec = Entry::Struct; break;
- case TagClassInfo::Union: ce->spec = Entry::Union; break;
- case TagClassInfo::Interface: ce->spec = Entry::Interface; break;
- case TagClassInfo::Enum: ce->spec = Entry::Enum; break;
- case TagClassInfo::Exception: ce->spec = Entry::Exception; break;
- case TagClassInfo::Protocol: ce->spec = Entry::Protocol; break;
- case TagClassInfo::Category: ce->spec = Entry::Category; break;
- case TagClassInfo::Service: ce->spec = Entry::Service; break;
- case TagClassInfo::Singleton: ce->spec = Entry::Singleton; break;
- case TagClassInfo::None: // should never happen, means not properly initialized
- assert(tci->kind != TagClassInfo::None);
- break;
- }
- ce->name = tci->name;
- if (tci->kind==TagClassInfo::Protocol)
- {
- ce->name+="-p";
- }
- addDocAnchors(ce,tci->docAnchors);
- ce->tagInfoData.tagName = m_tagName;
- ce->tagInfoData.anchor = tci->anchor;
- ce->tagInfoData.fileName = tci->filename;
- ce->hasTagInfo = TRUE;
- ce->id = tci->clangId;
- ce->lang = tci->isObjC ? SrcLangExt_ObjC : SrcLangExt_Unknown;
- // transfer base class list
- ce->extends = tci->bases;
- tci->bases.clear();
- if (tci->templateArguments)
- {
- ArgumentList al;
- QListIterator<QCString> sli(*tci->templateArguments);
- QCString *argName;
- for (;(argName=sli.current());++sli)
- {
- Argument a;
- a.type = "class";
- a.name = *argName;
- al.push_back(a);
- }
- ce->tArgLists.push_back(al);
- }
-
- buildMemberList(ce,tci->members);
- root->moveToSubEntryAndKeep(ce);
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Class)
+ {
+ const TagClassInfo *tci = TagClassInfo::get(comp);
+ std::shared_ptr<Entry> ce = std::make_shared<Entry>();
+ ce->section = Entry::CLASS_SEC;
+ switch (tci->kind)
+ {
+ case TagClassInfo::Kind::Class: break;
+ case TagClassInfo::Kind::Struct: ce->spec = Entry::Struct; break;
+ case TagClassInfo::Kind::Union: ce->spec = Entry::Union; break;
+ case TagClassInfo::Kind::Interface: ce->spec = Entry::Interface; break;
+ case TagClassInfo::Kind::Enum: ce->spec = Entry::Enum; break;
+ case TagClassInfo::Kind::Exception: ce->spec = Entry::Exception; break;
+ case TagClassInfo::Kind::Protocol: ce->spec = Entry::Protocol; break;
+ case TagClassInfo::Kind::Category: ce->spec = Entry::Category; break;
+ case TagClassInfo::Kind::Service: ce->spec = Entry::Service; break;
+ case TagClassInfo::Kind::Singleton: ce->spec = Entry::Singleton; break;
+ case TagClassInfo::Kind::None: // should never happen, means not properly initialized
+ assert(tci->kind != TagClassInfo::Kind::None);
+ break;
+ }
+ ce->name = tci->name;
+ if (tci->kind==TagClassInfo::Kind::Protocol)
+ {
+ ce->name+="-p";
+ }
+ addDocAnchors(ce,tci->docAnchors);
+ ce->tagInfoData.tagName = m_tagName;
+ ce->tagInfoData.anchor = tci->anchor;
+ ce->tagInfoData.fileName = tci->filename;
+ ce->hasTagInfo = TRUE;
+ ce->id = tci->clangId;
+ ce->lang = tci->isObjC ? SrcLangExt_ObjC : SrcLangExt_Unknown;
+ // transfer base class list
+ ce->extends = tci->bases;
+ if (!tci->templateArguments.empty())
+ {
+ ArgumentList al;
+ for (const auto &argName : tci->templateArguments)
+ {
+ Argument a;
+ a.type = "class";
+ a.name = argName.c_str();
+ al.push_back(a);
+ }
+ ce->tArgLists.push_back(al);
+ }
+
+ buildMemberList(ce,tci->members);
+ root->moveToSubEntryAndKeep(ce);
+ }
}
// build file list
- QListIterator<TagFileInfo> fit(m_tagFileFiles);
- TagFileInfo *tfi;
- for (fit.toFirst();(tfi=fit.current());++fit)
+ for (const auto &comp : m_tagFileCompounds)
{
- std::shared_ptr<Entry> fe = std::make_shared<Entry>();
- fe->section = guessSection(tfi->name);
- fe->name = tfi->name;
- addDocAnchors(fe,tfi->docAnchors);
- fe->tagInfoData.tagName = m_tagName;
- fe->tagInfoData.fileName = tfi->filename;
- fe->hasTagInfo = TRUE;
-
- QCString fullName = m_tagName+":"+tfi->path+stripPath(tfi->name);
- fe->fileName = fullName;
- //printf("createFileDef() filename=%s\n",tfi->filename.data());
- FileDef *fd = createFileDef(m_tagName+":"+tfi->path,
- tfi->name,m_tagName,
- tfi->filename
- );
- FileName *mn;
- if ((mn=Doxygen::inputNameDict->find(tfi->name)))
- {
- mn->append(fd);
- }
- else
- {
- mn = new FileName(fullName,tfi->name);
- mn->append(fd);
- Doxygen::inputNameList->inSort(mn);
- Doxygen::inputNameDict->insert(tfi->name,mn);
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::File)
+ {
+ const TagFileInfo *tfi = TagFileInfo::get(comp);
+
+ std::shared_ptr<Entry> fe = std::make_shared<Entry>();
+ fe->section = guessSection(tfi->name.c_str());
+ fe->name = tfi->name.c_str();
+ addDocAnchors(fe,tfi->docAnchors);
+ fe->tagInfoData.tagName = m_tagName;
+ fe->tagInfoData.fileName = tfi->filename;
+ fe->hasTagInfo = TRUE;
+
+ std::string fullName = m_tagName+":"+tfi->path+stripPath(tfi->name).str();
+ fe->fileName = fullName;
+ //printf("createFileDef() filename=%s\n",tfi->filename.data());
+ std::string tagid = m_tagName+":"+tfi->path;
+ std::unique_ptr<FileDef> fd { createFileDef(tagid.c_str(),
+ tfi->name.c_str(),m_tagName.c_str(),
+ tfi->filename.c_str()) };
+ FileName *mn;
+ if ((mn=Doxygen::inputNameLinkedMap->find(tfi->name.c_str())))
+ {
+ mn->push_back(std::move(fd));
+ }
+ else
+ {
+ mn = Doxygen::inputNameLinkedMap->add(tfi->name.c_str(),fullName.c_str());
+ mn->push_back(std::move(fd));
+ }
+ buildMemberList(fe,tfi->members);
+ root->moveToSubEntryAndKeep(fe);
}
- buildMemberList(fe,tfi->members);
- root->moveToSubEntryAndKeep(fe);
}
// build namespace list
- QListIterator<TagNamespaceInfo> nit(m_tagFileNamespaces);
- TagNamespaceInfo *tni;
- for (nit.toFirst();(tni=nit.current());++nit)
+ for (const auto &comp : m_tagFileCompounds)
{
- std::shared_ptr<Entry> ne = std::make_shared<Entry>();
- ne->section = Entry::NAMESPACE_SEC;
- ne->name = tni->name;
- addDocAnchors(ne,tni->docAnchors);
- ne->tagInfoData.tagName = m_tagName;
- ne->tagInfoData.fileName = tni->filename;
- ne->hasTagInfo = TRUE;
- ne->id = tni->clangId;
-
- buildMemberList(ne,tni->members);
- root->moveToSubEntryAndKeep(ne);
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Namespace)
+ {
+ const TagNamespaceInfo *tni = TagNamespaceInfo::get(comp);
+
+ std::shared_ptr<Entry> ne = std::make_shared<Entry>();
+ ne->section = Entry::NAMESPACE_SEC;
+ ne->name = tni->name;
+ addDocAnchors(ne,tni->docAnchors);
+ ne->tagInfoData.tagName = m_tagName;
+ ne->tagInfoData.fileName = tni->filename;
+ ne->hasTagInfo = TRUE;
+ ne->id = tni->clangId;
+
+ buildMemberList(ne,tni->members);
+ root->moveToSubEntryAndKeep(ne);
+ }
}
// build package list
- QListIterator<TagPackageInfo> pit(m_tagFilePackages);
- TagPackageInfo *tpgi;
- for (pit.toFirst();(tpgi=pit.current());++pit)
+ for (const auto &comp : m_tagFileCompounds)
{
- std::shared_ptr<Entry> pe = std::make_shared<Entry>();
- pe->section = Entry::PACKAGE_SEC;
- pe->name = tpgi->name;
- addDocAnchors(pe,tpgi->docAnchors);
- pe->tagInfoData.tagName = m_tagName;
- pe->tagInfoData.fileName = tpgi->filename;
- pe->hasTagInfo = TRUE;
-
- buildMemberList(pe,tpgi->members);
- root->moveToSubEntryAndKeep(pe);
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Package)
+ {
+ const TagPackageInfo *tpgi = TagPackageInfo::get(comp);
+
+ std::shared_ptr<Entry> pe = std::make_shared<Entry>();
+ pe->section = Entry::PACKAGE_SEC;
+ pe->name = tpgi->name;
+ addDocAnchors(pe,tpgi->docAnchors);
+ pe->tagInfoData.tagName = m_tagName;
+ pe->tagInfoData.fileName = tpgi->filename;
+ pe->hasTagInfo = TRUE;
+
+ buildMemberList(pe,tpgi->members);
+ root->moveToSubEntryAndKeep(pe);
+ }
}
// build group list
- QListIterator<TagGroupInfo> git(m_tagFileGroups);
- TagGroupInfo *tgi;
- for (git.toFirst();(tgi=git.current());++git)
+ for (const auto &comp : m_tagFileCompounds)
{
- std::shared_ptr<Entry> ge = std::make_shared<Entry>();
- ge->section = Entry::GROUPDOC_SEC;
- ge->name = tgi->name;
- ge->type = tgi->title;
- addDocAnchors(ge,tgi->docAnchors);
- ge->tagInfoData.tagName = m_tagName;
- ge->tagInfoData.fileName = tgi->filename;
- ge->hasTagInfo = TRUE;
-
- buildMemberList(ge,tgi->members);
- root->moveToSubEntryAndKeep(ge);
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Group)
+ {
+ const TagGroupInfo *tgi = TagGroupInfo::get(comp);
+
+ std::shared_ptr<Entry> ge = std::make_shared<Entry>();
+ ge->section = Entry::GROUPDOC_SEC;
+ ge->name = tgi->name;
+ ge->type = tgi->title;
+ addDocAnchors(ge,tgi->docAnchors);
+ ge->tagInfoData.tagName = m_tagName;
+ ge->tagInfoData.fileName = tgi->filename;
+ ge->hasTagInfo = TRUE;
+
+ buildMemberList(ge,tgi->members);
+ root->moveToSubEntryAndKeep(ge);
+ }
}
- // set subgroup relations bug_774118
- for (git.toFirst();(tgi=git.current());++git)
+ for (const auto &comp : m_tagFileCompounds)
{
- QCStringList::Iterator it;
- for ( it = tgi->subgroupList.begin(); it != tgi->subgroupList.end(); ++it )
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Group)
{
- //QListIterator<Entry> eli(*(root->children()));
- //Entry *childNode;
- //for (eli.toFirst();(childNode=eli.current());++eli)
- const auto &children = root->children();
- auto i = std::find_if(children.begin(),children.end(),
- [&](const std::shared_ptr<Entry> &e) { return e->name = *it; });
- if (i!=children.end())
+ const TagGroupInfo *tgi = TagGroupInfo::get(comp);
+ // set subgroup relations bug_774118
+
+ for (const auto &sg : tgi->subgroupList)
{
- (*i)->groups.push_back(Grouping(tgi->name,Grouping::GROUPING_INGROUP));
+ const auto &children = root->children();
+ auto i = std::find_if(children.begin(),children.end(),
+ [&](const std::shared_ptr<Entry> &e) { return e->name == sg.c_str(); });
+ if (i!=children.end())
+ {
+ (*i)->groups.push_back(Grouping(tgi->name.c_str(),Grouping::GROUPING_INGROUP));
+ }
}
}
}
// build page list
- QListIterator<TagPageInfo> pgit(m_tagFilePages);
- TagPageInfo *tpi;
- for (pgit.toFirst();(tpi=pgit.current());++pgit)
+ for (const auto &comp : m_tagFileCompounds)
{
- std::shared_ptr<Entry> pe = std::make_shared<Entry>();
- pe->section = tpi->filename=="index" ? Entry::MAINPAGEDOC_SEC : Entry::PAGEDOC_SEC;
- pe->name = tpi->name;
- pe->args = tpi->title;
- addDocAnchors(pe,tpi->docAnchors);
- pe->tagInfoData.tagName = m_tagName;
- pe->tagInfoData.fileName = tpi->filename;
- pe->hasTagInfo = TRUE;
- root->moveToSubEntryAndKeep(pe);
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::Page)
+ {
+ const TagPageInfo *tpi = TagPageInfo::get(comp);
+
+ std::shared_ptr<Entry> pe = std::make_shared<Entry>();
+ bool isIndex = (stripExtensionGeneral(tpi->filename.c_str(),getFileNameExtension(tpi->filename.c_str()))=="index");
+ pe->section = isIndex ? Entry::MAINPAGEDOC_SEC : Entry::PAGEDOC_SEC;
+ pe->name = tpi->name;
+ pe->args = tpi->title;
+ addDocAnchors(pe,tpi->docAnchors);
+ pe->tagInfoData.tagName = m_tagName;
+ pe->tagInfoData.fileName = tpi->filename;
+ pe->hasTagInfo = TRUE;
+ root->moveToSubEntryAndKeep(pe);
+ }
}
}
void TagFileParser::addIncludes()
{
- QListIterator<TagFileInfo> fit(m_tagFileFiles);
- TagFileInfo *tfi;
- for (fit.toFirst();(tfi=fit.current());++fit)
+ for (const auto &comp : m_tagFileCompounds)
{
- //printf("tag file tagName=%s path=%s name=%s\n",m_tagName.data(),tfi->path.data(),tfi->name.data());
- FileName *fn = Doxygen::inputNameDict->find(tfi->name);
- if (fn)
+ if (comp->compoundType()==TagCompoundInfo::CompoundType::File)
{
- //printf("found\n");
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ const TagFileInfo *tfi = TagFileInfo::get(comp);
+ //printf("tag file tagName=%s path=%s name=%s\n",m_tagName.data(),tfi->path.data(),tfi->name.data());
+ FileName *fn = Doxygen::inputNameLinkedMap->find(tfi->name.c_str());
+ if (fn)
{
- //printf("input file path=%s name=%s\n",fd->getPath().data(),fd->name().data());
- if (fd->getPath()==QCString(m_tagName+":"+tfi->path))
+ for (const auto &fd : *fn)
{
- //printf("found\n");
- QListIterator<TagIncludeInfo> mii(tfi->includes);
- TagIncludeInfo *ii;
- for (;(ii=mii.current());++mii)
+ //printf("input file path=%s name=%s\n",fd->getPath().data(),fd->name().data());
+ if (fd->getPath()==QCString(m_tagName+":"+tfi->path))
{
- //printf("ii->name='%s'\n",ii->name.data());
- FileName *ifn = Doxygen::inputNameDict->find(ii->name);
- ASSERT(ifn!=0);
- if (ifn)
+ //printf("found\n");
+ for (const auto &ii : tfi->includes)
{
- FileNameIterator ifni(*ifn);
- FileDef *ifd;
- for (;(ifd=ifni.current());++ifni)
+ //printf("ii->name='%s'\n",ii->name.data());
+ FileName *ifn = Doxygen::inputNameLinkedMap->find(ii.name.c_str());
+ ASSERT(ifn!=0);
+ if (ifn)
{
- //printf("ifd->getOutputFileBase()=%s ii->id=%s\n",
- // ifd->getOutputFileBase().data(),ii->id.data());
- if (ifd->getOutputFileBase()==QCString(ii->id))
+ for (const auto &ifd : *ifn)
{
- fd->addIncludeDependency(ifd,ii->text,ii->isLocal,ii->isImported,FALSE);
+ //printf("ifd->getOutputFileBase()=%s ii->id=%s\n",
+ // ifd->getOutputFileBase().data(),ii->id.data());
+ if (ifd->getOutputFileBase()==QCString(ii.id))
+ {
+ fd->addIncludeDependency(ifd.get(),ii.text.c_str(),ii.isLocal,ii.isImported);
+ }
}
}
}
@@ -1546,20 +1488,19 @@ void TagFileParser::addIncludes()
void parseTagFile(const std::shared_ptr<Entry> &root,const char *fullName)
{
- QFileInfo fi(fullName);
- if (!fi.exists()) return;
- TagFileParser handler( fullName ); // tagName
- handler.setFileName(fullName);
- TagFileErrorHandler errorHandler;
- QFile xmlFile( fullName );
- QXmlInputSource source( xmlFile );
- QXmlSimpleReader reader;
- reader.setContentHandler( &handler );
- reader.setErrorHandler( &errorHandler );
- reader.parse( source );
- handler.buildLists(root);
- handler.addIncludes();
- //handler.dump();
+ TagFileParser tagFileParser(fullName);
+ QCString inputStr = fileToString(fullName);
+ XMLHandlers handlers;
+ // connect the generic events handlers of the XML parser to the specific handlers of the tagFileParser object
+ handlers.startDocument = [&tagFileParser]() { tagFileParser.startDocument(); };
+ handlers.startElement = [&tagFileParser](const std::string &name,const XMLHandlers::Attributes &attrs) { tagFileParser.startElement(name,attrs); };
+ handlers.endElement = [&tagFileParser](const std::string &name) { tagFileParser.endElement(name); };
+ handlers.characters = [&tagFileParser](const std::string &chars) { tagFileParser.characters(chars); };
+ handlers.error = [&tagFileParser](const std::string &fileName,int lineNr,const std::string &msg) { tagFileParser.error(fileName,lineNr,msg); };
+ XMLParser parser(handlers);
+ tagFileParser.setDocumentLocator(&parser);
+ parser.parse(fullName,inputStr);
+ tagFileParser.buildLists(root);
+ tagFileParser.addIncludes();
+ //tagFileParser.dump();
}
-
-
diff --git a/src/tclscanner.h b/src/tclscanner.h
deleted file mode 100644
index cdd56d8..0000000
--- a/src/tclscanner.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
- * Copyright (C) 2010-2011 by Rene Zaumseil
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#ifndef SCANNER_TCL_H
-#define SCANNER_TCL_H
-
-#include "parserintf.h"
-
-/** \brief Tcl language parser using state-based lexical scanning.
- *
- * This is the Tcl language parser for doxygen.
- */
-class TclOutlineParser : public OutlineParserInterface
-{
- public:
- void startTranslationUnit(const char *) {}
- void finishTranslationUnit() {}
- void parseInput(const char *fileName,
- const char *fileBuf,
- const std::shared_ptr<Entry> &root,
- bool sameTranslationUnit,
- QStrList &filesInSameTranslationUnit);
- bool needsPreprocessing(const QCString &extension) const;
- void parsePrototype(const char *text);
-};
-
-class TclCodeParser : public CodeParserInterface
-{
- public:
- void parseCode(CodeOutputInterface &codeOutIntf,
- const char *scopeName,
- const QCString &input,
- SrcLangExt lang,
- bool isExampleBlock,
- const char *exampleName=0,
- FileDef *fileDef=0,
- int startLine=-1,
- int endLine=-1,
- bool inlineFragment=FALSE,
- const MemberDef *memberDef=0,
- bool showLineNumbers=TRUE,
- const Definition *searchCtx=0,
- bool collectXRefs=TRUE
- );
- void resetCodeParserState();
-};
-
-#endif
diff --git a/src/tclscanner.l b/src/tclscanner.l
deleted file mode 100644
index f845aa9..0000000
--- a/src/tclscanner.l
+++ /dev/null
@@ -1,3145 +0,0 @@
-/*****************************************************************************
- * Parser for Tcl subset
- *
- * Copyright (C) 2010 by Rene Zaumseil
- * based on the work of Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-%option never-interactive
-%option case-insensitive
-%option prefix="tclscannerYY"
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <ctype.h>
-
-#include <qstring.h>
-#include <qcstringlist.h>
-#include <qlist.h>
-#include <qmap.h>
-#include <qarray.h>
-#include <qstack.h>
-#include <qregexp.h>
-#include <qfile.h>
-#include <qdict.h>
-
-#include "entry.h"
-#include "message.h"
-#include "config.h"
-#include "doxygen.h"
-#include "util.h"
-#include "defargs.h"
-#include "language.h"
-#include "commentscan.h"
-#include "pre.h"
-#include "tclscanner.h"
-#include "outputlist.h"
-#include "membername.h"
-#include "searchindex.h"
-#include "commentcnv.h"
-#include "bufstr.h"
-#include "portable.h"
-#include "arguments.h"
-#include "namespacedef.h"
-#include "filedef.h"
-#include "markdown.h"
-
-#define YY_NO_INPUT 1
-#define YY_NO_UNISTD_H 1
-
-#define MAX_INCLUDE_DEPTH 10
-
-static const char *stateToString(int state);
-
-//! Application error.
-#define tcl_err \
- printf("Error %d %s() at line %d! ",__LINE__,tcl.file_name.data(),yylineno); \
- yy_push_state(ERROR); \
- yyless(0); \
- printf
-
-//! Application warning.
-#define tcl_war \
- printf("Warning %d %s() at line %d: ",__LINE__,tcl.file_name.data(),yylineno); \
- printf
-
-//! Application message.
-#define tcl_inf \
- if (0) printf("--- %.4d %d@%d: ",__LINE__,yylineno,yy_start_stack_ptr) && printf
-
-//! Debug message.
-#define D\
- if (0) printf("--- %.4d %d@%d: %s\n",__LINE__,yylineno,yy_start_stack_ptr,yytext);
-
-// BEGIN of copy from tclUtil.c
-// - Tcl_Interp removed
-// - changes are marked with RZ
-// #define's to adapt the code:
-#define CONST const
-#define UCHAR (unsigned char)
-#define TCL_ERROR 1
-#define TCL_OK 0
-#define ckalloc malloc
-#define ckfree free
-#define TclCopyAndCollapse(size,src,dest) memcpy(dest,src,size); *(dest+size)=0
-int TclFindElement(
- CONST char *list, /* Points to the first byte of a string
- * containing a Tcl list with zero or more
- * elements (possibly in braces). */
- int listLength, /* Number of bytes in the list's string. */
- CONST char **elementPtr, /* Where to put address of first significant
- * character in first element of list. */
- CONST char **nextPtr, /* Fill in with location of character just
- * after all white space following end of
- * argument (next arg or end of list). */
- int *sizePtr, /* If non-zero, fill in with size of
- * element. */
- int *bracePtr) /* If non-zero, fill in with non-zero/zero to
- * indicate that arg was/wasn't in braces. */
-{
- CONST char *p = list;
- CONST char *elemStart; /* Points to first byte of first element. */
- CONST char *limit; /* Points just after list's last byte. */
- int openBraces = 0; /* Brace nesting level during parse. */
- int inQuotes = 0;
- int size = 0; /* lint. */
- //RZ int numChars;
-
- /*
- * Skim off leading white space and check for an opening brace or quote.
- * We treat embedded NULLs in the list as bytes belonging to a list
- * element.
- */
-
- limit = (list + listLength);
- while ((p < limit) && (isspace(UCHAR(*p))))
- { /* INTL: ISO space. */
- p++;
- }
- if (p == limit)
- { /* no element found */
- elemStart = limit;
- goto done;
- }
-
- if (*p == '{') /* } to keep vi happy */
- {
- openBraces = 1;
- p++;
- }
- else if (*p == '"')
- {
- inQuotes = 1;
- p++;
- }
- elemStart = p;
- if (bracePtr != 0)
- {
- *bracePtr = openBraces;
- }
-
- /*
- * Find element's end (a space, close brace, or the end of the string).
- */
-
- while (p < limit)
- {
- switch (*p)
- {
- /*
- * Open brace: don't treat specially unless the element is in
- * braces. In this case, keep a nesting count.
- */
-
- case '{':
- if (openBraces != 0)
- {
- openBraces++;
- }
- break;
-
- /*
- * Close brace: if element is in braces, keep nesting count and
- * quit when the last close brace is seen.
- */
-
- case '}':
- if (openBraces > 1)
- {
- openBraces--;
- }
- else if (openBraces == 1)
- {
- size = (int)(p - elemStart);
- p++;
- if ((p >= limit) || isspace(UCHAR(*p)))
- { /* INTL: ISO space. */
- goto done;
- }
-
- /*
- * Garbage after the closing brace; return an error.
- */
-
- return TCL_ERROR;
- }
- break;
-
- /*
- * Backslash: skip over everything up to the end of the backslash
- * sequence.
- */
-
- case '\\':
- //RZ Tcl_UtfBackslash(p, &numChars, NULL);
- //RZ p += (numChars - 1);
- p++; //RZ
- break;
-
- /*
- * Space: ignore if element is in braces or quotes; otherwise
- * terminate element.
- */
-
- case ' ':
- case '\f':
- case '\n':
- case '\r':
- case '\t':
- case '\v':
- if ((openBraces == 0) && !inQuotes)
- {
- size = (int)(p - elemStart);
- goto done;
- }
- break;
-
- /*
- * Double-quote: if element is in quotes then terminate it.
- */
-
- case '"':
- if (inQuotes)
- {
- size = (int)(p - elemStart);
- p++;
- if ((p >= limit) || isspace(UCHAR(*p)))
- { /* INTL: ISO space */
- goto done;
- }
-
- /*
- * Garbage after the closing quote; return an error.
- */
- return TCL_ERROR;
- }
- break;
- }
- p++;
- }
-
- /*
- * End of list: terminate element.
- */
-
- if (p == limit)
- {
- if (openBraces != 0)
- {
- return TCL_ERROR;
- }
- else if (inQuotes)
- {
- return TCL_ERROR;
- }
- size = (int)(p - elemStart);
- }
-
-done:
- while ((p < limit) && (isspace(UCHAR(*p))))
- { /* INTL: ISO space. */
- p++;
- }
- *elementPtr = elemStart;
- *nextPtr = p;
- if (sizePtr != 0)
- {
- *sizePtr = size;
- }
- return TCL_OK;
-}
-
-int Tcl_SplitList(
- CONST char *list, /* Pointer to string with list structure. */
- int *argcPtr, /* Pointer to location to fill in with the
- * number of elements in the list. */
- CONST char ***argvPtr) /* Pointer to place to store pointer to array
- * of pointers to list elements. */
-{
- CONST char **argv, *l, *element;
- char *p;
- int length, size, i, result, elSize, brace;
-
- /*
- * Figure out how much space to allocate. There must be enough space for
- * both the array of pointers and also for a copy of the list. To estimate
- * the number of pointers needed, count the number of space characters in
- * the list.
- */
-
- for (size = 2, l = list; *l != 0; l++)
- {
- if (isspace(UCHAR(*l)))
- { /* INTL: ISO space. */
- size++;
-
- /*
- * Consecutive space can only count as a single list delimiter.
- */
-
- while (1)
- {
- char next = *(l + 1);
-
- if (next == '\0')
- {
- break;
- }
- ++l;
- if (isspace(UCHAR(next)))
- { /* INTL: ISO space. */
- continue;
- }
- break;
- }
- }
- }
- length = (int)(l - list);
- argv = (CONST char **) ckalloc((unsigned)
- ((size * sizeof(char *)) + length + 1));
- for (i = 0, p = ((char *) argv) + size*sizeof(char *);
- *list != 0; i++)
- {
- CONST char *prevList = list;
-
- result = TclFindElement(list, length, &element, &list,
- &elSize, &brace);
- length -= (int)(list - prevList);
- if (result != TCL_OK)
- {
- ckfree((char *) argv);
- return result;
- }
- if (*element == 0)
- {
- break;
- }
- if (i >= size)
- {
- ckfree((char *) argv);
- return TCL_ERROR;
- }
- argv[i] = p;
- if (brace)
- {
- memcpy(p, element, (size_t) elSize);
- p += elSize;
- *p = 0;
- p++;
- }
- else
- {
- TclCopyAndCollapse(elSize, element, p);
- p += elSize+1;
- }
- }
-
- argv[i] = NULL;
- *argvPtr = argv;
- *argcPtr = i;
- return TCL_OK;
-}
-// END of tclUtil.c
-
-void tcl_split_list(QCString &str, QCStringList &list)
-{
- int argc;
- const char **argv;
-
- list.clear();
- if (str.left(1)=="{" && str.right(1)=="}")
- {
- str=str.mid(1,str.length()-2);
- }
- else if (str.left(1)=="\"" && str.right(1)=="\"")
- {
- str=str.mid(1,str.length()-2);
- }
- if (!str.isEmpty())
- {
- if (Tcl_SplitList(str,&argc,&argv) != TCL_OK)
- {
- list.append(str);
- }
- else
- {
- for (int i = 0; i < argc; i++)
- {
- list.append(argv[i]);
- }
- ckfree((char *) argv);
- }
- }
-}
-
-//! Structure containing information about current scan context.
-typedef struct
-{
- char type[2]; // type of scan context: "\"" "{" "[" "?" " "
- int line0; // start line of scan context
- int line1; // end line of scan context
- YY_BUFFER_STATE buffer_state; // value of scan context
- QCString ns; // current namespace
- Entry *entry_fn; // if set contains the current proc/method/constructor/destructor
- Entry *entry_cl; // if set contain the current class
- Entry *entry_scan; // current scan entry
- Protection protection; // current protections state
- QCStringList after; // option/value list (options: NULL comment keyword script)
-} tcl_scan;
-
-//* Structure containing all internal global variables.
-static struct
-{
- CodeOutputInterface * code; // if set then we are codifying the file
- int code_line; // current line of code
- int code_linenumbers; // if true create line numbers in code
- const char *code_font; // used font to codify
- bool config_autobrief; // value of configuration option
- QMap<QCString,QCString> config_subst; // map of configuration option values
- QCString input_string; // file contents
- int input_position; // position in file
- QCString file_name; // name of used file
- OutlineParserInterface *this_parser; // myself
- CommentScanner commentScanner;
- int command; // true if command was found
- int comment; // set true if comment was scanned
- int brace_level; // bookkeeping of braces
- int bracket_level; // bookkeeping of brackets
- int bracket_quote; // bookkeeping of quotes (toggles)
- char word_is; // type of current word: "\"" "{" "[" "?" " "
- int line_comment; // line number of comment
- int line_commentline; // line number of comment after command
- int line_command; // line number of command
- int line_body0; // start line of body
- int line_body1; // end line of body
- QCString string_command; // contain current command
- QCString string_commentline; // contain current comment after command
- QCString string_commentcodify; // current comment string used in codifying
- QCString string_comment; // contain current comment
- QCString string_last; // contain last read word or part of word
- QCString string; // temporary string value
- Entry* entry_main; // top level entry
- Entry* entry_file; // entry of current file
- Entry* entry_current; // currently used entry
- Entry* entry_inside; // contain entry of current scan context
- QCStringList list_commandwords; // list of command words
- QList<tcl_scan> scan; // stack of scan contexts
- QAsciiDict<Entry> ns; // all read namespace entries
- QAsciiDict<Entry> cl; // all read class entries
- QAsciiDict<Entry> fn; // all read function entries
- QList<Entry> entry; // list of all created entries, will be deleted after codifying
- Protection protection; // current protections state
- const MemberDef *memberdef; // contain current MemberDef when codifying
- bool collectXRefs;
-} tcl;
-
-// scanner functions
-static int yyread(char *buf,int max_size);
-static tcl_scan *tcl_scan_start(char type, QCString content, QCString ns, Entry *entry_cls, Entry *entry_fn);
-static void tcl_scan_end();
-static void tcl_comment(int what,const char *text);
-static void tcl_word(int what,const char *text);
-static void tcl_command(int what,const char *text);
-
-// helper functions
-
-//! Create new entry.
-// @return new initialised entry
-Entry* tcl_entry_new()
-{
- Entry *myEntry = new Entry;
- myEntry->section = Entry::EMPTY_SEC;
- myEntry->name = "";
-// myEntry->type = "";
- myEntry->brief = "";
-// myEntry->doc = "";
- myEntry->protection = Public;
-// myEntry->mtype = Method;
-// myEntry->virt = Normal;
-// myEntry->stat = FALSE;
- myEntry->docFile = tcl.file_name;
- myEntry->inbodyFile = tcl.file_name;
- myEntry->fileName = tcl.file_name;
- myEntry->lang = SrcLangExt_Tcl;
- Doxygen::docGroup.initGroupInfo(myEntry);
- // collect entries
- if (!tcl.code)
- {
- tcl.entry.insert(0,myEntry);
- }
- return myEntry;
-}
-
-//! Set protection level.
-void tcl_protection(Entry *entry)
-{
- if (entry->protection!=Public&&entry->protection!=Protected&&entry->protection!=Private)
- {
- entry->protection = tcl.protection;
- }
- if (entry->protection!=Protected&&entry->protection!=Private)
- {
- entry->protection = Public;
- }
-}
-
-//! Check name.
-// @return 'ns' and 'name' of given current 'ns0' and 'name0'
-static void tcl_name(const QCString &ns0, const QCString &name0, QCString &ns, QCString &name)
-{
- QCString myNm;
- int myStart;
-
- if (qstrncmp(name0.data(),"::",2)==0)
- {
- myNm = name0.mid(2);
- }
- else if (ns0.length() && ns0 != " ")
- {
- myNm = ns0 + "::" + name0;
- }
- else
- {
- myNm = name0;
- }
- myStart = myNm.findRev("::");
- if (myStart == -1)
- {
- ns = "";
- name = myNm;
- }
- else if (myNm.length()-myStart == 2)
- {
- // ending with :: so get name equal to last component
- ns = myNm.mid(0,myStart);
- myStart = ns.findRev("::");
- name = myNm.mid(myStart+2);
- }
- else
- {
- ns = myNm.mid(0,myStart);
- name = myNm.mid(myStart+2);
- }
-}
-
-//! Check name. Strip namespace qualifiers from name0 if inside inlined code segment.
-// @return 'ns' and 'name' of given current 'ns0' and 'name0'
-static void tcl_name_SnippetAware(const QCString &ns0, const QCString &name0, QCString &ns, QCString &name)
-{
- // If we are inside an inlined code snippet then ns0
- // already contains the complete namespace path.
- // Any namespace qualifiers in name0 are redundant.
- int i = name0.findRev("::");
- if (i>=0 && tcl.memberdef)
- {
- tcl_name(ns0, name0.mid(i+2), ns, name);
- }
- else
- {
- tcl_name(ns0, name0, ns, name);
- }
-}
-
-// Check and return namespace entry.
-// @return namespace entry
-Entry* tcl_entry_namespace(const QCString ns)
-{
- Entry *myEntry;
- if (ns.length())
- {
- myEntry = tcl.ns.find(ns);
- }
- else
- {
- myEntry = tcl.ns.find("::");
- }
- if (myEntry == NULL)
- {
- myEntry = tcl_entry_new();
- myEntry->section = Entry::NAMESPACE_SEC;
- myEntry->name = ns;
- tcl.entry_main->moveToSubEntryAndKeep(myEntry);
- tcl.ns.insert(ns,myEntry);
- }
- return myEntry;
-}
-
-// Check and return class entry.
-// @return class entry
-Entry* tcl_entry_class(const QCString cl)
-{
- Entry *myEntry;
- if (!cl.length()) return(NULL);
-
- myEntry = tcl.cl.find(cl);
- if (myEntry == NULL)
- {
- myEntry = tcl_entry_new();
- myEntry->section = Entry::CLASS_SEC;
- myEntry->name = cl;
- tcl.entry_main->moveToSubEntryAndKeep(myEntry);
- tcl.cl.insert(cl,myEntry);
- }
- return myEntry;
-}
-
-//! Check for keywords.
-// @return 1 if keyword and 0 otherwise
-static int tcl_keyword(QCString str)
-{
- static QCStringList myList;
- static int myInit=1;
- if (myInit)
- {
- // tcl keywords
- myList <<"append"<<"apply"<<"array"<<"auto_execok"<<"auto_import"<<"auto_load"<<"auto_mkindex"<<"auto_qualify"<<"auto_reset";
- myList <<"binary";
- myList <<"catch"<<"cd"<<"close"<<"clock"<<"concat";
- myList <<"eof"<<"eval"<<"exec"<<"exit"<<"expr";
- myList <<"fblocked"<<"fconfigure"<<"file"<<"fileevent"<<"flush"<<"for"<<"foreach"<<"format";
- myList <<"gets"<<"global";
- myList <<"http";
- myList <<"if"<<"incr"<<"info"<<"interp";
- myList <<"join";
- myList <<"lappend"<<"lassign"<<"lindex"<<"linsert"<<"llength"<<"load"<<"lrange"<<"lrepeat"<<"lreplace"<<"lreverse"<<"lset";
- myList <<"namespace";
- myList <<"package"<<"parray"<<"pid"<<"pkg_mkIndex"<<"proc"<<"puts"<<"pwd";
- myList <<"registry"<<"rename"<<"return";
- myList <<"scan"<<"set"<<"split"<<"string"<<"switch";
- myList <<"tclLog"<<"tcl_endOfWord"<<"tcl_findLibrary"<<"tcl_startOfNextWord"<<"tcl_startOfPreviousWord"<<"tcl_wordBreakAfter"<<"tcl_wordBreakBefore"<<"tell"<<"time";
- myList <<"unknown"<<"upvar";
- myList <<"variable"<<"vwait";
-// tk keywords
- myList <<"bell"<<"bind"<<"bindtags";
- myList <<"clipboard"<<"console"<<"consoleinterp";
- myList <<"destroy";
- myList <<"event";
- myList <<"focus";
- myList <<"grid";
- myList <<"lower";
- myList <<"option";
- myList <<"pack"<<"place";
- myList <<"raise";
- myList <<"send";
- myList <<"tkerror"<<"tkwait"<<"tk_bisque"<<"tk_focusNext"<<"tk_focusPrev"<<"tk_focusFollowsMouse"<<"tk_popup"<<"tk_setPalette"<<"tk_textCut"<<"tk_TextCopy"<<"tk_textPaste"<<"chooseColor"<<"tk_chooseColor"<<"tk_chooseDirectory"<<"tk_dialog"<<"tk_getOpenFile"<<"tkDialog"<<"tk_getSaveFile"<<"tk_messageBox";
- myList <<"winfo"<<"wm";
- myList <<"button"<<"canvas"<<"checkbutton"<<"entry"<<"frame"<<"image"<<"label"<<"labelframe"<<"listbox"<<"menu"<<"menubutton"<<"message"<<"panedwindow"<<"radiobutton"<<"scale"<<"scrollbar"<<"spinbox"<<"toplevel";
- //myList.sort();
- myInit=0;
- }
- str=str.stripWhiteSpace();
- if (str.left(2)=="::") {str=str.mid(2);}
- if (myList.findIndex(str) != -1) return(1);
- return 0;
-}
-
-//! End codifying with special font class.
-static void tcl_font_end()
-{
- if (!tcl.code) return;
- if (tcl.code_font)
- {
- tcl.code->endFontClass();
- tcl.code_font=NULL;
- }
-}
-
-//! Codify 'str' with special font class 's'.
-static void tcl_codify(const char *s,const char *str)
-{
- if (!tcl.code || !str) return;
- if (s && qstrcmp(s,"NULL")!=0)
- {
- tcl_font_end();
- tcl.code->startFontClass(s);
- tcl.code_font=s;
- }
- char *tmp = (char *) malloc(strlen(str)+1);
- strcpy(tmp, str);
- char *p=tmp,*sp=p;
- char c;
- bool done=FALSE;
- while (!done)
- {
- sp=p;
- while ((c=*p++) && c!='\n') {}
- if (c=='\n')
- {
- tcl.code_line++;
- *(p-1)='\0'; // Dimitri: is this really needed?
- // wtschueller: As far as I can see: yes.
- // Deletes that \n that would produce ugly source listings otherwise.
- // However, there may exist more sophisticated solutions.
- tcl.code->codify(sp);
- if (tcl.code_font)
- {
- tcl.code->endFontClass();
- }
- tcl.code->endCodeLine();
- tcl.code->startCodeLine(tcl.code_linenumbers);
- if (tcl.code_linenumbers)
- {
- tcl.code->writeLineNumber(0,0,0,tcl.code_line);
- }
- if (tcl.code_font)
- {
- tcl.code->startFontClass(tcl.code_font);
- }
- }
- else
- {
- if (*(p-2)==0x1A) *(p-2) = '\0'; // remove ^Z
- tcl.code->codify(sp);
- done=TRUE;
- }
- }
- free(tmp);
- tcl_font_end();
-}
-
-#if 0
-//! Codify 'str' with special font class 's'.
-static void tcl_codify(const char *s,const char *str)
-{
- if (tcl.code==NULL) return;
- char *tmp= (char *) malloc(strlen(str)+1);
- strcpy(tmp, str);
- tcl_codify(s,tmp);
- free(tmp);
-}
-
-//! Codify 'str' with special font class 's'.
-static void tcl_codify(const char *s,const QCString &str)
-{
- if (tcl.code==NULL) return;
- tcl_codify(s,str);
-}
-
-//! Codify 'str' with special font class 's'.
-static void tcl_codify(const char *s,const QCString &str)
-{
- if (!tcl.code) return;
- tcl_codify(s,str.data());
-}
-#endif
-
-static void tcl_codify_cmd(const char *s,int i)
-{
- tcl_codify(s,(*tcl.list_commandwords.at(i)));
-}
-//! codify a string token
-//
-// codifies string according to type.
-// Starts a new scan context if needed (*myScan==0 and type == "script").
-// Returns NULL or the created scan context.
-//
-static tcl_scan *tcl_codify_token(tcl_scan *myScan, const QCString type, const QCString string)
-{
- if (myScan != NULL)
- {
- if (type != NULL)
- {
- myScan->after << type << string;
- }
- else
- {
- myScan->after << "NULL" << string;
- }
- }
- else
- {
- if (qstrcmp(type, "script") == 0)
- {
- myScan = tcl.scan.at(0);
- myScan = tcl_scan_start('?', string,
- myScan->ns, myScan->entry_cl, myScan->entry_fn);
- }
- else
- {
- tcl_codify((const char*)type, string);
- }
- }
- return myScan;
-}
-
-//-----------------------------------------------------------------------------
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-//-----------------------------------------------------------------------------
-%}
-ws ([ \t]|\\\n)
-
-%option yylineno
-%option noyywrap
-%option stack
-
-%x ERROR
-%x TOP
-%x COMMAND
-%x WORD
-%x COMMENT
-%x COMMENT_NL
-%x COMMENT_CODE
-%x COMMENT_VERB
-%x COMMENTLINE
-%x COMMENTLINE_NL
-%%
-<ERROR>. {
-D
- yyterminate();
-}
-<<EOF>> {
-D
- if (tcl.scan.count()<1)
- {// error
-D
- tcl_err("Tcl parser stack empty! Parser error in file '%s'.\n",tcl.file_name.data());
- yyterminate();
- }
- else if (tcl.scan.count()==1)
- {// exit, check on input?
-D
- yyterminate();
- }
- else
- {// continue
-D
- tcl_command(-1,"");
- tcl_scan_end();
- }
-}
-<TOP>"#" {
-D
- yyless(0);
- tcl.line_comment=yylineno;
- tcl_comment(0,"");
-}
-<TOP>({ws}|[\;\n])+ {
-D
- tcl_codify(NULL,yytext);
-}
-<TOP>. {
-D
- yyless(0);
- tcl.line_command=yylineno;
- tcl_command(0,"");
-}
-
-<COMMENT>[ \t]* {
-D
- tcl_codify("comment",yytext);
-}
-<COMMENT>"###".*\n {
-D
- tcl_codify("comment",yytext);
- tcl_comment(2,yytext+1);
-}
-<COMMENT>"##".*\\\n {
-D
- tcl_codify("comment",yytext);
- QCString t=yytext;
- t = t.mid(2,t.length()-3);
- t.append("\n");
- tcl_comment(1,t.data());
- yy_push_state(COMMENT_NL);
-}
-<COMMENT>"##".*\n {
-D
- tcl_codify("comment",yytext);
- tcl_comment(1,yytext+2);
-}
-<COMMENT>"#"[@\\]"code"\n[ \t]*[^#] {
-D
- QCString t=yytext;
- tcl_codify("comment",t.left(7));
- tcl_comment(2,"\n@code\n");
- yyless(7);
- yy_push_state(COMMENT_CODE);
-}
-<COMMENT>"#"[@\\]"verbatim"\n[ \t]*[^#] {
-D
- QCString t=yytext;
- tcl_codify("comment",t.left(11));
- tcl_comment(2,"\n@verbatim\n");
- yyless(11);
- yy_push_state(COMMENT_VERB);
-}
-<COMMENT>"#".*\\\n {
-D
- tcl_codify("comment",yytext);
- QCString t=yytext;
- t = t.mid(1,t.length()-3);
- t.append("\n");
- tcl_comment(2,t.data());
- yy_push_state(COMMENT_NL);
-}
-<COMMENT>"#".*\n {
-D
- tcl_codify("comment",yytext);
- tcl_comment(2,yytext+1);
-}
-<COMMENT>"#".*\x1A {
-D
- QCString t=yytext;
- t = t.mid(0,t.length()-1);
- tcl_codify("comment",t.data());
- t = t.mid(1,t.length());
- tcl_comment(-2,t.data());
- unput(0x1A);
-}
-<COMMENT>\x1A {
-D
- tcl_comment(-2,"");
- unput(0x1A);
-}
-<COMMENT>.|\n {
-D
- tcl_comment(-2,yytext);
- yyless(0);
-}
-
-<COMMENT_CODE>"#"[@\\]"endcode"\n {
-D
- QCString t=yytext;
- t = t.left(t.length()-10);
- tcl_comment(2,t.data());
- tcl_comment(2,"\n@endcode\n");
- yy_pop_state();
- yyless(0);
-}
-<COMMENT_CODE>.*\n {
-D
- yymore();
-}
-<COMMENT_CODE>.*\x1A {
-D
- yy_pop_state();
- yyless(0);
-}
-
-<COMMENT_VERB>"#"[@\\]"endverbatim"\n {
-D
- QCString t=yytext;
- t = t.left(t.length()-14);
- tcl_comment(2,t.data());
- tcl_comment(2,"\n@endverbatim\n");
- yy_pop_state();
- yyless(0);
-}
-<COMMENT_VERB>.*\n {
-D
- yymore();
-}
-<COMMENT_VERB>.*\x1A {
-D
- yy_pop_state();
- yyless(0);
-}
-
-<COMMENT_NL>.*\\\n {
-D
- tcl_codify("comment",yytext);
- tcl_comment(2,yytext);
-}
-<COMMENT_NL>.*\n {
-D
- tcl_codify("comment",yytext);
- tcl_comment(2,yytext);
- yy_pop_state();
-}
-<COMMENT_NL>.*\x1A {
-D
- yy_pop_state();
- yyless(0);
-}
-
-<COMMENTLINE>.*\x1A {
-D
- yy_pop_state();
- yyless(0);
-}
-<COMMENTLINE>[ \t]* {
-D
- tcl.string_commentcodify += yytext;
-}
-<COMMENTLINE>"#<".*\\\n {
-D
- tcl.string_commentcodify += yytext;
- QCString t=yytext;
- t = t.mid(2,t.length()-4);
- t.append("\n");
- tcl.string_commentline += t;
- yy_push_state(COMMENTLINE_NL);
-}
-<COMMENTLINE>"#<".*\n {
-D
- tcl.string_commentcodify += yytext;
- tcl.string_commentline += (yytext+2);
-}
-<COMMENTLINE>.|\n {
-D
- yy_pop_state();
- if (tcl.string_commentline.length())
- {
- tcl.entry_current->brief = tcl.string_commentline;
- tcl.entry_current->briefLine = tcl.line_commentline;
- tcl.entry_current->briefFile = tcl.file_name;
- }
- yyless(0);
- tcl_command(-1,tcl.string_commentcodify.data());
- tcl.string_commentline="";
- tcl.string_commentcodify="";
-}
-
-<COMMENTLINE_NL>.*\\\n {
-D
- tcl.string_commentcodify += yytext;
- QCString t=yytext;
- t = t.left(t.length()-3);
- t.append("\n");
- tcl.string_commentline += t;
-}
-<COMMENTLINE_NL>.*\n {
-D
- tcl.string_commentcodify += yytext;
- tcl.string_commentline += yytext;
- yy_pop_state();
-}
-<COMMENTLINE_NL>.*\x1A {
-D
- QCString t=yytext;
- t = t.left(t.length()-1);
- tcl.string_commentcodify += t;
- tcl.string_commentline += t;
- yy_pop_state();
- unput(0x1A);
-}
-
-<COMMAND>{ws}*[\;]{ws}*"#<" {
-D
- tcl.string_commentcodify = yytext;
- tcl.string_commentcodify = tcl.string_commentcodify.left(tcl.string_commentcodify.length()-2);
- tcl.string_commentline = "";
- tcl.line_commentline = yylineno;
- tcl.line_body1=yylineno;
- unput('<');
- unput('#');
- yy_push_state(COMMENTLINE);
-}
-<COMMAND>{ws}*\x1A {
-D
- tcl.string_commentcodify = "";
- tcl.string_commentline = "";
- tcl.line_body1=yylineno;
- tcl_command(-1,yytext);
-}
-<COMMAND>{ws}*; {
-D
- tcl.string_commentcodify = "";
- tcl.string_commentline = "";
- tcl.line_body1=yylineno;
- tcl_command(-1,yytext);
-}
-<COMMAND>{ws}*\n {
-D
- tcl.string_commentcodify = "";
- tcl.string_commentline = "";
- tcl.line_body1=yylineno-1;
- tcl_command(-1,yytext);
-}
-<COMMAND>{ws}+ {
-D
- tcl_command(1,yytext);
-}
-<COMMAND>"{*}". {
-D
- tcl.word_is = ' ';
- tcl.string_last = "{*}";
- tcl_word(0,&yytext[3]);
-}
-<COMMAND>"\\"[\{\}\[\]\;\" \t] {
-D
- tcl.word_is=' ';
- tcl.string_last = "";
- tcl_word(0,yytext);
-}
-<COMMAND>. {
-D
- tcl.word_is=' ';
- if (yytext[0]=='{'||yytext[0]=='['||yytext[0]=='"') tcl.word_is = yytext[0];
- tcl.string_last = "";
- tcl_word(0,yytext);
-}
-
-<WORD>"\\\\" |
-<WORD>"\\"[\{\}\[\]\;\" \t] {
- tcl_word(1,yytext);
-}
-<WORD>"\\\n" {
- tcl_word(2,yytext);
-}
-<WORD>"{" {
- tcl_word(3,yytext);
-}
-<WORD>"}" {
- tcl_word(4,yytext);
-}
-<WORD>"[" {
- tcl_word(5,yytext);
-}
-<WORD>"]" {
- tcl_word(6,yytext);
-}
-<WORD>"\"" {
- tcl_word(7,yytext);
-}
-<WORD>" " {
- tcl_word(8,yytext);
-}
-<WORD>"\t" {
- tcl_word(9,yytext);
-}
-<WORD>";" {
- tcl_word(10,yytext);
-}
-<WORD>"\n" {
- tcl_word(11,yytext);
-}
-<WORD>\x1A {
- tcl_word(12,yytext);
-}
-<WORD>. {
- tcl_word(1,yytext);
-}
-%%
-
-//! Start new scan context for given 'content'.
-// @return created new scan context.
-static tcl_scan *tcl_scan_start(char type, QCString content, QCString ns, Entry *entry_cl, Entry *entry_fn)
-{
- tcl_scan *myScan=tcl.scan.at(0);
-tcl_inf("line=%d type=%d '%s'\n",tcl.line_body0,type,content.data());
-
- myScan->line1=yylineno;
- yy_push_state(TOP);
-
- myScan=new tcl_scan;
- myScan->type[0] =' ';
- myScan->type[1] = '\0';
- switch (type) {
- case '"':
- case '{':
- case '[':
- myScan->type[0] = type;
- break;
- case '?':
- if (content[0]=='"' && content[content.length()-1]=='"') myScan->type[0]='"';
- if (content[0]=='{' && content[content.length()-1]=='}') myScan->type[0]='{';
- if (content[0]=='[' && content[content.length()-1]==']') myScan->type[0]='[';
- }
- if (myScan->type[0]!=' ')
- {
- tcl_codify(NULL,&myScan->type[0]);
- content = content.mid(1,content.length()-2);
- }
- content += (char)0x1A;// for detection end of scan context
- myScan->ns = ns;
- myScan->entry_cl = entry_cl;
- myScan->entry_fn = entry_fn;
- myScan->entry_scan = tcl.entry_current;
- myScan->buffer_state=yy_scan_string(content.data());
- myScan->line0=tcl.line_body0;
- myScan->line1=tcl.line_body1;
- myScan->after.clear();
- yylineno=myScan->line0;
- myScan->protection = tcl.protection;
-
- tcl.entry_inside = myScan->entry_scan;
- tcl.entry_current = tcl_entry_new();
- tcl.scan.insert(0,myScan);
- yy_switch_to_buffer(myScan->buffer_state);
- return (myScan);
-}
-
-//! Close current scan context.
-static void tcl_scan_end()
-{
- tcl_scan *myScan=tcl.scan.at(0);
- tcl_scan *myScan1=tcl.scan.at(1);
-tcl_inf("line=%d\n",myScan->line1);
-
- if (myScan->type[0]=='{') myScan->type[0]='}';
- if (myScan->type[0]=='[') myScan->type[0]=']';
- if (myScan->type[0]!=' ') tcl_codify(NULL,&myScan->type[0]);
- int myStart=-1;
- for (unsigned int i=0;i<myScan->after.count();i=i+2)
- {
- if (myScan->after[i]=="script") {
- myStart=i;
- break;
- }
- tcl_codify(myScan->after[i],myScan->after[i+1]);
- }
- yy_delete_buffer(myScan->buffer_state);
- yy_pop_state();
- tcl.entry_inside = myScan1->entry_scan;
- yy_switch_to_buffer(myScan1->buffer_state);
- yylineno=myScan1->line1;
- tcl.protection = myScan1->protection;
- if (myStart>=0)
- {
- myScan1 = tcl_scan_start('?', myScan->after[myStart+1], myScan->ns, myScan->entry_cl, myScan->entry_fn);
- for (unsigned int i=myStart+2;i<myScan->after.count();i++)
- {
- myScan1->after.append(myScan->after[i]);
- }
- tcl.scan.remove(1);
- }
- else
- {
- tcl.scan.removeFirst();
- }
-}
-
-//! Handling of word parsing.
-static void tcl_word(int what,const char *text)
-{
- static char myList[1024]="";// nesting level list
- static int myLevel=0;// number of current nesting level
- static int myWhite=0;// set true when next char should be whitespace
- static char myWord;// internal state
-
- switch (what)
- {
- case 0:// start
- yy_push_state(WORD);
- switch (text[0])
- {
- case '{':
- case '[':
- case '"': myWord = text[0]; break;
- default: myWord = '.';
- }
- myList[0]=myWord;
- myLevel=1;
- myWhite=0;
- break;
- case 1:// all other chars
- if (myWhite)
- {// {x}y "x"y
- tcl_err("expected word separator: %s\n",text);
- return;
- }
- if (myLevel==0)
- {
- myWord='.';
- myList[0]=myWord;
- myLevel=1;
- }
- break;
- case 2:// \\\n
- if (myLevel==0)
- {
- myWord=' ';
- yy_pop_state();
- yyless(0);
-tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data());
- return;
- }
- switch (myList[myLevel-1])
- {
- case '{':
- case '[':
- case '"':
- break;
- case '.':
- if (myLevel==1)
- {
- myWord=' ';
- yy_pop_state();
- yyless(0);
-tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data());
- return;
- }
- break;
- }
- myWhite=0;
- break;
- case 3:// {
- if (myWhite)
- {// {x}{ "x"{
- tcl_err("expected word separator: %s\n",text);
- return;
- }
- switch (myList[myLevel-1])
- {
- case '{':
- case '[':
- myList[myLevel++]='{';
- break;
- case '"':
- case '.':
- break;
- }
- myWhite=0;
- break;
- case 4:// }
- if (myWhite)
- {// {x}{ "x"{
- tcl_err("expected word separator: %s\n",text);
- return;
- }
- switch (myList[myLevel-1])
- {
- case '{':// {{x}}
- myLevel--;
- if (myLevel==0 && !tcl.code)
- {
- myWhite=1;
- }
- break;
- case '[':
- case '"':
- case '.':
- break;
- }
- break;
- case 5:// [
- if (myWhite)
- {// {x}[
- tcl_err("expected word separator: %s\n",text);
- return;
- }
- switch (myList[myLevel-1])
- {
- case '{':
- break;
- case '[':
- case '"':
- case '.':
- myList[myLevel++]='[';
- break;
- }
- myWhite=0;
- break;
- case 6:// ]
- if (myWhite)
- {// {x}]
- tcl_err("expected word separator: %s\n",text);
- return;
- }
- switch (myList[myLevel-1])
- {
- case '{':
- break;
- case '[':
- myLevel--;
- break;
- case '"':
- case '.':
- break;
- }
- myWhite=0;
- break;
- case 7:// "
- if (myWhite)
- {// {x}"
- tcl_err("expected word separator: %s\n",text);
- return;
- }
- switch (myList[myLevel-1])
- {
- case '{':
- break;
- case '[':
- myList[myLevel++]='"';
- break;
- case '"':
- myLevel--;
- case '.':
- break;
- }
- break;
- case 8:// ' '
- case 9:// \t
- case 10:// ;
- case 11:// \n
- if (myLevel==0)
- {
- myWord=' ';
- yy_pop_state();
- yyless(0);
-tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data());
- return;
- }
- switch (myList[myLevel-1])
- {
- case '{':
- case '[':
- case '"':
- break;
- case '.':
- if (myLevel==1)
- {
- myWord=' ';
- yy_pop_state();
- yyless(0);
-tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data());
- return;
- }
- else
- {
- myLevel--;
- }
- break;
- }
- myWhite=0;
- break;
- case 12:// \x1A
- if (myLevel==0)
- {
- myWord=' ';
- yy_pop_state();
- yyless(0);
-tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data());
- return;
- }
- if (myLevel!=1 || myList[0] != '.')
- {
- tcl_war("level=%d expected=%c\n",myLevel,myList[myLevel-1]);
- }
- myWord=' ';
- yy_pop_state();
- yyless(0);
-tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data());
- return;
- break;
- default:
- tcl_err("wrong state: %d\n",what);
- return;
- }
- tcl.string_last += text;
-}
-
-//! Handling of comment parsing.
-static void tcl_comment(int what,const char *text)
-{
- if (what==0)
- { // begin of comment
- if (tcl.comment)
- {
- tcl_err("comment in comment\n");
- return;
- }
- yy_push_state(COMMENT);
-tcl_inf("<- %s\n",text);
- tcl.string_comment="";
- tcl.comment=0;
- }
- else if (what==1)
- { // start new comment
- if (tcl.comment)
- {
- tcl_comment(99,""); // inbody
- }
- tcl.string_comment=text;
- tcl.comment=1;
- }
- else if (what==2)
- { // add to comment
- if (tcl.comment)
- {
- tcl.string_comment+=text;
- }
- }
- else if (what==-1 || what == -2)
- { // end of comment without/with command
- if (tcl.comment)
- {
- tcl.string_last=tcl.string_comment;
- tcl_comment(100+what,"");
- }
- else
- {
- tcl.string_last = "";
-tcl_inf("-> %s\n",(const char *)tcl.string_comment);
- }
- yy_pop_state();
- tcl.string_comment="";
- tcl.comment=0;
- }
- else if (what==98 || what==99)
- { // 98=new 99=inbody
- if (tcl.this_parser && tcl.string_comment.length())
- {
-tcl_inf("-> %s\n",(const char *)tcl.string_comment);
- int myPos=0;
- bool myNew=false;
- int myLine=tcl.line_comment;
- BufStr myI(1024);
- BufStr myO(1024);
- Protection myProt=tcl.protection;
-
- // resolve ALIASES
- myI.addArray("/*!",3);
- myI.addArray(tcl.string_comment.data(),tcl.string_comment.length());
- myI.addArray("*/",2);
- convertCppComments(&myI,&myO,tcl.file_name);
- myO.dropFromStart(3);
- myO.shrink(myO.curPos()-2);
- myO.addChar('\0');
- QCString myDoc = myO.data();
- QCString processedDoc;
- if (what==99)
- { // inbody comment file or namespace or class or proc/method
- int myPos0;
- int myLine0;
- Entry myEntry0; // used to test parsing
- Entry *myEntry;
-
- Entry *myEntry1=NULL;
- if (tcl.scan.at(0)->entry_fn)
- {
- myEntry1=tcl.scan.at(0)->entry_fn;
- }
- else if (tcl.scan.at(0)->entry_cl)
- {
- myEntry1=tcl.scan.at(0)->entry_cl;
- }
-
- myPos0=myPos;
- myLine0=myLine;
- processedDoc = processMarkdownForCommentBlock(myDoc,tcl.file_name,myLine);
- while (tcl.commentScanner.parseCommentBlock(tcl.this_parser, &myEntry0, processedDoc, tcl.file_name,
- myLine, FALSE, tcl.config_autobrief, FALSE, myProt, myPos, myNew))
- {
- if (myNew)
- { // we need a new entry in this case
- myNew=0;
- myEntry = tcl_entry_new();
- processedDoc = processMarkdownForCommentBlock(myDoc,tcl.file_name,myLine0);
- tcl.commentScanner.parseCommentBlock(tcl.this_parser, myEntry, processedDoc, tcl.file_name,
- myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
- tcl.entry_inside->moveToSubEntryAndRefresh(myEntry);
- }
- else
- { // we can add to current entry in this case
- if (!myEntry1)
- {
- myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns);
- }
- processedDoc = processMarkdownForCommentBlock(myDoc,tcl.file_name,myLine0);
- tcl.commentScanner.parseCommentBlock(tcl.this_parser, myEntry1, processedDoc, tcl.file_name,
- myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
- }
- myPos0=myPos;
- myLine0=myLine;
- }
- if (myNew)
- { // we need a new entry
- myNew=0;
- myEntry = tcl_entry_new();
- processedDoc = processMarkdownForCommentBlock(myDoc,tcl.file_name,myLine0);
- tcl.commentScanner.parseCommentBlock(tcl.this_parser, myEntry, processedDoc, tcl.file_name,
- myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
- tcl.entry_inside->moveToSubEntryAndKeep(myEntry);
- }
- else
- { // we can add to current entry
- if (!myEntry1)
- {
- myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns);
- }
- processedDoc = processMarkdownForCommentBlock(myDoc,tcl.file_name,myLine0);
- tcl.commentScanner.parseCommentBlock(tcl.this_parser, myEntry1, processedDoc, tcl.file_name,
- myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
- }
- }
- else
- { // new entry
- tcl.entry_current = tcl_entry_new();
- processedDoc = processMarkdownForCommentBlock(myDoc,tcl.file_name,myLine);
- while (tcl.commentScanner.parseCommentBlock(tcl.this_parser, tcl.entry_current, processedDoc,
- tcl.file_name, myLine, FALSE, tcl.config_autobrief, FALSE,
- myProt, myPos, myNew))
- {
- if (myNew)
- {
- tcl.entry_inside->moveToSubEntryAndKeep(tcl.entry_current);
- tcl.entry_current = tcl_entry_new();
- }
- else
- {
- tcl.entry_current->section = tcl.entry_inside->section;
- tcl.entry_current->name = tcl.entry_inside->name;
- }
- }
- if (myNew)
- {
- tcl.entry_inside->moveToSubEntryAndKeep(tcl.entry_current);
- tcl.entry_current = tcl_entry_new();
- }
- else
- {
- tcl.entry_current->section = tcl.entry_inside->section;
- tcl.entry_current->name = tcl.entry_inside->name;
- }
- }
- if (tcl.protection != myProt)
- {
- tcl.scan.at(0)->protection = tcl.protection = myProt;
- }
- }
- }
- else
- {
- tcl_err("what %d\n",what);
- return;
- }
-}
-
-//! Parse given \c arglist .
-static void tcl_command_ARGLIST(QCString &arglist)
-{
-D
- QCStringList myArgs;
- QCString myArglist="";
-
- tcl_split_list(arglist,myArgs);
- for (uint i=0;i<myArgs.count();i++)
- {
- QCStringList myArgs1;
- Argument myArg;
-
- tcl_split_list(*myArgs.at(i),myArgs1);
- if (myArgs1.count()==2)
- {
- myArg.name= (*myArgs1.at(0));
- myArg.defval= (*myArgs1.at(1));
- if (myArg.defval.isEmpty())
- {
- myArg.defval = " ";
- }
- myArglist += "?" + QCString(myArg.name) + "? ";
- }
- else
- {
- myArg.name= (*myArgs.at(i));
- myArglist += myArg.name + " ";
- }
- tcl.entry_current->argList.push_back(myArg);
- }
- arglist = myArglist;
- tcl.entry_current->args = arglist;
-}
-
-//! Create link.
-static void tcl_codify_link(QCString name)
-{
- if (tcl.code == NULL || name.isEmpty()) return;
- static int init=0;
- static QAsciiDict<MemberDef> fn;
- if (init==0)
- {
- init=1;
- MemberNameSDict::Iterator mni(*Doxygen::memberNameSDict);
- MemberNameSDict::Iterator fni(*Doxygen::functionNameSDict);
- MemberName *mn=0;
- MemberDef *md;
- for (mni.toFirst();(mn=mni.current());++mni)
- {
- MemberNameIterator mi(*mn);
- for (mi.toFirst();(md=mi.current());++mi)
- {
- fn.insert(md->qualifiedName(),md);
- }
- }
- for (fni.toFirst();(mn=fni.current());++fni)
- {
- MemberNameIterator fi(*mn);
- for (fi.toFirst();(md=fi.current());++fi)
- {
- fn.insert(md->qualifiedName(),md);
- }
- }
- }
- MemberDef *myDef;
- QCString myName=name;
- if (name.mid(0,2)=="::") // fully qualified global command
- {
- myName = myName.mid(2);
- myDef = fn.find(myName);
- }
- else // not qualified name
- {
- QCString myName1=myName;
- myDef = NULL;
- myName1 = tcl.scan.at(0)->ns;
- if (myName1 == " " || myName1 == "")
- {
- myName1 = myName;
- }
- else
- {
- myName1 = myName1 + "::" + myName;
- }
- myDef = fn.find(myName1); // search namespace command
- if (myDef == NULL)
- {
- myDef = fn.find(myName); // search global command
- }
- }
- if (myDef != NULL) // documented command
- {
- tcl.code->writeCodeLink(myDef->getReference().data(),
- myDef->getOutputFileBase().data(),
- myDef->anchor().data(),
- name,
- myDef->qualifiedName().data());
- if (tcl.memberdef)
- {
- myDef->addSourceReferencedBy(tcl.memberdef);
- //tcl.memberdef->addSourceReferences(myDef);
- } else {
- Entry* callerEntry;
- unsigned int i;
- // walk the stack of scan contexts and find the enclosing method or proc
- for (i=0;i<tcl.scan.count();i++)
- {
- callerEntry=tcl.scan.at(i)->entry_scan;
- if (callerEntry->mtype==Method && !callerEntry->name.isEmpty())
- {
- break;
- }
- }
- if (i<tcl.scan.count())
- {
- // enclosing method found
- QCString callerName = callerEntry->name;
- if (callerName.mid(0,2)=="::") // fully qualified global command
- {
- callerName = callerName.mid(2);
- }
- else
- {
- if (!(tcl.scan.at(0)->ns.stripWhiteSpace().isEmpty()))
- {
- callerName = tcl.scan.at(0)->ns + "::" + callerEntry->name;
- }
- }
- MemberDef *callerDef=NULL;
- callerDef = fn.find(callerName);
- if (callerDef!=NULL && myDef!= NULL && tcl.collectXRefs)
- {
- addDocCrossReference(callerDef,myDef);
- }
- }
- }
- }
- else if (tcl_keyword(myName)) // check keyword
- {
- tcl_codify("keyword",name);
- }
- else
- {
- tcl_codify(NULL,name); // something else
- }
-
-}
-
-//! scan general argument for brackets
-//
-// parses (*tcl.list_commandwords.at(i)) and checks for brackets.
-// Starts a new scan context if needed (*myScan==0 and brackets found).
-// Returns NULL or the created scan context.
-//
-static tcl_scan *tcl_command_ARG(tcl_scan *myScan, unsigned int i, bool ignoreOutermostBraces)
-{
- QCString myName;
- bool insideQuotes=false;
- unsigned int insideBrackets=0;
- unsigned int insideBraces=0;
- myName = (*tcl.list_commandwords.at(i));
- if (i%2 != 0)
- {
- // handle white space
- myScan = tcl_codify_token(myScan, "NULL", myName);
- }
- else
- {
- QCString myStr = "";
- unsigned int j;
- for (j=0;j<myName.length();j++)
- {
- QChar c = myName[j];
- bool backslashed = false;
- if (j>0)
- {
- backslashed = myName[j-1]=='\\';
- }
- // this is a state machine
- // input is c
- // internal state is myScan and insideXXX
- // these are the transitions:
- if (c=='[' && !backslashed && insideBraces==0)
- {
- insideBrackets++;
- }
- if (c==']' && !backslashed && insideBraces==0 && insideBrackets>0)
- {
- insideBrackets--;
- }
- if (c=='{' && !backslashed && !insideQuotes && !(ignoreOutermostBraces && j==0))
- {
- insideBraces++;
- }
- if (c=='}' && !backslashed && !insideQuotes && insideBraces>0)
- {
- insideBraces--;
- }
- if (c=='"' && !backslashed && insideBraces==0)
- {
- insideQuotes=!insideQuotes;
- }
- // all output, depending on state and input
- if (c=='[' && !backslashed && insideBrackets==1 && insideBraces==0)
- {
- // the first opening bracket, output what we have so far
- myStr+=c;
- myScan = tcl_codify_token(myScan, "NULL", myStr);
- myStr="";
- }
- else if (c==']' && !backslashed && insideBrackets==0 && insideBraces==0)
- {
- // the last closing bracket, start recursion, switch to deferred
- myScan = tcl_codify_token(myScan, "script", myStr);
- myStr="";
- myStr+=c;
- }
- else
- {
- myStr+=c;
- }
- }
- if (i == 0 && myScan == NULL)
- {
- tcl_codify_link(myStr);
- }
- else
- {
- myScan = tcl_codify_token(myScan, "NULL", myStr);
- }
- }
- return (myScan);
-}
-
-//! Handle internal tcl commands.
-// "eval arg ?arg ...?"
-static void tcl_command_EVAL()
-{
-D
- tcl_codify_cmd("keyword", 0);
- tcl_scan *myScan = tcl.scan.at(0);
- QCString myString = "";
- // we simply rescan the line without the eval
- // we include leading whitespace because tcl_scan_start will examine
- // the first char. If it finds a bracket it will assume one expression in brackets.
- // Example: eval [list set] [list NotInvoked] [Invoked NotInvoked]
- for (unsigned int i = 1; i < tcl.list_commandwords.count(); i++)
- {
- myString += (*tcl.list_commandwords.at(i));
- }
- myScan = tcl_scan_start('?', myString,
- myScan->ns, myScan->entry_cl, myScan->entry_fn);
-}
-
-//! Handle internal tcl commands.
-// switch ?options? string pattern body ?pattern body ...?
-// switch ?options? string {pattern body ?pattern body ...?}
-static void tcl_command_SWITCH()
-{
-D
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_scan *myScan=NULL;
- unsigned int i;
- QCString token;
- // first: find the last option token
- unsigned int lastOptionIndex = 0;
- for (i = 2; i<tcl.list_commandwords.count(); i += 2)
- {
- token = (*tcl.list_commandwords.at(i));
- if (token == "--")
- {
- lastOptionIndex = i;
- break;
- }
- if (token[0] == '-' && i - lastOptionIndex == 2)
- {
- // options start with dash and should form a continuous chain
- lastOptionIndex = i;
- }
- }
- // second: eat up options
- for (i = 2; i <= lastOptionIndex; i++)
- {
- myScan = tcl_command_ARG(myScan, i, false);
- }
- // third: how many tokens are left?
- if (tcl.list_commandwords.count() - lastOptionIndex == 5)
- {
- //printf("syntax: switch ?options? string {pattern body ?pattern body ...?}\n");
- myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false);
- myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false);
- myScan = tcl_command_ARG(myScan, lastOptionIndex + 3, false);
- // walk trough the list step by step
- // this way we can preserve whitespace
- bool inBraces = false;
- bool nextIsPattern = true;
- int size;
- const char *elem;
- const char *next;
- token = (*tcl.list_commandwords.at(lastOptionIndex + 4));
- if (token[0] == '{')
- {
- inBraces = true;
- token = token.mid(1, token.length() - 2);
- myScan = tcl_codify_token(myScan, "NULL", QCString("{"));
- }
- // ToDo: check if multibyte chars are handled correctly
- while (token.length() > 0)
- {
- TclFindElement((const char*)token, token.length(), &elem, &next, &size, NULL);
- //printf("%s\nstart=%d, elem=%d, next=%d, size=%d, brace=%d\n",
- // (const char*) token, (const char*) token, elem, next, size, brace);
- //
- // handle leading whitespace/opening brace/double quotes
- if (elem - token > 0)
- {
- myScan = tcl_codify_token(myScan, "NULL", token.left(elem - token));
- }
- // handle actual element without braces/double quotes
- if (nextIsPattern)
- {
- myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token,size));
- //printf("pattern=%s\n",(const char*) token.mid(elem - token, size));
- }
- else {
- myScan = tcl_codify_token(myScan, "script", token.mid(elem - token, size));
- //printf("script =%s\n", (const char*) token.mid(elem - token, size));
- }
- // handle trailing whitespace/closing brace/double quotes
- if (next - elem - size > 0)
- {
- myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token + size, next - elem - size));
- }
- nextIsPattern = !nextIsPattern;
- token = token.mid(next - token);
- }
- if (inBraces)
- {
- myScan = tcl_codify_token(myScan, "NULL", QCString("}"));
- }
- if (!nextIsPattern)
- {
- tcl_war("Invalid switch syntax: last token is not a list of even elements.\n");
- //tcl_war("%s\n", tcl.list_commandwords.join(" ").ascii());
- }
- }
- else if ((tcl.list_commandwords.count() - lastOptionIndex > 6) &&
- ((tcl.list_commandwords.count() - lastOptionIndex-3) % 4 == 0))
- {
- //printf("detected: switch ?options? string pattern body ?pattern body ...?\n");
- myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false);
- myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false);
- //printf("value=%s\n",(const char*) (*tcl.list_commandwords.at(lastOptionIndex + 2)));
- for (i = lastOptionIndex + 3; i < tcl.list_commandwords.count(); i += 4)
- {
- myScan = tcl_command_ARG(myScan, i + 0, false); // whitespace
- myScan = tcl_command_ARG(myScan, i + 1, false); // pattern
- myScan = tcl_command_ARG(myScan, i + 2, false); // whitespace
- myScan = tcl_codify_token(myScan, "script", (*tcl.list_commandwords.at(i+3))); // script
- //printf("pattern=%s\n",(const char*) (*tcl.list_commandwords.at(i+1))));
- //printf("script=%s\n",(const char*) (*tcl.list_commandwords.at(i+3)));
- }
- }
- else
- {
- // not properly detected syntax
- tcl_war("Invalid switch syntax: %d options followed by %d tokens.\n",
- lastOptionIndex / 2, (tcl.list_commandwords.count() - 1) / 2 - lastOptionIndex / 2);
- for (i = lastOptionIndex + 1; i <= tcl.list_commandwords.count(); i++)
- {
- myScan = tcl_command_ARG(myScan, i, false);
- }
- }
-}
-
-//! Handle internal tcl commands.
-// "catch script ?resultVarName? ?optionsVarName?"
-static void tcl_command_CATCH()
-{
-D
- tcl_codify_cmd("keyword", 0);
- tcl_codify_cmd(NULL, 1);
- tcl_scan *myScan = tcl.scan.at(0);
- myScan = tcl_scan_start('?', *tcl.list_commandwords.at(2),
- myScan->ns, myScan->entry_cl, myScan->entry_fn);
- for (unsigned int i = 3; i < tcl.list_commandwords.count(); i++)
- {
- myScan = tcl_command_ARG(myScan, i, false);
- }
-}
-
-//! Handle internal tcl commands.
-// "if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?"
-static void tcl_command_IF(QCStringList type)
-{
-D
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_scan *myScan = NULL;
- myScan = tcl_command_ARG(myScan, 2, true);
- for (unsigned int i = 3;i<tcl.list_commandwords.count();i++)
- {
- if (type[i] == "expr")
- {
- myScan = tcl_command_ARG(myScan, i, true);
- }
- else
- {
- if (myScan!=0)
- {
- myScan->after << type[i] << tcl.list_commandwords[i];
- }
- else
- {
- myScan=tcl.scan.at(0);
- myScan = tcl_scan_start('?',*tcl.list_commandwords.at(i),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
- }
- }
- }
-}
-//! Handle internal tcl commands.
-// "for start test next body"
-static void tcl_command_FOR()
-{
-D
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_scan *myScan=tcl.scan.at(0);
- myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
- myScan->after << "NULL" << tcl.list_commandwords[3];
- myScan = tcl_command_ARG(myScan, 4, true);
- myScan->after << "NULL" << tcl.list_commandwords[5];
- myScan->after << "script" << tcl.list_commandwords[6];
- myScan->after << "NULL" << tcl.list_commandwords[7];
- myScan->after << "script" << tcl.list_commandwords[8];
-}
-
-///! Handle internal tcl commands.
-// "foreach varname list body" and
-// "foreach varlist1 list1 ?varlist2 list2 ...? body"
-static void tcl_command_FOREACH()
-{
-D
- unsigned int i;
- tcl_scan *myScan=NULL;
- tcl_codify_cmd("keyword",0);
- for (i = 1;i<tcl.list_commandwords.count()-1;i++)
- {
- myScan = tcl_command_ARG(myScan, i, false);
- }
- if (myScan!=0)
- {
- myScan->after << "script" << tcl.list_commandwords[tcl.list_commandwords.count()-1];
- }
- else
- {
- myScan=tcl.scan.at(0);
- myScan = tcl_scan_start('?',*tcl.list_commandwords.at(tcl.list_commandwords.count()-1),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
- }
-}
-
-///! Handle internal tcl commands.
-// "while test body"
-static void tcl_command_WHILE()
-{
-D
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_scan *myScan = NULL;
- myScan = tcl_command_ARG(myScan, 2, true);
- myScan = tcl_command_ARG(myScan, 3, false);
- if (myScan!=0)
- {
- myScan->after << "script" << tcl.list_commandwords[4];
- }
- else
- {
- myScan=tcl.scan.at(0);
- myScan = tcl_scan_start('?',*tcl.list_commandwords.at(4),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
- }
-}
-
-//! Handle all other commands.
-// Create links of first command word or first command word inside [].
-static void tcl_command_OTHER()
-{
- tcl_scan *myScan=NULL;
- for (unsigned int i=0; i< tcl.list_commandwords.count(); i++)
- {
- myScan = tcl_command_ARG(myScan, i, false);
- }
-}
-
-//! Handle \c proc statements.
-static void tcl_command_PROC()
-{
-D
- QCString myNs, myName;
- Entry *myEntryNs;
- Entry *myEntry;
- tcl_scan *myScan = tcl.scan.at(0);
-
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_codify_cmd(NULL,2);
- tcl_codify_cmd(NULL,3);
- tcl_codify_cmd(NULL,4);
- tcl_codify_cmd(NULL,5);
- tcl_name_SnippetAware(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName);
- if (myNs.length())
- {
- myEntryNs = tcl_entry_namespace(myNs);
- }
- else
- {
- myEntryNs = tcl_entry_namespace(myScan->ns);
- }
- //why not needed here? tcl.fn.remove(myName);
- tcl.entry_current->section = Entry::FUNCTION_SEC;
- tcl.entry_current->mtype = Method;
- tcl.entry_current->name = myName;
- tcl.entry_current->startLine = tcl.line_command;
- tcl.entry_current->docLine = tcl.line_comment;
- tcl.entry_current->inbodyLine = tcl.line_comment;
- tcl.entry_current->bodyLine = tcl.line_body0;
- tcl.entry_current->endBodyLine = tcl.line_body1;
- tcl_protection(tcl.entry_current);
- tcl_command_ARGLIST(*tcl.list_commandwords.at(4));
- myEntryNs->moveToSubEntryAndKeep(tcl.entry_current);
- myEntry = tcl.entry_current;
- tcl.fn.insert(myName,myEntry);
- myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
- myEntryNs->name,NULL,myEntry);
-}
-
-//! Handle \c itcl::body statements and \c oo::define method and method inside \c itcl::class statements.
-static void tcl_command_METHOD()
-{
-D
- QCString myNs, myName;
- Entry *myEntryCl, *myEntry;
- tcl_scan *myScan = tcl.scan.at(0);
-
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_codify_cmd(NULL,2);
- tcl_codify_cmd(NULL,3);
- tcl_codify_cmd(NULL,4);
- tcl_codify_cmd(NULL,5);
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName);
- if (myNs.length())
- {
- myEntryCl = tcl_entry_class(myNs);
- }
- else
- {
- myNs = myScan->ns;
- myEntryCl = myScan->entry_cl;
- }
- // needed in case of more then one definition p.e. itcl::method and itcl::body
- // see also bug #
- tcl.fn.remove(myName);
- tcl.entry_current->section = Entry::FUNCTION_SEC;
- tcl.entry_current->mtype = Method;
- tcl.entry_current->name = myName;
- tcl.entry_current->startLine = tcl.line_command;
- tcl.entry_current->docLine = tcl.line_comment;
- tcl.entry_current->inbodyLine = tcl.line_comment;
- tcl.entry_current->bodyLine = tcl.line_body0;
- tcl.entry_current->endBodyLine = tcl.line_body1;
- tcl_protection(tcl.entry_current);
- tcl_command_ARGLIST(*tcl.list_commandwords.at(4));
- myEntryCl->moveToSubEntryAndKeep(tcl.entry_current);
- tcl.fn.insert(myName,tcl.entry_current);
- myEntry = tcl.entry_current;
- myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
- myNs, myEntryCl, myEntry);
-}
-
-//! Handle \c constructor statements inside class definitions.
-static void tcl_command_CONSTRUCTOR()
-{
-D
- QCString myNs, myName;
- Entry *myEntryCl, *myEntry;
- tcl_scan *myScan = tcl.scan.at(0);
-
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_codify_cmd(NULL,2);
- tcl_codify_cmd(NULL,3);
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(0)),myNs,myName);
- if (myNs.length())
- {
- myEntryCl = tcl_entry_class(myNs);
- }
- else
- {
- myNs = myScan->ns;
- myEntryCl = myScan->entry_cl;
- }
- tcl.entry_current->section = Entry::FUNCTION_SEC;
- tcl.entry_current->mtype = Method;
- tcl.entry_current->name = myName;
- tcl.entry_current->startLine = tcl.line_command;
- tcl.entry_current->docLine = tcl.line_comment;
- tcl.entry_current->inbodyLine = tcl.line_comment;
- tcl.entry_current->bodyLine = tcl.line_body0;
- tcl.entry_current->endBodyLine = tcl.line_body1;
- tcl_protection(tcl.entry_current);
- tcl_command_ARGLIST(*tcl.list_commandwords.at(2));
- if (myEntryCl) myEntryCl->moveToSubEntryAndKeep(tcl.entry_current);
- myEntry = tcl.entry_current;
- tcl.fn.insert(myName,myEntry);
- myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),
- myNs, myEntryCl, myEntry);
-}
-
-//! Handle \c destructor statements inside class definitions.
-static void tcl_command_DESTRUCTOR()
-{
-D
- QCString myNs, myName;
- Entry *myEntryCl, *myEntry;
- tcl_scan *myScan = tcl.scan.at(0);
-
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(0)),myNs,myName);
- if (myNs.length())
- {
- myEntryCl = tcl_entry_class(myNs);
- }
- else
- {
- myNs = myScan->ns;
- myEntryCl = myScan->entry_cl;
- }
- tcl.entry_current->section = Entry::FUNCTION_SEC;
- tcl.entry_current->mtype = Method;
- tcl.entry_current->name = myName;
- tcl.entry_current->startLine = tcl.line_command;
- tcl.entry_current->docLine = tcl.line_comment;
- tcl.entry_current->inbodyLine = tcl.line_comment;
- tcl.entry_current->bodyLine = tcl.line_body0;
- tcl.entry_current->endBodyLine = tcl.line_body1;
- tcl_protection(tcl.entry_current);
- myEntryCl->moveToSubEntryAndKeep(tcl.entry_current);
- myEntry = tcl.entry_current;
- tcl.fn.insert(myName,myEntry);
- myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(2),
- myNs, myEntryCl, myEntry);
-}
-
-//! Handle \c namespace statements.
-static bool tcl_command_NAMESPACE()
-{
-D
- QCString myNs, myName, myStr;
- //Entry *myEntryNs=NULL;
- tcl_scan *myScan = tcl.scan.at(0);
-
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(4)),myNs,myName);
- if (myName.isEmpty()) return false; // not a namespace
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_codify_cmd("keyword",2);
- tcl_codify_cmd(NULL,3);
- tcl_codify_cmd(NULL,4);
- tcl_codify_cmd(NULL,5);
- if (!myNs.isEmpty())
- {
- myName = myNs+"::"+myName;
- }
- tcl.entry_current->section = Entry::NAMESPACE_SEC;
- tcl.entry_current->name = myName;
- tcl.entry_current->startLine = tcl.line_command;
- tcl.entry_current->docLine = tcl.line_comment;
- tcl.entry_current->inbodyLine = tcl.line_comment;
- tcl.entry_current->bodyLine = tcl.line_body0;
- tcl.entry_current->endBodyLine = tcl.line_body1;
- tcl.entry_main->moveToSubEntryAndKeep(tcl.entry_current);
- tcl.ns.insert(myName,tcl.entry_current);
- //myEntryNs = tcl.entry_current;
- myStr = (*tcl.list_commandwords.at(6));
- if (tcl.list_commandwords.count() > 7)
- {
- for (uint i=7;i<tcl.list_commandwords.count();i++)
- {
- myStr.append((*tcl.list_commandwords.at(i)));
- }
- tcl.word_is=' ';
- }
- myScan = tcl_scan_start(tcl.word_is,myStr, myName, NULL, NULL);
- return true;
-}
-
-//! Handle \c itcl::class statements.
-static void tcl_command_ITCL_CLASS()
-{
-D
- QCString myNs, myName;
- Entry *myEntryCl;
- tcl_scan *myScan = tcl.scan.at(0);
-
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_codify_cmd("NULL",2);
- tcl_codify_cmd("NULL",3);
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName);
- if (myNs.length())
- {
- myName = myNs+"::"+myName;
- }
- tcl.entry_current->section = Entry::CLASS_SEC;
- tcl.entry_current->name = myName;
- tcl.entry_current->startLine = tcl.line_command;
- tcl.entry_current->docLine = tcl.line_comment;
- tcl.entry_current->inbodyLine = tcl.line_comment;
- tcl.entry_current->bodyLine = tcl.line_body0;
- tcl.entry_current->endBodyLine = tcl.line_body1;
- tcl.entry_main->moveToSubEntryAndKeep(tcl.entry_current);
- tcl.cl.insert(myName,tcl.entry_current);
- myEntryCl = tcl.entry_current;
- myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),
- myName, myEntryCl, NULL);
-}
-
-//! Handle \c oo::class statements.
-static void tcl_command_OO_CLASS()
-{
-D
- QCString myNs, myName;
- //Entry *myEntryNs;
- Entry *myEntryCl;
- tcl_scan *myScan = tcl.scan.at(0);
-
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_codify_cmd("NULL",2);
- tcl_codify_cmd("NULL",3);
- tcl_codify_cmd("NULL",4);
- tcl_codify_cmd("NULL",5);
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(4)),myNs,myName);
- if (myNs.length())
- {
- myName = myNs+"::"+myName;
- }
- tcl.entry_current->section = Entry::CLASS_SEC;
- tcl.entry_current->name = myName;
- tcl.entry_current->startLine = tcl.line_command;
- tcl.entry_current->docLine = tcl.line_comment;
- tcl.entry_current->inbodyLine = tcl.line_comment;
- tcl.entry_current->bodyLine = tcl.line_body0;
- tcl.entry_current->endBodyLine = tcl.line_body1;
- tcl.entry_main->moveToSubEntryAndKeep(tcl.entry_current);
- //myEntryNs = tcl_entry_namespace(myName);
- tcl.cl.insert(myName,tcl.entry_current);
- myEntryCl = tcl.entry_current;
- myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
- myName, myEntryCl, NULL);
-}
-
-//! Handle \c oo::define statements.
-static void tcl_command_OO_DEFINE()
-{
-D
- QCString myNs, myName, myStr;
- Entry *myEntryCl;
- tcl_scan *myScan = tcl.scan.at(0);
-
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl_codify_cmd("NULL",2);
- tcl_codify_cmd("NULL",3);
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName);
- if (myNs.length())
- {
- myName = myNs+"::"+myName;
- }
- myEntryCl = tcl_entry_class(myName);
- myStr = (*tcl.list_commandwords.at(4));
- //
- // special cases first
- // oo::define classname method methodname args script
- // oo::define classname constructor argList bodyScript
- // oo::define classname destructor bodyScript
- unsigned int n =tcl.list_commandwords.count();
- if ((myStr == "method" && n == 11) ||
- (myStr == "constructor" && n == 9) ||
- (myStr == "destructor" && n == 7))
- {
- for (unsigned int i = 4; i < n-1; i++)
- {
- tcl_codify_cmd("NULL",i);
- }
- Entry *myEntry;
- QCString myMethod;
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(n==11?6:4)),myNs,myMethod);
- // code snippet taken from tcl_command_METHOD()/tcl_command_CONSTRUCTOR
- tcl.fn.remove(myMethod);
- tcl.entry_current->section = Entry::FUNCTION_SEC;
- tcl.entry_current->mtype = Method;
- tcl.entry_current->name = myMethod;
- tcl.entry_current->startLine = tcl.line_command;
- tcl.entry_current->docLine = tcl.line_comment;
- tcl.entry_current->inbodyLine = tcl.line_comment;
- tcl.entry_current->bodyLine = tcl.line_body0;
- tcl.entry_current->endBodyLine = tcl.line_body1;
- tcl_protection(tcl.entry_current);
- if (n==11)
- {
- tcl_command_ARGLIST(*tcl.list_commandwords.at(8));
- }
- else if (n==9)
- {
- tcl_command_ARGLIST(*tcl.list_commandwords.at(6));
- }
- if (myEntryCl) myEntryCl->moveToSubEntryAndKeep(tcl.entry_current);
- tcl.fn.insert(myMethod,tcl.entry_current);
- myEntry = tcl.entry_current;
- myScan = tcl_scan_start('?',*tcl.list_commandwords.at(n-1),
- myNs, myEntryCl, myEntry);
- }
- else
- {
- // The general case
- // Simply concat all arguments into a script.
- // Note: all documentation collected just before the
- // oo::define command is lost
- if (tcl.list_commandwords.count() > 5)
- {
- for (uint i=5;i<tcl.list_commandwords.count();i++)
- {
- myStr.append((*tcl.list_commandwords.at(i)));
- }
- tcl.word_is=' ';
- }
- myScan = tcl_scan_start(tcl.word_is,myStr,myName,myEntryCl,NULL);
- }
-}
-
-//! Handle \c variable statements.
-static void tcl_command_VARIABLE(int inclass)
-{
-D
- QCString myNs, myName;
- Entry *myEntry;
- tcl_scan *myScan = tcl.scan.at(0);
-
- tcl_codify_cmd("keyword",0);
- for (unsigned int i=1; i< tcl.list_commandwords.count(); i++)
- {
- tcl_codify_cmd(NULL,i);
- }
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)),myNs,myName);
- if (myNs.length())
- {// qualified variables go into namespace
- myEntry = tcl_entry_namespace(myNs);
- tcl.entry_current->stat = true;
- }
- else
- {
- if (inclass)
- {
- myEntry = myScan->entry_cl;
- tcl.entry_current->stat = false;
- }
- else
- {
- myEntry = tcl_entry_namespace(myScan->ns);
- tcl.entry_current->stat = true;
- }
- }
- tcl.entry_current->section = Entry::VARIABLE_SEC;
- tcl.entry_current->name = myName;
- tcl.entry_current->startLine = tcl.line_command;
- tcl.entry_current->docLine = tcl.line_comment;
- tcl.entry_current->inbodyLine = tcl.line_comment;
- tcl.entry_current->bodyLine = tcl.line_body0;
- tcl.entry_current->endBodyLine = tcl.line_body1;
- tcl_protection(tcl.entry_current);
- myEntry->moveToSubEntryAndKeep(tcl.entry_current);
- tcl.entry_current = tcl_entry_new();
-}
-
-//! Handling of command parsing.
-//! what=0 -> ...
-//! what=1 -> ...
-//! what=-1 -> ...
-static void tcl_command(int what,const char *text)
-{
- int myLine=0;
- if (what==0)
- {
- tcl.scan.at(0)->line1=yylineno;// current line in scan context
- tcl.line_body0=yylineno;// start line of command
-tcl_inf("<- %s\n",text);
- yy_push_state(COMMAND);
- tcl.list_commandwords.clear();
- tcl.string_command="";
- tcl.string_last="";
- tcl.command=1;
- return;
- }
- else if (what==1)
- {
- if (tcl.string_last.length())
- {
- tcl.list_commandwords.append(tcl.string_last);
- tcl.string_last="";
- }
- if (text)
- {
- tcl.list_commandwords.append(text);
- }
- return;
- }
- else if (what!=-1)
- {// should not happen
- tcl_err("what %d\n",what);
- return;
- }
- QCString myText = text;
-tcl_inf("->\n");
- if (tcl.command==0)
- {
- return; //TODO check on inside comment
- }
- if (tcl.string_last != "")
- {// get last word
- tcl.list_commandwords.append(tcl.string_last);
- tcl.string_last="";
- }
- yy_pop_state();
-
- // check command
- QCString myStr = (*tcl.list_commandwords.at(0));
- tcl_scan *myScanBackup=tcl.scan.at(0);
- int myLevel = 0;
- Protection myProt = tcl.protection;
-
- if (tcl.list_commandwords.count() < 3)
- {
- tcl_command_OTHER();
- goto command_end;
- }
- // remove leading "::" and apply TCL_SUBST
- if (myStr.left(2)=="::") myStr = myStr.mid(2);
- if (tcl.config_subst.contains(myStr))
- {
- myStr=tcl.config_subst[myStr];
- }
- if (myStr=="private")
- {
- tcl.protection = Private;
- myLevel = 1;
- }
- else if (myStr=="protected")
- {
- tcl.protection = Protected;
- myLevel = 1;
- }
- else if (myStr=="public")
- {
- tcl.protection = Public;
- myLevel = 1;
- }
- if (myLevel)
- {
- tcl_codify_cmd("keyword",0);
- tcl_codify_cmd(NULL,1);
- tcl.list_commandwords.remove(tcl.list_commandwords.at(1));
- tcl.list_commandwords.remove(tcl.list_commandwords.at(0));
- if (tcl.list_commandwords.count()==1)
- {
- tcl_scan *myScan = tcl.scan.at(0);
- myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(0),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
- myProt = tcl.protection;
- goto command_end;
- }
- myStr = (*tcl.list_commandwords.at(0));
- // remove leading "::" and apply TCL_SUBST
- if (myStr.left(2)=="::") myStr = myStr.mid(2);
- if (tcl.config_subst.contains(myStr))
- {
- myStr=tcl.config_subst[myStr];
- }
- }
- if (myStr=="proc")
- {
- if (tcl.list_commandwords.count() == 5)
- {// itcl::proc
- tcl.list_commandwords.append("");
- tcl.list_commandwords.append("");
- }
- if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;}
- tcl_command_PROC();
- goto command_end;
- }
- if (myStr=="method")
- {
- if (tcl.list_commandwords.count() == 5)
- {// itcl::method
- tcl.list_commandwords.append("");
- tcl.list_commandwords.append("");
- }
- if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;}
- tcl_command_METHOD();
- goto command_end;
- }
- if (myStr=="constructor")
- {
- if (tcl.list_commandwords.count() != 5) {myLine=__LINE__;goto command_warn;}
- tcl_command_CONSTRUCTOR();
- goto command_end;
- }
- if (myStr=="destructor")
- {
- if (tcl.list_commandwords.count() != 3) {myLine=__LINE__;goto command_warn;}
- tcl_command_DESTRUCTOR();
- goto command_end;
- }
- if (myStr=="namespace")
- {
- if ((*tcl.list_commandwords.at(2))=="eval")
- {
- if (tcl.list_commandwords.count() < 7) {myLine=__LINE__;goto command_warn;}
- if (tcl_command_NAMESPACE())
- {
- goto command_end;
- }
- }
- else
- {
- tcl_command_OTHER();
- goto command_end;
- }
- }
- if (myStr=="itcl::class")
- {
- if (tcl.list_commandwords.count() != 5) {myLine=__LINE__;goto command_warn;}
- tcl_command_ITCL_CLASS();
- goto command_end;
- }
- if (myStr=="itcl::body")
- {
- if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;}
- tcl_command_METHOD();
- goto command_end;
- }
- if (myStr=="oo::class")
- {
- if ((*tcl.list_commandwords.at(2))=="create")
- {
- if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;}
- tcl_command_OO_CLASS();
- goto command_end;
- }
- tcl_command_OTHER();
- goto command_end;
- }
- if (myStr=="oo::define")
- {
- if (tcl.list_commandwords.count() < 5) {myLine=__LINE__;goto command_warn;}
- tcl_command_OO_DEFINE();
- goto command_end;
- }
- if (myStr=="variable")
- {
- if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
- if (tcl.scan.at(0)->entry_fn == NULL)
- {// only parsed outside functions
- tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="");
- goto command_end;
- }
- }
- if (myStr=="common")
- {
- if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
- if (tcl.scan.at(0)->entry_fn == NULL)
- {// only parsed outside functions
- tcl_command_VARIABLE(0);
- goto command_end;
- }
- }
- if (myStr=="inherit" || myStr=="superclass")
- {
- if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
- if (tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="")
- {
- for (unsigned int i = 2; i < tcl.list_commandwords.count(); i = i + 2)
- {
- tcl.scan.at(0)->entry_cl->extends.push_back(BaseInfo((*tcl.list_commandwords.at(i)),Public,Normal));
- }
- }
- goto command_end;
- }
- /*
- * Start of internal tcl keywords
- * Ready: switch, eval, catch, if, for, foreach, while
- */
- if (myStr=="switch")
- {
- if (tcl.list_commandwords.count() < 5) {myLine=__LINE__;goto command_warn;}
- tcl_command_SWITCH();
- goto command_end;
- }
- if (myStr=="eval")
- {
- if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
- tcl_command_EVAL();
- goto command_end;
- }
- if (myStr=="catch")
- {
- if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
- tcl_command_CATCH();
- goto command_end;
- }
- if (myStr=="for")
- {
- if (tcl.list_commandwords.count() != 9) {myLine=__LINE__;goto command_warn;}
- tcl_command_FOR();
- goto command_end;
- }
- if (myStr=="foreach")
- {
- if (tcl.list_commandwords.count() < 7 || tcl.list_commandwords.count()%2==0) {myLine=__LINE__;goto command_warn;}
- tcl_command_FOREACH();
- goto command_end;
- }
- /*
-if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?
- */
- if (myStr=="if" && tcl.list_commandwords.count() > 4)
- {
- QCStringList myType;
- myType << "keyword" << "NULL" << "expr" << "NULL";
- char myState='x';// last word: e'x'pr 't'hen 'b'ody 'e'lse else'i'f..
- for (unsigned int i = 4; i < tcl.list_commandwords.count(); i = i + 2)
- {
- QCString myStr=(*tcl.list_commandwords.at(i));
- if (myState=='x')
- {
- if (myStr=="then")
- {
- myState='t';
- myType << "keyword" << "NULL";
- }
- else
- {
- myState='b';
- myType << "script" << "NULL";
- }
- }
- else if (myState=='t')
- {
- myState='b';
- myType << "script" << "NULL";
- }
- else if (myState=='b')
- {
- if (myStr=="elseif") {
- myState='i';
- myType << "keyword" << "NULL";
- }
- else if (myStr=="else" && i==tcl.list_commandwords.count()-3)
- {
- myState = 'b';
- myType << "keyword" << "NULL" << "script";
- i = tcl.list_commandwords.count();
- }
- else if (i==tcl.list_commandwords.count()-1)
- {
- myState = 'b';
- myType << "script";
- i = tcl.list_commandwords.count();
- }
- else
- {
- myLine=__LINE__;goto command_warn;
- }
- }
- else if (myState=='i')
- {
- myState='x';
- myType << "expr" << "NULL";
- }
- }
- if (myState != 'b') {myLine=__LINE__;goto command_warn;}
- tcl_command_IF(myType);
- goto command_end;
- }
- if (myStr=="while")
- {
- if (tcl.list_commandwords.count() != 5) {myLine=__LINE__;goto command_warn;}
- tcl_command_WHILE();
- goto command_end;
- }
- tcl_command_OTHER();
- goto command_end;
- command_warn:// print warning message because of wrong used syntax
- tcl_war("%d count=%d: %s\n",myLine,tcl.list_commandwords.count(),tcl.list_commandwords.join(" ").data());
- tcl_command_OTHER();
- command_end:// add remaining text to current context
- if (!myText.isEmpty())
- {
- if(myScanBackup==tcl.scan.at(0))
- {
- tcl_codify("comment",myText);
- }
- else
- {
- tcl.scan.at(0)->after << "comment" << myText;
- }
- }
- tcl.list_commandwords.clear();
- tcl.command = 0;
- tcl.protection = myProt;
-}
-
-//----------------------------------------------------------------------------
-//! Common initializations.
-static void tcl_init()
-{
- // Get values from option TCL_SUBST
- tcl.config_subst.clear();
- QStrList myStrList = Config_getList(TCL_SUBST);
- const char *s=myStrList.first();
- while (s)
- {
- QCString myStr=s;
- int i=myStr.find('=');
- if (i>0)
- {
- QCString myName=myStr.left(i).stripWhiteSpace();
- QCString myValue=myStr.right(myStr.length()-i-1).stripWhiteSpace();
- if (!myName.isEmpty() && !myValue.isEmpty())
- tcl_inf("TCL_SUBST: use '%s'\n",s);
- tcl.config_subst[myName] = myValue;
- }
- s = myStrList.next();
- }
-
- if (tcl.input_string.at(tcl.input_string.length()-1) == 0x1A)
- {
- }
- else if (tcl.input_string.at(tcl.input_string.length()-1) == '\n')
- {
- tcl.input_string[tcl.input_string.length()-1] = 0x1A;
- }
- else
- {
- tcl.input_string += 0x1A;
- }
-
- tcl.code = NULL;
- tcl.code_font=NULL;
- tcl.code_line=1;
- tcl.code_linenumbers=1;
- tcl.config_autobrief = Config_getBool(JAVADOC_AUTOBRIEF);
- tcl.input_position = 0;
- tcl.file_name = NULL;
- tcl.this_parser = NULL;
- tcl.command=0;
- tcl.comment=0;
- tcl.brace_level=0;
- tcl.bracket_level=0;
- tcl.bracket_quote=0;
- tcl.word_is=' ';
- tcl.string_command="";
- tcl.string_commentline="";
- tcl.string_commentcodify="";
- tcl.string_comment = "";
- tcl.string_last = "";
- tcl.entry_main = NULL;
- tcl.entry_file = NULL;
- tcl.entry_current = NULL;
- tcl.entry_inside = NULL;
- tcl.list_commandwords.clear();
- tcl.scan.clear();
- tcl.ns.clear();
- tcl.cl.clear();
- tcl.fn.clear();
- yylineno = 1;
- tcl.protection = Public;
- tcl.memberdef = NULL;
-}
-
-//! Start parsing.
-static void tcl_parse(const QCString ns, const QCString cls)
-{
- tcl_scan *myScan;
-
- tcl.entry_file = tcl_entry_new();
- tcl.entry_file->name = tcl.file_name;
- tcl.entry_file->section = Entry::SOURCE_SEC;
- tcl.entry_file->protection = Public;
- tcl.entry_main->moveToSubEntryAndKeep(tcl.entry_file);
- Entry *myEntry=tcl_entry_new();
- myEntry->name="";
- tcl.entry_main->moveToSubEntryAndKeep(myEntry);
- tcl.ns.insert("::",myEntry);
- tcl.entry_current = tcl_entry_new();
-
- tclscannerYYrestart( tclscannerYYin );
- BEGIN( TOP );
- yylineno=1;
- myScan = new tcl_scan;
- myScan->type[0]=' ';myScan->type[1]='\n';
- myScan->after.clear();
- myScan->line0=yylineno;
- myScan->line1=yylineno;
- myScan->buffer_state=YY_CURRENT_BUFFER;
- myScan->ns=ns;
- myScan->entry_cl=tcl_entry_class(cls);
- myScan->entry_fn=NULL;
- tcl.entry_inside = tcl.entry_file;
- myScan->entry_scan = tcl.entry_inside;
- tcl.scan.insert(0,myScan);
- tclscannerYYlex();
- tcl.scan.clear();
- tcl.ns.clear();
- tcl.cl.clear();
- tcl.fn.clear();
- tcl.entry.clear();
-}
-
-//! Parse text file and build up entry tree.
-void TclOutlineParser::parseInput(const char *fileName,
- const char *input,
- const std::shared_ptr<Entry> &root,
- bool /*sameTranslationUnit*/,
- QStrList & /*filesInSameTranslationUnit*/)
-{
- QFile myFile;
-tcl_inf("%s\n",fileName);
- myFile.setName(fileName);
- if (!myFile.open(IO_ReadOnly)) return;
- if (strlen(input)<1) return;
-
- tcl.input_string = input;
- if (tcl.input_string.length()<1) return;
- printlex(yy_flex_debug, TRUE, __FILE__, fileName);
-
- msg("Parsing %s...\n",fileName);
- Doxygen::docGroup.enterFile(fileName,yylineno);
-
- tcl_init();
- tcl.code = NULL;
- tcl.file_name = fileName;
- tcl.this_parser = this;
- tcl.entry_main = root.get(); /* toplevel entry */
- tcl_parse("","");
- Doxygen::docGroup.leaveFile(tcl.file_name,yylineno);
- root->program.resize(0);
- myFile.close();
- printlex(yy_flex_debug, FALSE, __FILE__, fileName);
-}
-
-
-bool TclOutlineParser::needsPreprocessing(const QCString &extension) const
-{
- (void)extension;
- return FALSE;
-}
-
-void TclOutlineParser::parsePrototype(const char *text)
-{
- (void)text;
-}
-
-static int yyread(char *buf,int max_size)
-{
- int c=0;
-
- *buf = '\0';
- while ( c < max_size && tcl.input_string.at(tcl.input_position) )
- {
- *buf = tcl.input_string.at(tcl.input_position++) ;
- c++; buf++;
- }
- //printf("Read from=%d size=%d max=%d c=%d\n",tcl.input_position,strlen(&tcl.input_string[tcl.input_position]),max_size,c);
- return c;
-}
-
-//----------------------------------------------------------------------------
-
-void TclCodeParser::resetCodeParserState()
-{
-}
-
-//! Parse file and codify.
-void TclCodeParser::parseCode(CodeOutputInterface & codeOutIntf,
- const char * scopeName,
- const QCString & input,
- SrcLangExt lang,
- bool isExampleBlock,
- const char * exampleName,
- FileDef * fileDef,
- int startLine,
- int endLine,
- bool inlineFragment,
- const MemberDef *memberDef,
- bool showLineNumbers,
- const Definition *searchCtx,
- bool collectXRefs
- )
-{
- (void)scopeName;
- (void)lang;
- (void)exampleName;
- (void)fileDef;
- (void)endLine;
- (void)inlineFragment;
- (void)searchCtx;
- (void)collectXRefs;
-
- if (input.length()<1) return;
- printlex(yy_flex_debug, TRUE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
- tcl.input_string = input;
-
- QCString myNs="";
- QCString myCls="";
- if (memberDef)
- {
- if (memberDef->getClassDef())
- {
- myCls = memberDef->getClassDef()->displayName();
- myNs = myCls;
- }
- else if (memberDef->getNamespaceDef())
- {
- myNs = memberDef->getNamespaceDef()->displayName();
- }
- }
-
- QCString myStr="Codifying..";
- if (scopeName)
- {
- myStr +=" scope=";
- myStr+=scopeName;
- }
- if (exampleName)
- {
- myStr+=" example=";
- myStr+=exampleName;
- }
- if (memberDef)
- {
- myStr+=" member=";
- myStr+=memberDef->memberTypeName();
- myStr+=" ";
- myStr+=memberDef->qualifiedName();
- }
- if (fileDef)
- {
- myStr+=" file=";
- myStr+=fileDef->fileName();
- }
-tcl_inf("%s (%d,%d) %d %d\n",myStr.data(),startLine,endLine,isExampleBlock,inlineFragment);
-//tcl_inf("%s\n"input.data());
- tcl_init();
- tcl.collectXRefs = collectXRefs;
- tcl.memberdef = memberDef;
- tcl.code = &codeOutIntf;
- if (startLine<0)
- {
- startLine=1;
- }
- yylineno=startLine;
- tcl.code_linenumbers = showLineNumbers;
- tcl.code_line=yylineno;
- tcl.code->startCodeLine(tcl.code_linenumbers);
- if (tcl.code_linenumbers)
- {
- tcl.code->writeLineNumber(0,0,0,tcl.code_line);
- }
- tcl.file_name = "";
- tcl.this_parser = NULL;
- if (isExampleBlock)
- {
- tcl_codify(NULL,input);
- }
- else
- {
- tcl.entry_main = tcl_entry_new();
- tcl_parse(myNs,myCls);
- }
- tcl.code->endCodeLine();
- tcl.scan.clear();
- tcl.ns.clear();
- tcl.cl.clear();
- tcl.fn.clear();
- tcl.entry.clear();
- printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
-}
-//----------------------------------------------------------------------------
-
-// to avoid a warning
-void tclDummy()
-{
- yy_top_state();
-}
-
-#include "tclscanner.l.h"
diff --git a/src/template.cpp b/src/template.cpp
index ca28c73..d5e8275 100644
--- a/src/template.cpp
+++ b/src/template.cpp
@@ -48,10 +48,10 @@ class TemplateToken;
//-------------------------------------------------------------------
-static QValueList<QCString> split(const QCString &str,const QCString &sep,
+static std::vector<QCString> split(const QCString &str,const QCString &sep,
bool allowEmptyEntries=FALSE,bool cleanup=TRUE)
{
- QValueList<QCString> lst;
+ std::vector<QCString> lst;
int j = 0;
int i = str.find( sep, j );
@@ -62,16 +62,16 @@ static QValueList<QCString> split(const QCString &str,const QCString &sep,
{
if (cleanup)
{
- lst.append(str.mid(j,i-j).stripWhiteSpace());
+ lst.push_back(str.mid(j,i-j).stripWhiteSpace());
}
else
{
- lst.append(str.mid(j,i-j));
+ lst.push_back(str.mid(j,i-j));
}
}
else if (allowEmptyEntries)
{
- lst.append("");
+ lst.push_back("");
}
j = i + sep.length();
i = str.find(sep,j);
@@ -82,16 +82,16 @@ static QValueList<QCString> split(const QCString &str,const QCString &sep,
{
if (cleanup)
{
- lst.append(str.mid(j,l-j+1).stripWhiteSpace());
+ lst.push_back(str.mid(j,l-j+1).stripWhiteSpace());
}
else
{
- lst.append(str.mid(j,l-j+1));
+ lst.push_back(str.mid(j,l-j+1));
}
}
else if (allowEmptyEntries)
{
- lst.append("");
+ lst.push_back("");
}
return lst;
@@ -305,7 +305,7 @@ class TemplateList::Private
{
public:
Private() : index(-1), refCount(0) {}
- QValueList<TemplateVariant> elems;
+ std::vector<TemplateVariant> elems;
int index = -1;
int refCount = 0;
};
@@ -336,69 +336,67 @@ int TemplateList::release()
return count;
}
-int TemplateList::count() const
+uint TemplateList::count() const
{
- return p->elems.count();
+ return static_cast<uint>(p->elems.size());
}
void TemplateList::append(const TemplateVariant &v)
{
- p->elems.append(v);
+ p->elems.push_back(v);
}
// iterator support
class TemplateListConstIterator : public TemplateListIntf::ConstIterator
{
public:
- TemplateListConstIterator(const TemplateList &l) : m_list(l) { m_index=-1; }
+ TemplateListConstIterator(const TemplateList &l) : m_list(l) { m_index=0; }
virtual ~TemplateListConstIterator() {}
virtual void toFirst()
{
- m_it = m_list.p->elems.begin();
m_index=0;
}
virtual void toLast()
{
- m_it = m_list.p->elems.fromLast();
- m_index=m_list.count()-1;
+ if (m_list.p->elems.size()>0)
+ {
+ m_index=m_list.p->elems.size()-1;
+ }
+ else
+ {
+ m_index=0;
+ }
}
virtual void toNext()
{
- if (m_it!=m_list.p->elems.end())
+ if (m_index<m_list.p->elems.size())
{
- ++m_it;
- ++m_index;
+ m_index++;
}
}
virtual void toPrev()
{
if (m_index>0)
{
- --m_it;
--m_index;
}
- else
- {
- m_index=-1;
- }
}
virtual bool current(TemplateVariant &v) const
{
- if (m_index<0 || m_it==m_list.p->elems.end())
+ if (m_index<m_list.p->elems.size())
{
- v = TemplateVariant();
- return FALSE;
+ v = m_list.p->elems[m_index];
+ return TRUE;
}
else
{
- v = *m_it;
- return TRUE;
+ v = TemplateVariant();
+ return FALSE;
}
}
private:
const TemplateList &m_list;
- QValueList<TemplateVariant>::ConstIterator m_it;
- int m_index = 0;
+ size_t m_index = 0;
};
TemplateListIntf::ConstIterator *TemplateList::createIterator() const
@@ -406,9 +404,9 @@ TemplateListIntf::ConstIterator *TemplateList::createIterator() const
return new TemplateListConstIterator(*this);
}
-TemplateVariant TemplateList::at(int index) const
+TemplateVariant TemplateList::at(uint index) const
{
- if (index>=0 && index<(int)p->elems.count())
+ if (index<p->elems.size())
{
return p->elems[index];
}
@@ -545,7 +543,7 @@ class TemplateContextImpl : public TemplateContext
QCString outputDirectory() const { return m_outputDir; }
TemplateEscapeIntf *escapeIntf() const { return m_activeEscapeIntf; }
TemplateSpacelessIntf *spacelessIntf() const { return m_spacelessIntf; }
- void enableSpaceless(bool b) { if (b && !m_spacelessEnabled) m_spacelessIntf->reset();
+ void enableSpaceless(bool b) { if (b && !m_spacelessEnabled) m_spacelessIntf->reset();
m_spacelessEnabled=b;
}
bool spacelessEnabled() const { return m_spacelessEnabled && m_spacelessIntf; }
@@ -562,7 +560,7 @@ class TemplateContextImpl : public TemplateContext
// index related functions
void openSubIndex(const QCString &indexName);
void closeSubIndex(const QCString &indexName);
- void addIndexEntry(const QCString &indexName,const QValueList<TemplateKeyValue> &arguments);
+ void addIndexEntry(const QCString &indexName,const std::vector<TemplateKeyValue> &arguments);
private:
const TemplateEngine *m_engine = 0;
@@ -780,7 +778,7 @@ class FilterLength
}
if (v.type()==TemplateVariant::List)
{
- return TemplateVariant(v.toList()->count());
+ return TemplateVariant((int)v.toList()->count());
}
else if (v.type()==TemplateVariant::String)
{
@@ -1125,7 +1123,7 @@ class FilterAlphaIndex
{
int i=0;
if (startLetter>='0' && startLetter<='9') s[i++] = 'x';
- s[i++]=tolower((char)startLetter);
+ s[i++]=(char)tolower((char)startLetter);
s[i++]=0;
}
else
@@ -1483,11 +1481,11 @@ class ExprAstFunctionVariable : public ExprAst
}
virtual TemplateVariant resolve(TemplateContext *c)
{
- QValueList<TemplateVariant> args;
+ std::vector<TemplateVariant> args;
for (uint i=0;i<m_args.count();i++)
{
TemplateVariant v = m_args.at(i)->resolve(c);
- args.append(v);
+ args.push_back(v);
}
TemplateVariant v = m_var->resolve(c);
if (v.type()==TemplateVariant::Function)
@@ -2268,7 +2266,6 @@ class ExpressionParser
if (p==q) // still no valid token found -> error
{
m_curToken.type = ExprToken::Unknown;
- char s[2];
s[0]=c;
s[1]=0;
warn(m_parser->templateName(),m_line,"Found unknown token '%s' (%d) while parsing %s",s,c,m_tokenStream);
@@ -2608,7 +2605,7 @@ static void getPathListFunc(TemplateStructIntf *entry,TemplateList *list)
list->append(entry);
}
-static TemplateVariant getPathFunc(const void *ctx, const QValueList<TemplateVariant> &)
+static TemplateVariant getPathFunc(const void *ctx, const std::vector<TemplateVariant> &)
{
TemplateStruct *entry = (TemplateStruct*)ctx;
TemplateList *result = TemplateList::alloc();
@@ -2616,9 +2613,9 @@ static TemplateVariant getPathFunc(const void *ctx, const QValueList<TemplateVar
return result;
}
-void TemplateContextImpl::addIndexEntry(const QCString &indexName,const QValueList<TemplateKeyValue> &arguments)
+void TemplateContextImpl::addIndexEntry(const QCString &indexName,const std::vector<TemplateKeyValue> &arguments)
{
- QValueListConstIterator<TemplateKeyValue> it = arguments.begin();
+ auto it = arguments.begin();
//printf("TemplateContextImpl::addIndexEntry(%s)\n",indexName.data());
//while (it!=arguments.end())
//{
@@ -2672,7 +2669,10 @@ void TemplateContextImpl::addIndexEntry(const QCString &indexName,const QValueLi
if (list->count()>0)
{
TemplateStruct *lastEntry = dynamic_cast<TemplateStruct*>(list->at(list->count()-1).toStruct());
- lastEntry->set("last",false);
+ if (lastEntry)
+ {
+ lastEntry->set("last",false);
+ }
}
entry->set("is_leaf_node",true);
entry->set("first",list->count()==0);
@@ -2760,7 +2760,7 @@ class TemplateNodeVariable : public TemplateNode
TemplateVariant v = m_var->resolve(c);
if (v.type()==TemplateVariant::Function)
{
- v = v.call(QValueList<TemplateVariant>());
+ v = v.call(std::vector<TemplateVariant>());
}
if (ci->escapeIntf() && !v.raw())
{
@@ -2844,7 +2844,11 @@ template<class T> class TemplateNodeCreator : public TemplateNode
if (d.exists())
{
bool ok = d.mkdir(fileName.mid(j,i-j));
- if (!ok) break;
+ if (!ok)
+ {
+ err("Failed to create directory '%s'\n",(fileName.mid(j,i-j)).data());
+ break;
+ }
QCString dirName = outputDir+'/'+fileName.left(i);
d = QDir(dirName);
j = i+1;
@@ -2877,19 +2881,21 @@ class TemplateNodeIf : public TemplateNodeCreator<TemplateNodeIf>
stopAt.append("else");
// if 'nodes'
- GuardedNodes *guardedNodes = new GuardedNodes;
- ExpressionParser ex(parser,line);
- guardedNodes->line = line;
- guardedNodes->guardAst = ex.parse(data);
- parser->parse(this,line,stopAt,guardedNodes->trueNodes);
- m_ifGuardedNodes.append(guardedNodes);
+ {
+ GuardedNodes *guardedNodes = new GuardedNodes;
+ ExpressionParser ex(parser,line);
+ guardedNodes->line = line;
+ guardedNodes->guardAst = ex.parse(data);
+ parser->parse(this,line,stopAt,guardedNodes->trueNodes);
+ m_ifGuardedNodes.append(guardedNodes);
+ }
TemplateToken *tok = parser->takeNextToken();
// elif 'nodes'
while (tok && tok->data.left(5)=="elif ")
{
ExpressionParser ex(parser,line);
- guardedNodes = new GuardedNodes;
+ GuardedNodes *guardedNodes = new GuardedNodes;
guardedNodes->line = tok->line;
guardedNodes->guardAst = ex.parse(tok->data.mid(5));
parser->parse(this,tok->line,stopAt,guardedNodes->trueNodes);
@@ -3119,15 +3125,15 @@ class TemplateNodeRange : public TemplateNodeCreator<TemplateNodeRange>
while (!done)
{
// set the forloop meta-data variable
- TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
- s->set("counter0", (int)index);
- s->set("counter", (int)(index+1));
- s->set("revcounter", (int)(l-index));
- s->set("revcounter0", (int)(l-index-1));
- s->set("first",index==0);
- s->set("last", (int)index==l-1);
- s->set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
- c->set("forloop",s.get());
+ TemplateAutoRef<TemplateStruct> ls(TemplateStruct::alloc());
+ ls->set("counter0", (int)index);
+ ls->set("counter", (int)(index+1));
+ ls->set("revcounter", (int)(l-index));
+ ls->set("revcounter0", (int)(l-index-1));
+ ls->set("first",index==0);
+ ls->set("last", (int)index==l-1);
+ ls->set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
+ c->set("forloop",ls.get());
// set the iterator variable
c->set(m_var,i);
@@ -3212,7 +3218,7 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
else
{
m_vars = split(data.left(i),",");
- if (m_vars.count()==0)
+ if (m_vars.size()==0)
{
parser->warn(m_templateName,line,"for needs at least one iterator variable");
}
@@ -3265,7 +3271,7 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
TemplateVariant v = m_expr->resolve(c);
if (v.type()==TemplateVariant::Function)
{
- v = v.call(QValueList<TemplateVariant>());
+ v = v.call(std::vector<TemplateVariant>());
}
const TemplateListIntf *list = v.toList();
if (list)
@@ -3278,12 +3284,13 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
}
c->push();
//int index = m_reversed ? list.count() : 0;
- TemplateVariant v;
+ //TemplateVariant v;
const TemplateVariant *parentLoop = c->getRef("forloop");
uint index = m_reversed ? listSize-1 : 0;
TemplateListIntf::ConstIterator *it = list->createIterator();
+ TemplateVariant ve;
for (m_reversed ? it->toLast() : it->toFirst();
- (it->current(v));
+ (it->current(ve));
m_reversed ? it->toPrev() : it->toNext())
{
TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
@@ -3299,19 +3306,19 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
// add variables for this loop to the context
//obj->addVariableToContext(index,m_vars,c);
uint vi=0;
- if (m_vars.count()==1) // loop variable represents an item
+ if (m_vars.size()==1) // loop variable represents an item
{
- c->set(m_vars[vi++],v);
+ c->set(m_vars[vi++],ve);
}
- else if (m_vars.count()>1 && v.type()==TemplateVariant::Struct)
+ else if (m_vars.size()>1 && ve.type()==TemplateVariant::Struct)
// loop variables represent elements in a list item
{
- for (uint i=0;i<m_vars.count();i++,vi++)
+ for (uint i=0;i<m_vars.size();i++,vi++)
{
- c->set(m_vars[vi],v.toStruct()->get(m_vars[vi]));
+ c->set(m_vars[vi],ve.toStruct()->get(m_vars[vi]));
}
}
- for (;vi<m_vars.count();vi++)
+ for (;vi<m_vars.size();vi++)
{
c->set(m_vars[vi],TemplateVariant());
}
@@ -3334,7 +3341,7 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
private:
bool m_reversed = false;
ExprAst *m_expr = 0;
- QValueList<QCString> m_vars;
+ std::vector<QCString> m_vars;
TemplateNodeList m_loopNodes;
TemplateNodeList m_emptyNodes;
};
@@ -3622,7 +3629,6 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
: TemplateNodeCreator<TemplateNodeCreate>(parser,parent,line), m_templateExpr(0), m_fileExpr(0)
{
TRACE(("TemplateNodeCreate(%s)\n",data.data()));
- ExpressionParser ep(parser,line);
if (data.isEmpty())
{
parser->warn(m_templateName,line,"create tag is missing arguments");
@@ -3762,7 +3768,7 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree>
{
delete m_treeExpr;
}
- static TemplateVariant renderChildrenStub(const void *ctx, const QValueList<TemplateVariant> &)
+ static TemplateVariant renderChildrenStub(const void *ctx, const std::vector<TemplateVariant> &)
{
return TemplateVariant(((TreeContext*)ctx)->object->
renderChildren((const TreeContext*)ctx),TRUE);
@@ -3862,8 +3868,8 @@ class TemplateNodeIndexEntry : public TemplateNodeCreator<TemplateNodeIndexEntry
TRACE(("{TemplateNodeIndexEntry(%s)\n",data.data()));
m_args.setAutoDelete(TRUE);
ExpressionParser expParser(parser,line);
- QValueList<QCString> args = split(data," ");
- QValueListIterator<QCString> it = args.begin();
+ std::vector<QCString> args = split(data," ");
+ auto it = args.begin();
if (it==args.end() || (*it).find('=')!=-1)
{
parser->warn(parser->templateName(),line,"Missing name for indexentry tag");
@@ -3902,10 +3908,10 @@ class TemplateNodeIndexEntry : public TemplateNodeCreator<TemplateNodeIndexEntry
ci->setLocation(m_templateName,m_line);
QListIterator<Mapping> it(m_args);
Mapping *mapping;
- QValueList<TemplateKeyValue> list;
+ std::vector<TemplateKeyValue> list;
for (it.toFirst();(mapping=it.current());++it)
{
- list.append(TemplateKeyValue(mapping->name,mapping->value->resolve(c)));
+ list.push_back(TemplateKeyValue(mapping->name,mapping->value->resolve(c)));
}
ci->addIndexEntry(m_name,list);
}
@@ -4008,8 +4014,8 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
m_args.setAutoDelete(TRUE);
ExpressionParser expParser(parser,line);
QCString filteredData = removeSpacesAroundEquals(data);
- QValueList<QCString> args = split(filteredData," ");
- QValueListIterator<QCString> it = args.begin();
+ std::vector<QCString> args = split(filteredData," ");
+ auto it = args.begin();
while (it!=args.end())
{
QCString arg = *it;
@@ -4071,8 +4077,8 @@ class TemplateNodeCycle : public TemplateNodeCreator<TemplateNodeCycle>
m_args.setAutoDelete(TRUE);
m_index=0;
ExpressionParser expParser(parser,line);
- QValueList<QCString> args = split(data," ");
- QValueListIterator<QCString> it = args.begin();
+ std::vector<QCString> args = split(data," ");
+ auto it = args.begin();
while (it!=args.end())
{
ExprAst *expr = expParser.parse(*it);
@@ -4097,7 +4103,7 @@ class TemplateNodeCycle : public TemplateNodeCreator<TemplateNodeCycle>
TemplateVariant v = m_args.at(m_index)->resolve(c);
if (v.type()==TemplateVariant::Function)
{
- v = v.call(QValueList<TemplateVariant>());
+ v = v.call(std::vector<TemplateVariant>());
}
if (ci->escapeIntf() && !v.raw())
{
@@ -4979,7 +4985,7 @@ TemplateToken *TemplateParser::takeNextToken()
const TemplateToken *TemplateParser::currentToken() const
{
return m_tokens.getFirst();
-};
+}
void TemplateParser::removeNextToken()
{
diff --git a/src/template.h b/src/template.h
index 4602c53..c9e9041 100644
--- a/src/template.h
+++ b/src/template.h
@@ -17,7 +17,7 @@
#define TEMPLATE_H
#include <qcstring.h>
-#include <qvaluelist.h>
+#include <vector>
class FTextStream;
@@ -95,12 +95,12 @@ class TemplateVariant
{
public:
/** Callback type to use when creating a delegate from a function. */
- typedef TemplateVariant (*StubType)(const void *obj, const QValueList<TemplateVariant> &args);
+ typedef TemplateVariant (*StubType)(const void *obj, const std::vector<TemplateVariant> &args);
Delegate() : m_objectPtr(0) , m_stubPtr(0) {}
/** Creates a delegate given an object. The method to call is passed as a template parameter */
- template <class T, TemplateVariant (T::*TMethod)(const QValueList<TemplateVariant> &) const>
+ template <class T, TemplateVariant (T::*TMethod)(const std::vector<TemplateVariant> &) const>
static Delegate fromMethod(const T* objectPtr)
{
Delegate d;
@@ -118,7 +118,7 @@ class TemplateVariant
}
/** Invokes the function/method stored in the delegate */
- TemplateVariant operator()(const QValueList<TemplateVariant> &args) const
+ TemplateVariant operator()(const std::vector<TemplateVariant> &args) const
{
return (*m_stubPtr)(m_objectPtr, args);
}
@@ -127,8 +127,8 @@ class TemplateVariant
const void* m_objectPtr;
StubType m_stubPtr;
- template <class T, TemplateVariant (T::*TMethod)(const QValueList<TemplateVariant> &) const>
- static TemplateVariant methodStub(const void* objectPtr, const QValueList<TemplateVariant> &args)
+ template <class T, TemplateVariant (T::*TMethod)(const std::vector<TemplateVariant> &) const>
+ static TemplateVariant methodStub(const void* objectPtr, const std::vector<TemplateVariant> &args)
{
T* p = (T*)(objectPtr);
return (p->*TMethod)(args);
@@ -269,7 +269,7 @@ class TemplateVariant
/** Return the result of apply this function with \a args.
* Returns an empty string if the variant type is not a function.
*/
- TemplateVariant call(const QValueList<TemplateVariant> &args)
+ TemplateVariant call(const std::vector<TemplateVariant> &args)
{
if (m_type==Function) return m_delegate(args);
return TemplateVariant();
@@ -355,10 +355,10 @@ class TemplateListIntf
virtual ~TemplateListIntf() {}
/** Returns the number of elements in the list */
- virtual int count() const = 0;
+ virtual uint count() const = 0;
/** Returns the element at index position \a index. */
- virtual TemplateVariant at(int index) const = 0;
+ virtual TemplateVariant at(uint index) const = 0;
/** Creates a new iterator for this list.
* @note the user should call delete on the returned pointer.
@@ -377,8 +377,8 @@ class TemplateList : public TemplateListIntf
{
public:
// TemplateListIntf methods
- virtual int count() const;
- virtual TemplateVariant at(int index) const;
+ virtual uint count() const;
+ virtual TemplateVariant at(uint index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
virtual int addRef();
virtual int release();
@@ -457,6 +457,7 @@ class TemplateStruct : public TemplateStructIntf
class TemplateEscapeIntf
{
public:
+ virtual ~TemplateEscapeIntf() {}
/** Returns the \a input after escaping certain characters */
virtual QCString escape(const QCString &input) = 0;
/** Setting tabbing mode on or off (for LaTeX) */
@@ -469,6 +470,7 @@ class TemplateEscapeIntf
class TemplateSpacelessIntf
{
public:
+ virtual ~TemplateSpacelessIntf() {}
/** Returns the \a input after removing redundant whitespace */
virtual QCString remove(const QCString &input) = 0;
/** Reset filter state */
diff --git a/src/threadpool.h b/src/threadpool.h
new file mode 100644
index 0000000..5239fd4
--- /dev/null
+++ b/src/threadpool.h
@@ -0,0 +1,151 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef THREADPOOL_H
+#define THREADPOOL_H
+
+#include <condition_variable>
+#include <deque>
+#include <functional>
+#include <future>
+#include <mutex>
+#include <thread>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+/// Class managing a pool of worker threads.
+/// Work can be queued by passing a function to queue(). A future will be
+/// returned that can be used to obtain the result of the function after execution.
+///
+/// Usage example:
+/// @code
+/// ThreadPool pool(10);
+/// std::vector< std::future< int > > results;
+/// for (int i=0;i<10;i++)
+/// {
+/// auto run = [](int i) { return i*i; };
+/// results.emplace_back(pool.queue(std::bind(run,i)));
+/// }
+/// for (auto &f : results)
+/// {
+/// printf("Result %d:\n", f.get());
+/// }
+/// @endcode
+class ThreadPool
+{
+ public:
+ /// start N threads in the thread pool.
+ ThreadPool(std::size_t N=1)
+ {
+ for (std::size_t i = 0; i < N; ++i)
+ {
+ // each thread is a std::async running thread_task():
+ m_finished.push_back(
+ std::async(
+ std::launch::async,
+ [this]{ threadTask(); }
+ )
+ );
+ }
+ }
+ /// deletes the thread pool by finishing all threads
+ ~ThreadPool()
+ {
+ finish();
+ }
+
+ /// Queue the callable function \a f for the threads to execute.
+ /// A future of the return type of the function is returned to capture the result.
+ template<class F, class R=std::result_of_t<F&()> >
+ std::future<R> queue(F&& f)
+ {
+ // We wrap the function object into a packaged task, splitting
+ // execution from the return value.
+ // Since the packaged_task object is not copyable, we create it on the heap
+ // and capture it via a shared pointer in a lambda and then assign that lambda
+ // to a std::function.
+ auto ptr = std::make_shared< std::packaged_task<R()> >(std::forward<F>(f));
+ auto taskFunc = [ptr]() { if (ptr->valid()) (*ptr)(); };
+
+ auto r=ptr->get_future(); // get the return value before we hand off the task
+ {
+ std::unique_lock<std::mutex> l(m_mutex);
+ m_work.emplace_back(taskFunc);
+ m_cond.notify_one(); // wake a thread to work on the task
+ }
+
+ return r; // return the future result of the task
+ }
+
+ /// finish enques a "stop the thread" message for every thread,
+ /// then waits for them to finish
+ void finish()
+ {
+ {
+ std::unique_lock<std::mutex> l(m_mutex);
+ for(auto&& u : m_finished)
+ {
+ unused_variable(u);
+ m_work.push_back({}); // insert empty function object to signal abort
+ }
+ }
+ m_cond.notify_all();
+ m_finished.clear();
+ }
+ private:
+
+ // helper to silence the compiler warning about unused variables
+ template <typename ...Args>
+ void unused_variable(Args&& ...args) { (void)(sizeof...(args)); }
+
+ // the work that a worker thread does:
+ void threadTask()
+ {
+ while(true)
+ {
+ // pop a task off the queue:
+ std::function<void()> f;
+ {
+ // usual thread-safe queue code:
+ std::unique_lock<std::mutex> l(m_mutex);
+ if (m_work.empty())
+ {
+ m_cond.wait(l,[&]{return !m_work.empty();});
+ }
+ f = std::move(m_work.front());
+ m_work.pop_front();
+ }
+ // if the function is empty, it means we are asked to abort
+ if (!f) return;
+ // run the task
+ f();
+ }
+ }
+
+ // the mutex, condition variable and deque form a single
+ // thread-safe triggered queue of tasks:
+ std::mutex m_mutex;
+ std::condition_variable m_cond;
+
+ // hold the queue of work
+ std::deque< std::function<void()> > m_work;
+
+ // this holds futures representing the worker threads being done:
+ std::vector< std::future<void> > m_finished;
+};
+
+#endif
+
diff --git a/src/to_c_cmd.py b/src/to_c_cmd.py
deleted file mode 100755
index 52785f1..0000000
--- a/src/to_c_cmd.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# place " at begin of each line
-# escape existing '\' and '"'
-# remove \n at the end of the line (sometimes the last line does not have a \n
-# so we cannot do a replacement with some other text)
-# place an escaped \n and " at the end of each line
-import sys
-for line in sys.stdin:
- sys.stdout.write('"' + line.replace('\\','\\\\').replace('"','\\"').replace('\n','') + '\\n"\n')
diff --git a/src/tooltip.cpp b/src/tooltip.cpp
index 8cc1f87..f8222d7 100644
--- a/src/tooltip.cpp
+++ b/src/tooltip.cpp
@@ -1,10 +1,10 @@
/******************************************************************************
*
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -13,7 +13,11 @@
*
*/
-#include <qdict.h>
+#include <map>
+#include <memory>
+#include <unordered_map>
+#include <string>
+#include <mutex>
#include "tooltip.h"
#include "definition.h"
@@ -23,37 +27,33 @@
#include "doxygen.h"
#include "config.h"
-class TooltipManager::Private
+static std::mutex g_tooltipLock;
+
+struct TooltipData
{
- public:
- Private() : tooltipInfo(10007) {}
- QDict<Definition> tooltipInfo;
+ std::map<std::string,const Definition*> tooltipInfo;
+ std::set<std::string> tooltipWritten;
};
-TooltipManager *TooltipManager::s_theInstance = 0;
-
-TooltipManager::TooltipManager()
+class TooltipManager::Private
{
- p = new Private;
-}
+ public:
+ std::unordered_map<int, std::unique_ptr<TooltipData> > tooltips;
+ std::unique_ptr<TooltipData> &getTooltipData(int id);
+};
-TooltipManager::~TooltipManager()
+TooltipManager &TooltipManager::instance()
{
- delete p;
+ static TooltipManager s_instance;
+ return s_instance;
}
-TooltipManager *TooltipManager::instance()
+TooltipManager::TooltipManager() : p(std::make_unique<Private>())
{
- if (!s_theInstance)
- {
- s_theInstance = new TooltipManager;
- }
- return s_theInstance;
}
-void TooltipManager::clearTooltips()
+TooltipManager::~TooltipManager()
{
- p->tooltipInfo.clear();
}
static QCString escapeId(const char *s)
@@ -68,10 +68,22 @@ static QCString escapeId(const char *s)
return res;
}
-void TooltipManager::addTooltip(const Definition *d)
+std::unique_ptr<TooltipData> &TooltipManager::Private::getTooltipData(int id)
{
- static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
+ std::lock_guard<std::mutex> lock(g_tooltipLock);
+ auto it = tooltips.insert(std::make_pair(id,std::make_unique<TooltipData>())).first;
+ return it->second;
+}
+
+void TooltipManager::addTooltip(CodeOutputInterface &ol,const Definition *d)
+{
+ bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
if (!sourceTooltips) return;
+ int outputId = ol.id();
+ if (outputId==0) return;
+
+ auto &ttd = p->getTooltipData(outputId);
+
QCString id = d->getOutputFileBase();
int i=id.findRev('/');
if (i!=-1)
@@ -85,48 +97,57 @@ void TooltipManager::addTooltip(const Definition *d)
id+="_"+anc;
}
id = "a" + id;
- if (p->tooltipInfo.find(id)==0)
- {
- p->tooltipInfo.insert(id,d);
- }
+ ttd->tooltipInfo.insert(std::make_pair(id.str(),d));
+ //printf("%p: addTooltip(%s) ol=%d\n",this,id.data(),ol.id());
}
void TooltipManager::writeTooltips(CodeOutputInterface &ol)
{
- QDictIterator<Definition> di(p->tooltipInfo);
- Definition *d;
- for (di.toFirst();(d=di.current());++di)
+ int outputId = ol.id(); // get unique identifier per output file
+ if (outputId==0) return; // not set => no HTML output
+ auto it = p->tooltips.find(outputId); // see if we have tooltips for this file
+ if (it!=p->tooltips.end())
{
- DocLinkInfo docInfo;
- docInfo.name = d->qualifiedName();
- docInfo.ref = d->getReference();
- docInfo.url = d->getOutputFileBase();
- docInfo.anchor = d->anchor();
- SourceLinkInfo defInfo;
- if (d->getBodyDef() && d->getStartBodyLine()!=-1)
- {
- defInfo.file = d->getBodyDef()->name();
- defInfo.line = d->getStartBodyLine();
- defInfo.url = d->getSourceFileBase();
- defInfo.anchor = d->getSourceAnchor();
- }
- SourceLinkInfo declInfo; // TODO: fill in...
- QCString decl;
- if (d->definitionType()==Definition::TypeMember)
+ auto &ttd = it->second;
+ for (const auto &kv : ttd->tooltipInfo)
{
- MemberDef *md = dynamic_cast<MemberDef*>(d);
- if (!md->isAnonymous())
+ if (ttd->tooltipWritten.find(kv.first)==ttd->tooltipWritten.end()) // only write tooltips once
{
- decl = md->declaration();
+ //printf("%p: writeTooltips(%s) ol=%d\n",this,kv.first.c_str(),ol.id());
+ const Definition *d = kv.second;
+ DocLinkInfo docInfo;
+ docInfo.name = d->qualifiedName();
+ docInfo.ref = d->getReference();
+ docInfo.url = d->getOutputFileBase();
+ docInfo.anchor = d->anchor();
+ SourceLinkInfo defInfo;
+ if (d->getBodyDef() && d->getStartBodyLine()!=-1)
+ {
+ defInfo.file = d->getBodyDef()->name();
+ defInfo.line = d->getStartBodyLine();
+ defInfo.url = d->getSourceFileBase();
+ defInfo.anchor = d->getSourceAnchor();
+ }
+ SourceLinkInfo declInfo; // TODO: fill in...
+ QCString decl;
+ if (d->definitionType()==Definition::TypeMember)
+ {
+ const MemberDef *md = toMemberDef(d);
+ if (!md->isAnonymous())
+ {
+ decl = md->declaration();
+ }
+ }
+ ol.writeTooltip(kv.first.c_str(), // id
+ docInfo, // symName
+ decl, // decl
+ d->briefDescriptionAsTooltip(), // desc
+ defInfo,
+ declInfo
+ );
+ ttd->tooltipWritten.insert(kv.first);
}
}
- ol.writeTooltip(di.currentKey(), // id
- docInfo, // symName
- decl, // decl
- d->briefDescriptionAsTooltip(), // desc
- defInfo,
- declInfo
- );
}
}
diff --git a/src/tooltip.h b/src/tooltip.h
index 170ea3c..acdacb4 100644
--- a/src/tooltip.h
+++ b/src/tooltip.h
@@ -1,10 +1,10 @@
/******************************************************************************
*
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -15,23 +15,28 @@
#ifndef TOOLTIP_H
#define TOOLTIP_H
+#include <memory>
+
class Definition;
class CodeOutputInterface;
+//! Class that manages the tooltips for a source file
class TooltipManager
{
public:
- static TooltipManager *instance();
- void clearTooltips();
- void addTooltip(const Definition *d);
+ static TooltipManager &instance();
+ ~TooltipManager();
+
+ /** add a tooltip for a given symbol definition */
+ void addTooltip(CodeOutputInterface &ol,const Definition *d);
+
+ /** write the list of all collected tooltip to the given outputs */
void writeTooltips(CodeOutputInterface &ol);
private:
- class Private;
- Private *p;
TooltipManager();
- ~TooltipManager();
- static TooltipManager *s_theInstance;
+ class Private;
+ std::unique_ptr<Private> p;
};
#endif
diff --git a/src/translator.h b/src/translator.h
index 188b775..bcc70ff 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -50,6 +50,11 @@ class Translator
* can be returned.
*/
virtual QCString latexFontenc() { return "T1"; }
+ virtual QCString latexFont() {
+ return "\\usepackage[scaled=.90]{helvet}\n"
+ "\\usepackage{courier}\n"
+ "\\renewcommand{\\familydefault}{\\sfdefault}\n";
+ }
/*!
* Sets the commands to be inserted directly after the `\\begin{document}`
* in the LaTeX document.
@@ -73,6 +78,7 @@ class Translator
}
return latex_command;
}
+ virtual QCString trISOLang() = 0;
// --- Language translation methods -------------------
@@ -588,7 +594,6 @@ class Translator
virtual QCString trClassMethods() = 0;
virtual QCString trInstanceMethods() = 0;
virtual QCString trMethodDocumentation() = 0;
- virtual QCString trDesignOverview() = 0;
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
@@ -646,6 +651,12 @@ class Translator
virtual QCString trOperationDocumentation() = 0;
virtual QCString trDataMembers() = 0;
virtual QCString trDataMemberDocumentation() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.19
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDesignUnitDocumentation() = 0;
};
#endif
diff --git a/src/translator_adapter.h b/src/translator_adapter.h
index b0c8a24..388304c 100644
--- a/src/translator_adapter.h
+++ b/src/translator_adapter.h
@@ -41,7 +41,17 @@ class TranslatorAdapterBase : public Translator
};
-class TranslatorAdapter_1_8_15 : public TranslatorAdapterBase
+class TranslatorAdapter_1_8_19 : public TranslatorAdapterBase
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.8.19"); }
+
+ virtual QCString trDesignUnitDocumentation()
+ { return english.trDesignUnitDocumentation(); }
+};
+
+class TranslatorAdapter_1_8_15 : public TranslatorAdapter_1_8_19
{
public:
virtual QCString updateNeededMessage()
@@ -216,9 +226,6 @@ class TranslatorAdapter_1_8_2 : public TranslatorAdapter_1_8_4
virtual QCString trMethodDocumentation()
{ return english.trMethodDocumentation(); }
-
- virtual QCString trDesignOverview()
- { return english.trDesignOverview(); }
};
@@ -271,16 +278,6 @@ class TranslatorAdapter_1_7_5 : public TranslatorAdapter_1_8_0
virtual QCString trDirDepGraph(const char *name)
{ return english.trDirDepGraph(name); }
-};
-
-/** Adapter class for languages that only contain translations up to
- * version 1.6.3.
- */
-class TranslatorAdapter_1_6_3 : public TranslatorAdapter_1_7_5
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.6.3"); }
virtual QCString trFileIn(const char *name)
{ return english.trFileIn(name); }
@@ -295,7 +292,7 @@ class TranslatorAdapter_1_6_3 : public TranslatorAdapter_1_7_5
/** Adapter class for languages that only contain translations up to
* version 1.6.0.
*/
-class TranslatorAdapter_1_6_0 : public TranslatorAdapter_1_6_3
+class TranslatorAdapter_1_6_0 : public TranslatorAdapter_1_7_5
{
public:
virtual QCString updateNeededMessage()
@@ -315,16 +312,6 @@ class TranslatorAdapter_1_6_0 : public TranslatorAdapter_1_6_3
virtual QCString trNoMatches()
{ return english.trNoMatches(); }
-};
-
-/** Adapter class for languages that only contain translations up to
- * version 1.5.4
- */
-class TranslatorAdapter_1_5_4 : public TranslatorAdapter_1_6_0
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.5.4"); }
virtual QCString trMemberFunctionDocumentationFortran()
{ return english.trMemberFunctionDocumentationFortran(); }
@@ -399,7 +386,7 @@ class TranslatorAdapter_1_5_4 : public TranslatorAdapter_1_6_0
/** Adapter class for languages that only contain translations up to
* version 1.4.6
*/
-class TranslatorAdapter_1_4_6 : public TranslatorAdapter_1_5_4
+class TranslatorAdapter_1_4_6 : public TranslatorAdapter_1_6_0
{
public:
virtual QCString updateNeededMessage()
diff --git a/src/translator_am.h b/src/translator_am.h
index 5b4c446..812d8fb 100644
--- a/src/translator_am.h
+++ b/src/translator_am.h
@@ -32,9 +32,11 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
/* Used to get the command(s) for the language support. */
virtual QCString latexLanguageSupportCommand()
{
- return "\\usepackage[latin]{armtex}\n"
- "\\usepackage[armscii8]{inputenc}\n";
+ return "\\usepackage[latin]{armtex}\n"
+ "\\usepackage[armscii8]{inputenc}\n";
}
+ virtual QCString trISOLang()
+ { return "hy"; }
// --- Language translation methods -------------------
@@ -1800,5 +1802,4 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
{ return name + QCString("-ի ֆայլադարանների կախվածությունների գծագիր:"); }
};
-
#endif
diff --git a/src/translator_ar.h b/src/translator_ar.h
index 24281fd..0989249 100644
--- a/src/translator_ar.h
+++ b/src/translator_ar.h
@@ -68,6 +68,9 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
return "";
}
+ virtual QCString trISOLang()
+ { return "ar-EG"; }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -1564,6 +1567,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
"وجد أنها ملائمة. إنها تختلف عن الدالة أعلاه"
"فقط في نوعية ال argument(s) التي تقبلها.";
}
+
};
#endif
diff --git a/src/translator_br.h b/src/translator_br.h
index 01c5b9f..29a0e20 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -49,7 +49,7 @@
#ifndef TRANSLATOR_BR_H
#define TRANSLATOR_BR_H
-class TranslatorBrazilian : public Translator
+class TranslatorBrazilian : public TranslatorAdapter_1_8_19
{
public:
@@ -85,6 +85,11 @@ class TranslatorBrazilian : public Translator
return "\\usepackage[brazil]{babel}";
}
+ virtual QCString trISOLang()
+ {
+ return "pt-BR";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -262,6 +267,10 @@ class TranslatorBrazilian : public Translator
{
return "Aqui estão as estruturas de dados, uniões e suas respectivas descrições:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Aqui estão as classes e suas respectivas descrições:";
+ }
else
{
return "Aqui estão as classes, estruturas, uniões e interfaces e suas respectivas descrições:";
@@ -2011,15 +2020,6 @@ class TranslatorBrazilian : public Translator
return "Documentação do método";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- // I'm not sure how to accurately translate it
- return "Visão geral do design";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2335,7 +2335,6 @@ class TranslatorBrazilian : public Translator
return "Dados Membros";
}
-//////////////////////////////////////////////////////////////////////////
};
diff --git a/src/translator_ca.h b/src/translator_ca.h
index ca9b7e9..7a7e79a 100644
--- a/src/translator_ca.h
+++ b/src/translator_ca.h
@@ -75,6 +75,11 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
return "\\usepackage[catalan]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "ca";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -246,6 +251,10 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
{
return "Aquestes són les estructures de dades acompanyades amb breus descripcions:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Aquestes són les classes acompanyades amb breus descripcions:";
+ }
else
{
return "Aquestes són les classes, estructures, "
@@ -1838,6 +1847,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
virtual QCString trDirDepGraph(const char *name)
{ return QCString("Graf de dependència de directoris per a ")+name+":"; }
+
};
#endif
diff --git a/src/translator_cn.h b/src/translator_cn.h
index 0e559c1..a3b5803 100644
--- a/src/translator_cn.h
+++ b/src/translator_cn.h
@@ -55,6 +55,10 @@ class TranslatorChinese : public TranslatorAdapter_1_8_15
{
return "\\usepackage{CJKutf8}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "zh";
+ }
virtual QCString latexFontenc()
{
return "";
@@ -1862,14 +1866,6 @@ class TranslatorChinese : public TranslatorAdapter_1_8_15
return "函数文档";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "设计概要";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -1920,7 +1916,6 @@ class TranslatorChinese : public TranslatorAdapter_1_8_15
return "该单例的文档由下列文件生成:";
}
-//////////////////////////////////////////////////////////////////////////
};
#endif
diff --git a/src/translator_cz.h b/src/translator_cz.h
index 9d6c489..4fb3bc2 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -105,6 +105,11 @@ class TranslatorCzech : public TranslatorAdapter_1_8_15
"\\makeatother\n";
}
+ virtual QCString trISOLang()
+ {
+ return "cs";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -1977,14 +1982,6 @@ class TranslatorCzech : public TranslatorAdapter_1_8_15
return "Dokumentace metody";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Návrhové schéma";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2041,8 +2038,6 @@ class TranslatorCzech : public TranslatorAdapter_1_8_15
return result;
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif // TRANSLATOR_CZ_H
diff --git a/src/translator_de.h b/src/translator_de.h
index bf5ce5e..be51653 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -166,6 +166,11 @@ class TranslatorGerman : public TranslatorAdapter_1_8_15
return "\\usepackage[ngerman]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "de";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -343,13 +348,17 @@ class TranslatorGerman : public TranslatorAdapter_1_8_15
{
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- return "Hier folgt die Aufzählung aller Datenstrukturen "
- "mit einer Kurzbeschreibung:";
+ return "Hier folgt die Aufzählung aller Datenstrukturen "
+ "mit einer Kurzbeschreibung:";
+ }
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Hier folgt die Aufzählung aller Klassen mit einer Kurzbeschreibung:";
}
else
{
- return "Hier folgt die Aufzählung aller Klassen, Strukturen, "
- "Varianten und Schnittstellen mit einer Kurzbeschreibung:";
+ return "Hier folgt die Aufzählung aller Klassen, Strukturen, "
+ "Varianten und Schnittstellen mit einer Kurzbeschreibung:";
}
}
@@ -480,7 +489,7 @@ class TranslatorGerman : public TranslatorAdapter_1_8_15
}
else if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
{
- return "Entwurfseinheiten-Dokumentation";
+ return trDesignUnitDocumentation();
}
else
{
@@ -2072,14 +2081,6 @@ class TranslatorGerman : public TranslatorAdapter_1_8_15
return "Methodendokumentation";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Übersicht";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2254,7 +2255,13 @@ class TranslatorGerman : public TranslatorAdapter_1_8_15
virtual QCString trCustomReference(const char *name)
{ return QCString(name)+"-Referenz"; }
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.19
+//////////////////////////////////////////////////////////////////////////
+
+ /** VHDL design unit documentation */
+ virtual QCString trDesignUnitDocumentation()
+ { return "Entwurfseinheiten-Dokumentation"; }
};
diff --git a/src/translator_dk.h b/src/translator_dk.h
index 70e9032..fa1db9a 100644
--- a/src/translator_dk.h
+++ b/src/translator_dk.h
@@ -119,6 +119,11 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
"\\usepackage[danish]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "da";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -279,6 +284,8 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C)) {
return "Her er datastrukturerne med korte beskrivelser:";
+ } else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE)) {
+ return "Her er klasserne med korte beskrivelser:";
} else {
return "Her er klasserne, datastrukturerne, "
"unionerne og grænsefladerne med korte beskrivelser:";
@@ -1766,6 +1773,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
}
+
/*---------- For internal use: ----------------------------------------*/
protected:
/*! For easy flexible-noun implementation.
@@ -1775,7 +1783,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
const char* base, const char* plurSuffix)
{
QCString result(base);
- if (first_capital) result.at(0) = toupper(result.at(0));
+ if (first_capital) result[0] = (char)toupper(result[0]);
if (!singular) result+=plurSuffix;
return result;
}
diff --git a/src/translator_en.h b/src/translator_en.h
index 400e59c..ba26bc7 100644
--- a/src/translator_en.h
+++ b/src/translator_en.h
@@ -74,6 +74,11 @@ class TranslatorEnglish : public Translator
return "";
}
+ virtual QCString trISOLang()
+ {
+ return "en-US";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -394,6 +399,10 @@ class TranslatorEnglish : public Translator
{
return "Data Structure Documentation";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
+ {
+ return trDesignUnitDocumentation();
+ }
else
{
return "Class Documentation";
@@ -1940,14 +1949,6 @@ class TranslatorEnglish : public Translator
return "Method Documentation";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Design Overview";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2254,6 +2255,12 @@ class TranslatorEnglish : public Translator
}
//////////////////////////////////////////////////////////////////////////
+// new since 1.8.19
+//////////////////////////////////////////////////////////////////////////
+
+ /** VHDL design unit documentation */
+ virtual QCString trDesignUnitDocumentation()
+ { return "Design Unit Documentation"; }
};
diff --git a/src/translator_eo.h b/src/translator_eo.h
index 28876d7..4ae6ee9 100644
--- a/src/translator_eo.h
+++ b/src/translator_eo.h
@@ -76,6 +76,11 @@ class TranslatorEsperanto : public TranslatorAdapter_1_8_4
return "\\usepackage[esperanto]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "eo";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -247,6 +252,10 @@ class TranslatorEsperanto : public TranslatorAdapter_1_8_4
{
return "Jen datumstrukturoj kun mallongaj priskriboj:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Jen la klasoj kun mallongaj priskriboj:";
+ }
else
{
return "Jen la klasoj, strukturoj, kunigoj kaj interfacoj "
@@ -1941,8 +1950,6 @@ class TranslatorEsperanto : public TranslatorAdapter_1_8_4
return "Fasona Superrigardo";
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_es.h b/src/translator_es.h
index b28ed75..554c487 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -68,6 +68,11 @@ class TranslatorSpanish : public TranslatorAdapter_1_8_15
return "\\usepackage[spanish]{babel}";
}
+ virtual QCString trISOLang()
+ {
+ return "es";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -238,6 +243,10 @@ class TranslatorSpanish : public TranslatorAdapter_1_8_15
{
return "Lista de estructuras con una breve descripción:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Lista de las clases con una breve descripción:";
+ }
else
{
return "Lista de las clases, estructuras, "
@@ -1992,14 +2001,6 @@ class TranslatorSpanish : public TranslatorAdapter_1_8_15
return "Método de documentación";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Diseño información general";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2304,8 +2305,6 @@ class TranslatorSpanish : public TranslatorAdapter_1_8_15
return "Documentación miembro de datos";
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_fa.h b/src/translator_fa.h
index 5a37330..56ba3da 100644
--- a/src/translator_fa.h
+++ b/src/translator_fa.h
@@ -91,6 +91,11 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
return "";
}
+ virtual QCString trISOLang()
+ {
+ return "fa";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
diff --git a/src/translator_fi.h b/src/translator_fi.h
index 2b94f48..dd2d38c 100644
--- a/src/translator_fi.h
+++ b/src/translator_fi.h
@@ -130,6 +130,10 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
return "\\usepackage[finnish]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "fi";
+ }
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -307,6 +311,11 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
{
return "Tässä ovat tietueet lyhyen selitteen kanssa:"; // "Here are the data structures with brief descriptions:"
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Tässä ovat luokat " // "Here are the classes
+ "lyhyen selitteen kanssa:"; // "with brief descriptions:"
+ }
else
{
return "Tässä ovat luokat, tietueet ja " // "Here are the classes, structs and "
diff --git a/src/translator_fr.h b/src/translator_fr.h
index f355619..a4eafc2 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -129,1077 +129,1093 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
* "\\usepackage[T1]{fontenc}\n"
* </pre>
*/
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[french]{babel}\n"
- "\\NoAutoSpaceBeforeFDP\n";
- }
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[french]{babel}\n"
+ "\\NoAutoSpaceBeforeFDP\n";
+ }
+
+ virtual QCString trISOLang()
+ {
+ return "fr";
+ }
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Fonctions associées"; }
+ virtual QCString trRelatedFunctions()
+ { return "Fonctions associées"; }
/*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Notez que ce ne sont pas des fonctions membres)"; }
+ virtual QCString trRelatedSubscript()
+ { return "(Notez que ce ne sont pas des fonctions membres)"; }
/*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Description détaillée"; }
+ virtual QCString trDetailedDescription()
+ { return "Description détaillée"; }
/*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Documentation des définitions de type membres"; }
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Documentation des définitions de type membres"; }
/*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Documentation des énumérations membres"; }
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Documentation des énumérations membres"; }
/*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Documentation des fonctions membres"; }
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Documentation des fonctions membres"; }
/*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Documentation des champs";
- }
- else
- {
- return "Documentation des données membres";
- }
+ return "Documentation des champs";
}
+ else
+ {
+ return "Documentation des données membres";
+ }
+ }
/*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Plus de détails..."; }
+ virtual QCString trMore()
+ { return "Plus de détails..."; }
/*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Liste de tous les membres"; }
+ virtual QCString trListOfAllMembers()
+ { return "Liste de tous les membres"; }
/*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Liste des membres"; }
+ virtual QCString trMemberList()
+ { return "Liste des membres"; }
/*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Liste complète des membres de "; }
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Liste complète des membres de "; }
/*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", y compris les membres hérités :"; }
+ virtual QCString trIncludingInheritedMembers()
+ { return ", y compris les membres hérités :"; }
/*! this is put at the author sections at the bottom of man pages.
* parameter s is name of the project name.
*/
- virtual QCString trGeneratedAutomatically(const char *s)
- { QCString result="Généré automatiquement par Doxygen";
- if (s) result+=(QCString)" pour "+s;
- result+=" à partir du code source.";
- return result;
- }
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Généré automatiquement par Doxygen";
+ if (s) result+=(QCString)" pour "+s;
+ result+=" à partir du code source.";
+ return result;
+ }
/*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "énumération"; }
+ virtual QCString trEnumName()
+ { return "énumération"; }
/*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "valeur énumérée"; }
+ virtual QCString trEnumValue()
+ { return "valeur énumérée"; }
/*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "défini dans"; }
+ virtual QCString trDefinedIn()
+ { return "défini dans"; }
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \\group command).
*/
- virtual QCString trModules()
- { return "Modules"; }
+ virtual QCString trModules()
+ { return "Modules"; }
/*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Hiérarchie des classes"; }
+ virtual QCString trClassHierarchy()
+ { return "Hiérarchie des classes"; }
/*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Structures de données";
+ }
+ else
{
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Structures de données";
- }
- else
- {
- return "Liste des classes";
- }
+ return "Liste des classes";
}
+ }
/*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Liste des fichiers"; }
+ virtual QCString trFileList()
+ { return "Liste des fichiers"; }
/*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Champs de donnée";
+ }
+ else
{
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Champs de donnée";
- }
- else
- {
- return "Membres de classe";
- }
+ return "Membres de classe";
}
+ }
/*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Variables globale";
+ }
+ else
{
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Variables globale";
- }
- else
- {
- return "Membres de fichier";
- }
+ return "Membres de fichier";
}
+ }
/*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Pages associées"; }
+ virtual QCString trRelatedPages()
+ { return "Pages associées"; }
/*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Exemples"; }
+ virtual QCString trExamples()
+ { return "Exemples"; }
/*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Recherche"; }
+ virtual QCString trSearch()
+ { return "Recherche"; }
/*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Cette liste d'héritage est classée "
- "approximativement par ordre alphabétique :";
+ virtual QCString trClassHierarchyDescription()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
+ {
+ return "Liste hiérarchique de toutes les entités :";
}
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
+ else
{
- QCString result="Liste de tous les fichiers ";
- if (!extractAll) result+="documentés ";
- result+="avec une brève description :";
- return result;
+ return "Cette liste d'héritage est classée "
+ "approximativement par ordre alphabétique :";
}
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les fichiers ";
+ if (!extractAll) result+="documentés ";
+ result+="avec une brève description :";
+ return result;
+ }
/*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
-
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Liste des structures de données avec une brève description :";
- }
- else
- {
- return "Liste des classes, structures, "
+ return "Liste des structures de données avec une brève description :";
+ }
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Liste des classes avec une brève description :";
+ }
+ else
+ {
+ return "Liste des classes, structures, "
"unions et interfaces avec une brève description :";
- }
}
+ }
/*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les ";
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- QCString result="Liste de tous les ";
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- result+="champs de structure et d'union ";
- }
- else
- {
- result+="membres de classe ";
- }
- if (!extractAll)
- {
- result+="documentés ";
- }
- result+="avec des liens vers ";
- if (!extractAll)
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- result+="la documentation de structure/union de chaque champ :";
- }
- else
- {
- result+="la documentation de classe de chaque membre :";
- }
- }
- else
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- result+="les structures/unions auxquelles ils appartiennent :";
- }
- else
- {
- result+="les classes auxquelles ils appartiennent :";
- }
- }
- return result;
+ result+="champs de structure et d'union ";
}
+ else
+ {
+ result+="membres de classe ";
+ }
+ if (!extractAll)
+ {
+ result+="documentés ";
+ }
+ result+="avec des liens vers ";
+ if (!extractAll)
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ result+="la documentation de structure/union de chaque champ :";
+ }
+ else
+ {
+ result+="la documentation de classe de chaque membre :";
+ }
+ }
+ else
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ result+="les structures/unions auxquelles ils appartiennent :";
+ }
+ else
+ {
+ result+="les classes auxquelles ils appartiennent :";
+ }
+ }
+ return result;
+ }
/*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Liste ";
+
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- QCString result="Liste ";
-
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- result+="de toutes les fonctions, variables, macros, enumérations, et définitions de type ";
- }
- else
- {
- result+="de tous les membres de fichier ";
- }
- if (!extractAll) result+="documentés ";
- result+="avec des liens vers ";
- if (extractAll)
- result+="les fichiers auxquels ils appartiennent :";
- else
- result+="la documentation :";
- return result;
+ result+="de toutes les fonctions, variables, macros, enumérations, et définitions de type ";
}
+ else
+ {
+ result+="de tous les membres de fichier ";
+ }
+ if (!extractAll) result+="documentés ";
+ result+="avec des liens vers ";
+ if (extractAll)
+ result+="les fichiers auxquels ils appartiennent :";
+ else
+ result+="la documentation :";
+ return result;
+ }
/*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Liste de tous les exemples :"; }
+ virtual QCString trExamplesDescription()
+ { return "Liste de tous les exemples :"; }
/*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Liste de toutes les pages de documentation associées :"; }
+ virtual QCString trRelatedPagesDescription()
+ { return "Liste de toutes les pages de documentation associées :"; }
/*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Liste de tous les modules :"; }
+ virtual QCString trModulesDescription()
+ { return "Liste de tous les modules :"; }
/*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Documentation"; }
+ virtual QCString trDocumentation()
+ { return "Documentation"; }
/*! This is used in LaTeX as the title of the chapter with the
* index of all groups.
*/
- virtual QCString trModuleIndex()
- { return "Index des modules"; }
+ virtual QCString trModuleIndex()
+ { return "Index des modules"; }
/*! This is used in LaTeX as the title of the chapter with the
* class hierarchy.
*/
- virtual QCString trHierarchicalIndex()
- { return "Index hiérarchique"; }
+ virtual QCString trHierarchicalIndex()
+ { return "Index hiérarchique"; }
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
*/
- virtual QCString trCompoundIndex()
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Index des structures de données";
- }
- else
- {
- return "Index des classes";
- }
+ return "Index des structures de données";
}
+ else
+ {
+ return "Index des classes";
+ }
+ }
/*! This is used in LaTeX as the title of the chapter with the
* list of all files.
*/
- virtual QCString trFileIndex()
- { return "Index des fichiers"; }
+ virtual QCString trFileIndex()
+ { return "Index des fichiers"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all groups.
*/
- virtual QCString trModuleDocumentation()
- { return "Documentation des modules"; }
+ virtual QCString trModuleDocumentation()
+ { return "Documentation des modules"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all classes, structs and unions.
*/
- virtual QCString trClassDocumentation()
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Documentation des structures de données";
- }
- else
- {
- return "Documentation des classes";
- }
+ return "Documentation des structures de données";
}
+ else
+ {
+ return "Documentation des classes";
+ }
+ }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all files.
*/
- virtual QCString trFileDocumentation()
- { return "Documentation des fichiers"; }
+ virtual QCString trFileDocumentation()
+ { return "Documentation des fichiers"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all examples.
*/
- virtual QCString trExampleDocumentation()
- { return "Documentation des exemples"; }
+ virtual QCString trExampleDocumentation()
+ { return "Documentation des exemples"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all related pages.
*/
- virtual QCString trPageDocumentation()
- { return "Documentation des pages associées"; }
+ virtual QCString trPageDocumentation()
+ { return "Documentation des pages associées"; }
/*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Manuel de référence"; }
+ virtual QCString trReferenceManual()
+ { return "Manuel de référence"; }
/*! This is used in the documentation of a file as a header before the
* list of defines
*/
- virtual QCString trDefines()
- { return "Macros"; }
+ virtual QCString trDefines()
+ { return "Macros"; }
/*! This is used in the documentation of a file as a header before the
* list of typedefs
*/
- virtual QCString trTypedefs()
- { return "Définitions de type"; }
+ virtual QCString trTypedefs()
+ { return "Définitions de type"; }
/*! This is used in the documentation of a file as a header before the
* list of enumerations
*/
- virtual QCString trEnumerations()
- { return "Énumérations"; }
+ virtual QCString trEnumerations()
+ { return "Énumérations"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) functions
*/
- virtual QCString trFunctions()
- { return "Fonctions"; }
+ virtual QCString trFunctions()
+ { return "Fonctions"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
- virtual QCString trVariables()
- { return "Variables"; }
+ virtual QCString trVariables()
+ { return "Variables"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
- virtual QCString trEnumerationValues()
- { return "Valeurs énumérées"; }
+ virtual QCString trEnumerationValues()
+ { return "Valeurs énumérées"; }
/*! This is used in the documentation of a file before the list of
* documentation blocks for defines
*/
- virtual QCString trDefineDocumentation()
- { return "Documentation des macros"; }
+ virtual QCString trDefineDocumentation()
+ { return "Documentation des macros"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
*/
- virtual QCString trTypedefDocumentation()
- { return "Documentation des définitions de type"; }
+ virtual QCString trTypedefDocumentation()
+ { return "Documentation des définitions de type"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration types
*/
- virtual QCString trEnumerationTypeDocumentation()
- { return "Documentation du type de l'énumération"; }
+ virtual QCString trEnumerationTypeDocumentation()
+ { 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 functions
*/
- virtual QCString trFunctionDocumentation()
- { return "Documentation des fonctions"; }
+ virtual QCString trFunctionDocumentation()
+ { return "Documentation des fonctions"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for variables
*/
- virtual QCString trVariableDocumentation()
- { return "Documentation des variables"; }
+ virtual QCString trVariableDocumentation()
+ { return "Documentation des variables"; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds
*/
- virtual QCString trCompounds()
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Structures de données";
+ }
+ else
{
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Structures de données";
- }
- else
- {
- return "Classes";
- }
+ return "Classes";
}
+ }
/*! This is used in the standard footer of each page and indicates when
* the page was generated
*/
- virtual QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=(QCString)"Généré le "+date;
- if (projName) result+=(QCString)" pour "+projName;
- result+=(QCString)" par";
- return result;
- }
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Généré le "+date;
+ if (projName) result+=(QCString)" pour "+projName;
+ result+=(QCString)" par";
+ return result;
+ }
/*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Graphe d'héritage de "+clName+":";
- }
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Graphe d'héritage de "+clName+":";
+ }
/*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Pour un usage interne uniquement."; }
+ virtual QCString trForInternalUseOnly()
+ { return "Pour un usage interne uniquement."; }
/*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Avertissement"; }
+ virtual QCString trWarning()
+ { return "Avertissement"; }
/*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Version"; }
+ virtual QCString trVersion()
+ { return "Version"; }
/*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Date"; }
+ virtual QCString trDate()
+ { return "Date"; }
/*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Renvoie"; }
+ virtual QCString trReturns()
+ { return "Renvoie"; }
/*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Voir également"; }
+ virtual QCString trSeeAlso()
+ { return "Voir également"; }
/*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Paramètres"; }
+ virtual QCString trParameters()
+ { return "Paramètres"; }
/*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Exceptions"; }
+ virtual QCString trExceptions()
+ { return "Exceptions"; }
/*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Généré par"; }
+ virtual QCString trGeneratedBy()
+ { return "Généré par"; }
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990307
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
/*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Liste des espaces de nommage"; }
+ virtual QCString trNamespaceList()
+ { return "Liste des espaces de nommage"; }
/*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Liste de tous les espaces de nommage ";
- if (!extractAll) result+="documentés ";
- result+="avec une brève description:";
- return result;
- }
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les espaces de nommage ";
+ if (!extractAll) result+="documentés ";
+ result+="avec une brève description:";
+ return result;
+ }
/*! used in the class documentation as a header before the list of all
* friends of a class
*/
- virtual QCString trFriends()
- { return "Amis"; }
+ virtual QCString trFriends()
+ { return "Amis"; }
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990405
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
/*! used in the class documentation as a header before the list of all
* related classes
*/
- virtual QCString trRelatedFunctionDocumentation()
- { return "Documentation des fonctions amies et associées"; }
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Documentation des fonctions amies et associées"; }
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990425
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
/*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
+ virtual QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType,
bool isTemplate)
+ {
+ QCString result="Référence ";
+ if (isTemplate) result+="du modèle ";
+ result+="de ";
+ switch(compType)
{
- QCString result="Référence ";
- if (isTemplate) result+="du modèle ";
- result+="de ";
- switch(compType)
- {
- case ClassDef::Class: result+="la classe "; break;
- case ClassDef::Struct: result+="la structure "; break;
- case ClassDef::Union: result+="l'union "; break;
- case ClassDef::Interface: result+="l'interface "; break;
- case ClassDef::Protocol: result+="le protocol "; break;
- case ClassDef::Category: result+="la catégorie "; break;
- case ClassDef::Exception: result+="l'exception "; break;
- default: break;
- }
- result+=(QCString)clName;
- return result;
+ case ClassDef::Class: result+="la classe "; break;
+ case ClassDef::Struct: result+="la structure "; break;
+ case ClassDef::Union: result+="l'union "; break;
+ case ClassDef::Interface: result+="l'interface "; break;
+ case ClassDef::Protocol: result+="le protocol "; break;
+ case ClassDef::Category: result+="la catégorie "; break;
+ case ClassDef::Exception: result+="l'exception "; break;
+ default: break;
}
+ result+=(QCString)clName;
+ return result;
+ }
/*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result= "Référence du fichier ";
- result+=fileName;
- return result;
- }
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result= "Référence du fichier ";
+ result+=fileName;
+ return result;
+ }
/*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result= "Référence de l'espace de nommage ";
- result+=namespaceName;
- return result;
- }
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result= "Référence de l'espace de nommage ";
+ result+=namespaceName;
+ return result;
+ }
- virtual QCString trPublicMembers()
- { return "Fonctions membres publiques"; }
- virtual QCString trPublicSlots()
- { return "Connecteurs publics"; }
- virtual QCString trSignals()
- { return "Signaux"; }
- virtual QCString trStaticPublicMembers()
- { return "Fonctions membres publiques statiques"; }
- virtual QCString trProtectedMembers()
- { return "Fonctions membres protégées"; }
- virtual QCString trProtectedSlots()
- { return "Connecteurs protégés"; }
- virtual QCString trStaticProtectedMembers()
- { return "Fonctions membres protégées statiques"; }
- virtual QCString trPrivateMembers()
- { return "Fonctions membres privées"; }
- virtual QCString trPrivateSlots()
- { return "Connecteurs privés"; }
- virtual QCString trStaticPrivateMembers()
- { return "Fonctions membres privées statiques"; }
+ virtual QCString trPublicMembers()
+ { return "Fonctions membres publiques"; }
+ virtual QCString trPublicSlots()
+ { return "Connecteurs publics"; }
+ virtual QCString trSignals()
+ { return "Signaux"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Fonctions membres publiques statiques"; }
+ virtual QCString trProtectedMembers()
+ { return "Fonctions membres protégées"; }
+ virtual QCString trProtectedSlots()
+ { return "Connecteurs protégés"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Fonctions membres protégées statiques"; }
+ virtual QCString trPrivateMembers()
+ { return "Fonctions membres privées"; }
+ virtual QCString trPrivateSlots()
+ { return "Connecteurs privés"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Fonctions membres privées statiques"; }
/*! this function is used to produce a comma-separated list of items.
* use generateMarker(i) to indicate where item i should be put.
*/
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
// the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
// (order is left to right)
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", et ";
- }
- }
- return result;
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", et ";
+ }
}
+ return result;
+ }
/*! used in class documentation to produce a list of base classes,
* if class diagrams are disabled.
*/
- virtual QCString trInheritsList(int numEntries)
- {
- return "Est dérivée de "+trWriteList(numEntries)+".";
- }
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Est dérivée de "+trWriteList(numEntries)+".";
+ }
/*! used in class documentation to produce a list of super classes,
* if class diagrams are disabled.
*/
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Dérivée par "+trWriteList(numEntries)+".";
- }
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Dérivée par "+trWriteList(numEntries)+".";
+ }
/*! used in member documentation blocks to produce a list of
* members that are hidden by this one.
*/
- virtual QCString trReimplementedFromList(int numEntries)
- {
- return "Réimplémentée à partir de "+trWriteList(numEntries)+".";
- }
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Réimplémentée à partir de "+trWriteList(numEntries)+".";
+ }
/*! used in member documentation blocks to produce a list of
* all member that overwrite the implementation of this member.
*/
- virtual QCString trReimplementedInList(int numEntries)
- {
- return "Réimplémentée dans "+trWriteList(numEntries)+".";
- }
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Réimplémentée dans "+trWriteList(numEntries)+".";
+ }
/*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Membres de l'espace de nommage"; }
+ virtual QCString trNamespaceMembers()
+ { return "Membres de l'espace de nommage"; }
/*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Liste de tous les membres des espaces de nommage ";
- if (!extractAll) result+="documentés ";
- result+="avec des liens vers ";
- if (extractAll)
- result+="la documentation de namespace de chaque membre :";
- else
- result+="les espaces de nommage auxquels ils appartiennent :";
- return result;
- }
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les membres des espaces de nommage ";
+ if (!extractAll) result+="documentés ";
+ result+="avec des liens vers ";
+ if (extractAll)
+ result+="la documentation de namespace de chaque membre :";
+ else
+ result+="les espaces de nommage auxquels ils appartiennent :";
+ return result;
+ }
/*! This is used in LaTeX as the title of the chapter with the
* index of all namespaces.
*/
- virtual QCString trNamespaceIndex()
- { return "Index des espaces de nommage"; }
+ virtual QCString trNamespaceIndex()
+ { return "Index des espaces de nommage"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all namespaces.
*/
- virtual QCString trNamespaceDocumentation()
- { return "Documentation des espaces de nommage"; }
+ virtual QCString trNamespaceDocumentation()
+ { return "Documentation des espaces de nommage"; }
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990522
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
/*! This is used in the documentation before the list of all
* namespaces in a file.
*/
- virtual QCString trNamespaces()
- { return "Espaces de nommage"; }
+ virtual QCString trNamespaces()
+ { return "Espaces de nommage"; }
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990728
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
/*! This is put at the bottom of a class documentation page and is
* followed by a list of files that were used to generate the page.
*/
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
bool single)
- { // here s is one of " Class", " Struct" or " Union"
+ { // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
- bool female = true;
- QCString result=(QCString)"La documentation de ";
- switch(compType)
- {
- case ClassDef::Class: result+="cette classe"; break;
- case ClassDef::Struct: result+="cette structure"; break;
- case ClassDef::Union: result+="cette union"; break;
- case ClassDef::Interface: result+="cette interface"; break;
- case ClassDef::Protocol: result+="ce protocol"; female = false; break;
- case ClassDef::Category: result+="cette catégorie"; break;
- case ClassDef::Exception: result+="cette exception"; break;
- default: break;
- }
- if (female) result+= " a été générée à partir ";
- else result+=" a été généré à partir ";
- if (single) result+="du fichier suivant :";
- else result+="des fichiers suivants :";
- return result;
+ bool feminine = true;
+ QCString result=(QCString)"La documentation de ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="cette classe"; break;
+ case ClassDef::Struct: result+="cette structure"; break;
+ case ClassDef::Union: result+="cette union"; break;
+ case ClassDef::Interface: result+="cette interface"; break;
+ case ClassDef::Protocol: result+="ce protocol"; feminine = false; break;
+ case ClassDef::Category: result+="cette catégorie"; break;
+ case ClassDef::Exception: result+="cette exception"; break;
+ default: break;
}
+ if (feminine) result+= " a été générée à partir ";
+ else result+=" a été généré à partir ";
+ if (feminine) result+="du fichier suivant :";
+ else result+="des fichiers suivants :";
+ return result;
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990901
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
/*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Valeurs retournées"; }
+ virtual QCString trReturnValues()
+ { return "Valeurs retournées"; }
/*! This is in the (quick) index as a link to the main page (index.html)
*/
- virtual QCString trMainPage()
- { return "Page principale"; }
+ virtual QCString trMainPage()
+ { return "Page principale"; }
/*! This is used in references to page that are put in the LaTeX
* documentation. It should be an abbreviation of the word page.
*/
- virtual QCString trPageAbbreviation()
- { return "p."; }
+ virtual QCString trPageAbbreviation()
+ { return "p."; }
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-991003
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Définition à la ligne @0 du fichier @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Définition dans le fichier @0.";
- }
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Définition à la ligne @0 du fichier @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Définition dans le fichier @0.";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-991205
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
- virtual QCString trDeprecated()
- {
- return "Obsolète";
- }
+ virtual QCString trDeprecated()
+ {
+ return "Obsolète";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.0.0
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
/*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Graphe de collaboration de "+clName+":";
- }
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Graphe de collaboration de "+clName+":";
+ }
/*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Graphe des dépendances par inclusion de "+fName+":";
- }
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Graphe des dépendances par inclusion de "+fName+":";
+ }
/*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Documentation des constructeurs et destructeur";
- }
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Documentation des constructeurs et destructeur";
+ }
/*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Aller au code source de ce fichier.";
- }
+ virtual QCString trGotoSourceCode()
+ {
+ return "Aller au code source de ce fichier.";
+ }
/*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Aller à la documentation de ce fichier.";
- }
+ virtual QCString trGotoDocumentation()
+ {
+ return "Aller à la documentation de ce fichier.";
+ }
/*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Précondition";
- }
+ virtual QCString trPrecondition()
+ {
+ return "Précondition";
+ }
/*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Postcondition";
- }
+ virtual QCString trPostcondition()
+ {
+ return "Postcondition";
+ }
/*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
/*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Valeur initiale :";
- }
+ virtual QCString trInitialValue()
+ {
+ return "Valeur initiale :";
+ }
/*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "code";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Graphe hiérarchique des classes";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Aller au graphe hiérarchique des classes";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Aller à la hiérarchie des classes en mode texte";
- }
- virtual QCString trPageIndex()
- {
- return "Index des pages";
- }
+ virtual QCString trCode()
+ {
+ return "code";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Graphe hiérarchique des classes";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Aller au graphe hiérarchique des classes";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Aller à la hiérarchie des classes en mode texte";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Index des pages";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.1.0
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
- virtual QCString trNote()
- {
- return "Note";
- }
- virtual QCString trPublicTypes()
- {
- return "Types publics";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Champs de données";
- }
- else
- {
- return "Attributs publics";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Attributs publics statiques";
- }
- virtual QCString trProtectedTypes()
- {
- return "Types protégés";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Attributs protégés";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Attributs protégés statiques";
- }
- virtual QCString trPrivateTypes()
- {
- return "Types privés";
- }
- virtual QCString trPrivateAttribs()
+ virtual QCString trNote()
+ {
+ return "Note";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Types publics";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- return "Attributs privés";
+ return "Champs de données";
}
- virtual QCString trStaticPrivateAttribs()
+ else
{
- return "Attributs privés statiques";
+ return "Attributs publics";
}
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Attributs publics statiques";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Types protégés";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Attributs protégés";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Attributs protégés statiques";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Types privés";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Attributs privés";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Attributs privés statiques";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.1.3
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
/*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "A faire";
- }
+ virtual QCString trTodo()
+ {
+ return "A faire";
+ }
/*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Liste des choses à faire";
- }
+ virtual QCString trTodoList()
+ {
+ return "Liste des choses à faire";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.1.4
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
- virtual QCString trReferencedBy()
- {
- return "Référencé par";
- }
- virtual QCString trRemarks()
- {
- return "Remarques";
- }
- virtual QCString trAttention()
- {
- return "Attention";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Ce graphe montre quels fichiers incluent directement "
+ virtual QCString trReferencedBy()
+ {
+ return "Référencé par";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Remarques";
+ }
+ virtual QCString trAttention()
+ {
+ return "Attention";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Ce graphe montre quels fichiers incluent directement "
"ou indirectement ce fichier :";
- }
- virtual QCString trSince()
- {
- return "Depuis";
- }
+ }
+ virtual QCString trSince()
+ {
+ return "Depuis";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.1.5
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
/*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Légende du graphe";
- }
+ virtual QCString trLegendTitle()
+ {
+ return "Légende du graphe";
+ }
/*! page explaining how the dot graph's should be interpreted
* The %A in the text below are to prevent link to classes called "A".
*/
- virtual QCString trLegendDocs()
- {
- return
- "Cette page explique comment interpréter les graphes générés "
- "par doxygen.<p>\n"
- "Considérez l'exemple suivant :\n"
- "\\code\n"
- "/*! Classe invisible à cause d'une troncature */\n"
- "class Invisible { };\n\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"
- "class Undocumented { };\n\n"
- "/*! Classe dérivée par héritage public */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Un modèle de classe */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Classe dérivée par héritage protégé */\n"
- "class ProtectedBase { };\n\n"
- "/*! Classe dérivée par héritage privé */\n"
- "class PrivateBase { };\n\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"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented,\n"
- " public Templ<int>\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Cela aboutira au graphe suivant :"
- "<p><center><img alt=\"\" src=\"graph_legend."+getDotImageExtension()+"\"></center></p>\n"
- "<p>\n"
- "Les rectangles du graphe ci-dessus ont la signification suivante :\n"
- "<ul>\n"
- "<li>Un rectangle plein noir représente la structure ou la classe pour laquelle "
- "le graphe est généré.\n"
- "<li>Un rectangle avec un bord noir indique une classe ou une structure documentée.\n"
- "<li>Un rectangle avec un bord gris indique une classe ou une structure non documentée.\n"
- "<li>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 n'entre pas dans les limites spécifiées."
- "</ul>\n"
- "Les flèches ont la signification suivante :\n"
- "<ul>\n"
- "<li>Une flèche bleu foncé est utilisée pour visualiser une relation d'héritage publique "
- "entre deux classes.\n"
- "<li>Une flèche vert foncé est utilisée pour une relation d'héritage protégée.\n"
- "<li>Une flèche rouge foncé est utilisée pour une relation d'héritage privée.\n"
- "<li>Une flèche violette en pointillés est utilisée si une classe est contenue ou "
- "utilisée par une autre classe. La flèche est étiquetée avec la ou les variable(s) "
- "qui permettent d'accéder à la classe ou structure pointée. \n"
- "<li>Une flèche jaune en pointillés indique une relation entre un modèle d'instance et "
- "le modèle de classe duquel il est instancié. La flèche est étiquetée avec "
- "les paramètres de modèle de l'instance.\n"
- "</ul>\n";
- }
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Cette page explique comment interpréter les graphes générés "
+ "par doxygen.<p>\n"
+ "Considérez l'exemple suivant :\n"
+ "\\code\n"
+ "/*! Classe invisible à cause d'une troncature */\n"
+ "class Invisible { };\n\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"
+ "class Undocumented { };\n\n"
+ "/*! Classe dérivée par héritage public */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Un modèle de classe */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Classe dérivée par héritage protégé */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Classe dérivée par héritage privé */\n"
+ "class PrivateBase { };\n\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"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Cela aboutira au graphe suivant :"
+ "<p><center><img alt=\"\" src=\"graph_legend."+getDotImageExtension()+"\"></center></p>\n"
+ "<p>\n"
+ "Les rectangles du graphe ci-dessus ont la signification suivante :\n"
+ "<ul>\n"
+ "<li>Un rectangle plein noir représente la structure ou la classe pour laquelle "
+ "le graphe est généré.\n"
+ "<li>Un rectangle avec un bord noir indique une classe ou une structure documentée.\n"
+ "<li>Un rectangle avec un bord gris indique une classe ou une structure non documentée.\n"
+ "<li>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 n'entre pas dans les limites spécifiées."
+ "</ul>\n"
+ "Les flèches ont la signification suivante :\n"
+ "<ul>\n"
+ "<li>Une flèche bleu foncé est utilisée pour visualiser une relation d'héritage publique "
+ "entre deux classes.\n"
+ "<li>Une flèche vert foncé est utilisée pour une relation d'héritage protégée.\n"
+ "<li>Une flèche rouge foncé est utilisée pour une relation d'héritage privée.\n"
+ "<li>Une flèche violette en pointillés est utilisée si une classe est contenue ou "
+ "utilisée par une autre classe. La flèche est étiquetée avec la ou les variable(s) "
+ "qui permettent d'accéder à la classe ou structure pointée. \n"
+ "<li>Une flèche jaune en pointillés indique une relation entre un modèle d'instance et "
+ "le modèle de classe duquel il est instancié. La flèche est étiquetée avec "
+ "les paramètres de modèle de l'instance.\n"
+ "</ul>\n";
+ }
/*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "légende";
- }
+ virtual QCString trLegend()
+ {
+ return "légende";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.0
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
/*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
/*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Liste des tests";
- }
+ virtual QCString trTestList()
+ {
+ return "Liste des tests";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.2
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
/*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Propriétés";
- }
+ virtual QCString trProperties()
+ {
+ return "Propriétés";
+ }
/*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Documentation des propriétés";
- }
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Documentation des propriétés";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.4
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
/*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
+ virtual QCString trClasses()
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
{
- if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
- {
- return "Structures de données";
- }
- else
- {
- return "Classes";
- }
+ return "Structures de données";
}
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
+ else
{
- return (QCString)"Paquetage "+name;
+ return "Classes";
}
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paquetage "+name;
+ }
/*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Liste des paquetages";
- }
+ virtual QCString trPackageList()
+ {
+ return "Liste des paquetages";
+ }
/*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Liste des paquetages avec une brève description (si disponible) :";
- }
+ virtual QCString trPackageListDescription()
+ {
+ 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()
- {
- return "Paquetages";
- }
+ virtual QCString trPackages()
+ {
+ return "Paquetages";
+ }
/*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Valeur :";
- }
+ virtual QCString trDefineValue()
+ {
+ return "Valeur :";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.5
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
/*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bogue";
- }
+ virtual QCString trBug()
+ {
+ return "Bogue";
+ }
/*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Liste des bogues";
- }
+ virtual QCString trBugList()
+ {
+ return "Liste des bogues";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.6
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
/*! Used as ansicpg for RTF file
*
@@ -1226,256 +1242,256 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
* </pre>
*
*/
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
/*! Used as ansicpg for RTF fcharset
* \see trRTFansicp() for a table of possible values.
*/
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
/*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Index";
- }
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Index";
+ }
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
- virtual QCString trClass(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Classe" : "classe"));
- if (!singular) result+="s";
- return result;
- }
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Classe" : "classe"));
+ if (!singular) result+="s";
+ return result;
+ }
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
- virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Fichier" : "fichier"));
- if (!singular) result+="s";
- return result;
- }
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Fichier" : "fichier"));
+ if (!singular) result+="s";
+ return result;
+ }
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Espace" : "espace"));
- if (!singular) result+="s";
- result+=" de nommage";
- return result;
- }
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Espace" : "espace"));
+ if (!singular) result+="s";
+ result+=" de nommage";
+ return result;
+ }
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Groupe" : "groupe"));
- if (!singular) result+="s";
- return result;
- }
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Groupe" : "groupe"));
+ if (!singular) result+="s";
+ return result;
+ }
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Page" : "page"));
- if (!singular) result+="s";
- return result;
- }
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Page" : "page"));
+ if (!singular) result+="s";
+ return result;
+ }
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
- virtual QCString trMember(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Membre" : "membre"));
- if (!singular) result+="s";
- return result;
- }
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Membre" : "membre"));
+ if (!singular) result+="s";
+ return result;
+ }
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Globa" : "globa"));
- if (!singular) result+="ux(ales)"; else result+="l(e)";
- return result;
- }
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Globa" : "globa"));
+ if (!singular) result+="ux(ales)"; else result+="l(e)";
+ return result;
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.7
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
/*! This text is generated when the \\author command is used and
* for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Auteur" : "auteur"));
- if (!singular) result+="s";
- return result;
- }
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Auteur" : "auteur"));
+ if (!singular) result+="s";
+ return result;
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.11
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
/*! This text is put before the list of members referenced by a member
*/
- virtual QCString trReferences()
- {
- return "Références";
- }
+ virtual QCString trReferences()
+ {
+ return "Références";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.13
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
/*! used in member documentation blocks to produce a list of
* members that are implemented by this one.
*/
- virtual QCString trImplementedFromList(int numEntries)
- {
- return "Implémente "+trWriteList(numEntries)+".";
- }
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implémente "+trWriteList(numEntries)+".";
+ }
/*! used in member documentation blocks to produce a list of
* all members that implement this abstract member.
*/
- virtual QCString trImplementedInList(int numEntries)
- {
- return "Implémenté dans "+trWriteList(numEntries)+".";
- }
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implémenté dans "+trWriteList(numEntries)+".";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.16
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
/*! used in RTF documentation as a heading for the Table
* of Contents.
*/
- virtual QCString trRTFTableOfContents()
- {
- return "Table des matières";
- }
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Table des matières";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.17
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
/*! Used as the header of the list of item that have been
* flagged deprecated
*/
- virtual QCString trDeprecatedList()
- {
- return "Liste des éléments obsolètes";
- }
+ virtual QCString trDeprecatedList()
+ {
+ return "Liste des éléments obsolètes";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.18
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
/*! Used as a header for declaration section of the events found in
* a C# program
*/
- virtual QCString trEvents()
- {
- return "Événements";
- }
+ virtual QCString trEvents()
+ {
+ return "Événements";
+ }
/*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Documentation des événements";
- }
+ virtual QCString trEventDocumentation()
+ {
+ return "Documentation des événements";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.3
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
/*! Used as a heading for a list of Java class types with package scope.
*/
- virtual QCString trPackageTypes()
- {
- return "Types de paquetage";
- }
+ virtual QCString trPackageTypes()
+ {
+ return "Types de paquetage";
+ }
/*! Used as a heading for a list of Java class functions with package
* scope.
*/
- virtual QCString trPackageMembers()
- {
- return "Fonctions de paquetage";
- }
+ virtual QCString trPackageMembers()
+ {
+ return "Fonctions de paquetage";
+ }
/*! Used as a heading for a list of static Java class functions with
* package scope.
*/
- virtual QCString trStaticPackageMembers()
- {
- return "Fonctions statiques de paquetage";
- }
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Fonctions statiques de paquetage";
+ }
/*! Used as a heading for a list of Java class variables with package
* scope.
*/
- virtual QCString trPackageAttribs()
- {
- return "Attributs de paquetage";
- }
+ virtual QCString trPackageAttribs()
+ {
+ return "Attributs de paquetage";
+ }
/*! Used as a heading for a list of static Java class variables with
* package scope.
*/
- virtual QCString trStaticPackageAttribs()
- {
- return "Attributs statiques de paquetage";
- }
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Attributs statiques de paquetage";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.3.1
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
/*! Used in the quick index of a class/file/namespace member list page
* to link to the unfiltered list of all members.
*/
- virtual QCString trAll()
- {
- return "Tout";
- }
+ virtual QCString trAll()
+ {
+ return "Tout";
+ }
/*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Voici le graphe d'appel pour cette fonction :";
- }
+ virtual QCString trCallGraph()
+ {
+ return "Voici le graphe d'appel pour cette fonction :";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.3.3
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
/*! This string is used as the title for the page listing the search
* results.
*/
- virtual QCString trSearchResultsTitle()
- {
- return "Résultats de la recherche";
- }
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Résultats de la recherche";
+ }
/*! This string is put just before listing the search results. The
* text can be different depending on the number of documents found.
* Inside the text you can put the special marker $num to insert
@@ -1484,104 +1500,104 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
* value 2 represents 2 or more matches. HTML markup is allowed inside
* the returned string.
*/
- virtual QCString trSearchResults(int numDocuments)
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Désolé, aucun document ne correspond à votre requête.";
+ }
+ else if (numDocuments==1)
{
- if (numDocuments==0)
- {
- return "Désolé, aucun document ne correspond à votre requête.";
- }
- else if (numDocuments==1)
- {
- return "Trouvé <b>1</b> document correspondant à votre requête.";
- }
- else
- {
- return "Trouvé <b>$num</b> documents correspondant à votre requête. "
+ return "Trouvé <b>1</b> document correspondant à votre requête.";
+ }
+ else
+ {
+ return "Trouvé <b>$num</b> documents correspondant à votre requête. "
"Classé par ordre de pertinence décroissant.";
- }
}
+ }
/*! This string is put before the list of matched words, for each search
* result. What follows is the list of words that matched the query.
*/
- virtual QCString trSearchMatches()
- {
- return "Correspondances :";
- }
+ virtual QCString trSearchMatches()
+ {
+ return "Correspondances :";
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.3.8
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
- /*! This is used in HTML as the title of page with source code for file filename
- */
- virtual QCString trSourceFile(QCString& filename)
- {
- return " Fichier source de " + filename;
- }
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return " Fichier source de " + filename;
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.3.9
- //////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Hiérarchie de répertoires"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Documentation des répertoires"; }
-
- /*! This is used as the title of the directory index and also in the
- * Quick links of a HTML page, to link to the directory hierarchy.
- */
- virtual QCString trDirectories()
- { return "Répertoires"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Cette hiérarchie de répertoire est triée approximativement, "
- "mais pas complètement, par ordre alphabétique :";
- }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
- /*! This returns the title of a directory page. The name of the
- * directory is passed via \a dirName.
- */
- virtual QCString trDirReference(const char *dirName)
- { QCString result="Répertoire de référence de "; result+=dirName; return result; }
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Hiérarchie de répertoires"; }
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Répertoire" : "répertoire"));
- if (singular) result+=""; else result+="s";
- return result;
- }
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Documentation des répertoires"; }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.4.1
- //////////////////////////////////////////////////////////////////////////
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Répertoires"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Cette hiérarchie de répertoire est triée approximativement, "
+ "mais pas complètement, par ordre alphabétique :";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result="Répertoire de référence de "; result+=dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in singular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Répertoire" : "répertoire"));
+ if (singular) result+=""; else result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
/*! This text is added to the documentation when the \\overload command
* is used for a overloaded function.
*/
- virtual QCString trOverloadText()
- {
- return "Ceci est une fonction membre surchargée, "
+ virtual QCString trOverloadText()
+ {
+ return "Ceci est une fonction membre surchargée, "
"proposée par commodité. Elle diffère de la fonction "
"ci-dessus uniquement par le(s) argument(s) qu'elle accepte.";
- }
+ }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.4.6
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
/*! This is used to introduce a caller (or called-by) graph */
virtual QCString trCallerGraph()
@@ -1595,9 +1611,9 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
virtual QCString trEnumerationValueDocumentation()
{ return "Documentation des énumérations"; }
- //////////////////////////////////////////////////////////////////////////
- // new since 1.5.4 (mainly for Fortran)
- //////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
/*! header that is put before the list of member subprograms (Fortran). */
virtual QCString trMemberFunctionDocumentationFortran()
@@ -1832,7 +1848,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
}
//////////////////////////////////////////////////////////////////////////
-// new since 1.6.3
+// new since 1.6.3 (missing items for the directory pages)
//////////////////////////////////////////////////////////////////////////
/*! when clicking a directory dependency label, a page with a
@@ -1990,14 +2006,6 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
return "Documentation des méthodes";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Vue d'ensemble";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2269,20 +2277,23 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
}
virtual QCString trCompoundReferenceSlice(const char *clName, ClassDef::CompoundType compType, bool isLocal)
{
- QCString result = "Référence de ";
-
+ QCString result = "Référence ";
+ bool feminine = true;
switch(compType)
{
- case ClassDef::Class: result+="la classe "; break;
- case ClassDef::Struct: result+="la structure "; break;
- case ClassDef::Interface: result+="l'interface "; break;
- case ClassDef::Exception: result+="l'exception "; break;
+ case ClassDef::Class: result+="de la classe "; break;
+ case ClassDef::Struct: result+="de la structure "; break;
+ case ClassDef::Union: result+="de l'union "; break;
+ case ClassDef::Interface: result+="de l'interface "; break;
+ case ClassDef::Protocol: result+="du protocole "; feminine=false; break;
+ case ClassDef::Category: result+="de la catégorie "; break;
+ case ClassDef::Exception: result+="de l'exception "; break;
default: break;
}
if(isLocal)
{
- result += "locale ";
+ result += (feminine) ? "locale " : "local ";
}
result += (QCString)clName;
@@ -2306,8 +2317,6 @@ class TranslatorFrench : public TranslatorAdapter_1_8_15
return "Documentation des champs de données";
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_gr.h b/src/translator_gr.h
index 6ed43db..a0511b7 100644
--- a/src/translator_gr.h
+++ b/src/translator_gr.h
@@ -36,9 +36,9 @@
exception -> εξαίρεση
namespace -> χώρος ονομάτων
enumeration -> απαρίθμηση
-*/
-
-
+*/
+
+
#ifndef TRANSLATOR_GR_H
#define TRANSLATOR_GR_H
@@ -59,8 +59,23 @@ class TranslatorGreek : public TranslatorAdapter_1_8_15
virtual QCString latexLanguageSupportCommand()
{
- return "\\usepackage[greek,english]{babel}\n"
- "\\usepackage{alphabeta}\n";
+ return "\\usepackage{fontspec}\n"
+ "\\usepackage[greek]{babel}\n";
+ }
+
+ virtual QCString trISOLang()
+ {
+ return "el";
+ }
+
+ virtual QCString latexFontenc()
+ {
+ return "";
+ }
+ virtual QCString latexFont()
+ {
+ return "\\setmainfont{Libertinus Sans}\n"
+ "\\setmonofont{Courier New}\n";
}
// --- Language translation methods -------------------
@@ -232,6 +247,10 @@ class TranslatorGreek : public TranslatorAdapter_1_8_15
{
return "Ακολουθούν οι δομές δεδομένων με σύντομες περιγραφές:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Ακολουθούν οι κλάσεις με σύντομες περιγραφές:";
+ }
else
{
return "Ακολουθούν οι κλάσεις, οι δομές, "
@@ -1159,6 +1178,16 @@ class TranslatorGreek : public TranslatorAdapter_1_8_15
return "1253";
}
+ virtual QCString latexCommandName()
+ {
+ QCString latex_command = Config_getString(LATEX_CMD_NAME);
+ if (latex_command.isEmpty()) latex_command = "latex";
+ if (Config_getBool(USE_PDFLATEX))
+ {
+ if (latex_command == "latex") latex_command = "xelatex";
+ }
+ return latex_command;
+ }
/*! Used as ansicpg for RTF fcharset
*/
@@ -1916,14 +1945,6 @@ class TranslatorGreek : public TranslatorAdapter_1_8_15
return "Τεκμηρίωση Μεθόδου";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Επισκόπηση σχεδίασης";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -1980,6 +2001,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_15
return result;
}
+
};
#endif
diff --git a/src/translator_hr.h b/src/translator_hr.h
index 1d17e2a..3f9f492 100644
--- a/src/translator_hr.h
+++ b/src/translator_hr.h
@@ -92,6 +92,8 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
{ return "croatian"; }
QCString latexLanguageSupportCommand()
{ return "\\usepackage[croatian]{babel}\n"; }
+ QCString trISOLang()
+ { return "hr"; }
QCString trRelatedFunctions()
{ return "Povezane funkcije"; }
QCString trRelatedSubscript()
@@ -1567,8 +1569,6 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
virtual QCString trAdditionalInheritedMembers()
{ return "Dodatni naslijeđeni članovi"; }
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_hu.h b/src/translator_hu.h
index 44363c9..ae2e169 100644
--- a/src/translator_hu.h
+++ b/src/translator_hu.h
@@ -100,6 +100,11 @@ class TranslatorHungarian : public TranslatorAdapter_1_8_15
"\\usepackage[magyar]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "hu";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -271,6 +276,10 @@ class TranslatorHungarian : public TranslatorAdapter_1_8_15
{
return "Az összes adatszerkezet listája rövid leírásokkal:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Az összes osztály listája rövid leírásokkal:";
+ }
else
{
return "Az összes osztály, struktúra, unió és interfész "
@@ -1955,14 +1964,6 @@ class TranslatorHungarian : public TranslatorAdapter_1_8_15
return "Metódus dokumentáció";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Dizájn áttekintés";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2020,9 +2021,6 @@ class TranslatorHungarian : public TranslatorAdapter_1_8_15
result+="lett létrehozva:";
return result;
}
-
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_id.h b/src/translator_id.h
index 2039c76..4b5626a 100644
--- a/src/translator_id.h
+++ b/src/translator_id.h
@@ -58,6 +58,11 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
return "\\usepackage[bahasa]{babel}";
}
+ virtual QCString trISOLang()
+ {
+ return "id";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -229,6 +234,10 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
{
return "Berikut ini daftar struktur data, dengan penjelasan singkat:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Berikut ini daftar kelas, dengan penjelasan singkat:";
+ }
else
{
return "Berikut ini daftar kelas, struct, union, dan interface, dengan penjelasan singkat:";
diff --git a/src/translator_it.h b/src/translator_it.h
index 9638a01..4b12dae 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -112,6 +112,11 @@ class TranslatorItalian : public TranslatorAdapter_1_8_15
return "\\usepackage[italian]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "it";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -286,6 +291,10 @@ class TranslatorItalian : public TranslatorAdapter_1_8_15
{
return "Queste sono le strutture dati con una loro breve descrizione:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Queste sono le classi con una loro breve descrizione:";
+ }
else
{
return "Queste sono le classi, le struct, le union e le interfacce con una loro breve descrizione:";
@@ -1912,14 +1921,6 @@ class TranslatorItalian : public TranslatorAdapter_1_8_15
return "Documentazione dei metodi";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Panoramica del progetto";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -1976,8 +1977,6 @@ class TranslatorItalian : public TranslatorAdapter_1_8_15
return result;
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_je.h b/src/translator_je.h
index d555421..66ee178 100644
--- a/src/translator_je.h
+++ b/src/translator_je.h
@@ -62,6 +62,11 @@ class TranslatorJapaneseEn : public TranslatorEnglish
{
return "128";
}
+
+ virtual QCString trISOLang()
+ {
+ return "ja";
+ }
};
#endif
diff --git a/src/translator_jp.h b/src/translator_jp.h
index fc0d65d..7985823 100644
--- a/src/translator_jp.h
+++ b/src/translator_jp.h
@@ -79,6 +79,10 @@ class TranslatorJapanese : public TranslatorAdapter_1_8_15
{
return "\\usepackage{CJKutf8}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "ja";
+ }
virtual QCString latexFontenc()
{
return "";
@@ -158,7 +162,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_8_15
/*! this is the remainder of the sentence after the class name */
virtual QCString trIncludingInheritedMembers()
{ return " の全メンバ一覧です。"; }
- /* trThisIsTheListOfAllMembers から続くように定義すること */
+ /* trThisIsTheListOfAllMembers から続くように定義すること */
/*! this is put at the author sections at the bottom of man pages.
* parameter s is name of the project name.
@@ -268,7 +272,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_8_15
}
return "詳解が付けられているファイルの一覧です。";
}
-
+
/*! This is an introduction to the annotated compound list. */
virtual QCString trCompoundListDescription()
@@ -844,7 +848,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_8_15
{
return "非推奨";
}
-
+
/*! this text is put before a collaboration diagram */
virtual QCString trCollaborationDiagram(const char *clName)
{
@@ -1851,7 +1855,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_8_15
/*! Used file list for a Java enum */
virtual QCString trEnumGeneratedFromFiles(bool)
- {
+ {
return "次のファイルからこの列挙についての詳解を抽出しました:";
}
@@ -1879,7 +1883,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_8_15
*/
virtual QCString trPanelSynchronisationTooltip(bool enable)
{
-
+
QCString opt = enable ? "有効" : "無効";
return "クリックで同期表示が"+opt+"になります";
}
@@ -1925,14 +1929,6 @@ class TranslatorJapanese : public TranslatorAdapter_1_8_15
return "メソッド詳解";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "デザイン概観";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -1985,8 +1981,6 @@ class TranslatorJapanese : public TranslatorAdapter_1_8_15
"の詳解を抽出しました:";
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_ke.h b/src/translator_ke.h
index c9f488c..2dda941 100644
--- a/src/translator_ke.h
+++ b/src/translator_ke.h
@@ -59,6 +59,11 @@ class TranslatorKoreanEn : public TranslatorEnglish
{
return "129";
}
+
+ virtual QCString trISOLang()
+ {
+ return "ko";
+ }
};
#endif
diff --git a/src/translator_kr.h b/src/translator_kr.h
index fb1c356..dda8f6e 100644
--- a/src/translator_kr.h
+++ b/src/translator_kr.h
@@ -98,6 +98,10 @@ class TranslatorKorean : public TranslatorAdapter_1_8_15
}
return latex_command;
}
+ virtual QCString trISOLang()
+ {
+ return "ko";
+ }
// --- Language translation methods -------------------
@@ -1948,14 +1952,6 @@ class TranslatorKorean : public TranslatorAdapter_1_8_15
return "메소드 문서화";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "디자인 개요";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2012,8 +2008,6 @@ class TranslatorKorean : public TranslatorAdapter_1_8_15
return result;
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_lt.h b/src/translator_lt.h
index f47d9d4..1be20d2 100644
--- a/src/translator_lt.h
+++ b/src/translator_lt.h
@@ -65,6 +65,11 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
"\\usepackage[lithuanian]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "lt";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -236,6 +241,10 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
{
return "Duomenų struktūros su trumpais aprašymais:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Klasės su trumpais aprašymais:";
+ }
else
{
return "Klasės, struktūros, "
diff --git a/src/translator_lv.h b/src/translator_lv.h
index bd579da..8dcc45b 100644
--- a/src/translator_lv.h
+++ b/src/translator_lv.h
@@ -80,6 +80,11 @@ class TranslatorLatvian : public TranslatorAdapter_1_8_4
"\\usepackage[latvian]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "lv";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -251,6 +256,10 @@ class TranslatorLatvian : public TranslatorAdapter_1_8_4
{
return "Šeit ir visas datu struktūras ar īsu aprakstu:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Šeit ir visas klases ar īsu aprakstu:";
+ }
else
{
return "Šeit ir visas klases, struktūras, "
@@ -1944,8 +1953,6 @@ class TranslatorLatvian : public TranslatorAdapter_1_8_4
return "Dizaina pārskats";
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_mk.h b/src/translator_mk.h
index 3fc046e..97a55dc 100644
--- a/src/translator_mk.h
+++ b/src/translator_mk.h
@@ -65,6 +65,10 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
{
return "\\usepackage[macedonian]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "mk";
+ }
// --- Language translation methods -------------------
@@ -232,6 +236,10 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
{
return "Список на структури со кратки описи:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Список на класи со кратки описи:";
+ }
else
{
return "Список на класи, структури, унии и интерфејси "
@@ -1718,6 +1726,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
{
return "Ограничувања на Тип";
}
+
};
#endif
diff --git a/src/translator_nl.h b/src/translator_nl.h
index 7cecc7d..413d353 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -35,9 +35,9 @@ class TranslatorDutch : public Translator
* </pre>
*/
QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[dutch]{babel}\n";
- }
+ { return "\\usepackage[dutch]{babel}\n"; }
+ QCString trISOLang()
+ { return "nl"; }
QCString trRelatedFunctions()
{ return "Gerelateerde functies"; }
QCString trRelatedSubscript()
@@ -111,8 +111,22 @@ class TranslatorDutch : public Translator
return result;
}
QCString trCompoundListDescription()
- { return "Hieronder volgen de klassen, structs en "
- "unions met voor elk een korte beschrijving:";
+ {
+ if (Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
+ {
+ return "Hieronder volgen de structs "
+ "met voor elk een korte beschrijving:";
+ }
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Hieronder volgen de klassen "
+ "met voor elk een korte beschrijving:";
+ }
+ else
+ {
+ return "Hieronder volgen de klassen, structs en "
+ "unions met voor elk een korte beschrijving:";
+ }
}
QCString trCompoundMembersDescription(bool extractAll)
{
@@ -1530,14 +1544,6 @@ class TranslatorDutch : public Translator
return "Methode Documentatie";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Ontwerp Overzicht";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -1784,7 +1790,12 @@ class TranslatorDutch : public Translator
{ return "Data members"; }
virtual QCString trDataMemberDocumentation()
{ return "Documentatie van data members"; }
- //////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.19
+//////////////////////////////////////////////////////////////////////////
+ virtual QCString trDesignUnitDocumentation()
+ { return "Ontwerp Eenheid Documentatie"; }
};
#endif
diff --git a/src/translator_no.h b/src/translator_no.h
index eccd952..dee96d0 100644..100755
--- a/src/translator_no.h
+++ b/src/translator_no.h
@@ -75,6 +75,11 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
"\\usepackage[norsk]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "nn";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -250,6 +255,10 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
{
return "Her er datastrukturene med korte beskrivelser:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Her er klasser med korte beskrivelser:";
+ }
else
{
return "Her er klasser, struct'er, "
@@ -1563,6 +1572,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
"generert for deg. Den skiller seg ut fra "
"funksjonen ovenfor i argument(ene) den aksepterer.";
}
+
};
#endif
diff --git a/src/translator_pl.h b/src/translator_pl.h
index e0ecc8f..86bc72b 100644
--- a/src/translator_pl.h
+++ b/src/translator_pl.h
@@ -54,6 +54,11 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
*/
}
+ virtual QCString trISOLang()
+ {
+ return "pl";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -229,6 +234,10 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
{
return "Tutaj znajdują się struktury danych wraz z ich krótkimi opisami:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Tutaj znajdują się klasy wraz z ich krótkimi opisami:";
+ }
else
{
return "Tutaj znajdują się klasy, struktury, "
@@ -1866,8 +1875,6 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
virtual QCString trAdditionalInheritedMembers()
{ return "Dodatkowe Dziedziczone Składowe"; }
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_pt.h b/src/translator_pt.h
index 970cf45..3456aad 100644
--- a/src/translator_pt.h
+++ b/src/translator_pt.h
@@ -59,7 +59,7 @@
#define TRANSLATOR_PT_H
-class TranslatorPortuguese : public Translator
+class TranslatorPortuguese : public TranslatorAdapter_1_8_19
{
public:
@@ -94,6 +94,11 @@ class TranslatorPortuguese : public Translator
"\\usepackage[portuges]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "pt";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -262,6 +267,10 @@ class TranslatorPortuguese : public Translator
{
return "Lista das estruturas de dados com uma breve descrição:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Lista de classes com uma breve descrição:";
+ }
else
{
return "Lista de classes, estruturas, uniões e interfaces com uma breve descrição:";
@@ -1945,15 +1954,6 @@ class TranslatorPortuguese : public Translator
return "Documentação do método";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- // I'm not sure how to accurately translate it
- return "Visão geral do design";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2272,7 +2272,6 @@ class TranslatorPortuguese : public Translator
return "Dados Membros";
}
-//////////////////////////////////////////////////////////////////////////
};
diff --git a/src/translator_ro.h b/src/translator_ro.h
index 6f0c197..01765a6 100644
--- a/src/translator_ro.h
+++ b/src/translator_ro.h
@@ -74,6 +74,10 @@ class TranslatorRomanian : public TranslatorAdapter_1_8_15
{
return "\\usepackage[romanian]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "ro";
+ }
// --- Language translation methods -------------------
@@ -250,6 +254,10 @@ class TranslatorRomanian : public TranslatorAdapter_1_8_15
{
return "Lista structurilor de date, cu scurte descrieri:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Lista claselor, cu scurte descrieri:";
+ }
else
{
return "Lista claselor, structurilor, uniunilor şi interfeţelor"
@@ -1943,14 +1951,6 @@ class TranslatorRomanian : public TranslatorAdapter_1_8_15
return "Documentația Metodelor";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Vedere de Ansamblu a Designului";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2013,8 +2013,6 @@ class TranslatorRomanian : public TranslatorAdapter_1_8_15
return result;
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_ru.h b/src/translator_ru.h
index 9d92888..3e3f7dc 100644
--- a/src/translator_ru.h
+++ b/src/translator_ru.h
@@ -35,9 +35,10 @@ class TranslatorRussian : public TranslatorAdapter_1_8_15
/* Used to get the command(s) for the language support. */
virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[T2A]{fontenc}\n\\usepackage[russian]{babel}\n";
- }
+ { return "\\usepackage[T2A]{fontenc}\n\\usepackage[russian]{babel}\n"; }
+
+ virtual QCString trISOLang()
+ { return "ru"; }
// --- Language translation methods -------------------
@@ -211,6 +212,10 @@ class TranslatorRussian : public TranslatorAdapter_1_8_15
{
return "Структуры данных с их кратким описанием.";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Классы с их кратким описанием.";
+ }
else
{
return "Классы с их кратким описанием.";
@@ -1904,14 +1909,6 @@ class TranslatorRussian : public TranslatorAdapter_1_8_15
return "Документация метода";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Обзор дизайна";
- }
-
///////////////////////////////////////////////////////////////////////
// new since 1.8.4
///////////////////////////////////////////////////////////////////////
@@ -1967,8 +1964,6 @@ class TranslatorRussian : public TranslatorAdapter_1_8_15
if (single) result+="а:"; else result+="ов:";
return result;
}
-
-///////////////////////////////////////////////////////////////////////
};
#endif
diff --git a/src/translator_sc.h b/src/translator_sc.h
index e8191df..b8b5b42 100644
--- a/src/translator_sc.h
+++ b/src/translator_sc.h
@@ -72,12 +72,16 @@ class TranslatorSerbianCyrillic : public TranslatorAdapter_1_6_0
virtual QCString latexLanguageSupportCommand()
{
return "\\usepackage[T2A]{fontenc}\n"
- "\\usepackage[russian]{babel}\n";
+ "\\usepackage[serbianc]{babel}\n";
}
virtual QCString latexFontenc()
{
return "";
}
+ virtual QCString trISOLang()
+ {
+ return "sr-Cyrl";
+ }
// --- Language translation methods -------------------
@@ -250,6 +254,10 @@ class TranslatorSerbianCyrillic : public TranslatorAdapter_1_6_0
{
return "Овде су структуре са кратким описима:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Овде су класе са кратким описима:";
+ }
else
{
return "Овде су класе, структуре, "
diff --git a/src/translator_si.h b/src/translator_si.h
index 2dd7e5b..5a03a71 100644
--- a/src/translator_si.h
+++ b/src/translator_si.h
@@ -35,9 +35,9 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6
* method is used to generate the command for using the babel package.
*/
QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[slovene]{babel}\n";
- }
+ { return "\\usepackage[slovene]{babel}\n"; }
+ QCString trISOLang()
+ { return "sl"; }
QCString trRelatedFunctions()
{ return "Povezane funkcije"; }
QCString trRelatedSubscript()
@@ -1207,6 +1207,7 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6
"podana je zaradi priročnosti. Metoda se od predhodnje razlikuje "
"samo v številu in/ali tipu formalnih argumentov.";
}
+
};
#endif
diff --git a/src/translator_sk.h b/src/translator_sk.h
index 9ee8252..1e5d258 100644
--- a/src/translator_sk.h
+++ b/src/translator_sk.h
@@ -49,6 +49,10 @@ class TranslatorSlovak : public TranslatorAdapter_1_8_15
"\\xpatchparametertext\\@cline{-}{\\cA-}{}{}\n"
"\\makeatother\n";
}
+ virtual QCString trISOLang()
+ {
+ return "sk";
+ }
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -1907,14 +1911,6 @@ class TranslatorSlovak : public TranslatorAdapter_1_8_15
return "Dokumentácia metódy";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Návrhová schéma";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -1971,7 +1967,6 @@ class TranslatorSlovak : public TranslatorAdapter_1_8_15
return result;
}
-//////////////////////////////////////////////////////////////////////////
};
#endif // TRANSLATOR_SK_H
diff --git a/src/translator_sr.h b/src/translator_sr.h
index f5f132f..cb080ea 100644
--- a/src/translator_sr.h
+++ b/src/translator_sr.h
@@ -58,6 +58,10 @@ class TranslatorSerbian : public TranslatorAdapter_1_6_0
QCString result="\\usepackage[serbian]{babel}\n";
return result;
}
+ virtual QCString trISOLang()
+ {
+ return "sr-Latn";
+ }
// --- Language translation methods -------------------
@@ -231,6 +235,10 @@ class TranslatorSerbian : public TranslatorAdapter_1_6_0
{
return "Spisak struktura sa kratkim opisima:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Spisak klasa sa kratkim opisima:";
+ }
else
{
return "Spisak klasa, struktura, unija i interfejsa sa kratkim opisima:";
diff --git a/src/translator_sv.h b/src/translator_sv.h
index 5da89df..853e265 100644
--- a/src/translator_sv.h
+++ b/src/translator_sv.h
@@ -23,6 +23,7 @@ Xet Erixon <xet@xeqt.com>
Mikael Hallin <mikaelhallin@yahoo.se> 2003-07-28
Björn Palmqvist <bjorn@aidium.se> 2014-02-01
Magnus Österlund <magnus.osterlund@capgemini.com> 2016-09-12
+Björn Palmqvist <bjorn@aidium.se> 2020-01-08
==================================================================================
Uppdateringar.
1999/04/29
@@ -66,20 +67,46 @@ Problem!
Deprecated: nån hygglig svensk översättning???
Skicka gärna synpunkter.
+
2015/01/09
* Uppdaterat den till senaste versionen 1.8.9.1
+
2015/09/12
* Fixat lite särksirvningar och inkonsekvenser
+
+2020/01/08
+* Uppdaterat den till senaste språkversionen 1.8.15
+
+Bytte ut Deprecated från Föråldrad till Obsolet
+
+VHDL översättningarna är kanske inte perfekta, då jag endast använt de en gång tidigare.
+Jag lämnade use clause orörd, då jag inte hittade en lämplig översättning för den.
+
+English:
+* Updated the language translation to 1.8.15
+
+Changed Deprecated from Föråldrad to Obsolet
+
+The VHDL translations may not perfect, as I only used it once before.
+I left use clause untouched as I didn't find a suitable translation for it.
+
+2020/08/14
+* Uppdaterat översättningarna till 1.8.19
+English:
+* Updated the language translation to 1.8.19
+
===================================================================================
Ordlista
===================================================================================
ENGELSKA SVENSKA
* Attribute Attribut
-* Category Lategori
+* Category Kategori
* Class Klass
* Compound Sammansatt
-* Deprecated Föråldrad
+* Deprecated Obsolet
* Directory Katalog
+* Dictionary Uppslagsverk // Frågan om de är de som menas i de fallet
+* Entity Entitet
* Enum Enum
* Enumeration Egenuppräknande
* Event Händelse
@@ -89,6 +116,7 @@ Problem!
* Function Funktion
* Inherited Ärvd
* Interface Gränssnitt
+* Library Biblotek
* Macro Makro
* Member Medlem
* Member Data Medlemsdata
@@ -103,16 +131,19 @@ Problem!
* Protected Skyddad
* Protocol Protokoll
* Public Publik
+* Record Post // Ge gärna exempel på bättre översättning
* Service Tjänst
* Signal Signal
-* Slot Slot //Ge gärna exempel på bättre översättning
+* Slot Slot // Ge gärna exempel på bättre översättning
* Static Statisk
* Struct Struktur
* Subprogram Underprogram
* Subroutine Subrutin
+* Subtype Undertyp
* Template Mall
* Typedef Typdefinition
* Union Union
+* Unit Enhet // Lämplig översättning i VHDL kontextet?
* Variable Variabel
===================================================================================
*/
@@ -120,7 +151,7 @@ Problem!
#ifndef TRANSLATOR_SE_H
#define TRANSLATOR_SE_H
-class TranslatorSwedish : public TranslatorAdapter_1_8_15
+class TranslatorSwedish : public Translator
{
public:
@@ -146,6 +177,11 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
return "\\usepackage[swedish]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "sv";
+ }
+
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -317,6 +353,10 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
{
return "Här följer datastrukturerna med korta beskrivningar:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Här följer klasserna med korta beskrivningar:";
+ }
else
{
return "Här följer klasserna, strukterna, unionerna och "
@@ -881,7 +921,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
virtual QCString trDeprecated()
{
- return "Föråldrad";
+ return "Obsolet";
}
//////////////////////////////////////////////////////////////////////////
@@ -1041,7 +1081,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
virtual QCString trInclByDepGraph()
{
return "Den här grafen visar vilka filer som direkt eller "
- "indirekt inkluderar denna filen:";
+ "indirekt inkluderar denna filen:";
}
virtual QCString trSince()
{
@@ -1152,7 +1192,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
/*! Used as a section header for IDL properties */
virtual QCString trProperties()
{
- return "Egenskaper";
+ return "Egenskaper";
}
/*! Used as a section header for IDL property documentation */
virtual QCString trPropertyDocumentation()
@@ -1230,8 +1270,8 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
* Charset Name Charset Value(hex) Codepage number
* ------------------------------------------------------
* ANSI_CHARSET 0 (x00) 1252
- * </pre>
- */
+ * </pre>
+ */
virtual QCString trRTFansicp()
{
return "1252";
@@ -1552,7 +1592,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
* and the fact that it is sorted alphabetically per level
*/
virtual QCString trDirDescription()
- { return "Den här katalogen är grovt sorterad, "
+ { return "Den här katalogen är grovt sorterad, "
"men inte helt, i alfabetisk ordning:";
}
@@ -1952,7 +1992,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
*/
virtual QCString trPanelSynchronisationTooltip(bool enable)
{
- QCString opt = enable ? "aktivera" : "inaktivera";
+ QCString opt = enable ? "aktivera" : "inaktivera";
return "klicka för att "+opt+" panelsynkronisering";
}
@@ -1997,14 +2037,6 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
return "Metoddokumentation";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "Designöversikt";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -2055,13 +2087,272 @@ class TranslatorSwedish : public TranslatorAdapter_1_8_15
virtual QCString trSingletonGeneratedFromFiles(bool single)
{
// single is true implies a single file
- QCString result=(QCString)"Dokumentationen för denna singleton"
+ QCString result=(QCString)"Dokumentationen för denna singleton "
"genererades från följande fil";
if (single) result+=":"; else result+="er:";
return result;
}
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.15
+//////////////////////////////////////////////////////////////////////////
-};
+ /** VHDL design unit hierarchy */
+ virtual QCString trDesignUnitHierarchy()
+ { return "Designenhetshirarki"; }
+ /** VHDL design unit list */
+ virtual QCString trDesignUnitList()
+ { return "Designenhetslista"; }
+ /** VHDL design unit members */
+ virtual QCString trDesignUnitMembers()
+ { return "Designenhetsmedlemmar"; }
+ /** VHDL design unit list description
+ * Orginal: Here is a list of all design unit members with links to
+ * the Entities they belong to:
+ */
+ virtual QCString trDesignUnitListDescription()
+ {
+ return "Här är en lista av alla designenhetsmedlemmar med länkar till "
+ "entiteterna som de hör till:";
+ }
+ /** VHDL design unit index */
+ virtual QCString trDesignUnitIndex()
+ { return "Designenhetsindex"; }
+ /** VHDL design units */
+ virtual QCString trDesignUnits()
+ { return "Designenheter"; }
+ /** VHDL functions/procedures/processes */
+ virtual QCString trFunctionAndProc()
+ { return "Funktioner/Procedurer/Processer"; }
+ /** VHDL type */
+ virtual QCString trVhdlType(uint64 type,bool single)
+ {
+ switch(type)
+ {
+ case VhdlDocGen::LIBRARY:
+ return "Biblotek";
+ case VhdlDocGen::PACKAGE:
+ return "Paket";
+ case VhdlDocGen::SIGNAL:
+ if (single) return "Signal";
+ else return "Signaler";
+ case VhdlDocGen::COMPONENT:
+ if (single) return "Komponent";
+ else return "Komponenter";
+ case VhdlDocGen::CONSTANT:
+ if (single) return "Konstant";
+ else return "Konstanter";
+ case VhdlDocGen::ENTITY:
+ if (single) return "Entitet";
+ else return "Entiteter";
+ case VhdlDocGen::TYPE:
+ if (single) return "Typ";
+ else return "Typer";
+ case VhdlDocGen::SUBTYPE:
+ if (single) return "Undertyp";
+ else return "Undertyper";
+ case VhdlDocGen::FUNCTION:
+ if (single) return "Funktion";
+ else return "Funktioner";
+ case VhdlDocGen::RECORD:
+ if (single) return "Post";
+ else return "Poster";
+ case VhdlDocGen::PROCEDURE:
+ if (single) return "Procedur";
+ else return "Procedurer";
+ case VhdlDocGen::ARCHITECTURE:
+ if (single) return "Arkitektur";
+ else return "Arkitekturer";
+ case VhdlDocGen::ATTRIBUTE:
+ return "Attribut";
+ case VhdlDocGen::PROCESS:
+ if (single) return "Process";
+ else return "Processer";
+ case VhdlDocGen::PORT:
+ if (single) return "Port";
+ else return "Portar";
+ case VhdlDocGen::USE:
+ if (single) return "use clause";
+ else return "Use Clauses";
+ case VhdlDocGen::GENERIC:
+ if (single) return "Generisk";
+ else return "Generiska";
+ case VhdlDocGen::PACKAGE_BODY:
+ return "Paketinehåll";
+ case VhdlDocGen::UNITS:
+ return "Enheter";
+ case VhdlDocGen::SHAREDVARIABLE:
+ if (single) return "Delad Variabel";
+ else return "Delade Variabler";
+ case VhdlDocGen::VFILE:
+ if (single) return "Fil";
+ else return "Filer";
+ case VhdlDocGen::GROUP:
+ if (single) return "Grupp";
+ else return "Grupper";
+ case VhdlDocGen::INSTANTIATION:
+ if (single) return "Instantiation";
+ else return "Instantiations";
+ case VhdlDocGen::ALIAS:
+ return "Alias";
+ case VhdlDocGen::CONFIG:
+ if (single) return "Konfiguration";
+ else return "Konfigurationer";
+ case VhdlDocGen::MISCELLANEOUS:
+ return "Diverse";
+ case VhdlDocGen::UCF_CONST:
+ return "Begränsningar";
+ default:
+ return "Klass";
+ }
+ }
+ virtual QCString trCustomReference(const char *name)
+ { return QCString(name)+"referens"; }
+
+ /* Slice */
+ virtual QCString trConstants()
+ {
+ return "Konstanter";
+ }
+ virtual QCString trConstantDocumentation()
+ {
+ return "Konstantdokumentation";
+ }
+ virtual QCString trSequences()
+ {
+ return "Sekvenser";
+ }
+ virtual QCString trSequenceDocumentation()
+ {
+ return "Sekvensdokumentation";
+ }
+ virtual QCString trDictionaries()
+ {
+ return "Uppslagsverk";
+ }
+ virtual QCString trDictionaryDocumentation()
+ {
+ return "Uppslagsverksdokumentation";
+ }
+ virtual QCString trSliceInterfaces()
+ {
+ return "Gränssnitt";
+ }
+ virtual QCString trInterfaceIndex()
+ {
+ return "Gränssnittsindex";
+ }
+ virtual QCString trInterfaceList()
+ {
+ return "Gränssnittslist";
+ }
+ /** Orginal: Here are the interfaces with brief descriptions: */
+ virtual QCString trInterfaceListDescription()
+ {
+ return "Här är gränssnitten med en kort beskrivning";
+ }
+ virtual QCString trInterfaceHierarchy()
+ {
+ return "Gränssnittshirarkin";
+ }
+ /** Orginal: This inheritance list is sorted roughly, but not completely, alphabetically: */
+ virtual QCString trInterfaceHierarchyDescription()
+ {
+ return "Denna arvslista är grovt sorterad, men inte helt, i alfabetisk ordning:";
+ }
+ virtual QCString trInterfaceDocumentation()
+ {
+ return "Gränssnittsdokumentation";
+ }
+ virtual QCString trStructs()
+ {
+ return "Strukturer";
+ }
+ virtual QCString trStructIndex()
+ {
+ return "Strukturindex";
+ }
+ virtual QCString trStructList()
+ {
+ return "Strukturlist";
+ }
+ /** Orginal: Here are the structs with brief descriptions: */
+ virtual QCString trStructListDescription()
+ {
+ return "Här är strukturerna med en kort beskrivning:";
+ }
+ virtual QCString trStructDocumentation()
+ {
+ return "Strukturdokumentation";
+ }
+ virtual QCString trExceptionIndex()
+ {
+ return "Undantagsindex";
+ }
+ virtual QCString trExceptionList()
+ {
+ return "Undantagslista";
+ }
+ /** Orginal: Here are the exceptions with brief descriptions: */
+ virtual QCString trExceptionListDescription()
+ {
+ return "Här är undantagen med en kort beskrivning:";
+ }
+ virtual QCString trExceptionHierarchy()
+ {
+ return "Undantagshirarki";
+ }
+ /** Orginal: This inheritance list is sorted roughly, but not completely, alphabetically: */
+ virtual QCString trExceptionHierarchyDescription()
+ {
+ return "Denna arvslista är grovt sorterad, men inte helt, i alfabetisk ordning:";
+ }
+ virtual QCString trExceptionDocumentation()
+ {
+ return "Undantagsdokumentation";
+ }
+ virtual QCString trCompoundReferenceSlice(const char *clName, ClassDef::CompoundType compType, bool isLocal)
+ {
+ QCString result=(QCString)clName;
+ if (isLocal) result+=" Lokal";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Klass"; break;
+ case ClassDef::Struct: result+=" Struktur"; break;
+ case ClassDef::Union: result+=" Unions"; break;
+ case ClassDef::Interface: result+=" Gränssnitts"; break;
+ case ClassDef::Protocol: result+=" Protokoll"; break;
+ case ClassDef::Category: result+=" Kategori"; break;
+ case ClassDef::Exception: result+=" Undantags"; break;
+ default: break;
+ }
+ result+="referens";
+ return result;
+ }
+ virtual QCString trOperations()
+ {
+ return "Operationer";
+ }
+ virtual QCString trOperationDocumentation()
+ {
+ return "Operationsdokumentation";
+ }
+ virtual QCString trDataMembers()
+ {
+ return "Datamedlemmar";
+ }
+ virtual QCString trDataMemberDocumentation()
+ {
+ return "Datamedlemsdokumentation";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.19
+//////////////////////////////////////////////////////////////////////////
+
+ /** VHDL design unit documentation */
+ virtual QCString trDesignUnitDocumentation()
+ { return "Designenhetsdokumentation"; }
+};
#endif
diff --git a/src/translator_tr.h b/src/translator_tr.h
index d18f800..4a68184 100644
--- a/src/translator_tr.h
+++ b/src/translator_tr.h
@@ -71,7 +71,11 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
*/
virtual QCString latexLanguageSupportCommand()
{
- return "";
+ return "\\usepackage[turkish]{babel}\n";
+ }
+ virtual QCString trISOLang()
+ {
+ return "tr";
}
// --- Language translation methods -------------------
@@ -1816,7 +1820,6 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
return sdate;
}
-
};
#endif
diff --git a/src/translator_tw.h b/src/translator_tw.h
index 9e9092d..8d9658b 100644
--- a/src/translator_tw.h
+++ b/src/translator_tw.h
@@ -86,6 +86,10 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_15
{
return "\\end{CJK}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "zh-Hant";
+ }
// --- Language translation methods -------------------
@@ -1913,14 +1917,6 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_15
return "方法文件";
}
- /*! Used as the title of the design overview picture created for the
- * VHDL output.
- */
- virtual QCString trDesignOverview()
- {
- return "設計概述";
- }
-
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
@@ -1977,8 +1973,6 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_15
return result;
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_ua.h b/src/translator_ua.h
index 034cb1b..e24136c 100644
--- a/src/translator_ua.h
+++ b/src/translator_ua.h
@@ -31,6 +31,10 @@ class TranslatorUkrainian : public TranslatorAdapter_1_8_4
{
return "\\usepackage[T2A]{fontenc}\n\\usepackage[ukrainian]{babel}\n";
}
+ virtual QCString trISOLang()
+ {
+ return "uk";
+ }
// --- Language translation methods -------------------
@@ -204,6 +208,10 @@ class TranslatorUkrainian : public TranslatorAdapter_1_8_4
{
return "Структури даних з коротким описом." ;
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Класи з коротким описом." ;
+ }
else
{
return "Класи, структури, об'єднання та інтерфейси з коротким описом." ;
@@ -1909,8 +1917,6 @@ class TranslatorUkrainian : public TranslatorAdapter_1_8_4
return "Огляд дизайну проекту";
}
-//////////////////////////////////////////////////////////////////////////
-
};
#endif
diff --git a/src/translator_vi.h b/src/translator_vi.h
index b391b0c..272dedd 100644
--- a/src/translator_vi.h
+++ b/src/translator_vi.h
@@ -95,6 +95,10 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
}
return latex_command;
}
+ virtual QCString trISOLang()
+ {
+ return "vi";
+ }
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
@@ -266,6 +270,10 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
{
return "Đây là cấu trúc cơ sở dữ liệu với mô tả tóm tắt:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Đây là các classes với các mô tả tóm tắt:";
+ }
else
{
return "Đây là các classes, structs, "
diff --git a/src/translator_za.h b/src/translator_za.h
index dd5ddf9..8fc847e 100644
--- a/src/translator_za.h
+++ b/src/translator_za.h
@@ -57,9 +57,11 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
*/
virtual QCString latexLanguageSupportCommand()
{
- //should we use return "\\usepackage[afrikaans]{babel}\n";
- // not sure - for now return an empty string
- return "";
+ return "\\usepackage[afrikaans]{babel}\n";
+ }
+ virtual QCString trISOLang()
+ {
+ return "af";
}
// --- Language translation methods -------------------
@@ -233,6 +235,10 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
{
return " Data strukture met kort beskrywings:";
}
+ else if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
+ {
+ return "Klasse met kort beskrywings:";
+ }
else
{
return "Klasse, structs, "
diff --git a/src/types.h b/src/types.h
index 189a93d..d34444c 100644
--- a/src/types.h
+++ b/src/types.h
@@ -54,7 +54,7 @@ enum SrcLangExt
SrcLangExt_Fortran = 0x01000,
SrcLangExt_VHDL = 0x02000,
SrcLangExt_XML = 0x04000,
- SrcLangExt_Tcl = 0x08000,
+ //SrcLangExt_Tcl = 0x08000, // no longer supported
SrcLangExt_Markdown = 0x10000,
SrcLangExt_SQL = 0x20000,
SrcLangExt_Slice = 0x40000
@@ -97,12 +97,6 @@ struct Grouping
};
-struct ListItemInfo
-{
- QCString type;
- int itemId;
-};
-
enum MemberListType
{
MemberListType_privateLists = 0x0800,
diff --git a/src/util.cpp b/src/util.cpp
index abcd910..7fcd5ed 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -1,11 +1,11 @@
/*****************************************************************************
- *
+ *
*
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,6 +19,11 @@
#include <errno.h>
#include <math.h>
#include <limits.h>
+#include <cinttypes>
+#include <string.h>
+
+#include <mutex>
+#include <unordered_set>
#include "md5.h"
@@ -26,7 +31,6 @@
#include <qfileinfo.h>
#include <qdir.h>
#include <qdatetime.h>
-#include <qcache.h>
#include "util.h"
#include "message.h"
@@ -63,6 +67,7 @@
#include "membergroup.h"
#include "dirdef.h"
#include "htmlentity.h"
+#include "symbolresolver.h"
#define ENABLE_TRACINGSUPPORT 0
@@ -78,29 +83,20 @@
//------------------------------------------------------------------------
-// selects one of the name to sub-dir mapping algorithms that is used
-// to select a sub directory when CREATE_SUBDIRS is set to YES.
-
-#define ALGO_COUNT 1
-#define ALGO_CRC16 2
-#define ALGO_MD5 3
-
-//#define MAP_ALGO ALGO_COUNT
-//#define MAP_ALGO ALGO_CRC16
-#define MAP_ALGO ALGO_MD5
-
#define REL_PATH_TO_ROOT "../../"
+static const char *hex = "0123456789ABCDEF";
+
//------------------------------------------------------------------------
// TextGeneratorOLImpl implementation
//------------------------------------------------------------------------
-TextGeneratorOLImpl::TextGeneratorOLImpl(OutputDocInterface &od) : m_od(od)
+TextGeneratorOLImpl::TextGeneratorOLImpl(OutputDocInterface &od) : m_od(od)
{
}
void TextGeneratorOLImpl::writeString(const char *s,bool keepSpaces) const
-{
+{
if (s==0) return;
//printf("TextGeneratorOlImpl::writeString('%s',%d)\n",s,keepSpaces);
if (keepSpaces)
@@ -113,19 +109,19 @@ void TextGeneratorOLImpl::writeString(const char *s,bool keepSpaces) const
cs[1]='\0';
while ((c=*p++))
{
- if (c==' ') m_od.writeNonBreakableSpace(1);
+ if (c==' ') m_od.writeNonBreakableSpace(1);
else cs[0]=c,m_od.docify(cs);
}
}
}
else
{
- m_od.docify(s);
+ m_od.docify(s);
}
}
void TextGeneratorOLImpl::writeBreak(int indent) const
-{
+{
m_od.lineBreak("typebreak");
int i;
for (i=0;i<indent;i++)
@@ -146,9 +142,9 @@ void TextGeneratorOLImpl::writeLink(const char *extRef,const char *file,
//------------------------------------------------------------------------
// an inheritance tree of depth of 100000 should be enough for everyone :-)
-const int maxInheritanceDepth = 100000;
+const int maxInheritanceDepth = 100000;
-/*!
+/*!
Removes all anonymous scopes from string s
Possible examples:
\verbatim
@@ -177,9 +173,9 @@ QCString removeAnonymousScopes(const QCString &s)
while (c<i+l && s.at(c)!='@') if (s.at(c++)==':') b1=TRUE;
c=i+l-1;
while (c>=i && s.at(c)!='@') if (s.at(c--)==':') b2=TRUE;
- if (b1 && b2)
- {
- result+="::";
+ if (b1 && b2)
+ {
+ result+="::";
}
p=i+l;
}
@@ -224,7 +220,7 @@ QCString stripAnonymousNamespaceScope(const QCString &s)
while ((i=getScopeFragment(s,p,&l))!=-1)
{
//printf("Scope fragment %s\n",s.mid(i,l).data());
- if (Doxygen::namespaceSDict->find(s.left(i+l))!=0)
+ if (Doxygen::namespaceLinkedMap->find(s.left(i+l))!=0)
{
if (s.at(i)!='@')
{
@@ -248,7 +244,7 @@ done:
void writePageRef(OutputDocInterface &od,const char *cn,const char *mn)
{
od.pushGeneratorState();
-
+
od.disable(OutputGenerator::Html);
od.disable(OutputGenerator::Man);
od.disable(OutputGenerator::Docbook);
@@ -273,22 +269,20 @@ QCString generateMarker(int id)
return result;
}
-static QCString stripFromPath(const QCString &path,QStrList &l)
+static QCString stripFromPath(const QCString &path,const StringVector &l)
{
- // look at all the strings in the list and strip the longest match
- const char *s=l.first();
+ // look at all the strings in the list and strip the longest match
QCString potential;
unsigned int length = 0;
- while (s)
+ for (const auto &s : l)
{
- QCString prefix = s;
+ QCString prefix = s.c_str();
if (prefix.length() > length &&
qstricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare
{
length = prefix.length();
potential = path.right(path.length()-prefix.length());
}
- s = l.next();
}
if (length) return potential;
return path;
@@ -311,7 +305,7 @@ QCString stripFromIncludePath(const QCString &path)
}
/*! try to determine if \a name is a source or a header file name by looking
- * at the extension. A number of variations is allowed in both upper and
+ * at the extension. A number of variations is allowed in both upper and
* lower case) If anyone knows or uses another extension please let me know :-)
*/
int guessSection(const char *name)
@@ -331,7 +325,7 @@ int guessSection(const char *name)
n.right(4)==".i++" ||
n.right(4)==".inl" ||
n.right(4)==".xml" ||
- n.right(4)==".sql"
+ n.right(4)==".sql"
) return Entry::SOURCE_SEC;
if (n.right(2)==".h" || // header
n.right(3)==".hh" ||
@@ -352,7 +346,7 @@ QCString resolveTypeDef(const Definition *context,const QCString &qualifiedName,
//printf("<<resolveTypeDef(%s,%s)\n",
// context ? context->name().data() : "<none>",qualifiedName.data());
QCString result;
- if (qualifiedName.isEmpty())
+ if (qualifiedName.isEmpty())
{
//printf(" qualified name empty!\n");
return result;
@@ -374,12 +368,12 @@ QCString resolveTypeDef(const Definition *context,const QCString &qualifiedName,
return result;
}
}
- MemberDef *md=0;
+ const MemberDef *md=0;
while (mContext && md==0)
{
// step 1: get the right scope
const Definition *resScope=mContext;
- if (scopeIndex!=-1)
+ if (scopeIndex!=-1)
{
// split-off scope part
QCString resScopeName = qualifiedName.left(scopeIndex);
@@ -400,35 +394,35 @@ QCString resolveTypeDef(const Definition *context,const QCString &qualifiedName,
}
}
//printf("resScope=%s\n",resScope?resScope->name().data():"<none>");
-
+
// step 2: get the member
- if (resScope) // no scope or scope found in the current context
+ if (resScope) // no scope or scope found in the current context
{
//printf("scope found: %s, look for typedef %s\n",
// resScope->qualifiedName().data(),resName.data());
- MemberNameSDict *mnd=0;
+ MemberNameLinkedMap *mnd=0;
if (resScope->definitionType()==Definition::TypeClass)
{
- mnd=Doxygen::memberNameSDict;
+ mnd=Doxygen::memberNameLinkedMap;
}
else
{
- mnd=Doxygen::functionNameSDict;
+ mnd=Doxygen::functionNameLinkedMap;
}
MemberName *mn=mnd->find(resName);
if (mn)
{
- MemberNameIterator mni(*mn);
- MemberDef *tmd=0;
int minDist=-1;
- for (;(tmd=mni.current());++mni)
+ for (const auto &tmd_p : *mn)
{
+ const MemberDef *tmd = tmd_p.get();
//printf("Found member %s resScope=%s outerScope=%s mContext=%p\n",
- // tmd->name().data(), resScope->name().data(),
+ // tmd->name().data(), resScope->name().data(),
// tmd->getOuterScope()->name().data(), mContext);
if (tmd->isTypedef() /*&& tmd->getOuterScope()==resScope*/)
{
- int dist=isAccessibleFrom(resScope,0,tmd);
+ SymbolResolver resolver;
+ int dist=resolver.isAccessibleFrom(resScope,tmd);
if (dist!=-1 && (md==0 || dist<minDist))
{
md = tmd;
@@ -465,747 +459,43 @@ QCString resolveTypeDef(const Definition *context,const QCString &qualifiedName,
// qualifiedName.data(),context ? context->name().data() : "<global>");
}
return result;
-
+
}
-/*! Get a class definition given its name.
+/*! Get a class definition given its name.
* Returns 0 if the class is not found.
*/
ClassDef *getClass(const char *n)
{
if (n==0 || n[0]=='\0') return 0;
- QCString name=n;
- ClassDef *result = Doxygen::classSDict->find(name);
- //if (result==0 && !exact) // also try generic and protocol versions
- //{
- // result = Doxygen::classSDict->find(name+"-g");
- // if (result==0)
- // {
- // result = Doxygen::classSDict->find(name+"-p");
- // }
- //}
- //printf("getClass(%s)=%s\n",n,result?result->name().data():"<none>");
- return result;
+ return Doxygen::classLinkedMap->find(n);
}
NamespaceDef *getResolvedNamespace(const char *name)
{
if (name==0 || name[0]=='\0') return 0;
- QCString *subst = Doxygen::namespaceAliasDict[name];
- if (subst)
+ auto it = Doxygen::namespaceAliasMap.find(name);
+ if (it!=Doxygen::namespaceAliasMap.end())
{
int count=0; // recursion detection guard
- QCString *newSubst;
- while ((newSubst=Doxygen::namespaceAliasDict[*subst]) && count<10)
+ StringUnorderedMap::iterator it2;
+ while ((it2=Doxygen::namespaceAliasMap.find(it->second))!=Doxygen::namespaceAliasMap.end() &&
+ count<10)
{
- subst=newSubst;
+ it=it2;
count++;
}
if (count==10)
{
warn_uncond("possible recursive namespace alias detected for %s!\n",name);
}
- return Doxygen::namespaceSDict->find(subst->data());
+ return Doxygen::namespaceLinkedMap->find(it->second.data());
}
else
{
- return Doxygen::namespaceSDict->find(name);
- }
-}
-
-static QDict<MemberDef> g_resolvedTypedefs;
-static QDict<Definition> g_visitedNamespaces;
-
-// forward declaration
-static const ClassDef *getResolvedClassRec(const Definition *scope,
- const FileDef *fileScope,
- const char *n,
- const MemberDef **pTypeDef,
- QCString *pTemplSpec,
- QCString *pResolvedType
- );
-int isAccessibleFromWithExpScope(const Definition *scope,const FileDef *fileScope,const Definition *item,
- const QCString &explicitScopePart);
-
-/*! Returns the class representing the value of the typedef represented by \a md
- * within file \a fileScope.
- *
- * Example: typedef A T; will return the class representing A if it is a class.
- *
- * Example: typedef int T; will return 0, since "int" is not a class.
- */
-const ClassDef *newResolveTypedef(const FileDef *fileScope,
- const MemberDef *md,
- const MemberDef **pMemType,
- QCString *pTemplSpec,
- QCString *pResolvedType,
- const ArgumentList *actTemplParams)
-{
- //printf("newResolveTypedef(md=%p,cachedVal=%p)\n",md,md->getCachedTypedefVal());
- bool isCached = md->isTypedefValCached(); // value already cached
- if (isCached)
- {
- //printf("Already cached %s->%s [%s]\n",
- // md->name().data(),
- // md->getCachedTypedefVal()?md->getCachedTypedefVal()->name().data():"<none>",
- // md->getCachedResolvedTypedef()?md->getCachedResolvedTypedef().data():"<none>");
-
- if (pTemplSpec) *pTemplSpec = md->getCachedTypedefTemplSpec();
- if (pResolvedType) *pResolvedType = md->getCachedResolvedTypedef();
- return md->getCachedTypedefVal();
- }
- //printf("new typedef\n");
- QCString qname = md->qualifiedName();
- if (g_resolvedTypedefs.find(qname)) return 0; // typedef already done
-
- g_resolvedTypedefs.insert(qname,md); // put on the trace list
-
- const ClassDef *typeClass = md->getClassDef();
- QCString type = md->typeString(); // get the "value" of the typedef
- if (typeClass && typeClass->isTemplate() &&
- actTemplParams && !actTemplParams->empty())
- {
- type = substituteTemplateArgumentsInString(type,
- typeClass->templateArguments(),*actTemplParams);
- }
- QCString typedefValue = type;
- int tl=type.length();
- int ip=tl-1; // remove * and & at the end
- while (ip>=0 && (type.at(ip)=='*' || type.at(ip)=='&' || type.at(ip)==' '))
- {
- ip--;
- }
- type=type.left(ip+1);
- type.stripPrefix("const "); // strip leading "const"
- type.stripPrefix("struct "); // strip leading "struct"
- type.stripPrefix("union "); // strip leading "union"
- int sp=0;
- tl=type.length(); // length may have been changed
- while (sp<tl && type.at(sp)==' ') sp++;
- const MemberDef *memTypeDef = 0;
- const ClassDef *result = getResolvedClassRec(md->getOuterScope(),
- fileScope,type,&memTypeDef,0,pResolvedType);
- // if type is a typedef then return what it resolves to.
- if (memTypeDef && memTypeDef->isTypedef())
- {
- result=newResolveTypedef(fileScope,memTypeDef,pMemType,pTemplSpec);
- goto done;
- }
- else if (memTypeDef && memTypeDef->isEnumerate() && pMemType)
- {
- *pMemType = memTypeDef;
- }
-
- //printf("type=%s result=%p\n",type.data(),result);
- if (result==0)
- {
- // try unspecialized version if type is template
- int si=type.findRev("::");
- int i=type.find('<');
- if (si==-1 && i!=-1) // typedef of a template => try the unspecialized version
- {
- if (pTemplSpec) *pTemplSpec = type.mid(i);
- result = getResolvedClassRec(md->getOuterScope(),fileScope,
- type.left(i),0,0,pResolvedType);
- //printf("result=%p pRresolvedType=%s sp=%d ip=%d tl=%d\n",
- // result,pResolvedType?pResolvedType->data():"<none>",sp,ip,tl);
- }
- else if (si!=-1) // A::B
- {
- i=type.find('<',si);
- if (i==-1) // Something like A<T>::B => lookup A::B
- {
- i=type.length();
- }
- else // Something like A<T>::B<S> => lookup A::B, spec=<S>
- {
- if (pTemplSpec) *pTemplSpec = type.mid(i);
- }
- result = getResolvedClassRec(md->getOuterScope(),fileScope,
- stripTemplateSpecifiersFromScope(type.left(i),FALSE),0,0,
- pResolvedType);
- }
-
- //if (result) ip=si+sp+1;
- }
-
-done:
- if (pResolvedType)
- {
- if (result)
- {
- *pResolvedType=result->qualifiedName();
- //printf("*pResolvedType=%s\n",pResolvedType->data());
- if (sp>0) pResolvedType->prepend(typedefValue.left(sp));
- if (ip<tl-1) pResolvedType->append(typedefValue.right(tl-ip-1));
- }
- else
- {
- *pResolvedType=typedefValue;
- }
- }
-
- // remember computed value for next time
- if (result && result->getDefFileName()!="<code>")
- // this check is needed to prevent that temporary classes that are
- // introduced while parsing code fragments are being cached here.
- {
- //printf("setting cached typedef %p in result %p\n",md,result);
- //printf("==> %s (%s,%d)\n",result->name().data(),result->getDefFileName().data(),result->getDefLine());
- //printf("*pResolvedType=%s\n",pResolvedType?pResolvedType->data():"<none>");
- const_cast<MemberDef*>(md)->cacheTypedefVal(result,
- pTemplSpec ? *pTemplSpec : QCString(),
- pResolvedType ? *pResolvedType : QCString()
- );
- }
-
- g_resolvedTypedefs.remove(qname); // remove from the trace list
-
- return result;
-}
-
-/*! Substitutes a simple unqualified \a name within \a scope. Returns the
- * value of the typedef or \a name if no typedef was found.
- */
-static QCString substTypedef(const Definition *scope,const FileDef *fileScope,const QCString &name,
- const MemberDef **pTypeDef=0)
-{
- QCString result=name;
- if (name.isEmpty()) return result;
-
- // lookup scope fragment in the symbol map
- DefinitionIntf *di = Doxygen::symbolMap->find(name);
- if (di==0) return result; // no matches
-
- MemberDef *bestMatch=0;
- if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multi symbols
- {
- // search for the best match
- DefinitionListIterator dli(*(DefinitionList*)di);
- Definition *d;
- int minDistance=10000; // init at "infinite"
- for (dli.toFirst();(d=dli.current());++dli) // foreach definition
- {
- // only look at members
- if (d->definitionType()==Definition::TypeMember)
- {
- // that are also typedefs
- MemberDef *md = dynamic_cast<MemberDef *>(d);
- if (md->isTypedef()) // d is a typedef
- {
- // test accessibility of typedef within scope.
- int distance = isAccessibleFromWithExpScope(scope,fileScope,d,"");
- if (distance!=-1 && distance<minDistance)
- // definition is accessible and a better match
- {
- minDistance=distance;
- bestMatch = md;
- }
- }
- }
- }
- }
- else if (di->definitionType()==DefinitionIntf::TypeMember) // single symbol
- {
- Definition *d = (Definition*)di;
- // that are also typedefs
- MemberDef *md = dynamic_cast<MemberDef *>(di);
- if (md->isTypedef()) // d is a typedef
- {
- // test accessibility of typedef within scope.
- int distance = isAccessibleFromWithExpScope(scope,fileScope,d,"");
- if (distance!=-1) // definition is accessible
- {
- bestMatch = md;
- }
- }
+ return Doxygen::namespaceLinkedMap->find(name);
}
- if (bestMatch)
- {
- result = bestMatch->typeString();
- if (pTypeDef) *pTypeDef=bestMatch;
- }
-
- //printf("substTypedef(%s,%s)=%s\n",scope?scope->name().data():"<global>",
- // name.data(),result.data());
- return result;
-}
-
-static const Definition *endOfPathIsUsedClass(const SDict<Definition> *cl,const QCString &localName)
-{
- if (cl)
- {
- SDict<Definition>::Iterator cli(*cl);
- Definition *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- if (cd->localName()==localName)
- {
- return cd;
- }
- }
- }
- return 0;
-}
-
-/*! Starting with scope \a start, the string \a path is interpreted as
- * a part of a qualified scope name (e.g. A::B::C), and the scope is
- * searched. If found the scope definition is returned, otherwise 0
- * is returned.
- */
-static const Definition *followPath(const Definition *start,const FileDef *fileScope,const QCString &path)
-{
- int is,ps;
- int l;
- const Definition *current=start;
- ps=0;
- //printf("followPath: start='%s' path='%s'\n",start?start->name().data():"<none>",path.data());
- // for each part of the explicit scope
- while ((is=getScopeFragment(path,ps,&l))!=-1)
- {
- // try to resolve the part if it is a typedef
- const MemberDef *typeDef=0;
- QCString qualScopePart = substTypedef(current,fileScope,path.mid(is,l),&typeDef);
- //printf(" qualScopePart=%s\n",qualScopePart.data());
- if (typeDef)
- {
- const ClassDef *type = newResolveTypedef(fileScope,typeDef);
- if (type)
- {
- //printf("Found type %s\n",type->name().data());
- return type;
- }
- }
- const Definition *next = current->findInnerCompound(qualScopePart);
- //printf("++ Looking for %s inside %s result %s\n",
- // qualScopePart.data(),
- // current->name().data(),
- // next?next->name().data():"<null>");
- if (next==0) // failed to follow the path
- {
- //printf("==> next==0!\n");
- if (current->definitionType()==Definition::TypeNamespace)
- {
- next = endOfPathIsUsedClass(
- (dynamic_cast<const NamespaceDef *>(current))->getUsedClasses(),qualScopePart);
- }
- else if (current->definitionType()==Definition::TypeFile)
- {
- next = endOfPathIsUsedClass(
- (dynamic_cast<const FileDef *>(current))->getUsedClasses(),qualScopePart);
- }
- current = next;
- if (current==0) break;
- }
- else // continue to follow scope
- {
- current = next;
- //printf("==> current = %p\n",current);
- }
- ps=is+l;
- }
- //printf("followPath(start=%s,path=%s) result=%s\n",
- // start->name().data(),path.data(),current?current->name().data():"<null>");
- return current; // path could be followed
-}
-
-bool accessibleViaUsingClass(const SDict<Definition> *cl,
- const FileDef *fileScope,
- const Definition *item,
- const QCString &explicitScopePart=""
- )
-{
- //printf("accessibleViaUsingClass(%p)\n",cl);
- if (cl) // see if the class was imported via a using statement
- {
- SDict<Definition>::Iterator cli(*cl);
- Definition *ucd;
- bool explicitScopePartEmpty = explicitScopePart.isEmpty();
- for (cli.toFirst();(ucd=cli.current());++cli)
- {
- //printf("Trying via used class %s\n",ucd->name().data());
- const Definition *sc = explicitScopePartEmpty ? ucd : followPath(ucd,fileScope,explicitScopePart);
- if (sc && sc==item) return TRUE;
- //printf("Try via used class done\n");
- }
- }
- return FALSE;
-}
-
-bool accessibleViaUsingNamespace(const NamespaceSDict *nl,
- const FileDef *fileScope,
- const Definition *item,
- const QCString &explicitScopePart="")
-{
- static QDict<void> visitedDict;
- if (nl) // check used namespaces for the class
- {
- NamespaceSDict::Iterator nli(*nl);
- NamespaceDef *und;
- int count=0;
- for (nli.toFirst();(und=nli.current());++nli,count++)
- {
- //printf("[Trying via used namespace %s: count=%d/%d\n",und->name().data(),
- // count,nl->count());
- const Definition *sc = explicitScopePart.isEmpty() ? und : followPath(und,fileScope,explicitScopePart);
- if (sc && item->getOuterScope()==sc)
- {
- //printf("] found it\n");
- return TRUE;
- }
- if (item->getLanguage()==SrcLangExt_Cpp)
- {
- QCString key=und->name();
- if (und->getUsedNamespaces() && visitedDict.find(key)==0)
- {
- visitedDict.insert(key,(void *)0x08);
-
- if (accessibleViaUsingNamespace(und->getUsedNamespaces(),fileScope,item,explicitScopePart))
- {
- //printf("] found it via recursion\n");
- return TRUE;
- }
-
- visitedDict.remove(key);
- }
- }
- //printf("] Try via used namespace done\n");
- }
- }
- return FALSE;
-}
-
-const int MAX_STACK_SIZE = 1000;
-
-/** Helper class representing the stack of items considered while resolving
- * the scope.
- */
-class AccessStack
-{
- public:
- AccessStack() : m_index(0) {}
- void push(const Definition *scope,const FileDef *fileScope,const Definition *item)
- {
- if (m_index<MAX_STACK_SIZE)
- {
- m_elements[m_index].scope = scope;
- m_elements[m_index].fileScope = fileScope;
- m_elements[m_index].item = item;
- m_index++;
- }
- }
- void push(const Definition *scope,const FileDef *fileScope,const Definition *item,const QCString &expScope)
- {
- if (m_index<MAX_STACK_SIZE)
- {
- m_elements[m_index].scope = scope;
- m_elements[m_index].fileScope = fileScope;
- m_elements[m_index].item = item;
- m_elements[m_index].expScope = expScope;
- m_index++;
- }
- }
- void pop()
- {
- if (m_index>0) m_index--;
- }
- bool find(const Definition *scope,const FileDef *fileScope, const Definition *item)
- {
- int i=0;
- for (i=0;i<m_index;i++)
- {
- AccessElem *e = &m_elements[i];
- if (e->scope==scope && e->fileScope==fileScope && e->item==item)
- {
- return TRUE;
- }
- }
- return FALSE;
- }
- bool find(const Definition *scope,const FileDef *fileScope, const Definition *item,const QCString &expScope)
- {
- int i=0;
- for (i=0;i<m_index;i++)
- {
- AccessElem *e = &m_elements[i];
- if (e->scope==scope && e->fileScope==fileScope && e->item==item && e->expScope==expScope)
- {
- return TRUE;
- }
- }
- return FALSE;
- }
-
- private:
- /** Element in the stack. */
- struct AccessElem
- {
- const Definition *scope;
- const FileDef *fileScope;
- const Definition *item;
- QCString expScope;
- };
- int m_index;
- AccessElem m_elements[MAX_STACK_SIZE];
-};
-
-/* Returns the "distance" (=number of levels up) from item to scope, or -1
- * if item in not inside scope.
- */
-int isAccessibleFrom(const Definition *scope,const FileDef *fileScope,const Definition *item)
-{
- //printf("<isAccessibleFrom(scope=%s,item=%s itemScope=%s)\n",
- // scope->name().data(),item->name().data(),item->getOuterScope()->name().data());
-
- static AccessStack accessStack;
- if (accessStack.find(scope,fileScope,item))
- {
- return -1;
- }
- accessStack.push(scope,fileScope,item);
-
- int result=0; // assume we found it
- int i;
-
- Definition *itemScope=item->getOuterScope();
- bool memberAccessibleFromScope =
- (item->definitionType()==Definition::TypeMember && // a member
- itemScope && itemScope->definitionType()==Definition::TypeClass && // of a class
- scope->definitionType()==Definition::TypeClass && // accessible
- (dynamic_cast<const ClassDef*>(scope))->isAccessibleMember(dynamic_cast<const MemberDef *>(item)) // from scope
- );
- bool nestedClassInsideBaseClass =
- (item->definitionType()==Definition::TypeClass && // a nested class
- itemScope && itemScope->definitionType()==Definition::TypeClass && // inside a base
- scope->definitionType()==Definition::TypeClass && // class of scope
- (dynamic_cast<const ClassDef*>(scope))->isBaseClass(dynamic_cast<ClassDef*>(itemScope),TRUE)
- );
-
- if (itemScope==scope || memberAccessibleFromScope || nestedClassInsideBaseClass)
- {
- //printf("> found it\n");
- if (nestedClassInsideBaseClass) result++; // penalty for base class to prevent
- // this is preferred over nested class in this class
- // see bug 686956
- }
- else if (scope==Doxygen::globalScope)
- {
- if (fileScope)
- {
- SDict<Definition> *cl = fileScope->getUsedClasses();
- if (accessibleViaUsingClass(cl,fileScope,item))
- {
- //printf("> found via used class\n");
- goto done;
- }
- NamespaceSDict *nl = fileScope->getUsedNamespaces();
- if (accessibleViaUsingNamespace(nl,fileScope,item))
- {
- //printf("> found via used namespace\n");
- goto done;
- }
- }
- //printf("> reached global scope\n");
- result=-1; // not found in path to globalScope
- }
- else // keep searching
- {
- // check if scope is a namespace, which is using other classes and namespaces
- if (scope->definitionType()==Definition::TypeNamespace)
- {
- const NamespaceDef *nscope = dynamic_cast<const NamespaceDef*>(scope);
- //printf(" %s is namespace with %d used classes\n",nscope->name().data(),nscope->getUsedClasses());
- const SDict<Definition> *cl = nscope->getUsedClasses();
- if (accessibleViaUsingClass(cl,fileScope,item))
- {
- //printf("> found via used class\n");
- goto done;
- }
- const NamespaceSDict *nl = nscope->getUsedNamespaces();
- if (accessibleViaUsingNamespace(nl,fileScope,item))
- {
- //printf("> found via used namespace\n");
- goto done;
- }
- }
- // repeat for the parent scope
- i=isAccessibleFrom(scope->getOuterScope(),fileScope,item);
- //printf("> result=%d\n",i);
- result= (i==-1) ? -1 : i+2;
- }
-done:
- accessStack.pop();
- //Doxygen::lookupCache.insert(key,new int(result));
- return result;
-}
-
-
-/* Returns the "distance" (=number of levels up) from item to scope, or -1
- * if item in not in this scope. The explicitScopePart limits the search
- * to scopes that match \a scope (or its parent scope(s)) plus the explicit part.
- * Example:
- *
- * class A { public: class I {}; };
- * class B { public: class J {}; };
- *
- * - Looking for item=='J' inside scope=='B' will return 0.
- * - Looking for item=='I' inside scope=='B' will return -1
- * (as it is not found in B nor in the global scope).
- * - Looking for item=='A::I' inside scope=='B', first the match B::A::I is tried but
- * not found and then A::I is searched in the global scope, which matches and
- * thus the result is 1.
- */
-int isAccessibleFromWithExpScope(const Definition *scope,const FileDef *fileScope,
- const Definition *item,const QCString &explicitScopePart)
-{
- if (explicitScopePart.isEmpty())
- {
- // handle degenerate case where there is no explicit scope.
- return isAccessibleFrom(scope,fileScope,item);
- }
-
- static AccessStack accessStack;
- if (accessStack.find(scope,fileScope,item,explicitScopePart))
- {
- return -1;
- }
- accessStack.push(scope,fileScope,item,explicitScopePart);
-
-
- //printf(" <isAccessibleFromWithExpScope(%s,%s,%s)\n",scope?scope->name().data():"<global>",
- // item?item->name().data():"<none>",
- // explicitScopePart.data());
- int result=0; // assume we found it
- const Definition *newScope = followPath(scope,fileScope,explicitScopePart);
- if (newScope) // explicitScope is inside scope => newScope is the result
- {
- Definition *itemScope = item->getOuterScope();
- //printf(" scope traversal successful %s<->%s!\n",itemScope->name().data(),newScope->name().data());
- //if (newScope && newScope->definitionType()==Definition::TypeClass)
- //{
- // ClassDef *cd = (ClassDef *)newScope;
- // printf("---> Class %s: bases=%p\n",cd->name().data(),cd->baseClasses());
- //}
- if (itemScope==newScope) // exact match of scopes => distance==0
- {
- //printf("> found it\n");
- }
- else if (itemScope && newScope &&
- itemScope->definitionType()==Definition::TypeClass &&
- newScope->definitionType()==Definition::TypeClass &&
- (dynamic_cast<const ClassDef*>(newScope))->isBaseClass(dynamic_cast<const ClassDef*>(itemScope),TRUE,0)
- )
- {
- // inheritance is also ok. Example: looking for B::I, where
- // class A { public: class I {} };
- // class B : public A {}
- // but looking for B::I, where
- // class A { public: class I {} };
- // class B { public: class I {} };
- // will find A::I, so we still prefer a direct match and give this one a distance of 1
- result=1;
-
- //printf("scope(%s) is base class of newScope(%s)\n",
- // scope->name().data(),newScope->name().data());
- }
- else
- {
- int i=-1;
- if (newScope->definitionType()==Definition::TypeNamespace)
- {
- g_visitedNamespaces.insert(newScope->name(),newScope);
- // this part deals with the case where item is a class
- // A::B::C but is explicit referenced as A::C, where B is imported
- // in A via a using directive.
- //printf("newScope is a namespace: %s!\n",newScope->name().data());
- const NamespaceDef *nscope = dynamic_cast<const NamespaceDef*>(newScope);
- const SDict<Definition> *cl = nscope->getUsedClasses();
- if (cl)
- {
- SDict<Definition>::Iterator cli(*cl);
- const Definition *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- //printf("Trying for class %s\n",cd->name().data());
- if (cd==item)
- {
- //printf("> class is used in this scope\n");
- goto done;
- }
- }
- }
- const NamespaceSDict *nl = nscope->getUsedNamespaces();
- if (nl)
- {
- NamespaceSDict::Iterator nli(*nl);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- if (g_visitedNamespaces.find(nd->name())==0)
- {
- //printf("Trying for namespace %s\n",nd->name().data());
- i = isAccessibleFromWithExpScope(scope,fileScope,item,nd->name());
- if (i!=-1)
- {
- //printf("> found via explicit scope of used namespace\n");
- goto done;
- }
- }
- }
- }
- }
- // repeat for the parent scope
- if (scope!=Doxygen::globalScope)
- {
- i = isAccessibleFromWithExpScope(scope->getOuterScope(),fileScope,
- item,explicitScopePart);
- }
- //printf(" | result=%d\n",i);
- result = (i==-1) ? -1 : i+2;
- }
- }
- else // failed to resolve explicitScope
- {
- //printf(" failed to resolve: scope=%s\n",scope->name().data());
- if (scope->definitionType()==Definition::TypeNamespace)
- {
- const NamespaceDef *nscope = dynamic_cast<const NamespaceDef*>(scope);
- const NamespaceSDict *nl = nscope->getUsedNamespaces();
- if (accessibleViaUsingNamespace(nl,fileScope,item,explicitScopePart))
- {
- //printf("> found in used namespace\n");
- goto done;
- }
- }
- if (scope==Doxygen::globalScope)
- {
- if (fileScope)
- {
- const NamespaceSDict *nl = fileScope->getUsedNamespaces();
- if (accessibleViaUsingNamespace(nl,fileScope,item,explicitScopePart))
- {
- //printf("> found in used namespace\n");
- goto done;
- }
- }
- //printf("> not found\n");
- result=-1;
- }
- else // continue by looking into the parent scope
- {
- int i=isAccessibleFromWithExpScope(scope->getOuterScope(),fileScope,
- item,explicitScopePart);
- //printf("> result=%d\n",i);
- result= (i==-1) ? -1 : i+2;
- }
- }
-
-done:
- //printf(" > result=%d\n",result);
- accessStack.pop();
- //Doxygen::lookupCache.insert(key,new int(result));
- return result;
}
int computeQualifiedIndex(const QCString &name)
@@ -1214,448 +504,11 @@ int computeQualifiedIndex(const QCString &name)
return name.findRev("::",i==-1 ? name.length() : i);
}
-static void getResolvedSymbol(const Definition *scope,
- const FileDef *fileScope,
- Definition *d,
- const QCString &explicitScopePart,
- ArgumentList *actTemplParams,
- int &minDistance,
- const ClassDef *&bestMatch,
- const MemberDef *&bestTypedef,
- QCString &bestTemplSpec,
- QCString &bestResolvedType
- )
-{
- //printf(" => found type %x name=%s d=%p\n",
- // d->definitionType(),d->name().data(),d);
-
- // only look at classes and members that are enums or typedefs
- if (d->definitionType()==Definition::TypeClass ||
- (d->definitionType()==Definition::TypeMember &&
- ((dynamic_cast<MemberDef*>(d))->isTypedef() || (dynamic_cast<MemberDef*>(d))->isEnumerate())
- )
- )
- {
- g_visitedNamespaces.clear();
- // test accessibility of definition within scope.
- int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart);
- //printf(" %s; distance %s (%p) is %d\n",scope->name().data(),d->name().data(),d,distance);
- if (distance!=-1) // definition is accessible
- {
- // see if we are dealing with a class or a typedef
- if (d->definitionType()==Definition::TypeClass) // d is a class
- {
- ClassDef *cd = dynamic_cast<ClassDef *>(d);
- //printf("cd=%s\n",cd->name().data());
- if (!cd->isTemplateArgument()) // skip classes that
- // are only there to
- // represent a template
- // argument
- {
- //printf("is not a templ arg\n");
- if (distance<minDistance) // found a definition that is "closer"
- {
- minDistance=distance;
- bestMatch = cd;
- bestTypedef = 0;
- bestTemplSpec.resize(0);
- bestResolvedType = cd->qualifiedName();
- }
- else if (distance==minDistance &&
- fileScope && bestMatch &&
- fileScope->getUsedNamespaces() &&
- d->getOuterScope()->definitionType()==Definition::TypeNamespace &&
- bestMatch->getOuterScope()==Doxygen::globalScope
- )
- {
- // in case the distance is equal it could be that a class X
- // is defined in a namespace and in the global scope. When searched
- // in the global scope the distance is 0 in both cases. We have
- // to choose one of the definitions: we choose the one in the
- // namespace if the fileScope imports namespaces and the definition
- // found was in a namespace while the best match so far isn't.
- // Just a non-perfect heuristic but it could help in some situations
- // (kdecore code is an example).
- minDistance=distance;
- bestMatch = cd;
- bestTypedef = 0;
- bestTemplSpec.resize(0);
- bestResolvedType = cd->qualifiedName();
- }
- }
- else
- {
- //printf(" is a template argument!\n");
- }
- }
- else if (d->definitionType()==Definition::TypeMember)
- {
- MemberDef *md = dynamic_cast<MemberDef *>(d);
- //printf(" member isTypedef()=%d\n",md->isTypedef());
- if (md->isTypedef()) // d is a typedef
- {
- QCString args=md->argsString();
- if (args.isEmpty()) // do not expand "typedef t a[4];"
- {
- //printf(" found typedef!\n");
-
- // we found a symbol at this distance, but if it didn't
- // resolve to a class, we still have to make sure that
- // something at a greater distance does not match, since
- // that symbol is hidden by this one.
- if (distance<minDistance)
- {
- QCString spec;
- QCString type;
- minDistance=distance;
- const MemberDef *enumType = 0;
- const ClassDef *cd = newResolveTypedef(fileScope,md,&enumType,&spec,&type,actTemplParams);
- if (cd) // type resolves to a class
- {
- //printf(" bestTypeDef=%p spec=%s type=%s\n",md,spec.data(),type.data());
- bestMatch = cd;
- bestTypedef = md;
- bestTemplSpec = spec;
- bestResolvedType = type;
- }
- else if (enumType) // type resolves to a enum
- {
- //printf(" is enum\n");
- bestMatch = 0;
- bestTypedef = enumType;
- bestTemplSpec = "";
- bestResolvedType = enumType->qualifiedName();
- }
- else if (md->isReference()) // external reference
- {
- bestMatch = 0;
- bestTypedef = md;
- bestTemplSpec = spec;
- bestResolvedType = type;
- }
- else
- {
- bestMatch = 0;
- bestTypedef = md;
- bestTemplSpec.resize(0);
- bestResolvedType.resize(0);
- //printf(" no match\n");
- }
- }
- else
- {
- //printf(" not the best match %d min=%d\n",distance,minDistance);
- }
- }
- else
- {
- //printf(" not a simple typedef\n")
- }
- }
- else if (md->isEnumerate())
- {
- if (distance<minDistance)
- {
- minDistance=distance;
- bestMatch = 0;
- bestTypedef = md;
- bestTemplSpec = "";
- bestResolvedType = md->qualifiedName();
- }
- }
- }
- } // if definition accessible
- else
- {
- //printf(" Not accessible!\n");
- }
- } // if definition is a class or member
- //printf(" bestMatch=%p bestResolvedType=%s\n",bestMatch,bestResolvedType.data());
-}
-
-/* Find the fully qualified class name referred to by the input class
- * or typedef name against the input scope.
- * Loops through scope and each of its parent scopes looking for a
- * match against the input name. Can recursively call itself when
- * resolving typedefs.
- */
-static const ClassDef *getResolvedClassRec(const Definition *scope,
- const FileDef *fileScope,
- const char *n,
- const MemberDef **pTypeDef,
- QCString *pTemplSpec,
- QCString *pResolvedType
- )
-{
- //printf("[getResolvedClassRec(%s,%s)\n",scope?scope->name().data():"<global>",n);
- QCString name;
- QCString explicitScopePart;
- QCString strippedTemplateParams;
- name=stripTemplateSpecifiersFromScope
- (removeRedundantWhiteSpace(n),TRUE,
- &strippedTemplateParams);
- ArgumentList actTemplParams;
- if (!strippedTemplateParams.isEmpty()) // template part that was stripped
- {
- stringToArgumentList(scope->getLanguage(),strippedTemplateParams,actTemplParams);
- }
-
- int qualifierIndex = computeQualifiedIndex(name);
- //printf("name=%s qualifierIndex=%d\n",name.data(),qualifierIndex);
- if (qualifierIndex!=-1) // qualified name
- {
- // split off the explicit scope part
- explicitScopePart=name.left(qualifierIndex);
- // todo: improve namespace alias substitution
- replaceNamespaceAliases(explicitScopePart,explicitScopePart.length());
- name=name.mid(qualifierIndex+2);
- }
-
- if (name.isEmpty())
- {
- //printf("] empty name\n");
- return 0; // empty name
- }
-
- //printf("Looking for symbol %s\n",name.data());
- DefinitionIntf *di = Doxygen::symbolMap->find(name);
- // the -g (for C# generics) and -p (for ObjC protocols) are now already
- // stripped from the key used in the symbolMap, so that is not needed here.
- if (di==0)
- {
- //di = Doxygen::symbolMap->find(name+"-g");
- //if (di==0)
- //{
- di = Doxygen::symbolMap->find(name+"-p");
- if (di==0)
- {
- //printf("no such symbol!\n");
- return 0;
- }
- //}
- }
- //printf("found symbol!\n");
-
- bool hasUsingStatements =
- (fileScope && ((fileScope->getUsedNamespaces() &&
- fileScope->getUsedNamespaces()->count()>0) ||
- (fileScope->getUsedClasses() &&
- fileScope->getUsedClasses()->count()>0))
- );
- //printf("hasUsingStatements=%d\n",hasUsingStatements);
- // Since it is often the case that the same name is searched in the same
- // scope over an over again (especially for the linked source code generation)
- // we use a cache to collect previous results. This is possible since the
- // result of a lookup is deterministic. As the key we use the concatenated
- // scope, the name to search for and the explicit scope prefix. The speedup
- // achieved by this simple cache can be enormous.
- int scopeNameLen = scope->name().length()+1;
- int nameLen = name.length()+1;
- int explicitPartLen = explicitScopePart.length();
- int fileScopeLen = hasUsingStatements ? 1+fileScope->absFilePath().length() : 0;
-
- // below is a more efficient coding of
- // QCString key=scope->name()+"+"+name+"+"+explicitScopePart;
- QCString key(scopeNameLen+nameLen+explicitPartLen+fileScopeLen+1);
- char *p=key.rawData();
- qstrcpy(p,scope->name()); *(p+scopeNameLen-1)='+';
- p+=scopeNameLen;
- qstrcpy(p,name); *(p+nameLen-1)='+';
- p+=nameLen;
- qstrcpy(p,explicitScopePart);
- p+=explicitPartLen;
-
- // if a file scope is given and it contains using statements we should
- // also use the file part in the key (as a class name can be in
- // two different namespaces and a using statement in a file can select
- // one of them).
- if (hasUsingStatements)
- {
- // below is a more efficient coding of
- // key+="+"+fileScope->name();
- *p++='+';
- qstrcpy(p,fileScope->absFilePath());
- p+=fileScopeLen-1;
- }
- *p='\0';
-
- LookupInfo *pval=Doxygen::lookupCache->find(key);
- //printf("Searching for %s result=%p\n",key.data(),pval);
- if (pval)
- {
- //printf("LookupInfo %p %p '%s' %p\n",
- // pval->classDef, pval->typeDef, pval->templSpec.data(),
- // pval->resolvedType.data());
- if (pTemplSpec) *pTemplSpec=pval->templSpec;
- if (pTypeDef) *pTypeDef=pval->typeDef;
- if (pResolvedType) *pResolvedType=pval->resolvedType;
- //printf("] cachedMatch=%s\n",
- // pval->classDef?pval->classDef->name().data():"<none>");
- //if (pTemplSpec)
- // printf("templSpec=%s\n",pTemplSpec->data());
- return pval->classDef;
- }
- else // not found yet; we already add a 0 to avoid the possibility of
- // endless recursion.
- {
- Doxygen::lookupCache->insert(key,new LookupInfo);
- }
-
- const ClassDef *bestMatch=0;
- const MemberDef *bestTypedef=0;
- QCString bestTemplSpec;
- QCString bestResolvedType;
- int minDistance=10000; // init at "infinite"
-
- if (di->definitionType()==DefinitionIntf::TypeSymbolList) // not a unique name
- {
- //printf(" name is not unique\n");
- DefinitionListIterator dli(*(DefinitionList*)di);
- Definition *d;
- int count=0;
- for (dli.toFirst();(d=dli.current());++dli,++count) // foreach definition
- {
- getResolvedSymbol(scope,fileScope,d,explicitScopePart,&actTemplParams,
- minDistance,bestMatch,bestTypedef,bestTemplSpec,
- bestResolvedType);
- }
- }
- else // unique name
- {
- //printf(" name is unique\n");
- Definition *d = (Definition *)di;
- getResolvedSymbol(scope,fileScope,d,explicitScopePart,&actTemplParams,
- minDistance,bestMatch,bestTypedef,bestTemplSpec,
- bestResolvedType);
- }
-
- if (pTypeDef)
- {
- *pTypeDef = bestTypedef;
- }
- if (pTemplSpec)
- {
- *pTemplSpec = bestTemplSpec;
- }
- if (pResolvedType)
- {
- *pResolvedType = bestResolvedType;
- }
- //printf("getResolvedClassRec: bestMatch=%p pval->resolvedType=%s\n",
- // bestMatch,bestResolvedType.data());
-
- pval=Doxygen::lookupCache->find(key);
- if (pval)
- {
- pval->classDef = bestMatch;
- pval->typeDef = bestTypedef;
- pval->templSpec = bestTemplSpec;
- pval->resolvedType = bestResolvedType;
- }
- else
- {
- Doxygen::lookupCache->insert(key,new LookupInfo(bestMatch,bestTypedef,bestTemplSpec,bestResolvedType));
- }
- //printf("] bestMatch=%s distance=%d\n",
- // bestMatch?bestMatch->name().data():"<none>",minDistance);
- //if (pTemplSpec)
- // printf("templSpec=%s\n",pTemplSpec->data());
- return bestMatch;
-}
-
-/* Find the fully qualified class name referred to by the input class
- * or typedef name against the input scope.
- * Loops through scope and each of its parent scopes looking for a
- * match against the input name.
- */
-const ClassDef *getResolvedClass(const Definition *scope,
- const FileDef *fileScope,
- const char *n,
- const MemberDef **pTypeDef,
- QCString *pTemplSpec,
- bool mayBeUnlinkable,
- bool mayBeHidden,
- QCString *pResolvedType
- )
-{
- static bool optimizeOutputVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
- g_resolvedTypedefs.clear();
- if (scope==0 ||
- (scope->definitionType()!=Definition::TypeClass &&
- scope->definitionType()!=Definition::TypeNamespace
- ) ||
- (scope->getLanguage()==SrcLangExt_Java && QCString(n).find("::")!=-1)
- )
- {
- scope=Doxygen::globalScope;
- }
- //printf("------------ getResolvedClass(scope=%s,file=%s,name=%s,mayUnlinkable=%d)\n",
- // scope?scope->name().data():"<global>",
- // fileScope?fileScope->name().data():"<none>",
- // n,
- // mayBeUnlinkable
- // );
- const ClassDef *result;
- if (optimizeOutputVhdl)
- {
- result = getClass(n);
- }
- else
- {
- result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec,pResolvedType);
- }
- if (result==0) // for nested classes imported via tag files, the scope may not
- // present, so we check the class name directly as well.
- // See also bug701314
- {
- result = getClass(n);
- }
- if (!mayBeUnlinkable && result && !result->isLinkable())
- {
- if (!mayBeHidden || !result->isHidden())
- {
- //printf("result was %s\n",result?result->name().data():"<none>");
- result=0; // don't link to artificial/hidden classes unless explicitly allowed
- }
- }
- //printf("getResolvedClass(%s,%s)=%s\n",scope?scope->name().data():"<global>",
- // n,result?result->name().data():"<none>");
- return result;
-}
-
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
-static bool findOperator(const QCString &s,int i)
-{
- int b = s.findRev("operator",i);
- if (b==-1) return FALSE; // not found
- b+=8;
- while (b<i) // check if there are only spaces in between
- // the operator and the >
- {
- if (!isspace((uchar)s.at(b))) return FALSE;
- b++;
- }
- return TRUE;
-}
-
-static bool findOperator2(const QCString &s,int i)
-{
- int b = s.findRev("operator",i);
- if (b==-1) return FALSE; // not found
- b+=8;
- while (b<i) // check if there are only non-ascii
- // characters in front of the operator
- {
- if (isId((uchar)s.at(b))) return FALSE;
- b++;
- }
- return TRUE;
-}
-
static const char constScope[] = { 'c', 'o', 'n', 's', 't', ':' };
static const char virtualScope[] = { 'v', 'i', 'r', 't', 'u', 'a', 'l', ':' };
static const char operatorScope[] = { 'o', 'p', 'e', 'r', 'a', 't', 'o', 'r', '?', '?', '?' };
@@ -1664,30 +517,30 @@ struct CharAroundSpace
{
CharAroundSpace()
{
- charMap['('].before=FALSE;
- charMap['='].before=FALSE;
- charMap['&'].before=FALSE;
- charMap['*'].before=FALSE;
- charMap['['].before=FALSE;
- charMap['|'].before=FALSE;
- charMap['+'].before=FALSE;
- charMap[';'].before=FALSE;
- charMap[':'].before=FALSE;
- charMap['/'].before=FALSE;
-
- charMap['='].after=FALSE;
- charMap[' '].after=FALSE;
- charMap['['].after=FALSE;
- charMap[']'].after=FALSE;
- charMap['\t'].after=FALSE;
- charMap['\n'].after=FALSE;
- charMap[')'].after=FALSE;
- charMap[','].after=FALSE;
- charMap['<'].after=FALSE;
- charMap['|'].after=FALSE;
- charMap['+'].after=FALSE;
- charMap['('].after=FALSE;
- charMap['/'].after=FALSE;
+ charMap[static_cast<int>('(')].before=FALSE;
+ charMap[static_cast<int>('=')].before=FALSE;
+ charMap[static_cast<int>('&')].before=FALSE;
+ charMap[static_cast<int>('*')].before=FALSE;
+ charMap[static_cast<int>('[')].before=FALSE;
+ charMap[static_cast<int>('|')].before=FALSE;
+ charMap[static_cast<int>('+')].before=FALSE;
+ charMap[static_cast<int>(';')].before=FALSE;
+ charMap[static_cast<int>(':')].before=FALSE;
+ charMap[static_cast<int>('/')].before=FALSE;
+
+ charMap[static_cast<int>('=')].after=FALSE;
+ charMap[static_cast<int>(' ')].after=FALSE;
+ charMap[static_cast<int>('[')].after=FALSE;
+ charMap[static_cast<int>(']')].after=FALSE;
+ charMap[static_cast<int>('\t')].after=FALSE;
+ charMap[static_cast<int>('\n')].after=FALSE;
+ charMap[static_cast<int>(')')].after=FALSE;
+ charMap[static_cast<int>(',')].after=FALSE;
+ charMap[static_cast<int>('<')].after=FALSE;
+ charMap[static_cast<int>('|')].after=FALSE;
+ charMap[static_cast<int>('+')].after=FALSE;
+ charMap[static_cast<int>('(')].after=FALSE;
+ charMap[static_cast<int>('/')].after=FALSE;
}
struct CharElem
{
@@ -1704,15 +557,16 @@ static CharAroundSpace g_charAroundSpace;
// Note: this function is not reentrant due to the use of static buffer!
QCString removeRedundantWhiteSpace(const QCString &s)
{
- static bool cliSupport = Config_getBool(CPP_CLI_SUPPORT);
- static bool vhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
+ bool cliSupport = Config_getBool(CPP_CLI_SUPPORT);
+ bool vhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
if (s.isEmpty() || vhdl) return s;
// We use a static character array to
// improve the performance of this function
- static char *growBuf = 0;
- static int growBufLen = 0;
+ // and thread_local is needed to make it multi-thread safe
+ static THREAD_LOCAL char *growBuf = 0;
+ static THREAD_LOCAL int growBufLen = 0;
if ((int)s.length()*3>growBufLen) // For input character we produce at most 3 output characters,
{
growBufLen = s.length()*3;
@@ -1866,7 +720,7 @@ QCString removeRedundantWhiteSpace(const QCString &s)
{
if (nc != '=')
// avoid splitting operator&=
- {
+ {
*dst++=' ';
}
}
@@ -1994,10 +848,10 @@ bool rightScopeMatch(const QCString &scope, const QCString &name)
{
int sl=scope.length();
int nl=name.length();
- return (name==scope || // equal
- (scope.right(nl)==name && // substring
+ return (name==scope || // equal
+ (scope.right(nl)==name && // substring
sl-nl>1 && scope.at(sl-nl-1)==':' && scope.at(sl-nl-2)==':' // scope
- )
+ )
);
}
@@ -2005,10 +859,10 @@ bool leftScopeMatch(const QCString &scope, const QCString &name)
{
int sl=scope.length();
int nl=name.length();
- return (name==scope || // equal
- (scope.left(nl)==name && // substring
+ return (name==scope || // equal
+ (scope.left(nl)==name && // substring
sl>nl+1 && scope.at(nl)==':' && scope.at(nl+1)==':' // scope
- )
+ )
);
}
@@ -2021,8 +875,10 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
//printf("linkify='%s'\n",text);
static QRegExp regExp("[a-z_A-Z\\x80-\\xFF][~!a-z_A-Z0-9$\\\\.:\\x80-\\xFF]*");
static QRegExp regExpSplit("(?!:),");
+ if (text==0) return;
QCString txtStr=text;
int strLen = txtStr.length();
+ if (strLen==0) return;
//printf("linkifyText scope=%s fileScope=%s strtxt=%s strlen=%d external=%d\n",
// scope?scope->name().data():"<none>",
// fileScope?fileScope->name().data():"<none>",
@@ -2032,7 +888,6 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
int newIndex;
int skipIndex=0;
int floatingIndex=0;
- if (strLen==0) return;
// read a word from the text string
while ((newIndex=regExp.match(txtStr,index,&matchLen))!=-1)
{
@@ -2045,11 +900,11 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
}
// add non-word part to the result
- bool insideString=FALSE;
+ bool insideString=FALSE;
int i;
- for (i=index;i<newIndex;i++)
- {
- if (txtStr.at(i)=='"') insideString=!insideString;
+ for (i=index;i<newIndex;i++)
+ {
+ if (txtStr.at(i)=='"') insideString=!insideString;
}
//printf("floatingIndex=%d strlen=%d autoBreak=%d\n",floatingIndex,strLen,autoBreak);
@@ -2069,16 +924,16 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
out.writeBreak(indentLevel==0 ? 0 : indentLevel+1);
out.writeString(splitText.right(splitLength-i-offset),keepSpaces);
floatingIndex=splitLength-i-offset+matchLen;
- }
+ }
else
{
- out.writeString(splitText,keepSpaces);
+ out.writeString(splitText,keepSpaces);
}
}
else
{
- //ol.docify(txtStr.mid(skipIndex,newIndex-skipIndex));
- out.writeString(txtStr.mid(skipIndex,newIndex-skipIndex),keepSpaces);
+ //ol.docify(txtStr.mid(skipIndex,newIndex-skipIndex));
+ out.writeString(txtStr.mid(skipIndex,newIndex-skipIndex),keepSpaces);
}
// get word from string
QCString word=txtStr.mid(newIndex,matchLen);
@@ -2095,8 +950,9 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
const GroupDef *gd=0;
//printf("** Match word '%s'\n",matchWord.data());
- const MemberDef *typeDef=0;
- cd=getResolvedClass(scope,fileScope,matchWord,&typeDef);
+ SymbolResolver resolver(fileScope);
+ cd=resolver.resolveClass(scope,matchWord);
+ const MemberDef *typeDef = resolver.getTypedef();
if (typeDef) // First look at typedef then class, see bug 584184.
{
//printf("Found typedef %s\n",typeDef->name().data());
@@ -2112,7 +968,7 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
}
}
}
- if (!found && (cd || (cd=getClass(matchWord))))
+ if (!found && (cd || (cd=getClass(matchWord))))
{
//printf("Found class %s\n",cd->name().data());
// add link to the result
@@ -2156,10 +1012,10 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
int m = matchWord.findRev("::");
QCString scopeName;
- if (scope &&
- (scope->definitionType()==Definition::TypeClass ||
+ if (scope &&
+ (scope->definitionType()==Definition::TypeClass ||
scope->definitionType()==Definition::TypeNamespace
- )
+ )
)
{
scopeName=scope->name();
@@ -2171,19 +1027,19 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
}
//printf("ScopeName=%s\n",scopeName.data());
- //if (!found) printf("Trying to link %s in %s\n",word.data(),scopeName.data());
- if (!found &&
- getDefs(scopeName,matchWord,0,md,cd,fd,nd,gd) &&
- //(md->isTypedef() || md->isEnumerate() ||
+ //if (!found) printf("Trying to link %s in %s\n",word.data(),scopeName.data());
+ if (!found &&
+ getDefs(scopeName,matchWord,0,md,cd,fd,nd,gd) &&
+ //(md->isTypedef() || md->isEnumerate() ||
// md->isReference() || md->isVariable()
- //) &&
- (external ? md->isLinkable() : md->isLinkableInProject())
+ //) &&
+ (external ? md->isLinkable() : md->isLinkableInProject())
)
{
//printf("Found ref scope=%s\n",d?d->name().data():"<global>");
//ol.writeObjectLink(d->getReference(),d->getOutputFileBase(),
// md->anchor(),word);
- if (md!=self && (self==0 || md->name()!=self->name()))
+ if (md!=self && (self==0 || md->name()!=self->name()))
// name check is needed for overloaded members, where getDefs just returns one
{
/* in case of Fortran scop and the variable is a non Fortran variable: don't link,
@@ -2214,9 +1070,9 @@ void linkifyText(const TextGeneratorIntf &out, const Definition *scope,
}
-void writeExample(OutputList &ol,ExampleSDict *ed)
+void writeExamples(OutputList &ol,const ExampleList &list)
{
- QCString exampleLine=theTranslator->trWriteList(ed->count());
+ QCString exampleLine=theTranslator->trWriteList((int)list.size());
//bool latexEnabled = ol.isEnabled(OutputGenerator::Latex);
//bool manEnabled = ol.isEnabled(OutputGenerator::Man);
@@ -2229,9 +1085,9 @@ void writeExample(OutputList &ol,ExampleSDict *ed)
bool ok;
ol.parseText(exampleLine.mid(index,newIndex-index));
uint entryIndex = exampleLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- Example *e=ed->at(entryIndex);
- if (ok && e)
+ if (ok && entryIndex<list.size())
{
+ const auto &e = list[entryIndex];
ol.pushGeneratorState();
//if (latexEnabled) ol.disable(OutputGenerator::Latex);
ol.disable(OutputGenerator::Latex);
@@ -2239,7 +1095,7 @@ void writeExample(OutputList &ol,ExampleSDict *ed)
ol.disable(OutputGenerator::Docbook);
// link for Html / man
//printf("writeObjectLink(file=%s)\n",e->file.data());
- ol.writeObjectLink(0,e->file,e->anchor,e->name);
+ ol.writeObjectLink(0,e.file,e.anchor,e.name);
ol.popGeneratorState();
ol.pushGeneratorState();
@@ -2248,13 +1104,13 @@ void writeExample(OutputList &ol,ExampleSDict *ed)
ol.disable(OutputGenerator::Html);
// link for Latex / pdf with anchor because the sources
// are not hyperlinked (not possible with a verbatim environment).
- ol.writeObjectLink(0,e->file,0,e->name);
+ ol.writeObjectLink(0,e.file,0,e.name);
//if (manEnabled) ol.enable(OutputGenerator::Man);
//if (htmlEnabled) ol.enable(OutputGenerator::Html);
ol.popGeneratorState();
}
index=newIndex+matchLen;
- }
+ }
ol.parseText(exampleLine.right(exampleLine.length()-index));
ol.writeString(".");
}
@@ -2296,94 +1152,72 @@ QCString argListToString(const ArgumentList &al,bool useCanonicalType,bool showD
if (it!=al.end()) result+=", ";
}
result+=")";
- if (al.constSpecifier) result+=" const";
- if (al.volatileSpecifier) result+=" volatile";
- if (al.refQualifier==RefQualifierLValue) result+=" &";
- else if (al.refQualifier==RefQualifierRValue) result+=" &&";
- if (!al.trailingReturnType.isEmpty()) result+=" -> "+al.trailingReturnType;
- if (al.pureSpecifier) result+=" =0";
+ if (al.constSpecifier()) result+=" const";
+ if (al.volatileSpecifier()) result+=" volatile";
+ if (al.refQualifier()==RefQualifierLValue) result+=" &";
+ else if (al.refQualifier()==RefQualifierRValue) result+=" &&";
+ if (!al.trailingReturnType().isEmpty()) result+=al.trailingReturnType();
+ if (al.pureSpecifier()) result+=" =0";
return removeRedundantWhiteSpace(result);
}
-QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang)
+QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang,bool includeDefault)
{
QCString result;
if (al.empty()) return result;
result="<";
- auto it = al.begin();
- while (it!=al.end())
+ bool first=true;
+ for (const auto &a : al)
{
- Argument a = *it;
- if (!a.name.isEmpty()) // add template argument name
+ if (a.defval.isEmpty() || includeDefault)
{
- if (a.type.left(4)=="out") // C# covariance
+ if (!first) result+=", ";
+ if (!a.name.isEmpty()) // add template argument name
{
- result+="out ";
- }
- else if (a.type.left(3)=="in") // C# contravariance
- {
- result+="in ";
- }
- if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
- {
- result+=a.type+" ";
+ if (a.type.left(4)=="out") // C# covariance
+ {
+ result+="out ";
+ }
+ else if (a.type.left(3)=="in") // C# contravariance
+ {
+ result+="in ";
+ }
+ if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
+ {
+ result+=a.type+" ";
+ }
+ result+=a.name;
}
- result+=a.name;
- }
- else // extract name from type
- {
- int i=a.type.length()-1;
- while (i>=0 && isId(a.type.at(i))) i--;
- if (i>0)
+ else // extract name from type
{
- result+=a.type.right(a.type.length()-i-1);
- if (a.type.find("...")!=-1)
+ int i=a.type.length()-1;
+ while (i>=0 && isId(a.type.at(i))) i--;
+ if (i>0)
+ {
+ result+=a.type.right(a.type.length()-i-1);
+ if (a.type.find("...")!=-1)
+ {
+ result+="...";
+ }
+ }
+ else // nothing found -> take whole name
{
- result+="...";
+ result+=a.type;
}
}
- else // nothing found -> take whole name
+ if (!a.typeConstraint.isEmpty() && lang==SrcLangExt_Java)
{
- result+=a.type;
+ result+=" extends "; // TODO: now Java specific, C# has where...
+ result+=a.typeConstraint;
}
+ first=false;
}
- if (!a.typeConstraint.isEmpty() && lang==SrcLangExt_Java)
- {
- result+=" extends "; // TODO: now Java specific, C# has where...
- result+=a.typeConstraint;
- }
- ++it;
- if (it!=al.end()) result+=", ";
}
result+=">";
return removeRedundantWhiteSpace(result);
}
-// compute the HTML anchors for a list of members
-void setAnchors(MemberList *ml)
-{
- //int count=0;
- if (ml==0) return;
- MemberListIterator mli(*ml);
- MemberDef *md;
- for (;(md=mli.current());++mli)
- {
- if (!md->isReference())
- {
- //QCString anchor;
- //if (groupId==-1)
- // anchor.sprintf("%c%d",id,count++);
- //else
- // anchor.sprintf("%c%d_%d",id,groupId,count++);
- //if (cd) anchor.prepend(escapeCharsInString(cd->name(),FALSE));
- md->setAnchor();
- //printf("setAnchors(): Member %s outputFileBase=%s anchor %s result %s\n",
- // md->name().data(),md->getOutputFileBase().data(),anchor.data(),md->anchor().data());
- }
- }
-}
-
//----------------------------------------------------------------------------
/*! takes the \a buf of the given length \a len and converts CR LF (DOS)
@@ -2404,7 +1238,7 @@ int filterCRLF(char *buf,int len)
{
c = '\n'; // each CR to LF
if (src<len && buf[src] == '\n')
- ++src; // skip LF just after CR (DOS)
+ ++src; // skip LF just after CR (DOS)
}
else if ( c == '\0' && src<len-1) // filter out internal \0 characters, as it will confuse the parser
{
@@ -2415,21 +1249,19 @@ int filterCRLF(char *buf,int len)
return dest; // length of the valid part of the buf
}
-static QCString getFilterFromList(const char *name,const QStrList &filterList,bool &found)
+static QCString getFilterFromList(const char *name,const StringVector &filterList,bool &found)
{
found=FALSE;
// compare the file name to the filter pattern list
- QStrListIterator sli(filterList);
- char* filterStr;
- for (sli.toFirst(); (filterStr = sli.current()); ++sli)
+ for (const auto &filterStr : filterList)
{
- QCString fs = filterStr;
+ QCString fs = filterStr.c_str();
int i_equals=fs.find('=');
if (i_equals!=-1)
{
QCString filterPattern = fs.left(i_equals);
- QRegExp fpat(filterPattern,Portable::fileSystemIsCaseSensitive(),TRUE);
- if (fpat.match(name)!=-1)
+ QRegExp fpat(filterPattern,Portable::fileSystemIsCaseSensitive(),TRUE);
+ if (fpat.match(name)!=-1)
{
// found a match!
QCString filterName = fs.mid(i_equals+1);
@@ -2457,12 +1289,12 @@ QCString getFileFilter(const char* name,bool isSourceCode)
// sanity check
if (name==0) return "";
- QStrList& filterSrcList = Config_getList(FILTER_SOURCE_PATTERNS);
- QStrList& filterList = Config_getList(FILTER_PATTERNS);
+ const StringVector& filterSrcList = Config_getList(FILTER_SOURCE_PATTERNS);
+ const StringVector& filterList = Config_getList(FILTER_PATTERNS);
QCString filterName;
bool found=FALSE;
- if (isSourceCode && !filterSrcList.isEmpty())
+ if (isSourceCode && !filterSrcList.empty())
{ // first look for source filter pattern list
filterName = getFilterFromList(name,filterSrcList,found);
}
@@ -2497,7 +1329,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input)
int outputSize=inputSize*4+1;
QCString output(outputSize);
void *cd = portable_iconv_open(outputEncoding,inputEncoding);
- if (cd==(void *)(-1))
+ if (cd==(void *)(-1))
{
err("unsupported character conversion: '%s'->'%s'\n",
inputEncoding.data(),outputEncoding);
@@ -2529,7 +1361,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input)
/*! reads a file with name \a name and returns it as a string. If \a filter
* is TRUE the file will be filtered by any user specified input filter.
- * If \a name is "-" the string will be read from standard input.
+ * If \a name is "-" the string will be read from standard input.
*/
QCString fileToString(const char *name,bool filter,bool isSourceCode)
{
@@ -2543,13 +1375,13 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode)
if (fileOpened)
{
const int bSize=4096;
- QCString contents(bSize);
+ QCString contents(bSize+1);
int totalSize=0;
int size;
while ((size=f.readBlock(contents.rawData()+totalSize,bSize))==bSize)
{
totalSize+=bSize;
- contents.resize(totalSize+bSize);
+ contents.resize(totalSize+bSize+1);
}
totalSize = filterCRLF(contents.rawData(),totalSize+size)+2;
contents.resize(totalSize);
@@ -2579,7 +1411,7 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode)
return buf.data();
}
}
- if (!fileOpened)
+ if (!fileOpened)
{
err("cannot open file '%s' for reading\n",name);
}
@@ -2609,7 +1441,7 @@ static QDateTime getCurrentDateTime()
static bool warnedOnce=FALSE;
if (!warnedOnce)
{
- warn_uncond("Environment variable SOURCE_DATE_EPOCH must have a value smaller than or equal to %llu; actual value %llu\n",UINT_MAX,epoch);
+ warn_uncond("Environment variable SOURCE_DATE_EPOCH must have a value smaller than or equal to %d; actual value %" PRIu64 "\n",UINT_MAX, (uint64_t)epoch);
warnedOnce=TRUE;
}
}
@@ -2643,46 +1475,41 @@ QCString yearToString()
}
//----------------------------------------------------------------------
-// recursive function that returns the number of branches in the
+// recursive function that returns the number of branches in the
// inheritance tree that the base class 'bcd' is below the class 'cd'
int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level)
{
- if (bcd->categoryOf()) // use class that is being extended in case of
+ if (bcd->categoryOf()) // use class that is being extended in case of
// an Objective-C category
{
bcd=bcd->categoryOf();
}
- if (cd==bcd) return level;
+ if (cd==bcd) return level;
if (level==256)
{
warn_uncond("class %s seem to have a recursive "
"inheritance relation!\n",cd->name().data());
return -1;
}
- int m=maxInheritanceDepth;
- if (cd->baseClasses())
+ int m=maxInheritanceDepth;
+ for (const auto &bcdi : cd->baseClasses())
{
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcdi;
- for (;(bcdi=bcli.current());++bcli)
- {
- int mc=minClassDistance(bcdi->classDef,bcd,level+1);
- if (mc<m) m=mc;
- if (m<0) break;
- }
+ int mc=minClassDistance(bcdi.classDef,bcd,level+1);
+ if (mc<m) m=mc;
+ if (m<0) break;
}
return m;
}
Protection classInheritedProtectionLevel(const ClassDef *cd,const ClassDef *bcd,Protection prot,int level)
{
- if (bcd->categoryOf()) // use class that is being extended in case of
+ if (bcd->categoryOf()) // use class that is being extended in case of
// an Objective-C category
{
bcd=bcd->categoryOf();
}
- if (cd==bcd)
+ if (cd==bcd)
{
goto exit;
}
@@ -2691,14 +1518,12 @@ Protection classInheritedProtectionLevel(const ClassDef *cd,const ClassDef *bcd,
err("Internal inconsistency: found class %s seem to have a recursive "
"inheritance relation! Please send a bug report to doxygen@gmail.com\n",cd->name().data());
}
- else if (cd->baseClasses())
+ else if (prot!=Private)
{
- BaseClassListIterator bcli(*cd->baseClasses());
- const BaseClassDef *bcdi;
- for (;(bcdi=bcli.current()) && prot!=Private;++bcli)
+ for (const auto &bcdi : cd->baseClasses())
{
- Protection baseProt = classInheritedProtectionLevel(bcdi->classDef,bcd,bcdi->prot,level+1);
- if (baseProt==Private) prot=Private;
+ Protection baseProt = classInheritedProtectionLevel(bcdi.classDef,bcd,bcdi.prot,level+1);
+ if (baseProt==Private) prot=Private;
else if (baseProt==Protected) prot=Protected;
}
}
@@ -2707,173 +1532,12 @@ exit:
return prot;
}
-#ifndef NEWMATCH
-// strip any template specifiers that follow className in string s
-static QCString trimTemplateSpecifiers(
- const QCString &namespaceName,
- const QCString &className,
- const QCString &s
- )
-{
- //printf("trimTemplateSpecifiers(%s,%s,%s)\n",namespaceName.data(),className.data(),s.data());
- QCString scopeName=mergeScopes(namespaceName,className);
- ClassDef *cd=getClass(scopeName);
- if (cd==0) return s; // should not happen, but guard anyway.
-
- QCString result=s;
-
- int i=className.length()-1;
- if (i>=0 && className.at(i)=='>') // template specialization
- {
- // replace unspecialized occurrences in s, with their specialized versions.
- int count=1;
- int cl=i+1;
- while (i>=0)
- {
- char c=className.at(i);
- if (c=='>') count++,i--;
- else if (c=='<') { count--; if (count==0) break; }
- else i--;
- }
- QCString unspecClassName=className.left(i);
- int l=i;
- int p=0;
- while ((i=result.find(unspecClassName,p))!=-1)
- {
- if (result.at(i+l)!='<') // unspecialized version
- {
- result=result.left(i)+className+result.right(result.length()-i-l);
- l=cl;
- }
- p=i+l;
- }
- }
-
- //printf("result after specialization: %s\n",result.data());
-
- QCString qualName=cd->qualifiedNameWithTemplateParameters();
- //printf("QualifiedName = %s\n",qualName.data());
- // We strip the template arguments following className (if any)
- if (!qualName.isEmpty()) // there is a class name
- {
- int is,ps=0;
- int p=0,l,i;
-
- while ((is=getScopeFragment(qualName,ps,&l))!=-1)
- {
- QCString qualNamePart = qualName.right(qualName.length()-is);
- //printf("qualNamePart=%s\n",qualNamePart.data());
- while ((i=result.find(qualNamePart,p))!=-1)
- {
- int ql=qualNamePart.length();
- result=result.left(i)+cd->name()+result.right(result.length()-i-ql);
- p=i+cd->name().length();
- }
- ps=is+l;
- }
- }
- //printf("result=%s\n",result.data());
-
- return result.stripWhiteSpace();
-}
-
-/*!
- * @param pattern pattern to look for
- * @param s string to search in
- * @param p position to start
- * @param len resulting pattern length
- * @returns position on which string is found, or -1 if not found
- */
-static int findScopePattern(const QCString &pattern,const QCString &s,
- int p,int *len)
-{
- int sl=s.length();
- int pl=pattern.length();
- int sp=0;
- *len=0;
- while (p<sl)
- {
- sp=p; // start of match
- int pp=0; // pattern position
- while (p<sl && pp<pl)
- {
- if (s.at(p)=='<') // skip template arguments while matching
- {
- int bc=1;
- //printf("skipping pos=%d c=%c\n",p,s.at(p));
- p++;
- while (p<sl)
- {
- if (s.at(p)=='<') bc++;
- else if (s.at(p)=='>')
- {
- bc--;
- if (bc==0)
- {
- p++;
- break;
- }
- }
- //printf("skipping pos=%d c=%c\n",p,s.at(p));
- p++;
- }
- }
- else if (s.at(p)==pattern.at(pp))
- {
- //printf("match at position p=%d pp=%d c=%c\n",p,pp,s.at(p));
- p++;
- pp++;
- }
- else // no match
- {
- //printf("restarting at %d c=%c pat=%s\n",p,s.at(p),pattern.data());
- p=sp+1;
- break;
- }
- }
- if (pp==pl) // whole pattern matches
- {
- *len=p-sp;
- return sp;
- }
- }
- return -1;
-}
-
-static QCString trimScope(const QCString &name,const QCString &s)
-{
- int scopeOffset=name.length();
- QCString result=s;
- do // for each scope
- {
- QCString tmp;
- QCString scope=name.left(scopeOffset)+"::";
- //printf("Trying with scope='%s'\n",scope.data());
-
- int i,p=0,l;
- while ((i=findScopePattern(scope,result,p,&l))!=-1) // for each occurrence
- {
- tmp+=result.mid(p,i-p); // add part before pattern
- p=i+l;
- }
- tmp+=result.right(result.length()-p); // add trailing part
-
- scopeOffset=name.findRev("::",scopeOffset-1);
- result = tmp;
- } while (scopeOffset>0);
- //printf("trimScope(name=%s,scope=%s)=%s\n",name.data(),s.data(),result.data());
- return result;
-}
-#endif
-
-void trimBaseClassScope(BaseClassList *bcl,QCString &s,int level=0)
+void trimBaseClassScope(const BaseClassList &bcl,QCString &s,int level=0)
{
//printf("trimBaseClassScope level=%d '%s'\n",level,s.data());
- BaseClassListIterator bcli(*bcl);
- BaseClassDef *bcd;
- for (;(bcd=bcli.current());++bcli)
+ for (const auto &bcd : bcl)
{
- ClassDef *cd=bcd->classDef;
+ ClassDef *cd=bcd.classDef;
//printf("Trying class %s\n",cd->name().data());
int spos=s.find(cd->name()+"::");
if (spos!=-1)
@@ -2883,8 +1547,10 @@ void trimBaseClassScope(BaseClassList *bcl,QCString &s,int level=0)
);
}
//printf("base class '%s'\n",cd->name().data());
- if (cd->baseClasses())
- trimBaseClassScope(cd->baseClasses(),s,level+1);
+ if (!cd->baseClasses().empty())
+ {
+ trimBaseClassScope(cd->baseClasses(),s,level+1);
+ }
}
}
@@ -2982,7 +1648,7 @@ static void stripIrrelevantString(QCString &target,const QCString &str)
if (i1==-1 && i2==-1)
{
// strip str from target at index i
- target=target.left(i)+target.right(target.length()-i-l);
+ target=target.left(i)+target.right(target.length()-i-l);
changed=TRUE;
i-=l;
}
@@ -3011,8 +1677,8 @@ static void stripIrrelevantString(QCString &target,const QCString &str)
\code
const T param -> T param // not relevant
- const T& param -> const T& param // const needed
- T* const param -> T* param // not relevant
+ const T& param -> const T& param // const needed
+ T* const param -> T* param // not relevant
const T* param -> const T* param // const needed
\endcode
*/
@@ -3032,276 +1698,6 @@ void stripIrrelevantConstVolatile(QCString &s)
//#define MATCH printf("Match at line %d\n",__LINE__);
//#define NOMATCH printf("Nomatch at line %d\n",__LINE__);
-#ifndef NEWMATCH
-static bool matchArgument(const Argument *srcA,const Argument *dstA,
- const QCString &className,
- const QCString &namespaceName,
- NamespaceSDict *usingNamespaces,
- SDict<Definition> *usingClasses)
-{
- //printf("match argument start '%s|%s' <-> '%s|%s' using nsp=%p class=%p\n",
- // srcA->type.data(),srcA->name.data(),
- // dstA->type.data(),dstA->name.data(),
- // usingNamespaces,
- // usingClasses);
-
- // TODO: resolve any typedefs names that are part of srcA->type
- // before matching. This should use className and namespaceName
- // and usingNamespaces and usingClass to determine which typedefs
- // are in-scope, so it will not be very efficient :-(
-
- QCString srcAType=trimTemplateSpecifiers(namespaceName,className,srcA->type);
- QCString dstAType=trimTemplateSpecifiers(namespaceName,className,dstA->type);
- QCString srcAName=srcA->name.stripWhiteSpace();
- QCString dstAName=dstA->name.stripWhiteSpace();
- srcAType.stripPrefix("class ");
- dstAType.stripPrefix("class ");
-
- // allow distinguishing "const A" from "const B" even though
- // from a syntactic point of view they would be two names of the same
- // type "const". This is not fool prove of course, but should at least
- // catch the most common cases.
- if ((srcAType=="const" || srcAType=="volatile") && !srcAName.isEmpty())
- {
- srcAType+=" ";
- srcAType+=srcAName;
- }
- if ((dstAType=="const" || dstAType=="volatile") && !dstAName.isEmpty())
- {
- dstAType+=" ";
- dstAType+=dstAName;
- }
- if (srcAName=="const" || srcAName=="volatile")
- {
- srcAType+=srcAName;
- srcAName.resize(0);
- }
- else if (dstA->name=="const" || dstA->name=="volatile")
- {
- dstAType+=dstA->name;
- dstAName.resize(0);
- }
-
- stripIrrelevantConstVolatile(srcAType);
- stripIrrelevantConstVolatile(dstAType);
-
- // strip typename keyword
- if (qstrncmp(srcAType,"typename ",9)==0)
- {
- srcAType = srcAType.right(srcAType.length()-9);
- }
- if (qstrncmp(dstAType,"typename ",9)==0)
- {
- dstAType = dstAType.right(dstAType.length()-9);
- }
-
- srcAType = removeRedundantWhiteSpace(srcAType);
- dstAType = removeRedundantWhiteSpace(dstAType);
-
- //srcAType=stripTemplateSpecifiersFromScope(srcAType,FALSE);
- //dstAType=stripTemplateSpecifiersFromScope(dstAType,FALSE);
-
- //printf("srcA='%s|%s' dstA='%s|%s'\n",srcAType.data(),srcAName.data(),
- // dstAType.data(),dstAName.data());
-
- if (srcA->array!=dstA->array) // nomatch for char[] against char
- {
- NOMATCH
- return FALSE;
- }
- if (srcAType!=dstAType) // check if the argument only differs on name
- {
-
- // remove a namespace scope that is only in one type
- // (assuming a using statement was used)
- //printf("Trimming %s<->%s: %s\n",srcAType.data(),dstAType.data(),namespaceName.data());
- //trimNamespaceScope(srcAType,dstAType,namespaceName);
- //printf("After Trimming %s<->%s\n",srcAType.data(),dstAType.data());
-
- //QCString srcScope;
- //QCString dstScope;
-
- // strip redundant scope specifiers
- if (!className.isEmpty())
- {
- srcAType=trimScope(className,srcAType);
- dstAType=trimScope(className,dstAType);
- //printf("trimScope: '%s' <=> '%s'\n",srcAType.data(),dstAType.data());
- ClassDef *cd;
- if (!namespaceName.isEmpty())
- cd=getClass(namespaceName+"::"+className);
- else
- cd=getClass(className);
- if (cd && cd->baseClasses())
- {
- trimBaseClassScope(cd->baseClasses(),srcAType);
- trimBaseClassScope(cd->baseClasses(),dstAType);
- }
- //printf("trimBaseClassScope: '%s' <=> '%s'\n",srcAType.data(),dstAType.data());
- }
- if (!namespaceName.isEmpty())
- {
- srcAType=trimScope(namespaceName,srcAType);
- dstAType=trimScope(namespaceName,dstAType);
- }
- //printf("#usingNamespace=%d\n",usingNamespaces->count());
- if (usingNamespaces && usingNamespaces->count()>0)
- {
- NamespaceSDict::Iterator nli(*usingNamespaces);
- NamespaceDef *nd;
- for (;(nd=nli.current());++nli)
- {
- srcAType=trimScope(nd->name(),srcAType);
- dstAType=trimScope(nd->name(),dstAType);
- }
- }
- //printf("#usingClasses=%d\n",usingClasses->count());
- if (usingClasses && usingClasses->count()>0)
- {
- SDict<Definition>::Iterator cli(*usingClasses);
- Definition *cd;
- for (;(cd=cli.current());++cli)
- {
- srcAType=trimScope(cd->name(),srcAType);
- dstAType=trimScope(cd->name(),dstAType);
- }
- }
-
- //printf("2. srcA=%s|%s dstA=%s|%s\n",srcAType.data(),srcAName.data(),
- // dstAType.data(),dstAName.data());
-
- if (!srcAName.isEmpty() && !dstA->type.isEmpty() &&
- (srcAType+" "+srcAName)==dstAType)
- {
- MATCH
- return TRUE;
- }
- else if (!dstAName.isEmpty() && !srcA->type.isEmpty() &&
- (dstAType+" "+dstAName)==srcAType)
- {
- MATCH
- return TRUE;
- }
-
-
- uint srcPos=0,dstPos=0;
- bool equal=TRUE;
- while (srcPos<srcAType.length() && dstPos<dstAType.length() && equal)
- {
- equal=srcAType.at(srcPos)==dstAType.at(dstPos);
- if (equal) srcPos++,dstPos++;
- }
- uint srcATypeLen=srcAType.length();
- uint dstATypeLen=dstAType.length();
- if (srcPos<srcATypeLen && dstPos<dstATypeLen)
- {
- // if nothing matches or the match ends in the middle or at the
- // end of a string then there is no match
- if (srcPos==0 || dstPos==0)
- {
- NOMATCH
- return FALSE;
- }
- if (isId(srcAType.at(srcPos)) && isId(dstAType.at(dstPos)))
- {
- //printf("partial match srcPos=%d dstPos=%d!\n",srcPos,dstPos);
- // check if a name if already found -> if no then there is no match
- if (!srcAName.isEmpty() || !dstAName.isEmpty())
- {
- NOMATCH
- return FALSE;
- }
- // types only
- while (srcPos<srcATypeLen && isId(srcAType.at(srcPos))) srcPos++;
- while (dstPos<dstATypeLen && isId(dstAType.at(dstPos))) dstPos++;
- if (srcPos<srcATypeLen ||
- dstPos<dstATypeLen ||
- (srcPos==srcATypeLen && dstPos==dstATypeLen)
- )
- {
- NOMATCH
- return FALSE;
- }
- }
- else
- {
- // otherwise we assume that a name starts at the current position.
- while (srcPos<srcATypeLen && isId(srcAType.at(srcPos))) srcPos++;
- while (dstPos<dstATypeLen && isId(dstAType.at(dstPos))) dstPos++;
-
- // if nothing more follows for both types then we assume we have
- // found a match. Note that now 'signed int' and 'signed' match, but
- // seeing that int is not a name can only be done by looking at the
- // semantics.
-
- if (srcPos!=srcATypeLen || dstPos!=dstATypeLen)
- {
- NOMATCH
- return FALSE;
- }
- }
- }
- else if (dstPos<dstAType.length())
- {
- if (!isspace((uchar)dstAType.at(dstPos))) // maybe the names differ
- {
- if (!dstAName.isEmpty()) // dst has its name separated from its type
- {
- NOMATCH
- return FALSE;
- }
- while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++;
- if (dstPos!=dstAType.length())
- {
- NOMATCH
- return FALSE; // more than a difference in name -> no match
- }
- }
- else // maybe dst has a name while src has not
- {
- dstPos++;
- while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++;
- if (dstPos!=dstAType.length() || !srcAName.isEmpty())
- {
- NOMATCH
- return FALSE; // nope not a name -> no match
- }
- }
- }
- else if (srcPos<srcAType.length())
- {
- if (!isspace((uchar)srcAType.at(srcPos))) // maybe the names differ
- {
- if (!srcAName.isEmpty()) // src has its name separated from its type
- {
- NOMATCH
- return FALSE;
- }
- while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++;
- if (srcPos!=srcAType.length())
- {
- NOMATCH
- return FALSE; // more than a difference in name -> no match
- }
- }
- else // maybe src has a name while dst has not
- {
- srcPos++;
- while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++;
- if (srcPos!=srcAType.length() || !dstAName.isEmpty())
- {
- NOMATCH
- return FALSE; // nope not a name -> no match
- }
- }
- }
- }
- MATCH
- return TRUE;
-}
-
-#endif
-
static QCString stripDeclKeywords(const QCString &s)
{
int i=s.find(" class ");
@@ -3320,11 +1716,11 @@ static QCString extractCanonicalType(const Definition *d,const FileDef *fs,QCStr
QCString getCanonicalTemplateSpec(const Definition *d,const FileDef *fs,const QCString& spec)
{
-
+
QCString templSpec = spec.stripWhiteSpace();
// this part had been commented out before... but it is needed to match for instance
// std::list<std::string> against list<string> so it is now back again!
- if (!templSpec.isEmpty() && templSpec.at(0) == '<')
+ if (!templSpec.isEmpty() && templSpec.at(0) == '<')
{
templSpec = "< " + extractCanonicalType(d,fs,templSpec.right(templSpec.length()-1).stripWhiteSpace());
}
@@ -3345,8 +1741,7 @@ static QCString getCanonicalTypeForIdentifier(
if (count>10) return word; // oops recursion
QCString symName,result,templSpec,tmpName;
- //DefinitionList *defList=0;
- if (tSpec && !tSpec->isEmpty())
+ if (tSpec && !tSpec->isEmpty())
templSpec = stripDeclKeywords(getCanonicalTemplateSpec(d,fs,*tSpec));
if (word.findRev("::")!=-1 && !(tmpName=stripScope(word)).isEmpty())
@@ -3357,21 +1752,26 @@ static QCString getCanonicalTypeForIdentifier(
{
symName=word;
}
- //printf("getCanonicalTypeForIdentifier(%s,[%s->%s]) start\n",
- // word.data(),tSpec?tSpec->data():"<none>",templSpec.data());
-
- const ClassDef *cd = 0;
- const MemberDef *mType = 0;
- QCString ts;
- QCString resolvedType;
+ //printf("getCanonicalTypeForIdentifier(%s d=%s fs=%s ,[%s->%s]) start\n",
+ // word.data(),
+ // d ? d->name().data() : "<null>",fs ? fs->name().data() : "<null>",
+ // tSpec?tSpec->data():"<none>",templSpec.data());
// lookup class / class template instance
- cd = getResolvedClass(d,fs,word+templSpec,&mType,&ts,TRUE,TRUE,&resolvedType);
+ SymbolResolver resolver(fs);
+ const ClassDef *cd = resolver.resolveClass(d,word+templSpec,true,true);
+ const MemberDef *mType = resolver.getTypedef();
+ QCString ts = resolver.getTemplateSpec();
+ QCString resolvedType = resolver.getResolvedType();
+
bool isTemplInst = cd && !templSpec.isEmpty();
if (!cd && !templSpec.isEmpty())
{
// class template specialization not known, look up class template
- cd = getResolvedClass(d,fs,word,&mType,&ts,TRUE,TRUE,&resolvedType);
+ cd = resolver.resolveClass(d,word,true,true);
+ mType = resolver.getTypedef();
+ ts = resolver.getTemplateSpec();
+ resolvedType = resolver.getResolvedType();
}
if (cd && cd->isUsedOnly()) cd=0; // ignore types introduced by usage relations
@@ -3451,7 +1851,13 @@ static QCString getCanonicalTypeForIdentifier(
//printf("word=%s typeString=%s\n",word.data(),mType->typeString());
if (word!=mType->typeString())
{
- result = getCanonicalTypeForIdentifier(d,fs,mType->typeString(),tSpec,count+1);
+ QCString type = mType->typeString();
+ if (type.startsWith("typename "))
+ {
+ type.stripPrefix("typename ");
+ type = stripTemplateSpecifiersFromScope(type,FALSE);
+ }
+ result = getCanonicalTypeForIdentifier(d,fs,type,tSpec,count+1);
}
else
{
@@ -3504,11 +1910,10 @@ static QCString extractCanonicalType(const Definition *d,const FileDef *fs,QCStr
//printf(" i=%d p=%d\n",i,p);
if (i>pp) canType += type.mid(pp,i-pp);
-
QCString ct = getCanonicalTypeForIdentifier(d,fs,word,&templSpec);
// in case the ct is empty it means that "word" represents scope "d"
- // and this does not need to be added to the canonical
+ // and this does not need to be added to the canonical
// type (it is redundant), so/ we skip it. This solves problem 589616.
if (ct.isEmpty() && type.mid(p,2)=="::")
{
@@ -3522,7 +1927,7 @@ static QCString extractCanonicalType(const Definition *d,const FileDef *fs,QCStr
// word.data(),templSpec.data(),canType.data(),ct.data());
if (!templSpec.isEmpty()) // if we didn't use up the templSpec already
// (i.e. type is not a template specialization)
- // then resolve any identifiers inside.
+ // then resolve any identifiers inside.
{
static QRegExp re("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9\\x80-\\xFF]*");
int tp=0,tl,ti;
@@ -3550,11 +1955,11 @@ static QCString extractCanonicalArgType(const Definition *d,const FileDef *fs,co
QCString type = arg.type.stripWhiteSpace();
QCString name = arg.name;
//printf("----- extractCanonicalArgType(type=%s,name=%s)\n",type.data(),name.data());
- if ((type=="const" || type=="volatile") && !name.isEmpty())
+ if ((type=="const" || type=="volatile") && !name.isEmpty())
{ // name is part of type => correct
type+=" ";
type+=name;
- }
+ }
if (name=="const" || name=="volatile")
{ // name is part of type => correct
if (!type.isEmpty()) type+=" ";
@@ -3575,9 +1980,9 @@ static bool matchArgument2(
{
//printf(">> match argument: %s::'%s|%s' (%s) <-> %s::'%s|%s' (%s)\n",
// srcScope ? srcScope->name().data() : "",
- // srcA->type.data(),srcA->name.data(),srcA->canType.data(),
+ // srcA.type.data(),srcA.name.data(),srcA.canType.data(),
// dstScope ? dstScope->name().data() : "",
- // dstA->type.data(),dstA->name.data(),dstA->canType.data());
+ // dstA.type.data(),dstA.name.data(),dstA.canType.data());
//if (srcA->array!=dstA->array) // nomatch for char[] against char
//{
@@ -3630,34 +2035,46 @@ static bool matchArgument2(
// new algorithm for argument matching
-bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList &inSrcAl,
- const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList &inDstAl,
+bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList *srcAl,
+ const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList *dstAl,
bool checkCV)
{
ASSERT(srcScope!=0 && dstScope!=0);
- ArgumentList srcAl = inSrcAl;
- ArgumentList dstAl = inDstAl;
+ if (srcAl==0 || dstAl==0)
+ {
+ bool match = srcAl==dstAl;
+ if (match)
+ {
+ MATCH
+ return TRUE;
+ }
+ else
+ {
+ NOMATCH
+ return FALSE;
+ }
+ }
// handle special case with void argument
- if ( srcAl.empty() && dstAl.size()==1 && dstAl.front().type=="void" )
+ if ( srcAl->empty() && dstAl->size()==1 && dstAl->front().type=="void" )
{ // special case for finding match between func() and func(void)
Argument a;
a.type = "void";
- srcAl.push_back(a);
+ const_cast<ArgumentList*>(srcAl)->push_back(a);
MATCH
return TRUE;
}
- if ( dstAl.empty() && srcAl.size()==1 && srcAl.front().type=="void" )
+ if ( dstAl->empty() && srcAl->size()==1 && srcAl->front().type=="void" )
{ // special case for finding match between func(void) and func()
Argument a;
a.type = "void";
- dstAl.push_back(a);
+ const_cast<ArgumentList*>(dstAl)->push_back(a);
MATCH
return TRUE;
}
- if (srcAl.size() != dstAl.size())
+ if (srcAl->size() != dstAl->size())
{
NOMATCH
return FALSE; // different number of arguments -> no match
@@ -3665,19 +2082,19 @@ bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,cons
if (checkCV)
{
- if (srcAl.constSpecifier != dstAl.constSpecifier)
+ if (srcAl->constSpecifier() != dstAl->constSpecifier())
{
NOMATCH
return FALSE; // one member is const, the other not -> no match
}
- if (srcAl.volatileSpecifier != dstAl.volatileSpecifier)
+ if (srcAl->volatileSpecifier() != dstAl->volatileSpecifier())
{
NOMATCH
return FALSE; // one member is volatile, the other not -> no match
}
}
- if (srcAl.refQualifier != dstAl.refQualifier)
+ if (srcAl->refQualifier() != dstAl->refQualifier())
{
NOMATCH
return FALSE; // one member is has a different ref-qualifier than the other
@@ -3685,12 +2102,12 @@ bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,cons
// so far the argument list could match, so we need to compare the types of
// all arguments.
- auto srcIt = srcAl.begin();
- auto dstIt = dstAl.begin();
- for (;srcIt!=srcAl.end() && dstIt!=dstAl.end();++srcIt,++dstIt)
+ auto srcIt = srcAl->begin();
+ auto dstIt = dstAl->begin();
+ for (;srcIt!=srcAl->end() && dstIt!=dstAl->end();++srcIt,++dstIt)
{
- Argument &srcA = *srcIt;
- Argument &dstA = *dstIt;
+ Argument &srcA = const_cast<Argument&>(*srcIt);
+ Argument &dstA = const_cast<Argument&>(*dstIt);
if (!matchArgument2(srcScope,srcFileScope,srcA,
dstScope,dstFileScope,dstA)
)
@@ -3700,7 +2117,7 @@ bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,cons
}
}
MATCH
- return TRUE; // all arguments match
+ return TRUE; // all arguments match
}
@@ -3843,44 +2260,40 @@ void mergeArguments(ArgumentList &srcAl,ArgumentList &dstAl,bool forceNameOverwr
}
}
-static void findMembersWithSpecificName(MemberName *mn,
+static void findMembersWithSpecificName(const MemberName *mn,
const char *args,
bool checkStatics,
const FileDef *currentFile,
bool checkCV,
- const char *forceTagFile,
QList<MemberDef> &members)
{
//printf(" Function with global scope name '%s' args='%s'\n",
// mn->memberName(),args);
- MemberNameIterator mli(*mn);
- const MemberDef *md = 0;
- for (mli.toFirst();(md=mli.current());++mli)
+ for (const auto &md_p : *mn)
{
+ const MemberDef *md = md_p.get();
const FileDef *fd=md->getFileDef();
const GroupDef *gd=md->getGroupDef();
//printf(" md->name()='%s' md->args='%s' fd=%p gd=%p current=%p ref=%s\n",
// md->name().data(),args,fd,gd,currentFile,md->getReference().data());
if (
- ((gd && gd->isLinkable()) || (fd && fd->isLinkable()) || md->isReference()) &&
+ ((gd && gd->isLinkable()) || (fd && fd->isLinkable()) || md->isReference()) &&
md->getNamespaceDef()==0 && md->isLinkable() &&
- (!checkStatics || (!md->isStatic() && !md->isDefine()) ||
+ (!checkStatics || (!md->isStatic() && !md->isDefine()) ||
currentFile==0 || fd==currentFile) // statics must appear in the same file
- )
+ )
{
bool match=TRUE;
- ArgumentList *argList=0;
if (args && !md->isDefine() && qstrcmp(args,"()")!=0)
{
const ArgumentList &mdAl = md->argumentList();
- ArgumentList argList;
- stringToArgumentList(md->getLanguage(),args,argList);
+ auto argList_p = stringToArgumentList(md->getLanguage(),args);
match=matchArguments2(
- md->getOuterScope(),fd,mdAl,
- Doxygen::globalScope,fd,argList,
+ md->getOuterScope(),fd,&mdAl,
+ Doxygen::globalScope,fd,argList_p.get(),
checkCV);
}
- if (match && (forceTagFile==0 || md->getReference()==forceTagFile))
+ if (match)
{
//printf("Found match!\n");
members.append(md);
@@ -3894,17 +2307,17 @@ static void findMembersWithSpecificName(MemberName *mn,
* memberName may also include a (partial) scope to indicate the scope
* in which the member is located.
*
- * The parameter 'scName' is a string representing the name of the scope in
+ * The parameter 'scName' is a string representing the name of the scope in
* which the link was found.
*
- * In case of a function args contains a string representation of the
- * argument list. Passing 0 means the member has no arguments.
+ * In case of a function args contains a string representation of the
+ * argument list. Passing 0 means the member has no arguments.
* Passing "()" means any argument list will do, but "()" is preferred.
*
* The function returns TRUE if the member is known and documented or
* FALSE if it is not.
- * If TRUE is returned parameter 'md' contains a pointer to the member
- * definition. Furthermore exactly one of the parameter 'cd', 'nd', or 'fd'
+ * If TRUE is returned parameter 'md' contains a pointer to the member
+ * definition. Furthermore exactly one of the parameter 'cd', 'nd', or 'fd'
* will be non-zero:
* - if 'cd' is non zero, the member was found in a class pointed to by cd.
* - if 'nd' is non zero, the member was found in a namespace pointed to by nd.
@@ -3912,17 +2325,16 @@ static void findMembersWithSpecificName(MemberName *mn,
* file fd.
*/
bool getDefs(const QCString &scName,
- const QCString &mbName,
+ const QCString &mbName,
const char *args,
- const MemberDef *&md,
- const ClassDef *&cd,
- const FileDef *&fd,
- const NamespaceDef *&nd,
+ const MemberDef *&md,
+ const ClassDef *&cd,
+ const FileDef *&fd,
+ const NamespaceDef *&nd,
const GroupDef *&gd,
bool forceEmptyScope,
const FileDef *currentFile,
- bool checkCV,
- const char *forceTagFile
+ bool checkCV
)
{
fd=0, md=0, cd=0, nd=0, gd=0;
@@ -3937,12 +2349,12 @@ bool getDefs(const QCString &scName,
int is,im=0,pm=0;
// strip common part of the scope from the scopeName
- while ((is=scopeName.findRev("::"))!=-1 &&
+ while ((is=scopeName.findRev("::"))!=-1 &&
(im=memberName.find("::",pm))!=-1 &&
(scopeName.right(scopeName.length()-is-2)==memberName.mid(pm,im-pm))
)
{
- scopeName=scopeName.left(is);
+ scopeName=scopeName.left(is);
pm=im+2;
}
//printf("result after scope corrections scope=%s name=%s\n",
@@ -3952,11 +2364,11 @@ bool getDefs(const QCString &scName,
QCString mScope;
if (memberName.left(9)!="operator " && // treat operator conversion methods
// as a special case
- (im=memberName.findRev("::"))!=-1 &&
+ (im=memberName.findRev("::"))!=-1 &&
im<(int)memberName.length()-2 // not A::
)
{
- mScope=memberName.left(im);
+ mScope=memberName.left(im);
mName=memberName.right(memberName.length()-im-2);
}
@@ -3965,7 +2377,7 @@ bool getDefs(const QCString &scName,
//printf("mScope='%s' mName='%s'\n",mScope.data(),mName.data());
- MemberName *mn = Doxygen::memberNameSDict->find(mName);
+ MemberName *mn = Doxygen::memberNameLinkedMap->find(mName);
//printf("mName=%s mn=%p\n",mName.data(),mn);
if ((!forceEmptyScope || scopeName.isEmpty()) && // this was changed for bug638856, forceEmptyScope => empty scopeName
@@ -3985,41 +2397,43 @@ bool getDefs(const QCString &scName,
className=mScope;
}
- const MemberDef *tmd=0;
- const ClassDef *fcd=getResolvedClass(Doxygen::globalScope,0,className,&tmd);
+ SymbolResolver resolver;
+ const ClassDef *fcd=resolver.resolveClass(Doxygen::globalScope,className);
+ const MemberDef *tmd=resolver.getTypedef();
+
if (fcd==0 && className.find('<')!=-1) // try without template specifiers as well
{
QCString nameWithoutTemplates = stripTemplateSpecifiersFromScope(className,FALSE);
- fcd=getResolvedClass(Doxygen::globalScope,0,nameWithoutTemplates,&tmd);
+ fcd=resolver.resolveClass(Doxygen::globalScope,nameWithoutTemplates);
+ tmd=resolver.getTypedef();
}
//printf("Trying class scope %s: fcd=%p tmd=%p\n",className.data(),fcd,tmd);
// todo: fill in correct fileScope!
if (fcd && // is it a documented class
- fcd->isLinkable()
+ fcd->isLinkable()
)
{
//printf(" Found fcd=%p\n",fcd);
- MemberNameIterator mmli(*mn);
- MemberDef *mmd;
- int mdist=maxInheritanceDepth;
- ArgumentList argList;
+ int mdist=maxInheritanceDepth;
+ std::unique_ptr<ArgumentList> argList;
if (args)
{
- stringToArgumentList(fcd->getLanguage(),args,argList);
+ argList = stringToArgumentList(fcd->getLanguage(),args);
}
- for (mmli.toFirst();(mmd=mmli.current());++mmli)
+ for (const auto &mmd_p : *mn)
{
+ MemberDef *mmd = mmd_p.get();
if (!mmd->isStrongEnumValue())
{
const ArgumentList &mmdAl = mmd->argumentList();
bool match=args==0 ||
- matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
- fcd, fcd->getFileDef(),argList,
+ matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),&mmdAl,
+ fcd, fcd->getFileDef(),argList.get(),
checkCV);
//printf("match=%d\n",match);
if (match)
{
- ClassDef *mcd=mmd->getClassDef();
+ const ClassDef *mcd=mmd->getClassDef();
if (mcd)
{
int m=minClassDistance(fcd,mcd);
@@ -4037,11 +2451,12 @@ bool getDefs(const QCString &scName,
// no exact match found, but if args="()" an arbitrary member will do
{
//printf(" >Searching for arbitrary member\n");
- for (mmli.toFirst();(mmd=mmli.current());++mmli)
+ for (const auto &mmd_p : *mn)
{
+ MemberDef *mmd = mmd_p.get();
//if (mmd->isLinkable())
//{
- ClassDef *mcd=mmd->getClassDef();
+ const ClassDef *mcd=mmd->getClassDef();
//printf(" >Class %s found\n",mcd->name().data());
if (mcd)
{
@@ -4058,9 +2473,9 @@ bool getDefs(const QCString &scName,
}
}
//printf(" >Success=%d\n",mdist<maxInheritanceDepth);
- if (mdist<maxInheritanceDepth)
+ if (mdist<maxInheritanceDepth)
{
- if (!md->isLinkable() || md->isStrongEnumValue())
+ if (!md->isLinkable() || md->isStrongEnumValue())
{
md=0; // avoid returning things we cannot link to
cd=0;
@@ -4073,7 +2488,7 @@ bool getDefs(const QCString &scName,
return TRUE; /* found match */
}
}
- }
+ }
if (tmd && tmd->isEnumerate() && tmd->isStrong()) // scoped enum
{
//printf("Found scoped enum!\n");
@@ -4117,18 +2532,18 @@ bool getDefs(const QCString &scName,
if (mn && scopeName.isEmpty() && mScope.isEmpty()) // Maybe a related function?
{
//printf("Global symbol\n");
- MemberNameIterator mmli(*mn);
- MemberDef *mmd, *fuzzy_mmd = 0;
- ArgumentList argList;
+ const MemberDef *fuzzy_mmd = 0;
+ std::unique_ptr<ArgumentList> argList;
bool hasEmptyArgs = args && qstrcmp(args, "()") == 0;
if (args)
{
- stringToArgumentList(SrcLangExt_Cpp, args, argList);
+ argList = stringToArgumentList(SrcLangExt_Cpp, args);
}
- for (mmli.toFirst(); (mmd = mmli.current()); ++mmli)
+ for (const auto &mmd_p : *mn)
{
+ const MemberDef *mmd = mmd_p.get();
if (!mmd->isLinkable() || (!mmd->isRelated() && !mmd->isForeign()) ||
!mmd->getClassDef())
{
@@ -4137,16 +2552,18 @@ bool getDefs(const QCString &scName,
if (!args)
{
+ fuzzy_mmd = mmd;
break;
}
- ArgumentList &mmdAl = mmd->argumentList();
- if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
- Doxygen::globalScope,mmd->getFileDef(),argList,
+ const ArgumentList &mmdAl = mmd->argumentList();
+ if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),&mmdAl,
+ Doxygen::globalScope,mmd->getFileDef(),argList.get(),
checkCV
)
)
{
+ fuzzy_mmd = mmd;
break;
}
@@ -4156,12 +2573,10 @@ bool getDefs(const QCString &scName,
}
}
- mmd = mmd ? mmd : fuzzy_mmd;
-
- if (mmd && !mmd->isStrongEnumValue())
+ if (fuzzy_mmd && !fuzzy_mmd->isStrongEnumValue())
{
- md = mmd;
- cd = mmd->getClassDef();
+ md = fuzzy_mmd;
+ cd = fuzzy_mmd->getClassDef();
return TRUE;
}
}
@@ -4170,7 +2585,7 @@ bool getDefs(const QCString &scName,
// maybe an namespace, file or group member ?
//printf("Testing for global symbol scopeName='%s' mScope='%s' :: mName='%s'\n",
// scopeName.data(),mScope.data(),mName.data());
- if ((mn=Doxygen::functionNameSDict->find(mName))) // name is known
+ if ((mn=Doxygen::functionNameLinkedMap->find(mName))) // name is known
{
//printf(" >symbol name found\n");
NamespaceDef *fnd=0;
@@ -4187,31 +2602,31 @@ bool getDefs(const QCString &scName,
namespaceName=mScope.copy();
}
//printf("Trying namespace %s\n",namespaceName.data());
- if (!namespaceName.isEmpty() &&
- (fnd=Doxygen::namespaceSDict->find(namespaceName)) &&
+ if (!namespaceName.isEmpty() &&
+ (fnd=Doxygen::namespaceLinkedMap->find(namespaceName)) &&
fnd->isLinkable()
)
{
//printf("Symbol inside existing namespace '%s' count=%d\n",
// namespaceName.data(),mn->count());
bool found=FALSE;
- MemberNameIterator mmli(*mn);
- const MemberDef *mmd;
- for (mmli.toFirst();((mmd=mmli.current()) && !found);++mmli)
+ for (const auto &mmd_p : *mn)
{
+ const MemberDef *mmd = mmd_p.get();
//printf("mmd->getNamespaceDef()=%p fnd=%p\n",
// mmd->getNamespaceDef(),fnd);
const MemberDef *emd = mmd->getEnumScope();
if (emd && emd->isStrong())
{
//printf("yes match %s<->%s!\n",mScope.data(),emd->localName().data());
- if (emd->getNamespaceDef()==fnd &&
+ if (emd->getNamespaceDef()==fnd &&
rightScopeMatch(mScope,emd->localName()))
{
//printf("found it!\n");
nd=fnd;
md=mmd;
found=TRUE;
+ break;
}
else
{
@@ -4223,14 +2638,13 @@ bool getDefs(const QCString &scName,
else if (mmd->getOuterScope()==fnd /* && mmd->isLinkable() */ )
{ // namespace is found
bool match=TRUE;
- ArgumentList argList;
if (args && qstrcmp(args,"()")!=0)
{
const ArgumentList &mmdAl = mmd->argumentList();
- stringToArgumentList(mmd->getLanguage(),args,argList);
+ auto argList_p = stringToArgumentList(mmd->getLanguage(),args);
match=matchArguments2(
- mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
- fnd,mmd->getFileDef(),argList,
+ mmd->getOuterScope(),mmd->getFileDef(),&mmdAl,
+ fnd,mmd->getFileDef(),argList_p.get(),
checkCV);
}
if (match)
@@ -4238,26 +2652,29 @@ bool getDefs(const QCString &scName,
nd=fnd;
md=mmd;
found=TRUE;
+ break;
}
}
}
- if (!found && args && !qstrcmp(args,"()"))
- // no exact match found, but if args="()" an arbitrary
+ if (!found && args && !qstrcmp(args,"()"))
+ // no exact match found, but if args="()" an arbitrary
// member will do
{
- for (mmli.toFirst();((mmd=mmli.current()) && !found);++mmli)
+ for (const auto &mmd_p : *mn)
{
+ const MemberDef *mmd = mmd_p.get();
if (mmd->getNamespaceDef()==fnd /*&& mmd->isLinkable() */ )
{
nd=fnd;
md=mmd;
found=TRUE;
+ break;
}
}
}
if (found)
{
- if (!md->isLinkable())
+ if (!md->isLinkable())
{
md=0; // avoid returning things we cannot link to
nd=0;
@@ -4274,10 +2691,9 @@ bool getDefs(const QCString &scName,
else
{
//printf("not a namespace\n");
- MemberNameIterator mmli(*mn);
- MemberDef *mmd;
- for (mmli.toFirst();(mmd=mmli.current());++mmli)
+ for (const auto &mmd_p : *mn)
{
+ const MemberDef *mmd = mmd_p.get();
const MemberDef *tmd = mmd->getEnumScope();
//printf("try member %s tmd=%s\n",mmd->name().data(),tmd?tmd->name().data():"<none>");
int ni=namespaceName.findRev("::");
@@ -4314,31 +2730,34 @@ bool getDefs(const QCString &scName,
{
QList<MemberDef> members;
// search for matches with strict static checking
- findMembersWithSpecificName(mn,args,TRUE,currentFile,checkCV,forceTagFile,members);
+ findMembersWithSpecificName(mn,args,TRUE,currentFile,checkCV,members);
if (members.count()==0) // nothing found
{
// search again without strict static checking
- findMembersWithSpecificName(mn,args,FALSE,currentFile,checkCV,forceTagFile,members);
+ findMembersWithSpecificName(mn,args,FALSE,currentFile,checkCV,members);
}
//printf("found %d members\n",members.count());
if (members.count()!=1 && args && !qstrcmp(args,"()"))
{
// no exact match found, but if args="()" an arbitrary
// member will do
- MemberNameIterator mni(*mn);
- for (mni.toLast();(md=mni.current());--mni)
+ //MemberNameIterator mni(*mn);
+ //for (mni.toLast();(md=mni.current());--mni)
+ for (auto it = mn->rbegin(); it!=mn->rend(); ++it)
{
- //printf("Found member '%s'\n",md->name().data());
- //printf("member is linkable md->name()='%s'\n",md->name().data());
- fd=md->getFileDef();
- gd=md->getGroupDef();
- const MemberDef *tmd = md->getEnumScope();
+ const auto &mmd_p = *it;
+ const MemberDef *mmd = mmd_p.get();
+ //printf("Found member '%s'\n",mmd->name().data());
+ //printf("member is linkable mmd->name()='%s'\n",mmd->name().data());
+ fd=mmd->getFileDef();
+ gd=mmd->getGroupDef();
+ const MemberDef *tmd = mmd->getEnumScope();
if (
(gd && gd->isLinkable()) || (fd && fd->isLinkable()) ||
(tmd && tmd->isStrong())
)
{
- members.append(md);
+ members.append(mmd);
}
}
}
@@ -4351,7 +2770,7 @@ bool getDefs(const QCString &scName,
QListIterator<MemberDef> mit(members);
for (mit.toFirst();(md=mit.current());++mit)
{
- if (md->getFileDef() && md->getFileDef()->name() == currentFile->name())
+ if (md->getFileDef() && md->getFileDef()->name() == currentFile->name())
{
break; // found match in the current file
}
@@ -4366,7 +2785,7 @@ bool getDefs(const QCString &scName,
md=members.getLast();
}
}
- if (md && (md->getEnumScope()==0 || !md->getEnumScope()->isStrong()))
+ if (md && (md->getEnumScope()==0 || !md->getEnumScope()->isStrong()))
// found a matching global member, that is not a scoped enum value (or uniquely matches)
{
fd=md->getFileDef();
@@ -4384,14 +2803,14 @@ bool getDefs(const QCString &scName,
/*!
* Searches for a scope definition given its name as a string via parameter
- * `scope`.
+ * `scope`.
*
- * The parameter `docScope` is a string representing the name of the scope in
+ * The parameter `docScope` is a string representing the name of the scope in
* which the `scope` string was found.
*
* The function returns TRUE if the scope is known and documented or
* FALSE if it is not.
- * If TRUE is returned exactly one of the parameter `cd`, `nd`
+ * If TRUE is returned exactly one of the parameter `cd`, `nd`
* will be non-zero:
* - if `cd` is non zero, the scope was a class pointed to by cd.
* - if `nd` is non zero, the scope was a namespace pointed to by nd.
@@ -4408,7 +2827,7 @@ static bool getScopeDefs(const char *docScope,const char *scope,
bool explicitGlobalScope=FALSE;
if (scopeName.at(0)==':' && scopeName.at(1)==':')
{
- scopeName=scopeName.right(scopeName.length()-2);
+ scopeName=scopeName.right(scopeName.length()-2);
explicitGlobalScope=TRUE;
}
if (scopeName.isEmpty())
@@ -4429,11 +2848,11 @@ static bool getScopeDefs(const char *docScope,const char *scope,
//(cd=getClass(fullName+"-g")) // C# generic
) && cd->isLinkable())
{
- return TRUE; // class link written => quit
+ return TRUE; // class link written => quit
}
- else if ((nd=Doxygen::namespaceSDict->find(fullName)) && nd->isLinkable())
+ else if ((nd=Doxygen::namespaceLinkedMap->find(fullName)) && nd->isLinkable())
{
- return TRUE; // namespace link written => quit
+ return TRUE; // namespace link written => quit
}
if (scopeOffset==0)
{
@@ -4454,10 +2873,10 @@ static bool isLowerCase(QCString &s)
if (p==0) return TRUE;
int c;
while ((c=*p++)) if (!islower(c)) return FALSE;
- return TRUE;
+ return TRUE;
}
-/*! Returns an object to reference to given its name and context
+/*! Returns an object to reference to given its name and context
* @post return value TRUE implies *resContext!=0 or *resMember!=0
*/
bool resolveRef(/* in */ const char *scName,
@@ -4501,10 +2920,10 @@ bool resolveRef(/* in */ const char *scName,
ClassDef *cd=0;
NamespaceDef *nd=0;
- // the following if() was commented out for releases in the range
+ // the following if() was commented out for releases in the range
// 1.5.2 to 1.6.1, but has been restored as a result of bug report 594787.
if (!inSeeBlock && scopePos==-1 && isLowerCase(tsName))
- { // link to lower case only name => do not try to autolink
+ { // link to lower case only name => do not try to autolink
return FALSE;
}
@@ -4524,7 +2943,7 @@ bool resolveRef(/* in */ const char *scName,
}
return TRUE;
}
- else if (scName==fullName || (!inSeeBlock && scopePos==-1))
+ else if (scName==fullName || (!inSeeBlock && scopePos==-1))
// nothing to link => output plain text
{
//printf("found scName=%s fullName=%s scName==fullName=%d "
@@ -4544,7 +2963,7 @@ bool resolveRef(/* in */ const char *scName,
if (bracePos!=-1) argsStr=fullName.right(fullName.length()-bracePos);
// strip template specifier
- // TODO: match against the correct partial template instantiation
+ // TODO: match against the correct partial template instantiation
int templPos=nameStr.find('<');
bool tryUnspecializedVersion = FALSE;
if (templPos!=-1 && nameStr.find("operator")==-1)
@@ -4584,11 +3003,11 @@ bool resolveRef(/* in */ const char *scName,
)
{
//printf("after getDefs checkScope=%d nameStr=%s cd=%p nd=%p\n",checkScope,nameStr.data(),cd,nd);
- if (checkScope && md && md->getOuterScope()==Doxygen::globalScope &&
+ if (checkScope && md && md->getOuterScope()==Doxygen::globalScope &&
!md->isStrongEnumValue() &&
(!scopeStr.isEmpty() || nameStr.find("::")>0))
{
- // we did find a member, but it is a global one while we were explicitly
+ // we did find a member, but it is a global one while we were explicitly
// looking for a scoped variable. See bug 616387 for an example why this check is needed.
// note we do need to support autolinking to "::symbol" hence the >0
//printf("not global member!\n");
@@ -4607,7 +3026,7 @@ bool resolveRef(/* in */ const char *scName,
// md->name().data(),md,md->anchor().data(),md->isLinkable(),(*resContext)->name().data());
return TRUE;
}
- else if (inSeeBlock && !nameStr.isEmpty() && (gd=Doxygen::groupSDict->find(nameStr)))
+ else if (inSeeBlock && !nameStr.isEmpty() && (gd=Doxygen::groupLinkedMap->find(nameStr)))
{ // group link
*resContext=gd;
return TRUE;
@@ -4615,7 +3034,7 @@ bool resolveRef(/* in */ const char *scName,
else if (tsName.find('.')!=-1) // maybe a link to a file
{
bool ambig;
- fd=findFileDef(Doxygen::inputNameDict,tsName,ambig);
+ fd=findFileDef(Doxygen::inputNameLinkedMap,tsName,ambig);
if (fd && !ambig)
{
*resContext=fd;
@@ -4667,20 +3086,20 @@ QCString linkToText(SrcLangExt lang,const char *link,bool isFileName)
#if 0
/*
* generate a reference to a class, namespace or member.
- * 'scName' is the name of the scope that contains the documentation
+ * 'scName' is the name of the scope that contains the documentation
* string that is returned.
* 'name' is the name that we want to link to.
* 'name' may have the following formats:
* 1) "ScopeName"
- * 2) "memberName()" one of the (overloaded) function or define
+ * 2) "memberName()" one of the (overloaded) function or define
* with name memberName.
- * 3) "memberName(...)" a specific (overloaded) function or define
+ * 3) "memberName(...)" a specific (overloaded) function or define
* with name memberName
* 4) "::name a global variable or define
* 4) "\#memberName member variable, global variable or define
- * 5) ("ScopeName::")+"memberName()"
- * 6) ("ScopeName::")+"memberName(...)"
- * 7) ("ScopeName::")+"memberName"
+ * 5) ("ScopeName::")+"memberName()"
+ * 6) ("ScopeName::")+"memberName(...)"
+ * 7) ("ScopeName::")+"memberName"
* instead of :: the \# symbol may also be used.
*/
@@ -4752,20 +3171,20 @@ bool resolveLink(/* in */ const char *scName,
const ClassDef *cd;
const DirDef *dir;
const NamespaceDef *nd;
- SectionInfo *si=0;
+ const SectionInfo *si=0;
bool ambig;
if (linkRef.isEmpty()) // no reference name!
{
return FALSE;
}
- else if ((pd=Doxygen::pageSDict->find(linkRef))) // link to a page
+ else if ((pd=Doxygen::pageLinkedMap->find(linkRef))) // link to a page
{
- const GroupDef *gd = pd->getGroupDef();
+ gd = pd->getGroupDef();
if (gd)
{
- if (!pd->name().isEmpty()) si=Doxygen::sectionDict->find(pd->name());
+ if (!pd->name().isEmpty()) si=SectionManager::instance().find(pd->name());
*resContext=gd;
- if (si) resAnchor = si->label;
+ if (si) resAnchor = si->label();
}
else
{
@@ -4773,23 +3192,23 @@ bool resolveLink(/* in */ const char *scName,
}
return TRUE;
}
- else if ((si=Doxygen::sectionDict->find(linkRef)))
+ else if ((si=SectionManager::instance().find(linkRef)))
{
- *resContext=si->definition;
- resAnchor = si->label;
+ *resContext=si->definition();
+ resAnchor = si->label();
return TRUE;
}
- else if ((pd=Doxygen::exampleSDict->find(linkRef))) // link to an example
+ else if ((pd=Doxygen::exampleLinkedMap->find(linkRef))) // link to an example
{
*resContext=pd;
return TRUE;
}
- else if ((gd=Doxygen::groupSDict->find(linkRef))) // link to a group
+ else if ((gd=Doxygen::groupLinkedMap->find(linkRef))) // link to a group
{
*resContext=gd;
return TRUE;
}
- else if ((fd=findFileDef(Doxygen::inputNameDict,linkRef,ambig)) // file link
+ else if ((fd=findFileDef(Doxygen::inputNameLinkedMap,linkRef,ambig)) // file link
&& fd->isLinkable())
{
*resContext=fd;
@@ -4819,12 +3238,12 @@ bool resolveLink(/* in */ const char *scName,
// resAnchor=cd->anchor();
// return TRUE;
// }
- else if ((nd=Doxygen::namespaceSDict->find(linkRef)))
+ else if ((nd=Doxygen::namespaceLinkedMap->find(linkRef)))
{
*resContext=nd;
return TRUE;
}
- else if ((dir=Doxygen::directories->find(QFileInfo(linkRef).absFilePath().utf8()+"/"))
+ else if ((dir=Doxygen::dirLinkedMap->find(QFileInfo(linkRef).absFilePath().utf8()+"/"))
&& dir->isLinkable()) // TODO: make this location independent like filedefs
{
*resContext=dir;
@@ -4842,7 +3261,7 @@ bool resolveLink(/* in */ const char *scName,
//----------------------------------------------------------------------
// General function that generates the HTML code for a reference to some
-// file, class or member from text 'lr' within the context of class 'clName'.
+// file, class or member from text 'lr' within the context of class 'clName'.
// This link has the text 'lt' (if not 0), otherwise 'lr' is used as a
// basis for the link's text.
// returns TRUE if a link could be generated.
@@ -4860,14 +3279,14 @@ bool generateLink(OutputDocInterface &od,const char *clName,
if (compound) // link to compound
{
if (lt==0 && anchor.isEmpty() && /* compound link */
- compound->definitionType()==Definition::TypeGroup /* is group */
+ compound->definitionType()==Definition::TypeGroup /* is group */
)
{
- linkText=(dynamic_cast<const GroupDef *>(compound))->groupTitle(); // use group's title as link
+ linkText=(toGroupDef(compound))->groupTitle(); // use group's title as link
}
else if (compound->definitionType()==Definition::TypeFile)
{
- linkText=linkToText(compound->getLanguage(),lt,TRUE);
+ linkText=linkToText(compound->getLanguage(),lt,TRUE);
}
od.writeObjectLink(compound->getReference(),
compound->getOutputFileBase(),anchor,linkText);
@@ -4896,12 +3315,12 @@ void generateFileRef(OutputDocInterface &od,const char *name,const char *text)
//FileInfo *fi;
FileDef *fd;
bool ambig;
- if ((fd=findFileDef(Doxygen::inputNameDict,name,ambig)) &&
- fd->isLinkable())
+ if ((fd=findFileDef(Doxygen::inputNameLinkedMap,name,ambig)) &&
+ fd->isLinkable())
// link to documented input file
od.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,linkText);
else
- od.docify(linkText);
+ od.docify(linkText);
}
//----------------------------------------------------------------------
@@ -4942,21 +3361,24 @@ struct FindFileCacheElem
bool isAmbig;
};
-static QCache<FindFileCacheElem> g_findFileDefCache(5000);
+static Cache<std::string,FindFileCacheElem> g_findFileDefCache(5000);
-FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig)
+static std::mutex g_findFileDefMutex;
+
+FileDef *findFileDef(const FileNameLinkedMap *fnMap,const char *n,bool &ambig)
{
ambig=FALSE;
if (n==0) return 0;
+ std::unique_lock<std::mutex> lock(g_findFileDefMutex);
+
const int maxAddrSize = 20;
char addr[maxAddrSize];
- qsnprintf(addr,maxAddrSize,"%p:",fnDict);
+ qsnprintf(addr,maxAddrSize,"%p:",(void*)fnMap);
QCString key = addr;
key+=n;
- g_findFileDefCache.setAutoDelete(TRUE);
- FindFileCacheElem *cachedResult = g_findFileDefCache.find(key);
+ FindFileCacheElem *cachedResult = g_findFileDefCache.find(key.str());
//printf("key=%s cachedResult=%p\n",key.data(),cachedResult);
if (cachedResult)
{
@@ -4966,63 +3388,56 @@ FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig)
}
else
{
- cachedResult = new FindFileCacheElem(0,FALSE);
+ cachedResult = g_findFileDefCache.insert(key.str(),FindFileCacheElem(0,FALSE));
}
QCString name=QDir::cleanDirPath(n).utf8();
QCString path;
int slashPos;
- FileName *fn;
+ const FileName *fn;
if (name.isEmpty()) goto exit;
slashPos=QMAX(name.findRev('/'),name.findRev('\\'));
if (slashPos!=-1)
{
path=name.left(slashPos+1);
- name=name.right(name.length()-slashPos-1);
+ name=name.right(name.length()-slashPos-1);
//printf("path=%s name=%s\n",path.data(),name.data());
}
if (name.isEmpty()) goto exit;
- if ((fn=(*fnDict)[name]))
+ if ((fn=fnMap->find(name)))
{
//printf("fn->count()=%d\n",fn->count());
- if (fn->count()==1)
+ if (fn->size()==1)
{
- FileDef *fd = fn->getFirst();
-#if defined(_WIN32) || defined(__MACOSX__) || defined(__CYGWIN__) // Windows or MacOSX
- bool isSamePath = fd->getPath().right(path.length()).lower()==path.lower();
-#else // Unix
- bool isSamePath = fd->getPath().right(path.length())==path;
-#endif
+ const std::unique_ptr<FileDef> &fd = fn->front();
+ bool isSamePath = Portable::fileSystemIsCaseSensitive() ?
+ fd->getPath().right(path.length())==path :
+ fd->getPath().right(path.length()).lower()==path.lower();
if (path.isEmpty() || isSamePath)
{
- cachedResult->fileDef = fd;
- g_findFileDefCache.insert(key,cachedResult);
- //printf("=1 ===> add to cache %p\n",fd);
- return fd;
+ cachedResult->fileDef = fd.get();
+ return fd.get();
}
}
else // file name alone is ambiguous
{
int count=0;
- FileNameIterator fni(*fn);
- FileDef *fd;
FileDef *lastMatch=0;
QCString pathStripped = stripFromIncludePath(path);
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd_p : *fn)
{
+ FileDef *fd = fd_p.get();
QCString fdStripPath = stripFromIncludePath(fd->getPath());
- if (path.isEmpty() || fdStripPath.right(pathStripped.length())==pathStripped)
- {
- count++;
- lastMatch=fd;
+ if (path.isEmpty() || fdStripPath.right(pathStripped.length())==pathStripped)
+ {
+ count++;
+ lastMatch=fd;
}
}
- //printf(">1 ===> add to cache %p\n",fd);
ambig=(count>1);
cachedResult->isAmbig = ambig;
cachedResult->fileDef = lastMatch;
- g_findFileDefCache.insert(key,cachedResult);
return lastMatch;
}
}
@@ -5031,15 +3446,13 @@ FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig)
//printf("not found!\n");
}
exit:
- //printf("0 ===> add to cache %p: %s\n",cachedResult,n);
- g_findFileDefCache.insert(key,cachedResult);
//delete cachedResult;
return 0;
}
//----------------------------------------------------------------------
-QCString showFileDefMatches(const FileNameDict *fnDict,const char *n)
+QCString showFileDefMatches(const FileNameLinkedMap *fnMap,const char *n)
{
QCString result;
QCString name=n;
@@ -5048,14 +3461,12 @@ QCString showFileDefMatches(const FileNameDict *fnDict,const char *n)
if (slashPos!=-1)
{
path=name.left(slashPos+1);
- name=name.right(name.length()-slashPos-1);
+ name=name.right(name.length()-slashPos-1);
}
- FileName *fn;
- if ((fn=(*fnDict)[name]))
+ const FileName *fn;
+ if ((fn=fnMap->find(name)))
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
if (path.isEmpty() || fd->getPath().right(path.length())==path)
{
@@ -5068,118 +3479,6 @@ QCString showFileDefMatches(const FileNameDict *fnDict,const char *n)
//----------------------------------------------------------------------
-/// substitute all occurrences of \a src in \a s by \a dst
-QCString substitute(const QCString &s,const QCString &src,const QCString &dst)
-{
- if (s.isEmpty() || src.isEmpty()) return s;
- const char *p, *q;
- int srcLen = src.length();
- int dstLen = dst.length();
- int resLen;
- if (srcLen!=dstLen)
- {
- int count;
- for (count=0, p=s.data(); (q=strstr(p,src))!=0; p=q+srcLen) count++;
- resLen = s.length()+count*(dstLen-srcLen);
- }
- else // result has same size as s
- {
- resLen = s.length();
- }
- QCString result(resLen+1);
- char *r;
- for (r=result.rawData(), p=s; (q=strstr(p,src))!=0; p=q+srcLen)
- {
- int l = (int)(q-p);
- memcpy(r,p,l);
- r+=l;
-
- if (dst) memcpy(r,dst,dstLen);
- r+=dstLen;
- }
- qstrcpy(r,p);
- //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data());
- return result;
-}
-
-
-/// substitute all occurrences of \a src in \a s by \a dst, but skip
-/// each consecutive sequence of \a src where the number consecutive
-/// \a src matches \a skip_seq; if \a skip_seq is negative, skip any
-/// number of consecutive \a src
-QCString substitute(const QCString &s,const QCString &src,const QCString &dst,int skip_seq)
-{
- if (s.isEmpty() || src.isEmpty()) return s;
- const char *p, *q;
- int srcLen = src.length();
- int dstLen = dst.length();
- int resLen;
- if (srcLen!=dstLen)
- {
- int count;
- for (count=0, p=s.data(); (q=strstr(p,src))!=0; p=q+srcLen) count++;
- resLen = s.length()+count*(dstLen-srcLen);
- }
- else // result has same size as s
- {
- resLen = s.length();
- }
- QCString result(resLen+1);
- char *r;
- for (r=result.rawData(), p=s; (q=strstr(p,src))!=0; p=q+srcLen)
- {
- // search a consecutive sequence of src
- int seq = 0, skip = 0;
- if (skip_seq)
- {
- for (const char *n=q+srcLen; qstrncmp(n,src,srcLen)==0; seq=1+skip, n+=srcLen)
- ++skip; // number of consecutive src after the current one
-
- // verify the allowed number of consecutive src to skip
- if (skip_seq > 0 && skip_seq != seq)
- seq = skip = 0;
- }
-
- // skip a consecutive sequence of src when necessary
- int l = (int)((q + seq * srcLen)-p);
- memcpy(r,p,l);
- r+=l;
-
- if (skip)
- {
- // skip only the consecutive src found after the current one
- q += skip * srcLen;
- // the next loop will skip the current src, aka (p=q+srcLen)
- continue;
- }
-
- if (dst) memcpy(r,dst,dstLen);
- r+=dstLen;
- }
- qstrcpy(r,p);
- result.resize(strlen(result.data())+1);
- //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data());
- return result;
-}
-
-/// substitute all occurrences of \a srcChar in \a s by \a dstChar
-QCString substitute(const QCString &s,char srcChar,char dstChar)
-{
- int l=s.length();
- QCString result(l+1);
- char *q=result.rawData();
- if (l>0)
- {
- const char *p=s.data();
- char c;
- while ((c=*p++)) *q++ = (c==srcChar) ? dstChar : c;
- }
- *q='\0';
- return result;
-}
-
-//----------------------------------------------------------------------
-
QCString substituteKeywords(const QCString &s,const char *title,
const char *projName,const char *projNum,const char *projBrief)
{
@@ -5188,7 +3487,7 @@ QCString substituteKeywords(const QCString &s,const char *title,
result = substitute(result,"$datetime",dateToString(TRUE));
result = substitute(result,"$date",dateToString(FALSE));
result = substitute(result,"$year",yearToString());
- result = substitute(result,"$doxygenversion",getVersion());
+ result = substitute(result,"$doxygenversion",getDoxygenVersion());
result = substitute(result,"$projectname",projName);
result = substitute(result,"$projectnumber",projNum);
result = substitute(result,"$projectbrief",projBrief);
@@ -5201,15 +3500,14 @@ QCString substituteKeywords(const QCString &s,const char *title,
/*! Returns the character index within \a name of the first prefix
* in Config_getList(IGNORE_PREFIX) that matches \a name at the left hand side,
* or zero if no match was found
- */
+ */
int getPrefixIndex(const QCString &name)
{
if (name.isEmpty()) return 0;
- static QStrList &sl = Config_getList(IGNORE_PREFIX);
- char *s = sl.first();
- while (s)
+ const StringVector &sl = Config_getList(IGNORE_PREFIX);
+ for (const auto &s : sl)
{
- const char *ps=s;
+ const char *ps=s.c_str();
const char *pd=name.data();
int i=0;
while (*ps!=0 && *pd!=0 && *ps==*pd) ps++,pd++,i++;
@@ -5217,48 +3515,30 @@ int getPrefixIndex(const QCString &name)
{
return i;
}
- s = sl.next();
}
return 0;
}
//----------------------------------------------------------------------------
-static void initBaseClassHierarchy(BaseClassList *bcl)
-{
- if (bcl==0) return;
- BaseClassListIterator bcli(*bcl);
- for ( ; bcli.current(); ++bcli)
- {
- ClassDef *cd=bcli.current()->classDef;
- if (cd->baseClasses()==0) // no base classes => new root
- {
- initBaseClassHierarchy(cd->baseClasses());
- }
- cd->setVisited(FALSE);
- }
-}
-//----------------------------------------------------------------------------
-
bool classHasVisibleChildren(const ClassDef *cd)
{
- BaseClassList *bcl;
+ BaseClassList bcl;
if (cd->getLanguage()==SrcLangExt_VHDL) // reverse baseClass/subClass relation
{
- if (cd->baseClasses()==0) return FALSE;
+ if (cd->baseClasses().empty()) return FALSE;
bcl=cd->baseClasses();
}
- else
+ else
{
- if (cd->subClasses()==0) return FALSE;
+ if (cd->subClasses().empty()) return FALSE;
bcl=cd->subClasses();
}
- BaseClassListIterator bcli(*bcl);
- for ( ; bcli.current() ; ++bcli)
+ for (const auto &bcd : bcl)
{
- if (bcli.current()->classDef->isVisibleInHierarchy())
+ if (bcd.classDef->isVisibleInHierarchy())
{
return TRUE;
}
@@ -5266,48 +3546,90 @@ bool classHasVisibleChildren(const ClassDef *cd)
return FALSE;
}
-
//----------------------------------------------------------------------------
-void initClassHierarchy(ClassSDict *cl)
+bool hasVisibleRoot(const BaseClassList &bcl)
{
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for ( ; (cd=cli.current()); ++cli)
+ for (const auto &bcd : bcl)
{
- cd->setVisited(FALSE);
- initBaseClassHierarchy(cd->baseClasses());
+ const ClassDef *cd=bcd.classDef;
+ if (cd->isVisibleInHierarchy()) return true;
+ if (hasVisibleRoot(cd->baseClasses())) return true;
}
+ return false;
}
-//----------------------------------------------------------------------------
+//----------------------------------------------------------------------
-bool hasVisibleRoot(const BaseClassList *bcl)
+// copies the next UTF8 character from input stream into buffer ids
+// returns the size of the character in bytes (or 0 if it is invalid)
+// the character itself will be copied as a UTF-8 encoded string to ids.
+int getUtf8Char(const char *input,char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier)
{
- if (bcl)
+ int inputLen=1;
+ const unsigned char uc = (unsigned char)*input;
+ bool validUTF8Char = false;
+ if (uc <= 0xf7)
{
- BaseClassListIterator bcli(*bcl);
- for ( ; bcli.current(); ++bcli)
+ const char* pt = input+1;
+ int l = 0;
+ if ((uc&0x80)==0x00)
+ {
+ switch (modifier)
+ {
+ case CaseModifier::None: ids[0]=*input; break;
+ case CaseModifier::ToUpper: ids[0]=(char)toupper(*input); break;
+ case CaseModifier::ToLower: ids[0]=(char)tolower(*input); break;
+ }
+ l=1; // 0xxx.xxxx => normal single byte ascii character
+ }
+ else
+ {
+ ids[ 0 ] = *input;
+ if ((uc&0xE0)==0xC0)
+ {
+ l=2; // 110x.xxxx: >=2 byte character
+ }
+ if ((uc&0xF0)==0xE0)
+ {
+ l=3; // 1110.xxxx: >=3 byte character
+ }
+ if ((uc&0xF8)==0xF0)
+ {
+ l=4; // 1111.0xxx: >=4 byte character
+ }
+ }
+ validUTF8Char = l>0;
+ for (int m=1; m<l && validUTF8Char; ++m)
{
- const ClassDef *cd=bcli.current()->classDef;
- if (cd->isVisibleInHierarchy()) return TRUE;
- hasVisibleRoot(cd->baseClasses());
+ unsigned char ct = (unsigned char)*pt;
+ if (ct==0 || (ct&0xC0)!=0x80) // invalid unicode character
+ {
+ validUTF8Char=false;
+ }
+ else
+ {
+ ids[ m ] = *pt++;
+ }
+ }
+ if (validUTF8Char) // got a valid unicode character
+ {
+ ids[ l ] = 0;
+ inputLen=l;
}
}
- return FALSE;
+ return inputLen;
}
-//----------------------------------------------------------------------
// note that this function is not reentrant due to the use of static growBuf!
QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscore)
{
- static bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
- static bool allowUnicodeNames = Config_getBool(ALLOW_UNICODE_NAMES);
- static GrowBuf growBuf;
- growBuf.clear();
+ bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
+ bool allowUnicodeNames = Config_getBool(ALLOW_UNICODE_NAMES);
if (name==0) return "";
- char c;
+ GrowBuf growBuf;
+ signed char c;
const char *p=name;
while ((c=*p++)!=0)
{
@@ -5340,57 +3662,29 @@ QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscor
case '@': growBuf.addStr("_0d"); break;
case ']': growBuf.addStr("_0e"); break;
case '[': growBuf.addStr("_0f"); break;
- default:
+ case '#': growBuf.addStr("_0g"); break;
+ default:
if (c<0)
{
- char ids[5];
- const unsigned char uc = (unsigned char)c;
- bool doEscape = TRUE;
- if (allowUnicodeNames && uc <= 0xf7)
+ char ids[MAX_UTF8_CHAR_SIZE];
+ bool doEscape = true;
+ if (allowUnicodeNames)
{
- const char* pt = p;
- ids[ 0 ] = c;
- int l = 0;
- if ((uc&0xE0)==0xC0)
- {
- l=2; // 11xx.xxxx: >=2 byte character
- }
- if ((uc&0xF0)==0xE0)
- {
- l=3; // 111x.xxxx: >=3 byte character
- }
- if ((uc&0xF8)==0xF0)
+ int charLen = getUtf8Char(p-1,ids);
+ if (charLen>0)
{
- l=4; // 1111.xxxx: >=4 byte character
- }
- doEscape = l==0;
- for (int m=1; m<l && !doEscape; ++m)
- {
- unsigned char ct = (unsigned char)*pt;
- if (ct==0 || (ct&0xC0)!=0x80) // invalid unicode character
- {
- doEscape=TRUE;
- }
- else
- {
- ids[ m ] = *pt++;
- }
- }
- if ( !doEscape ) // got a valid unicode character
- {
- ids[ l ] = 0;
- growBuf.addStr( ids );
- p += l - 1;
+ growBuf.addStr(ids);
+ p+=charLen-1;
+ doEscape = false;
}
}
if (doEscape) // not a valid unicode char or escaping needed
{
- static char map[] = "0123456789ABCDEF";
unsigned char id = (unsigned char)c;
ids[0]='_';
ids[1]='x';
- ids[2]=map[id>>4];
- ids[3]=map[id&0xF];
+ ids[2]=hex[id>>4];
+ ids[3]=hex[id&0xF];
ids[4]=0;
growBuf.addStr(ids);
}
@@ -5402,7 +3696,7 @@ QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscor
else
{
growBuf.addChar('_');
- growBuf.addChar(tolower(c));
+ growBuf.addChar((char)tolower(c));
}
break;
}
@@ -5454,6 +3748,7 @@ QCString unescapeCharsInString(const char *s)
case 'd': result+='@'; p+=2; break; // _0d -> '@'
case 'e': result+=']'; p+=2; break; // _0e -> ']'
case 'f': result+='['; p+=2; break; // _0f -> '['
+ case 'g': result+='#'; p+=2; break; // _0g -> '#'
default: // unknown escape, just pass underscore character as-is
result+=c;
break;
@@ -5462,7 +3757,7 @@ QCString unescapeCharsInString(const char *s)
default:
if (!caseSenseNames && c>='a' && c<='z') // lower to upper case escape, _a -> 'A'
{
- result+=toupper(*p);
+ result+=(char)toupper(*p);
p++;
}
else // unknown escape, pass underscore character as-is
@@ -5482,7 +3777,7 @@ QCString unescapeCharsInString(const char *s)
}
/*! This function determines the file name on disk of an item
- * given its name, which could be a class name with template
+ * given its name, which could be a class name with template
* arguments, so special characters need to be escaped.
*/
QCString convertNameToFile(const char *name,bool allowDots,bool allowUnderscore)
@@ -5508,7 +3803,7 @@ QCString convertNameToFile(const char *name,bool allowDots,bool allowUnderscore)
{
num = *value;
}
- result.sprintf("a%05d",num);
+ result.sprintf("a%05d",num);
}
else // long names
{
@@ -5521,47 +3816,19 @@ QCString convertNameToFile(const char *name,bool allowDots,bool allowUnderscore)
QCString sigStr(33);
MD5Buffer((const unsigned char *)result.data(),resultLen,md5_sig);
MD5SigToString(md5_sig,sigStr.rawData(),33);
- result=result.left(128-32)+sigStr;
+ result=result.left(128-32)+sigStr;
}
}
if (createSubdirs)
{
int l1Dir=0,l2Dir=0;
-#if MAP_ALGO==ALGO_COUNT
- // old algorithm, has the problem that after regeneration the
- // output can be located in a different dir.
- if (Doxygen::htmlDirMap==0)
- {
- Doxygen::htmlDirMap=new QDict<int>(100003);
- Doxygen::htmlDirMap->setAutoDelete(TRUE);
- }
- static int curDirNum=0;
- int *dirNum = Doxygen::htmlDirMap->find(result);
- if (dirNum==0) // new name
- {
- Doxygen::htmlDirMap->insert(result,new int(curDirNum));
- l1Dir = (curDirNum)&0xf; // bits 0-3
- l2Dir = (curDirNum>>4)&0xff; // bits 4-11
- curDirNum++;
- }
- else // existing name
- {
- l1Dir = (*dirNum)&0xf; // bits 0-3
- l2Dir = ((*dirNum)>>4)&0xff; // bits 4-11
- }
-#elif MAP_ALGO==ALGO_CRC16
- // second algorithm based on CRC-16 checksum
- int dirNum = qChecksum(result,result.length());
- l1Dir = dirNum&0xf;
- l2Dir = (dirNum>>4)&0xff;
-#elif MAP_ALGO==ALGO_MD5
- // third algorithm based on MD5 hash
+ // compute md5 hash to determine sub directory to use
uchar md5_sig[16];
MD5Buffer((const unsigned char *)result.data(),result.length(),md5_sig);
l1Dir = md5_sig[14]&0xf;
l2Dir = md5_sig[15];
-#endif
+
result.prepend(QCString().sprintf("d%x/d%02x/",l1Dir,l2Dir));
}
//printf("*** convertNameToFile(%s)->%s\n",name,result.data());
@@ -5598,10 +3865,20 @@ void createSubDirs(QDir &d)
int l1,l2;
for (l1=0;l1<16;l1++)
{
- d.mkdir(QCString().sprintf("d%x",l1));
+ QCString subdir;
+ subdir.sprintf("d%x",l1);
+ if (!d.exists(subdir) && !d.mkdir(subdir))
+ {
+ term("Failed to create output directory '%s'\n",subdir.data());
+ }
for (l2=0;l2<256;l2++)
{
- d.mkdir(QCString().sprintf("d%x/d%02x",l1,l2));
+ QCString subsubdir;
+ subsubdir.sprintf("d%x/d%02x",l1,l2);
+ if (!d.exists(subsubdir) && !d.mkdir(subsubdir))
+ {
+ term("Failed to create output directory '%s'\n",subsubdir.data());
+ }
}
}
}
@@ -5624,7 +3901,7 @@ void extractNamespaceName(const QCString &scopeName,
goto done;
}
p=clName.length()-2;
- while (p>=0 && (i=clName.findRev("::",p))!=-1)
+ while (p>=0 && (i=clName.findRev("::",p))!=-1)
// see if the first part is a namespace (and not a class)
{
//printf("Trying %s\n",clName.left(i).data());
@@ -5634,7 +3911,7 @@ void extractNamespaceName(const QCString &scopeName,
namespaceName=nd->name().copy();
className=clName.right(clName.length()-i-2);
goto done;
- }
+ }
p=i-2; // try a smaller piece of the scope
}
//printf("not found!\n");
@@ -5671,12 +3948,12 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te
((cd=getClass(scope.left(si)))==0 || cd->templateArguments().empty())
)
{
- //printf("Tried '%s'\n",(scope.left(si)+templ).data());
- pi=si+2;
+ //printf("Tried '%s'\n",(scope.left(si)+templ).data());
+ pi=si+2;
}
if (si==-1) // not nested => append template specifier
{
- result+=templ;
+ result+=templ;
}
else // nested => insert template specifier before after first class name
{
@@ -5688,7 +3965,7 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te
return result;
}
-#if 0 // original version
+
/*! Strips the scope from a name. Examples: A::B will return A
* and A<T>::B<N::C<D> > will return A<T>.
*/
@@ -5696,55 +3973,11 @@ QCString stripScope(const char *name)
{
QCString result = name;
int l=result.length();
- int p=l-1;
- bool done;
- int count;
-
- while (p>=0)
- {
- char c=result.at(p);
- switch (c)
- {
- case ':':
- //printf("stripScope(%s)=%s\n",name,result.right(l-p-1).data());
- return result.right(l-p-1);
- case '>':
- count=1;
- done=FALSE;
- //printf("pos < = %d\n",p);
- p--;
- while (p>=0 && !done)
- {
- c=result.at(p--);
- switch (c)
- {
- case '>': count++; break;
- case '<': count--; if (count<=0) done=TRUE; break;
- default:
- //printf("c=%c count=%d\n",c,count);
- break;
- }
- }
- //printf("pos > = %d\n",p+1);
- break;
- default:
- p--;
- }
- }
- //printf("stripScope(%s)=%s\n",name,name);
- return name;
-}
-#endif
-
-// new version by Davide Cesari which also works for Fortran
-QCString stripScope(const char *name)
-{
- QCString result = name;
- int l=result.length();
int p;
bool done = FALSE;
bool skipBracket=FALSE; // if brackets do not match properly, ignore them altogether
int count=0;
+ int round=0;
do
{
@@ -5754,10 +3987,13 @@ QCString stripScope(const char *name)
char c=result.at(p);
switch (c)
{
- case ':':
+ case ':':
// only exit in the case of ::
//printf("stripScope(%s)=%s\n",name,result.right(l-p-1).data());
- if (p>0 && result.at(p-1)==':') return result.right(l-p-1);
+ if (p>0 && result.at(p-1)==':' && (count==0 || skipBracket))
+ {
+ return result.right(l-p-1);
+ }
p--;
break;
case '>':
@@ -5781,22 +4017,31 @@ QCString stripScope(const char *name)
c=result.at(p--);
switch (c)
{
- case '>':
- count++;
+ case ')':
+ round++;
+ break;
+ case '(':
+ round--;
break;
- case '<':
- if (p>0)
+ case '>': // ignore > inside (...) to support e.g. (sizeof(T)>0) inside template parameters
+ if (round==0) count++;
+ break;
+ case '<':
+ if (round==0)
{
- if (result.at(p-1) == '<') // skip << operator
+ if (p>0)
{
- p--;
- break;
+ if (result.at(p-1) == '<') // skip << operator
+ {
+ p--;
+ break;
+ }
}
+ count--;
+ foundMatch = count==0;
}
- count--;
- foundMatch = count==0;
break;
- default:
+ default:
//printf("c=%c count=%d\n",c,count);
break;
}
@@ -5819,10 +4064,8 @@ QCString stripScope(const char *name)
/*! Converts a string to a HTML id string */
QCString convertToId(const char *s)
{
- static const char hex[] = "0123456789ABCDEF";
- static GrowBuf growBuf;
- growBuf.clear();
if (s==0) return "";
+ GrowBuf growBuf;
const char *p=s;
char c;
bool first=TRUE;
@@ -5848,12 +4091,21 @@ QCString convertToId(const char *s)
return growBuf.get();
}
+/*! Some strings have been corrected but the requirement regarding the fact
+ * that an id cannot have a digit at the first position. To overcome problems
+ * with double labels we always place an "a" in front
+ */
+QCString correctId(QCString s)
+{
+ if (s.isEmpty()) return s;
+ return "a" + s;
+}
+
/*! Converts a string to an XML-encoded string */
QCString convertToXML(const char *s, bool keepEntities)
{
- static GrowBuf growBuf;
- growBuf.clear();
if (s==0) return "";
+ GrowBuf growBuf;
const char *p=s;
char c;
while ((c=*p++))
@@ -5886,7 +4138,7 @@ QCString convertToXML(const char *s, bool keepEntities)
growBuf.addStr("&amp;");
}
break;
- case '\'': growBuf.addStr("&apos;"); break;
+ case '\'': growBuf.addStr("&apos;"); break;
case '"': growBuf.addStr("&quot;"); break;
case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18:
@@ -5903,9 +4155,8 @@ QCString convertToXML(const char *s, bool keepEntities)
/*! Converts a string to an DocBook-encoded string */
QCString convertToDocBook(const char *s)
{
- static GrowBuf growBuf;
- growBuf.clear();
if (s==0) return "";
+ GrowBuf growBuf;
const unsigned char *q;
int cnt;
const unsigned char *p=(const unsigned char *)s;
@@ -5947,13 +4198,18 @@ QCString convertToDocBook(const char *s)
break;
case '\'': growBuf.addStr("&apos;"); break;
case '"': growBuf.addStr("&quot;"); break;
- case '\007': growBuf.addStr("&#x2407;"); break;
- case 1: case 2: case 3: case 4: case 5: case 6: case 8:
- case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18:
+ case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
+ case 11: case 12: case 14: case 15: case 16: case 17: case 18:
case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26:
case 27: case 28: case 29: case 30: case 31:
- break; // skip invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char)
- default: growBuf.addChar(c); break;
+ growBuf.addStr("&#x24");
+ growBuf.addChar(hex[static_cast<uchar>(c)>>4]);
+ growBuf.addChar(hex[static_cast<uchar>(c)&0xF]);
+ growBuf.addChar(';');
+ break;
+ default:
+ growBuf.addChar(c);
+ break;
}
}
growBuf.addChar(0);
@@ -5963,9 +4219,8 @@ QCString convertToDocBook(const char *s)
/*! Converts a string to a HTML-encoded string */
QCString convertToHtml(const char *s,bool keepEntities)
{
- static GrowBuf growBuf;
- growBuf.clear();
if (s==0) return "";
+ GrowBuf growBuf;
growBuf.addStr(getHtmlDirEmbeddingChar(getTextDirByConfig(s)));
const char *p=s;
char c;
@@ -5996,12 +4251,27 @@ QCString convertToHtml(const char *s,bool keepEntities)
}
else
{
- growBuf.addStr("&amp;");
+ growBuf.addStr("&amp;");
}
break;
- case '\'': growBuf.addStr("&#39;"); break;
+ case '\'': growBuf.addStr("&#39;"); break;
case '"': growBuf.addStr("&quot;"); break;
- default: growBuf.addChar(c); break;
+ default:
+ {
+ uchar uc = static_cast<uchar>(c);
+ if (uc<32 && !isspace(c))
+ {
+ growBuf.addStr("&#x24");
+ growBuf.addChar(hex[uc>>4]);
+ growBuf.addChar(hex[uc&0xF]);
+ growBuf.addChar(';');
+ }
+ else
+ {
+ growBuf.addChar(c);
+ }
+ }
+ break;
}
}
growBuf.addChar(0);
@@ -6010,9 +4280,8 @@ QCString convertToHtml(const char *s,bool keepEntities)
QCString convertToJSString(const char *s, bool applyTextDir)
{
- static GrowBuf growBuf;
- growBuf.clear();
if (s==0) return "";
+ GrowBuf growBuf;
if (applyTextDir)
growBuf.addStr(getJsDirEmbeddingChar(getTextDirByConfig(s)));
const char *p=s;
@@ -6032,9 +4301,8 @@ QCString convertToJSString(const char *s, bool applyTextDir)
QCString convertToPSString(const char *s)
{
- static GrowBuf growBuf;
- growBuf.clear();
if (s==0) return "";
+ GrowBuf growBuf;
const char *p=s;
char c;
while ((c=*p++))
@@ -6054,7 +4322,7 @@ QCString convertToLaTeX(const QCString &s,bool insideTabbing,bool keepSpaces)
{
QGString result;
FTextStream t(&result);
- filterLatexString(t,s,insideTabbing,FALSE,FALSE,keepSpaces);
+ filterLatexString(t,s,insideTabbing,false,false,false,keepSpaces);
return result.data();
}
@@ -6066,8 +4334,7 @@ QCString convertCharEntitiesToUTF8(const QCString &s)
static QRegExp entityPat("&[a-zA-Z]+[0-9]*;");
if (s.length()==0) return result;
- static GrowBuf growBuf;
- growBuf.clear();
+ GrowBuf growBuf;
int p,i=0,l;
while ((p=entityPat.match(s,i,&l))!=-1)
{
@@ -6106,11 +4373,11 @@ QCString getOverloadDocs()
}
void addMembersToMemberGroup(MemberList *ml,
- MemberGroupSDict **ppMemberGroupSDict,
+ MemberGroupList *pMemberGroups,
const Definition *context)
{
ASSERT(context!=0);
- //printf("addMemberToMemberGroup()\n");
+ //printf("addMemberToMemberGroup() context=%s\n",context->name().data());
if (ml==0) return;
MemberListIterator mli(*ml);
MemberDef *md;
@@ -6129,30 +4396,34 @@ void addMembersToMemberGroup(MemberList *ml,
int groupId=fmd->getMemberGroupId();
if (groupId!=-1)
{
- MemberGroupInfo *info = Doxygen::memGrpInfoDict[groupId];
- //QCString *pGrpHeader = Doxygen::memberHeaderDict[groupId];
- //QCString *pDocs = Doxygen::memberDocDict[groupId];
- if (info)
+ auto it = Doxygen::memberGroupInfoMap.find(groupId);
+ if (it!=Doxygen::memberGroupInfoMap.end())
{
- if (*ppMemberGroupSDict==0)
+ auto &info = it->second;
+ auto mg_it = std::find_if(pMemberGroups->begin(),
+ pMemberGroups->end(),
+ [&groupId](const auto &g)
+ { return g->groupId()==groupId; }
+ );
+ MemberGroup *mg_ptr = 0;
+ if (mg_it==pMemberGroups->end())
{
- *ppMemberGroupSDict = new MemberGroupSDict;
- (*ppMemberGroupSDict)->setAutoDelete(TRUE);
+ auto mg = std::make_unique<MemberGroup>(
+ context,
+ groupId,
+ info->header,
+ info->doc,
+ info->docFile,
+ info->docLine);
+ mg_ptr = mg.get();
+ pMemberGroups->push_back(std::move(mg));
}
- MemberGroup *mg = (*ppMemberGroupSDict)->find(groupId);
- if (mg==0)
+ else
{
- mg = new MemberGroup(
- groupId,
- info->header,
- info->doc,
- info->docFile,
- info->docLine
- );
- (*ppMemberGroupSDict)->append(groupId,mg);
+ mg_ptr = (*mg_it).get();
}
- mg->insertMember(fmd); // insert in member group
- fmd->setMemberGroup(mg);
+ mg_ptr->insertMember(fmd); // insert in member group
+ fmd->setMemberGroup(mg_ptr);
}
}
}
@@ -6161,32 +4432,36 @@ void addMembersToMemberGroup(MemberList *ml,
int groupId=md->getMemberGroupId();
if (groupId!=-1)
{
- MemberGroupInfo *info = Doxygen::memGrpInfoDict[groupId];
- //QCString *pGrpHeader = Doxygen::memberHeaderDict[groupId];
- //QCString *pDocs = Doxygen::memberDocDict[groupId];
- if (info)
- {
- if (*ppMemberGroupSDict==0)
+ auto it = Doxygen::memberGroupInfoMap.find(groupId);
+ if (it!=Doxygen::memberGroupInfoMap.end())
+ {
+ auto &info = it->second;
+ auto mg_it = std::find_if(pMemberGroups->begin(),
+ pMemberGroups->end(),
+ [&groupId](const auto &g)
+ { return g->groupId()==groupId; }
+ );
+ MemberGroup *mg_ptr = 0;
+ if (mg_it==pMemberGroups->end())
{
- *ppMemberGroupSDict = new MemberGroupSDict;
- (*ppMemberGroupSDict)->setAutoDelete(TRUE);
+ auto mg = std::make_unique<MemberGroup>(
+ context,
+ groupId,
+ info->header,
+ info->doc,
+ info->docFile,
+ info->docLine);
+ mg_ptr = mg.get();
+ pMemberGroups->push_back(std::move(mg));
}
- MemberGroup *mg = (*ppMemberGroupSDict)->find(groupId);
- if (mg==0)
+ else
{
- mg = new MemberGroup(
- groupId,
- info->header,
- info->doc,
- info->docFile,
- info->docLine
- );
- (*ppMemberGroupSDict)->append(groupId,mg);
+ mg_ptr = (*mg_it).get();
}
md = ml->take(index); // remove from member list
- mg->insertMember(md); // insert in member group
- mg->setRefItems(info->m_sli);
- md->setMemberGroup(mg);
+ mg_ptr->insertMember(md->resolveAlias()); // insert in member group
+ mg_ptr->setRefItems(info->m_sli);
+ md->setMemberGroup(mg_ptr);
continue;
}
}
@@ -6241,11 +4516,11 @@ int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCStri
int brCount=1;
while (te<typeLen && brCount!=0)
{
- if (type.at(te)=='<')
+ if (type.at(te)=='<')
{
if (te<typeLen-1 && type.at(te+1)=='<') te++; else brCount++;
}
- if (type.at(te)=='>')
+ if (type.at(te)=='>')
{
if (te<typeLen-1 && type.at(te+1)=='>') te++; else brCount--;
}
@@ -6253,7 +4528,7 @@ int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCStri
}
}
name = type.mid(i,l);
- if (te>ts)
+ if (te>ts)
{
templSpec = type.mid(ts,te-ts),tl+=te-ts;
pos=i+l+tl;
@@ -6292,7 +4567,7 @@ QCString normalizeNonTemplateArgumentsInString(
result += name.mid(p,i-p);
QCString n = name.mid(i,l);
bool found=FALSE;
- for (const Argument formArg : formalArgs)
+ for (const Argument &formArg : formalArgs)
{
if (formArg.name == n)
{
@@ -6303,7 +4578,8 @@ QCString normalizeNonTemplateArgumentsInString(
if (!found)
{
// try to resolve the type
- const ClassDef *cd = getResolvedClass(context,0,n);
+ SymbolResolver resolver;
+ const ClassDef *cd = resolver.resolveClass(context,n);
if (cd)
{
result+=cd->name();
@@ -6334,21 +4610,24 @@ QCString normalizeNonTemplateArgumentsInString(
QCString substituteTemplateArgumentsInString(
const QCString &name,
const ArgumentList &formalArgs,
- const ArgumentList &actualArgs)
+ const std::unique_ptr<ArgumentList> &actualArgs)
{
//printf("substituteTemplateArgumentsInString(name=%s formal=%s actualArg=%s)\n",
// name.data(),argListToString(formalArgs).data(),argListToString(actualArgs).data());
if (formalArgs.empty()) return name;
QCString result;
- static QRegExp re("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9\\x80-\\xFF]*");
+ static QRegExp re("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9:\\x80-\\xFF]*");
int p=0,l,i;
// for each identifier in the base class name (e.g. B<T> -> B and T)
while ((i=re.match(name,p,&l))!=-1)
{
result += name.mid(p,i-p);
QCString n = name.mid(i,l);
- auto formIt = formalArgs.begin();
- auto actIt = actualArgs.begin();
+ ArgumentList::iterator actIt;
+ if (actualArgs)
+ {
+ actIt = actualArgs->begin();
+ }
// if n is a template argument, then we substitute it
// for its template instance argument.
@@ -6360,7 +4639,7 @@ QCString substituteTemplateArgumentsInString(
{
Argument formArg = *formIt;
Argument actArg;
- if (actIt!=actualArgs.end())
+ if (actualArgs && actIt!=actualArgs->end())
{
actArg = *actIt;
}
@@ -6378,35 +4657,35 @@ QCString substituteTemplateArgumentsInString(
{
//printf("n=%s formArg->type='%s' formArg->name='%s' formArg->defval='%s'\n",
// n.data(),formArg->type.data(),formArg->name.data(),formArg->defval.data());
- //printf(">> formArg->name='%s' actArg->type='%s' actArg->name='%s'\n",
- // formArg->name.data(),actArg ? actArg->type.data() : "",actArg ? actArg->name.data() : ""
+ //printf(">> n='%s' formArg->name='%s' actArg->type='%s' actArg->name='%s'\n",
+ // n.data(),formArg.name.data(),actIt!=actualArgs.end() ? actIt->type.data() : "",actIt!=actualArgs.end() ? actIt->name.data() : ""
// );
- if (formArg.name==n && actIt!=actualArgs.end() && !actArg.type.isEmpty()) // base class is a template argument
+ if (formArg.name==n && actualArgs && actIt!=actualArgs->end() && !actArg.type.isEmpty()) // base class is a template argument
{
// replace formal argument with the actual argument of the instance
- if (!leftScopeMatch(actArg.type,n))
- // the scope guard is to prevent recursive lockup for
- // template<class A> class C : public<A::T>,
- // where A::T would become A::T::T here,
+ if (!leftScopeMatch(actArg.type,n))
+ // the scope guard is to prevent recursive lockup for
+ // template<class A> class C : public<A::T>,
+ // where A::T would become A::T::T here,
// since n==A and actArg->type==A::T
// see bug595833 for an example
{
if (actArg.name.isEmpty())
{
- result += actArg.type+" ";
+ result += actArg.type+" ";
found=TRUE;
}
- else
+ else
// for case where the actual arg is something like "unsigned int"
// the "int" part is in actArg->name.
{
- result += actArg.type+" "+actArg.name+" ";
+ result += actArg.type+" "+actArg.name+" ";
found=TRUE;
}
}
}
else if (formArg.name==n &&
- actIt==actualArgs.end() &&
+ (actualArgs==nullptr || actIt==actualArgs->end()) &&
!formArg.defval.isEmpty() &&
formArg.defval!=name /* to prevent recursion */
)
@@ -6416,7 +4695,7 @@ QCString substituteTemplateArgumentsInString(
}
}
else if (formArg.name==n &&
- actIt==actualArgs.end() &&
+ (actualArgs==nullptr || actIt==actualArgs->end()) &&
!formArg.defval.isEmpty() &&
formArg.defval!=name /* to prevent recursion */
)
@@ -6424,7 +4703,7 @@ QCString substituteTemplateArgumentsInString(
result += substituteTemplateArgumentsInString(formArg.defval,formalArgs,actualArgs)+" ";
found=TRUE;
}
- if (actIt!=actualArgs.end())
+ if (actualArgs && actIt!=actualArgs->end())
{
actIt++;
}
@@ -6441,62 +4720,45 @@ QCString substituteTemplateArgumentsInString(
return result.stripWhiteSpace();
}
-#if 0
-/*! Makes a deep copy of the list of argument lists \a srcLists.
- * Will allocate memory, that is owned by the caller.
- */
-QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists)
-{
- ASSERT(srcLists!=0);
- QList<ArgumentList> *dstLists = new QList<ArgumentList>;
- dstLists->setAutoDelete(TRUE);
- QListIterator<ArgumentList> sli(*srcLists);
- ArgumentList *sl;
- for (;(sl=sli.current());++sli)
- {
- dstLists->append(sl->deepCopy());
- }
- return dstLists;
-}
-#endif
-/*! Strips template specifiers from scope \a fullName, except those
- * that make up specialized classes. The switch \a parentOnly
- * determines whether or not a template "at the end" of a scope
- * should be considered, e.g. with \a parentOnly is \c TRUE, A<T>::B<S> will
- * try to strip \<T\> and not \<S\>, while \a parentOnly is \c FALSE will
- * strip both unless A<T> or B<S> are specialized template classes.
+/*! Strips template specifiers from scope \a fullName, except those
+ * that make up specialized classes. The switch \a parentOnly
+ * determines whether or not a template "at the end" of a scope
+ * should be considered, e.g. with \a parentOnly is \c TRUE, \c A<T>::B<S> will
+ * try to strip `<T>` and not `<S>`, while \a parentOnly is \c FALSE will
+ * strip both unless `A<T>` or `B<S>` are specialized template classes.
*/
QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
bool parentOnly,
QCString *pLastScopeStripped)
{
+ int i=fullName.find('<');
+ if (i==-1) return fullName;
QCString result;
int p=0;
int l=fullName.length();
- int i=fullName.find('<');
while (i!=-1)
{
//printf("1:result+=%s\n",fullName.mid(p,i-p).data());
int e=i+1;
- bool done=FALSE;
int count=1;
- while (e<l && !done)
+ int round=0;
+ while (e<l && count>0)
{
char c=fullName.at(e++);
- if (c=='<')
- {
- count++;
- }
- else if (c=='>')
+ switch (c)
{
- count--;
- done = count==0;
+ case '(': round++; break;
+ case ')': if (round>0) round--; break;
+ case '<': if (round==0) count++; break;
+ case '>': if (round==0) count--; break;
+ default:
+ break;
}
}
int si= fullName.find("::",e);
- if (parentOnly && si==-1) break;
+ if (parentOnly && si==-1) break;
// we only do the parent scope, so we stop here if needed
result+=fullName.mid(p,i-p);
@@ -6523,10 +4785,10 @@ QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
* Example1: \c A::B and \c B::C will result in \c A::B::C <br>
* Example2: \c A and \c B will be \c A::B <br>
* Example3: \c A::B and B will be \c A::B
- *
+ *
* @param leftScope the left hand part of the scope.
* @param rightScope the right hand part of the scope.
- * @returns the merged scope.
+ * @returns the merged scope.
*/
QCString mergeScopes(const QCString &leftScope,const QCString &rightScope)
{
@@ -6588,7 +4850,7 @@ int getScopeFragment(const QCString &s,int p,int *l)
while (sp<sl && !done)
{
// TODO: deal with << and >> operators!
- char c=s.at(sp++);
+ c=s.at(sp++);
switch(c)
{
case '<': count++; break;
@@ -6612,8 +4874,10 @@ found:
PageDef *addRelatedPage(const char *name,const QCString &ptitle,
const QCString &doc,
- const char *fileName,int startLine,
- const std::vector<ListItemInfo> &sli,
+ const char *fileName,
+ int docLine,
+ int startLine,
+ const RefItemVector &sli,
GroupDef *gd,
const TagInfo *tagInfo,
bool xref,
@@ -6622,12 +4886,16 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
{
PageDef *pd=0;
//printf("addRelatedPage(name=%s gd=%p)\n",name,gd);
- if ((pd=Doxygen::pageSDict->find(name)) && !tagInfo)
+ QCString title=ptitle.stripWhiteSpace();
+ if ((pd=Doxygen::pageLinkedMap->find(name)) && !tagInfo)
{
- if (!xref) warn(fileName,startLine,"multiple use of page label '%s', (other occurrence: %s, line: %d)",
- name,pd->docFile().data(),pd->docLine());
+ if (!xref && !title.isEmpty() && pd->title()!=title)
+ {
+ warn(fileName,startLine,"multiple use of page label '%s', (other occurrence: %s, line: %d)",
+ name,pd->docFile().data(),pd->getStartBodyLine());
+ }
// append documentation block to the page.
- pd->setDocumentation(doc,fileName,startLine);
+ pd->setDocumentation(doc,fileName,docLine);
//printf("Adding page docs '%s' pi=%p name=%s\n",doc.data(),pd,name);
// append (x)refitems to the page.
pd->setRefItems(sli);
@@ -6635,13 +4903,16 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
else // new page
{
QCString baseName=name;
- if (baseName.right(4)==".tex")
+ if (baseName.right(4)==".tex")
baseName=baseName.left(baseName.length()-4);
else if (baseName.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
baseName=baseName.left(baseName.length()-Doxygen::htmlFileExtension.length());
- QCString title=ptitle.stripWhiteSpace();
- pd=createPageDef(fileName,startLine,baseName,doc,title);
+ //printf("Appending page '%s'\n",baseName.data());
+ pd = Doxygen::pageLinkedMap->add(baseName,
+ std::unique_ptr<PageDef>(
+ createPageDef(fileName,docLine,baseName,doc,title)));
+ pd->setBodySegment(startLine,startLine,-1);
pd->setRefItems(sli);
pd->setLanguage(lang);
@@ -6652,8 +4923,6 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
pd->setFileName(tagInfo->fileName);
}
- //printf("Appending page '%s'\n",baseName.data());
- Doxygen::pageSDict->append(baseName,pd);
if (gd) gd->addPage(pd);
@@ -6663,36 +4932,40 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
// a page name is a label as well!
QCString file;
+ QCString orgFile;
+ int line = -1;
if (gd)
{
file=gd->getOutputFileBase();
+ orgFile=gd->getOutputFileBase();
}
- else
+ else
{
file=pd->getOutputFileBase();
+ orgFile=pd->docFile();
+ line = pd->getStartBodyLine();
}
- SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+ const SectionInfo *si = SectionManager::instance().find(pd->name());
if (si)
{
- if (si->lineNr != -1)
+ if (si->lineNr() != -1)
{
- warn(file,-1,"multiple use of section label '%s', (first occurrence: %s, line %d)",pd->name().data(),si->fileName.data(),si->lineNr);
+ warn(orgFile,line,"multiple use of section label '%s', (first occurrence: %s, line %d)",pd->name().data(),si->fileName().data(),si->lineNr());
}
else
{
- warn(file,-1,"multiple use of section label '%s', (first occurrence: %s)",pd->name().data(),si->fileName.data());
+ warn(orgFile,line,"multiple use of section label '%s', (first occurrence: %s)",pd->name().data(),si->fileName().data());
}
}
else
{
- si=new SectionInfo(
- file,-1,pd->name(),pd->title(),SectionInfo::Page,0,pd->getReference());
+ SectionManager::instance().add(pd->name(),
+ file,-1,pd->title(),SectionType::Page,0,pd->getReference());
//printf("si->label='%s' si->definition=%s si->fileName='%s'\n",
// si->label.data(),si->definition?si->definition->name().data():"<none>",
// si->fileName.data());
//printf(" SectionInfo: sec=%p sec->fileName=%s\n",si,si->fileName.data());
//printf("Adding section key=%s si->fileName=%s\n",pageName.data(),si->fileName.data());
- Doxygen::sectionDict->append(pd->name(),si);
}
}
}
@@ -6701,47 +4974,28 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
//----------------------------------------------------------------------------
-void addRefItem(const std::vector<ListItemInfo> &sli,
- const char *key,
- const char *prefix, const char *name,const char *title,const char *args,Definition *scope)
+void addRefItem(const RefItemVector &sli,
+ const char *key,
+ const char *prefix, const char *name,const char *title,const char *args,const Definition *scope)
{
- //printf("addRefItem(sli=%p,key=%s,prefix=%s,name=%s,title=%s,args=%s)\n",sli,key,prefix,name,title,args);
+ //printf("addRefItem(sli=%d,key=%s,prefix=%s,name=%s,title=%s,args=%s)\n",(int)sli.size(),key,prefix,name,title,args);
if (key && key[0]!='@') // check for @ to skip anonymous stuff (see bug427012)
{
- for (const ListItemInfo &lii : sli)
- {
- RefList *refList = Doxygen::xrefLists->find(lii.type);
- if (refList
- &&
- (
- // either not a built-in list or the list is enabled
- (lii.type!="todo" || Config_getBool(GENERATE_TODOLIST)) &&
- (lii.type!="test" || Config_getBool(GENERATE_TESTLIST)) &&
- (lii.type!="bug" || Config_getBool(GENERATE_BUGLIST)) &&
- (lii.type!="deprecated" || Config_getBool(GENERATE_DEPRECATEDLIST))
- )
- )
- {
- RefItem *item = refList->getRefItem(lii.itemId);
- ASSERT(item!=0);
-
- item->prefix = prefix;
- item->scope = scope;
- item->name = name;
- item->title = title;
- item->args = args;
-
- refList->insertIntoList(key,item);
-
- }
+ for (RefItem *item : sli)
+ {
+ item->setPrefix(prefix);
+ item->setScope(scope);
+ item->setName(name);
+ item->setTitle(title);
+ item->setArgs(args);
+ item->setGroup(key);
}
}
}
bool recursivelyAddGroupListToTitle(OutputList &ol,const Definition *d,bool root)
{
- GroupList *groups = d->partOfGroups();
- if (groups) // write list of group to which this definition belongs
+ if (!d->partOfGroups().empty()) // write list of group to which this definition belongs
{
if (root)
{
@@ -6749,16 +5003,14 @@ bool recursivelyAddGroupListToTitle(OutputList &ol,const Definition *d,bool root
ol.disableAllBut(OutputGenerator::Html);
ol.writeString("<div class=\"ingroups\">");
}
- GroupListIterator gli(*groups);
- GroupDef *gd;
bool first=true;
- for (gli.toFirst();(gd=gli.current());++gli)
+ for (const auto &gd : d->partOfGroups())
{
+ if (!first) { ol.writeString(" &#124; "); } else first=false;
if (recursivelyAddGroupListToTitle(ol, gd, FALSE))
{
ol.writeString(" &raquo; ");
}
- if (!first) { ol.writeString(" &#124; "); } else first=FALSE;
ol.writeObjectLink(gd->getReference(),gd->getOutputFileBase(),0,gd->groupTitle());
}
if (root)
@@ -6777,7 +5029,7 @@ void addGroupListToTitle(OutputList &ol,const Definition *d)
}
void filterLatexString(FTextStream &t,const char *str,
- bool insideTabbing,bool insidePre,bool insideItem,bool keepSpaces)
+ bool insideTabbing,bool insidePre,bool insideItem,bool insideTable,bool keepSpaces)
{
if (str==0) return;
//if (strlen(str)<2) stackTrace();
@@ -6812,13 +5064,15 @@ void filterLatexString(FTextStream &t,const char *str,
case '%': t << "\\%"; break;
case '#': t << "\\#"; break;
case '$': t << "\\$"; break;
+ case '"': t << "\"{}"; break;
case '-': t << "-\\/"; break;
- case '^': (usedTableLevels()>0) ? t << "\\string^" : t << (char)c; break;
+ case '^': insideTable ? t << "\\string^" : t << (char)c; break;
case '~': t << "\\string~"; break;
case ' ': if (keepSpaces) t << "~"; else t << ' ';
break;
default:
- t << (char)c;
+ if (c<32) t << ' '; // non printable control character
+ else t << (char)c;
break;
}
}
@@ -6870,9 +5124,9 @@ void filterLatexString(FTextStream &t,const char *str,
}
break;
case '*': t << "$\\ast$"; break;
- case '_': if (!insideTabbing) t << "\\+";
- t << "\\_";
- if (!insideTabbing) t << "\\+";
+ case '_': if (!insideTabbing) t << "\\+";
+ t << "\\_";
+ if (!insideTabbing) t << "\\+";
break;
case '{': t << "\\{"; break;
case '}': t << "\\}"; break;
@@ -6880,8 +5134,8 @@ void filterLatexString(FTextStream &t,const char *str,
case '>': t << "$>$"; break;
case '|': t << "$\\vert$"; break;
case '~': t << "$\\sim$"; break;
- case '[': if (Config_getBool(PDF_HYPERLINKS) || insideItem)
- t << "\\mbox{[}";
+ case '[': if (Config_getBool(PDF_HYPERLINKS) || insideItem)
+ t << "\\mbox{[}";
else
t << "[";
break;
@@ -6889,12 +5143,12 @@ void filterLatexString(FTextStream &t,const char *str,
if (Config_getBool(PDF_HYPERLINKS) || insideItem)
t << "\\mbox{]}";
else
- t << "]";
+ t << "]";
break;
case '-': t << "-\\/";
break;
case '\\': t << "\\textbackslash{}";
- break;
+ break;
case '"': t << "\\char`\\\"{}";
break;
case '`': t << "\\`{}";
@@ -6904,15 +5158,22 @@ void filterLatexString(FTextStream &t,const char *str,
case ' ': if (keepSpaces) { if (insideTabbing) t << "\\>"; else t << '~'; } else t << ' ';
break;
- default:
+ default:
//if (!insideTabbing && forceBreaks && c!=' ' && *p!=' ')
- if (!insideTabbing &&
- ((c>='A' && c<='Z' && pc!=' ' && pc!='\0' && *p) || (c==':' && pc!=':') || (pc=='.' && isId(c)))
+ if (!insideTabbing &&
+ ((c>='A' && c<='Z' && pc!=' ' && !(pc>='A' && pc <= 'Z') && pc!='\0' && *p) || (c==':' && pc!=':') || (pc=='.' && isId(c)))
)
{
t << "\\+";
}
- t << (char)c;
+ if (c<32)
+ {
+ t << ' '; // non-printable control character
+ }
+ else
+ {
+ t << (char)c;
+ }
}
}
pc = c;
@@ -6940,7 +5201,7 @@ QCString latexEscapeLabelName(const char *s)
case '}': t << "\\rcurly{}"; break;
case '~': t << "````~"; break; // to get it a bit better in index together with other special characters
// NOTE: adding a case here, means adding it to while below as well!
- default:
+ default:
i=0;
// collect as long string as possible, before handing it to docify
tmp[i++]=c;
@@ -6950,7 +5211,13 @@ QCString latexEscapeLabelName(const char *s)
p++;
}
tmp[i]=0;
- filterLatexString(t,tmp,TRUE);
+ filterLatexString(t,tmp,
+ true, // insideTabbing
+ false, // insidePre
+ false, // insideItem
+ false, // insideTable
+ false // keepSpaces
+ );
break;
}
}
@@ -6979,7 +5246,7 @@ QCString latexEscapeIndexChars(const char *s)
case '{': t << "\\lcurly{}"; break;
case '}': t << "\\rcurly{}"; break;
// NOTE: adding a case here, means adding it to while below as well!
- default:
+ default:
i=0;
// collect as long string as possible, before handing it to docify
tmp[i++]=c;
@@ -6989,7 +5256,13 @@ QCString latexEscapeIndexChars(const char *s)
p++;
}
tmp[i]=0;
- filterLatexString(t,tmp.data(),TRUE);
+ filterLatexString(t,tmp.data(),
+ true, // insideTabbing
+ false, // insidePre
+ false, // insideItem
+ false, // insideTable
+ false // keepSpaces
+ );
break;
}
}
@@ -7026,7 +5299,7 @@ QCString latexFilterURL(const char *s)
if (s==0) return "";
QGString result;
FTextStream t(&result);
- const char *p=s;
+ const signed char *p=(const signed char*)s;
char c;
while ((c=*p++))
{
@@ -7036,7 +5309,15 @@ QCString latexFilterURL(const char *s)
case '%': t << "\\%"; break;
case '\\': t << "\\\\"; break;
default:
- t << c;
+ if (c<0)
+ {
+ unsigned char id = (unsigned char)c;
+ t << "\\%" << hex[id>>4] << hex[id&0xF];
+ }
+ else
+ {
+ t << c;
+ }
break;
}
}
@@ -7081,6 +5362,7 @@ QCString rtfFormatBmkStr(const char *name)
}
}
+ //printf("Name = %s RTF_tag = %s\n",name,(*tag).data());
return *tag;
}
@@ -7091,7 +5373,9 @@ bool checkExtension(const char *fName, const char *ext)
QCString addHtmlExtensionIfMissing(const char *fName)
{
- if (QFileInfo(fName).extension(FALSE).isEmpty())
+ if (fName==0) return fName;
+ const char *p = strchr(fName,'.');
+ if (p==nullptr) // no extension
{
return QCString(fName)+Doxygen::htmlFileExtension;
}
@@ -7118,11 +5402,14 @@ void replaceNamespaceAliases(QCString &scope,int i)
while (i>0)
{
QCString ns = scope.left(i);
- QCString *s = Doxygen::namespaceAliasDict[ns];
- if (s)
+ if (!ns.isEmpty())
{
- scope=*s+scope.right(scope.length()-i);
- i=s->length();
+ auto it = Doxygen::namespaceAliasMap.find(ns.data());
+ if (it!=Doxygen::namespaceAliasMap.end())
+ {
+ scope=it->second.data()+scope.right(scope.length()-i);
+ i=static_cast<int>(it->second.length());
+ }
}
if (i>0 && ns==scope.left(i)) break;
}
@@ -7163,9 +5450,9 @@ bool findAndRemoveWord(QCString &s,const QCString &word)
int p=0,i,l;
while ((i=wordExp.match(s,p,&l))!=-1)
{
- if (s.mid(i,l)==word)
+ if (s.mid(i,l)==word)
{
- if (i>0 && isspace((uchar)s.at(i-1)))
+ if (i>0 && isspace((uchar)s.at(i-1)))
i--,l++;
else if (i+l<(int)s.length() && isspace((uchar)s.at(i+l)))
l++;
@@ -7193,10 +5480,11 @@ QCString stripLeadingAndTrailingEmptyLines(const QCString &s,int &docLine)
// search for leading empty lines
int i=0,li=-1,l=s.length();
char c;
- while ((c=*p++))
+ while ((c=*p))
{
- if (c==' ' || c=='\t' || c=='\r') i++;
- else if (c=='\n') i++,li=i,docLine++;
+ if (c==' ' || c=='\t' || c=='\r') i++,p++;
+ else if (c=='\\' && qstrncmp(p,"\\ilinebr",8)==0) i+=8,li=i,p+=8;
+ else if (c=='\n') i++,li=i,docLine++,p++;
else break;
}
@@ -7205,9 +5493,10 @@ QCString stripLeadingAndTrailingEmptyLines(const QCString &s,int &docLine)
p=s.data()+b;
while (b>=0)
{
- c=*p; p--;
- if (c==' ' || c=='\t' || c=='\r') b--;
- else if (c=='\n') bi=b,b--;
+ c=*p;
+ if (c==' ' || c=='\t' || c=='\r') b--,p--;
+ else if (c=='r' && b>=7 && qstrncmp(p-7,"\\ilinebr",8)==0) bi=b-7,b-=8,p-=8;
+ else if (c=='\n') bi=b,b--,p--;
else break;
}
@@ -7218,6 +5507,7 @@ QCString stripLeadingAndTrailingEmptyLines(const QCString &s,int &docLine)
if (bi==-1) bi=l;
if (li==-1) li=0;
if (bi<=li) return 0; // only empty lines
+ //printf("docLine='%s' len=%d li=%d bi=%d\n",s.data(),s.length(),li,bi);
return s.mid(li,bi-li);
}
@@ -7249,7 +5539,7 @@ static struct Lang2ExtMap
const char *langName;
const char *parserName;
SrcLangExt parserId;
-}
+}
g_lang2extMap[] =
{
// language parser parser option
@@ -7270,7 +5560,6 @@ g_lang2extMap[] =
{ "vhdl", "vhdl", SrcLangExt_VHDL },
{ "xml", "xml", SrcLangExt_XML },
{ "sql", "sql", SrcLangExt_SQL },
- { "tcl", "tcl", SrcLangExt_Tcl },
{ "md", "md", SrcLangExt_Markdown },
{ 0, 0, (SrcLangExt)0 }
};
@@ -7361,9 +5650,9 @@ void initDefaultExtensionMapping()
updateLanguageMapping(".f95", "fortran");
updateLanguageMapping(".f03", "fortran");
updateLanguageMapping(".f08", "fortran");
+ updateLanguageMapping(".f18", "fortran");
updateLanguageMapping(".vhd", "vhdl");
updateLanguageMapping(".vhdl", "vhdl");
- updateLanguageMapping(".tcl", "tcl");
updateLanguageMapping(".ucf", "vhdl");
updateLanguageMapping(".qsf", "vhdl");
updateLanguageMapping(".md", "md");
@@ -7404,7 +5693,7 @@ QCString getFileNameExtension(QCString fn)
//--------------------------------------------------------------------------
-MemberDef *getMemberFromSymbol(const Definition *scope,const FileDef *fileScope,
+static MemberDef *getMemberFromSymbol(const Definition *scope,const FileDef *fileScope,
const char *n)
{
if (scope==0 ||
@@ -7420,8 +5709,8 @@ MemberDef *getMemberFromSymbol(const Definition *scope,const FileDef *fileScope,
if (name.isEmpty())
return 0; // no name was given
- DefinitionIntf *di = Doxygen::symbolMap->find(name);
- if (di==0)
+ auto range = Doxygen::symbolMap.find(name);
+ if (range.first==range.second)
return 0; // could not find any matching symbols
// mostly copied from getResolvedClassRec()
@@ -7438,40 +5727,21 @@ MemberDef *getMemberFromSymbol(const Definition *scope,const FileDef *fileScope,
int minDistance = 10000;
MemberDef *bestMatch = 0;
- if (di->definitionType()==DefinitionIntf::TypeSymbolList)
+ for (auto it=range.first; it!=range.second; ++it)
{
- //printf("multiple matches!\n");
- // find the closest closest matching definition
- DefinitionListIterator dli(*(DefinitionList*)di);
- Definition *d;
- for (dli.toFirst();(d=dli.current());++dli)
+ Definition *d = it->second;
+ if (d->definitionType()==Definition::TypeMember)
{
- if (d->definitionType()==Definition::TypeMember)
+ SymbolResolver resolver(fileScope);
+ int distance = resolver.isAccessibleFromWithExpScope(scope,d,explicitScopePart);
+ if (distance!=-1 && distance<minDistance)
{
- g_visitedNamespaces.clear();
- int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart);
- if (distance!=-1 && distance<minDistance)
- {
- minDistance = distance;
- bestMatch = dynamic_cast<MemberDef *>(d);
- //printf("new best match %s distance=%d\n",bestMatch->qualifiedName().data(),distance);
- }
+ minDistance = distance;
+ bestMatch = toMemberDef(d);
+ //printf("new best match %s distance=%d\n",bestMatch->qualifiedName().data(),distance);
}
}
}
- else if (di->definitionType()==Definition::TypeMember)
- {
- //printf("unique match!\n");
- Definition *d = (Definition *)di;
- g_visitedNamespaces.clear();
- int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart);
- if (distance!=-1 && distance<minDistance)
- {
- minDistance = distance;
- bestMatch = dynamic_cast<MemberDef *>(d);
- //printf("new best match %s distance=%d\n",bestMatch->qualifiedName().data(),distance);
- }
- }
return bestMatch;
}
@@ -7488,9 +5758,9 @@ bool checkIfTypedef(const Definition *scope,const FileDef *fileScope,const char
const char *writeUtf8Char(FTextStream &t,const char *s)
{
- char c=*s++;
- t << c;
- if (c<0) // multibyte character
+ uchar c=(uchar)*s++;
+ t << (char)c;
+ if (c>=0x80) // multibyte character
{
if (((uchar)c&0xE0)==0xC0)
{
@@ -7516,12 +5786,12 @@ const char *writeUtf8Char(FTextStream &t,const char *s)
return s;
}
-int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos)
+int nextUtf8CharPosition(const QCString &utf8Str,uint len,uint startPos)
{
int bytes=1;
if (startPos>=len) return len;
- char c = utf8Str[startPos];
- if (c<0) // multibyte utf-8 character
+ uchar c = (uchar)utf8Str[startPos];
+ if (c>=0x80) // multibyte utf-8 character
{
if (((uchar)c&0xE0)==0xC0)
{
@@ -7570,7 +5840,8 @@ QCString parseCommentAsText(const Definition *scope,const MemberDef *md,
if (doc.isEmpty()) return s.data();
FTextStream t(&s);
DocNode *root = validatingParseDoc(fileName,lineNr,
- (Definition*)scope,(MemberDef*)md,doc,FALSE,FALSE);
+ (Definition*)scope,(MemberDef*)md,doc,FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
TextDocVisitor *visitor = new TextDocVisitor(t);
root->accept(visitor);
delete visitor;
@@ -7605,9 +5876,8 @@ QCString parseCommentAsText(const Definition *scope,const MemberDef *md,
//--------------------------------------------------------------------------------------
-static QDict<void> aliasesProcessed;
-
-static QCString expandAliasRec(const QCString s,bool allowRecursion=FALSE);
+static QCString expandAliasRec(StringUnorderedSet &aliasesProcessed,
+ const QCString s,bool allowRecursion=FALSE);
struct Marker
{
@@ -7617,8 +5887,8 @@ struct Marker
int size; // size of the marker
};
-/** For a string \a s that starts with a command name, returns the character
- * offset within that string representing the first character after the
+/** For a string \a s that starts with a command name, returns the character
+ * offset within that string representing the first character after the
* command. For an alias with argument, this is the offset to the
* character just after the argument list.
*
@@ -7640,30 +5910,30 @@ static int findEndOfCommand(const char *s)
QCString args = extractAliasArgs(p,0);
i+=args.length();
}
- i+=p-s;
+ i+=(int)(p-s);
}
return i;
}
-/** Replaces the markers in an alias definition \a aliasValue
- * with the corresponding values found in the comma separated argument
+/** Replaces the markers in an alias definition \a aliasValue
+ * with the corresponding values found in the comma separated argument
* list \a argList and the returns the result after recursive alias expansion.
*/
-static QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList)
+static QCString replaceAliasArguments(StringUnorderedSet &aliasesProcessed,
+ const QCString &aliasValue,const QCString &argList)
{
//printf("----- replaceAliasArguments(val=[%s],args=[%s])\n",aliasValue.data(),argList.data());
// first make a list of arguments from the comma separated argument list
- QList<QCString> args;
- args.setAutoDelete(TRUE);
+ std::vector<QCString> args;
int i,l=(int)argList.length();
int s=0;
for (i=0;i<l;i++)
{
char c = argList.at(i);
- if (c==',' && (i==0 || argList.at(i-1)!='\\'))
+ if (c==',' && (i==0 || argList.at(i-1)!='\\'))
{
- args.append(new QCString(argList.mid(s,i-s)));
+ args.push_back(QCString(argList.mid(s,i-s)));
s=i+1; // start of next argument
}
else if (c=='@' || c=='\\')
@@ -7672,68 +5942,58 @@ static QCString replaceAliasArguments(const QCString &aliasValue,const QCString
i+=findEndOfCommand(argList.data()+i+1);
}
}
- if (l>s) args.append(new QCString(argList.right(l-s)));
+ if (l>s) args.push_back(QCString(argList.right(l-s)));
//printf("found %d arguments\n",args.count());
// next we look for the positions of the markers and add them to a list
- QList<Marker> markerList;
- markerList.setAutoDelete(TRUE);
+ std::vector<Marker> markerList;
l = aliasValue.length();
+ char pc='\0';
+ bool insideMarkerId=false;
int markerStart=0;
- int markerEnd=0;
- for (i=0;i<l;i++)
+ auto isDigit = [](char c) { return c>='0' && c<='9'; };
+ for (i=0;i<=l;i++)
{
- if (markerStart==0 && aliasValue.at(i)=='\\') // start of a \xx marker
+ char c = i<l ? aliasValue.at(i) : '\0';
+ if (insideMarkerId && !isDigit(c)) // found end of a markerId
{
- markerStart=i+1;
+ insideMarkerId = false;
+ int markerLen = i-markerStart;
+ markerList.push_back(Marker(markerStart-1,
+ atoi(aliasValue.mid(markerStart,markerLen)),
+ markerLen+1));
}
- else if (markerStart>0 && aliasValue.at(i)>='0' && aliasValue.at(i)<='9')
+ if (c=='\\' && (pc=='@' || pc=='\\')) // found escaped backslash
{
- // read digit that make up the marker number
- markerEnd=i+1;
+ // skip
+ pc = '\0';
}
else
{
- if (markerStart>0 && markerEnd>markerStart) // end of marker
+ if (isDigit(c) && pc=='\\') // found start of a markerId
{
- int markerLen = markerEnd-markerStart;
- markerList.append(new Marker(markerStart-1, // include backslash
- atoi(aliasValue.mid(markerStart,markerLen)),markerLen+1));
- //printf("found marker at %d with len %d and number %d\n",
- // markerStart-1,markerLen+1,atoi(aliasValue.mid(markerStart,markerLen)));
+ insideMarkerId=true;
+ markerStart=i;
}
- markerStart=0; // outside marker
- markerEnd=0;
+ pc = c;
}
}
- if (markerStart>0)
- {
- markerEnd=l;
- }
- if (markerStart>0 && markerEnd>markerStart)
- {
- int markerLen = markerEnd-markerStart;
- markerList.append(new Marker(markerStart-1, // include backslash
- atoi(aliasValue.mid(markerStart,markerLen)),markerLen+1));
- //printf("found marker at %d with len %d and number %d\n",
- // markerStart-1,markerLen+1,atoi(aliasValue.mid(markerStart,markerLen)));
- }
// then we replace the markers with the corresponding arguments in one pass
QCString result;
int p=0;
- for (i=0;i<(int)markerList.count();i++)
+ for (i=0;i<(int)markerList.size();i++)
{
- Marker *m = markerList.at(i);
- result+=aliasValue.mid(p,m->pos-p);
+ const Marker &m = markerList.at(i);
+ result+=aliasValue.mid(p,m.pos-p);
//printf("part before marker %d: '%s'\n",i,aliasValue.mid(p,m->pos-p).data());
- if (m->number>0 && m->number<=(int)args.count()) // valid number
+ if (m.number>0 && m.number<=(int)args.size()) // valid number
{
- result+=expandAliasRec(*args.at(m->number-1),TRUE);
+ result+=expandAliasRec(aliasesProcessed,args.at(m.number-1),TRUE);
//printf("marker index=%d pos=%d number=%d size=%d replacement %s\n",i,m->pos,m->number,m->size,
// args.at(m->number-1)->data());
}
- p=m->pos+m->size; // continue after the marker
+ p=m.pos+m.size; // continue after the marker
}
result+=aliasValue.right(l-p); // append remainder
//printf("string after replacement of markers: '%s'\n",result.data());
@@ -7741,7 +6001,7 @@ static QCString replaceAliasArguments(const QCString &aliasValue,const QCString
// expand the result again
result = substitute(result,"\\{","{");
result = substitute(result,"\\}","}");
- result = expandAliasRec(substitute(result,"\\,",","));
+ result = expandAliasRec(aliasesProcessed,substitute(result,"\\,",","));
return result;
}
@@ -7768,7 +6028,7 @@ static QCString escapeCommas(const QCString &s)
return result.data();
}
-static QCString expandAliasRec(const QCString s,bool allowRecursion)
+static QCString expandAliasRec(StringUnorderedSet &aliasesProcessed,const QCString s,bool allowRecursion)
{
QCString result;
static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*");
@@ -7789,8 +6049,8 @@ static QCString expandAliasRec(const QCString s,bool allowRecursion)
cmd += QCString().sprintf("{%d}",numArgs); // alias name + {n}
}
QCString *aliasText=Doxygen::aliasDict.find(cmd);
- if (numArgs>1 && aliasText==0)
- { // in case there is no command with numArgs parameters, but there is a command with 1 parameter,
+ if (numArgs>1 && aliasText==0)
+ { // in case there is no command with numArgs parameters, but there is a command with 1 parameter,
// we also accept all text as the argument of that command (so you don't have to escape commas)
aliasText=Doxygen::aliasDict.find(cmdNoArgs+"{1}");
if (aliasText)
@@ -7801,19 +6061,20 @@ static QCString expandAliasRec(const QCString s,bool allowRecursion)
}
//printf("Found command s='%s' cmd='%s' numArgs=%d args='%s' aliasText=%s\n",
// s.data(),cmd.data(),numArgs,args.data(),aliasText?aliasText->data():"<none>");
- if ((allowRecursion || aliasesProcessed.find(cmd)==0) && aliasText) // expand the alias
+ if ((allowRecursion || aliasesProcessed.find(cmd.str())==aliasesProcessed.end()) &&
+ aliasText) // expand the alias
{
//printf("is an alias!\n");
- if (!allowRecursion) aliasesProcessed.insert(cmd,(void *)0x8);
+ if (!allowRecursion) aliasesProcessed.insert(cmd.str());
QCString val = *aliasText;
if (hasArgs)
{
- val = replaceAliasArguments(val,args);
+ val = replaceAliasArguments(aliasesProcessed,val,args);
//printf("replace '%s'->'%s' args='%s'\n",
// aliasText->data(),val.data(),args.data());
}
- result+=expandAliasRec(val);
- if (!allowRecursion) aliasesProcessed.remove(cmd);
+ result+=expandAliasRec(aliasesProcessed,val);
+ if (!allowRecursion) aliasesProcessed.erase(cmd.str());
p=i+l;
if (hasArgs) p+=argsLen+2;
}
@@ -7836,7 +6097,7 @@ int countAliasArguments(const QCString argList)
int count=1;
int l = argList.length();
int i;
- for (i=0;i<l;i++)
+ for (i=0;i<l;i++)
{
char c = argList.at(i);
if (c==',' && (i==0 || argList.at(i-1)!='\\')) count++;
@@ -7870,7 +6131,7 @@ QCString extractAliasArgs(const QCString &args,int pos)
prevChar=0;
}
- if (bc==0)
+ if (bc==0)
{
//printf("extractAliasArgs('%s')->'%s'\n",args.data(),args.mid(pos+1,i-pos-1).data());
return args.mid(pos+1,i-pos-1);
@@ -7883,9 +6144,9 @@ QCString extractAliasArgs(const QCString &args,int pos)
QCString resolveAliasCmd(const QCString aliasCmd)
{
QCString result;
- aliasesProcessed.clear();
+ StringUnorderedSet aliasesProcessed;
//printf("Expanding: '%s'\n",aliasCmd.data());
- result = expandAliasRec(aliasCmd);
+ result = expandAliasRec(aliasesProcessed,aliasCmd);
//printf("Expanding result: '%s'->'%s'\n",aliasCmd.data(),result.data());
return result;
}
@@ -7893,12 +6154,12 @@ QCString resolveAliasCmd(const QCString aliasCmd)
QCString expandAlias(const QCString &aliasName,const QCString &aliasValue)
{
QCString result;
- aliasesProcessed.clear();
+ StringUnorderedSet aliasesProcessed;
// avoid expanding this command recursively
- aliasesProcessed.insert(aliasName,(void *)0x8);
+ aliasesProcessed.insert(aliasName.str());
// expand embedded commands
//printf("Expanding: '%s'->'%s'\n",aliasName.data(),aliasValue.data());
- result = expandAliasRec(aliasValue);
+ result = expandAliasRec(aliasesProcessed,aliasValue);
//printf("Expanding result: '%s'->'%s'\n",aliasName.data(),result.data());
return result;
}
@@ -7906,7 +6167,7 @@ QCString expandAlias(const QCString &aliasName,const QCString &aliasValue)
void writeTypeConstraints(OutputList &ol,const Definition *d,const ArgumentList &al)
{
if (al.empty()) return;
- ol.startConstraintList(theTranslator->trTypeConstraints());
+ ol.startConstraintList(theTranslator->trTypeConstraints());
for (const Argument &a : al)
{
ol.startConstraintParam();
@@ -7916,7 +6177,8 @@ void writeTypeConstraints(OutputList &ol,const Definition *d,const ArgumentList
linkifyText(TextGeneratorOLImpl(ol),d,0,0,a.type);
ol.endConstraintType();
ol.startConstraintDocs();
- ol.generateDoc(d->docFile(),d->docLine(),d,0,a.docs,TRUE,FALSE);
+ ol.generateDoc(d->docFile(),d->docLine(),d,0,a.docs,TRUE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endConstraintDocs();
}
ol.endConstraintList();
@@ -7932,27 +6194,19 @@ void stackTrace()
static char cmd[40960];
char *p = cmd;
p += sprintf(p,"/usr/bin/atos -p %d ", (int)getpid());
- for (int x = 0; x < frameCount; x++)
+ for (int x = 0; x < frameCount; x++)
{
p += sprintf(p,"%p ", backtraceFrames[x]);
}
fprintf(stderr,"========== STACKTRACE START ==============\n");
- #if defined(_WIN32) && !defined(__CYGWIN__)
- if (FILE *fp = _popen(cmd, "r"))
- #else
- if (FILE *fp = ::popen(cmd, "r"))
- #endif
+ if (FILE *fp = Portable::popen(cmd, "r"))
{
char resBuf[512];
while (size_t len = fread(resBuf, 1, sizeof(resBuf), fp))
{
fwrite(resBuf, 1, len, stderr);
}
- #if defined(_WIN32) && !defined(__CYGWIN__)
- _pclose(fp);
- #else
- ::pclose(fp);
- #endif
+ Portable::pclose(fp);
}
fprintf(stderr,"============ STACKTRACE END ==============\n");
//fprintf(stderr,"%s\n", frameStrings[x]);
@@ -7965,7 +6219,7 @@ static int transcodeCharacterBuffer(const char *fileName,BufStr &srcBuf,int size
if (inputEncoding==0 || outputEncoding==0) return size;
if (qstricmp(inputEncoding,outputEncoding)==0) return size;
void *cd = portable_iconv_open(outputEncoding,inputEncoding);
- if (cd==(void *)(-1))
+ if (cd==(void *)(-1))
{
term("unsupported character conversion: '%s'->'%s': %s\n"
"Check the INPUT_ENCODING setting in the config file!\n",
@@ -8111,27 +6365,26 @@ QCString filterTitle(const QCString &title)
// returns TRUE if the name of the file represented by 'fi' matches
// one of the file patterns in the 'patList' list.
-bool patternMatch(const QFileInfo &fi,const QStrList *patList)
+bool patternMatch(const QFileInfo &fi,const StringVector &patList)
{
- static bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
+ bool caseSenseNames = Config_getBool(CASE_SENSE_NAMES);
bool found = FALSE;
- // For Windows/Mac, always do the case insensitive match
-#if defined(_WIN32) || defined(__MACOSX__) || defined(__CYGWIN__)
- caseSenseNames = FALSE;
-#endif
-
- if (patList)
+ // For platforms where the file system is non case sensitive overrule the setting
+ if (!Portable::fileSystemIsCaseSensitive())
{
- QStrListIterator it(*patList);
- QCString pattern;
+ caseSenseNames = FALSE;
+ }
+ if (!patList.empty())
+ {
QCString fn = fi.fileName().data();
QCString fp = fi.filePath().data();
QCString afp= fi.absFilePath().data();
- for (it.toFirst();(pattern=it.current());++it)
+ for (const auto &pat: patList)
{
+ QCString pattern = pat.c_str();
if (!pattern.isEmpty())
{
int i=pattern.find('=');
@@ -8181,10 +6434,15 @@ void writeSummaryLink(OutputList &ol,const char *label,const char *title,
}
#endif
-QCString externalLinkTarget()
+QCString externalLinkTarget(const bool parent)
{
static bool extLinksInWindow = Config_getBool(EXT_LINKS_IN_WINDOW);
- if (extLinksInWindow) return "target=\"_blank\" "; else return "";
+ if (extLinksInWindow)
+ return "target=\"_blank\" ";
+ else if (parent)
+ return "target=\"_parent\" ";
+ else
+ return "";
}
QCString externalRef(const QCString &relPath,const QCString &ref,bool href)
@@ -8213,7 +6471,7 @@ QCString externalRef(const QCString &relPath,const QCString &ref,bool href)
return result;
}
-/** Writes the intensity only bitmap represented by \a data as an image to
+/** Writes the intensity only bitmap represented by \a data as an image to
* directory \a dir using the colors defined by HTML_COLORSTYLE_*.
*/
void writeColoredImgData(const char *dir,ColoredImgDataItem data[])
@@ -8242,8 +6500,8 @@ void writeColoredImgData(const char *dir,ColoredImgDataItem data[])
}
/** Replaces any markers of the form \#\#AA in input string \a str
- * by new markers of the form \#AABBCC, where \#AABBCC represents a
- * valid color, based on the intensity represented by hex number AA
+ * by new markers of the form \#AABBCC, where \#AABBCC represents a
+ * valid color, based on the intensity represented by hex number AA
* and the current HTML_COLORSTYLE_* settings.
*/
QCString replaceColorMarkers(const char *str)
@@ -8252,7 +6510,6 @@ QCString replaceColorMarkers(const char *str)
QCString s=str;
if (s.isEmpty()) return result;
static QRegExp re("##[0-9A-Fa-f][0-9A-Fa-f]");
- static const char hex[] = "0123456789ABCDEF";
static int hue = Config_getInt(HTML_COLORSTYLE_HUE);
static int sat = Config_getInt(HTML_COLORSTYLE_SAT);
static int gamma = Config_getInt(HTML_COLORSTYLE_GAMMA);
@@ -8264,7 +6521,7 @@ QCString replaceColorMarkers(const char *str)
#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
-
+
double r,g,b;
int red,green,blue;
int level = HEXTONUM(lumStr[0])*16+HEXTONUM(lumStr[1]);
@@ -8290,7 +6547,7 @@ QCString replaceColorMarkers(const char *str)
return result;
}
-/** Copies the contents of file with name \a src to the newly created
+/** Copies the contents of file with name \a src to the newly created
* file with name \a dest. Returns TRUE if successful.
*/
bool copyFile(const QCString &src,const QCString &dest)
@@ -8322,7 +6579,7 @@ bool copyFile(const QCString &src,const QCString &dest)
return TRUE;
}
-/** Returns the section of text, in between a pair of markers.
+/** Returns the section of text, in between a pair of markers.
* Full lines are returned, excluding the lines on which the markers appear.
* \sa routine lineBlock
*/
@@ -8410,7 +6667,6 @@ QCString langToString(SrcLangExt lang)
case SrcLangExt_VHDL: return "VHDL";
case SrcLangExt_XML: return "XML";
case SrcLangExt_SQL: return "SQL";
- case SrcLangExt_Tcl: return "Tcl";
case SrcLangExt_Markdown: return "Markdown";
case SrcLangExt_Slice: return "Slice";
}
@@ -8433,17 +6689,15 @@ QCString getLanguageSpecificSeparator(SrcLangExt lang,bool classScope)
return "::";
}
}
-QCString replaceScopeSeparator(QCString str)
-{
- // we don't know about the language so we have to go for the worse
- return substitute(substitute(str,"\\","::"),".","::"); // PHP and Java, CSharp, VHDL, Python
-}
/** Checks whether the given url starts with a supported protocol */
bool isURL(const QCString &url)
{
QCString loc_url = url.stripWhiteSpace();
- return loc_url.left(5)=="http:" || loc_url.left(6)=="https:" ||
- loc_url.left(4)=="ftp:" || loc_url.left(5)=="file:";
+ return loc_url.left(5)=="http:" || loc_url.left(6)=="https:" ||
+ loc_url.left(4)=="ftp:" || loc_url.left(5)=="ftps:" ||
+ loc_url.left(5)=="sftp:" || loc_url.left(5)=="file:" ||
+ loc_url.left(5)=="news:" || loc_url.left(4)=="irc:" ||
+ loc_url.left(5)=="ircs:";
}
/** Corrects URL \a url according to the relative path \a relPath.
* Returns the corrected URL. For absolute URLs no correction will be done.
@@ -8465,8 +6719,8 @@ bool protectionLevelVisible(Protection prot)
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
static bool extractPackage = Config_getBool(EXTRACT_PACKAGE);
- return (prot!=Private && prot!=Package) ||
- (prot==Private && extractPrivate) ||
+ return (prot!=Private && prot!=Package) ||
+ (prot==Private && extractPrivate) ||
(prot==Package && extractPackage);
}
@@ -8489,7 +6743,7 @@ QCString stripIndentation(const QCString &s)
if (c=='\t') indent+=tabSize - (indent%tabSize);
else if (c=='\n') indent=0,searchIndent=TRUE;
else if (c==' ') indent++;
- else if (searchIndent)
+ else if (searchIndent)
{
searchIndent=FALSE;
if (indent<minIndent) minIndent=indent;
@@ -8538,6 +6792,55 @@ QCString stripIndentation(const QCString &s)
return result.data();
}
+// strip up to \a indentationLevel spaces from each line in \a doc (excluding the first line)
+void stripIndentation(QCString &doc,const int indentationLevel)
+{
+ if (indentationLevel <= 0 || doc.isEmpty()) return; // nothing to strip
+
+ // by stripping content the string will only become shorter so we write the results
+ // back into the input string and then resize it at the end.
+ char c;
+ const char *src = doc.data();
+ char *dst = doc.rawData();
+ bool insideIndent = false; // skip the initial line from stripping
+ int cnt = 0;
+ while ((c=*src++)!=0)
+ {
+ // invariant: dst<=src
+ switch(c)
+ {
+ case '\n':
+ *dst++ = c;
+ insideIndent = true;
+ cnt = indentationLevel;
+ break;
+ case ' ':
+ if (insideIndent)
+ {
+ if (cnt>0) // count down the spacing until the end of the indent
+ {
+ cnt--;
+ }
+ else // reached the end of the indent, start of the part of the line to keep
+ {
+ insideIndent = false;
+ *dst++ = c;
+ }
+ }
+ else // part after indent, copy to the output
+ {
+ *dst++ = c;
+ }
+ break;
+ default:
+ insideIndent = false;
+ *dst++ = c;
+ break;
+ }
+ }
+ doc.resize(dst-doc.data()+1);
+}
+
bool fileVisibleInIndex(const FileDef *fd,bool &genSourceFile)
{
@@ -8546,49 +6849,11 @@ bool fileVisibleInIndex(const FileDef *fd,bool &genSourceFile)
genSourceFile = !isDocFile && fd->generateSourceFile();
return ( ((allExternals && fd->isLinkable()) ||
fd->isLinkableInProject()
- ) &&
+ ) &&
!isDocFile
);
}
-void addDocCrossReference(MemberDef *src,MemberDef *dst)
-{
- //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
- if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
- if ((dst->hasReferencedByRelation() || dst->hasCallerGraph()) &&
- src->showInCallGraph()
- )
- {
- dst->addSourceReferencedBy(src);
- MemberDef *mdDef = dst->memberDefinition();
- if (mdDef)
- {
- mdDef->addSourceReferencedBy(src);
- }
- MemberDef *mdDecl = dst->memberDeclaration();
- if (mdDecl)
- {
- mdDecl->addSourceReferencedBy(src);
- }
- }
- if ((src->hasReferencesRelation() || src->hasCallGraph()) &&
- src->showInCallGraph()
- )
- {
- src->addSourceReferences(dst);
- MemberDef *mdDef = src->memberDefinition();
- if (mdDef)
- {
- mdDef->addSourceReferences(dst);
- }
- MemberDef *mdDecl = src->memberDeclaration();
- if (mdDecl)
- {
- mdDecl->addSourceReferences(dst);
- }
- }
-}
-
//--------------------------------------------------------------------------------------
/*! @brief Get one unicode character as an unsigned integer from utf-8 string
@@ -8627,7 +6892,7 @@ uint getUtf8Code( const QCString& s, int idx )
}
-/*! @brief Returns one unicode character as an unsigned integer
+/*! @brief Returns one unicode character as an unsigned integer
* from utf-8 string, making the character lower case if it was upper case.
*
* @param s utf-8 encoded string
@@ -8642,7 +6907,7 @@ uint getUtf8CodeToLower( const QCString& s, int idx )
}
-/*! @brief Returns one unicode character as an unsigned integer
+/*! @brief Returns one unicode character as an unsigned integer
* from utf-8 string, making the character upper case if it was lower case.
*
* @param s utf-8 encoded string
@@ -8657,55 +6922,54 @@ uint getUtf8CodeToUpper( const QCString& s, int idx )
}
//--------------------------------------------------------------------------------------
+//
+bool namespaceHasNestedNamespace(const NamespaceDef *nd)
+{
+ for (const auto &cnd : nd->getNamespaces())
+ {
+ if (cnd->isLinkableInProject() && !cnd->isAnonymous())
+ {
+ return true;
+ }
+ }
+ return false;
+}
-bool namespaceHasVisibleChild(const NamespaceDef *nd,bool includeClasses,bool filterClasses,ClassDef::CompoundType ct)
+bool namespaceHasNestedClass(const NamespaceDef *nd,bool filterClasses,ClassDef::CompoundType ct)
{
- if (nd->getNamespaceSDict())
+ //printf(">namespaceHasVisibleChild(%s,includeClasses=%d)\n",nd->name().data(),includeClasses);
+ for (const auto &cnd : nd->getNamespaces())
{
- NamespaceSDict::Iterator cnli(*nd->getNamespaceSDict());
- const NamespaceDef *cnd;
- for (cnli.toFirst();(cnd=cnli.current());++cnli)
+ if (namespaceHasNestedClass(cnd,filterClasses,ct))
{
- if (cnd->isLinkableInProject() && !cnd->isAnonymous())
- {
- return TRUE;
- }
- else if (namespaceHasVisibleChild(cnd,includeClasses,filterClasses,ct))
- {
- return TRUE;
- }
+ //printf("<namespaceHasVisibleChild(%s,includeClasses=%d): case2\n",nd->name().data(),includeClasses);
+ return TRUE;
}
}
- if (includeClasses)
+
+ ClassLinkedRefMap list = nd->getClasses();
+ if (filterClasses)
{
- const ClassSDict *d = nd->getClassSDict();
- if (filterClasses)
+ if (ct == ClassDef::Interface)
{
- if (ct == ClassDef::Interface)
- {
- d = nd->getInterfaceSDict();
- }
- else if (ct == ClassDef::Struct)
- {
- d = nd->getStructSDict();
- }
- else if (ct == ClassDef::Exception)
- {
- d = nd->getExceptionSDict();
- }
+ list = nd->getInterfaces();
+ }
+ else if (ct == ClassDef::Struct)
+ {
+ list = nd->getStructs();
+ }
+ else if (ct == ClassDef::Exception)
+ {
+ list = nd->getExceptions();
}
+ }
- if (d)
+ for (const auto &cd : list)
+ {
+ if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
- ClassSDict::Iterator cli(*d);
- const ClassDef *cd;
- for (;(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0)
- {
- return TRUE;
- }
- }
+ //printf("<namespaceHasVisibleChild(%s,includeClasses=%d): case3\n",nd->name().data(),includeClasses);
+ return TRUE;
}
}
return FALSE;
@@ -8723,20 +6987,22 @@ bool classVisibleInIndex(const ClassDef *cd)
QCString extractDirection(QCString &docs)
{
- QRegExp re("\\[[^\\]]+\\]"); // [...]
+ QRegExp re("\\[[ inout,]+\\]"); // [...]
int l=0;
- if (re.match(docs,0,&l)==0)
+ if (re.match(docs,0,&l)==0 && l>2)
{
- int inPos = docs.find("in", 1,FALSE);
- int outPos = docs.find("out",1,FALSE);
- bool input = inPos!=-1 && inPos<l;
- bool output = outPos!=-1 && outPos<l;
- if (input || output) // in,out attributes
+ // make dir the part inside [...] without separators
+ QCString dir=substitute(substitute(docs.mid(1,l-2)," ",""),",","");
+ int inIndex, outIndex;
+ unsigned char ioMask=0;
+ if (( inIndex=dir.find( "in"))!=-1) dir.remove (inIndex,2),ioMask|=(1<<0);
+ if ((outIndex=dir.find("out"))!=-1) dir.remove(outIndex,3),ioMask|=(1<<1);
+ if (dir.isEmpty() && ioMask!=0) // only in and/or out attributes found
{
docs = docs.mid(l); // strip attributes
- if (input && output) return "[in,out]";
- else if (input) return "[in]";
- else if (output) return "[out]";
+ if (ioMask==((1<<0)|(1<<1))) return "[in,out]";
+ else if (ioMask==(1<<0)) return "[in]";
+ else if (ioMask==(1<<1)) return "[out]";
}
}
return QCString();
@@ -8938,7 +7204,7 @@ bool mainPageHasTitle()
return Doxygen::mainPage!=0 && Doxygen::mainPage->hasTitle();
}
-QCString getDotImageExtension(void)
+QCString getDotImageExtension()
{
QCString imgExt = Config_getEnum(DOT_IMAGE_FORMAT);
int i= imgExt.find(':'); // strip renderer part when using e.g. 'png:cairo:gd' as format
@@ -8963,7 +7229,7 @@ bool openOutputFile(const char *outFile,QFile &f)
if (backup.exists()) // remove existing backup
dir.remove(backup.fileName());
dir.rename(fi.fileName(),fi.fileName()+".bak");
- }
+ }
f.setName(outFile);
fileOpened = f.open(IO_WriteOnly|IO_Translate);
}
@@ -8973,18 +7239,16 @@ bool openOutputFile(const char *outFile,QFile &f)
void writeExtraLatexPackages(FTextStream &t)
{
// User-specified packages
- QStrList &extraPackages = Config_getList(EXTRA_PACKAGES);
- if (!extraPackages.isEmpty())
+ const StringVector &extraPackages = Config_getList(EXTRA_PACKAGES);
+ if (!extraPackages.empty())
{
t << "% Packages requested by user\n";
- const char *pkgName=extraPackages.first();
- while (pkgName)
+ for (const auto &pkgName : extraPackages)
{
if ((pkgName[0] == '[') || (pkgName[0] == '{'))
- t << "\\usepackage" << pkgName << "\n";
+ t << "\\usepackage" << pkgName.c_str() << "\n";
else
- t << "\\usepackage{" << pkgName << "}\n";
- pkgName=extraPackages.next();
+ t << "\\usepackage{" << pkgName.c_str() << "}\n";
}
t << "\n";
}
@@ -9017,22 +7281,56 @@ void writeLatexSpecialFormulaChars(FTextStream &t)
}
//------------------------------------------------------
+// simplified way to know if this is fixed form
+bool recognizeFixedForm(const char* contents, FortranFormat format)
+{
+ int column=0;
+ bool skipLine=FALSE;
-static int g_usedTableLevels = 0;
+ if (format == FortranFormat_Fixed) return TRUE;
+ if (format == FortranFormat_Free) return FALSE;
-void incUsedTableLevels()
-{
- g_usedTableLevels++;
-}
-void decUsedTableLevels()
-{
- g_usedTableLevels--;
-}
-int usedTableLevels()
-{
- return g_usedTableLevels;
+ for(int i=0;;i++) {
+ column++;
+
+ switch(contents[i]) {
+ case '\n':
+ column=0;
+ skipLine=FALSE;
+ break;
+ case ' ':
+ break;
+ case '\000':
+ return FALSE;
+ case '#':
+ skipLine=TRUE;
+ break;
+ case 'C':
+ case 'c':
+ case '*':
+ if (column==1) return TRUE;
+ if (skipLine) break;
+ return FALSE;
+ case '!':
+ if (column>1 && column<7) return FALSE;
+ skipLine=TRUE;
+ break;
+ default:
+ if (skipLine) break;
+ if (column>=7) return TRUE;
+ return FALSE;
+ }
+ }
+ return FALSE;
}
-//------------------------------------------------------
+FortranFormat convertFileNameFortranParserCode(QCString fn)
+{
+ QCString ext = getFileNameExtension(fn);
+ QCString parserName = Doxygen::parserManager->getParserName(ext.data());
+ if (parserName == "fortranfixed") return FortranFormat_Fixed;
+ else if (parserName == "fortranfree") return FortranFormat_Free;
+ return FortranFormat_Unknown;
+}
diff --git a/src/util.h b/src/util.h
index 76c0522..b19e1c5 100644
--- a/src/util.h
+++ b/src/util.h
@@ -22,12 +22,19 @@
* \brief A bunch of utility functions.
*/
+#include <memory>
+#include <unordered_map>
+#include <algorithm>
+
#include <qlist.h>
#include <ctype.h>
#include "types.h"
#include "sortdict.h"
#include "docparser.h"
#include "classdef.h"
+#include "arguments.h"
+#include "containers.h"
+#include "namespacedef.h"
//--------------------------------------------------------------------
@@ -35,23 +42,17 @@ class ClassDef;
class FileDef;
class MemberList;
class NamespaceDef;
-class FileNameDict;
+class FileNameLinkedMap;
class ArgumentList;
class OutputList;
class OutputDocInterface;
class MemberDef;
class ExampleSDict;
-class ClassSDict;
-class BaseClassList;
class GroupDef;
class NamespaceSDict;
-class ClassList;
-class MemberGroupSDict;
struct TagInfo;
-class MemberNameInfoSDict;
-struct ListItemInfo;
class PageDef;
-struct SectionInfo;
+class SectionInfo;
class QDir;
class Definition;
class BufStr;
@@ -91,35 +92,8 @@ class TextGeneratorOLImpl : public TextGeneratorIntf
//--------------------------------------------------------------------
-/** @brief maps a unicode character code to a list of T::ElementType's
- */
-template<class T>
-class LetterToIndexMap : public SIntDict<T>
-{
- public:
- LetterToIndexMap() { SIntDict<T>::setAutoDelete(TRUE); }
- void append(uint letter,typename T::ElementType *elem)
- {
- T *l = SIntDict<T>::find((int)letter);
- if (l==0)
- {
- l = new T(letter);
- SIntDict<T>::inSort((int)letter,l);
- }
- l->append(elem);
- }
- private:
- int compareValues(const T *l1, const T *l2) const
- {
- return (int)l1->letter()-(int)l2->letter();
- }
-};
-
-//--------------------------------------------------------------------
-
QCString langToString(SrcLangExt lang);
QCString getLanguageSpecificSeparator(SrcLangExt lang,bool classScope=FALSE);
-QCString replaceScopeSeparator(QCString str);
//--------------------------------------------------------------------
@@ -134,8 +108,6 @@ void linkifyText(const TextGeneratorIntf &ol,
int indentLevel=0
);
-void setAnchors(MemberList *ml);
-
QCString fileToString(const char *name,bool filter=FALSE,bool isSourceCode=FALSE);
QCString dateToString(bool);
@@ -150,8 +122,7 @@ bool getDefs(const QCString &scopeName,
const GroupDef *&gd,
bool forceEmptyScope=FALSE,
const FileDef *currentFile=0,
- bool checkCV=FALSE,
- const char *forceTagFile=0
+ bool checkCV=FALSE
);
QCString getFileFilter(const char* name,bool isSourceCode);
@@ -186,8 +157,8 @@ void writePageRef(OutputDocInterface &od,const char *cn,const char *mn);
QCString getCanonicalTemplateSpec(const Definition *d,const FileDef *fs,const QCString& spec);
-bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList &srcAl,
- const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList &dstAl,
+bool matchArguments2(const Definition *srcScope,const FileDef *srcFileScope,const ArgumentList *srcAl,
+ const Definition *dstScope,const FileDef *dstFileScope,const ArgumentList *dstAl,
bool checkCV
);
@@ -195,9 +166,6 @@ void mergeArguments(ArgumentList &,ArgumentList &,bool forceNameOverwrite=FALSE)
QCString substituteClassNames(const QCString &s);
-QCString substitute(const QCString &s,const QCString &src,const QCString &dst);
-QCString substitute(const QCString &s,const QCString &src,const QCString &dst,int skip_seq);
-QCString substitute(const QCString &s,char srcChar,char dstChar);
QCString clearBlock(const char *s,const char *begin,const char *end);
@@ -206,22 +174,21 @@ QCString selectBlock(const QCString& s,const QCString &name,bool which);
QCString resolveDefines(const char *n);
ClassDef *getClass(const char *key);
-
-const ClassDef *getResolvedClass(const Definition *scope,
- const FileDef *fileScope,
- const char *key,
- const MemberDef **pTypeDef=0,
- QCString *pTemplSpec=0,
- bool mayBeUnlinkable=FALSE,
- bool mayBeHidden=FALSE,
- QCString *pResolvedType=0);
+inline ClassDefMutable *getClassMutable(const char *key)
+{
+ return toClassDefMutable(getClass(key));
+}
NamespaceDef *getResolvedNamespace(const char *key);
+inline NamespaceDefMutable *getResolvedNamespaceMutable(const char *key)
+{
+ return toNamespaceDefMutable(getResolvedNamespace(key));
+}
-FileDef *findFileDef(const FileNameDict *fnDict,const char *n,
+FileDef *findFileDef(const FileNameLinkedMap *fnMap,const char *n,
bool &ambig);
-QCString showFileDefMatches(const FileNameDict *fnDict,const char *n);
+QCString showFileDefMatches(const FileNameLinkedMap *fnMap,const char *n);
int guessSection(const char *name);
@@ -234,11 +201,11 @@ QCString removeRedundantWhiteSpace(const QCString &s);
QCString argListToString(const ArgumentList &al,bool useCanonicalType=FALSE,bool showDefVals=TRUE);
-QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang);
+QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang,bool includeDefaults=true);
QCString generateMarker(int id);
-void writeExample(OutputList &ol,ExampleSDict *el);
+void writeExamples(OutputList &ol,const ExampleList &el);
QCString stripAnonymousNamespaceScope(const QCString &s);
@@ -259,11 +226,10 @@ QCString removeAnonymousScopes(const QCString &s);
QCString replaceAnonymousScopes(const QCString &s,const char *replacement=0);
-void initClassHierarchy(ClassSDict *cl);
-
-bool hasVisibleRoot(const BaseClassList *bcl);
+bool hasVisibleRoot(const BaseClassList &bcl);
bool classHasVisibleChildren(const ClassDef *cd);
-bool namespaceHasVisibleChild(const NamespaceDef *nd,bool includeClasses,bool filterClasses,ClassDef::CompoundType ct);
+bool namespaceHasNestedNamespace(const NamespaceDef *nd);
+bool namespaceHasNestedClass(const NamespaceDef *nd,bool filterClasses,ClassDef::CompoundType ct);
bool classVisibleInIndex(const ClassDef *cd);
int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level=0);
@@ -280,6 +246,7 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te
QCString stripScope(const char *name);
QCString convertToId(const char *s);
+QCString correctId(QCString s);
QCString convertToHtml(const char *s,bool keepEntities=TRUE);
@@ -296,7 +263,7 @@ QCString convertToPSString(const char *s);
QCString getOverloadDocs();
void addMembersToMemberGroup(/* in,out */ MemberList *ml,
- /* in,out */ MemberGroupSDict **ppMemberGroupSDict,
+ /* in,out */ MemberGroupList *pMemberGroups,
/* in */ const Definition *context);
int extractClassNameFromType(const QCString &type,int &pos,
@@ -310,9 +277,7 @@ QCString normalizeNonTemplateArgumentsInString(
QCString substituteTemplateArgumentsInString(
const QCString &name,
const ArgumentList &formalArgs,
- const ArgumentList &actualArgs);
-
-//QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists);
+ const std::unique_ptr<ArgumentList> &actualArgs);
QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
bool parentOnly=TRUE,
@@ -327,15 +292,21 @@ int getScopeFragment(const QCString &s,int p,int *l);
int filterCRLF(char *buf,int len);
-void addRefItem(const std::vector<ListItemInfo> &sli,const char *prefix,
+void addRefItem(const RefItemVector &sli,
const char *key,
- const char *name,const char *title,const char *args,Definition *scope);
+ const char *prefix,
+ const char *name,
+ const char *title,
+ const char *args,
+ const Definition *scope);
PageDef *addRelatedPage(const char *name,
const QCString &ptitle,
const QCString &doc,
- const char *fileName,int startLine,
- const std::vector<ListItemInfo> &sli = std::vector<ListItemInfo>(),
+ const char *fileName,
+ int docLine,
+ int startLine,
+ const RefItemVector &sli = RefItemVector(),
GroupDef *gd=0,
const TagInfo *tagInfo=0,
bool xref=FALSE,
@@ -348,10 +319,11 @@ QCString unescapeCharsInString(const char *s);
void addGroupListToTitle(OutputList &ol,const Definition *d);
void filterLatexString(FTextStream &t,const char *str,
- bool insideTabbing=FALSE,
- bool insidePre=FALSE,
- bool insideItem=FALSE,
- bool keepSpaces=FALSE);
+ bool insideTabbing,
+ bool insidePre,
+ bool insideItem,
+ bool insideTable,
+ bool keepSpaces);
QCString latexEscapeLabelName(const char *s);
QCString latexEscapeIndexChars(const char *s);
@@ -372,11 +344,6 @@ QCString stripExtension(const char *fName);
void replaceNamespaceAliases(QCString &scope,int i);
-int isAccessibleFrom(const Definition *scope,const FileDef *fileScope,const Definition *item);
-
-int isAccessibleFromWithExpScope(const Definition *scope,const FileDef *fileScope,const Definition *item,
- const QCString &explicitScopePart);
-
int computeQualifiedIndex(const QCString &name);
void addDirPrefix(QCString &fileName);
@@ -399,17 +366,8 @@ QCString getFileNameExtension(QCString fn);
void initDefaultExtensionMapping();
void addCodeOnlyMappings();
-MemberDef *getMemberFromSymbol(const Definition *scope,const FileDef *fileScope,
- const char *n);
bool checkIfTypedef(const Definition *scope,const FileDef *fileScope,const char *n);
-const ClassDef *newResolveTypedef(const FileDef *fileScope,
- const MemberDef *md,
- const MemberDef **pMemType=0,
- QCString *pTemplSpec=0,
- QCString *pResolvedType=0,
- const ArgumentList *actTemplParams=0);
-
QCString parseCommentAsText(const Definition *scope,const MemberDef *member,const QCString &doc,const QCString &fileName,int lineNr);
QCString transcodeCharacterStringToUTF8(const QCString &input);
@@ -420,8 +378,6 @@ QCString extractAliasArgs(const QCString &args,int pos);
int countAliasArguments(const QCString argList);
-//QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList);
-
QCString resolveAliasCmd(const QCString aliasCmd);
QCString expandAlias(const QCString &aliasName,const QCString &aliasValue);
@@ -435,11 +391,11 @@ bool readInputFile(const char *fileName,BufStr &inBuf,
bool filter=TRUE,bool isSourceCode=FALSE);
QCString filterTitle(const QCString &title);
-bool patternMatch(const QFileInfo &fi,const QStrList *patList);
+bool patternMatch(const QFileInfo &fi,const StringVector &patList);
-QCString externalLinkTarget();
+QCString externalLinkTarget(const bool parent = false);
QCString externalRef(const QCString &relPath,const QCString &ref,bool href);
-int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos);
+int nextUtf8CharPosition(const QCString &utf8Str,uint len,uint startPos);
const char *writeUtf8Char(FTextStream &t,const char *s);
@@ -469,13 +425,21 @@ QCString processMarkup(const QCString &s);
bool protectionLevelVisible(Protection prot);
QCString stripIndentation(const QCString &s);
+void stripIndentation(QCString &doc,const int indentationLevel);
-QCString getDotImageExtension(void);
+QCString getDotImageExtension();
bool fileVisibleInIndex(const FileDef *fd,bool &genSourceFile);
-void addDocCrossReference(MemberDef *src,MemberDef *dst);
-
+const int MAX_UTF8_CHAR_LEN = 4;
+const int MAX_UTF8_CHAR_SIZE = MAX_UTF8_CHAR_LEN+1; // include 0 terminator
+enum class CaseModifier
+{
+ None,
+ ToUpper,
+ ToLower
+};
+int getUtf8Char(const char *input,char ids[MAX_UTF8_CHAR_SIZE],CaseModifier modifier=CaseModifier::None);
uint getUtf8Code( const QCString& s, int idx );
uint getUtf8CodeToLower( const QCString& s, int idx );
uint getUtf8CodeToUpper( const QCString& s, int idx );
@@ -494,8 +458,7 @@ bool openOutputFile(const char *outFile,QFile &f);
void writeExtraLatexPackages(FTextStream &t);
void writeLatexSpecialFormulaChars(FTextStream &t);
-int usedTableLevels();
-void incUsedTableLevels();
-void decUsedTableLevels();
+bool recognizeFixedForm(const char* contents, FortranFormat format);
+FortranFormat convertFileNameFortranParserCode(QCString fn);
#endif
diff --git a/src/vhdlcode.h b/src/vhdlcode.h
index b79e2ab..48c15bb 100644
--- a/src/vhdlcode.h
+++ b/src/vhdlcode.h
@@ -1,3 +1,17 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
#ifndef VHDLCODE_H
#define VHDLCODE_H
@@ -12,7 +26,8 @@ void codeFreeVhdlScanner();
class VHDLCodeParser : public CodeParserInterface
{
public:
- virtual ~VHDLCodeParser() {}
+ VHDLCodeParser();
+ virtual ~VHDLCodeParser();
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
const QCString &input,
@@ -28,8 +43,10 @@ class VHDLCodeParser : public CodeParserInterface
const Definition *searchCtx=0,
bool collectXRefs=TRUE
);
- void resetCodeParserState() {}
+ void resetCodeParserState();
+ private:
+ struct Private;
+ std::unique_ptr<Private> p;
};
-
-#endif
+#endif
diff --git a/src/vhdlcode.l b/src/vhdlcode.l
index fe5a8d9..0f52356 100644
--- a/src/vhdlcode.l
+++ b/src/vhdlcode.l
@@ -1,10 +1,10 @@
/******************************************************************************
*
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -20,9 +20,17 @@
%option never-interactive
%option case-insensitive
%option prefix="vhdlcodeYY"
+%option reentrant
+%option extra-type="struct vhdlcodeYY_state *"
+%top{
+#include <stdint.h>
+}
%{
+#include <unordered_set>
+#include <string>
+
/*
* includes
*/
@@ -50,11 +58,13 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
-
+
+#define USE_STATE2STRING 0
+
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
#define DBG_CTX(x) do { } while(0)
-
+
/* -----------------------------------------------------------------
* statics
@@ -62,79 +72,889 @@
// ----------------- <vhdl> ----------------------------------
-//static bool isPackBody=FALSE;
-//static bool isStartMap;
-static bool isFuncProto=FALSE;
-static bool isComponent=FALSE;
-static bool isPackageBody=FALSE;
-static bool isProto = FALSE;
-static bool g_startCode = FALSE;
-static QCString g_PrevString;
-static QCString g_CurrClass;
-static QDict<QCString>g_vhdlKeyDict;
-static QCString g_tempComp;
-static QCString g_PortMapComp;
-static MemberDef *g_vhdlMember;
-static QCString g_FuncProto;
-
-//-----------------------------------------------------------
-
-static CodeOutputInterface * g_code;
-static QCString g_parmType;
-static QCString g_parmName;
-static const char * g_inputString; //!< the code fragment as text
-static int g_inputPosition; //!< read offset during parsing
-static int g_inputLines; //!< number of line in the code fragment
-static int g_yyLineNr; //!< current line number
-static bool g_needsTermination;
-static const Definition *g_searchCtx;
-
-static bool g_exampleBlock;
-static QCString g_exampleName;
-static QCString g_exampleFile;
-
-static QCString g_classScope;
-
-static bool g_CurrARCH = FALSE;
-
-static FileDef * g_sourceFileDef;
-static Definition * g_currentDefinition;
-static MemberDef * g_currentMemberDef;
-static bool g_includeCodeFragment;
-static const char * g_currentFontClass;
-
-static bool g_lexInit = FALSE;
-static int g_braceCount=0;
-
-
-static void writeFont(const char *s,const char* text);
-static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName);
-static bool writeColoredWord(QCString& word );
-static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool typeOnly=FALSE, const char *curr_class=0);
-static void endFontClass();
-static void startFontClass(const char *s);
+struct vhdlcodeYY_state
+{
+ bool isFuncProto = false;
+ bool isComponent = false;
+ bool isPackageBody = false;
+ bool isProto = false;
+ bool startCode = false;
+ QCString prevString;
+ QCString currClass;
+ std::unordered_set<std::string> vhdlKeyDict;
+ QCString tempComp;
+ QCString PortMapComp;
+ const MemberDef * vhdlMember = 0;
+ QCString funcProto;
+
+ CodeOutputInterface * code = 0;
+ const char * inputString = 0; //!< the code fragment as text
+ yy_size_t inputPosition = 0; //!< read offset during parsing
+ int inputLines = 0; //!< number of line in the code fragment
+ int yyLineNr = 0; //!< current line number
+ bool needsTermination = false;
+ const Definition *searchCtx = 0;
+
+ bool exampleBlock = false;
+ QCString exampleName;
+ QCString exampleFile;
+
+ bool currArch = false;
+
+ const FileDef * sourceFileDef = 0;
+ const Definition * currentDefinition = 0;
+ const MemberDef * currentMemberDef = 0;
+ bool includeCodeFragment = false;
+ const char * currentFontClass = 0;
+
+ bool lexInit = false;
+ int braceCount = 0;
+};
+
+
+static void writeFont(yyscan_t yyscanner,const char *s,const char* text);
+static void generateMemLink(yyscan_t yyscanner,CodeOutputInterface &ol,QCString &clName,QCString& memberName);
+static bool writeColoredWord(yyscan_t yyscanner,QCString& word );
+static void generateClassOrGlobalLink(yyscan_t yyscanner,CodeOutputInterface &ol,const char *clName, bool typeOnly=false, const char *curr_class=0);
+static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor);
+static bool checkVhdlString(yyscan_t yyscanner,QCString &name);
+static void addToSearchIndex(yyscan_t yyscanner,const char *text);
+static void startCodeLine(yyscan_t yyscanner);
+static void endCodeLine(yyscan_t yyscanner);
+static void nextCodeLine(yyscan_t yyscanner);
+static void writeWord(yyscan_t yyscanner,const char *word,const char* curr_class=0,bool classLink=false);
+static void codifyLines(yyscan_t yyscanner,const char *text,const char *cl=0,bool classlink=false,bool comment=false);
+static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
+ Definition *d,
+ const char *text);
+static void generateFuncLink(yyscan_t yyscanner,CodeOutputInterface &ol,MemberDef* mdef);
+static int countLines(yyscan_t yyscanner);
+static void endFontClass(yyscan_t yyscanner);
+static void startFontClass(yyscan_t yyscanner,const char *s);
+static void appStringLower(QCString& qcs,const char* text);
+static void codifyMapLines(yyscan_t yyscanner,const char *text);
+static void writeFuncProto(yyscan_t yyscanner);
+static void writeProcessProto(yyscan_t yyscanner);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
//-------------------------------------------------------------------
-static void setCurrentDoc(const QCString &anchor)
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
+
+%}
+
+
+B [ \t]
+BN [ \t\n\r]
+STRING ["][^"\n]*["]
+NAME [a-z_A-Z][ a-z_A-Z0-9]*
+FUNCNAME [a-z_A-Z"][a-z_A-Z0-9+*"/=<>-]*
+ID "$"?[a-z_A-Z][a-z_A-Z0-9]*
+SPECSIGN [:;, +*&\/=<>'\t]*
+DIGITSS [0-9]+|[0-9]+("#")*[0-9_a-fA-F\+\.\-]+("#")*
+ALLTYPESMAP {B}*[_a-zA-Z0-9. ]+{BN}*
+ALLTYPESMAP1 {BN}*[_a-zA-Z0-9.() ]+{BN}*
+
+ARCHITECTURE ^{B}*("architecture"){BN}+{FUNCNAME}{BN}+("of"){BN}+{FUNCNAME}{BN}+("is")
+PROCESS ({BN}*{FUNCNAME}{BN}*[:]+{BN}*("process"){BN}*[(]*)|[^a-zA-Z]("process "|"process("){BN}*[ (]*|[^a-zA-Z]("process"){BN}+
+
+END1 {B}*("end "){BN}+("if"|"case"|"loop"|"generate"|"for")
+END2 [^a-zA-Z_]("end"){BN}*[;]
+END3 {BN}*[^a-zA-Z]("end"){BN}+{FUNCNAME}{BN}*[;]
+END4 {B}*("end"){BN}+"function"{BN}+{FUNCNAME}{BN}*[;]
+ENDEFUNC {END3}|{END4}|{END2}
+
+KEYWORD ("of"|"new"|"event"|"break"|"case"|"end"|"loop"|"else"|"for"|"goto"|"if"|"return"|"generate"|"is"|"while"|"in")
+TYPEKW ^{B}*("type"|"subtype"|"constant"|"attribute"|"signal"|"variable","alias","configuration")
+FUNC ^{B}*("function"|"procedure"){BN}*{FUNCNAME}{BN}*("(")
+
+ARITHOP "+"|"-"|"/"|"*"|"%"|"/="|":="
+ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
+LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
+BITOP "&"|"|"|"^"|"<<"|">>"|"~"
+OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
+
+PORT {B}*("port"){BN}*("(")
+GENERIC {B}*("generic"){BN}*("(")
+
+BRACEOPEN [(]{1}
+BRACECLOSE [)]{1}
+
+TEXTT {B}*"--"[^\n]*
+
+MAPCOMPONENT1 ({ALLTYPESMAP}[:]{ALLTYPESMAP}{TEXTT}*{BN}+("port"|"generic"){BN}+("map"){BN}*("("){1})
+MAPCOMPONENT2 {BN}*("port"|"generic"){BN}+("map"){BN}*("("){1}
+MAPCOMPONENT3 ({ALLTYPESMAP}[:]{BN}*{ALLTYPESMAP1}{TEXTT}*{BN}+("port"|"generic"){BN}+("map"){BN}*("("){1})
+MAPCOMPONENT4 ({ALLTYPESMAP}[:]{BN}*("entity"|"component"|"configuration"){BN}+{ALLTYPESMAP1}{TEXTT}*{BN}*("port"|"generic"){BN}*("map"){BN}*("("){1})
+
+XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFIG"|"CONFIG_MODE"|"COOL_CLK"|"DATA_GATE"|"DCI_VALUE"|"DISABLE"|"DRIVE"|"DROP_SPEC"|"ENABLE"|"FAST"|"FEEDBACK"|"FILE"|"FLOAT"|"FROM-THRU-TO"|"FROM-TO"|"HBLKNM"|"HU_SET"|"INREG"|"IOB"|"IOBDELAY"|"IOSTANDARD"|"KEEP"|"KEEPER"|"LOC"|"LOCATE"|"LOCK_PINS"|"MAP"|"MAXDELAY"|"MAXPT"|"MAXSKEW"|"NODELAY"|"NOREDUCE"|"OFFSET"|"OPEN_DRAIN"|"OPT_EFFORT"|"OPTIMIZE"|"PERIOD"|"PIN"|"PRIORITY"|"PROHIBIT"|"PULLDOWN"|"PULLUP"|"PWR_MODE"|"REG"|"RLOC"|"RLOC_ORIGIN"|"RLOC_RANGE"|"SAVE NET"|"FLAG"|"SYSTEM_JITTER"|"TEMPERATURE"|"TIMEGRP"|"TIMESPEC"|"VOLTAGE"
+
+%option noyywrap
+%option nounput
+
+%x Bases
+%x ParseType
+%x ParseFuncProto
+%x ParseComponent
+%x ParsePackage
+%x ParseProcessProto
+%x ClassName
+%x PackageName
+%x ClassVar
+%x ClassesName
+%x Map
+%x End
+%x Body
+
+%%
+
+. {
+ BEGIN(Bases);
+ }
+
+<Map>{BRACEOPEN} {
+ yyextra->braceCount++;
+ writeFont(yyscanner,"vhdlchar",yytext);
+ BEGIN(Map);
+ }
+
+<Map>[^()\n,--]* { /* write and link a port map lines */
+ QCString tt(yytext);
+ VhdlDocGen::deleteAllChars(tt,',');
+ QRegExp r("=>");
+ QCStringList ql=QCStringList::split(r,tt);
+ if (ql.count()>=2)
+ {
+ unsigned int index=0;
+ QCString t1=ql[0];
+ char cc=t1.at(index);
+ while (cc==' ' || cc=='\t')
+ {
+ char c2[2];
+ c2[0]=cc;
+ c2[1]=0;
+ yyextra->code->codify(c2);
+ index++;
+ if (index>=t1.size()) break;
+ cc=t1.at(index);
+ }
+
+ QCString s1=t1;
+ s1=s1.stripWhiteSpace();
+
+ // if (!yyextra->PortMapComp.isEmpty())
+ generateMemLink(yyscanner,*yyextra->code,yyextra->PortMapComp,s1);
+ while (index++<t1.size())
+ {
+ cc=t1.at(index);
+ if (cc==' ' || cc=='\t')
+ {
+ char c2[2];
+ c2[0]=cc;
+ c2[1]=0;
+ yyextra->code->codify(c2);
+ }
+ }
+ codifyLines(yyscanner,"=>");
+ index=0;
+ QCString s2=ql[1];
+ t1=s2;
+ cc=t1.at(index);
+ while (cc==' ' || cc=='\t')
+ {
+ char c2[2];
+ c2[0]=cc;
+ c2[1]=0;
+ yyextra->code->codify(c2);
+ index++;
+ if (index>=t1.size()) break;
+ cc=t1.at(index);
+ }
+ s2=s2.stripWhiteSpace();
+ if (!checkVhdlString(yyscanner,s2))
+ {
+ generateMemLink(yyscanner,*yyextra->code,yyextra->currClass,s2);
+ }
+ while (index++<t1.size())
+ {
+ if (t1.at(index)==' ')
+ {
+ yyextra->code->codify(" ");
+ }
+ }
+ }
+ else
+ {
+ codifyLines(yyscanner,yytext,yyextra->currClass.data());
+ }
+ BEGIN(Map);
+ }
+
+<Map>"\n"|"," {
+ codifyLines(yyscanner,yytext);
+ BEGIN(Map);
+ }
+
+<Map>{BRACECLOSE} {
+ yyextra->braceCount--;
+ writeFont(yyscanner,"vhdlchar",yytext);
+ if (yyextra->braceCount==0)
+ {
+ BEGIN(Bases);
+ }
+ }
+
+<ParseFuncProto>{NAME} {
+ QCString tmp(yytext);
+ tmp=tmp.stripWhiteSpace();
+ appStringLower(yyextra->prevString,yytext);
+ yyextra->vhdlKeyDict.insert(yyextra->prevString.str());
+ if (!writeColoredWord(yyscanner,tmp))
+ {
+ generateMemLink(yyscanner,*yyextra->code,yyextra->currClass,tmp);
+ }
+ BEGIN(Bases);
+ }
+
+<ParseType>{STRING} {
+ QCString qcs(yytext);
+ VhdlDocGen::deleteAllChars(qcs,'"');
+ VhdlDocGen::deleteAllChars(qcs,' ');
+ if (VhdlDocGen::isNumber(qcs))
+ {
+ writeFont(yyscanner,"vhdllogic",yytext);
+ }
+ else
+ {
+ writeFont(yyscanner,"keyword",yytext);
+ }
+ }
+
+<ParseType>"\n" {
+ yyextra->funcProto.append(yytext);
+ if (yyextra->isProto)
+ {
+ codifyLines(yyscanner,yytext);
+ }
+ BEGIN(ParseType);
+ }
+
+
+<ParseType>{TEXTT} {
+ yyextra->funcProto.append(yytext);
+ if (yyextra->isProto)
+ {
+ writeFont(yyscanner,"keyword",yytext);
+ }
+ BEGIN(ParseType);
+ }
+
+<ParseType>{ENDEFUNC} {
+ QRegExp regg("[\\s]");
+ QCString tt(yytext);
+ codifyLines(yyscanner,yytext,yyextra->currClass.data());
+ tt=tt.lower();
+ VhdlDocGen::deleteAllChars(tt,';');
+ tt.stripWhiteSpace();
+ QCStringList ql=QCStringList::split(regg,tt);
+ int index=ql.findIndex(QCString("if"))+1;
+ index+=ql.findIndex(QCString("case"))+1;
+ index+=ql.findIndex(QCString("loop"))+1;
+ index+=ql.findIndex(QCString("generate"))+1;
+ if (index==0)
+ {
+ BEGIN(Bases);
+ }
+ else
+ {
+ BEGIN(ParseType);
+ }
+ }
+
+<ParseType>{END1} {
+ codifyLines(yyscanner,yytext,yyextra->currClass.data());
+ yyextra->vhdlKeyDict.clear();
+ }
+
+<ParseType>^{B}*("begin "|"begin") {
+ codifyLines(yyscanner,yytext,yyextra->currClass.data());
+ yyextra->isFuncProto=false;
+ }
+
+<ParseType>{SPECSIGN} {
+ yyextra->funcProto.append(yytext);
+ if (yyextra->isProto)
+ {
+ codifyLines(yyscanner,yytext,yyextra->currClass.data());
+ }
+ }
+
+<ParseType>["_a-zA-Z0-9]* {
+ QCString val(yytext);
+ yyextra->funcProto.append(yytext);
+ appStringLower(yyextra->prevString,yytext);
+
+ if (yyextra->isFuncProto && yyextra->braceCount==0)
+ {
+ yyextra->vhdlKeyDict.insert(yyextra->prevString.str());
+ }
+
+ if (yyextra->isProto)
+ {
+ if (!writeColoredWord(yyscanner,val))
+ {
+ if (!yyextra->isFuncProto &&
+ yyextra->vhdlKeyDict.find(yyextra->prevString.str())==yyextra->vhdlKeyDict.end())
+ {
+ val=val.stripWhiteSpace();
+ if (VhdlDocGen::isNumber(val))
+ {
+ startFontClass(yyscanner,"vhdllogic");
+ codifyLines(yyscanner,yytext,yyextra->currClass.data());
+ endFontClass(yyscanner);
+ }
+ else
+ {
+ generateMemLink(yyscanner,*yyextra->code,yyextra->currClass,val);
+ }
+ }
+ else
+ {
+ codifyLines(yyscanner,yytext,yyextra->currClass.data());
+ }
+ }
+ }
+ BEGIN(ParseType);
+ }
+
+<ParseType>{BRACEOPEN} {
+ yyextra->braceCount++;
+ yyextra->funcProto+='(';
+ if (yyextra->isProto)
+ {
+ writeFont(yyscanner,"vhdlchar",yytext);
+ }
+ BEGIN(ParseType);
+ }
+
+<ParseType>{BRACECLOSE} {
+ yyextra->braceCount--;
+ yyextra->funcProto+=')';
+ if (yyextra->isProto)
+ {
+ writeFont(yyscanner,"vhdlchar",yytext);
+ }
+ if (yyextra->braceCount==0 && !yyextra->isProto)// && !yyextra->isPackageBody)
+ {
+ yyextra->isProto=true;
+ appStringLower(yyextra->prevString,yytext);
+ writeFuncProto(yyscanner);
+ BEGIN(Bases);
+ }
+ if (yyextra->isPackageBody)
+ {
+ BEGIN(ParseType);
+ }
+ }
+
+
+<ClassesName>{FUNCNAME} {
+ appStringLower(yyextra->prevString,yytext);
+ yyextra->currClass.resize(0);
+ yyextra->currClass.append(yytext);
+ yyextra->currClass=yyextra->currClass.stripWhiteSpace();
+
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,yytext);
+ BEGIN(Bases);
+ }
+
+
+<ParseComponent>{BRACEOPEN} {
+ yyextra->braceCount++;
+ yyextra->code->codify(yytext);
+ }
+
+
+<ParseComponent>{BRACECLOSE} {
+ yyextra->braceCount--;
+ yyextra->code->codify(yytext);
+ if (yyextra->braceCount==0 && !yyextra->isComponent)
+ {
+ yyextra->tempComp.resize(0);
+ BEGIN(Bases);
+ }
+ else
+ {
+ BEGIN(ParseComponent);
+ }
+ }
+
+<ParseComponent>{B}*"-" {
+ if (strlen(yytext)>=2) // found text ?
+ {
+ writeFont(yyscanner,"keyword",yytext);
+ }
+ else
+ {
+ writeFont(yyscanner,"vhdlchar",yytext);
+ }
+ }
+
+<ParseComponent>{SPECSIGN} {
+ codifyLines(yyscanner,yytext);
+ }
+
+
+
+<ParseComponent>"\n"|" " {
+ codifyLines(yyscanner,yytext);
+ }
+
+<ParseComponent>{DIGITSS} {
+ startFontClass(yyscanner,"vhdllogic");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+
+<ParseComponent>{PORT} {
+ codifyLines(yyscanner,yytext);
+ yyextra->braceCount=1;
+ yyextra->isComponent=false;
+ }
+
+<ParseComponent>{GENERIC} {
+ codifyLines(yyscanner,yytext);
+ yyextra->braceCount=1;
+ }
+
+<ParseComponent>[_a-zA_Z][_a-zA-Z0-9]* {
+ QCString temp(yytext);
+ appStringLower(yyextra->prevString,yytext);
+ if (!checkVhdlString(yyscanner,temp))
+ {
+ if (!writeColoredWord(yyscanner,yyextra->prevString))
+ {
+ generateMemLink(yyscanner,*yyextra->code,yyextra->tempComp,temp);
+ }
+ }
+ }
+
+<ParseComponent>{STRING} {
+ QCString temp(yytext);
+ if (!checkVhdlString(yyscanner,temp))
+ {
+ codifyLines(yyscanner,yytext);
+ }
+ }
+
+
+<ParseProcessProto>[^()]* {
+ yyextra->funcProto.append(yytext);
+ }
+
+
+
+<ParseProcessProto>{BRACEOPEN} {
+ yyextra->funcProto.append(yytext);
+ yyextra->braceCount++;
+ }
+
+<ParseProcessProto>{BRACECLOSE} {
+ yyextra->funcProto.append(yytext);
+ yyextra->braceCount--;
+ if (yyextra->braceCount==0)
+ {
+ writeProcessProto(yyscanner);
+ BEGIN(Bases);
+ }
+ }
+
+<ParsePackage>[^:;]* { //found package
+ QCString temp(yytext);
+ QCStringList strl=QCStringList::split(".",temp);
+ if (strl.count()>2)
+ {
+ QCString s1=strl[0];
+ QCString s2=strl[1];
+ QCString s3=strl[2];
+ s1.append(".");
+ s3.prepend(".");
+ codifyLines(yyscanner,s1.data(),yyextra->currClass.data());
+ ClassDef *cd=VhdlDocGen::getPackageName(s2);
+ if (cd)
+ {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,s2.data());
+ }
+ else
+ {
+ codifyLines(yyscanner,s2.data());
+ }
+ codifyLines(yyscanner,s3.data());
+ }
+ else
+ {
+ writeFont(yyscanner,"keywordflow",yytext);
+ }
+ BEGIN(Bases);
+ }
+
+<Bases>{MAPCOMPONENT1}|{MAPCOMPONENT2}|{MAPCOMPONENT3}|{MAPCOMPONENT4} { // found port or generic map
+ QCString tt(yytext);
+ int j=tt.find('.');
+
+ if (j>0)
+ {
+ QCString left=tt.left(j+1);
+ codifyLines(yyscanner,left.data());
+ tt=tt.right(tt.length()-j-1);
+ left=VhdlDocGen::getIndexWord(tt.data(),0);
+ if (!left.isEmpty())
+ {
+ if (left.contains('('))
+ {
+ j=left.find('(',false);
+ QCString name=left.left(j);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,name.data());
+ yyextra->PortMapComp=name;
+ name=tt.right(tt.length()-name.length());
+ codifyLines(yyscanner,name.data());
+ }
+ else
+ {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,left.data());
+ tt.stripPrefix(left.data()); //=tt.right(tt.length()-left.length()-1);
+
+ yyextra->PortMapComp=left;
+ codifyLines(yyscanner,tt.data());
+ }
+ }
+ }
+ else
+ {
+ if (tt.contains(':',false))
+ {
+ codifyMapLines(yyscanner,tt.data());
+ }
+ else
+ {
+ codifyLines(yyscanner,tt.data());
+ }
+ }
+ yyextra->braceCount=1;
+ BEGIN(Map);
+ }
+
+<Bases>^{B}*("component"){BN}+{FUNCNAME} { // found component
+ appStringLower(yyextra->prevString,yytext);
+ QCString temp=VhdlDocGen::getIndexWord(yytext,1);
+ temp=temp.stripWhiteSpace();
+ VhdlDocGen::deleteAllChars(temp,'\n');
+ yyextra->tempComp=temp;
+ codifyLines(yyscanner,yytext,temp.data(),true);
+ yyextra->braceCount=0;
+ yyextra->isComponent=true;
+ BEGIN(ParseComponent);
+ }
+
+
+
+<Bases>{ARCHITECTURE} { // found architecture
+ yyextra->PortMapComp.resize(0);
+ QCString temp = VhdlDocGen::getIndexWord(yytext,3);
+ yyextra->currArch = true;
+ temp+="::";
+ temp+=VhdlDocGen::getIndexWord(yytext,1);
+ yyextra->currClass=temp;
+ VhdlDocGen::deleteAllChars(temp,'\n');
+ codifyLines(yyscanner,yytext,temp.data(),true);
+ yyextra->isPackageBody=false;
+ }
+
+
+<Bases>^{B}*("package "){BN}*("body"){BN}*{FUNCNAME} { // found package body
+ QCString ss(yytext);
+ QCString temp=VhdlDocGen::getIndexWord(yytext,2);
+ QCStringList ql=QCStringList::split(temp,ss);
+ QCString ll=ql[0];
+ codifyLines(yyscanner,ll.data(),yyextra->currClass.data());
+ temp=temp.stripWhiteSpace();
+ temp.prepend("_");
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,temp.data());
+ yyextra->currClass.resize(0);
+ yyextra->currClass=temp;
+ yyextra->isProto=false;
+ yyextra->isPackageBody=true;
+ }
+
+<Bases>{PROCESS} { // found process
+ yyextra->isFuncProto=true;
+ yyextra->funcProto.resize(0);
+ yyextra->funcProto.append(yytext);
+ yyextra->vhdlKeyDict.clear();
+ appStringLower(yyextra->prevString,yytext);
+ if (yyextra->prevString.contains('('))
+ {
+ yyextra->braceCount=1;
+ BEGIN(ParseProcessProto);
+ }
+ else
+ {
+ writeProcessProto(yyscanner);
+ }
+ }
+
+<Bases>("end"){BN}+("process") { // end of process
+ yyextra->isFuncProto=false;
+ codifyLines(yyscanner,yytext);
+ BEGIN(Bases);
+ }
+
+
+<Bases>^{B}*("begin "|"begin") {
+ yyextra->isFuncProto=false;
+ writeFont(yyscanner,"vhdlkeyword",yytext);
+ }
+
+<Bases>^{B}*("use"|"library"){BN}+ { //found package or library
+ writeFont(yyscanner,"vhdlkeyword",yytext);
+ BEGIN(ParsePackage);
+ }
+
+
+<Bases>^{B}*("use"){BN}+("configuration")[^\n]* {
+ codifyLines(yyscanner,yytext);
+ }
+
+<Bases>{FUNC} { // found function|procedure
+ yyextra->vhdlKeyDict.clear();
+ yyextra->funcProto.resize(0);
+ yyextra->isProto=false;
+ yyextra->funcProto.append(yytext);
+ yyextra->braceCount=1;
+ BEGIN(ParseType);
+ }
+
+<Bases>^{B}*("entity"|"package"){BN}+ {
+ appStringLower(yyextra->prevString,yytext);
+ writeFont(yyscanner,"keywordflow",yytext);
+ yyextra->isPackageBody=false;
+ BEGIN(ClassesName);
+ }
+
+<Bases>"end"{BN}+"architecture"{BN}+{FUNCNAME} {
+ codifyLines(yyscanner,yytext,yyextra->currClass.data(),true);
+ yyextra->currArch = false;
+ }
+<Bases>"end"{BN}+{FUNCNAME} {
+ if (yyextra->currArch)
+ {
+ codifyLines(yyscanner,yytext,yyextra->currClass.data(),true);
+ yyextra->currArch = false;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<Bases>"end" {
+ appStringLower(yyextra->prevString,yytext);
+ QCString temp(yytext);
+ temp=temp.stripWhiteSpace();
+
+ writeColoredWord(yyscanner,temp);
+ BEGIN(End);
+ }
+<End>{ID} {
+ appStringLower(yyextra->prevString,yytext);
+ QCString temp(yytext);
+ temp=temp.stripWhiteSpace();
+
+ if (!writeColoredWord(yyscanner,temp))
+ {
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,temp.data());
+ }
+ }
+<End>";" {
+ codifyLines(yyscanner,yytext);
+ BEGIN(Bases);
+ }
+<Bases>{KEYWORD} { // found keyword
+ QCString qcs(yytext);
+ if (!writeColoredWord(yyscanner,qcs))
+ {
+ startFontClass(yyscanner,"vhdlchar");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+ }
+
+
+<Bases>{ID} {
+ appStringLower(yyextra->prevString,yytext);
+ QCString temp(yytext);
+ temp=temp.stripWhiteSpace();
+
+ if (!writeColoredWord(yyscanner,temp))
+ {
+ startFontClass(yyscanner,"vhdlchar");
+ generateMemLink(yyscanner,*yyextra->code,yyextra->currClass,temp);
+ endFontClass(yyscanner);
+ }
+ }
+
+<Bases,ParseComponent>{DIGITSS} {
+ startFontClass(yyscanner,"vhdllogic");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+
+<Bases>^{B}*("use"){BN}+("entity"|"component")[^\n]* {
+ codifyLines(yyscanner,yytext,yyextra->currClass.data(),true);
+ }
+
+
+<Bases>{TYPEKW} {
+ codifyLines(yyscanner,yytext);
+ if (yyextra->isFuncProto)
+ {
+ BEGIN(ParseFuncProto);
+ }
+ else
+ {
+ BEGIN(Bases);
+ }
+ }
+
+<Bases>{OPERATOR} {
+ startFontClass(yyscanner,"vhdlchar");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+
+<Bases>","|"."|":"|"'"|"("|")" {
+ startFontClass(yyscanner,"vhdlchar");
+ yyextra->code->codify(yytext);
+ endFontClass(yyscanner);
+ }
+
+<Bases>{STRING} {
+ QCString qcs(yytext);
+ VhdlDocGen::deleteAllChars(qcs,'"');
+ VhdlDocGen::deleteAllChars(qcs,' ');
+
+ if (VhdlDocGen::isNumber(qcs))
+ {
+ writeFont(yyscanner,"vhdllogic",yytext);
+ }
+ else
+ {
+ writeFont(yyscanner,"keyword",yytext);
+ }
+ }
+
+<Bases>{B}*"#"[^\n]* {
+ writeFont(yyscanner,"keyword",yytext);
+ }
+
+<Bases>^{B}*{XILINX}/[^a-zA-Z0-9_] {
+ writeWord(yyscanner,yytext);
+ //codifyLines(yyscanner,yytext,yyextra->currClass.data(),true);
+ }
+
+<Bases>^{B}*"set_"[^\n]* {
+ writeWord(yyscanner,yytext);
+ }
+
+<*>\n {
+ codifyLines(yyscanner,yytext);
+ BEGIN(Bases);
+ }
+
+<*>[\x80-\xFF]* { // keep utf8 characters together...
+ yyextra->code->codify(yytext);
+ }
+<*>. {
+ yyextra->code->codify(yytext);
+ }
+
+<*>\n{TEXTT} { // found normal or special comment on its own line
+ QCString text(yytext);
+ int i=text.find("--");
+ if (text.mid(i,3)=="--!") // && // hide special comment
+ {
+ if (!Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ codifyLines(yyscanner,text,0,false,true);
+ }
+ else yyextra->yyLineNr++; // skip complete line, but count line
+ }
+ else // normal comment
+ {
+ codifyLines(yyscanner,text,0,false,true);
+ }
+ }
+<*>{TEXTT} { // found normal or special comment after something
+ QCString text(yytext);
+ int i=text.find("--");
+ if (text.mid(i,3)=="--!")
+ {
+ // hide special comment
+ if (!Config_getBool(STRIP_CODE_COMMENTS))
+ {
+ codifyLines(yyscanner,text,0,false,true);
+ }
+ }
+ else // normal comment
+ {
+ codifyLines(yyscanner,text,0,false,true);
+ }
+ }
+
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yy_size_t inputPosition = yyextra->inputPosition;
+ const char *s = yyextra->inputString + inputPosition;
+ yy_size_t c=0;
+ while( c < max_size && *s)
+ {
+ *buf++ = *s++;
+ c++;
+ }
+ yyextra->inputPosition += c;
+ return c;
+}
+
+static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
- if (g_searchCtx)
+ if (yyextra->searchCtx)
{
- Doxygen::searchIndex->setCurrentDoc(g_searchCtx,g_searchCtx->anchor(),FALSE);
+ yyextra->code->setCurrentDoc(yyextra->searchCtx,yyextra->searchCtx->anchor(),false);
}
else
{
- Doxygen::searchIndex->setCurrentDoc(g_sourceFileDef,anchor,TRUE);
+ yyextra->code->setCurrentDoc(yyextra->sourceFileDef,anchor,true);
}
}
}
-static bool checkVhdlString(QCString &name)
+static bool checkVhdlString(yyscan_t yyscanner,QCString &name)
{
- if (name.isEmpty()) return FALSE;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (name.isEmpty()) return false;
static QRegExp regg("[\\s\"]");
int len=name.length();
@@ -143,121 +963,123 @@ static bool checkVhdlString(QCString &name)
QCStringList qrl=QCStringList::split(regg,name);
if (VhdlDocGen::isNumber(qrl[0]))
{
- g_code->codify("\"");
- startFontClass("vhdllogic");
+ yyextra->code->codify("\"");
+ startFontClass(yyscanner,"vhdllogic");
QCString mid=name.mid(1,len-2); //" 1223 "
- g_code->codify(mid.data());
- endFontClass();
- g_code->codify("\"");
+ yyextra->code->codify(mid.data());
+ endFontClass(yyscanner);
+ yyextra->code->codify("\"");
}
else
{
- startFontClass("keyword");
- g_code->codify(name.data());
- endFontClass();
+ startFontClass(yyscanner,"keyword");
+ yyextra->code->codify(name.data());
+ endFontClass(yyscanner);
}
- return TRUE;
+ return true;
}
if (VhdlDocGen::isNumber(name))
{
- startFontClass("vhdllogic");
- g_code->codify(name.data());
- endFontClass();
- return TRUE;
+ startFontClass(yyscanner,"vhdllogic");
+ yyextra->code->codify(name.data());
+ endFontClass(yyscanner);
+ return true;
}
- return FALSE;
+ return false;
}
-static void addToSearchIndex(const char *text)
+static void addToSearchIndex(yyscan_t yyscanner,const char *text)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
- Doxygen::searchIndex->addWord(text,FALSE);
+ yyextra->code->addWord(text,false);
}
}
-/*! start a new line of code, inserting a line number if g_sourceFileDef
- * is TRUE. If a definition starts at the current line, then the line
+/*! start a new line of code, inserting a line number if yyextra->sourceFileDef
+ * is true. If a definition starts at the current line, then the line
* number is linked to the documentation of that definition.
*/
-static void startCodeLine()
+static void startCodeLine(yyscan_t yyscanner)
{
- //if (g_currentFontClass) { g_code->endFontClass(); }
- if (g_sourceFileDef)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ //if (yyextra->currentFontClass) { yyextra->code->endFontClass(); }
+ if (yyextra->sourceFileDef)
{
//QCString lineNumber,lineAnchor;
- //lineNumber.sprintf("%05d",g_yyLineNr);
- //lineAnchor.sprintf("l%05d",g_yyLineNr);
- // if ((g_yyLineNr % 500) == 0)
- // fprintf(stderr,"\n starting Line %d:",g_yyLineNr);
- Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
- //printf("startCodeLine %d d=%s\n", g_yyLineNr,d ? d->name().data() : "<null>");
- if (!g_includeCodeFragment && d)
+ //lineNumber.sprintf("%05d",yyextra->yyLineNr);
+ //lineAnchor.sprintf("l%05d",yyextra->yyLineNr);
+ // if ((yyextra->yyLineNr % 500) == 0)
+ // fprintf(stderr,"\n starting Line %d:",yyextra->yyLineNr);
+ const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr);
+ //printf("startCodeLine %d d=%s\n", yyextra->yyLineNr,d ? d->name().data() : "<null>");
+ if (!yyextra->includeCodeFragment && d)
{
- g_currentDefinition = d;
- g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
- if (!g_tempComp.isEmpty() && g_currentMemberDef )
+ yyextra->currentDefinition = d;
+ yyextra->currentMemberDef = yyextra->sourceFileDef->getSourceMember(yyextra->yyLineNr);
+ if (!yyextra->tempComp.isEmpty() && yyextra->currentMemberDef )
{
- //ClassDef *cf=VhdlDocGen::getClass(g_tempComp.data());
- QCString nn=g_currentMemberDef->name();
- MemberDef* mdeff=VhdlDocGen::findMember(g_tempComp,nn);
+ //ClassDef *cf=VhdlDocGen::getClass(yyextra->tempComp.data());
+ QCString nn=yyextra->currentMemberDef->name();
+ MemberDef* mdeff=VhdlDocGen::findMember(yyextra->tempComp,nn);
if (mdeff)
{
- g_currentMemberDef=mdeff;
+ yyextra->currentMemberDef=mdeff;
}
}
- g_parmType.resize(0);
- g_parmName.resize(0);
QCString lineAnchor;
- lineAnchor.sprintf("l%05d",g_yyLineNr);
- if (g_currentMemberDef)
+ lineAnchor.sprintf("l%05d",yyextra->yyLineNr);
+ if (yyextra->currentMemberDef)
{
- g_code->writeLineNumber(g_currentMemberDef->getReference(),
- g_currentMemberDef->getOutputFileBase(),
- g_currentMemberDef->anchor(),g_yyLineNr);
- setCurrentDoc(lineAnchor);
+ yyextra->code->writeLineNumber(yyextra->currentMemberDef->getReference(),
+ yyextra->currentMemberDef->getOutputFileBase(),
+ yyextra->currentMemberDef->anchor(),yyextra->yyLineNr);
+ setCurrentDoc(yyscanner,lineAnchor);
}
else if (d->isLinkableInProject())
{
- g_code->writeLineNumber(d->getReference(),
+ yyextra->code->writeLineNumber(d->getReference(),
d->getOutputFileBase(),
- 0,g_yyLineNr);
- setCurrentDoc(lineAnchor);
+ 0,yyextra->yyLineNr);
+ setCurrentDoc(yyscanner,lineAnchor);
}
}
else
{
- g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ yyextra->code->writeLineNumber(0,0,0,yyextra->yyLineNr);
}
}
- g_code->startCodeLine(g_sourceFileDef);
- g_startCode=TRUE;
- if (g_currentFontClass)
+ yyextra->code->startCodeLine(yyextra->sourceFileDef);
+ yyextra->startCode=true;
+ if (yyextra->currentFontClass)
{
- g_code->startFontClass(g_currentFontClass);
+ yyextra->code->startFontClass(yyextra->currentFontClass);
}
}
-static void endCodeLine()
+static void endCodeLine(yyscan_t yyscanner)
{
- endFontClass();
- g_code->endCodeLine();
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ endFontClass(yyscanner);
+ yyextra->code->endCodeLine();
}
-static void nextCodeLine()
+static void nextCodeLine(yyscan_t yyscanner)
{
- if (g_startCode)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yyextra->startCode)
{
- endCodeLine(); // </div>
+ endCodeLine(yyscanner); // </div>
}
- const char *fc = g_currentFontClass;
- if (g_yyLineNr<g_inputLines)
+ const char *fc = yyextra->currentFontClass;
+ if (yyextra->yyLineNr<yyextra->inputLines)
{
- g_currentFontClass = fc;
- startCodeLine(); //<div>
+ yyextra->currentFontClass = fc;
+ startCodeLine(yyscanner); //<div>
}
}
@@ -266,10 +1088,11 @@ static void nextCodeLine()
* and will be linked.
*/
-static void writeWord(const char *word,const char* curr_class=0,bool classLink=FALSE)
+static void writeWord(yyscan_t yyscanner,const char *word,const char* curr_class,bool classLink)
{
- bool found=FALSE;
- QCString temp;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ bool found=false;
+ QCString temp;
QCString tclass(curr_class);
QCString ttt(word);
if (ttt.isEmpty()) return;
@@ -280,69 +1103,71 @@ static void writeWord(const char *word,const char* curr_class=0,bool classLink=F
{
if (found)
{
- if (!writeColoredWord(temp)) // is it a keyword ?
+ if (!writeColoredWord(yyscanner,temp)) // is it a keyword ?
{
//if (VhdlDocGen::findKeyWord(temp))
- // writeFont("vhdlkeyword",temp.data());
- //printf("writeWord: %s\n",temp.data());
+ // writeFont(yyscanner,"vhdlkeyword",temp.data());
+ //printf("writeWord: %s\n",temp.data());
if (!tclass.isEmpty())
{
if (!classLink)
- {
- generateMemLink(*g_code,tclass,temp);
- }
+ {
+ generateMemLink(yyscanner,*yyextra->code,tclass,temp);
+ }
else
{
- generateClassOrGlobalLink(*g_code,temp,FALSE,curr_class);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,temp,false,curr_class);
+ }
+ }
+ else
+ {
+ if (!checkVhdlString(yyscanner,temp))
+ {
+ yyextra->code->codify(temp.data());
}
}
- else
- {
- if (!checkVhdlString(temp))
- g_code->codify(temp.data());
- }
}
temp.resize(0);
- found=FALSE;
+ found=false;
}
char cc[2];
cc[0]=c;
cc[1]=0;
- g_code->codify(cc);
+ yyextra->code->codify(cc);
}
else
{
- found=TRUE;
+ found=true;
temp+=c;
}
} // for
if (!temp.isEmpty())
{
- if (!writeColoredWord(temp))
+ if (!writeColoredWord(yyscanner,temp))
{
if (!tclass.isEmpty())
{
if (!classLink)
{
- generateMemLink(*g_code,tclass,temp); // generateMemLink(*g_code,g_CurrClass,left);
+ generateMemLink(yyscanner,*yyextra->code,tclass,temp); // generateMemLink(yyscanner,*yyextra->code,yyextra->currClass,left);
}
else
{
- generateClassOrGlobalLink(*g_code,temp,FALSE,curr_class);
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,temp,false,curr_class);
}
}
- else
+ else
{
QCString qc(temp.data());
if (VhdlDocGen::isNumber(qc)){
- startFontClass("vhdllogic");
- g_code->codify(temp.data());
- endFontClass();
+ startFontClass(yyscanner,"vhdllogic");
+ yyextra->code->codify(temp.data());
+ endFontClass(yyscanner);
}
- else
- g_code->codify(temp.data());
+ else
+ yyextra->code->codify(temp.data());
}
}
}
@@ -352,64 +1177,68 @@ static void writeWord(const char *word,const char* curr_class=0,bool classLink=F
/*! write a code fragment 'text' that may span multiple lines, inserting
* line numbers for each line.
*/
-static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE,bool comment=FALSE)
+static void codifyLines(yyscan_t yyscanner,const char *text,const char *cl,bool classlink,bool comment)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (text==0) return;
- //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ //printf("codifyLines(%d,\"%s\")\n",yyextra->yyLineNr,text);
const char *p=text,*sp=p;
char c;
- bool done=FALSE;
+ bool done=false;
while (!done)
{
sp=p;
while ((c=*p++) && c!='\n') {}
if (c=='\n')
{
- g_yyLineNr++;
+ yyextra->yyLineNr++;
QCString line = sp;
line = line.left((int)(p-sp)-1);
- //*(p-1)='\0';
- //g_code->codify(sp);
if (comment)
{
- writeFont("comment",line.data());
+ writeFont(yyscanner,"comment",line.data());
}
else
{
- writeWord(line,cl,classlink);
+ writeWord(yyscanner,line,cl,classlink);
}
- nextCodeLine();
+ nextCodeLine(yyscanner);
}
else
{
if (comment)
- writeFont("comment",sp);
+ {
+ writeFont(yyscanner,"comment",sp);
+ }
else
- writeWord(sp,cl,classlink);
- done=TRUE;
+ {
+ writeWord(yyscanner,sp,cl,classlink);
+ }
+ done=true;
}
}
}
/*! writes a link to a fragment \a text that may span multiple lines, inserting
- * line numbers for each line. If \a text contains newlines, the link will be
+ * line numbers for each line. If \a text contains newlines, the link will be
* split into multiple links with the same destination, one for each line.
*/
-static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
Definition *d,
const char *text)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
- TooltipManager::instance()->addTooltip(d);
+ TooltipManager::instance().addTooltip(ol,d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
- QCString tooltip;
+ QCString tooltip;
if (!sourceTooltips) // fall back to simple "title" tooltips
{
tooltip = d->briefDescriptionAsTooltip();
}
- bool done=FALSE;
+ bool done=false;
char *p=(char *)text;
while (!done)
{
@@ -418,78 +1247,58 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
while ((c=*p++) && c!='\n') {}
if (c=='\n')
{
- g_yyLineNr++;
+ yyextra->yyLineNr++;
*(p-1)='\0';
// printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
ol.writeCodeLink(ref,file,anchor,sp,tooltip);
- nextCodeLine();
+ nextCodeLine(yyscanner);
}
else
{
ol.writeCodeLink(ref,file,anchor,sp,tooltip);
- done=TRUE;
+ done=true;
}
}
}
-static void setParameterList(const MemberDef *md)
-{
- g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
- for (const Argument &a: md->argumentList())
- {
- g_parmName = a.name.copy();
- g_parmType = a.type.copy();
- int i = g_parmType.find('*');
- if (i!=-1) g_parmType = g_parmType.left(i);
- i = g_parmType.find('&');
- if (i!=-1) g_parmType = g_parmType.left(i);
- g_parmType.stripPrefix("const ");
- g_parmType=g_parmType.stripWhiteSpace();
- // g_theVarContext.addVariable(g_parmType,g_parmName);
- }
-}
-
-
/*! writes a link to a function or procedure
*/
-
-static void generateFuncLink(CodeOutputInterface &ol,MemberDef* mdef)
+static void generateFuncLink(yyscan_t yyscanner,CodeOutputInterface &ol,MemberDef* mdef)
{
-
//printf("generateFuncLink(FuncName=%s)\n",mdef->name().data());
QCString memberName=mdef->name();
- if (mdef && mdef->isLinkable()) // is it a linkable class
+ if (mdef->isLinkable()) // is it a linkable class
{
- writeMultiLineCodeLink(ol,mdef,mdef->name());
- addToSearchIndex(memberName);
+ writeMultiLineCodeLink(yyscanner,ol,mdef,mdef->name());
+ addToSearchIndex(yyscanner,memberName);
return;
}
- codifyLines(memberName.data());
- addToSearchIndex(memberName);
+ codifyLines(yyscanner,memberName.data());
+ addToSearchIndex(yyscanner,memberName);
} // generateFuncLink
-static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName)
+static void generateMemLink(yyscan_t yyscanner,CodeOutputInterface &ol,QCString &clName,QCString& memberName)
{
- if (memberName.isEmpty()) return;
+ if (memberName.isEmpty()) return;
if (clName.isEmpty())
{
- codifyLines(memberName.data());
+ codifyLines(yyscanner,memberName.data());
return;
}
-
+
QCString className=clName;
MemberDef *md=0;
//MemberDef *comp=0;
- //bool isLocal=FALSE;
+ //bool isLocal=false;
md=VhdlDocGen::findMember(className,memberName);
ClassDef *po=VhdlDocGen::getClass(className.data());
- if (md==0 && po && (VhdlDocGen::VhdlClasses)po->protection()==VhdlDocGen::PACKBODYCLASS)
+ if (md==0 && po && (VhdlDocGen::VhdlClasses)po->protection()==VhdlDocGen::PACKBODYCLASS)
{
QCString temp=className;//.stripPrefix("_");
temp.stripPrefix("_");
@@ -498,17 +1307,17 @@ static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& m
if (md && md->isLinkable()) // is it a linkable class
{
- writeMultiLineCodeLink(ol,md,memberName);
- addToSearchIndex(memberName);
+ writeMultiLineCodeLink(yyscanner,ol,md,memberName);
+ addToSearchIndex(yyscanner,memberName);
return;
}
// nothing found, just write out the word
- codifyLines(memberName.data());
- addToSearchIndex(memberName);
+ codifyLines(yyscanner,memberName.data());
+ addToSearchIndex(yyscanner,memberName);
}// generateMemLink
-static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool /*typeOnly*/, const char *curr_class)
+static void generateClassOrGlobalLink(yyscan_t yyscanner,CodeOutputInterface &ol,const char *clName, bool /*typeOnly*/, const char *curr_class)
{
QCString className=clName;
@@ -516,9 +1325,9 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
ClassDef *cd=0;
//MemberDef *md=0;
- //bool isLocal=FALSE;
+ //bool isLocal=false;
className.stripPrefix("_");
- cd = getClass(className.data());
+ cd = getClass(className.data());
if (!cd && curr_class)
{
if (QCString(curr_class).contains(QRegExp("::"+QCString(clName)+"$"))) cd = getClass(curr_class);
@@ -535,14 +1344,14 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
//{
// temp=VhdlDocGen::getClassName(cd);
//}
- writeMultiLineCodeLink(ol,cd,temp);
- addToSearchIndex(className);
+ writeMultiLineCodeLink(yyscanner,ol,cd,temp);
+ addToSearchIndex(yyscanner,className);
return;
}
Definition *d = cd->getOuterScope();
if (d && d->definitionType()==Definition::TypeClass)
{
- cd = dynamic_cast<ClassDef*>(d);
+ cd = toClassDef(d);
}
else
{
@@ -551,55 +1360,59 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
}
// nothing found, just write out the word
- codifyLines(clName);
- addToSearchIndex(clName);
+ codifyLines(yyscanner,clName);
+ addToSearchIndex(yyscanner,clName);
}// generateClasss or global link
/*! counts the number of lines in the input */
-static int countLines()
+static int countLines(yyscan_t yyscanner)
{
- const char *p=g_inputString;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ const char *p=yyextra->inputString;
char c;
int count=1;
- while ((c=*p))
- {
- p++ ;
- if (c=='\n') count++;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
}
- if (p>g_inputString && *(p-1)!='\n')
+ if (p>yyextra->inputString && *(p-1)!='\n')
{ // last line does not end with a \n, so we add an extra
// line and explicitly terminate the line after parsing.
- count++,
- g_needsTermination=TRUE;
- }
+ count++,
+ yyextra->needsTermination=true;
+ }
return count;
}
-static void endFontClass()
+static void endFontClass(yyscan_t yyscanner)
{
- if (g_currentFontClass)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yyextra->currentFontClass)
{
- g_code->endFontClass();
- g_currentFontClass=0;
+ yyextra->code->endFontClass();
+ yyextra->currentFontClass=0;
}
}
-static void startFontClass(const char *s)
+static void startFontClass(yyscan_t yyscanner,const char *s)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (s==0) return;
- endFontClass();
- g_code->startFontClass(s);
- g_currentFontClass=s;
+ endFontClass(yyscanner);
+ yyextra->code->startFontClass(s);
+ yyextra->currentFontClass=s;
}
-static void writeFont(const char *s,const char* text)
+static void writeFont(yyscan_t yyscanner,const char *s,const char* text)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (s==0 || text==0) return;
- //printf("writeFont(%d,\"%s\")\n",g_yyLineNr,text);
- g_code->startFontClass(s);
- g_code->codify(text);
- g_code->endFontClass();
+ //printf("writeFont(yyscanner,%d,\"%s\")\n",yyextra->yyLineNr,text);
+ yyextra->code->startFontClass(s);
+ yyextra->code->codify(text);
+ yyextra->code->endFontClass();
}
//----------------------------------------------------------------------------
@@ -608,42 +1421,34 @@ static void appStringLower(QCString& qcs,const char* text)
{
qcs.resize(0);
qcs.append(text);
- //qcs=qcs.lower();
qcs=qcs.stripWhiteSpace();
}
-//static void appString(QCString& qcs,const char* text)
-//{
-// qcs.resize(0);
-// qcs.append(text);
-//}
-
-static QCString g_temp;
-
/* writes and links a port map statement */
-static void codifyMapLines(const char *text)
+static void codifyMapLines(yyscan_t yyscanner,const char *text)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (text==0) return;
- g_temp.resize(0);
- //bool dot=FALSE;
+ QCString temp;
+ //bool dot=false;
int wordCounter=0;
QCString ctemp;
- //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ //printf("codifyMapLines(%d,\"%s\")\n",yyextra->yyLineNr,text);
const char *p=text; //,*sp=p;
char c;
- bool done=FALSE;
+ bool done=false;
while (!done)
{
//sp=p;
while ((c=*p++) && c!='\n' && c!=':' && c != ' ' && c != '(' && c!='\0' && c!='\t')
- {
+ {
if (c!=0x9)
- g_temp+=c;
+ temp+=c;
}
if (c=='\0') return;
- if (!g_temp.isEmpty()) wordCounter++;
+ if (!temp.isEmpty()) wordCounter++;
- if (!g_temp.isEmpty())
+ if (!temp.isEmpty())
{
// different kinds of component instantiations
// xxx:yyy (generic/port) map(
@@ -651,50 +1456,51 @@ static void codifyMapLines(const char *text)
// xxx: entity yyy(zzz) (generic/port) map(
if (wordCounter==2 || wordCounter==3)
{
- QCString q=g_temp.lower(); // consider (upper/lower) cases
- if (q=="entity" || q=="component" || q=="configuration" || q=="port" || q=="generic")
- {
- generateMemLink(*g_code,g_CurrClass,g_temp);
- }
- else
- {
- g_PortMapComp=g_temp;
- generateClassOrGlobalLink(*g_code,g_temp);
- }
+ QCString q=temp.lower(); // consider (upper/lower) cases
+ if (q=="entity" || q=="component" || q=="configuration" || q=="port" || q=="generic")
+ {
+ generateMemLink(yyscanner,*yyextra->code,yyextra->currClass,temp);
+ }
+ else
+ {
+ yyextra->PortMapComp=temp;
+ generateClassOrGlobalLink(yyscanner,*yyextra->code,temp);
+ }
}
- else
+ else
{
- generateMemLink(*g_code,g_CurrClass,g_temp);
+ generateMemLink(yyscanner,*yyextra->code,yyextra->currClass,temp);
}
}
ctemp.fill(c,1);
- codifyLines(ctemp.data());
+ codifyLines(yyscanner,ctemp.data());
ctemp.resize(0);
- g_temp.resize(0);
+ temp.resize(0);
}//while
-}//codifymaplines
+}//codifyMapLines
/*
-* writes a function|procedure prototype and links the function|procedure name
+* writes a function|procedure prototype and links the function|procedure name
*/
-static void writeFuncProto()
+static void writeFuncProto(yyscan_t yyscanner)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
QCString name,ret;
- VhdlDocGen::parseFuncProto(g_FuncProto,name,ret,FALSE);
+ VhdlDocGen::parseFuncProto(yyextra->funcProto,name,ret,false);
if (name.isEmpty())
{
- codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ codifyLines(yyscanner,yyextra->funcProto.data(),yyextra->currClass.data());
return;
}
- QCStringList qlist=QCStringList::split(name,g_FuncProto);
+ QCStringList qlist=QCStringList::split(name,yyextra->funcProto);
QCString temp=qlist[0];
- codifyLines(temp.data(),g_CurrClass.data());
- g_FuncProto.stripPrefix(temp.data());
+ codifyLines(yyscanner,temp.data(),yyextra->currClass.data());
+ yyextra->funcProto.stripPrefix(temp.data());
temp.resize(0);
- temp=g_CurrClass;
- if (isPackageBody)
+ temp=yyextra->currClass;
+ if (yyextra->isPackageBody)
{
temp.stripPrefix("_");// _{package body name}
}
@@ -702,844 +1508,69 @@ static void writeFuncProto()
if (mdef)
{
- generateFuncLink(*g_code,mdef);
- g_FuncProto.stripPrefix(name.data());
- codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ generateFuncLink(yyscanner,*yyextra->code,mdef);
+ yyextra->funcProto.stripPrefix(name.data());
+ codifyLines(yyscanner,yyextra->funcProto.data(),yyextra->currClass.data());
}
else
{
- codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ codifyLines(yyscanner,yyextra->funcProto.data(),yyextra->currClass.data());
}
}// writeFuncProto
/* writes a process prototype to the output */
- static void writeProcessProto(){
- codifyLines(g_FuncProto.data(),g_CurrClass.data());
- g_vhdlKeyDict.clear();
+static void writeProcessProto(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ codifyLines(yyscanner,yyextra->funcProto.data(),yyextra->currClass.data());
+ yyextra->vhdlKeyDict.clear();
}// writeProcessProto
/* writes a keyword */
-static bool writeColoredWord(QCString& word )
+static bool writeColoredWord(yyscan_t yyscanner,QCString& word )
{
QCString qcs=word.lower();
- QCString *ss=VhdlDocGen::findKeyWord(qcs);
- if (ss)
+ const char *ss=VhdlDocGen::findKeyWord(qcs);
+ if (ss)
{
- writeFont(ss->data(),word.data());
- return TRUE;
+ writeFont(yyscanner,ss,word.data());
+ return true;
}
- return FALSE;
+ return false;
}
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+//-----------------------------------------------------------------------------------
-static int yyread(char *buf,int max_size)
+struct VHDLCodeParser::Private
{
- int c=0;
- while( c < max_size && g_inputString[g_inputPosition] )
- {
- *buf = g_inputString[g_inputPosition++] ;
- c++; buf++;
- }
- return c;
-}
-
-%}
-
-
-B [ \t]
-BN [ \t\n\r]
-STRING ["][^"\n]*["]
-NAME [a-z_A-Z][ a-z_A-Z0-9]*
-FUNCNAME [a-z_A-Z"][a-z_A-Z0-9+*"/=<>-]*
-ID "$"?[a-z_A-Z][a-z_A-Z0-9]*
-SPECSIGN [:;, +*&\/=<>'\t]*
-DIGITSS [0-9]+|[0-9]+("#")*[0-9_a-fA-F\+\.\-]+("#")*
-ALLTYPESMAP {B}*[_a-zA-Z0-9. ]+{BN}*
-ALLTYPESMAP1 {BN}*[_a-zA-Z0-9.() ]+{BN}*
-
-ARCHITECTURE ^{B}*("architecture"){BN}+{FUNCNAME}{BN}+("of"){BN}+{FUNCNAME}{BN}+("is")
-PROCESS ({BN}*{FUNCNAME}{BN}*[:]+{BN}*("process"){BN}*[(]*)|[^a-zA-Z]("process "|"process("){BN}*[ (]*|[^a-zA-Z]("process"){BN}+
-
-END1 {B}*("end "){BN}+("if"|"case"|"loop"|"generate"|"for")
-END2 [^a-zA-Z_]("end"){BN}*[;]
-END3 {BN}*[^a-zA-Z]("end"){BN}+{FUNCNAME}{BN}*[;]
-END4 {B}*("end"){BN}+"function"{BN}+{FUNCNAME}{BN}*[;]
-ENDEFUNC {END3}|{END4}|{END2}
-
-KEYWORD ("of"|"new"|"event"|"break"|"case"|"end"|"loop"|"else"|"for"|"goto"|"if"|"return"|"generate"|"is"|"while"|"in")
-TYPEKW ^{B}*("type"|"subtype"|"constant"|"attribute"|"signal"|"variable","alias","configuration")
-FUNC ^{B}*("function"|"procedure"){BN}*{FUNCNAME}{BN}*("(")
-
-ARITHOP "+"|"-"|"/"|"*"|"%"|"/="|":="
-ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
-LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
-BITOP "&"|"|"|"^"|"<<"|">>"|"~"
-OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
-
-PORT {B}*("port"){BN}*("(")
-GENERIC {B}*("generic"){BN}*("(")
-
-BRACEOPEN [(]{1}
-BRACECLOSE [)]{1}
-
-TEXTT {B}*"--"[^\n]*
-
-MAPCOMPONENT1 ({ALLTYPESMAP}[:]{ALLTYPESMAP}{TEXTT}*{BN}+("port"|"generic"){BN}+("map"){BN}*("("){1})
-MAPCOMPONENT2 {BN}*("port"|"generic"){BN}+("map"){BN}*("("){1}
-MAPCOMPONENT3 ({ALLTYPESMAP}[:]{BN}*{ALLTYPESMAP1}{TEXTT}*{BN}+("port"|"generic"){BN}+("map"){BN}*("("){1})
-MAPCOMPONENT4 ({ALLTYPESMAP}[:]{BN}*("entity"|"component"|"configuration"){BN}+{ALLTYPESMAP1}{TEXTT}*{BN}*("port"|"generic"){BN}*("map"){BN}*("("){1})
-
-XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFIG"|"CONFIG_MODE"|"COOL_CLK"|"DATA_GATE"|"DCI_VALUE"|"DISABLE"|"DRIVE"|"DROP_SPEC"|"ENABLE"|"FAST"|"FEEDBACK"|"FILE"|"FLOAT"|"FROM-THRU-TO"|"FROM-TO"|"HBLKNM"|"HU_SET"|"INREG"|"IOB"|"IOBDELAY"|"IOSTANDARD"|"KEEP"|"KEEPER"|"LOC"|"LOCATE"|"LOCK_PINS"|"MAP"|"MAXDELAY"|"MAXPT"|"MAXSKEW"|"NODELAY"|"NOREDUCE"|"OFFSET"|"OPEN_DRAIN"|"OPT_EFFORT"|"OPTIMIZE"|"PERIOD"|"PIN"|"PRIORITY"|"PROHIBIT"|"PULLDOWN"|"PULLUP"|"PWR_MODE"|"REG"|"RLOC"|"RLOC_ORIGIN"|"RLOC_RANGE"|"SAVE NET"|"FLAG"|"SYSTEM_JITTER"|"TEMPERATURE"|"TIMEGRP"|"TIMESPEC"|"VOLTAGE"
-
-%option noyywrap
-%option nounput
+ yyscan_t yyscanner;
+ vhdlcodeYY_state state;
+};
-%x Bases
-%x ParseType
-%x ParseFuncProto
-%x ParseComponent
-%x ParsePackage
-%x ParseProcessProto
-%x ClassName
-%x PackageName
-%x ClassVar
-%x ClassesName
-%x Map
-%x End
-%x Body
-
-%%
-
-. {
- BEGIN(Bases);
- }
-
-<Map>{BRACEOPEN} {
- g_braceCount++;
- writeFont("vhdlchar",vhdlcodeYYtext);
- BEGIN(Map);
- }
-
-<Map>[^()\n,--]* { /* write and link a port map lines */
- QCString tt(vhdlcodeYYtext);
- VhdlDocGen::deleteAllChars(tt,',');
- QRegExp r("=>");
- QCStringList ql=QCStringList::split(r,tt);
- if (ql.count()>=2)
- {
- unsigned int index=0;
- QCString t1=ql[0];
- char cc=t1.at(index);
- while (cc==' ' || cc=='\t')
- {
- char c2[2];
- c2[0]=cc;
- c2[1]=0;
- g_code->codify(c2);
- index++;
- if (index>=t1.size()) break;
- cc=t1.at(index);
- }
-
- QCString s1=t1;
- s1=s1.stripWhiteSpace();
-
- // if (!g_PortMapComp.isEmpty())
- generateMemLink(*g_code,g_PortMapComp,s1);
- while (index++<t1.size())
- {
- char cc=t1.at(index);
- if (cc==' ' || cc=='\t')
- {
- char c2[2];
- c2[0]=cc;
- c2[1]=0;
- g_code->codify(c2);
- }
- }
- codifyLines("=>");
- index=0;
- QCString s2=ql[1];
- t1=s2;
- cc=t1.at(index);
- while (cc==' ' || cc=='\t')
- {
- char c2[2];
- c2[0]=cc;
- c2[1]=0;
- g_code->codify(c2);
- index++;
- if (index>=t1.size()) break;
- cc=t1.at(index);
- }
- s2=s2.stripWhiteSpace();
- if (!checkVhdlString(s2))
- generateMemLink(*g_code,g_CurrClass,s2);
- while (index++<t1.size())
- {
- if (t1.at(index)==' ')
- {
- g_code->codify(" ");
- }
- }
- }
- else
- {
- codifyLines(vhdlcodeYYtext,g_CurrClass.data());
- }
- BEGIN(Map);
- }
-
-<Map>"\n"|"," {
- codifyLines(vhdlcodeYYtext);
- BEGIN(Map);
- }
-
-<Map>{BRACECLOSE} {
- g_braceCount--;
- writeFont("vhdlchar",vhdlcodeYYtext);
- if (g_braceCount==0)
- {
- BEGIN(Bases);
- }
- }
-
-<ParseFuncProto>{NAME} {
- QCString tmp(vhdlcodeYYtext);
- tmp=tmp.stripWhiteSpace();
- appStringLower(g_PrevString,vhdlcodeYYtext);
- g_vhdlKeyDict.insert(g_PrevString,new QCString(g_PrevString.data()));
- if (!writeColoredWord(tmp))
- {
- generateMemLink(*g_code,g_CurrClass,tmp);
- }
- BEGIN(Bases);
- }
-
-<ParseType>{STRING} {
- QCString qcs(vhdlcodeYYtext);
- VhdlDocGen::deleteAllChars(qcs,'"');
- VhdlDocGen::deleteAllChars(qcs,' ');
- if (VhdlDocGen::isNumber(qcs))
- writeFont("vhdllogic",vhdlcodeYYtext);
- else
- writeFont("keyword",vhdlcodeYYtext);
- }
-
-<ParseType>"\n" {
- g_FuncProto.append(vhdlcodeYYtext);
- if (isProto)
- {
- codifyLines(vhdlcodeYYtext);
- }
- BEGIN(ParseType);
- }
-
-
-<ParseType>{TEXTT} {
- g_FuncProto.append(vhdlcodeYYtext);
- if (isProto)
- {
- writeFont("keyword",vhdlcodeYYtext);
- }
- BEGIN(ParseType);
- }
-
-<ParseType>{ENDEFUNC} {
- QRegExp regg("[\\s]");
- QCString tt(vhdlcodeYYtext);
- codifyLines(vhdlcodeYYtext,g_CurrClass.data());
- tt=tt.lower();
- VhdlDocGen::deleteAllChars(tt,';');
- tt.stripWhiteSpace();
- QCStringList ql=QCStringList::split(regg,tt);
- int index=ql.findIndex(QCString("if"))+1;
- index+=ql.findIndex(QCString("case"))+1;
- index+=ql.findIndex(QCString("loop"))+1;
- index+=ql.findIndex(QCString("generate"))+1;
- if (index==0)
- {
- BEGIN(Bases);
- }
- else
- {
- BEGIN(ParseType);
- }
- }
-
-<ParseType>{END1} {
- codifyLines(vhdlcodeYYtext,g_CurrClass.data());
- g_vhdlKeyDict.clear();
- }
-
-<ParseType>^{B}*("begin "|"begin") {
- codifyLines(vhdlcodeYYtext,g_CurrClass.data());
- isFuncProto=FALSE;
- }
-
-<ParseType>{SPECSIGN} {
- g_FuncProto.append(vhdlcodeYYtext);
- if (isProto)
- {
- codifyLines(vhdlcodeYYtext,g_CurrClass.data());
- }
- }
-
-<ParseType>["_a-zA-Z0-9]* {
- QCString val(vhdlcodeYYtext);
- g_FuncProto.append(vhdlcodeYYtext);
- appStringLower(g_PrevString,vhdlcodeYYtext);
-
- if (isFuncProto && g_braceCount==0)
- {
- g_vhdlKeyDict.insert(g_PrevString,new QCString(g_PrevString.data()));
- }
-
- if (isProto)
- {
- if (!writeColoredWord(val))
- {
- if (!isFuncProto && !g_vhdlKeyDict.find(g_PrevString))
- {
- val=val.stripWhiteSpace();
- if (VhdlDocGen::isNumber(val))
- {
- startFontClass("vhdllogic");
- codifyLines(vhdlcodeYYtext,g_CurrClass.data());
- endFontClass();
- }
- else
- generateMemLink(*g_code,g_CurrClass,val);
- }
- else
- {
- codifyLines(vhdlcodeYYtext,g_CurrClass.data());
- }
- }
- }
- BEGIN(ParseType);
- }
-
-<ParseType>{BRACEOPEN} {
- g_braceCount++;
- g_FuncProto+='(';
- if (isProto)
- {
- writeFont("vhdlchar",vhdlcodeYYtext);
- }
- BEGIN(ParseType);
- }
-
-<ParseType>{BRACECLOSE} {
- g_braceCount--;
- g_FuncProto+=')';
- if (isProto)
- {
- writeFont("vhdlchar",vhdlcodeYYtext);
- }
- if (g_braceCount==0 && !isProto)// && !isPackageBody)
- {
- isProto=TRUE;
- appStringLower(g_PrevString,vhdlcodeYYtext);
- writeFuncProto();
- BEGIN(Bases);
- }
- if (isPackageBody)
- {
- BEGIN(ParseType);
- }
- }
-
-
-<ClassesName>{FUNCNAME} {
- appStringLower(g_PrevString,vhdlcodeYYtext);
- g_CurrClass.resize(0);
- g_CurrClass.append(vhdlcodeYYtext);
- g_CurrClass=g_CurrClass.stripWhiteSpace();
-
- generateClassOrGlobalLink(*g_code,vhdlcodeYYtext);
- BEGIN(Bases);
- }
-
-
-<ParseComponent>{BRACEOPEN} {
- g_braceCount++;
- g_code->codify(vhdlcodeYYtext);
- }
-
-
-<ParseComponent>{BRACECLOSE} {
- g_braceCount--;
- g_code->codify(vhdlcodeYYtext);
- if (g_braceCount==0 && !isComponent)
- {
- g_tempComp.resize(0);
- BEGIN(Bases);
- }
- else
- {
- BEGIN(ParseComponent);
- }
- }
-
-<ParseComponent>{B}*"-" {
- if (strlen(vhdlcodeYYtext)>=2) // found text ?
- {
- writeFont("keyword",vhdlcodeYYtext);
- }
- else
- {
- writeFont("vhdlchar",vhdlcodeYYtext);
- }
- }
-
-<ParseComponent>{SPECSIGN} {
- codifyLines(vhdlcodeYYtext);
- }
-
-
-
-<ParseComponent>"\n"|" " {
- codifyLines(vhdlcodeYYtext);
- }
-
-<ParseComponent>{DIGITSS} {
- startFontClass("vhdllogic");
- codifyLines(vhdlcodeYYtext);
- endFontClass();
- }
-
-<ParseComponent>{PORT} {
- codifyLines(vhdlcodeYYtext);
- g_braceCount=1;
- isComponent=FALSE;
- }
-
-<ParseComponent>{GENERIC} {
- codifyLines(vhdlcodeYYtext);
- g_braceCount=1;
- }
-
-<ParseComponent>[_a-zA_Z][_a-zA-Z0-9]* {
- QCString temp(vhdlcodeYYtext);
- appStringLower(g_PrevString,vhdlcodeYYtext);
- if (!checkVhdlString(temp)){
- if (!writeColoredWord(g_PrevString))
- {
- generateMemLink(*g_code,g_tempComp,temp);
- }
- }
- }
-
-<ParseComponent>{STRING} {
- QCString temp(vhdlcodeYYtext);
- if (!checkVhdlString(temp))
- codifyLines(vhdlcodeYYtext);
- }
-
-
-<ParseProcessProto>[^()]* {
- g_FuncProto.append(vhdlcodeYYtext);
- }
-
-
-
-<ParseProcessProto>{BRACEOPEN} {
- g_FuncProto.append(vhdlcodeYYtext);
- g_braceCount++;
- }
-
-<ParseProcessProto>{BRACECLOSE} {
- g_FuncProto.append(vhdlcodeYYtext);
- g_braceCount--;
- if (g_braceCount==0)
- {
- writeProcessProto();
- BEGIN(Bases);
- }
- }
-
-<ParsePackage>[^:;]* { //found package
- QCString temp(vhdlcodeYYtext);
- QCStringList strl=QCStringList::split(".",temp);
- if (strl.count()>2)
- {
- QCString s1=strl[0];
- QCString s2=strl[1];
- QCString s3=strl[2];
- s1.append(".");
- s3.prepend(".");
- codifyLines(s1.data(),g_CurrClass.data());
- ClassDef *cd=VhdlDocGen::getPackageName(s2);
- if (cd)
- {
- generateClassOrGlobalLink(*g_code,s2.data());
- }
- else
- {
- codifyLines(s2.data());
- }
- codifyLines(s3.data());
- }
- else
- {
- writeFont("keywordflow",vhdlcodeYYtext);
- }
- BEGIN(Bases);
- }
-
-<Bases>{MAPCOMPONENT1}|{MAPCOMPONENT2}|{MAPCOMPONENT3}|{MAPCOMPONENT4} { // found port or generic map
- QCString tt(vhdlcodeYYtext);
- /*
- if (tt.contains(':',FALSE))
- {
- isStartMap=TRUE;
- }
- else
- {
- isStartMap=FALSE;
- }
- */
- int j=tt.find('.');
-
- if (j>0)
- {
- QCString left=tt.left(j+1);
- codifyLines(left.data());
- tt=tt.right(tt.length()-j-1);
- left=VhdlDocGen::getIndexWord(tt.data(),0);
- if (!left.isEmpty())
- {
- if (left.contains('('))
- {
- j=left.find('(',FALSE);
- QCString name=left.left(j);
- generateClassOrGlobalLink(*g_code,name.data());
- g_PortMapComp=name;
- name=tt.right(tt.length()-name.length());
- codifyLines(name.data());
- }
- else
- {
- generateClassOrGlobalLink(*g_code,left.data());
- tt.stripPrefix(left.data()); //=tt.right(tt.length()-left.length()-1);
-
- g_PortMapComp=left;
- codifyLines(tt.data());
- }
- }
- }
- else
- {
- if (tt.contains(':',FALSE))
- codifyMapLines(tt.data());
- else
- codifyLines(tt.data());
- }
- g_braceCount=1;
- BEGIN(Map);
- }
-
-<Bases>^{B}*("component"){BN}+{FUNCNAME} { // found component
- appStringLower(g_PrevString,vhdlcodeYYtext);
- // writeFont("keywordflow",VhdlDocGen::getIndexWord(vhdlcodeYYtext,0).data());
- // writeFont("vhdlkeyword"," ");
- QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
- temp=temp.stripWhiteSpace();
- VhdlDocGen::deleteAllChars(temp,'\n');
- g_tempComp=temp;
- codifyLines(vhdlcodeYYtext,temp.data(),TRUE);
- g_braceCount=0;
-
- //if (getClass(temp.data()))
- // generateClassOrGlobalLink(*g_code,temp.data());
- //else
- // generateMemLink(*g_code,g_CurrClass,temp);
-
- isComponent=TRUE;
- BEGIN(ParseComponent);
- }
-
-
-
-<Bases>{ARCHITECTURE} { // found architecture
- g_PortMapComp.resize(0);
- // writeFont("vhdlkeyword",VhdlDocGen::getIndexWord(vhdlcodeYYtext,0).data());
- // writeFont("vhdlkeyword"," ");
- // writeFont("vhdlchar",VhdlDocGen::getIndexWord(vhdlcodeYYtext,1).data());
- // writeFont("vhdlkeyword"," ");
- // writeFont("vhdlkeyword",VhdlDocGen::getIndexWord(vhdlcodeYYtext,2).data());
- // writeFont("vhdlkeyword"," ");
- //QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
- //temp=temp.stripWhiteSpace();
- //temp+=("-");
- //temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,3);
- QCString temp = VhdlDocGen::getIndexWord(vhdlcodeYYtext,3);
- g_CurrARCH = TRUE;
- temp+="::";
- temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
- g_CurrClass=temp;
- VhdlDocGen::deleteAllChars(temp,'\n');
- codifyLines(vhdlcodeYYtext,temp.data(),TRUE);
- //generateClassOrGlobalLink(*g_code,temp.data());
- isPackageBody=FALSE;
- }
-
-
-<Bases>^{B}*("package "){BN}*("body"){BN}*{FUNCNAME} { // found package body
- QCString ss(vhdlcodeYYtext);
- QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,2);
- QCStringList ql=QCStringList::split(temp,ss);
- QCString ll=ql[0];
- codifyLines(ll.data(),g_CurrClass.data());
- temp=temp.stripWhiteSpace();
- temp.prepend("_");
- generateClassOrGlobalLink(*g_code,temp.data());
- g_CurrClass.resize(0);
- g_CurrClass=temp;
- isProto=FALSE;
- isPackageBody=TRUE;
- // BEGIN(ClassesName);
- }
-
-<Bases>{PROCESS} { // found process
- isFuncProto=TRUE;
- g_FuncProto.resize(0);
- g_FuncProto.append(vhdlcodeYYtext);
- g_vhdlKeyDict.clear();
- appStringLower(g_PrevString,vhdlcodeYYtext);
- if (g_PrevString.contains('('))
- {
- g_braceCount=1;
- BEGIN(ParseProcessProto);
- }
- else
- {
- writeProcessProto();
- }
- }
-
-<Bases>("end"){BN}+("process") { // end of process
- isFuncProto=FALSE;
- codifyLines(vhdlcodeYYtext);
- BEGIN(Bases);
- }
-
-
-<Bases>^{B}*("begin "|"begin") {
- isFuncProto=FALSE;
- writeFont("vhdlkeyword",vhdlcodeYYtext);
- }
-
-<Bases>^{B}*("use"|"library"){BN}+ { //found package or library
- writeFont("vhdlkeyword",vhdlcodeYYtext);
- BEGIN(ParsePackage);
- }
-
-
-<Bases>^{B}*("use"){BN}+("configuration")[^\n]* {
- codifyLines(vhdlcodeYYtext);
- }
-
-
-
-<Bases>{FUNC} { // found function|procedure
- g_vhdlKeyDict.clear();
- g_FuncProto.resize(0);
- isProto=FALSE;
- g_FuncProto.append(vhdlcodeYYtext);
- g_braceCount=1;
- BEGIN(ParseType);
- }
-
-
-
-<Bases>^{B}*("entity"|"package"){BN}+ {
- appStringLower(g_PrevString,vhdlcodeYYtext);
- writeFont("keywordflow",vhdlcodeYYtext);
- isPackageBody=FALSE;
- BEGIN(ClassesName);
- }
-
-
-<Bases>"end"{BN}+"architecture"{BN}+{FUNCNAME} {
- codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
- g_CurrARCH = FALSE;
- }
-<Bases>"end"{BN}+{FUNCNAME} {
- if (g_CurrARCH)
- {
- codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
- g_CurrARCH = FALSE;
- }
- else
- REJECT;
- }
-<Bases>"end" {
- appStringLower(g_PrevString,vhdlcodeYYtext);
- QCString temp(vhdlcodeYYtext);
- temp=temp.stripWhiteSpace();
-
- writeColoredWord(temp);
- BEGIN(End);
- }
-<End>{ID} {
- appStringLower(g_PrevString,vhdlcodeYYtext);
- QCString temp(vhdlcodeYYtext);
- temp=temp.stripWhiteSpace();
-
- if (!writeColoredWord(temp))
- {
- generateClassOrGlobalLink(*g_code,temp.data());
- }
- }
-<End>";" {
- codifyLines(vhdlcodeYYtext);
- BEGIN(Bases);
- }
-<Bases>{KEYWORD} { // found keyword
- QCString qcs(vhdlcodeYYtext);
- if (!writeColoredWord(qcs))
- {
- startFontClass("vhdlchar");
- g_code->codify(vhdlcodeYYtext);
- endFontClass();
- }
- }
-
-
-<Bases>{ID} {
- appStringLower(g_PrevString,vhdlcodeYYtext);
- QCString temp(vhdlcodeYYtext);
- temp=temp.stripWhiteSpace();
-
- if (!writeColoredWord(temp))
- {
- startFontClass("vhdlchar");
- generateMemLink(*g_code,g_CurrClass,temp);
- endFontClass();
- }
- }
-
-<Bases,ParseComponent>{DIGITSS} {
- startFontClass("vhdllogic");
- codifyLines(vhdlcodeYYtext);
- endFontClass();
- }
-
-<Bases>^{B}*("use"){BN}+("entity"|"component")[^\n]* {
- codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
- }
-
-
-<Bases>{TYPEKW} {
- codifyLines(vhdlcodeYYtext);
- if (isFuncProto)
- {
- BEGIN(ParseFuncProto);
- }
- else
- {
- BEGIN(Bases);
- }
- }
-
-<Bases>{OPERATOR} {
- startFontClass("vhdlchar");
- g_code->codify(vhdlcodeYYtext);
- endFontClass();
- }
-
-<Bases>","|"."|":"|"'"|"("|")" {
- startFontClass("vhdlchar");
- g_code->codify(vhdlcodeYYtext);
- endFontClass();
- }
-
-<Bases>{STRING} {
- QCString qcs(vhdlcodeYYtext);
- VhdlDocGen::deleteAllChars(qcs,'"');
- VhdlDocGen::deleteAllChars(qcs,' ');
-
- if (VhdlDocGen::isNumber(qcs))
- writeFont("vhdllogic",vhdlcodeYYtext);
- else
- writeFont("keyword",vhdlcodeYYtext);
- }
-
-<Bases>{B}*"#"[^\n]* {
- writeFont("keyword",vhdlcodeYYtext);
- }
-
-<Bases>^{B}*{XILINX}/[^a-zA-Z0-9_] {
- writeWord(yytext);
- //codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
- }
-
-<Bases>^{B}*"set_"[^\n]* {
- writeWord(yytext);
- }
-
-<*>\n {
- codifyLines(vhdlcodeYYtext);
- BEGIN(Bases);
- }
-
-<*>. {
- g_code->codify(vhdlcodeYYtext);
- }
-
-<*>\n{TEXTT} { // found normal or special comment on its own line
- QCString text(vhdlcodeYYtext);
- int i=text.find("--");
- if (text.mid(i,3)=="--!") // && // hide special comment
- {
- if (!Config_getBool(STRIP_CODE_COMMENTS))
- {
- codifyLines(text,0,FALSE,TRUE);
- }
- else g_yyLineNr++; // skip complete line, but count line
- }
- else // normal comment
- {
- codifyLines(text,0,FALSE,TRUE);
- }
- }
-<*>{TEXTT} { // found normal or special comment after something
- QCString text(vhdlcodeYYtext);
- int i=text.find("--");
- if (text.mid(i,3)=="--!")
- {
- // hide special comment
- if (!Config_getBool(STRIP_CODE_COMMENTS))
- {
- codifyLines(text,0,FALSE,TRUE);
- }
- }
- else // normal comment
- {
- codifyLines(text,0,FALSE,TRUE);
- }
- }
-
-%%
+VHDLCodeParser::VHDLCodeParser() : p(std::make_unique<Private>())
+{
+ vhdlcodeYYlex_init_extra(&p->state,&p->yyscanner);
+#ifdef FLEX_DEBUG
+ vhdlcodeYYset_debug(1,p->yyscanner);
+#endif
+ resetCodeParserState();
+}
-/*@ ----------------------------------------------------------------------------
- */
+VHDLCodeParser::~VHDLCodeParser()
+{
+ vhdlcodeYYlex_destroy(p->yyscanner);
+}
-static void resetVhdlCodeParserState()
+void VHDLCodeParser::resetCodeParserState()
{
- g_vhdlKeyDict.setAutoDelete(TRUE);
- g_vhdlKeyDict.clear();
+ p->state.vhdlKeyDict.clear();
}
void VHDLCodeParser::parseCode(CodeOutputInterface &od,
const char *className,
- const QCString &s,
+ const QCString &s,
SrcLangExt,
bool exBlock,
const char *exName,
@@ -1552,97 +1583,87 @@ void VHDLCodeParser::parseCode(CodeOutputInterface &od,
const Definition *searchCtx,
bool /* collectXRefs */)
{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
//printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd);
if (s.isEmpty()) return;
- printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
+ printlex(yy_flex_debug, true, __FILE__, fd ? fd->fileName().data(): NULL);
if (memberDef)
{
const ClassDef *dd=memberDef->getClassDef();
- if (dd) g_CurrClass=dd->name();
+ if (dd) yyextra->currClass=dd->name();
}
- resetVhdlCodeParserState();
- g_code = &od;
- g_inputString = s;
- g_inputPosition = 0;
- g_currentFontClass = 0;
- g_needsTermination = FALSE;
- g_searchCtx = searchCtx;
+ resetCodeParserState();
+ yyextra->code = &od;
+ yyextra->inputString = s;
+ yyextra->inputPosition = 0;
+ yyextra->currentFontClass = 0;
+ yyextra->needsTermination = false;
+ yyextra->searchCtx = searchCtx;
if (startLine!=-1)
- g_yyLineNr = startLine;
+ yyextra->yyLineNr = startLine;
else
- g_yyLineNr = 1;
+ yyextra->yyLineNr = 1;
if (endLine!=-1)
- g_inputLines = endLine+1;
+ yyextra->inputLines = endLine+1;
else
- g_inputLines = g_yyLineNr + countLines() - 1;
+ yyextra->inputLines = yyextra->yyLineNr + countLines(yyscanner) - 1;
- // g_theCallContext.clear();
- g_classScope = className;
- g_exampleBlock = exBlock;
- g_exampleName = exName;
- g_sourceFileDef = fd;
- bool cleanupSourceDef = FALSE;
+ // yyextra->theCallContext.clear();
+ yyextra->exampleBlock = exBlock;
+ yyextra->exampleName = exName;
+ yyextra->sourceFileDef = fd;
+ bool cleanupSourceDef = false;
if (exBlock && fd==0)
{
// create a dummy filedef for the example
- g_sourceFileDef = createFileDef("",exName);
- cleanupSourceDef = TRUE;
+ yyextra->sourceFileDef = createFileDef("",exName);
+ cleanupSourceDef = true;
}
- if (g_sourceFileDef)
+ if (yyextra->sourceFileDef)
{
- setCurrentDoc("l00001");
+ setCurrentDoc(yyscanner,"l00001");
}
- g_currentDefinition = 0;
- g_currentMemberDef = 0;
- g_vhdlMember=0;
- if (!g_exampleName.isEmpty())
+ yyextra->currentDefinition = 0;
+ yyextra->currentMemberDef = 0;
+ yyextra->vhdlMember=0;
+ if (!yyextra->exampleName.isEmpty())
{
- g_exampleFile = convertNameToFile(g_exampleName+"-example");
+ yyextra->exampleFile = convertNameToFile(yyextra->exampleName+"-example");
}
- g_includeCodeFragment = inlineFragment;
- startCodeLine();
- // g_type.resize(0);
- // g_name.resize(0);
- // g_args.resize(0);
- g_parmName.resize(0);
- g_parmType.resize(0);
- if(!g_lexInit)
- VhdlDocGen::init();
- if (memberDef)
+ yyextra->includeCodeFragment = inlineFragment;
+ startCodeLine(yyscanner);
+ if (!yyextra->lexInit)
{
- setParameterList(memberDef);
+ VhdlDocGen::init();
+ yyextra->lexInit=true;
}
- /*int iLine=*/countLines();
- vhdlcodeYYrestart( vhdlcodeYYin );
+ /*int iLine=*/countLines(yyscanner);
+ vhdlcodeYYrestart( 0, yyscanner );
BEGIN( Bases );
- vhdlcodeYYlex();
- g_lexInit=TRUE;
- if (g_needsTermination)
+ vhdlcodeYYlex(yyscanner);
+ if (yyextra->needsTermination)
{
- endCodeLine();
+ endCodeLine(yyscanner);
}
if (cleanupSourceDef)
{
// delete the temporary file definition used for this example
- delete g_sourceFileDef;
- g_sourceFileDef=0;
+ delete yyextra->sourceFileDef;
+ yyextra->sourceFileDef=0;
}
- g_startCode=FALSE;
- printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
-}
+ yyextra->startCode=false;
-void codeFreeVhdlScanner()
-{
-#if defined(YY_FLEX_SUBMINOR_VERSION)
- if (g_lexInit)
- {
- vhdlcodeYYlex_destroy();
- }
-#endif
+ // write the tooltips
+ TooltipManager::instance().writeTooltips(od);
+
+ printlex(yy_flex_debug, false, __FILE__, fd ? fd->fileName().data(): NULL);
}
+#if USE_STATE2STRING
#include "vhdlcode.l.h"
+#endif
diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp
index 4619b7a..7afc832 100644
--- a/src/vhdldocgen.cpp
+++ b/src/vhdldocgen.cpp
@@ -24,10 +24,10 @@
#include <stdlib.h>
#include <assert.h>
#include <string.h>
+#include <map>
#include <qcstring.h>
#include <qfileinfo.h>
#include <qcstringlist.h>
-#include <qmap.h>
/* --------------------------------------------------------------- */
@@ -55,23 +55,18 @@
#include "filename.h"
#include "membergroup.h"
#include "memberdef.h"
+#include "membername.h"
#include "plantuml.h"
#include "vhdljjparser.h"
#include "VhdlParser.h"
-#include "vhdlcode.h"
+//#include "vhdlcode.h"
#include "plantuml.h"
//#define DEBUGFLOW
#define theTranslator_vhdlType theTranslator->trVhdlType
-static QDict<QCString> g_vhdlKeyDict0(17,FALSE);
-static QDict<QCString> g_vhdlKeyDict1(17,FALSE);
-static QDict<QCString> g_vhdlKeyDict2(17,FALSE);
-static QDict<QCString> g_vhdlKeyDict3(17,FALSE);
-
static void initUCF(Entry* root,const char* type,QCString & qcs,int line,QCString & fileName,QCString & brief);
static void writeUCFLink(const MemberDef* mdef,OutputList &ol);
-static void assignBinding(VhdlConfNode* conf);
-static void addInstance(ClassDef* entity, ClassDef* arch, ClassDef *inst,
+static void addInstance(ClassDefMutable* entity, ClassDefMutable* arch, ClassDefMutable *inst,
const std::shared_ptr<Entry> &cur);
//---------- create svg -------------------------------------------------------------
@@ -179,10 +174,8 @@ static void createSVG()
// Brief descriptions for entities are shown too.
void VhdlDocGen::writeOverview()
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
bool found=FALSE;
- for ( ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS )
{
@@ -200,20 +193,20 @@ void VhdlDocGen::writeOverview()
if (!f.open(IO_WriteOnly))
{
- fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data());
+ err("Warning: Cannot open file %s for writing\n",fileName.data());
return;
}
startDot(t);
- for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS )
{
continue;
}
- QList<MemberDef>* port= getPorts(cd);
+ QList<MemberDef>* port= getPorts(cd.get());
if (port==0)
{
continue;
@@ -226,30 +219,23 @@ void VhdlDocGen::writeOverview()
}
startTable(t,cd->name());
- writeClassToDot(t,cd);
+ writeClassToDot(t,cd.get());
writeTable(port,t);
endTable(t);
- // writeVhdlPortToolTip(t,port,cd);
- writeVhdlEntityToolTip(t,cd);
+ writeVhdlEntityToolTip(t,cd.get());
delete port;
- BaseClassList *bl=cd->baseClasses();
- if (bl)
+ for (const auto &bcd : cd->baseClasses())
{
- BaseClassListIterator bcli(*bl);
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
- {
- ClassDef *bClass=bcd->classDef;
- QCString dotn=cd->name()+":";
- dotn+=cd->name();
- QCString csc=bClass->name()+":";
- csc+=bClass->name();
- // fprintf(stderr,"\n <%s| %s>",dotn.data(),csc.data());
- writeVhdlDotLink(t,dotn,csc,0);
- }
- }// if bl
+ ClassDef *bClass=bcd.classDef;
+ QCString dotn=cd->name()+":";
+ dotn+=cd->name();
+ QCString csc=bClass->name()+":";
+ csc+=bClass->name();
+ // fprintf(stderr,"\n <%s| %s>",dotn.data(),csc.data());
+ writeVhdlDotLink(t,dotn,csc,0);
+ }
}// for
endDot(t);
@@ -568,11 +554,8 @@ VhdlDocGen::~VhdlDocGen()
{
}
-void VhdlDocGen::init()
-{
-
// vhdl keywords included VHDL 2008
-const char* g_vhdlKeyWordMap0[] =
+static const std::set< std::string > g_vhdlKeyWordSet0 =
{
"abs","access","after","alias","all","and","architecture","array","assert","assume","assume_guarantee","attribute",
"begin","block","body","buffer","bus",
@@ -593,100 +576,57 @@ const char* g_vhdlKeyWordMap0[] =
"unaffected","units","until","use",
"variable","vmode","vprop","vunit",
"wait","when","while","with",
- "xor","xnor",
- 0
+ "xor","xnor"
};
// type
-const char* g_vhdlKeyWordMap1[] =
+static const std::set< std::string> g_vhdlKeyWordSet1 =
{
"natural","unsigned","signed","string","boolean", "bit","bit_vector","character",
"std_ulogic","std_ulogic_vector","std_logic","std_logic_vector","integer",
- "real","float","ufixed","sfixed","time","positive",0
+ "real","float","ufixed","sfixed","time","positive"
};
// logic
-const char* g_vhdlKeyWordMap2[] =
+static const std::set< std::string > g_vhdlKeyWordSet2 =
{
- "abs","and","or","not","mod", "xor","rem","xnor","ror","rol","sla",
- "sll",0
+ "abs","and","or","not","mod","xor","rem","xnor","ror","rol","sla","sll"
};
// predefined attributes
-const char* g_vhdlKeyWordMap3[] =
+static const std::set< std::string > g_vhdlKeyWordSet3 =
{
-"base","left","right","high","low","ascending",
-"image","value","pos","val","succ","pred","leftof","rightof","left","right","high","low",
-"range","reverse_range","length","ascending","delayed","stable","quiet","transaction","event",
-"active","last_event","last_active","last_value","driving","driving_value","simple_name","instance_name","path_name",0
+ "base","left","right","high","low","ascending",
+ "image","value","pos","val","succ","pred","leftof","rightof","left","right","high","low",
+ "range","reverse_range","length","ascending","delayed","stable","quiet","transaction","event",
+ "active","last_event","last_active","last_value","driving","driving_value","simple_name","instance_name","path_name"
};
- int j=0;
- g_vhdlKeyDict0.setAutoDelete(TRUE);
- g_vhdlKeyDict1.setAutoDelete(TRUE);
- g_vhdlKeyDict2.setAutoDelete(TRUE);
- g_vhdlKeyDict3.setAutoDelete(TRUE);
-
- while (g_vhdlKeyWordMap0[j])
- {
- g_vhdlKeyDict0.insert(g_vhdlKeyWordMap0[j],
- new QCString(g_vhdlKeyWordMap0[j]));
- j++;
- }
-
- j=0;
- while (g_vhdlKeyWordMap1[j])
- {
- g_vhdlKeyDict1.insert(g_vhdlKeyWordMap1[j],
- new QCString(g_vhdlKeyWordMap1[j]));
- j++;
- }
-
- j=0;
- while (g_vhdlKeyWordMap2[j])
- {
- g_vhdlKeyDict2.insert(g_vhdlKeyWordMap2[j],
- new QCString(g_vhdlKeyWordMap2[j]));
- j++;
- }
-
- j=0;
- while (g_vhdlKeyWordMap3[j])
- {
- g_vhdlKeyDict3.insert(g_vhdlKeyWordMap3[j],
- new QCString(g_vhdlKeyWordMap3[j]));
- j++;
- }
-
-}// buildKeyMap
+void VhdlDocGen::init()
+{
+}
/*!
* returns the color of a keyword
*/
-
-QCString* VhdlDocGen::findKeyWord(const QCString& tmp)
+const char* VhdlDocGen::findKeyWord(const QCString& kw)
{
- static QCString vhdlkeyword("vhdlkeyword");
- static QCString vhdltype("keywordtype");
- static QCString vhdllogic("vhdllogic");
- static QCString preprocessor("keywordflow");
+ std::string word=kw.lower().str();
- QCString word=tmp.lower();
+ if (word.empty()) return 0;
- if (word.isEmpty() || word.at(0)=='\0') return 0;
+ if (g_vhdlKeyWordSet0.find(word)!=g_vhdlKeyWordSet0.end())
+ return "keywordflow";
- if (g_vhdlKeyDict0.find(word))
- return &preprocessor;
+ if (g_vhdlKeyWordSet1.find(word)!=g_vhdlKeyWordSet1.end())
+ return "keywordtype";
- if (g_vhdlKeyDict1.find(word))
- return &vhdltype;
+ if (g_vhdlKeyWordSet2.find(word)!=g_vhdlKeyWordSet2.end())
+ return "vhdllogic";
- if (g_vhdlKeyDict2.find(word))
- return &vhdllogic;
-
- if (g_vhdlKeyDict3.find(word))
- return &vhdlkeyword;
+ if (g_vhdlKeyWordSet3.find(word)!=g_vhdlKeyWordSet3.end())
+ return "vhdlkeyword";
return 0;
}
@@ -694,26 +634,17 @@ QCString* VhdlDocGen::findKeyWord(const QCString& tmp)
ClassDef *VhdlDocGen::getClass(const char *name)
{
if (name==0 || name[0]=='\0') return 0;
-
- ClassDef *cd=0;
- QCString temp(name);
- //temp=temp.lower();
- temp=temp.stripWhiteSpace();
- cd= Doxygen::classSDict->find(temp.data());
- return cd;
+ return Doxygen::classLinkedMap->find(QCString(name).stripWhiteSpace());
}
ClassDef* VhdlDocGen::getPackageName(const QCString & name)
{
- ClassDef* cd=0;
- cd=getClass(name);
-
- return cd;
+ return getClass(name);
}
-static QMap<QCString,MemberDef*> varMap;
-static QList<ClassDef> qli;
-static QMap<ClassDef*,QList<ClassDef> > packages;
+static std::map<std::string,MemberDef*> g_varMap;
+static std::vector<ClassDef*> g_classList;
+static std::map<ClassDef*,std::vector<ClassDef*> > g_packages;
MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& memName)
{
@@ -768,42 +699,41 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem
Definition *d = cd->getOuterScope();
QCString tt=d->name();
- ClassDef *ecd =getClass(tt);
- if (!ecd)
+ ClassDef *acd =getClass(tt);
+ if (!acd)
{
tt=tt.upper();
- ecd =getClass(tt);
+ acd =getClass(tt);
}
- if (!ecd)
+ if (!acd)
{
tt=tt.lower();
- ecd =getClass(tt);
+ acd =getClass(tt);
}
- if (ecd) //d && d->definitionType()==Definition::TypeClass)
+ if (acd) //d && d->definitionType()==Definition::TypeClass)
{
- if(!packages.contains(ecd))
+ if(g_packages.find(acd)==g_packages.end())
{
- VhdlDocGen::findAllPackages(ecd);
+ VhdlDocGen::findAllPackages(acd);
}
}
}
else
{
ecd=cd;
- if (!packages.contains(ecd)) VhdlDocGen::findAllPackages(ecd);
+ if (g_packages.find(ecd)==g_packages.end()) VhdlDocGen::findAllPackages(ecd);
}
if (ecd)
{
- QMap<ClassDef*,QList<ClassDef> >::Iterator cList=packages.find(ecd);
- if (cList!=packages.end())
+ auto cList_it = g_packages.find(ecd);
+ if (cList_it!=g_packages.end())
{
- QList<ClassDef> mlist=cList.data();
- for (uint j=0;j<mlist.count();j++)
+ for (const auto &cdp : cList_it->second)
{
- mdef=VhdlDocGen::findMemberDef(mlist.at(j),memName,MemberListType_variableMembers);
+ mdef=VhdlDocGen::findMemberDef(cdp,memName,MemberListType_variableMembers);
if (mdef) return mdef;
- mdef=VhdlDocGen::findMemberDef(mlist.at(j),memName,MemberListType_pubMethods);
+ mdef=VhdlDocGen::findMemberDef(cdp,memName,MemberListType_pubMethods);
if (mdef) return mdef;
}
}
@@ -823,21 +753,21 @@ MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList
QCString keyType=cd->symbolName()+"@"+key;
//printf("\n %s | %s | %s",cd->symbolName().data(),key.data(,),keyType.data());
- QMap<QCString, MemberDef*>::Iterator it =varMap.find(keyType);
- if (it.key())
+ auto it = g_varMap.find(keyType.str());
+ if (it!=g_varMap.end())
{
- md=it.data();
+ md=it->second;
if (md)
{
return md;
}
}
- if (qli.contains(cd))
+ if (std::find(g_classList.begin(),g_classList.end(),cd)!=g_classList.end())
{
return 0;
}
ml=cd->getMemberList(type);
- qli.append(cd);
+ g_classList.push_back(cd);
if (!ml)
{
return 0;
@@ -849,16 +779,15 @@ MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList
for (fmni.toFirst();(md=fmni.current());++fmni)
{
QCString tkey=cd->symbolName()+"@"+md->name();
- if (varMap.contains(tkey))
+ if (g_varMap.find(tkey.str())==g_varMap.end())
{
- continue;
+ g_varMap.insert({tkey.str(),md});
}
- varMap.insert(tkey.data(),md);
}
- it=varMap.find(keyType.data());
- if (it.key())
+ it=g_varMap.find(keyType.str());
+ if (it!=g_varMap.end())
{
- md=it.data();
+ md=it->second;
if (md)
{
return md;
@@ -873,8 +802,8 @@ MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList
void VhdlDocGen::findAllPackages( ClassDef *cdef)
{
- QList<ClassDef> cList;
- if (packages.contains(cdef)) return;
+ if (g_packages.find(cdef)!=g_packages.end()) return;
+ std::vector<ClassDef*> cList;
MemberList *mem=cdef->getMemberList(MemberListType_variableMembers);
MemberDef *md;
@@ -888,9 +817,9 @@ void VhdlDocGen::findAllPackages( ClassDef *cdef)
ClassDef* cd=VhdlDocGen::getPackageName(md->name());
if (cd)
{
- cList.append(cd);
+ cList.push_back(cd);
VhdlDocGen::findAllPackages(cd);
- packages.insert(cdef,cList);
+ g_packages.insert({cdef,cList});
}
}
}//for
@@ -1040,12 +969,10 @@ void VhdlDocGen::writeInlineClassLink(const ClassDef* cd ,OutputList& ol)
*/
void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd)
{
- ClassDef *citer;
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- for ( ; (citer=cli.current()) ; ++cli )
+ for (const auto &citer : *Doxygen::classLinkedMap)
{
QCString jj=citer->className();
- if (cd != citer && jj.contains('-')!=-1)
+ if (cd != citer.get() && jj.contains('-')!=-1)
{
QCStringList ql=QCStringList::split("-",jj);
QCString temp=ql[1];
@@ -1058,13 +985,10 @@ void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd)
}// for
}//findAllArchitectures
-ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd)
+const ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd)
{
- ClassDef *citer;
QCString nn=cd->name();
- ClassSDict::Iterator cli(*Doxygen::classSDict);
-
- for ( ; (citer=cli.current()) ; ++cli )
+ for (const auto &citer : *Doxygen::classLinkedMap)
{
QCString jj=citer->name();
QCStringList ql=QCStringList::split(":",jj);
@@ -1072,7 +996,7 @@ ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd)
{
if (ql[0]==nn )
{
- return citer;
+ return citer.get();
}
}
}
@@ -1154,7 +1078,6 @@ void VhdlDocGen::parseFuncProto(const char* text,QCString& name,QCString& ret,bo
}
else
{
- QCString s1(text);
s1=s1.stripWhiteSpace();
int i=s1.find("(",0,FALSE);
int s=s1.find(QRegExp("[ \\t]"));
@@ -1274,7 +1197,6 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
QRegExp reg("[\\[\\]\\.\\/\\:\\<\\>\\:\\s\\,\\;\\'\\+\\-\\*\\|\\&\\=\\(\\)\"]");
QCString qcs = s;
qcs+=QCString(" ");// parsing the last sign
- QCString *ss;
QCString find=qcs;
QCString temp=qcs;
char buf[2];
@@ -1291,7 +1213,7 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
{
find=find.left(j);
buf[0]=temp[j];
- ss=VhdlDocGen::findKeyWord(find);
+ const char *ss=VhdlDocGen::findKeyWord(find);
bool k=isNumber(find); // is this a number
if (k)
{
@@ -1301,7 +1223,7 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
}
else if (j != 0 && ss)
{
- startFonts(find,ss->data(),ol);
+ startFonts(find,ss,ol);
}
else
{
@@ -1421,7 +1343,7 @@ void VhdlDocGen::formatString(const QCString &s, OutputList& ol,const MemberDef*
void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList &al,const MemberDef* mdef)
{
bool sem=FALSE;
- int len=al.size();
+ size_t len=al.size();
ol.docify("( ");
if (len > 2)
{
@@ -1437,11 +1359,11 @@ void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList &al,const
nn+=": ";
QCString defval = arg.defval;
- QCString *str=VhdlDocGen::findKeyWord(defval);
+ const char *str=VhdlDocGen::findKeyWord(defval);
defval+=" ";
if (str)
{
- startFonts(defval,str->data(),ol);
+ startFonts(defval,str,ol);
}
else
{
@@ -1477,7 +1399,7 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList &al,const
{
if (!al.hasParameters()) return;
bool sem=FALSE;
- int len=al.size();
+ size_t len=al.size();
ol.startBold();
ol.docify(" ( ");
ol.endBold();
@@ -1502,7 +1424,7 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList &al,const
}
if (!att.isEmpty())
{
- QCString *str=VhdlDocGen::findKeyWord(att);
+ const char *str=VhdlDocGen::findKeyWord(att);
att+=" ";
if (str)
VhdlDocGen::formatString(att,ol,mdef);
@@ -1516,7 +1438,7 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList &al,const
QCString w=ss.stripWhiteSpace();//.upper();
startFonts(nn,"vhdlchar",ol);
startFonts("in ","stringliteral",ol);
- QCString *str=VhdlDocGen::findKeyWord(ss);
+ const char *str=VhdlDocGen::findKeyWord(ss);
if (str)
VhdlDocGen::formatString(w,ol,mdef);
else
@@ -1586,7 +1508,7 @@ bool VhdlDocGen::writeFuncProcDocu(
//bool sem=FALSE;
ol.enableAll();
- int index=al.size();
+ size_t index=al.size();
if (index==0)
{
ol.docify(" ( ) ");
@@ -1719,7 +1641,7 @@ void VhdlDocGen::writeVhdlDeclarations(const MemberList* ml,
}
-void VhdlDocGen::correctMemberProperties(MemberDef *md)
+void VhdlDocGen::correctMemberProperties(MemberDefMutable *md)
{
if (qstrcmp(md->argsString(),"package")==0)
{
@@ -1769,7 +1691,7 @@ void VhdlDocGen::correctMemberProperties(MemberDef *md)
/* writes a vhdl type documentation */
bool VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definition *d, OutputList &ol)
{
- const ClassDef *cd=dynamic_cast<const ClassDef*>(d);
+ const ClassDef *cd=toClassDef(d);
bool hasParams = FALSE;
if (cd==0) return hasParams;
@@ -1851,7 +1773,7 @@ bool VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definit
return hasParams;
}
-void VhdlDocGen::writeTagFile(MemberDef *mdef,FTextStream &tagFile)
+void VhdlDocGen::writeTagFile(MemberDefMutable *mdef,FTextStream &tagFile)
{
tagFile << " <member kind=\"";
if (VhdlDocGen::isGeneric(mdef)) tagFile << "generic";
@@ -1879,7 +1801,7 @@ void VhdlDocGen::writeTagFile(MemberDef *mdef,FTextStream &tagFile)
tagFile << "\">" << endl;
tagFile << " <type>" << convertToXML(mdef->typeString()) << "</type>" << endl;
tagFile << " <name>" << convertToXML(mdef->name()) << "</name>" << endl;
- tagFile << " <anchorfile>" << convertToXML(mdef->getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
+ tagFile << " <anchorfile>" << convertToXML(mdef->getOutputFileBase()) << Doxygen::htmlFileExtension << "</anchorfile>" << endl;
tagFile << " <anchor>" << convertToXML(mdef->anchor()) << "</anchor>" << endl;
if (VhdlDocGen::isVhdlFunction(mdef))
@@ -1895,7 +1817,7 @@ void VhdlDocGen::writeTagFile(MemberDef *mdef,FTextStream &tagFile)
/* writes a vhdl type declaration */
-void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol,
+void VhdlDocGen::writeVHDLDeclaration(const MemberDefMutable* mdef,OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
bool /*inGroup*/)
{
@@ -1956,9 +1878,10 @@ void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol,
}
// *** write type
/*VHDL CHANGE */
- bool bRec,bUnit;
+
QCString ltype(mdef->typeString());
QCString largs(mdef->argsString());
+
ClassDef *kl=0;
const ArgumentList &al = mdef->argumentList();
QCString nn;
@@ -2014,7 +1937,7 @@ void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol,
ol.insertMemberAlign();
if (largs=="context")
{
- VhdlDocGen::writeRecorUnit(ltype,ol,mdef);
+ VhdlDocGen::writeRecordUnit(ltype,largs,ol,mdef);
}
break;
@@ -2079,7 +2002,6 @@ void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol,
ol.insertMemberAlign();
ol.docify(" ");
-
ol.startBold();
ol.docify(ltype);
ol.endBold();
@@ -2128,6 +2050,7 @@ void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol,
case VhdlDocGen::SHAREDVARIABLE:
case VhdlDocGen::VFILE:
case VhdlDocGen::GROUP:
+ case VhdlDocGen::TYPE:
writeLink(mdef,ol);
ol.docify(" ");
ol.insertMemberAlign();
@@ -2135,32 +2058,7 @@ void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol,
break;
case VhdlDocGen::RECORD:
case VhdlDocGen::UNITS:
- writeLink(mdef,ol);
- ol.docify(" ");
- ol.startBold();
- if (ltype.isEmpty()) {
- ol.docify(" ");
- }
- ol.insertMemberAlign();
- if (!ltype.isEmpty())
- VhdlDocGen::formatString(ltype,ol,mdef);
- ol.endBold();
- break;
- case VhdlDocGen::TYPE:
- bRec=largs.stripPrefix("record") ;
- bUnit=largs.stripPrefix("units") ;
- ol.startBold();
- if (bRec) ol.docify("record: ");
- if (bUnit) ol.docify("units: ");
- writeLink(mdef,ol);
- ol.insertMemberAlign();
- if (!bRec && !bUnit) VhdlDocGen::formatString(ltype,ol,mdef);
- if (bUnit) ol.lineBreak();
- if (bRec || bUnit)
- {
- writeRecorUnit(largs,ol,mdef);
- }
- ol.endBold();
+ writeRecordUnit(largs,ltype,ol,mdef);
break;
default: break;
@@ -2191,8 +2089,9 @@ void VhdlDocGen::writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol,
QCString s=mdef->briefDescription();
ol.startMemberDescription(mdef->anchor(), NULL, mm == VhdlDocGen::PORT);
ol.generateDoc(mdef->briefFile(),mdef->briefLine(),
- mdef->getOuterScope()?mdef->getOuterScope():d,
- mdef,s.data(),TRUE,FALSE,0,TRUE,FALSE);
+ mdef->getOuterScope()?mdef->getOuterScope():d,
+ mdef,s.data(),TRUE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
if (detailsVisible)
{
ol.pushGeneratorState();
@@ -2224,32 +2123,34 @@ void VhdlDocGen::writePlainVHDLDeclarations(
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,int specifier)
{
- SDict<QCString> pack(1009);
- pack.setAutoDelete(TRUE);
+ StringSet pack;
bool first=TRUE;
- MemberDef *md;
+ MemberDef *imd;
MemberListIterator mli(*mlist);
- for ( ; (md=mli.current()); ++mli )
+ for ( ; (imd=mli.current()); ++mli )
{
- int mems=md->getMemberSpecifiers();
- if (md->isBriefSectionVisible() && (mems==specifier) && (mems!=VhdlDocGen::LIBRARY) )
- {
- if (first) { ol.startMemberList();first=FALSE; }
- VhdlDocGen::writeVHDLDeclaration(md,ol,cd,nd,fd,gd,FALSE);
- } //if
- else if (md->isBriefSectionVisible() && (mems==specifier))
+ MemberDefMutable *md = toMemberDefMutable(imd);
+ if (md)
{
- if (!pack.find(md->name().data()))
+ int mems=md->getMemberSpecifiers();
+ if (md->isBriefSectionVisible() && (mems==specifier) && (mems!=VhdlDocGen::LIBRARY) )
{
- if (first) ol.startMemberList(),first=FALSE;
+ if (first) { ol.startMemberList();first=FALSE; }
VhdlDocGen::writeVHDLDeclaration(md,ol,cd,nd,fd,gd,FALSE);
- pack.append(md->name().data(),new QCString(md->name().data()));
- }
+ } //if
+ else if (md->isBriefSectionVisible() && (mems==specifier))
+ {
+ if (pack.find(md->name().str())==pack.end())
+ {
+ if (first) ol.startMemberList(),first=FALSE;
+ VhdlDocGen::writeVHDLDeclaration(md,ol,cd,nd,fd,gd,FALSE);
+ pack.insert(md->name().str());
+ }
+ } //if
} //if
} //for
if (!first) ol.endMemberList();
- pack.clear();
}//plainDeclaration
static bool membersHaveSpecificType(const MemberList *ml,uint64 type)
@@ -2264,17 +2165,11 @@ static bool membersHaveSpecificType(const MemberList *ml,uint64 type)
return TRUE;
}
}
- if (ml->getMemberGroupList())
+ for (const auto &mg : ml->getMemberGroupList())
{
- MemberGroupListIterator mgli(*ml->getMemberGroupList());
- MemberGroup *mg;
- while ((mg=mgli.current()))
+ if (mg->members())
{
- if (mg->members())
- {
- if (membersHaveSpecificType(mg->members(),type)) return TRUE;
- }
- ++mgli;
+ if (membersHaveSpecificType(mg->members(),type)) return TRUE;
}
}
return FALSE;
@@ -2296,41 +2191,37 @@ void VhdlDocGen::writeVHDLDeclarations(const MemberList* ml,OutputList &ol,
if (subtitle && subtitle[0]!=0)
{
ol.startMemberSubtitle();
- ol.generateDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE,
+ 0,TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
ol.endMemberSubtitle();
} //printf("memberGroupList=%p\n",memberGroupList);
VhdlDocGen::writePlainVHDLDeclarations(ml,ol,cd,nd,fd,gd,type);
- if (ml->getMemberGroupList())
+ for (const auto &mg : ml->getMemberGroupList())
{
- MemberGroupListIterator mgli(*ml->getMemberGroupList());
- MemberGroup *mg;
- while ((mg=mgli.current()))
+ if (membersHaveSpecificType(mg->members(),type))
{
- if (membersHaveSpecificType(mg->members(),type))
+ //printf("mg->header=%s\n",mg->header().data());
+ bool hasHeader=mg->header()!="[NOHEADER]";
+ ol.startMemberGroupHeader(hasHeader);
+ if (hasHeader)
{
- //printf("mg->header=%s\n",mg->header().data());
- bool hasHeader=mg->header()!="[NOHEADER]";
- ol.startMemberGroupHeader(hasHeader);
- if (hasHeader)
- {
- ol.parseText(mg->header());
- }
- ol.endMemberGroupHeader();
- if (!mg->documentation().isEmpty())
- {
- //printf("Member group has docs!\n");
- ol.startMemberGroupDocs();
- ol.generateDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE);
- ol.endMemberGroupDocs();
- }
- ol.startMemberGroup();
- //printf("--- mg->writePlainDeclarations ---\n");
- VhdlDocGen::writePlainVHDLDeclarations(mg->members(),ol,cd,nd,fd,gd,type);
- ol.endMemberGroup(hasHeader);
+ ol.parseText(mg->header());
}
- ++mgli;
+ ol.endMemberGroupHeader();
+ if (!mg->documentation().isEmpty())
+ {
+ //printf("Member group has docs!\n");
+ ol.startMemberGroupDocs();
+ ol.generateDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
+ ol.endMemberGroupDocs();
+ }
+ ol.startMemberGroup();
+ //printf("--- mg->writePlainDeclarations ---\n");
+ VhdlDocGen::writePlainVHDLDeclarations(mg->members(),ol,cd,nd,fd,gd,type);
+ ol.endMemberGroup(hasHeader);
}
}
}// writeVHDLDeclarations
@@ -2377,9 +2268,9 @@ void VhdlDocGen::writeStringLink(const MemberDef *mdef,QCString mem, OutputList&
-void VhdlDocGen::writeSource(const MemberDef *mdef,OutputList& ol,const QCString & cname)
+void VhdlDocGen::writeSource(const MemberDefMutable *mdef,OutputList& ol,const QCString & cname)
{
- CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(".vhd");
+ auto intf = Doxygen::parserManager->getCodeParser(".vhd");
// pIntf->resetCodeParserState();
QCString codeFragment=mdef->documentation();
@@ -2404,8 +2295,8 @@ void VhdlDocGen::writeSource(const MemberDef *mdef,OutputList& ol,const QCString
codeFragment.prepend("\n");
ol.pushGeneratorState();
- ol.startCodeFragment();
- intf.parseCode( ol, // codeOutIntf
+ ol.startCodeFragment("DoxyCode");
+ intf->parseCode( ol, // codeOutIntf
0, // scope
codeFragment, // input
SrcLangExt_VHDL, // lang
@@ -2419,7 +2310,7 @@ void VhdlDocGen::writeSource(const MemberDef *mdef,OutputList& ol,const QCString
TRUE // show line numbers
);
- ol.endCodeFragment();
+ ol.endCodeFragment("DoxyCode");
ol.popGeneratorState();
if (cname.isEmpty()) return;
@@ -2479,10 +2370,10 @@ void VhdlDocGen::parseUCF(const char* input, Entry* entity,QCString fileName,b
{
if (altera)
{
- int i=temp.find("-name");
- if (i>0)
+ int in=temp.find("-name");
+ if (in>0)
{
- temp=temp.remove(0,i+5);
+ temp=temp.remove(0,in+5);
}
temp.stripPrefix("set_location_assignment");
@@ -2492,8 +2383,8 @@ void VhdlDocGen::parseUCF(const char* input, Entry* entity,QCString fileName,b
else
{
QRegExp ee("[\\s=]");
- int i=temp.find(ee);
- QCString ff=temp.left(i);
+ int in=temp.find(ee);
+ QCString ff=temp.left(in);
temp.stripPrefix(ff.data());
ff.append("#");
if (!temp.isEmpty())
@@ -2593,44 +2484,8 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol)
VhdlDocGen::formatString(largs,ol,mdef);
}
-bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
-{
- FileName *fn=Doxygen::inputNameList->getFirst();
- //LayoutNavEntry *cc = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files);
- uint count=Doxygen::inputNameList->count();
- LayoutNavEntry *kk = lne->parent();// find(LayoutNavEntry::Files);
- // LayoutNavEntry *kks = kk->parent();// find(LayoutNavEntry::Files);
- QCString file;
- QCString co("Constraints");
-
- QCString imgExt = getDotImageExtension();
- if (Config_getBool(HAVE_DOT) && imgExt=="svg")
- {
- QCString ov = theTranslator->trDesignOverview();
- QCString ofile("vhdl_design_overview");
- LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,"");
- kk->addChild(oo);
- }
-
- uint i=0;
- while (i<count)
- {
- FileDef *fd=fn->at(i);
- if (fd->name().contains(".ucf") || fd->name().contains(".qsf"))
- {
- file = convertNameToFile(fd->name().data(),FALSE,FALSE);
- LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,"");
- kk->addChild(ucf);
- break;
- }
- i++;
- }
- return FALSE;
-}
-
-
// for cell_inst : [entity] work.proto [ (label|expr) ]
-QCString VhdlDocGen::parseForConfig(QCString & entity,QCString & arch)
+QCString VhdlDocGen::parseForConfig(QCString & entity,QCString & arch)
{
int index;
QCString label;
@@ -2691,128 +2546,20 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch)
- // find class with upper/lower letters
- ClassDef* VhdlDocGen::findVhdlClass(const char *className )
+// find class with upper/lower letters
+ClassDef* VhdlDocGen::findVhdlClass(const char *className )
+{
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
-
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
- {
- if (qstricmp(className,cd->name().data())==0)
- {
- return cd;
- }
- }
- return 0;
+ if (qstricmp(className,cd->name().data())==0)
+ {
+ return cd.get();
+ }
}
+ return 0;
+}
-//@param arch bit0:flipflop
-//@param binding e.g entity work.foo(bar)
-//@param label |label0|label1
-// label0:architecture name
-//@param confVhdl of configuration file (identifier::entity_name) or
-// the architecture if isInlineConf TRUE
-//@param isInlineConf
-//@param confN List of configurations
-
-void assignBinding(VhdlConfNode * conf)
-{
- ClassDef *archClass=0,*entClass=0;
- QCString archName;
- QCString arcBind,entBind;
-
- bool others,all;
- entBind=conf->binding;
- QCString conf2=VhdlDocGen::parseForBinding(entBind,arcBind);
-
- if (conf2!="configuration")
- {
- QCString a,c,e;
- if (conf->isInlineConf)
- {
- c=conf->confVhdl;
- e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),0);
- }
- else
- {
- a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0);
- e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1);
- c=e+"::"+a;
- }
- archClass= VhdlDocGen::findVhdlClass(c.data());//Doxygen::classSDict->find(a.data());
- entClass= VhdlDocGen::findVhdlClass(e.data()); //Doxygen::classSDict->find(e.data());
- }
-
- QCString label=conf->compSpec.lower();
- //label.prepend("|");
-
- if (!archClass)
- {
- // err("architecture %s not found ! ",conf->confVhdl.data());
- return;
- }
-
- archName=archClass->name();
- QCString allOt=VhdlDocGen::getIndexWord(conf->arch.data(),0);
- all=allOt.lower()=="all" ;
- others= allOt.lower()=="others";
-
- for (const auto &cur : getVhdlInstList())
- {
- if (cur->exception.lower()==label || conf->isInlineConf)
- {
- QCString archy;
-
- if (all || others)
- {
- archy=VhdlDocGen::getIndexWord(conf->arch.data(),1);
- }
- else
- {
- archy=conf->arch;
- }
-
- QCString inst1=VhdlDocGen::getIndexWord(archy.data(),0).lower();
- QCString comp=VhdlDocGen::getIndexWord(archy.data(),1).lower();
-
- QCStringList ql=QCStringList::split(",",inst1);
-
- for (uint j=0;j<ql.count();j++)
- {
- QCString archy1,sign1;
- if (all || others)
- {
- archy1=VhdlDocGen::getIndexWord(conf->arch.data(),1);
- sign1=cur->type;
- }
- else
- {
- archy1=comp+":"+ql[j];
- sign1=cur->type+":"+cur->name;
- }
-
- if (archy1==sign1.lower() && !cur->stat)
- {
- // fprintf(stderr," \n label [%s] [%s] [%s]",cur->exception.data(),cur->type.data(),cur->name.data());
- ClassDef *ent= VhdlDocGen::findVhdlClass(entBind.data());//Doxygen::classSDict->find(entBind.data());
-
- if (entClass==0 || ent==0)
- {
- continue;
- }
-
- addInstance(ent,archClass,entClass,cur);
- cur->stat=TRUE;
- break;
- }
- }// for
- }
- }//for each element in instList
-
-}//assignBinding
-
/*
// file foo.vhd
@@ -2848,10 +2595,10 @@ void VhdlDocGen::computeVhdlComponentRelations()
entity=cur->type;
}
- ClassDef *classEntity= VhdlDocGen::findVhdlClass(entity.data());//Doxygen::classSDict->find(entity);
+ ClassDefMutable *classEntity= toClassDefMutable(VhdlDocGen::findVhdlClass(entity.data()));
inst=VhdlDocGen::getIndexWord(cur->args.data(),0);
- ClassDef *cd=Doxygen::classSDict->find(inst);
- ClassDef *ar=Doxygen::classSDict->find(cur->args);
+ ClassDefMutable *cd=toClassDefMutable(Doxygen::classLinkedMap->find(inst));
+ ClassDefMutable *ar=toClassDefMutable(Doxygen::classLinkedMap->find(cur->args));
if (cd==0)
{
@@ -2866,8 +2613,8 @@ void VhdlDocGen::computeVhdlComponentRelations()
}
-static void addInstance(ClassDef* classEntity, ClassDef* ar,
- ClassDef *cd , const std::shared_ptr<Entry> &cur)
+static void addInstance(ClassDefMutable* classEntity, ClassDefMutable* ar,
+ ClassDefMutable *cd , const std::shared_ptr<Entry> &cur)
{
QCString bName,n1;
@@ -2903,14 +2650,14 @@ static void addInstance(ClassDef* classEntity, ClassDef* ar,
ferr:
QCString uu=cur->name;
- MemberDef *md=createMemberDef(
+ std::unique_ptr<MemberDefMutable> md { createMemberDef(
ar->getDefFileName(), cur->startLine,cur->startColumn,
n1,uu,uu, 0,
Public, Normal, cur->stat,Member,
MemberType_Variable,
ArgumentList(),
ArgumentList(),
- "");
+ "") };
if (ar->getOutputFileBase())
{
@@ -2926,37 +2673,41 @@ ferr:
md->setLanguage(SrcLangExt_VHDL);
md->setMemberSpecifiers(VhdlDocGen::INSTANTIATION);
md->setBriefDescription(cur->brief,cur->briefFile,cur->briefLine);
- md->setBodySegment(cur->startLine,-1) ;
+ md->setBodySegment(cur->startLine,cur->startLine,-1) ;
md->setDocumentation(cur->doc.data(),cur->docFile.data(),cur->docLine);
FileDef *fd=ar->getFileDef();
md->setBodyDef(fd);
-
-
- QCString info="Info: Elaborating entity "+n1;
- fd=ar->getFileDef();
- info+=" for hierarchy ";
- QRegExp epr("[|]");
- QCString label=cur->type+":"+cur->write+":"+cur->name;
- label.replace(epr,":");
- info+=label;
- fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data());
-
-
- ar->insertMember(md);
+ //QCString info="Info: Elaborating entity "+n1;
+ //fd=ar->getFileDef();
+ //info+=" for hierarchy ";
+ //QRegExp epr("[|]");
+ //QCString label=cur->type+":"+cur->write+":"+cur->name;
+ //label.replace(epr,":");
+ //info+=label;
+ //fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data());
+ ar->insertMember(md.get());
+ MemberName *mn = Doxygen::functionNameLinkedMap->add(uu);
+ mn->push_back(std::move(md));
}
-void VhdlDocGen::writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef)
+void VhdlDocGen::writeRecordUnit(QCString & largs,QCString & ltype,OutputList& ol ,const MemberDefMutable *mdef)
{
- QCStringList ql=QCStringList::split("#",largs,FALSE);
- uint len=ql.count();
- for(uint i=0;i<len;i++)
+ int i=mdef->name().find('~');
+ if (i>0)
{
- QCString n=ql[i];
- VhdlDocGen::formatString(n,ol,mdef);
- if ((len-i)>1) ol.lineBreak();
+ //sets the real record member name
+ const_cast<MemberDefMutable*>(mdef)->setName(mdef->name().left(i).data());
}
+
+ writeLink(mdef,ol);
+ ol.startBold();
+ ol.insertMemberAlign();
+ if (!ltype.isEmpty()){
+ VhdlDocGen::formatString(ltype,ol,mdef);
+ }
+ ol.endBold();
}
@@ -3005,24 +2756,20 @@ bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int
return FALSE;
}
- if (cd->subClasses())
+ for (const auto &bcd :cd->subClasses())
{
- BaseClassListIterator bcli(*cd->subClasses());
- for ( ; bcli.current() && !found ; ++bcli)
+ const ClassDef *ccd=bcd.classDef;
+ if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
+ //printf("isSubClass() subclass %s\n",ccd->name().data());
+ if (ccd==scd)
{
- const ClassDef *ccd=bcli.current()->classDef;
- if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
- //printf("isSubClass() subclass %s\n",ccd->name().data());
- if (ccd==scd)
- {
- found=TRUE;
- }
- else
+ found=TRUE;
+ }
+ else
+ {
+ if (level <256)
{
- if (level <256)
- {
- found=ccd->isBaseClass(scd,followInstances,level+1);
- }
+ found=ccd->isBaseClass(scd,followInstances,level+1);
}
}
}
@@ -3031,35 +2778,33 @@ bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int
void VhdlDocGen::addBaseClass(ClassDef* cd,ClassDef *ent)
{
- if (cd->baseClasses())
+ BaseClassList bcl = cd->baseClasses();
+ for (auto &bcd : bcl)
{
- BaseClassListIterator bcli(*cd->baseClasses());
- for ( ; bcli.current() ; ++bcli)
+ ClassDef *ccd = bcd.classDef;
+ if (ccd==ent)
{
- ClassDef *ccd=bcli.current()->classDef;
- if (ccd==ent)
+ QCString n = bcd.usedName;
+ int i = n.find('(');
+ if(i<0)
{
- QCString n = bcli.current()->usedName;
- int i = n.find('(');
- if(i<0)
- {
- bcli.current()->usedName.append("(2)");
- return;
- }
- static QRegExp reg("[0-9]+");
- QCString s=n.left(i);
- QCString r=n.right(n.length()-i);
- QCString t=r;
- VhdlDocGen::deleteAllChars(r,')');
- VhdlDocGen::deleteAllChars(r,'(');
- r.setNum(r.toInt()+1);
- t.replace(reg,r.data());
- s.append(t.data());
- bcli.current()->usedName=s;
- bcli.current()->templSpecifiers=t;
+ bcd.usedName.append("(2)");
+ return;
}
+ static QRegExp reg("[0-9]+");
+ QCString s=n.left(i);
+ QCString r=n.right(n.length()-i);
+ QCString t=r;
+ VhdlDocGen::deleteAllChars(r,')');
+ VhdlDocGen::deleteAllChars(r,'(');
+ r.setNum(r.toInt()+1);
+ t.replace(reg,r.data());
+ s.append(t.data());
+ bcd.usedName=s;
+ bcd.templSpecifiers=t;
}
}
+ cd->updateBaseClasses(bcl);
}
@@ -3101,20 +2846,18 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef)
bool b=readCodeFragment( fd->absFilePath().data(), actualStart,actualEnd,codeFragment);
if (!b) return;
- VHDLOutlineParser &intf =dynamic_cast<VHDLOutlineParser&>(Doxygen::parserManager->getOutlineParser(".vhd"));
+ auto parser { Doxygen::parserManager->getOutlineParser(".vhd") };
VhdlDocGen::setFlowMember(mdef);
std::shared_ptr<Entry> root = std::make_shared<Entry>();
- QStrList filesInSameTu;
- intf.startTranslationUnit("");
- intf.parseInput("",codeFragment.data(),root,FALSE,filesInSameTu);
- intf.finishTranslationUnit();
+ StringVector filesInSameTu;
+ parser->parseInput("",codeFragment.data(),root,nullptr);
}
void VhdlDocGen::resetCodeVhdlParserState()
{
- varMap.clear();
- qli.clear();
- packages.clear();
+ g_varMap.clear();
+ g_classList.clear();
+ g_packages.clear();
}
bool VhdlDocGen::isConstraint(const MemberDef *mdef)
@@ -3225,7 +2968,7 @@ static struct
QList<FlowChart> FlowChart::flowList;
#ifdef DEBUGFLOW
-static QMap<QCString,int> keyMap;
+static std::map<std::string,int> g_keyMap;
#endif
void alignText(QCString & q)
@@ -3336,20 +3079,18 @@ void FlowChart::printFlowTree()
void FlowChart::colTextNodes()
{
- QCString text;
- FlowChart *flno;
+ FlowChart *flno = NULL;
bool found=FALSE;
for (uint j=0;j<flowList.count();j++)
{
FlowChart *flo=flowList.at(j);
if (flo->type&TEXT_NO)
{
- text+=flo->text+'\n';
if (!found)
{
flno=flo;
}
- if (found)
+ else
{
flno->text+=flo->text;
flowList.remove(flo);
@@ -3689,12 +3430,11 @@ void FlowChart::printUmlTree()
}
qcs+="\n";
- QCString & htmlOutDir = Config_getString(HTML_OUTPUT);
+ QCString htmlOutDir = Config_getString(HTML_OUTPUT);
QCString n=convertNameToFileName();
- QCString tmp=htmlOutDir;
- n=PlantumlManager::instance()->writePlantUMLSource(tmp,n,qcs,PlantumlManager::PUML_SVG);
- PlantumlManager::instance()->generatePlantUMLOutput(n.data(),tmp.data(),PlantumlManager::PUML_SVG);
+ n=PlantumlManager::instance()->writePlantUMLSource(htmlOutDir,n,qcs,PlantumlManager::PUML_SVG);
+ PlantumlManager::instance()->generatePlantUMLOutput(n,htmlOutDir,PlantumlManager::PUML_SVG);
}
QCString FlowChart::convertNameToFileName()
@@ -3803,9 +3543,8 @@ void FlowChart::writeFlowChart()
#ifdef DEBUGFLOW
printFlowTree();
#endif
- const MemberDef *p=VhdlDocGen::getFlowMember();
- if (p->isStatic())
+ if (!Config_getString(PLANTUML_JAR_PATH).isEmpty())
{
printUmlTree();
delFlowList();
@@ -3851,7 +3590,7 @@ void FlowChart::writeShape(FTextStream &t,const FlowChart* fl)
#ifdef DEBUGFLOW
QCString qq(getNodeName(fl->id).data());
- keyMap.insert(qq,fl->id);
+ g_keyMap.insert({qq.str(),fl->id});
#endif
bool dec=(fl->type & DECLN);
@@ -3902,7 +3641,7 @@ void FlowChart::writeShape(FTextStream &t,const FlowChart* fl)
else
{
if (fl->text.isEmpty()) return;
- bool var=(fl->type & FlowChart::VARIABLE_NO);
+ bool isVar=(fl->type & FlowChart::VARIABLE_NO);
QCString q=fl->text;
if (exit)
@@ -3918,7 +3657,7 @@ void FlowChart::writeShape(FTextStream &t,const FlowChart* fl)
}
t << "[shape=none margin=0.1, label=<\n";
t << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n ";
- if (var)
+ if (isVar)
{
t << "<TR><TD BGCOLOR=\"" << flowCol.varNode << "\" > ";
}
@@ -3940,11 +3679,11 @@ void FlowChart::writeEdge(FTextStream &t,const FlowChart* fl_from,const FlowChar
#ifdef DEBUGFLOW
QCString s1(getNodeName(fl_from->id).data());
QCString s2(getNodeName(fl_to->id).data());
- QMap<QCString, int>::Iterator it = keyMap.find(s1);
- QMap<QCString, int>::Iterator it1 = keyMap.find(s2);
+ auto it = g_keyMap.find(s1.str());
+ auto it1 = g_keyMap.find(s2.str());
// checks if the link is connected to a valid node
- assert(it.key());
- assert(it1.key());
+ assert(it!=g_keyMap.end());
+ assert(it1!=g_keyMap.end());
#endif
writeEdge(t,fl_from->id,fl_to->id,i,b,c);
@@ -3981,7 +3720,7 @@ void FlowChart::writeEdge(FTextStream &t,int fl_from,int fl_to,int i,bool bFrom,
void FlowChart::alignFuncProc( QCString & q,const ArgumentList &al,bool isFunc)
{
- int index=al.size();
+ size_t index=al.size();
if (index==0) return;
int len=q.length()+VhdlDocGen::getFlowMember()->name().length();
@@ -4062,7 +3801,7 @@ int FlowChart::findLabel(int index,QCString &label)
return j;
}
}
- err("could not find label: ",label.data());
+ err("could not find label: %s",label.data());
return 0;
}
@@ -4277,5 +4016,3 @@ void FlowChart::writeFlowLinks(FTextStream &t)
}
} //for
} //writeFlowLinks
-
-
diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h
index a557c27..22751c5 100644
--- a/src/vhdldocgen.h
+++ b/src/vhdldocgen.h
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,8 +16,8 @@
#ifndef VHDLDOCGEN_H
#define VHDLDOCGEN_H
-/**
- * This class implements functions for parsing and generating
+/**
+ * This class implements functions for parsing and generating
* vhdl documents
*/
@@ -31,6 +31,7 @@ class Entry;
class ClassDef;
class MemberList;
class MemberDef;
+class MemberDefMutable;
class FTextStream;
class OutputList;
class Definition;
@@ -42,15 +43,15 @@ struct Argument;
struct VhdlConfNode
-{
- VhdlConfNode(const char* a,const char* b,const char* config,const char* cs,bool leaf)
- {
+{
+ VhdlConfNode(const char* a,const char* b,const char* config,const char* cs,bool leaf)
+ {
arch=a; // architecture e.g. for iobuffer
arch=arch.lower();
binding=b; // binding e.g. use entity work.xxx(bev)
binding=binding.lower();
confVhdl=config; // configuration foo is bar
- compSpec=cs;
+ compSpec=cs;
isInlineConf=false; // primary configuration?
isLeaf=leaf;
};
@@ -67,7 +68,7 @@ struct VhdlConfNode
/** Class for generating documentation specific for VHDL */
-class VhdlDocGen
+class VhdlDocGen
{
public:
@@ -98,11 +99,11 @@ class VhdlDocGen
USE,
PROCESS,
PORT,
- UNITS,
+ UNITS,
GENERIC,
INSTANTIATION,
GROUP,
- VFILE,
+ VFILE,
SHAREDVARIABLE,
CONFIG,
ALIAS,
@@ -115,7 +116,7 @@ class VhdlDocGen
static void init();
static QCString convertFileNameToClassName(QCString name);
// --- used by vhdlscanner.l -----------
-
+
static bool isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int level);
static QCString getIndexWord(const char* ,int index);
@@ -129,10 +130,10 @@ class VhdlDocGen
static void computeVhdlComponentRelations();
- static QCString* findKeyWord(const QCString& word);
+ static const char* findKeyWord(const QCString& word);
static ClassDef* getPackageName(const QCString& name);
- static MemberDef* findMember(const QCString& className,
+ static MemberDef* findMember(const QCString& className,
const QCString& memName);
static void findAllPackages(ClassDef*);
static MemberDef* findMemberDef(ClassDef* cd,
@@ -144,7 +145,7 @@ class VhdlDocGen
static QCString getClassTitle(const ClassDef*);
static void writeInlineClassLink(const ClassDef*,
OutputList &ol);
- static void writeTagFile(MemberDef *mdef,FTextStream &tagFile);
+ static void writeTagFile(MemberDefMutable *mdef,FTextStream &tagFile);
static bool isConstraint(const MemberDef *mdef);
static bool isConfig(const MemberDef *mdef);
@@ -190,7 +191,7 @@ class VhdlDocGen
static void writeVhdlDeclarations(const MemberList*,OutputList&,const GroupDef*,const ClassDef*,const FileDef*,const NamespaceDef*);
- static void writeVHDLDeclaration(const MemberDef* mdef,OutputList &ol,
+ static void writeVHDLDeclaration(const MemberDefMutable* mdef,OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
bool inGroup);
@@ -207,20 +208,19 @@ class VhdlDocGen
static QCString convertArgumentListToString(const ArgumentList &al,bool f);
static QCString getProcessNumber();
static QCString getRecordNumber();
-
+
static QCString getClassName(const ClassDef*);
static bool isNumber(const QCString& s);
static QCString getProtectionName(int prot);
static void parseUCF(const char* input,Entry* entity,QCString f,bool vendor);
- static bool findConstraintFile( LayoutNavEntry *lne);
- static ClassDef* findArchitecture(const ClassDef *cd);
- static ClassDef* findArchitecture(QCString identifier, QCString entity_name);
+ static const ClassDef* findArchitecture(const ClassDef *cd);
+ //static const ClassDef* findArchitecture(QCString identifier, QCString entity_name);
- static void correctMemberProperties(MemberDef *md);
-
- static void writeSource(const MemberDef *mdef,OutputList& ol,const QCString & cname);
+ static void correctMemberProperties(MemberDefMutable *md);
+
+ static void writeSource(const MemberDefMutable *mdef,OutputList& ol,const QCString & cname);
static QCString parseForConfig(QCString & entity,QCString & arch);
static QCString parseForBinding(QCString & entity,QCString & arch);
@@ -229,15 +229,15 @@ class VhdlDocGen
static void writeOverview(OutputList &ol);
static void writeOverview();
-
+
// flowcharts
static void createFlowChart(const MemberDef*);
//static void addFlowImage(const FTextStream &,const QCString &);
-
+
static void setFlowMember( const MemberDef *flowMember);
static const MemberDef *getFlowMember();
- static bool isVhdlClass (const Entry *cu)
+ static bool isVhdlClass (const Entry *cu)
{
return cu->spec==VhdlDocGen::ENTITY ||
cu->spec==VhdlDocGen::PACKAGE ||
@@ -253,7 +253,7 @@ class VhdlDocGen
static void writeVhdlLink(const ClassDef* cdd ,OutputList& ol,QCString& type,QCString& name,QCString& beh);
static void writeStringLink(const MemberDef *mdef,QCString mem,OutputList& ol);
static void writeRecUnitDocu( const MemberDef *md, OutputList& ol,QCString largs);
- static void writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef);
+ static void writeRecordUnit(QCString & largs,QCString & ltype,OutputList& ol,const MemberDefMutable *mdef);
};
//-------------------------------------------------------------------------------------------------------------------
@@ -290,7 +290,7 @@ class FlowChart
BEGIN_NO = 1<<21
};
- //---------- create svg -------------------------------------------------------------
+ //---------- create svg -------------------------------------------------------------
static void createSVG();
static void startDot(FTextStream &t);
static void endDot(FTextStream &t);
diff --git a/src/vhdljjparser.cpp b/src/vhdljjparser.cpp
index 23335d9..4ca4bbe 100644
--- a/src/vhdljjparser.cpp
+++ b/src/vhdljjparser.cpp
@@ -13,8 +13,8 @@
#include <qcstring.h>
#include <qfileinfo.h>
#include <qcstringlist.h>
+#include "containers.h"
#include "vhdljjparser.h"
-#include "vhdlcode.h"
#include "vhdldocgen.h"
#include "message.h"
#include "config.h"
@@ -64,7 +64,7 @@ struct VHDLOutlineParser::Private
QCString yyFileName;
int yyLineNr = 1;
- std::vector<int> lineParse;
+ IntVector lineParse;
int iDocLine = -1;
QCString inputString;
Entry* gBlock = 0;
@@ -81,11 +81,12 @@ struct VHDLOutlineParser::Private
VHDLDocInfo str_doc;
VhdlParser::SharedState shared;
QCString forL;
+ int code = 0;
};
void VHDLOutlineParser::Private::parseVhdlfile(const char *fileName,
- const char* inputBuffer,bool inLine)
+ const char* inputBuffer,bool inLine)
{
JAVACC_STRING_TYPE s =inputBuffer;
CharStream *stream = new CharStream(s.c_str(), (int)s.size(), 1, 1);
@@ -94,7 +95,8 @@ void VHDLOutlineParser::Private::parseVhdlfile(const char *fileName,
vhdlParser=new VhdlParser(tokenManager);
vhdlParser->setOutlineParser(thisParser);
vhdlParser->setSharedState(&shared);
- tokenManager->ReInit(stream,0,vhdlParser);
+ tokenManager->setLexParser(vhdlParser);
+ tokenManager->ReInit(stream,0);
tokenManager->setErrorHandler(tokErrHandler);
VhdlErrorHandler *parserErrHandler=new VhdlErrorHandler(fileName);
vhdlParser->setErrorHandler(parserErrHandler);
@@ -112,7 +114,10 @@ void VHDLOutlineParser::Private::parseVhdlfile(const char *fileName,
catch( std::exception &){ /* fprintf(stderr,"\n[%s]",e.what()); */ }
// fprintf(stderr,"\n\nparsed lines: %d\n",yyLineNr);
// fprintf(stderr,"\n\nerrors : %d\n\n",myErr->getErrorCount());
+ //
delete vhdlParser;
+ delete tokenManager;
+ delete stream;
}
VHDLOutlineParser::VHDLOutlineParser() : p(std::make_unique<Private>())
@@ -124,7 +129,7 @@ VHDLOutlineParser::~VHDLOutlineParser()
}
void VHDLOutlineParser::parseInput(const char *fileName,const char *fileBuf,
- const std::shared_ptr<Entry> &root, bool ,QStrList&)
+ const std::shared_ptr<Entry> &root, ClangTUParser *)
{
VhdlParser::SharedState *s = &p->shared;
p->thisParser=this;
@@ -159,9 +164,10 @@ void VHDLOutlineParser::parseInput(const char *fileName,const char *fileBuf,
p->oldEntry = 0;
s->current=std::make_shared<Entry>();
initEntry(s->current.get());
- Doxygen::docGroup.enterFile(fileName,p->yyLineNr);
+ p->commentScanner.enterFile(fileName,p->yyLineNr);
p->lineParse.reserve(200);
p->parseVhdlfile(fileName,fileBuf,inLine);
+ p->commentScanner.leaveFile(fileName,p->yyLineNr);
s->current.reset();
@@ -197,7 +203,7 @@ void VHDLOutlineParser::initEntry(Entry *e)
handleCommentBlock(p->str_doc.doc,p->str_doc.brief);
p->iDocLine=-1;
}
- Doxygen::docGroup.initGroupInfo(e);
+ p->commentScanner.initGroupInfo(e);
}
void VHDLOutlineParser::newEntry()
@@ -232,6 +238,23 @@ void VHDLOutlineParser::newEntry()
initEntry(s->current.get());
}
+static int idCounter;
+
+/** returns a unique id for each record member.
+*
+* type first_rec is record
+* RE: data_type;
+* end;
+*
+* type second_rec is record
+* RE: data_type;
+* end;
+*/
+
+QString VHDLOutlineParser::getNameID(){
+ return QString::number(idCounter++,10);
+}
+
void VHDLOutlineParser::handleFlowComment(const char* doc)
{
lineCount(doc);
@@ -245,35 +268,128 @@ void VHDLOutlineParser::handleFlowComment(const char* doc)
}
}
+int VHDLOutlineParser::checkInlineCode(QCString &doc)
+{
+ QRegExp cs("[\\\\@]code");
+ QRegExp cend("[\\s ]*[\\\\@]endcode");
+ QRegExp cbrief("[\\\\@]brief");
+ int index = doc.find(cs);
+
+ if (doc.contains(cend) > 0)
+ return 1;
+
+ if (index < 0)
+ return index;
+
+ VhdlParser::SharedState *s = &p->shared;
+ p->strComment += doc;
+ p->code = p->inputString.find(cs, p->code + 1);
+ int com = p->inputString.find(p->strComment.data());
+ int ref = p->inputString.find(cend, p->code + 1);
+ int len = p->strComment.size();
+
+ int ll = com + len;
+ int diff = ref - ll - 3;
+ QCString code = p->inputString.mid(ll, diff);
+ int iLine = 0;
+ code = stripLeadingAndTrailingEmptyLines(code, iLine);
+ int val = code.contains('\n');
+ VhdlDocGen::prepareComment(p->strComment);
+ QCStringList ql = QCStringList::split('\n', p->strComment);
+
+ QCString co;
+ QCString na;
+ for (QCString qcs : ql)
+ {
+ qcs = qcs.simplifyWhiteSpace();
+ if (qcs.contains(cs))
+ {
+ int i = qcs.find('{');
+ int j = qcs.find('}');
+ if (i > 0 && j > 0 && j > i)
+ {
+ na = qcs.mid(i + 1, (j - i - 1));
+ }
+ continue;
+ }
+ qcs = qcs.replace(cbrief, "");
+ co += qcs;
+ co += '\n';
+ }
+
+ VhdlDocGen::prepareComment(co);
+
+ Entry gBlock;
+ if (!na.isEmpty())
+ gBlock.name = na;
+ else
+ gBlock.name = "misc" + VhdlDocGen::getRecordNumber();
+ gBlock.startLine = p->yyLineNr+iLine-1;
+ gBlock.bodyLine = p->yyLineNr+iLine-1 ;
+ gBlock.doc = code;
+ gBlock.inbodyDocs = code;
+ gBlock.brief = co;
+ gBlock.section = Entry::VARIABLE_SEC;
+ gBlock.spec = VhdlDocGen::MISCELLANEOUS;
+ gBlock.fileName = p->yyFileName;
+ gBlock.endBodyLine = p->yyLineNr + val +iLine;
+ gBlock.lang = SrcLangExt_VHDL;
+ std::shared_ptr<Entry> compound;
+
+ if (s->lastEntity)
+ compound = s->lastEntity;
+ else if (s->lastCompound)
+ compound = s->lastCompound;
+ else
+ compound = 0;
+
+ if (compound)
+ {
+ compound->copyToSubEntry(&gBlock);
+ }
+ else
+ {
+ gBlock.type = "misc"; // global code like library ieee...
+ s->current_root->copyToSubEntry(&gBlock);
+ }
+ p->strComment.resize(0);
+ return 1;
+}
-void VHDLOutlineParser::handleCommentBlock(const char* doc1,bool brief)
+void VHDLOutlineParser::handleCommentBlock(const char *doc1, bool brief)
{
+ int position = 0;
+ bool needsEntry = FALSE;
VhdlParser::SharedState *s = &p->shared;
QCString doc = doc1;
- // fprintf(stderr,"\n %s",doc.data());
- if (doc.isEmpty()) return;
- if (checkMultiComment(doc,p->yyLineNr))
+ if (doc.isEmpty())
+ return;
+
+ if (checkMultiComment(doc, p->yyLineNr))
{
p->strComment.resize(0);
return;
}
- VhdlDocGen::prepareComment(doc);
+ if (checkInlineCode(doc) > 0)
+ {
+ return;
+ }
- Protection protection=Public;
+ Protection protection = Public;
+ VhdlDocGen::prepareComment(doc);
- if (p->oldEntry==s->current.get())
+ if (p->oldEntry == s->current.get())
{
- //printf("\n find pending message < %s > at line: %d \n ",doc.data(),iDocLine);
- p->str_doc.doc=doc;
- p->str_doc.iDocLine=p->iDocLine;
- p->str_doc.brief=brief;
- p->str_doc.pending=TRUE;
+ p->str_doc.doc = doc;
+ p->str_doc.iDocLine = p->iDocLine;
+ p->str_doc.brief = brief;
+ p->str_doc.pending = TRUE;
return;
}
- p->oldEntry=s->current.get();
+ p->oldEntry = s->current.get();
if (brief)
{
@@ -283,48 +399,42 @@ void VHDLOutlineParser::handleCommentBlock(const char* doc1,bool brief)
{
s->current->docLine = p->yyLineNr;
}
- // printf("parseCommentBlock file<%s>\n [%s]\n at line [%d] \n ",yyFileName.data(),doc.data(),p->iDocLine);
- int j=doc.find("[plant]");
- if (j>=0)
- {
- doc=doc.remove(j,7);
- s->current->stat=true;
- }
- int position=0;
- bool needsEntry=FALSE;
- QCString processedDoc = processMarkdownForCommentBlock(doc,p->yyFileName,p->iDocLine);
- while (p->commentScanner.parseCommentBlock(
- p->thisParser,
- s->current.get(),
- processedDoc, // text
- p->yyFileName, // file
- p->iDocLine, // line of block start
- brief,
- 0,
- FALSE,
- protection,
- position,
- needsEntry
- )
- )
+
+ Markdown markdown(p->yyFileName,p->iDocLine);
+ int lineNr = p->iDocLine;
+ QCString processedDoc = Config_getBool(MARKDOWN_SUPPORT) ? markdown.process(doc,lineNr) : doc;
+
+ while (p->commentScanner.parseCommentBlock(
+ p->thisParser,
+ s->current.get(),
+ processedDoc, // text
+ p->yyFileName, // file
+ lineNr, // line of block start
+ brief,
+ 0,
+ FALSE,
+ protection,
+ position,
+ needsEntry,
+ Config_getBool(MARKDOWN_SUPPORT)))
{
- //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position);
- if (needsEntry) newEntry();
+ if (needsEntry)
+ newEntry();
}
if (needsEntry)
{
if (p->varr)
{
- p->varr=FALSE;
- s->current->name=p->varName;
- s->current->section=Entry::VARIABLEDOC_SEC;
- p->varName="";
+ p->varr = FALSE;
+ s->current->name = p->varName;
+ s->current->section = Entry::VARIABLEDOC_SEC;
+ p->varName = "";
}
newEntry();
}
- p->iDocLine=-1;
+ p->iDocLine = -1;
p->strComment.resize(0);
}
@@ -594,7 +704,7 @@ int VHDLOutlineParser::getLine()
void VHDLOutlineParser::setLineParsed(int tok)
{
- if (p->lineParse.size()<=tok) p->lineParse.resize(tok+1);
+ if ((int)p->lineParse.size()<=tok) p->lineParse.resize(tok+1);
p->lineParse[tok]=p->yyLineNr;
}
@@ -716,8 +826,8 @@ void VHDLOutlineParser::error_skipto(int kind)
Token *op;
do
{
- Token *t = p->vhdlParser->getNextToken();// step to next token
- op=p->vhdlParser->getToken(1); // get first token
+ p->vhdlParser->getNextToken(); // step to next token
+ op=p->vhdlParser->getToken(1); // get first token
if (op==0) break;
//fprintf(stderr,"\n %s",t->image.data());
} while (op->kind != kind);
diff --git a/src/vhdljjparser.h b/src/vhdljjparser.h
index 9e93e0d..651221c 100644..100755
--- a/src/vhdljjparser.h
+++ b/src/vhdljjparser.h
@@ -18,7 +18,6 @@
#include "types.h"
#include "entry.h"
#include "vhdldocgen.h"
-#include "vhdlcode.h"
#include "config.h"
enum { GEN_SEC=0x1, PARAM_SEC,CONTEXT_SEC,PROTECTED_SEC } ;
@@ -33,13 +32,10 @@ class VHDLOutlineParser : public OutlineParserInterface
public:
VHDLOutlineParser();
virtual ~VHDLOutlineParser();
- void startTranslationUnit(const char *) {}
- void finishTranslationUnit() {}
void parseInput(const char * fileName,
const char *fileBuf,
const std::shared_ptr<Entry> &root,
- bool sameTranslationUnit,
- QStrList &filesInSameTranslationUnit);
+ ClangTUParser *clangParser);
bool needsPreprocessing(const QCString &) const { return TRUE; }
void parsePrototype(const char *text);
@@ -72,12 +68,14 @@ class VHDLOutlineParser : public OutlineParserInterface
void setMultCommentLine();
bool checkMultiComment(QCString& qcs,int line);
void insertEntryAtLine(std::shared_ptr<Entry> ce,int line);
-
+ QString getNameID();
+ int checkInlineCode(QCString & doc);
private:
struct Private;
std::unique_ptr<Private> p;
};
+
const EntryList &getVhdlInstList();
QCString filter2008VhdlComment(const char *s);
diff --git a/src/xml.h b/src/xml.h
new file mode 100644
index 0000000..add95f1
--- /dev/null
+++ b/src/xml.h
@@ -0,0 +1,74 @@
+#ifndef XML_H
+#define XML_H
+
+#include <memory>
+#include <functional>
+#include <string>
+#include <unordered_map>
+
+/*! @brief Event handlers that can installed by the client and called while parsing a XML document.
+ */
+class XMLHandlers
+{
+ public:
+ using Attributes = std::unordered_map<std::string,std::string>;
+ using StartDocType = void();
+ using EndDocType = void();
+ using StartElementType = void(const std::string &,const Attributes &);
+ using EndElementType = void(const std::string &);
+ using ErrorType = void(const std::string,int,const std::string &);
+ using CharsType = void(const std::string &);
+
+ std::function<StartDocType> startDocument; /**< handler invoked at the start of the document */
+ std::function<EndDocType> endDocument; /**< handler invoked at the end of the document */
+ std::function<StartElementType> startElement; /**< handler invoked when an opening tag has been found */
+ std::function<EndElementType> endElement; /**< handler invoked when a closing tag has been found */
+ std::function<CharsType> characters; /**< handler invoked when content between tags has been found */
+ std::function<ErrorType> error; /**< handler invoked when the parser encounters an error */
+
+ static std::string value(const Attributes &attrib,const std::string &key)
+ {
+ auto it = attrib.find(key);
+ if (it!=attrib.end())
+ {
+ return it->second;
+ }
+ return "";
+ }
+};
+
+class XMLLocator
+{
+ public:
+ virtual ~XMLLocator() {}
+ virtual int lineNr() const = 0;
+ virtual std::string fileName() const = 0;
+};
+
+/*! Very basic SAX style parser to parse XML documents. */
+class XMLParser : public XMLLocator
+{
+ public:
+ /*! Creates an instance of the parser object. Different instances can run on different
+ * threads without interference.
+ *
+ * @param handlers The event handlers passed by the client.
+ */
+ XMLParser(const XMLHandlers &handlers);
+ /*! Destructor */
+ ~XMLParser();
+
+ /*! Parses a file gives the contents of the file as a string.
+ * @param fileName the name of the file, used for error reporting.
+ * @param inputString the contents of the file as a zero terminated UTF-8 string.
+ */
+ void parse(const char *fileName,const char *inputString);
+
+ private:
+ virtual int lineNr() const override;
+ virtual std::string fileName() const override;
+ struct Private;
+ std::unique_ptr<Private> p;
+};
+
+#endif
diff --git a/src/xml.l b/src/xml.l
new file mode 100644
index 0000000..ace35d5
--- /dev/null
+++ b/src/xml.l
@@ -0,0 +1,484 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/******************************************************************************
+ * Minimal flex based parser for XML
+ ******************************************************************************/
+
+%option never-interactive
+%option prefix="xmlYY"
+%option reentrant
+%option extra-type="struct xmlYY_state *"
+%option 8bit noyywrap
+%top{
+#include <stdint.h>
+}
+
+%{
+
+#include <ctype.h>
+#include <vector>
+#include <stdio.h>
+#include "xml.h"
+#include "message.h"
+
+#define YY_NEVER_INTERACTIVE 1
+#define YY_NO_INPUT 1
+#define YY_NO_UNISTD_H 1
+
+struct xmlYY_state
+{
+ std::string fileName;
+ int lineNr = 1;
+ const char * inputString = 0; //!< the code fragment as text
+ yy_size_t inputPosition = 0; //!< read offset during parsing
+ std::string name;
+ bool isEnd = false;
+ bool selfClose = false;
+ std::string data;
+ std::string attrValue;
+ std::string attrName;
+ XMLHandlers::Attributes attrs;
+ XMLHandlers handlers;
+ int cdataContext;
+ int commentContext;
+ char stringChar;
+ std::vector<std::string> xpath;
+};
+
+#if USE_STATE2STRING
+static const char *stateToString(int state);
+#endif
+
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+static void initElement(yyscan_t yyscanner);
+static void addCharacters(yyscan_t yyscanner);
+static void addElement(yyscan_t yyscanner);
+static void addAttribute(yyscan_t yyscanner);
+static void countLines(yyscan_t yyscanner, const char *txt,yy_size_t len);
+static void reportError(yyscan_t yyscanner, const std::string &msg);
+static std::string processData(yyscan_t yyscanner,const char *txt,yy_size_t len);
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
+
+%}
+
+NL (\r\n|\r|\n)
+SP [ \t\r\n]+
+OPEN {SP}?"<"
+OPENSPECIAL {SP}?"<?"
+CLOSE ">"{NL}?
+CLOSESPECIAL "?>"{NL}?
+NAMESTART [:A-Za-z\200-\377_]
+NAMECHAR [:A-Za-z\200-\377_0-9.-]
+NAME {NAMESTART}{NAMECHAR}*
+ESC "&#"[0-9]+";"|"&#x"[0-9a-fA-F]+";"
+COLON ":"
+PCDATA [^<]+
+COMMENT {OPEN}"!--"
+COMMENTEND "--"{CLOSE}
+STRING \"([^"&]|{ESC})*\"|\'([^'&]|{ESC})*\'
+DOCTYPE {SP}?"<!DOCTYPE"{SP}
+CDATA {SP}?"<![CDATA["
+ENDCDATA "]]>"
+
+%option noyywrap
+
+%s Initial
+%s Content
+%s CDataSection
+%s Element
+%s Attributes
+%s AttributeValue
+%s AttrValueStr
+%s Prolog
+%s Comment
+
+%%
+
+<Initial>{
+ {SP} { countLines(yyscanner,yytext,yyleng); }
+ {DOCTYPE} { countLines(yyscanner,yytext,yyleng); }
+ {OPENSPECIAL} { countLines(yyscanner,yytext,yyleng); BEGIN(Prolog); }
+ {OPEN} { countLines(yyscanner,yytext,yyleng);
+ initElement(yyscanner);
+ BEGIN(Element); }
+ {COMMENT} { yyextra->commentContext = YY_START;
+ BEGIN(Comment);
+ }
+}
+<Content>{
+ {CDATA} { countLines(yyscanner,yytext,yyleng);
+ yyextra->cdataContext = YY_START;
+ BEGIN(CDataSection);
+ }
+ {PCDATA} { yyextra->data += processData(yyscanner,yytext,yyleng); }
+ {OPEN} { countLines(yyscanner,yytext,yyleng);
+ addCharacters(yyscanner);
+ initElement(yyscanner);
+ BEGIN(Element);
+ }
+ {COMMENT} { yyextra->commentContext = YY_START;
+ countLines(yyscanner,yytext,yyleng);
+ BEGIN(Comment);
+ }
+}
+<Element>{
+ "/" { yyextra->isEnd = true; }
+ {NAME} { yyextra->name = yytext;
+ BEGIN(Attributes); }
+ {CLOSE} { addElement(yyscanner);
+ countLines(yyscanner,yytext,yyleng);
+ yyextra->data = "";
+ BEGIN(Content);
+ }
+ {SP} { countLines(yyscanner,yytext,yyleng); }
+}
+<Attributes>{
+ "/" { yyextra->selfClose = true; }
+ {NAME} { yyextra->attrName = yytext; }
+ "=" { BEGIN(AttributeValue); }
+ {CLOSE} { addElement(yyscanner);
+ countLines(yyscanner,yytext,yyleng);
+ yyextra->data = "";
+ BEGIN(Content);
+ }
+ {SP} { countLines(yyscanner,yytext,yyleng); }
+}
+<AttributeValue>{
+ {SP} { countLines(yyscanner,yytext,yyleng); }
+ ['"] { yyextra->stringChar = *yytext;
+ yyextra->attrValue = "";
+ BEGIN(AttrValueStr);
+ }
+ . { std::string msg = std::string("Missing attribute value. Unexpected character `")+yytext+"` found";
+ reportError(yyscanner,msg);
+ unput(*yytext);
+ BEGIN(Attributes);
+ }
+}
+<AttrValueStr>{
+ [^'"\n]+ { yyextra->attrValue += processData(yyscanner,yytext,yyleng); }
+ ['"] { if (*yytext==yyextra->stringChar)
+ {
+ addAttribute(yyscanner);
+ BEGIN(Attributes);
+ }
+ else
+ {
+ yyextra->attrValue += processData(yyscanner,yytext,yyleng);
+ }
+ }
+ \n { yyextra->lineNr++; yyextra->attrValue+=' '; }
+}
+<CDataSection>{
+ {ENDCDATA} { BEGIN(yyextra->cdataContext); }
+ [^]\n]+ { yyextra->data += yytext; }
+ \n { yyextra->data += yytext;
+ yyextra->lineNr++;
+ }
+ . { yyextra->data += yytext; }
+}
+<Prolog>{
+ {CLOSESPECIAL} { countLines(yyscanner,yytext,yyleng);
+ BEGIN(Initial);
+ }
+ [^?\n]+ { }
+ \n { yyextra->lineNr++; }
+ . { }
+}
+<Comment>{
+ {COMMENTEND} { countLines(yyscanner,yytext,yyleng);
+ BEGIN(yyextra->commentContext);
+ }
+ [^\n-]+ { }
+ \n { yyextra->lineNr++; }
+ . { }
+}
+\n { yyextra->lineNr++; }
+. { std::string msg = "Unexpected character `";
+ msg+=yytext;
+ msg+="` found";
+ reportError(yyscanner,msg);
+ }
+
+%%
+
+//----------------------------------------------------------------------------------------
+
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,size_t max_size)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yy_size_t inputPosition = yyextra->inputPosition;
+ const char *s = yyextra->inputString + inputPosition;
+ yy_size_t c=0;
+ while( c < max_size && *s)
+ {
+ *buf++ = *s++;
+ c++;
+ }
+ yyextra->inputPosition += c;
+ return c;
+}
+
+static void countLines(yyscan_t yyscanner, const char *txt,yy_size_t len)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ for (yy_size_t i=0;i<len;i++)
+ {
+ if (txt[i]=='\n') yyextra->lineNr++;
+ }
+}
+
+static void initElement(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yyextra->isEnd = false; // true => </tag>
+ yyextra->selfClose = false; // true => <tag/>
+ yyextra->name = "";
+ yyextra->attrs.clear();
+}
+
+static void checkAndUpdatePath(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yyextra->xpath.empty())
+ {
+ std::string msg = "found closing tag '"+yyextra->name+"' without matching opening tag";
+ reportError(yyscanner,msg);
+ }
+ else
+ {
+ std::string expectedTagName = yyextra->xpath.back();
+ if (expectedTagName!=yyextra->name)
+ {
+ std::string msg = "Found closing tag '"+yyextra->name+"' that does not match the opening tag '"+expectedTagName+"' at the same level";
+ reportError(yyscanner,msg);
+ }
+ else // matching end tag
+ {
+ yyextra->xpath.pop_back();
+ }
+ }
+}
+
+static void addElement(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (!yyextra->isEnd)
+ {
+ yyextra->xpath.push_back(yyextra->name);
+ if (yyextra->handlers.startElement)
+ {
+ yyextra->handlers.startElement(yyextra->name,yyextra->attrs);
+ }
+ if (yy_flex_debug)
+ {
+ fprintf(stderr,"%d: startElement(%s,attr=[",yyextra->lineNr,yyextra->name.data());
+ for (auto attr : yyextra->attrs)
+ {
+ fprintf(stderr,"%s='%s' ",attr.first.c_str(),attr.second.c_str());
+ }
+ fprintf(stderr,"])\n");
+ }
+ }
+ if (yyextra->isEnd || yyextra->selfClose)
+ {
+ if (yy_flex_debug)
+ {
+ fprintf(stderr,"%d: endElement(%s)\n",yyextra->lineNr,yyextra->name.data());
+ }
+ checkAndUpdatePath(yyscanner);
+ if (yyextra->handlers.endElement)
+ {
+ yyextra->handlers.endElement(yyextra->name);
+ }
+ }
+}
+
+static std::string trimSpaces(const std::string &str)
+{
+ const int l = static_cast<int>(str.length());
+ int s=0, e=l-1;
+ while (s<l && isspace(str.at(s))) s++;
+ while (e>s && isspace(str.at(e))) e--;
+ return str.substr(s,1+e-s);
+}
+
+static void addCharacters(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ std::string data = trimSpaces(yyextra->data);
+ if (yyextra->handlers.characters)
+ {
+ yyextra->handlers.characters(data);
+ }
+ if (!data.empty())
+ {
+ if (yy_flex_debug)
+ {
+ fprintf(stderr,"characters(%s)\n",data.c_str());
+ }
+ }
+}
+
+static void addAttribute(yyscan_t yyscanner)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yyextra->attrs.insert(std::make_pair(yyextra->attrName,yyextra->attrValue));
+}
+
+static void reportError(yyscan_t yyscanner,const std::string &msg)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yy_flex_debug)
+ {
+ fprintf(stderr,"%s:%d: Error '%s'\n",yyextra->fileName.c_str(),yyextra->lineNr,msg.c_str());
+ }
+ if (yyextra->handlers.error)
+ {
+ yyextra->handlers.error(yyextra->fileName,yyextra->lineNr,msg);
+ }
+}
+
+static const char *entities_enc[] = { "amp", "quot", "gt", "lt", "apos" };
+static const char entities_dec[] = { '&', '"', '>', '<', '\'' };
+static const int num_entities = 5;
+
+// replace character entities such as &amp; in txt and return the string where entities
+// are replaced
+static std::string processData(yyscan_t yyscanner,const char *txt,yy_size_t len)
+{
+ std::string result;
+ result.reserve(len);
+ for (yy_size_t i=0; i<len; i++)
+ {
+ char c = txt[i];
+ if (c=='&')
+ {
+ const int maxEntityLen = 10;
+ char entity[maxEntityLen+1];
+ entity[maxEntityLen]='\0';
+ for (yy_size_t j=0; j<maxEntityLen && i+j+1<len; j++)
+ {
+ if (txt[i+j+1]!=';')
+ {
+ entity[j]=txt[i+j+1];
+ }
+ else
+ {
+ entity[j]=0;
+ break;
+ }
+ }
+ bool found=false;
+ for (int e=0; !found && e<num_entities; e++)
+ {
+ if (strcmp(entity,entities_enc[e])==0)
+ {
+ result+=entities_dec[e];
+ i+=strlen(entities_enc[e])+1;
+ found=true;
+ }
+ }
+ if (!found)
+ {
+ std::string msg = std::string("Invalid character entity '&") + entity + ";' found\n";
+ reportError(yyscanner,msg);
+ }
+ }
+ else
+ {
+ result+=c;
+ }
+ }
+ return result;
+}
+
+//--------------------------------------------------------------
+
+struct XMLParser::Private
+{
+ yyscan_t yyscanner;
+ struct xmlYY_state xmlYY_extra;
+};
+
+XMLParser::XMLParser(const XMLHandlers &handlers) : p(new Private)
+{
+ xmlYYlex_init_extra(&p->xmlYY_extra,&p->yyscanner);
+ p->xmlYY_extra.handlers = handlers;
+}
+
+XMLParser::~XMLParser()
+{
+ xmlYYlex_destroy(p->yyscanner);
+}
+
+void XMLParser::parse(const char *fileName,const char *inputStr)
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+
+#ifdef FLEX_DEBUG
+ xmlYYset_debug(1,p->yyscanner);
+#endif
+
+ if (inputStr==nullptr || inputStr[0]=='\0') return; // empty input
+
+ printlex(yy_flex_debug, true, __FILE__, fileName);
+
+ BEGIN(Initial);
+ yyextra->fileName = fileName;
+ yyextra->lineNr = 1;
+ yyextra->inputString = inputStr;
+ yyextra->inputPosition = 0;
+
+ xmlYYrestart( 0, yyscanner );
+
+ if (yyextra->handlers.startDocument)
+ {
+ yyextra->handlers.startDocument();
+ }
+ xmlYYlex(yyscanner);
+ if (yyextra->handlers.endDocument)
+ {
+ yyextra->handlers.endDocument();
+ }
+
+ if (!yyextra->xpath.empty())
+ {
+ std::string tagName = yyextra->xpath.back();
+ std::string msg = "End of file reached while expecting closing tag '"+tagName+"'";
+ reportError(yyscanner,msg);
+ }
+
+ printlex(yy_flex_debug, false, __FILE__, fileName);
+}
+
+int XMLParser::lineNr() const
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ return yyextra->lineNr;
+}
+
+std::string XMLParser::fileName() const
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ return yyextra->fileName;
+}
+
+#if USE_STATE2STRING
+#include "xml.l.h"
+#endif
diff --git a/src/xmlcode.h b/src/xmlcode.h
index 4cada9b..5a35506 100644
--- a/src/xmlcode.h
+++ b/src/xmlcode.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2014 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -32,6 +30,8 @@ class Definition;
class XMLCodeParser : public CodeParserInterface
{
public:
+ XMLCodeParser();
+ virtual ~XMLCodeParser();
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
const QCString &input,
@@ -48,6 +48,9 @@ class XMLCodeParser : public CodeParserInterface
bool collectXRefs=TRUE
);
void resetCodeParserState();
+ private:
+ struct Private;
+ std::unique_ptr<Private> p;
};
diff --git a/src/xmlcode.l b/src/xmlcode.l
index 94548f8..41f5504 100644
--- a/src/xmlcode.l
+++ b/src/xmlcode.l
@@ -1,10 +1,10 @@
/******************************************************************************
*
- * Copyright (C) 1997-2014 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,6 +19,14 @@
%option never-interactive
%option prefix="xmlcodeYY"
+%option reentrant
+%option extra-type="struct xmlcodeYY_state *"
+%option noyy_top_state
+%option nounput
+%option noyywrap
+%top{
+#include <stdint.h>
+}
%{
@@ -41,398 +49,431 @@
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
-static CodeOutputInterface * g_code;
-static QCString g_curClassName;
-static QCString g_parmType;
-static QCString g_parmName;
-static const char * g_inputString; //!< the code fragment as text
-static int g_inputPosition; //!< read offset during parsing
-static int g_inputLines; //!< number of line in the code fragment
-static int g_yyLineNr; //!< current line number
-static bool g_needsTermination;
-static const Definition *g_searchCtx;
-
-static bool g_exampleBlock;
-static QCString g_exampleName;
-static QCString g_exampleFile;
-
-static QCString g_type;
-static QCString g_name;
-static QCString g_args;
-static QCString g_classScope;
-
-static QCString g_CurrScope;
-
-static FileDef * g_sourceFileDef;
-static Definition * g_currentDefinition;
-static MemberDef * g_currentMemberDef;
-static bool g_includeCodeFragment;
-static const char * g_currentFontClass;
-
+struct xmlcodeYY_state
+{
+ CodeOutputInterface * code;
+ QCString curClassName;
+ QCString parmType;
+ QCString parmName;
+ const char * inputString = 0; //!< the code fragment as text
+ yy_size_t inputPosition = 0; //!< read offset during parsing
+ int inputLines = 0; //!< number of line in the code fragment
+ int yyLineNr = 0; //!< current line number
+ bool needsTermination = false;
+ const Definition *searchCtx = 0;
+
+ bool exampleBlock = false;
+ QCString exampleName;
+ QCString exampleFile;
+
+ QCString type;
+ QCString name;
+ QCString args;
+ QCString classScope;
+
+ QCString CurrScope;
+
+ const FileDef * sourceFileDef = 0;
+ const Definition * currentDefinition = 0;
+ const MemberDef * currentMemberDef = 0;
+ bool includeCodeFragment = false;
+ const char * currentFontClass = 0;
+};
+
+#if USE_STATE2STRING
static const char *stateToString(int state);
+#endif
+
+static void codify(yyscan_t yyscanner,const char* text);
+static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor);
+static void startCodeLine(yyscan_t yyscanner);
+static void endFontClass(yyscan_t yyscanner);
+static void endCodeLine(yyscan_t yyscanner);
+static void nextCodeLine(yyscan_t yyscanner);
+static void codifyLines(yyscan_t yyscanner,const char *text);
+static void startFontClass(yyscan_t yyscanner,const char *s);
+static int countLines(yyscan_t yyscanner);
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,yy_size_t max_size);
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
+
+%}
+
+nl (\r\n|\r|\n)
+ws [ \t]+
+open "<"
+close ">"
+namestart [A-Za-z\200-\377_]
+namechar [:A-Za-z\200-\377_0-9.-]
+esc "&#"[0-9]+";"|"&#x"[0-9a-fA-F]+";"
+name {namestart}{namechar}*
+comment {open}"!--"([^-]|"-"[^-])*"--"{close}
+data "random string"
+string \"([^"&]|{esc})*\"|\'([^'&]|{esc})*\'
+
+%option noyywrap
+%option nounput
+
+%%
-static void codify(const char* text)
-{
- g_code->codify(text);
+<INITIAL>{ws} {
+ codifyLines(yyscanner,yytext);
+ }
+<INITIAL>"/" {
+ endFontClass(yyscanner);
+ codify(yyscanner,yytext);
+ }
+<INITIAL>"=" {
+ endFontClass(yyscanner);
+ codify(yyscanner,yytext);
+ }
+<INITIAL>{close} {
+ endFontClass(yyscanner);
+ codify(yyscanner,yytext);
+ }
+<INITIAL>{name} {
+ startFontClass(yyscanner,"keyword");
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+<INITIAL>{string} {
+ startFontClass(yyscanner,"stringliteral");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+
+{open}{ws}?{name} {
+ // Write the < in a different color
+ char openBracket[] = { yytext[0], '\0' };
+ codify(yyscanner,openBracket);
+
+ // Then write the rest
+ yytext++;
+ startFontClass(yyscanner,"keywordtype");
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+
+ BEGIN(INITIAL);
+ }
+{open}{ws}?"/"{name} {
+ // Write the "</" in a different color
+ char closeBracket[] = { yytext[0], yytext[1], '\0' };
+ endFontClass(yyscanner);
+ codify(yyscanner,closeBracket);
+
+ // Then write the rest
+ yytext++; // skip the '<'
+ yytext++; // skip the '/'
+ startFontClass(yyscanner,"keywordtype");
+ codify(yyscanner,yytext);
+ endFontClass(yyscanner);
+
+ BEGIN(INITIAL);
+ }
+{comment} {
+ // Strip off the extra '!'
+ // yytext++; // <
+ // *yytext = '<'; // replace '!' with '<'
+
+ startFontClass(yyscanner,"comment");
+ codifyLines(yyscanner,yytext);
+ endFontClass(yyscanner);
+ }
+{nl} {
+ codifyLines(yyscanner,yytext);
+ }
+
+. {
+ //printf("!ERROR(%c)\n", *yytext);
+ codifyLines(yyscanner,yytext);
+ }
+
+%%
+
+//----------------------------------------------------------------------------------------
+
+static yy_size_t yyread(yyscan_t yyscanner,char *buf,size_t max_size)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yy_size_t inputPosition = yyextra->inputPosition;
+ const char *s = yyextra->inputString + inputPosition;
+ yy_size_t c=0;
+ while( c < max_size && *s)
+ {
+ *buf++ = *s++;
+ c++;
+ }
+ yyextra->inputPosition += c;
+ return c;
+}
+
+static void codify(yyscan_t yyscanner,const char* text)
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ yyextra->code->codify(text);
}
-static void setCurrentDoc(const QCString &anchor)
+static void setCurrentDoc(yyscan_t yyscanner,const QCString &anchor)
{
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
if (Doxygen::searchIndex)
{
- if (g_searchCtx)
+ if (yyextra->searchCtx)
{
- Doxygen::searchIndex->setCurrentDoc(g_searchCtx,g_searchCtx->anchor(),FALSE);
+ yyextra->code->setCurrentDoc(yyextra->searchCtx,yyextra->searchCtx->anchor(),false);
}
else
{
- Doxygen::searchIndex->setCurrentDoc(g_sourceFileDef,anchor,TRUE);
+ yyextra->code->setCurrentDoc(yyextra->sourceFileDef,anchor,true);
}
}
}
-/*! start a new line of code, inserting a line number if g_sourceFileDef
- * is TRUE. If a definition starts at the current line, then the line
+/*! start a new line of code, inserting a line number if yyextra->sourceFileDef
+ * is true. If a definition starts at the current line, then the line
* number is linked to the documentation of that definition.
*/
-static void startCodeLine()
+static void startCodeLine(yyscan_t yyscanner)
{
- if (g_sourceFileDef)
- {
- Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
-
- if (!g_includeCodeFragment && d && d->isLinkableInProject())
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yyextra->sourceFileDef)
+ {
+ const Definition *d = yyextra->sourceFileDef->getSourceDefinition(yyextra->yyLineNr);
+
+ if (!yyextra->includeCodeFragment && d && d->isLinkableInProject())
{
- g_currentDefinition = d;
- g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
- //g_insideBody = FALSE;
- g_classScope = d->name().copy();
+ yyextra->currentDefinition = d;
+ yyextra->currentMemberDef = yyextra->sourceFileDef->getSourceMember(yyextra->yyLineNr);
+ //yyextra->insideBody = false;
+ yyextra->classScope = d->name().copy();
QCString lineAnchor;
- lineAnchor.sprintf("l%05d",g_yyLineNr);
- if (g_currentMemberDef)
+ lineAnchor.sprintf("l%05d",yyextra->yyLineNr);
+ if (yyextra->currentMemberDef)
{
- g_code->writeLineNumber(g_currentMemberDef->getReference(),
- g_currentMemberDef->getOutputFileBase(),
- g_currentMemberDef->anchor(),g_yyLineNr);
- setCurrentDoc(lineAnchor);
+ yyextra->code->writeLineNumber(yyextra->currentMemberDef->getReference(),
+ yyextra->currentMemberDef->getOutputFileBase(),
+ yyextra->currentMemberDef->anchor(),yyextra->yyLineNr);
+ setCurrentDoc(yyscanner,lineAnchor);
}
else
{
- g_code->writeLineNumber(d->getReference(),
+ yyextra->code->writeLineNumber(d->getReference(),
d->getOutputFileBase(),
- 0,g_yyLineNr);
- setCurrentDoc(lineAnchor);
+ 0,yyextra->yyLineNr);
+ setCurrentDoc(yyscanner,lineAnchor);
}
}
else
{
- g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ yyextra->code->writeLineNumber(0,0,0,yyextra->yyLineNr);
}
}
-
- g_code->startCodeLine(g_sourceFileDef);
-
- if (g_currentFontClass)
+
+ yyextra->code->startCodeLine(yyextra->sourceFileDef);
+
+ if (yyextra->currentFontClass)
{
- g_code->startFontClass(g_currentFontClass);
+ yyextra->code->startFontClass(yyextra->currentFontClass);
}
}
-static void endFontClass()
+static void endFontClass(yyscan_t yyscanner)
{
- if (g_currentFontClass)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ if (yyextra->currentFontClass)
{
- g_code->endFontClass();
- g_currentFontClass=0;
+ yyextra->code->endFontClass();
+ yyextra->currentFontClass=0;
}
}
-static void endCodeLine()
+static void endCodeLine(yyscan_t yyscanner)
{
- endFontClass();
- g_code->endCodeLine();
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ endFontClass(yyscanner);
+ yyextra->code->endCodeLine();
}
-static void nextCodeLine()
+static void nextCodeLine(yyscan_t yyscanner)
{
- const char *fc = g_currentFontClass;
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ const char *fc = yyextra->currentFontClass;
+ endCodeLine(yyscanner);
+ if (yyextra->yyLineNr<yyextra->inputLines)
{
- g_currentFontClass = fc;
- startCodeLine();
+ yyextra->currentFontClass = fc;
+ startCodeLine(yyscanner);
}
}
-static void codifyLines(char *text)
+static void codifyLines(yyscan_t yyscanner,const char *text)
{
- char *p=text,*sp=p;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ const char *p=text,*sp=p;
char c;
- bool done=FALSE;
-
+ bool done=false;
while (!done)
{
sp=p;
-
while ((c=*p++) && c!='\n') { }
-
if (c=='\n')
{
- g_yyLineNr++;
- *(p-1)='\0';
- g_code->codify(sp);
- nextCodeLine();
+ yyextra->yyLineNr++;
+ int l = (int)(p-sp-1);
+ char *tmp = (char*)malloc(l+1);
+ tmp[l]='\0';
+ yyextra->code->codify(tmp);
+ free(tmp);
+ nextCodeLine(yyscanner);
}
else
{
- g_code->codify(sp);
- done=TRUE;
+ yyextra->code->codify(sp);
+ done=true;
}
}
}
-static void startFontClass(const char *s)
+static void startFontClass(yyscan_t yyscanner,const char *s)
{
- endFontClass();
- g_code->startFontClass(s);
- g_currentFontClass=s;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ endFontClass(yyscanner);
+ yyextra->code->startFontClass(s);
+ yyextra->currentFontClass=s;
}
/*! counts the number of lines in the input */
-static int countLines()
+static int countLines(yyscan_t yyscanner)
{
- const char *p=g_inputString;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
+ const char *p=yyextra->inputString;
char c;
int count=1;
- while ((c=*p))
- {
- p++ ;
- if (c=='\n') count++;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
}
- if (p>g_inputString && *(p-1)!='\n')
+ if (p>yyextra->inputString && *(p-1)!='\n')
{ // last line does not end with a \n, so we add an extra
// line and explicitly terminate the line after parsing.
- count++,
- g_needsTermination=TRUE;
- }
+ count++,
+ yyextra->needsTermination=true;
+ }
return count;
}
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+//----------------------------------------------------------------------------------------
-static int yyread(char *buf,int max_size)
+struct XMLCodeParser::Private
{
- int c=0;
- while( c < max_size && g_inputString[g_inputPosition] )
- {
- *buf = g_inputString[g_inputPosition++] ;
- c++; buf++;
- }
- return c;
-}
-
-%}
+ yyscan_t yyscanner;
+ xmlcodeYY_state state;
+};
-nl (\r\n|\r|\n)
-ws [ \t]+
-open "<"
-close ">"
-namestart [A-Za-z\200-\377_]
-namechar [:A-Za-z\200-\377_0-9.-]
-esc "&#"[0-9]+";"|"&#x"[0-9a-fA-F]+";"
-name {namestart}{namechar}*
-comment {open}"!--"([^-]|"-"[^-])*"--"{close}
-data "random string"
-string \"([^"&]|{esc})*\"|\'([^'&]|{esc})*\'
-
-%option noyywrap
-%option nounput
+XMLCodeParser::XMLCodeParser() : p(std::make_unique<Private>())
+{
+ xmlcodeYYlex_init_extra(&p->state,&p->yyscanner);
+#ifdef FLEX_DEBUG
+ xmlcodeYYset_debug(1,yyscanner);
+#endif
+ resetCodeParserState();
+}
-%%
+XMLCodeParser::~XMLCodeParser()
+{
+ xmlcodeYYlex_destroy(p->yyscanner);
+}
-<INITIAL>{ws} {
- codifyLines(yytext);
- }
-<INITIAL>"/" {
- endFontClass();
- codify(yytext);
- }
-<INITIAL>"=" {
- endFontClass();
- codify(yytext);
- }
-<INITIAL>{close} {
- endFontClass();
- codify(yytext);
- }
-<INITIAL>{name} {
- startFontClass("keyword");
- codify(yytext);
- endFontClass();
- }
-<INITIAL>{string} {
- startFontClass("stringliteral");
- codifyLines(yytext);
- endFontClass();
- }
-
-{open}{ws}?{name} {
- // Write the < in a different color
- char openBracket[] = { yytext[0], '\0' };
- codify(openBracket);
-
- // Then write the rest
- yytext++;
- startFontClass("keywordtype");
- codify(yytext);
- endFontClass();
-
- BEGIN(INITIAL);
- }
-{open}{ws}?"/"{name} {
- // Write the "</" in a different color
- char closeBracket[] = { yytext[0], yytext[1], '\0' };
- endFontClass();
- codify(closeBracket);
-
- // Then write the rest
- yytext++; // skip the '<'
- yytext++; // skip the '/'
- startFontClass("keywordtype");
- codify(yytext);
- endFontClass();
+void XMLCodeParser::resetCodeParserState()
+{
+ struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
+ yyextra->currentDefinition = 0;
+ yyextra->currentMemberDef = 0;
+}
- BEGIN(INITIAL);
- }
-{comment} {
- // Strip off the extra '!'
- // yytext++; // <
- // *yytext = '<'; // replace '!' with '<'
+void XMLCodeParser::parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ SrcLangExt,
+ bool isExampleBlock,
+ const char *exampleName,
+ FileDef *fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ const MemberDef *memberDef,
+ bool showLineNumbers,
+ const Definition *searchCtx,
+ bool collectXRefs
+ )
+{
+ yyscan_t yyscanner = p->yyscanner;
+ struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
-{nl} {
- codifyLines(yytext);
- }
+ if (input.isEmpty()) return;
-. {
- //printf("!ERROR(%c)\n", *yytext);
- codifyLines(yytext);
- }
+ printlex(yy_flex_debug, true, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
-%%
+ yyextra->code = &codeOutIntf;
+ yyextra->inputString = input;
+ yyextra->inputPosition = 0;
+ yyextra->currentFontClass = 0;
+ yyextra->needsTermination = false;
+ yyextra->searchCtx = searchCtx;
-void parseXmlCode(
- CodeOutputInterface &od,
- const char * /*className*/,
- const QCString &s,
- bool exBlock,
- const char *exName,
- FileDef *fd,
- int startLine,
- int endLine,
- bool inlineFragment,
- const MemberDef *,
- bool,const Definition *searchCtx,
- bool /*collectXRefs*/
- )
-{
- if (s.isEmpty()) return;
- printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
-
- g_code = &od;
- g_inputString = s;
- g_inputPosition = 0;
- g_currentFontClass = 0;
- g_needsTermination = FALSE;
- g_searchCtx=searchCtx;
-
if (startLine!=-1)
- g_yyLineNr = startLine;
+ yyextra->yyLineNr = startLine;
else
- g_yyLineNr = 1;
-
+ yyextra->yyLineNr = 1;
+
if (endLine!=-1)
- g_inputLines = endLine+1;
+ yyextra->inputLines = endLine+1;
else
- g_inputLines = g_yyLineNr + countLines() - 1;
-
- g_exampleBlock = exBlock;
- g_exampleName = exName;
- g_sourceFileDef = fd;
-
- bool cleanupSourceDef = FALSE;
-
- if (exBlock && fd==0)
+ yyextra->inputLines = yyextra->yyLineNr + countLines(yyscanner) - 1;
+
+ yyextra->exampleBlock = isExampleBlock;
+ yyextra->exampleName = exampleName;
+ yyextra->sourceFileDef = fileDef;
+
+ bool cleanupSourceDef = false;
+
+ if (isExampleBlock && fileDef==0)
{
// create a dummy filedef for the example
- g_sourceFileDef = createFileDef("",(exName?exName:"generated"));
- cleanupSourceDef = TRUE;
+ yyextra->sourceFileDef = createFileDef("",(exampleName?exampleName:"generated"));
+ cleanupSourceDef = true;
}
-
- if (g_sourceFileDef)
+
+ if (yyextra->sourceFileDef)
{
- setCurrentDoc("l00001");
+ setCurrentDoc(yyscanner,"l00001");
}
- g_includeCodeFragment = inlineFragment;
- // Starts line 1 on the output
- startCodeLine();
+ yyextra->includeCodeFragment = inlineFragment;
+ // Starts line 1 on the output
+ startCodeLine(yyscanner);
- xmlcodeYYrestart( xmlcodeYYin );
+ xmlcodeYYrestart( 0, yyscanner );
- xmlcodeYYlex();
+ xmlcodeYYlex(yyscanner);
- if (g_needsTermination)
+ if (yyextra->needsTermination)
{
- endCodeLine();
+ endCodeLine(yyscanner);
}
if (cleanupSourceDef)
{
// delete the temporary file definition used for this example
- delete g_sourceFileDef;
- g_sourceFileDef=0;
+ delete yyextra->sourceFileDef;
+ yyextra->sourceFileDef=0;
}
-
- printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
- return;
-}
-
-void resetXmlCodeParserState()
-{
- g_currentDefinition = 0;
- g_currentMemberDef = 0;
-}
-
-//----------------------------------------------------------------------------
-void XMLCodeParser::parseCode(CodeOutputInterface &codeOutIntf,
- const char *scopeName,
- const QCString &input,
- SrcLangExt,
- bool isExampleBlock,
- const char *exampleName,
- FileDef *fileDef,
- int startLine,
- int endLine,
- bool inlineFragment,
- const MemberDef *memberDef,
- bool showLineNumbers,
- const Definition *searchCtx,
- bool collectXRefs
- )
-{
- parseXmlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
- fileDef,startLine,endLine,inlineFragment,memberDef,
- showLineNumbers,searchCtx,collectXRefs);
+ printlex(yy_flex_debug, false, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
}
-void XMLCodeParser::resetCodeParserState()
-{
- resetXmlCodeParserState();
-}
+#if USE_STATE2STRING
#include "xmlcode.l.h"
+#endif
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
index 019bef1..73aac7c 100644
--- a/src/xmldocvisitor.cpp
+++ b/src/xmldocvisitor.cpp
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -16,7 +13,7 @@
*
*/
-#include <qfileinfo.h>
+#include <qfileinfo.h>
#include "xmldocvisitor.h"
#include "docparser.h"
@@ -32,6 +29,7 @@
#include "config.h"
#include "htmlentity.h"
#include "emoji.h"
+#include "filedef.h"
static void visitCaption(XmlDocVisitor *parent, QList<DocNode> children)
{
@@ -40,9 +38,9 @@ static void visitCaption(XmlDocVisitor *parent, QList<DocNode> children)
for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
}
-static void visitPreStart(FTextStream &t, const char *cmd, bool doCaption,
- XmlDocVisitor *parent, QList<DocNode> children,
- const QCString &name, bool writeType, DocImage::Type type, const QCString &width,
+static void visitPreStart(FTextStream &t, const char *cmd, bool doCaption,
+ XmlDocVisitor *parent, QList<DocNode> children,
+ const QCString &name, bool writeType, DocImage::Type type, const QCString &width,
const QCString &height, bool inlineImage = FALSE)
{
t << "<" << cmd;
@@ -88,8 +86,8 @@ static void visitPostEnd(FTextStream &t, const char *cmd)
t << "</" << cmd << ">" << endl;
}
-XmlDocVisitor::XmlDocVisitor(FTextStream &t,CodeOutputInterface &ci)
- : DocVisitor(DocVisitor_XML), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
+XmlDocVisitor::XmlDocVisitor(FTextStream &t,CodeOutputInterface &ci)
+ : DocVisitor(DocVisitor_XML), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
{
}
@@ -159,7 +157,7 @@ void XmlDocVisitor::visit(DocEmoji *s)
void XmlDocVisitor::visit(DocURL *u)
{
if (m_hide) return;
- m_t << "<ulink url=\"";
+ m_t << "<ulink url=\"";
if (u->isEmail()) m_t << "mailto:";
filter(u->url());
m_t << "\">";
@@ -221,12 +219,12 @@ void XmlDocVisitor::visit(DocStyleChange *s)
if (s->enable()) m_t << "<small>"; else m_t << "</small>";
break;
case DocStyleChange::Preformatted:
- if (s->enable())
+ if (s->enable())
{
- m_t << "<preformatted>";
+ m_t << "<preformatted>";
m_insidePre=TRUE;
}
- else
+ else
{
m_t << "</preformatted>";
m_insidePre=FALSE;
@@ -254,17 +252,16 @@ void XmlDocVisitor::visit(DocVerbatim *s)
m_t << " filename=\"" << lang << "\">";
else
m_t << ">";
- Doxygen::parserManager->getCodeParser(lang)
- .parseCode(m_ci,s->context(),s->text(),langExt,
- s->isExample(),s->exampleFile());
- m_t << "</programlisting>";
+ getCodeParser(lang).parseCode(m_ci,s->context(),s->text(),langExt,
+ s->isExample(),s->exampleFile());
+ m_t << "</programlisting>";
break;
- case DocVerbatim::Verbatim:
+ case DocVerbatim::Verbatim:
m_t << "<verbatim>";
filter(s->text());
- m_t << "</verbatim>";
+ m_t << "</verbatim>";
break;
- case DocVerbatim::HtmlOnly:
+ case DocVerbatim::HtmlOnly:
if (s->isBlock())
{
m_t << "<htmlonly block=\"yes\">";
@@ -276,17 +273,17 @@ void XmlDocVisitor::visit(DocVerbatim *s)
filter(s->text());
m_t << "</htmlonly>";
break;
- case DocVerbatim::RtfOnly:
+ case DocVerbatim::RtfOnly:
m_t << "<rtfonly>";
filter(s->text());
m_t << "</rtfonly>";
break;
- case DocVerbatim::ManOnly:
+ case DocVerbatim::ManOnly:
m_t << "<manonly>";
filter(s->text());
m_t << "</manonly>";
break;
- case DocVerbatim::LatexOnly:
+ case DocVerbatim::LatexOnly:
m_t << "<latexonly>";
filter(s->text());
m_t << "</latexonly>";
@@ -296,7 +293,7 @@ void XmlDocVisitor::visit(DocVerbatim *s)
filter(s->text());
m_t << "</docbookonly>";
break;
- case DocVerbatim::XmlOnly:
+ case DocVerbatim::XmlOnly:
m_t << s->text();
break;
case DocVerbatim::Dot:
@@ -330,12 +327,11 @@ void XmlDocVisitor::visit(DocInclude *inc)
switch(inc->type())
{
case DocInclude::IncWithLines:
- {
+ {
m_t << "<programlisting filename=\"" << inc->file() << "\">";
QFileInfo cfi( inc->file() );
FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
inc->text(),
langExt,
inc->isExample(),
@@ -348,13 +344,12 @@ void XmlDocVisitor::visit(DocInclude *inc)
TRUE // show line numbers
);
delete fd;
- m_t << "</programlisting>";
+ m_t << "</programlisting>";
}
- break;
- case DocInclude::Include:
+ break;
+ case DocInclude::Include:
m_t << "<programlisting filename=\"" << inc->file() << "\">";
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,inc->context(),
+ getCodeParser(inc->extension()).parseCode(m_ci,inc->context(),
inc->text(),
langExt,
inc->isExample(),
@@ -366,12 +361,12 @@ void XmlDocVisitor::visit(DocInclude *inc)
0, // memberDef
FALSE // show line numbers
);
- m_t << "</programlisting>";
+ m_t << "</programlisting>";
break;
- case DocInclude::DontInclude:
- case DocInclude::DontIncWithLines:
+ case DocInclude::DontInclude:
+ case DocInclude::DontIncWithLines:
break;
- case DocInclude::HtmlInclude:
+ case DocInclude::HtmlInclude:
if (inc->isBlock())
{
m_t << "<htmlonly block=\"yes\">";
@@ -388,35 +383,51 @@ void XmlDocVisitor::visit(DocInclude *inc)
filter(inc->text());
m_t << "</latexonly>";
break;
- case DocInclude::VerbInclude:
+ case DocInclude::RtfInclude:
+ m_t << "<rtfonly>";
+ filter(inc->text());
+ m_t << "</rtfonly>";
+ break;
+ case DocInclude::ManInclude:
+ m_t << "<manonly>";
+ filter(inc->text());
+ m_t << "</manonly>";
+ break;
+ case DocInclude::XmlInclude:
+ filter(inc->text());
+ break;
+ case DocInclude::DocbookInclude:
+ m_t << "<docbookonly>";
+ filter(inc->text());
+ m_t << "</docbookonly>";
+ break;
+ case DocInclude::VerbInclude:
m_t << "<verbatim>";
filter(inc->text());
- m_t << "</verbatim>";
+ m_t << "</verbatim>";
break;
case DocInclude::Snippet:
m_t << "<programlisting filename=\"" << inc->file() << "\">";
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
extractBlock(inc->text(),inc->blockId()),
langExt,
inc->isExample(),
inc->exampleFile()
);
- m_t << "</programlisting>";
+ m_t << "</programlisting>";
break;
case DocInclude::SnipWithLines:
{
m_t << "<programlisting filename=\"" << inc->file() << "\">";
QFileInfo cfi( inc->file() );
FileDef *fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
- Doxygen::parserManager->getCodeParser(inc->extension())
- .parseCode(m_ci,
+ getCodeParser(inc->extension()).parseCode(m_ci,
inc->context(),
extractBlock(inc->text(),inc->blockId()),
langExt,
inc->isExample(),
- inc->exampleFile(),
+ inc->exampleFile(),
fd,
lineBlock(inc->text(),inc->blockId()),
-1, // endLine
@@ -425,11 +436,11 @@ void XmlDocVisitor::visit(DocInclude *inc)
TRUE // show line number
);
delete fd;
- m_t << "</programlisting>";
+ m_t << "</programlisting>";
}
break;
- case DocInclude::SnippetDoc:
- case DocInclude::IncludeDoc:
+ case DocInclude::SnippetDoc:
+ case DocInclude::IncludeDoc:
err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
"Please create a bug report\n",__FILE__);
break;
@@ -440,7 +451,7 @@ void XmlDocVisitor::visit(DocIncOperator *op)
{
//printf("DocIncOperator: type=%d first=%d, last=%d text='%s'\n",
// op->type(),op->isFirst(),op->isLast(),op->text().data());
- if (op->isFirst())
+ if (op->isFirst())
{
if (!m_hide)
{
@@ -452,10 +463,10 @@ void XmlDocVisitor::visit(DocIncOperator *op)
QCString locLangExt = getFileNameExtension(op->includeFileName());
if (locLangExt.isEmpty()) locLangExt = m_langExt;
SrcLangExt langExt = getLanguageFromFileName(locLangExt);
- if (op->type()!=DocIncOperator::Skip)
+ if (op->type()!=DocIncOperator::Skip)
{
popEnabled();
- if (!m_hide)
+ if (!m_hide)
{
FileDef *fd = 0;
if (!op->includeFileName().isEmpty())
@@ -464,26 +475,25 @@ void XmlDocVisitor::visit(DocIncOperator *op)
fd = createFileDef( cfi.dirPath().utf8(), cfi.fileName().utf8() );
}
- Doxygen::parserManager->getCodeParser(locLangExt)
- .parseCode(m_ci,op->context(),
- op->text(),langExt,op->isExample(),
- op->exampleFile(),
- fd, // fileDef
- op->line(), // startLine
- -1, // endLine
- FALSE, // inline fragment
- 0, // memberDef
- op->showLineNo() // show line numbers
- );
+ getCodeParser(locLangExt).parseCode(m_ci,op->context(),
+ op->text(),langExt,op->isExample(),
+ op->exampleFile(),
+ fd, // fileDef
+ op->line(), // startLine
+ -1, // endLine
+ FALSE, // inline fragment
+ 0, // memberDef
+ op->showLineNo() // show line numbers
+ );
if (fd) delete fd;
}
pushEnabled();
m_hide=TRUE;
}
- if (op->isLast())
+ if (op->isLast())
{
popEnabled();
- if (!m_hide) m_t << "</programlisting>";
+ if (!m_hide) m_t << "</programlisting>";
}
else
{
@@ -563,13 +573,13 @@ void XmlDocVisitor::visitPre(DocAutoListItem *)
m_t << "<listitem>";
}
-void XmlDocVisitor::visitPost(DocAutoListItem *)
+void XmlDocVisitor::visitPost(DocAutoListItem *)
{
if (m_hide) return;
m_t << "</listitem>";
}
-void XmlDocVisitor::visitPre(DocPara *)
+void XmlDocVisitor::visitPre(DocPara *)
{
if (m_hide) return;
m_t << "<para>";
@@ -597,21 +607,21 @@ void XmlDocVisitor::visitPre(DocSimpleSect *s)
m_t << "<simplesect kind=\"";
switch(s->type())
{
- case DocSimpleSect::See:
+ case DocSimpleSect::See:
m_t << "see"; break;
- case DocSimpleSect::Return:
+ case DocSimpleSect::Return:
m_t << "return"; break;
- case DocSimpleSect::Author:
+ case DocSimpleSect::Author:
m_t << "author"; break;
- case DocSimpleSect::Authors:
+ case DocSimpleSect::Authors:
m_t << "authors"; break;
- case DocSimpleSect::Version:
+ case DocSimpleSect::Version:
m_t << "version"; break;
- case DocSimpleSect::Since:
+ case DocSimpleSect::Since:
m_t << "since"; break;
- case DocSimpleSect::Date:
+ case DocSimpleSect::Date:
m_t << "date"; break;
- case DocSimpleSect::Note:
+ case DocSimpleSect::Note:
m_t << "note"; break;
case DocSimpleSect::Warning:
m_t << "warning"; break;
@@ -627,9 +637,9 @@ void XmlDocVisitor::visitPre(DocSimpleSect *s)
m_t << "remark"; break;
case DocSimpleSect::Attention:
m_t << "attention"; break;
- case DocSimpleSect::User:
+ case DocSimpleSect::User:
m_t << "par"; break;
- case DocSimpleSect::Rcs:
+ case DocSimpleSect::Rcs:
m_t << "rcs"; break;
case DocSimpleSect::Unknown: break;
}
@@ -672,7 +682,7 @@ void XmlDocVisitor::visitPre(DocSimpleListItem *)
m_t << "<listitem>";
}
-void XmlDocVisitor::visitPost(DocSimpleListItem *)
+void XmlDocVisitor::visitPost(DocSimpleListItem *)
{
if (m_hide) return;
m_t << "</listitem>\n";
@@ -689,7 +699,7 @@ void XmlDocVisitor::visitPre(DocSection *s)
m_t << "</title>" << endl;
}
-void XmlDocVisitor::visitPost(DocSection *s)
+void XmlDocVisitor::visitPost(DocSection *s)
{
m_t << "</sect" << s->level() << ">\n";
}
@@ -697,18 +707,18 @@ void XmlDocVisitor::visitPost(DocSection *s)
void XmlDocVisitor::visitPre(DocHtmlList *s)
{
if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
- m_t << "<orderedlist>\n";
- else
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "<orderedlist>\n";
+ else
m_t << "<itemizedlist>\n";
}
-void XmlDocVisitor::visitPost(DocHtmlList *s)
+void XmlDocVisitor::visitPost(DocHtmlList *s)
{
if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
- m_t << "</orderedlist>\n";
- else
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "</orderedlist>\n";
+ else
m_t << "</itemizedlist>\n";
}
@@ -718,7 +728,7 @@ void XmlDocVisitor::visitPre(DocHtmlListItem *)
m_t << "<listitem>\n";
}
-void XmlDocVisitor::visitPost(DocHtmlListItem *)
+void XmlDocVisitor::visitPost(DocHtmlListItem *)
{
if (m_hide) return;
m_t << "</listitem>\n";
@@ -730,7 +740,7 @@ void XmlDocVisitor::visitPre(DocHtmlDescList *)
m_t << "<variablelist>\n";
}
-void XmlDocVisitor::visitPost(DocHtmlDescList *)
+void XmlDocVisitor::visitPost(DocHtmlDescList *)
{
if (m_hide) return;
m_t << "</variablelist>\n";
@@ -742,7 +752,7 @@ void XmlDocVisitor::visitPre(DocHtmlDescTitle *)
m_t << "<varlistentry><term>";
}
-void XmlDocVisitor::visitPost(DocHtmlDescTitle *)
+void XmlDocVisitor::visitPost(DocHtmlDescTitle *)
{
if (m_hide) return;
m_t << "</term></varlistentry>\n";
@@ -754,7 +764,7 @@ void XmlDocVisitor::visitPre(DocHtmlDescData *)
m_t << "<listitem>";
}
-void XmlDocVisitor::visitPost(DocHtmlDescData *)
+void XmlDocVisitor::visitPost(DocHtmlDescData *)
{
if (m_hide) return;
m_t << "</listitem>\n";
@@ -763,11 +773,11 @@ void XmlDocVisitor::visitPost(DocHtmlDescData *)
void XmlDocVisitor::visitPre(DocHtmlTable *t)
{
if (m_hide) return;
- m_t << "<table rows=\"" << t->numRows()
+ m_t << "<table rows=\"" << t->numRows()
<< "\" cols=\"" << t->numColumns() << "\">" ;
}
-void XmlDocVisitor::visitPost(DocHtmlTable *)
+void XmlDocVisitor::visitPost(DocHtmlTable *)
{
if (m_hide) return;
m_t << "</table>\n";
@@ -779,7 +789,7 @@ void XmlDocVisitor::visitPre(DocHtmlRow *)
m_t << "<row>\n";
}
-void XmlDocVisitor::visitPost(DocHtmlRow *)
+void XmlDocVisitor::visitPost(DocHtmlRow *)
{
if (m_hide) return;
m_t << "</row>\n";
@@ -788,13 +798,51 @@ void XmlDocVisitor::visitPost(DocHtmlRow *)
void XmlDocVisitor::visitPre(DocHtmlCell *c)
{
if (m_hide) return;
- if (c->isHeading()) m_t << "<entry thead=\"yes\">"; else m_t << "<entry thead=\"no\">";
+ if (c->isHeading()) m_t << "<entry thead=\"yes\""; else m_t << "<entry thead=\"no\"";
+ HtmlAttribListIterator li(c->attribs());
+ HtmlAttrib *opt;
+ for (li.toFirst();(opt=li.current());++li)
+ {
+ if (opt->name=="colspan" || opt->name=="rowspan")
+ {
+ m_t << " " << opt->name << "=\"" << opt->value.toInt() << "\"";
+ }
+ else if (opt->name=="align" &&
+ (opt->value=="right" || opt->value=="left" || opt->value=="center"))
+ {
+ m_t << " align=\"" << opt->value << "\"";
+ }
+ else if (opt->name=="class") // handle markdown generated attributes
+ {
+ if (opt->value.left(13)=="markdownTable") // handle markdown generated attributes
+ {
+ if (opt->value.right(5)=="Right")
+ {
+ m_t << " align='right'";
+ }
+ else if (opt->value.right(4)=="Left")
+ {
+ m_t << " align='left'";
+ }
+ else if (opt->value.right(6)=="Center")
+ {
+ m_t << " align='center'";
+ }
+ // skip 'markdownTable*' value ending with "None"
+ }
+ else if (!opt->value.isEmpty())
+ {
+ m_t << " class=\"" << convertToXML(opt->value) << "\"";
+ }
+ }
+ }
+ m_t << ">";
}
-void XmlDocVisitor::visitPost(DocHtmlCell *)
+void XmlDocVisitor::visitPost(DocHtmlCell *)
{
if (m_hide) return;
- m_t << "</entry>";
+ m_t << "</entry>";
}
void XmlDocVisitor::visitPre(DocHtmlCaption *)
@@ -803,7 +851,7 @@ void XmlDocVisitor::visitPre(DocHtmlCaption *)
m_t << "<caption>";
}
-void XmlDocVisitor::visitPost(DocHtmlCaption *)
+void XmlDocVisitor::visitPost(DocHtmlCaption *)
{
if (m_hide) return;
m_t << "</caption>\n";
@@ -815,7 +863,7 @@ void XmlDocVisitor::visitPre(DocInternal *)
m_t << "<internal>";
}
-void XmlDocVisitor::visitPost(DocInternal *)
+void XmlDocVisitor::visitPost(DocInternal *)
{
if (m_hide) return;
m_t << "</internal>" << endl;
@@ -827,7 +875,7 @@ void XmlDocVisitor::visitPre(DocHRef *href)
m_t << "<ulink url=\"" << convertToXML(href->url(), TRUE) << "\">";
}
-void XmlDocVisitor::visitPost(DocHRef *)
+void XmlDocVisitor::visitPost(DocHRef *)
{
if (m_hide) return;
m_t << "</ulink>";
@@ -839,7 +887,7 @@ void XmlDocVisitor::visitPre(DocHtmlHeader *header)
m_t << "<heading level=\"" << header->level() << "\">";
}
-void XmlDocVisitor::visitPost(DocHtmlHeader *)
+void XmlDocVisitor::visitPost(DocHtmlHeader *)
{
if (m_hide) return;
m_t << "</heading>\n";
@@ -864,7 +912,7 @@ void XmlDocVisitor::visitPre(DocImage *img)
// copy the image to the output dir
FileDef *fd;
bool ambig;
- if (url.isEmpty() && (fd=findFileDef(Doxygen::imageNameDict,img->name(),ambig)))
+ if (url.isEmpty() && (fd=findFileDef(Doxygen::imageNameLinkedMap,img->name(),ambig)))
{
QFile inImage(fd->absFilePath());
QFile outImage(Config_getString(XML_OUTPUT)+"/"+baseName.data());
@@ -882,7 +930,7 @@ void XmlDocVisitor::visitPre(DocImage *img)
}
}
-void XmlDocVisitor::visitPost(DocImage *)
+void XmlDocVisitor::visitPost(DocImage *)
{
if (m_hide) return;
visitPostEnd(m_t, "image");
@@ -894,7 +942,7 @@ void XmlDocVisitor::visitPre(DocDotFile *df)
visitPreStart(m_t, "dotfile", FALSE, this, df->children(), df->file(), FALSE, DocImage::Html, df->width(), df->height());
}
-void XmlDocVisitor::visitPost(DocDotFile *)
+void XmlDocVisitor::visitPost(DocDotFile *)
{
if (m_hide) return;
visitPostEnd(m_t, "dotfile");
@@ -906,7 +954,7 @@ void XmlDocVisitor::visitPre(DocMscFile *df)
visitPreStart(m_t, "mscfile", FALSE, this, df->children(), df->file(), FALSE, DocImage::Html, df->width(), df->height());
}
-void XmlDocVisitor::visitPost(DocMscFile *)
+void XmlDocVisitor::visitPost(DocMscFile *)
{
if (m_hide) return;
visitPostEnd(m_t, "mscfile");
@@ -930,7 +978,7 @@ void XmlDocVisitor::visitPre(DocLink *lnk)
startLink(lnk->ref(),lnk->file(),lnk->anchor());
}
-void XmlDocVisitor::visitPost(DocLink *)
+void XmlDocVisitor::visitPost(DocLink *)
{
if (m_hide) return;
endLink();
@@ -939,14 +987,14 @@ void XmlDocVisitor::visitPost(DocLink *)
void XmlDocVisitor::visitPre(DocRef *ref)
{
if (m_hide) return;
- if (!ref->file().isEmpty())
+ if (!ref->file().isEmpty())
{
startLink(ref->ref(),ref->file(),ref->isSubPage() ? QCString() : ref->anchor());
}
if (!ref->hasLinkText()) filter(ref->targetTitle());
}
-void XmlDocVisitor::visitPost(DocRef *ref)
+void XmlDocVisitor::visitPost(DocRef *ref)
{
if (m_hide) return;
if (!ref->file().isEmpty()) endLink();
@@ -959,7 +1007,7 @@ void XmlDocVisitor::visitPre(DocSecRefItem *ref)
m_t << "<tocitem id=\"" << ref->file() << "_1" << ref->anchor() << "\">";
}
-void XmlDocVisitor::visitPost(DocSecRefItem *)
+void XmlDocVisitor::visitPost(DocSecRefItem *)
{
if (m_hide) return;
m_t << "</tocitem>" << endl;
@@ -971,7 +1019,7 @@ void XmlDocVisitor::visitPre(DocSecRefList *)
m_t << "<toclist>" << endl;
}
-void XmlDocVisitor::visitPost(DocSecRefList *)
+void XmlDocVisitor::visitPost(DocSecRefList *)
{
if (m_hide) return;
m_t << "</toclist>" << endl;
@@ -983,7 +1031,7 @@ void XmlDocVisitor::visitPost(DocSecRefList *)
// m_t << "<language langid=\"" << l->id() << "\">";
//}
//
-//void XmlDocVisitor::visitPost(DocLanguage *)
+//void XmlDocVisitor::visitPost(DocLanguage *)
//{
// if (m_hide) return;
// m_t << "</language>" << endl;
@@ -995,13 +1043,13 @@ void XmlDocVisitor::visitPre(DocParamSect *s)
m_t << "<parameterlist kind=\"";
switch(s->type())
{
- case DocParamSect::Param:
+ case DocParamSect::Param:
m_t << "param"; break;
- case DocParamSect::RetVal:
+ case DocParamSect::RetVal:
m_t << "retval"; break;
- case DocParamSect::Exception:
+ case DocParamSect::Exception:
m_t << "exception"; break;
- case DocParamSect::TemplateParam:
+ case DocParamSect::TemplateParam:
m_t << "templateparam"; break;
default:
ASSERT(0);
@@ -1028,18 +1076,18 @@ void XmlDocVisitor::visitPre(DocParamList *pl)
{
if (pl->paramTypes().count()>0)
{
- QListIterator<DocNode> li(pl->paramTypes());
+ QListIterator<DocNode> li2(pl->paramTypes());
DocNode *type;
m_t << "<parametertype>";
- for (li.toFirst();(type=li.current());++li)
+ for (li2.toFirst();(type=li2.current());++li2)
{
if (type->kind()==DocNode::Kind_Word)
{
- visit((DocWord*)type);
+ visit((DocWord*)type);
}
else if (type->kind()==DocNode::Kind_LinkedWord)
{
- visit((DocLinkedWord*)type);
+ visit((DocLinkedWord*)type);
}
else if (type->kind()==DocNode::Kind_Sep)
{
@@ -1070,11 +1118,11 @@ void XmlDocVisitor::visitPre(DocParamList *pl)
m_t << ">";
if (param->kind()==DocNode::Kind_Word)
{
- visit((DocWord*)param);
+ visit((DocWord*)param);
}
else if (param->kind()==DocNode::Kind_LinkedWord)
{
- visit((DocLinkedWord*)param);
+ visit((DocLinkedWord*)param);
}
m_t << "</parametername>" << endl;
}
@@ -1116,7 +1164,7 @@ void XmlDocVisitor::visitPre(DocInternalRef *ref)
startLink(0,ref->file(),ref->anchor());
}
-void XmlDocVisitor::visitPost(DocInternalRef *)
+void XmlDocVisitor::visitPost(DocInternalRef *)
{
if (m_hide) return;
endLink();
@@ -1165,7 +1213,7 @@ void XmlDocVisitor::visitPost(DocParBlock *)
void XmlDocVisitor::filter(const char *str)
-{
+{
m_t << convertToXML(str);
}
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 794e5a2..70fcd70 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -3,8 +3,8 @@
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -154,7 +154,9 @@ static void writeXMLHeader(FTextStream &t)
t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
t << "<doxygen xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
t << "xsi:noNamespaceSchemaLocation=\"compound.xsd\" ";
- t << "version=\"" << getVersion() << "\">" << endl;
+ t << "version=\"" << getDoxygenVersion() << "\" ";
+ t << "xml:lang=\"" << theTranslator->trISOLang() << "\"";
+ t << ">" << endl;
}
static void writeCombineScript()
@@ -178,7 +180,7 @@ static void writeCombineScript()
"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n"
" <xsl:output method=\"xml\" version=\"1.0\" indent=\"no\" standalone=\"yes\" />\n"
" <xsl:template match=\"/\">\n"
- " <doxygen version=\"{doxygenindex/@version}\">\n"
+ " <doxygen version=\"{doxygenindex/@version}\" xml:lang=\"{doxygenindex/@xml:lang}\">\n"
" <!-- Load all doxygen generated xml files -->\n"
" <xsl:for-each select=\"doxygenindex/compound\">\n"
" <xsl:copy-of select=\"document( concat( @refid, '.xml' ) )/doxygen/*\" />\n"
@@ -195,7 +197,7 @@ void writeXMLLink(FTextStream &t,const char *extRef,const char *compoundId,
t << "<ref refid=\"" << compoundId;
if (anchorId) t << "_1" << anchorId;
t << "\" kindref=\"";
- if (anchorId) t << "member"; else t << "compound";
+ if (anchorId) t << "member"; else t << "compound";
t << "\"";
if (extRef) t << " external=\"" << extRef << "\"";
if (tooltip) t << " tooltip=\"" << convertToXML(tooltip) << "\"";
@@ -211,7 +213,7 @@ class TextGeneratorXMLImpl : public TextGeneratorIntf
TextGeneratorXMLImpl(FTextStream &t): m_t(t) {}
void writeString(const char *s,bool /*keepSpaces*/) const
{
- writeXMLString(m_t,s);
+ writeXMLString(m_t,s);
}
void writeBreak(int) const {}
void writeLink(const char *extRef,const char *file,
@@ -224,6 +226,7 @@ class TextGeneratorXMLImpl : public TextGeneratorIntf
FTextStream &m_t;
};
+//-------------------------------------------------------------------------------------------
/** Generator for producing XML formatted source code. */
void XMLCodeGenerator::codify(const char *text)
@@ -338,6 +341,18 @@ void XMLCodeGenerator::finish()
if (m_insideCodeLine) endCodeLine();
}
+void XMLCodeGenerator::startCodeFragment(const char *)
+{
+ m_t << " <programlisting>" << endl;
+}
+
+void XMLCodeGenerator::endCodeFragment(const char *)
+{
+ m_t << " </programlisting>" << endl;
+}
+
+//-------------------------------------------------------------------------------------------
+
static void writeTemplateArgumentList(FTextStream &t,
const ArgumentList &al,
const Definition *scope,
@@ -401,7 +416,8 @@ static void writeXMLDocBlock(FTextStream &t,
QCString stext = text.stripWhiteSpace();
if (stext.isEmpty()) return;
// convert the documentation string into an abstract syntax tree
- DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
+ DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE,
+ 0,FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
// create a code generator
XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
// create a parse tree visitor for XML
@@ -412,16 +428,17 @@ static void writeXMLDocBlock(FTextStream &t,
delete visitor;
delete xmlCodeGen;
delete root;
-
+
}
void writeXMLCodeBlock(FTextStream &t,FileDef *fd)
{
- CodeParserInterface &intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
+ auto intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension());
- intf.resetCodeParserState();
+ intf->resetCodeParserState();
XMLCodeGenerator *xmlGen = new XMLCodeGenerator(t);
- intf.parseCode(*xmlGen, // codeOutIntf
+ xmlGen->startCodeFragment("DoxyCode");
+ intf->parseCode(*xmlGen, // codeOutIntf
0, // scopeName
fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES)),
langExt, // lang
@@ -434,6 +451,7 @@ void writeXMLCodeBlock(FTextStream &t,FileDef *fd)
0, // memberDef
TRUE // showLineNumbers
);
+ xmlGen->endCodeFragment("DoxyCode");
xmlGen->finish();
delete xmlGen;
}
@@ -448,7 +466,7 @@ static void writeMemberReference(FTextStream &t,const Definition *def,const Memb
}
t << " <" << tagName << " refid=\"";
t << rmd->getOutputFileBase() << "_1" << rmd->anchor() << "\"";
- if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
+ if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
{
t << " compoundref=\"" << rmd->getBodyDef()->getOutputFileBase() << "\"";
t << " startline=\"" << rmd->getStartBodyLine() << "\"";
@@ -458,12 +476,13 @@ static void writeMemberReference(FTextStream &t,const Definition *def,const Memb
}
}
t << ">" << convertToXML(name) << "</" << tagName << ">" << endl;
-
+
}
static void stripQualifiers(QCString &typeStr)
{
bool done=FALSE;
+ typeStr.stripPrefix("friend ");
while (!done)
{
if (typeStr.stripPrefix("static "));
@@ -477,18 +496,18 @@ static void stripQualifiers(QCString &typeStr)
static QCString classOutputFileBase(const ClassDef *cd)
{
//static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
- //if (inlineGroupedClasses && cd->partOfGroups()!=0)
+ //if (inlineGroupedClasses && cd->partOfGroups()!=0)
return cd->getOutputFileBase();
- //else
+ //else
// return cd->getOutputFileBase();
}
static QCString memberOutputFileBase(const MemberDef *md)
{
//static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
- //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
+ //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
// return md->getClassDef()->getXmlOutputFileBase();
- //else
+ //else
// return md->getOutputFileBase();
return md->getOutputFileBase();
}
@@ -506,11 +525,11 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
// + source definition
// + source references
// + source referenced by
- // - body code
- // + template arguments
+ // - body code
+ // + template arguments
// (templateArguments(), definitionTemplateParameterLists())
// - call graph
-
+
// enum values are written as part of the enum
if (md->memberType()==MemberType_EnumValue) return;
if (md->isHidden()) return;
@@ -540,16 +559,16 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
case MemberType_Dictionary: memType="dictionary"; break;
}
- ti << " <member refid=\"" << memberOutputFileBase(md)
- << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>"
+ ti << " <member refid=\"" << memberOutputFileBase(md)
+ << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>"
<< convertToXML(md->name()) << "</name></member>" << endl;
-
+
QCString scopeName;
- if (md->getClassDef())
+ if (md->getClassDef())
scopeName=md->getClassDef()->name();
- else if (md->getNamespaceDef())
+ else if (md->getNamespaceDef())
scopeName=md->getNamespaceDef()->name();
-
+
t << " <memberdef kind=\"";
//enum { define_t,variable_t,typedef_t,enum_t,function_t } xmlType = function_t;
t << memType << "\" id=\"";
@@ -586,7 +605,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
{
const ArgumentList &al = md->argumentList();
t << " const=\"";
- if (al.constSpecifier) t << "yes"; else t << "no";
+ if (al.constSpecifier()) t << "yes"; else t << "no";
t << "\"";
t << " explicit=\"";
@@ -597,10 +616,10 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
if (md->isInline()) t << "yes"; else t << "no";
t << "\"";
- if (al.refQualifier!=RefQualifierNone)
+ if (al.refQualifier()!=RefQualifierNone)
{
t << " refqual=\"";
- if (al.refQualifier==RefQualifierLValue) t << "lvalue"; else t << "rvalue";
+ if (al.refQualifier()==RefQualifierLValue) t << "lvalue"; else t << "rvalue";
t << "\"";
}
@@ -634,7 +653,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
t << " noexcept=\"yes\"";
}
- if (al.volatileSpecifier)
+ if (al.volatileSpecifier())
{
t << " volatile=\"yes\"";
}
@@ -661,12 +680,12 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
{
//ArgumentList *al = md->argumentList();
//t << " volatile=\"";
- //if (al && al->volatileSpecifier) t << "yes"; else t << "no";
+ //if (al && al->volatileSpecifier) t << "yes"; else t << "no";
t << " mutable=\"";
if (md->isMutable()) t << "yes"; else t << "no";
t << "\"";
-
+
if (md->isInitonly())
{
t << " initonly=\"yes\"";
@@ -796,7 +815,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
}
t << " <name>" << convertToXML(md->name()) << "</name>" << endl;
-
+
if (md->memberType() == MemberType_Property)
{
if (md->isReadable())
@@ -811,11 +830,11 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
if (bitfield.at(0)==':') bitfield=bitfield.mid(1);
t << " <bitfield>" << convertToXML(bitfield) << "</bitfield>" << endl;
}
-
+
const MemberDef *rmd = md->reimplements();
if (rmd)
{
- t << " <reimplements refid=\""
+ t << " <reimplements refid=\""
<< memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
<< convertToXML(rmd->name()) << "</reimplements>" << endl;
}
@@ -825,13 +844,21 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
MemberListIterator mli(*rbml);
for (mli.toFirst();(rmd=mli.current());++mli)
{
- t << " <reimplementedby refid=\""
+ t << " <reimplementedby refid=\""
<< memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
<< convertToXML(rmd->name()) << "</reimplementedby>" << endl;
}
}
- if (isFunc) //function
+ if (md->isFriendClass()) // for friend classes we show a link to the class as a "parameter"
+ {
+ t << " <param>" << endl;
+ t << " <type>";
+ linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->name());
+ t << "</type>" << endl;
+ t << " </param>" << endl;
+ }
+ else if (isFunc) //function
{
const ArgumentList &declAl = md->declArgumentList();
const ArgumentList &defAl = md->argumentList();
@@ -863,7 +890,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
if (!a.name.isEmpty())
{
t << " <declname>";
- writeXMLString(t,a.name);
+ writeXMLString(t,a.name);
t << "</declname>" << endl;
}
if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name)
@@ -874,8 +901,8 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
}
if (!a.array.isEmpty())
{
- t << " <array>";
- writeXMLString(t,a.array);
+ t << " <array>";
+ writeXMLString(t,a.array);
t << "</array>" << endl;
}
if (!a.defval.isEmpty())
@@ -895,7 +922,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
}
}
}
- else if (md->memberType()==MemberType_Define &&
+ else if (md->memberType()==MemberType_Define &&
md->argsString()) // define
{
if (md->argumentList().empty()) // special case for "foo()" to
@@ -925,7 +952,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->excpString());
t << "</exceptions>" << endl;
}
-
+
if (md->memberType()==MemberType_Enumeration) // enum
{
const MemberList *enumFields = md->enumFieldList();
@@ -979,9 +1006,9 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
t << " </inbodydescription>" << endl;
if (md->getDefLine()!=-1)
{
- t << " <location file=\""
+ t << " <location file=\""
<< convertToXML(stripFromPath(md->getDefFileName())) << "\" line=\""
- << md->getDefLine() << "\" column=\""
+ << md->getDefLine() << "\" column=\""
<< md->getDefColumn() << "\"" ;
if (md->getStartBodyLine()!=-1)
{
@@ -990,7 +1017,7 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
{
t << " bodyfile=\"" << convertToXML(stripFromPath(bodyDef->absFilePath())) << "\"";
}
- t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\""
+ t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\""
<< md->getEndBodyLine() << "\"";
}
if (md->getDeclLine()!=-1)
@@ -1003,27 +1030,17 @@ static void generateXMLForMember(const MemberDef *md,FTextStream &ti,FTextStream
}
//printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
- MemberSDict *mdict = md->getReferencesMembers();
- if (mdict)
+ auto refList = md->getReferencesMembers();
+ for (const auto &refmd : refList)
{
- MemberSDict::Iterator mdi(*mdict);
- const MemberDef *rmd;
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- writeMemberReference(t,def,rmd,"references");
- }
+ writeMemberReference(t,def,refmd,"references");
}
- mdict = md->getReferencedByMembers();
- if (mdict)
+ auto refByList = md->getReferencedByMembers();
+ for (const auto &refmd : refByList)
{
- MemberSDict::Iterator mdi(*mdict);
- const MemberDef *rmd;
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- writeMemberReference(t,def,rmd,"referencedby");
- }
+ writeMemberReference(t,def,refmd,"referencedby");
}
-
+
t << " </memberdef>" << endl;
}
@@ -1037,7 +1054,7 @@ static bool memberVisible(const Definition *d,const MemberDef *md)
}
static void generateXMLSection(const Definition *d,FTextStream &ti,FTextStream &t,
- MemberList *ml,const char *kind,const char *header=0,
+ const MemberList *ml,const char *kind,const char *header=0,
const char *documentation=0)
{
if (ml==0) return;
@@ -1078,89 +1095,73 @@ static void generateXMLSection(const Definition *d,FTextStream &ti,FTextStream &
static void writeListOfAllMembers(const ClassDef *cd,FTextStream &t)
{
t << " <listofallmembers>" << endl;
- if (cd->memberNameInfoSDict())
+ for (auto &mni : cd->memberNameInfoLinkedMap())
{
- MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
- MemberNameInfo *mni;
- for (mnii.toFirst();(mni=mnii.current());++mnii)
+ for (auto &mi : *mni)
{
- MemberNameInfoIterator mii(*mni);
- MemberInfo *mi;
- for (mii.toFirst();(mi=mii.current());++mii)
+ const MemberDef *md=mi->memberDef();
+ if (!md->isAnonymous())
{
- const MemberDef *md=mi->memberDef;
- if (!md->isAnonymous())
+ Protection prot = mi->prot();
+ Specifier virt=md->virtualness();
+ t << " <member refid=\"" << memberOutputFileBase(md) << "_1" <<
+ md->anchor() << "\" prot=\"";
+ switch (prot)
{
- Protection prot = mi->prot;
- Specifier virt=md->virtualness();
- t << " <member refid=\"" << memberOutputFileBase(md) << "_1" <<
- md->anchor() << "\" prot=\"";
- switch (prot)
- {
- case Public: t << "public"; break;
- case Protected: t << "protected"; break;
- case Private: t << "private"; break;
- case Package: t << "package"; break;
- }
- t << "\" virt=\"";
- switch(virt)
- {
- case Normal: t << "non-virtual"; break;
- case Virtual: t << "virtual"; break;
- case Pure: t << "pure-virtual"; break;
- }
- t << "\"";
- if (!mi->ambiguityResolutionScope.isEmpty())
- {
- t << " ambiguityscope=\"" << convertToXML(mi->ambiguityResolutionScope) << "\"";
- }
- t << "><scope>" << convertToXML(cd->name()) << "</scope><name>" <<
- convertToXML(md->name()) << "</name></member>" << endl;
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: t << "package"; break;
+ }
+ t << "\" virt=\"";
+ switch(virt)
+ {
+ case Normal: t << "non-virtual"; break;
+ case Virtual: t << "virtual"; break;
+ case Pure: t << "pure-virtual"; break;
}
+ t << "\"";
+ if (!mi->ambiguityResolutionScope().isEmpty())
+ {
+ t << " ambiguityscope=\"" << convertToXML(mi->ambiguityResolutionScope()) << "\"";
+ }
+ t << "><scope>" << convertToXML(cd->name()) << "</scope><name>" <<
+ convertToXML(md->name()) << "</name></member>" << endl;
}
}
}
t << " </listofallmembers>" << endl;
}
-static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
+static void writeInnerClasses(const ClassLinkedRefMap &cl,FTextStream &t)
{
- if (cl)
+ for (const auto &cd : cl)
{
- ClassSDict::Iterator cli(*cl);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
+ if (!cd->isHidden() && !cd->isAnonymous())
{
- if (!cd->isHidden() && !cd->isAnonymous())
+ t << " <innerclass refid=\"" << classOutputFileBase(cd)
+ << "\" prot=\"";
+ switch(cd->protection())
{
- t << " <innerclass refid=\"" << classOutputFileBase(cd)
- << "\" prot=\"";
- switch(cd->protection())
- {
- case Public: t << "public"; break;
- case Protected: t << "protected"; break;
- case Private: t << "private"; break;
- case Package: t << "package"; break;
- }
- t << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: t << "package"; break;
}
+ t << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
}
}
}
-static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
+static void writeInnerNamespaces(const NamespaceLinkedRefMap &nl,FTextStream &t)
{
- if (nl)
+ for (const auto &nd : nl)
{
- NamespaceSDict::Iterator nli(*nl);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ if (!nd->isHidden() && !nd->isAnonymous())
{
- if (!nd->isHidden() && !nd->isAnonymous())
- {
- t << " <innernamespace refid=\"" << nd->getOutputFileBase()
- << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
- }
+ t << " <innernamespace refid=\"" << nd->getOutputFileBase()
+ << "\"" << (nd->isInline() ? " inline=\"yes\"" : "")
+ << ">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
}
}
}
@@ -1173,42 +1174,32 @@ static void writeInnerFiles(const FileList *fl,FTextStream &t)
FileDef *fd;
for (fli.toFirst();(fd=fli.current());++fli)
{
- t << " <innerfile refid=\"" << fd->getOutputFileBase()
+ t << " <innerfile refid=\"" << fd->getOutputFileBase()
<< "\">" << convertToXML(fd->name()) << "</innerfile>" << endl;
}
}
}
-static void writeInnerPages(const PageSDict *pl,FTextStream &t)
+static void writeInnerPages(const PageLinkedRefMap &pl,FTextStream &t)
{
- if (pl)
+ for (const auto &pd : pl)
{
- PageSDict::Iterator pli(*pl);
- PageDef *pd;
- for (pli.toFirst();(pd=pli.current());++pli)
+ t << " <innerpage refid=\"" << pd->getOutputFileBase();
+ if (pd->getGroupDef())
{
- t << " <innerpage refid=\"" << pd->getOutputFileBase();
- if (pd->getGroupDef())
- {
- t << "_" << pd->name();
- }
- t << "\">" << convertToXML(pd->title()) << "</innerpage>" << endl;
+ t << "_" << pd->name();
}
+ t << "\">" << convertToXML(pd->title()) << "</innerpage>" << endl;
}
}
-static void writeInnerGroups(const GroupList *gl,FTextStream &t)
+static void writeInnerGroups(const GroupList &gl,FTextStream &t)
{
- if (gl)
+ for (const auto &sgd : gl)
{
- GroupListIterator gli(*gl);
- const GroupDef *sgd;
- for (gli.toFirst();(sgd=gli.current());++gli)
- {
- t << " <innergroup refid=\"" << sgd->getOutputFileBase()
- << "\">" << convertToXML(sgd->groupTitle())
- << "</innergroup>" << endl;
- }
+ t << " <innergroup refid=\"" << sgd->getOutputFileBase()
+ << "\">" << convertToXML(sgd->groupTitle())
+ << "</innergroup>" << endl;
}
}
@@ -1216,16 +1207,14 @@ static void writeInnerDirs(const DirList *dl,FTextStream &t)
{
if (dl)
{
- QListIterator<DirDef> subdirs(*dl);
- DirDef *subdir;
- for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
+ for(const auto subdir : *dl)
{
- t << " <innerdir refid=\"" << subdir->getOutputFileBase()
+ t << " <innerdir refid=\"" << subdir->getOutputFileBase()
<< "\">" << convertToXML(subdir->displayName()) << "</innerdir>" << endl;
}
}
}
-
+
static void generateXMLForClass(const ClassDef *cd,FTextStream &ti)
{
// + brief description
@@ -1252,10 +1241,10 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti)
msg("Generating XML output for class %s\n",cd->name().data());
- ti << " <compound refid=\"" << classOutputFileBase(cd)
+ ti << " <compound refid=\"" << classOutputFileBase(cd)
<< "\" kind=\"" << cd->compoundTypeString()
<< "\"><name>" << convertToXML(cd->name()) << "</name>" << endl;
-
+
QCString outputDirectory = Config_getString(XML_OUTPUT);
QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
QFile f(fileName);
@@ -1268,8 +1257,8 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti)
//t.setEncoding(FTextStream::UnicodeUTF8);
writeXMLHeader(t);
- t << " <compounddef id=\""
- << classOutputFileBase(cd) << "\" kind=\""
+ t << " <compounddef id=\""
+ << classOutputFileBase(cd) << "\" kind=\""
<< cd->compoundTypeString() << "\" language=\""
<< langToString(cd->getLanguage()) << "\" prot=\"";
switch (cd->protection())
@@ -1283,76 +1272,66 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti)
if (cd->isSealed()) t << "\" sealed=\"yes";
if (cd->isAbstract()) t << "\" abstract=\"yes";
t << "\">" << endl;
- t << " <compoundname>";
- writeXMLString(t,cd->name());
+ t << " <compoundname>";
+ writeXMLString(t,cd->name());
t << "</compoundname>" << endl;
- if (cd->baseClasses())
+ for (const auto &bcd : cd->baseClasses())
{
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ t << " <basecompoundref ";
+ if (bcd.classDef->isLinkable())
{
- t << " <basecompoundref ";
- if (bcd->classDef->isLinkable())
- {
- t << "refid=\"" << classOutputFileBase(bcd->classDef) << "\" ";
- }
- t << "prot=\"";
- switch (bcd->prot)
- {
- case Public: t << "public"; break;
- case Protected: t << "protected"; break;
- case Private: t << "private"; break;
- case Package: ASSERT(0); break;
- }
- t << "\" virt=\"";
- switch(bcd->virt)
- {
- case Normal: t << "non-virtual"; break;
- case Virtual: t << "virtual"; break;
- case Pure: t <<"pure-virtual"; break;
- }
- t << "\">";
- if (!bcd->templSpecifiers.isEmpty())
- {
- t << convertToXML(
- insertTemplateSpecifierInScope(
- bcd->classDef->name(),bcd->templSpecifiers)
- );
- }
- else
- {
- t << convertToXML(bcd->classDef->displayName());
- }
- t << "</basecompoundref>" << endl;
+ t << "refid=\"" << classOutputFileBase(bcd.classDef) << "\" ";
+ }
+ t << "prot=\"";
+ switch (bcd.prot)
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: ASSERT(0); break;
+ }
+ t << "\" virt=\"";
+ switch(bcd.virt)
+ {
+ case Normal: t << "non-virtual"; break;
+ case Virtual: t << "virtual"; break;
+ case Pure: t <<"pure-virtual"; break;
}
+ t << "\">";
+ if (!bcd.templSpecifiers.isEmpty())
+ {
+ t << convertToXML(
+ insertTemplateSpecifierInScope(
+ bcd.classDef->name(),bcd.templSpecifiers)
+ );
+ }
+ else
+ {
+ t << convertToXML(bcd.classDef->displayName());
+ }
+ t << "</basecompoundref>" << endl;
}
- if (cd->subClasses())
+ for (const auto &bcd : cd->subClasses())
{
- BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ t << " <derivedcompoundref refid=\""
+ << classOutputFileBase(bcd.classDef)
+ << "\" prot=\"";
+ switch (bcd.prot)
{
- t << " <derivedcompoundref refid=\""
- << classOutputFileBase(bcd->classDef)
- << "\" prot=\"";
- switch (bcd->prot)
- {
- case Public: t << "public"; break;
- case Protected: t << "protected"; break;
- case Private: t << "private"; break;
- case Package: ASSERT(0); break;
- }
- t << "\" virt=\"";
- switch(bcd->virt)
- {
- case Normal: t << "non-virtual"; break;
- case Virtual: t << "virtual"; break;
- case Pure: t << "pure-virtual"; break;
- }
- t << "\">" << convertToXML(bcd->classDef->displayName())
- << "</derivedcompoundref>" << endl;
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: ASSERT(0); break;
+ }
+ t << "\" virt=\"";
+ switch (bcd.virt)
+ {
+ case Normal: t << "non-virtual"; break;
+ case Virtual: t << "virtual"; break;
+ case Pure: t << "pure-virtual"; break;
}
+ t << "\">" << convertToXML(bcd.classDef->displayName())
+ << "</derivedcompoundref>" << endl;
}
IncludeInfo *ii=cd->includeInfo();
@@ -1373,27 +1352,20 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti)
}
}
- writeInnerClasses(cd->getClassSDict(),t);
+ writeInnerClasses(cd->getClasses(),t);
writeTemplateList(cd,t);
- if (cd->getMemberGroupSDict())
+ for (const auto &mg : cd->getMemberGroups())
{
- MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateXMLSection(cd,ti,t,mg->members(),"user-defined",mg->header(),
- mg->documentation());
- }
+ generateXMLSection(cd,ti,t,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
}
- QListIterator<MemberList> mli(cd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : cd->getMemberLists())
{
if ((ml->listType()&MemberListType_detailedLists)==0)
{
- generateXMLSection(cd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
+ generateXMLSection(cd,ti,t,ml.get(),g_xmlSectionMapper.find(ml->listType()));
}
}
@@ -1417,9 +1389,9 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti)
collaborationGraph.writeXML(t);
t << " </collaborationgraph>" << endl;
}
- t << " <location file=\""
+ t << " <location file=\""
<< convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\""
- << cd->getDefLine() << "\"" << " column=\""
+ << cd->getDefLine() << "\"" << " column=\""
<< cd->getDefColumn() << "\"" ;
if (cd->getStartBodyLine()!=-1)
{
@@ -1428,7 +1400,7 @@ static void generateXMLForClass(const ClassDef *cd,FTextStream &ti)
{
t << " bodyfile=\"" << convertToXML(stripFromPath(bodyDef->absFilePath())) << "\"";
}
- t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
+ t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
<< cd->getEndBodyLine() << "\"";
}
t << "/>" << endl;
@@ -1452,10 +1424,10 @@ static void generateXMLForNamespace(const NamespaceDef *nd,FTextStream &ti)
if (nd->isReference() || nd->isHidden()) return; // skip external references
- ti << " <compound refid=\"" << nd->getOutputFileBase()
- << "\" kind=\"namespace\"" << "><name>"
+ ti << " <compound refid=\"" << nd->getOutputFileBase()
+ << "\" kind=\"namespace\"" << "><name>"
<< convertToXML(nd->name()) << "</name>" << endl;
-
+
QCString outputDirectory = Config_getString(XML_OUTPUT);
QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
QFile f(fileName);
@@ -1466,36 +1438,31 @@ static void generateXMLForNamespace(const NamespaceDef *nd,FTextStream &ti)
}
FTextStream t(&f);
//t.setEncoding(FTextStream::UnicodeUTF8);
-
+
writeXMLHeader(t);
- t << " <compounddef id=\"" << nd->getOutputFileBase()
- << "\" kind=\"namespace\" language=\""
+ t << " <compounddef id=\"" << nd->getOutputFileBase()
+ << "\" kind=\"namespace\" "
+ << (nd->isInline()?"inline=\"yes\" ":"")
+ << "language=\""
<< langToString(nd->getLanguage()) << "\">" << endl;
t << " <compoundname>";
writeXMLString(t,nd->name());
t << "</compoundname>" << endl;
- writeInnerClasses(nd->getClassSDict(),t);
- writeInnerNamespaces(nd->getNamespaceSDict(),t);
+ writeInnerClasses(nd->getClasses(),t);
+ writeInnerNamespaces(nd->getNamespaces(),t);
- if (nd->getMemberGroupSDict())
+ for (const auto &mg : nd->getMemberGroups())
{
- MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateXMLSection(nd,ti,t,mg->members(),"user-defined",mg->header(),
+ generateXMLSection(nd,ti,t,mg->members(),"user-defined",mg->header(),
mg->documentation());
- }
}
- QListIterator<MemberList> mli(nd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : nd->getMemberLists())
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
- generateXMLSection(nd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
+ generateXMLSection(nd,ti,t,ml.get(),g_xmlSectionMapper.find(ml->listType()));
}
}
@@ -1530,13 +1497,13 @@ static void generateXMLForFile(FileDef *fd,FTextStream &ti)
// + source code
// + location
// - number of lines
-
+
if (fd->isReference()) return; // skip external references
-
- ti << " <compound refid=\"" << fd->getOutputFileBase()
- << "\" kind=\"file\"><name>" << convertToXML(fd->name())
+
+ ti << " <compound refid=\"" << fd->getOutputFileBase()
+ << "\" kind=\"file\"><name>" << convertToXML(fd->name())
<< "</name>" << endl;
-
+
QCString outputDirectory = Config_getString(XML_OUTPUT);
QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
QFile f(fileName);
@@ -1550,7 +1517,7 @@ static void generateXMLForFile(FileDef *fd,FTextStream &ti)
writeXMLHeader(t);
t << " <compounddef id=\"" << fd->getOutputFileBase()
- << "\" kind=\"file\" language=\""
+ << "\" kind=\"file\" language=\""
<< langToString(fd->getLanguage()) << "\">" << endl;
t << " <compoundname>";
writeXMLString(t,fd->name());
@@ -1606,33 +1573,20 @@ static void generateXMLForFile(FileDef *fd,FTextStream &ti)
t << " </invincdepgraph>" << endl;
}
- if (fd->getClassSDict())
- {
- writeInnerClasses(fd->getClassSDict(),t);
- }
- if (fd->getNamespaceSDict())
- {
- writeInnerNamespaces(fd->getNamespaceSDict(),t);
- }
+ writeInnerClasses(fd->getClasses(),t);
+ writeInnerNamespaces(fd->getNamespaces(),t);
- if (fd->getMemberGroupSDict())
+ for (const auto &mg : fd->getMemberGroups())
{
- MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateXMLSection(fd,ti,t,mg->members(),"user-defined",mg->header(),
- mg->documentation());
- }
+ generateXMLSection(fd,ti,t,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
}
- QListIterator<MemberList> mli(fd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : fd->getMemberLists())
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
- generateXMLSection(fd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
+ generateXMLSection(fd,ti,t,ml.get(),g_xmlSectionMapper.find(ml->listType()));
}
}
@@ -1644,9 +1598,7 @@ static void generateXMLForFile(FileDef *fd,FTextStream &ti)
t << " </detaileddescription>" << endl;
if (Config_getBool(XML_PROGRAMLISTING))
{
- t << " <programlisting>" << endl;
writeXMLCodeBlock(t,fd);
- t << " </programlisting>" << endl;
}
t << " <location file=\"" << convertToXML(stripFromPath(fd->getDefFileName())) << "\"/>" << endl;
t << " </compounddef>" << endl;
@@ -1671,9 +1623,9 @@ static void generateXMLForGroup(const GroupDef *gd,FTextStream &ti)
if (gd->isReference()) return; // skip external references
- ti << " <compound refid=\"" << gd->getOutputFileBase()
+ ti << " <compound refid=\"" << gd->getOutputFileBase()
<< "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>" << endl;
-
+
QCString outputDirectory = Config_getString(XML_OUTPUT);
QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
QFile f(fileName);
@@ -1686,7 +1638,7 @@ static void generateXMLForGroup(const GroupDef *gd,FTextStream &ti)
FTextStream t(&f);
//t.setEncoding(FTextStream::UnicodeUTF8);
writeXMLHeader(t);
- t << " <compounddef id=\""
+ t << " <compounddef id=\""
<< gd->getOutputFileBase() << "\" kind=\"group\">" << endl;
t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>" << endl;
t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
@@ -1697,24 +1649,17 @@ static void generateXMLForGroup(const GroupDef *gd,FTextStream &ti)
writeInnerPages(gd->getPages(),t);
writeInnerGroups(gd->getSubGroups(),t);
- if (gd->getMemberGroupSDict())
+ for (const auto &mg : gd->getMemberGroups())
{
- MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateXMLSection(gd,ti,t,mg->members(),"user-defined",mg->header(),
- mg->documentation());
- }
+ generateXMLSection(gd,ti,t,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
}
- QListIterator<MemberList> mli(gd->getMemberLists());
- MemberList *ml;
- for (mli.toFirst();(ml=mli.current());++mli)
+ for (const auto &ml : gd->getMemberLists())
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
- generateXMLSection(gd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
+ generateXMLSection(gd,ti,t,ml.get(),g_xmlSectionMapper.find(ml->listType()));
}
}
@@ -1733,8 +1678,8 @@ static void generateXMLForGroup(const GroupDef *gd,FTextStream &ti)
static void generateXMLForDir(DirDef *dd,FTextStream &ti)
{
if (dd->isReference()) return; // skip external references
- ti << " <compound refid=\"" << dd->getOutputFileBase()
- << "\" kind=\"dir\"><name>" << convertToXML(dd->displayName())
+ ti << " <compound refid=\"" << dd->getOutputFileBase()
+ << "\" kind=\"dir\"><name>" << convertToXML(dd->displayName())
<< "</name>" << endl;
QCString outputDirectory = Config_getString(XML_OUTPUT);
@@ -1749,7 +1694,7 @@ static void generateXMLForDir(DirDef *dd,FTextStream &ti)
FTextStream t(&f);
//t.setEncoding(FTextStream::UnicodeUTF8);
writeXMLHeader(t);
- t << " <compounddef id=\""
+ t << " <compounddef id=\""
<< dd->getOutputFileBase() << "\" kind=\"dir\">" << endl;
t << " <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>" << endl;
@@ -1779,18 +1724,18 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
const char *kindName = isExample ? "example" : "page";
if (pd->isReference()) return;
-
+
QCString pageName = pd->getOutputFileBase();
if (pd->getGroupDef())
{
pageName+=(QCString)"_"+pd->name();
}
if (pageName=="index") pageName="indexpage"; // to prevent overwriting the generated index page.
-
+
ti << " <compound refid=\"" << pageName
- << "\" kind=\"" << kindName << "\"><name>" << convertToXML(pd->name())
+ << "\" kind=\"" << kindName << "\"><name>" << convertToXML(pd->name())
<< "</name>" << endl;
-
+
QCString outputDirectory = Config_getString(XML_OUTPUT);
QCString fileName=outputDirectory+"/"+pageName+".xml";
QFile f(fileName);
@@ -1805,10 +1750,10 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
writeXMLHeader(t);
t << " <compounddef id=\"" << pageName;
t << "\" kind=\"" << kindName << "\">" << endl;
- t << " <compoundname>" << convertToXML(pd->name())
+ t << " <compoundname>" << convertToXML(pd->name())
<< "</compoundname>" << endl;
- if (pd==Doxygen::mainPage) // main page is special
+ if (pd==Doxygen::mainPage.get()) // main page is special
{
QCString title;
if (mainPageHasTitle())
@@ -1819,37 +1764,32 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
{
title = Config_getString(PROJECT_NAME);
}
- t << " <title>" << convertToXML(convertCharEntitiesToUTF8(title))
+ t << " <title>" << convertToXML(convertCharEntitiesToUTF8(title))
<< "</title>" << endl;
}
else
{
- SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+ const SectionInfo *si = SectionManager::instance().find(pd->name());
if (si)
{
- t << " <title>" << convertToXML(convertCharEntitiesToUTF8(filterTitle(si->title)))
+ t << " <title>" << convertToXML(convertCharEntitiesToUTF8(filterTitle(si->title())))
<< "</title>" << endl;
}
}
writeInnerPages(pd->getSubPages(),t);
- SectionDict *sectionDict = pd->getSectionDict();
- if (pd->localToc().isXmlEnabled() && sectionDict)
+ const SectionRefs &sectionRefs = pd->getSectionRefs();
+ if (pd->localToc().isXmlEnabled() && !sectionRefs.empty())
{
t << " <tableofcontents>" << endl;
- SDict<SectionInfo>::Iterator li(*sectionDict);
- SectionInfo *si;
int level=1,l;
bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE };
int maxLevel = pd->localToc().xmlLevel();
- for (li.toFirst();(si=li.current());++li)
+ for (const SectionInfo *si : sectionRefs)
{
- if (si->type==SectionInfo::Section ||
- si->type==SectionInfo::Subsection ||
- si->type==SectionInfo::Subsubsection ||
- si->type==SectionInfo::Paragraph)
+ if (isSection(si->type()))
{
//printf(" level=%d title=%s\n",level,si->title.data());
- int nextLevel = (int)si->type;
+ int nextLevel = (int)si->type();
if (nextLevel>level)
{
for (l=level;l<nextLevel;l++)
@@ -1869,10 +1809,10 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
if (nextLevel <= maxLevel)
{
if (inLi[nextLevel]) t << " </tocsect>" << endl;
- QCString titleDoc = convertToXML(si->title);
+ QCString titleDoc = convertToXML(si->title());
t << " <tocsect>" << endl;
- t << " <name>" << (si->title.isEmpty()?si->label:titleDoc) << "</name>" << endl;
- t << " <reference>" << convertToXML(pageName) << "_1" << convertToXML(si -> label) << "</reference>" << endl;
+ t << " <name>" << (si->title().isEmpty()?si->label():titleDoc) << "</name>" << endl;
+ t << " <reference>" << convertToXML(pageName) << "_1" << convertToXML(si->label()) << "</reference>" << endl;
inLi[nextLevel]=TRUE;
level = nextLevel;
}
@@ -1921,11 +1861,12 @@ void generateXML()
// + groups
// + related pages
// - examples
-
+
QCString outputDirectory = Config_getString(XML_OUTPUT);
QDir xmlDir(outputDirectory);
createSubDirs(xmlDir);
+ ResourceMgr::instance().copyResource("xml.xsd",outputDirectory);
ResourceMgr::instance().copyResource("index.xsd",outputDirectory);
QCString fileName=outputDirectory+"/compound.xsd";
@@ -1978,82 +1919,51 @@ void generateXML()
t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
t << "<doxygenindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" ";
- t << "version=\"" << getVersion() << "\">" << endl;
+ t << "version=\"" << getDoxygenVersion() << "\" ";
+ t << "xml:lang=\"" << theTranslator->trISOLang() << "\"";
+ t << ">" << endl;
+ for (const auto &cd : *Doxygen::classLinkedMap)
{
- ClassSDict::Iterator cli(*Doxygen::classSDict);
- const ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- generateXMLForClass(cd,t);
- }
+ generateXMLForClass(cd.get(),t);
}
- //{
- // ClassSDict::Iterator cli(Doxygen::hiddenClasses);
- // ClassDef *cd;
- // for (cli.toFirst();(cd=cli.current());++cli)
- // {
- // msg("Generating XML output for class %s\n",cd->name().data());
- // generateXMLForClass(cd,t);
- // }
- //}
- NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
- const NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
+ for (const auto &nd : *Doxygen::namespaceLinkedMap)
{
msg("Generating XML output for namespace %s\n",nd->name().data());
- generateXMLForNamespace(nd,t);
+ generateXMLForNamespace(nd.get(),t);
}
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+ for (const auto &fn : *Doxygen::inputNameLinkedMap)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ for (const auto &fd : *fn)
{
msg("Generating XML output for file %s\n",fd->name().data());
- generateXMLForFile(fd,t);
+ generateXMLForFile(fd.get(),t);
}
}
- GroupSDict::Iterator gli(*Doxygen::groupSDict);
- const GroupDef *gd;
- for (;(gd=gli.current());++gli)
+ for (const auto &gd : *Doxygen::groupLinkedMap)
{
msg("Generating XML output for group %s\n",gd->name().data());
- generateXMLForGroup(gd,t);
+ generateXMLForGroup(gd.get(),t);
}
+ for (const auto &pd : *Doxygen::pageLinkedMap)
{
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- msg("Generating XML output for page %s\n",pd->name().data());
- generateXMLForPage(pd,t,FALSE);
- }
+ msg("Generating XML output for page %s\n",pd->name().data());
+ generateXMLForPage(pd.get(),t,FALSE);
}
+ for (const auto &dd : *Doxygen::dirLinkedMap)
{
- DirDef *dir;
- DirSDict::Iterator sdi(*Doxygen::directories);
- for (sdi.toFirst();(dir=sdi.current());++sdi)
- {
- msg("Generate XML output for dir %s\n",dir->name().data());
- generateXMLForDir(dir,t);
- }
+ msg("Generate XML output for dir %s\n",dd->name().data());
+ generateXMLForDir(dd.get(),t);
}
+ for (const auto &pd : *Doxygen::exampleLinkedMap)
{
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- msg("Generating XML output for example %s\n",pd->name().data());
- generateXMLForPage(pd,t,TRUE);
- }
+ msg("Generating XML output for example %s\n",pd->name().data());
+ generateXMLForPage(pd.get(),t,TRUE);
}
if (Doxygen::mainPage)
{
msg("Generating XML output for the main page\n");
- generateXMLForPage(Doxygen::mainPage,t,FALSE);
+ generateXMLForPage(Doxygen::mainPage.get(),t,FALSE);
}
//t << " </compoundlist>" << endl;
diff --git a/src/xmlgen.h b/src/xmlgen.h
index 4458b9f..27bb10b 100644
--- a/src/xmlgen.h
+++ b/src/xmlgen.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -41,6 +39,8 @@ class XMLCodeGenerator : public CodeOutputInterface
const char *anchorId,int l);
void setCurrentDoc(const Definition *,const char *,bool){}
void addWord(const char *,bool){}
+ void startCodeFragment(const char *);
+ void endCodeFragment(const char *);
void finish();
diff --git a/src/layout_default.xml b/templates/general/layout_default.xml
index 373bb20..373bb20 100644
--- a/src/layout_default.xml
+++ b/templates/general/layout_default.xml
diff --git a/templates/html/bib2xhtml.pl b/templates/html/bib2xhtml.pl
index da6dc62..539aaab 100755
--- a/templates/html/bib2xhtml.pl
+++ b/templates/html/bib2xhtml.pl
@@ -118,11 +118,14 @@ sub html_ent {
s/\\lfloor\b/&lfloor;/g;
s/\\rfloor\b/&rfloor;/g;
}
+$bdebug = 0;
foreach (@ARGV) {
if (/\.bib$/) {
$bibfile = $_;
$bibfile =~ s/\.bib$//;
push(@bibfiles,$bibfile);
+ } elsif ("$_" eq "-d") {
+ $bdebug = 1;
} else {
$htmlfile = $_;
}
@@ -198,7 +201,7 @@ while (<BBLFILE>) {
next loop;
}
$nentry++;
- ($bcite, $blabel) = m+<dt><a name=\"([^\"]*)\">\[([^\]]*)\]</a></dt><dd>+;
+ ($bcite, $blabel) = m:<dt><a\s+name=\"([^\"]*)\">\[([^\]]*)\]</a></dt><dd>:;
$blabel = "$nentry";
$bibcite{$bcite} = $blabel;
}
@@ -222,7 +225,7 @@ while (<BBLFILE>) {
}
s/\%\n//g;
s/(\.(<\/cite>|<\/a>|\')+)\./$1/g;
- s:(<dt><a name=\"[^\"]*\">\[)[^\]]*(\]</a></dt><dd>):$1$nentry$2:;
+ s:(<dt><a\s+name=\"[^\"]*\">\[)[^\]]*(\]</a></dt><dd>):$1$nentry$2:;
while (m/(\\(cite(label)?)(\001\d+)\{([^\001]+)\4\})/) {
$old = $1;
$cmd = $2;
@@ -315,5 +318,7 @@ close (OHTMLFILE);
close(HTMLFILE);
chmod($mode, "$htmlfile$$");
rename("$htmlfile$$", $htmlfile);
-unlink(@tmpfiles);
+if ($bdebug == 0) {
+ unlink(@tmpfiles);
+}
exit(0);
diff --git a/templates/html/close.svg b/templates/html/close.svg
new file mode 100644
index 0000000..a933eea
--- /dev/null
+++ b/templates/html/close.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 11 11"
+ height="11"
+ width="11"
+ id="svg2"
+ version="1.1">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <path
+ id="path12"
+ d="M 5.5 0.5 A 5 5 0 0 0 0.5 5.5 A 5 5 0 0 0 5.5 10.5 A 5 5 0 0 0 10.5 5.5 A 5 5 0 0 0 5.5 0.5 z M 3.5820312 3 A 0.58291923 0.58291923 0 0 1 4 3.1757812 L 5.5 4.6757812 L 7 3.1757812 A 0.58291923 0.58291923 0 0 1 7.4003906 3 A 0.58291923 0.58291923 0 0 1 7.8242188 4 L 6.3242188 5.5 L 7.8242188 7 A 0.58291923 0.58291923 0 1 1 7 7.8242188 L 5.5 6.3242188 L 4 7.8242188 A 0.58291923 0.58291923 0 1 1 3.1757812 7 L 4.6757812 5.5 L 3.1757812 4 A 0.58291923 0.58291923 0 0 1 3.5820312 3 z "
+ style="stroke-width:1.09870648;fill:#bababa;fill-opacity:1" />
+</svg>
diff --git a/templates/html/doxygen.css b/templates/html/doxygen.css
index 2c9dfd5..5898d87 100644
--- a/templates/html/doxygen.css
+++ b/templates/html/doxygen.css
@@ -66,7 +66,7 @@ p.startli, p.startdd {
margin-top: 2px;
}
-th p.starttd, p.intertd, p.endtd {
+th p.starttd, th p.intertd, th p.endtd {
font-size: 100%;
font-weight: 700;
}
@@ -103,30 +103,96 @@ caption {
}
span.legend {
- font-size: 70%;
- text-align: center;
+ font-size: 70%;
+ text-align: center;
}
h3.version {
- font-size: 90%;
- text-align: center;
+ font-size: 90%;
+ text-align: center;
}
-div.qindex, div.navtab{
- background-color: ##ee;
- border: 1px solid ##b0;
- text-align: center;
+div.navtab {
+ border-right: 1px solid ##b0;
+ padding-right: 15px;
+ text-align: right;
+ line-height: 110%;
+}
+
+div.navtab table {
+ border-spacing: 0;
}
-div.qindex, div.navpath {
+td.navtab {
+ padding-right: 6px;
+ padding-left: 6px;
+}
+td.navtabHL {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ padding-right: 6px;
+ padding-left: 6px;
+}
+
+td.navtabHL a, td.navtabHL a:visited {
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+a.navtab {
+ font-weight: bold;
+}
+
+div.qindex{
+ text-align: center;
width: 100%;
line-height: 140%;
+ font-size: 130%;
+ color: #A0A0A0;
}
-div.navtab {
- margin-right: 15px;
+dt.alphachar{
+ font-size: 180%;
+ font-weight: bold;
+}
+
+.alphachar a{
+ color: black;
+}
+
+.alphachar a:hover, .alphachar a:visited{
+ text-decoration: none;
+}
+
+.classindex dl {
+ padding: 25px;
+ column-count:1
+}
+
+.classindex dd {
+ display:inline-block;
+ margin-left: 50px;
+ width: 90%;
+ line-height: 1.15em;
+}
+
+.classindex dl.odd {
+ background-color: ##F9;
+}
+
+@media(min-width: 1120px) {
+ .classindex dl {
+ column-count:2
+ }
+}
+
+@media(min-width: 1320px) {
+ .classindex dl {
+ column-count:3
+ }
}
+
/* @group Link Styling */
a {
@@ -143,17 +209,6 @@ a:hover {
text-decoration: underline;
}
-a.qindex {
- font-weight: bold;
-}
-
-a.qindexHL {
- font-weight: bold;
- background-color: ##AA;
- color: ##ff;
- border: 1px double ##98;
-}
-
.contents a.qindexHL:visited {
color: ##ff;
}
@@ -1358,10 +1413,12 @@ dl.citelist dt {
font-weight:bold;
margin-right:10px;
padding:5px;
+ text-align:right;
+ width:52px;
}
dl.citelist dd {
- margin:2px 0;
+ margin:2px 0 2px 72px;
padding:5px 0;
}
@@ -1424,6 +1481,12 @@ div.toc li.level4 {
margin-left: 45px;
}
+span.emoji {
+ /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html
+ * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort;
+ */
+}
+
.PageDocRTL-title div.toc li.level1 {
margin-left: 0 !important;
margin-right: 0;
@@ -1661,47 +1724,6 @@ tr.heading h2 {
/* @group Markdown */
-/*
-table.markdownTable {
- border-collapse:collapse;
- margin-top: 4px;
- margin-bottom: 4px;
-}
-
-table.markdownTable td, table.markdownTable th {
- border: 1px solid ##37;
- padding: 3px 7px 2px;
-}
-
-table.markdownTableHead tr {
-}
-
-table.markdownTableBodyLeft td, table.markdownTable th {
- border: 1px solid ##37;
- padding: 3px 7px 2px;
-}
-
-th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone {
- background-color: ##47;
- color: ##ff;
- font-size: 110%;
- padding-bottom: 4px;
- padding-top: 5px;
-}
-
-th.markdownTableHeadLeft {
- text-align: left
-}
-
-th.markdownTableHeadRight {
- text-align: right
-}
-
-th.markdownTableHeadCenter {
- text-align: center
-}
-*/
-
table.markdownTable {
border-collapse:collapse;
margin-top: 4px;
diff --git a/templates/html/doxygen.luma b/templates/html/doxygen.luma
deleted file mode 100644
index 48d9435..0000000
--- a/templates/html/doxygen.luma
+++ /dev/null
@@ -1,68 +0,0 @@
-# doxygen logo
-# width & height
-104 31
-# luma data
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 255 255 255 255 255 255 255 255
- 32 32 32 32 32 32 32 32 32 32 91 91 91 91 32 32 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 32 32 32 32 32 32 32 32 32 32 255 255 255 255 32 32 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
- 32 32 32 32 32 32 32 32 32 32 253 253 253 253 32 32 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 255 255 255 255 255 255 255 255
- 32 32 32 32 32 32 32 32 32 32 251 251 251 251 32 32 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 255 255 255 255 255 255 255 255
- 32 32 32 32 32 32 32 32 32 32 249 249 249 249 32 32 249 249 249 249 32 32 32 32 32 32 249 249 249 249 32 32 32 32 32 32 249 249 249 249 32 32 32 32 32 32 32 32 32 32 249 249 249 32 32 32 32 32 249 249 249 249 32 32 32 32 32 32 32 32 32 32 249 249 249 249 249 249 32 32 32 32 32 32 32 249 249 249 249 249 32 32 32 32 32 249 32 32 32 32 32 255 255 255
- 32 32 32 32 46 132 190 190 147 61 247 247 247 247 32 32 247 247 32 32 118 161 190 190 161 118 32 32 247 32 46 89 89 89 89 46 32 247 247 32 89 89 89 89 61 89 89 89 89 46 32 247 32 46 89 89 89 89 32 247 32 32 118 175 190 161 89 61 89 89 89 61 32 247 247 247 32 32 104 147 190 190 190 132 89 32 32 247 247 32 46 89 89 89 75 32 89 161 190 161 75 32 255 255
- 32 32 32 74 230 244 244 244 244 244 244 244 244 244 32 32 244 32 74 216 244 244 244 244 244 244 216 74 32 244 32 187 244 244 244 159 32 244 32 117 244 244 244 230 46 173 244 244 244 131 32 244 32 131 244 244 244 173 32 32 46 173 244 244 244 244 244 230 244 244 244 131 32 244 244 32 74 202 244 244 244 244 244 244 244 173 46 32 244 32 89 244 244 244 187 145 244 244 244 244 244 89 32 255
- 32 32 46 213 241 241 241 241 241 241 241 241 241 241 32 32 32 60 227 241 241 241 241 241 241 241 241 227 60 32 32 46 227 241 241 241 102 32 60 227 241 241 241 88 32 116 241 241 241 199 32 241 32 185 241 241 241 116 32 32 143 241 241 241 241 241 241 241 241 241 241 130 32 241 32 74 227 241 241 241 199 185 241 241 241 241 171 32 241 32 88 241 241 241 241 241 241 241 241 241 241 199 32 255
- 32 32 128 237 237 237 223 128 87 128 237 237 237 237 32 32 32 182 237 237 237 196 100 100 196 237 237 237 182 32 237 32 100 237 237 237 223 59 196 237 237 237 141 32 32 46 237 237 237 237 59 32 46 237 237 237 237 46 32 59 237 237 237 237 169 87 87 182 237 237 237 128 32 237 32 196 237 237 237 87 32 32 73 223 237 237 237 73 32 32 87 237 237 237 237 223 182 223 237 237 237 237 46 32
- 32 32 207 234 234 234 113 32 32 32 234 234 234 234 32 32 59 234 234 234 221 45 32 32 45 221 234 234 234 59 32 234 32 140 234 234 234 221 234 234 234 194 32 32 234 32 167 234 234 234 126 32 99 234 234 234 167 32 32 126 234 234 234 180 32 32 32 126 234 234 234 126 32 32 99 234 234 234 167 32 32 32 32 153 234 234 234 126 32 32 86 234 234 234 207 45 32 45 234 234 234 234 86 32
- 32 45 231 231 231 218 32 32 32 32 231 231 231 231 32 32 98 231 231 231 165 32 231 231 32 165 231 231 231 98 32 231 32 45 191 231 231 231 231 231 218 72 32 231 231 32 98 231 231 231 165 32 151 231 231 231 112 32 32 165 231 231 231 112 32 231 32 125 231 231 231 125 32 32 138 231 231 231 178 125 125 125 125 178 231 231 231 178 32 32 85 231 231 231 178 32 255 32 191 231 231 231 85 32
- 32 84 227 227 227 175 32 32 32 32 227 227 227 227 32 32 123 227 227 227 123 32 227 227 32 123 227 227 227 123 32 227 227 32 71 227 227 227 227 227 123 32 227 227 227 227 32 214 227 227 227 45 201 227 227 227 45 32 32 175 227 227 227 84 32 227 32 123 227 227 227 123 32 32 175 227 227 227 227 227 227 227 227 227 227 227 227 175 32 32 84 227 227 227 175 32 255 32 175 227 227 227 84 32
- 32 83 223 223 223 172 32 32 32 32 223 223 223 223 32 32 121 223 223 223 121 32 223 223 32 121 223 223 223 121 32 223 223 223 32 172 223 223 223 210 45 32 223 223 223 223 32 147 223 223 223 134 223 223 223 147 32 223 32 172 223 223 223 83 32 223 32 121 223 223 223 121 32 32 172 223 223 223 223 223 223 223 223 223 223 223 223 172 32 32 83 223 223 223 172 32 255 32 172 223 223 223 83 32
- 32 82 220 220 220 170 32 32 32 32 220 220 220 220 32 32 120 220 220 220 120 32 220 220 32 120 220 220 220 120 32 220 220 32 95 220 220 220 220 220 132 32 220 220 220 220 32 95 220 220 220 207 220 220 220 95 32 220 32 170 220 220 220 107 32 220 32 120 220 220 220 120 32 32 170 220 220 220 132 32 32 32 32 32 32 32 32 32 32 32 82 220 220 220 170 32 255 32 170 220 220 220 82 32
- 32 57 216 216 216 216 32 32 32 32 216 216 216 216 32 32 81 216 216 216 167 32 216 216 32 155 216 216 216 81 32 216 32 57 204 216 216 216 216 216 216 93 32 216 216 216 216 32 204 216 216 216 216 216 204 32 216 216 32 118 216 216 216 167 32 32 32 130 216 216 216 118 32 32 118 216 216 216 191 32 32 216 216 216 32 32 44 57 32 32 81 216 216 216 167 32 255 32 167 216 216 216 81 32
- 32 32 189 213 213 213 116 32 32 80 213 213 213 213 32 32 44 201 213 213 213 68 32 32 68 213 213 213 213 44 32 32 32 165 213 213 213 165 213 213 213 201 44 32 213 213 213 32 129 213 213 213 213 213 141 32 213 213 32 80 213 213 213 213 165 116 153 213 213 213 213 116 32 32 56 213 213 213 213 153 56 32 32 32 44 104 189 116 32 32 80 213 213 213 165 32 255 32 165 213 213 213 80 32
- 32 32 139 210 210 210 210 174 174 210 210 210 210 210 32 32 32 127 210 210 210 198 127 127 198 210 210 210 127 32 210 32 115 210 210 210 174 44 139 210 210 210 163 32 32 210 210 32 68 210 210 210 210 210 91 32 210 210 210 32 174 210 210 210 210 210 210 210 210 210 210 115 32 210 32 127 210 210 210 210 210 174 163 163 210 210 210 115 32 32 79 210 210 210 163 32 255 32 163 210 210 210 79 32
- 32 32 55 194 206 206 206 206 206 194 206 206 206 206 32 32 32 44 171 206 206 206 206 206 206 206 206 171 44 32 32 67 206 206 206 206 67 32 44 183 206 206 206 113 32 206 206 206 32 183 206 206 206 194 32 206 206 206 206 32 67 194 206 206 206 206 206 171 206 206 206 113 32 206 32 32 136 206 206 206 206 206 206 206 206 206 206 113 32 32 78 206 206 206 160 32 255 32 160 206 206 206 78 32
- 32 32 32 100 192 203 203 203 157 55 203 203 203 203 32 32 203 32 43 135 203 203 203 203 203 203 135 43 32 32 43 180 203 203 203 112 32 203 32 66 203 203 203 203 66 32 203 203 32 157 203 203 203 135 32 203 203 203 203 203 32 43 112 157 157 123 55 112 203 203 203 112 32 203 203 32 32 78 146 203 203 203 203 203 203 169 123 55 32 32 78 203 203 203 157 32 255 32 157 203 203 203 78 32
- 32 32 32 32 54 110 110 88 32 32 32 32 32 32 32 32 200 200 32 32 54 99 110 110 99 54 32 32 200 200 32 32 32 32 32 32 32 200 200 32 32 32 32 32 32 200 200 32 54 200 200 200 200 77 32 200 200 200 200 200 32 32 32 32 32 32 32 166 200 200 200 88 32 200 200 200 200 32 32 32 66 77 77 77 32 32 32 32 200 200 32 32 32 32 32 32 255 32 32 32 32 32 32 255
- 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 198 198 198 198 32 32 32 32 32 32 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 32 109 198 198 198 176 32 198 198 198 198 198 32 98 121 76 32 32 54 109 198 198 198 198 43 32 198 198 198 198 198 198 198 32 32 32 32 198 198 198 198 198 198 198 198 198 198 198 198 255 255 255 255 255 255 255 255
- 32 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 33 159 191 191 191 117 36 41 41 41 41 41 34 108 191 191 191 191 191 191 191 191 191 117 36 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 255
- 32 41 97 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 78 38 64 190 192 192 192 66 66 41 41 85 128 65 34 107 190 192 192 192 192 192 192 192 139 48 39 41 41 105 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 97 41 255
- 32 41 97 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 96 36 95 147 148 148 139 55 41 41 85 121 128 91 38 75 137 158 190 190 190 170 139 97 49 37 41 41 105 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 97 41 255
- 32 41 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 41 36 45 45 45 48 38 41 41 76 76 76 76 76 37 34 42 33 33 33 39 48 59 41 41 41 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 41 255
- 32 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
-# alpha data
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 66 66 66 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 145 247 247 247 247 145 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 247 247 247 247 247 247 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 247 247 247 247 247 247 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 247 247 247 247 247 247 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 16 115 181 181 132 247 247 247 247 247 247 0 0 0 0 0 99 148 181 181 148 99 0 0 0 0 16 66 66 66 66 16 0 0 0 0 66 66 66 66 33 66 66 66 66 16 0 0 0 16 66 66 66 66 0 0 0 0 99 165 181 148 66 33 66 66 66 33 0 0 0 0 0 0 82 132 181 181 181 115 66 0 0 0 0 0 16 66 66 66 49 0 66 148 181 148 49 0 0 0
- 0 0 0 129 247 247 247 247 247 247 247 247 247 247 247 0 0 0 112 214 247 247 247 247 247 247 214 112 0 16 247 247 247 247 247 247 46 0 0 145 247 247 247 247 247 247 247 247 247 247 16 0 16 247 247 247 247 247 66 0 63 165 247 247 247 247 247 247 247 247 247 247 33 0 0 0 96 198 247 247 247 247 247 247 247 165 63 0 0 16 247 247 247 247 247 145 247 247 247 247 247 145 0 0
- 0 0 112 247 247 247 247 247 247 247 247 247 247 247 247 0 0 129 247 247 247 247 247 247 247 247 247 247 129 0 181 247 247 247 247 247 148 0 129 247 247 247 247 247 247 247 247 247 247 247 115 0 115 247 247 247 247 247 165 30 247 247 247 247 247 247 247 247 247 247 247 247 115 0 0 129 247 247 247 247 247 247 247 247 247 247 247 63 0 66 247 247 247 247 247 247 247 247 247 247 247 247 96 0
- 0 16 247 247 247 247 247 247 247 247 247 247 247 247 247 0 79 247 247 247 247 247 247 247 247 247 247 247 247 79 79 247 247 247 247 247 247 129 247 247 247 247 247 247 129 247 247 247 247 247 198 0 181 247 247 247 247 247 99 145 247 247 247 247 247 247 247 247 247 247 247 247 115 0 96 247 247 247 247 247 247 247 247 247 247 247 247 165 0 66 247 247 247 247 247 247 247 247 247 247 247 247 198 0
- 0 115 247 247 247 247 247 247 247 247 247 247 247 247 247 0 181 247 247 247 247 247 247 247 247 247 247 247 247 181 0 129 247 247 247 247 247 247 247 247 247 247 247 145 16 247 247 247 247 247 247 33 247 247 247 247 247 247 33 247 247 247 247 247 247 247 247 247 247 247 247 247 115 0 198 247 247 247 247 247 198 181 247 247 247 247 247 247 49 66 247 247 247 247 247 247 247 247 247 247 247 247 247 16
- 0 214 247 247 247 247 247 129 66 247 247 247 247 247 247 33 247 247 247 247 247 247 96 96 247 247 247 247 247 247 33 0 145 247 247 247 247 247 247 247 247 247 198 30 0 165 247 247 247 247 247 115 247 247 247 247 247 165 115 247 247 247 247 247 181 66 115 247 247 247 247 247 115 82 247 247 247 247 247 165 115 115 148 247 247 247 247 247 115 66 247 247 247 247 247 247 181 247 247 247 247 247 247 66
- 16 247 247 247 247 247 231 0 0 247 247 247 247 247 247 82 247 247 247 247 247 165 0 0 165 247 247 247 247 247 82 0 30 247 247 247 247 247 247 247 247 247 96 0 0 82 247 247 247 247 247 165 247 247 247 247 247 99 165 247 247 247 247 247 99 0 115 247 247 247 247 247 115 132 247 247 247 247 247 247 247 247 247 247 247 247 247 247 181 66 247 247 247 247 247 181 0 198 247 247 247 247 247 66
- 66 247 247 247 247 247 181 0 0 247 247 247 247 247 247 115 247 247 247 247 247 115 0 0 115 247 247 247 247 247 115 0 0 96 247 247 247 247 247 247 247 129 0 0 0 0 231 247 247 247 247 247 247 247 247 247 247 16 181 247 247 247 247 247 66 0 115 247 247 247 247 247 115 181 247 247 247 247 247 247 247 247 247 247 247 247 247 247 181 66 247 247 247 247 247 181 0 181 247 247 247 247 247 66
- 66 247 247 247 247 247 181 0 0 247 247 247 247 247 247 115 247 247 247 247 247 115 0 0 115 247 247 247 247 247 115 0 0 0 181 247 247 247 247 247 247 30 0 0 0 0 148 247 247 247 247 247 247 247 247 247 148 0 181 247 247 247 247 247 66 0 115 247 247 247 247 247 115 181 247 247 247 247 247 247 247 247 247 247 247 247 247 247 181 66 247 247 247 247 247 181 0 181 247 247 247 247 247 66
- 66 247 247 247 247 247 181 0 0 247 247 247 247 247 247 115 247 247 247 247 247 115 0 0 115 247 247 247 247 247 115 0 0 129 247 247 247 247 247 247 247 145 0 0 0 0 82 247 247 247 247 247 247 247 247 247 82 0 181 247 247 247 247 247 99 0 115 247 247 247 247 247 115 181 247 247 247 247 247 247 247 247 247 247 247 247 247 181 79 66 247 247 247 247 247 181 0 181 247 247 247 247 247 66
- 33 247 247 247 247 247 247 14 0 247 247 247 247 247 247 66 247 247 247 247 247 181 0 0 165 247 247 247 247 247 66 0 79 247 247 247 247 247 247 247 247 247 129 0 0 0 0 231 247 247 247 247 247 247 247 231 0 0 115 247 247 247 247 247 181 115 165 247 247 247 247 247 115 115 247 247 247 247 247 214 63 0 0 0 16 112 247 247 33 66 247 247 247 247 247 181 0 181 247 247 247 247 247 66
- 0 214 247 247 247 247 247 198 198 247 247 247 247 247 247 16 247 247 247 247 247 247 132 132 247 247 247 247 247 247 16 14 181 247 247 247 247 247 247 247 247 247 247 79 0 0 0 132 247 247 247 247 247 247 247 148 0 0 66 247 247 247 247 247 247 247 247 247 247 247 247 247 115 33 247 247 247 247 247 247 247 198 181 181 247 247 247 247 115 66 247 247 247 247 247 181 0 181 247 247 247 247 247 66
- 0 148 247 247 247 247 247 247 247 247 247 247 247 247 247 0 132 247 247 247 247 247 247 247 247 247 247 247 247 145 0 145 247 247 247 247 247 247 247 247 247 247 247 181 14 0 0 49 247 247 247 247 247 247 247 82 0 0 0 198 247 247 247 247 247 247 247 247 247 247 247 247 115 0 145 247 247 247 247 247 247 247 247 247 247 247 247 247 115 66 247 247 247 247 247 181 0 181 247 247 247 247 247 66
- 0 46 247 247 247 247 247 247 247 247 247 247 247 247 247 0 30 247 247 247 247 247 247 247 247 247 247 247 247 30 112 247 247 247 247 247 247 96 247 247 247 247 247 247 145 0 0 0 214 247 247 247 247 247 231 0 0 0 0 96 247 247 247 247 247 247 247 247 247 247 247 247 115 0 30 148 247 247 247 247 247 247 247 247 247 247 247 247 115 66 247 247 247 247 247 181 0 181 247 247 247 247 247 66
- 0 0 129 247 247 247 247 247 247 247 247 247 247 247 247 0 0 96 247 247 247 247 247 247 247 247 247 247 96 16 247 247 247 247 247 247 145 0 112 247 247 247 247 247 247 49 0 0 181 247 247 247 247 247 148 0 0 0 0 0 129 247 247 247 247 247 247 247 247 247 247 247 115 0 0 46 148 247 247 247 247 247 247 247 247 247 247 247 33 66 247 247 247 247 247 181 0 181 247 247 247 247 247 66
- 0 0 0 129 247 247 247 247 181 145 247 247 247 247 145 0 0 0 46 148 247 247 247 247 247 247 148 46 0 0 112 214 247 247 247 145 14 0 0 145 247 247 247 247 145 0 0 33 247 247 247 247 247 247 66 0 0 0 0 0 99 132 115 181 181 132 198 247 247 247 247 247 82 0 0 0 0 66 165 247 247 247 247 247 247 198 132 33 0 0 145 247 247 247 181 79 0 79 181 247 247 247 145 0
- 0 0 0 0 33 115 115 82 0 0 0 0 0 0 0 0 0 0 0 0 33 99 115 115 99 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 247 247 247 247 247 214 0 0 0 0 0 99 247 247 247 247 247 247 247 247 247 247 247 247 16 0 0 0 0 0 0 0 49 66 66 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 165 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 108 224 255 255 255 255 255 255 101 164 255 255 255 143 250 255 255 255 255 255 255 255 255 255 255 255 98 170 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 165 0
- 0 165 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 136 251 255 255 255 255 255 255 101 130 255 255 255 153 250 255 255 255 255 255 255 255 255 255 255 121 98 189 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 165 0
- 0 165 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 198 252 255 255 255 255 255 164 164 255 255 255 255 176 249 251 255 255 255 255 255 255 255 255 150 86 192 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 165 0
- 0 165 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 164 198 255 255 255 255 201 133 164 255 255 255 255 255 145 203 255 255 255 255 255 255 255 117 79 194 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 165 0
- 0 66 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 73 73 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 47 70 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 66 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-
diff --git a/templates/html/doxygen.svg b/templates/html/doxygen.svg
new file mode 100644
index 0000000..d00110b
--- /dev/null
+++ b/templates/html/doxygen.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 104 31" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <linearGradient id="a">
+ <stop stop-color="##70" offset="0"/>
+ <stop stop-color="##90" offset="1"/>
+ </linearGradient>
+ <linearGradient id="d" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="c" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientTransform="matrix(.6816 0 0 1.0248 72.391 -.91809)" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="b" x1="56.295" x2="56.295" y1="24.622" y2="26.574" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="e" x1="49.067" x2="48.956" y1="19.719" y2="9.5227" gradientTransform="matrix(.97968 0 0 1.0207 -.25579 -.25579)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="##c8" offset="0"/>
+ <stop stop-color="##f0" offset="1"/>
+ </linearGradient>
+ <filter id="f" x="-.010676" y="-.045304" width="1.0214" height="1.0906" color-interpolation-filters="sRGB">
+ <feGaussianBlur stdDeviation="0.45293203"/>
+ </filter>
+ </defs>
+ <g>
+ <path transform="translate(-2.5759 -27.848)" d="m13.609 32.203v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23645 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88018-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35277 3.7988-1.0566 1.0471-0.70387 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.92299-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.4611 0.28066 1.7988 0.84375 0.33777 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5976v-8.3926c0-0.84464-0.0765-1.6106-0.22851-2.2969-0.13511-0.70387-0.37971-1.2925-0.73438-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.063 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07028-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06051 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3438h-0.05078l-2.9648-9.3438zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914 0.38844 0.24635 0.6991 0.57184 0.93555 0.97656 0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13253 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10134 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88814-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70105 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.4927-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89025 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74023 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" filter="url(#f)" opacity=".3" stroke="#969696" xlink:href="#path141"/>
+ <path d="m0.97202 24.161 43.605-0.0019 0.0508 3.3061-43.6 0.04174z" fill="url(#d)" stroke="#000" stroke-width=".5"/>
+ <path d="m10.283 3.5547v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23644 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88017-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35278 3.7988-1.0566 1.0471-0.70386 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.923-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.461 0.28066 1.7988 0.84375 0.33778 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5977v-8.3926c0-0.84464-0.0765-1.6106-0.22852-2.2969-0.13511-0.70387-0.3797-1.2925-0.73437-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.062 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07027-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06052 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3437h-0.05078l-2.9648-9.3437zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914s0.6991 0.57184 0.93555 0.97656c0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13254 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10133 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88813-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70106 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.49271-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89026 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74024 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" fill="url(#e)" stroke="##60" stroke-width=".7"/>
+ <path d="m52.988 27.291c0.99602-1.0359 1.3944-1.8725 1.7928-3.1076l3.8247-0.03984c0.3113 1.6096 0.82413 2.5137 1.6335 3.1474z" fill="url(#b)" stroke="#000" stroke-width=".5"/>
+ <path d="m73.89 24.04 28.885-0.2011-0.12476 3.3879-31.033 0.16229c1.2621-1.0234 1.9665-2.2859 2.2724-3.3491z" fill="url(#c)" stroke="#000" stroke-width=".41788"/>
+ </g>
+</svg>
diff --git a/templates/html/dynsections.js b/templates/html/dynsections.js
index ea0a7b3..3174bd7 100644
--- a/templates/html/dynsections.js
+++ b/templates/html/dynsections.js
@@ -1,25 +1,26 @@
/*
- @licstart The following is the entire license notice for the
- JavaScript code in this file.
+ @licstart The following is the entire license notice for the JavaScript code in this file.
- Copyright (C) 1997-2017 by Dimitri van Heesch
+ The MIT License (MIT)
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ Copyright (C) 1997-2020 by Dimitri van Heesch
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
- @licend The above is the entire license notice
- for the JavaScript code in this file
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
*/
function toggleVisibility(linkObj)
{
diff --git a/templates/html/extsearch.js b/templates/html/extsearch.js
index 22d68f0..ffbe252 100644
--- a/templates/html/extsearch.js
+++ b/templates/html/extsearch.js
@@ -1,25 +1,26 @@
/*
- @licstart The following is the entire license notice for the
- JavaScript code in this file.
+ @licstart The following is the entire license notice for the JavaScript code in this file.
- Copyright (C) 1997-2017 by Dimitri van Heesch
+ The MIT License (MIT)
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ Copyright (C) 1997-2020 by Dimitri van Heesch
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
- @licend The above is the entire license notice
- for the JavaScript code in this file
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
*/
function SearchBox(name, resultsPath, inFrame, label)
{
diff --git a/templates/html/footer.html b/templates/html/footer.html
index d2aa9e6..2fd7aee 100644
--- a/templates/html/footer.html
+++ b/templates/html/footer.html
@@ -3,17 +3,13 @@
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
$navpath
- <li class="footer">$generatedby
- <a href="http://www.doxygen.org/index.html">
- <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
+ <li class="footer">$generatedby <a href="https://www.doxygen.org/index.html"><img class="footer" src="$relpath^doxygen.svg" width="104" height="31" alt="doxygen"/></a> $doxygenversion </li>
</ul>
</div>
<!--END GENERATE_TREEVIEW-->
<!--BEGIN !GENERATE_TREEVIEW-->
<hr class="footer"/><address class="footer"><small>
-$generatedby &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
-</a> $doxygenversion
+$generatedby&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="$relpath^doxygen.svg" width="104" height="31" alt="doxygen"/></a> $doxygenversion
</small></address>
<!--END !GENERATE_TREEVIEW-->
</body>
diff --git a/templates/html/htmlbase.tpl b/templates/html/htmlbase.tpl
index 47939fd..f021ddd 100644
--- a/templates/html/htmlbase.tpl
+++ b/templates/html/htmlbase.tpl
@@ -100,7 +100,7 @@ $(function() {
<div id="MSearchBox" class="MSearchBoxInactive">
<div class="left">
<form id="FSearchBox" action="{{ page.relPath }}{% if config.EXTERNAL_SEARCH %}search{{ doxygen.htmlFileExtension }}{% else %}search.php{% endif %}" method="get">
- <img id="MSearchSelect" src="{{ page.relPath }}search/mag.png" alt=""/>
+ <img id="MSearchSelect" src="{{ page.relPath }}search/mag.svg" alt=""/>
<input type="text" id="MSearchField" name="query" value="{{ tr.search }}" size="20" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"/>
@@ -111,7 +111,7 @@ $(function() {
{% else %}{# !SERVER_BASED_SEARCH #}
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
- <img id="MSearchSelect" src="{{ page.relPath }}search/mag_sel.png"
+ <img id="MSearchSelect" src="{{ page.relPath }}search/mag_sel.svg"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
@@ -121,7 +121,7 @@ $(function() {
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img
- id="MSearchCloseImg" border="0" src="{{ page.relPath }}search/close.png"
+ id="MSearchCloseImg" border="0" src="{{ page.relPath }}search/close.svg"
alt=""/></a>
</span>
</div>
@@ -228,8 +228,7 @@ $(document).ready(function(){initNavTree('{{ page.fileName }}{% if page_postfix
{% else %}
{{ tr.generatedBy }}
{% endif %}
- <a href="http://www.doxygen.org/index.html">
- <img class="footer" src="{{ page.relPath }}doxygen.png" alt="doxygen"/></a> {{ doxygen.version }} </li>
+ <a href="https://www.doxygen.org/index.html"><img class="footer" src="{{ page.relPath }}doxygen.svg" width="104" height="31" alt="doxygen"/></a> {{ doxygen.version }} </li>
</ul>
</div>
{% else %}
@@ -239,7 +238,7 @@ $(document).ready(function(){initNavTree('{{ page.fileName }}{% if page_postfix
{% else %}
{{ tr.generatedBy }}
{% endif %}
-&#160;<a href="http://www.doxygen.org/index.html"><img class="footer" src="{{ page.relPath }}doxygen.png" alt="doxygen"/></a>
+&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="{{ page.relPath }}doxygen.svg" width="104" height="31" alt="doxygen"/></a>
{{ doxygen.version }}
</small></address>
{% endif %}
diff --git a/templates/html/htmlhelpindexhhp.tpl b/templates/html/htmlhelpindexhhp.tpl
index 15aba91..8097f3e 100644
--- a/templates/html/htmlhelpindexhhp.tpl
+++ b/templates/html/htmlhelpindexhhp.tpl
@@ -24,7 +24,7 @@ tab_s.png
nav_h.png
nav_f.png
bc_s.png
-doxygen.png
+doxygen.svg
closed.png
open.png
bdwn.png
diff --git a/templates/html/htmllayout.tpl b/templates/html/htmllayout.tpl
index b434d0c..74d83c6 100644
--- a/templates/html/htmllayout.tpl
+++ b/templates/html/htmllayout.tpl
@@ -44,14 +44,14 @@
{% if config.SERVER_BASED_SEARCH %}
{# server side search resources #}
- {% resource 'mag.png' as 'search/mag.png' %}
+ {% resource 'mag.svg' as 'search/mag.svg' %}
{% resource 'extsearch.js as 'search/search.js' %}
{% resource 'search_functions.php' as 'search/search_functions.php' %}
{% resource 'search_opensearch.php' as 'search/search_opensearch.php' %}
{% else %}
{# client side search resources #}
- {% resource 'mag_sel.png' as 'search/mag_sel.png' %}
- {% resource 'close.png' as 'search/close.png' %}
+ {% resource 'mag_sel.svg' as 'search/mag_sel.svg' %}
+ {% resource 'close.svg' as 'search/close.svg' %}
{% resource 'search.js' as 'search/search.js' %}
{% endif %}
diff --git a/templates/html/htmlmemdef.tpl b/templates/html/htmlmemdef.tpl
index cb9c9e0..e847732 100644
--- a/templates/html/htmlmemdef.tpl
+++ b/templates/html/htmlmemdef.tpl
@@ -29,7 +29,6 @@
<tr><td class="memname">
{{ member.definition }}
{# write argument list #}
- {# TODO: TCL #}
{% if member.hasParameters %}
{% if member.isObjCMethod %}
{% if member.parameters %}
diff --git a/templates/html/htmlsearchresult.tpl b/templates/html/htmlsearchresult.tpl
index db37a5d..139faf2 100644
--- a/templates/html/htmlsearchresult.tpl
+++ b/templates/html/htmlsearchresult.tpl
@@ -11,21 +11,27 @@
<div id="SRIndex">
<div class="SRStatus" id="Loading">{{ tr.loading }}</div>
<div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
---></script>
+</script>
<div class="SRStatus" id="Searching">{{ tr.searching }}</div>
<div class="SRStatus" id="NoMatches">{{ tr.noMatches }}</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
/* @license-end */
---></script>
+</script>
</div>
</body>
</html>
diff --git a/templates/html/htmltabs.tpl b/templates/html/htmltabs.tpl
index e7539d9..b8632cb 100644
--- a/templates/html/htmltabs.tpl
+++ b/templates/html/htmltabs.tpl
@@ -35,7 +35,7 @@
<div id="MSearchBox" class="MSearchBoxInactive">
<div class="left">
<form id="FSearchBox" action="{{ page.relPath }}search{% if config.EXTERNAL_SEARCH %}{{ config.HTML_FILE_EXTENSION }}{% else %}.php{% endif %}" method="get">
- <img id="MSearchSelect" src="{{ page.relPath }}search/mag.png" alt=""/>
+ <img id="MSearchSelect" src="{{ page.relPath }}search/mag.svg" alt=""/>
{% if page.highlight!='search' %}
<input type="text" id="MSearchField" name="query" value="{{ tr.search }}" size="20" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
@@ -50,7 +50,7 @@
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
- <img id="MSearchSelect" src="{{ page.relPath }}search/mag_sel.png"
+ <img id="MSearchSelect" src="{{ page.relPath }}search/mag_sel.svg"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
@@ -60,7 +60,7 @@
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img
- id="MSearchCloseImg" border="0" src="{{ page.relPath }}search/close.png" alt=""/></a>
+ id="MSearchCloseImg" border="0" src="{{ page.relPath }}search/close.svg" alt=""/></a>
</span>
</div>
</li>
diff --git a/templates/html/mag.svg b/templates/html/mag.svg
new file mode 100644
index 0000000..9f46b30
--- /dev/null
+++ b/templates/html/mag.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 20 19"
+ height="19"
+ width="20"
+ id="svg2"
+ version="1.1">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <circle
+ r="3.5"
+ cy="8.5"
+ cx="5.5"
+ id="path4611"
+ style="fill:#000000;fill-opacity:0;stroke:#656565;stroke-width:1.4;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
+ <path
+ id="path4630"
+ d="m 8.1085854,11.109059 2.7823556,2.782356"
+ style="fill:none;stroke:#656565;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+</svg>
diff --git a/templates/html/mag_sel.svg b/templates/html/mag_sel.svg
new file mode 100644
index 0000000..03626f6
--- /dev/null
+++ b/templates/html/mag_sel.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg2"
+ width="20"
+ height="19"
+ viewBox="0 0 20 19"
+ sodipodi:docname="mag_sel.svg"
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="2096"
+ id="namedview4"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="32"
+ inkscape:cx="5.9792688"
+ inkscape:cy="1.1436277"
+ inkscape:window-x="1920"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <circle
+ style="fill:#000000;fill-opacity:0;stroke:#656565;stroke-width:1.4;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ id="path4611"
+ cx="5.5"
+ cy="8.5"
+ r="3.5" />
+ <path
+ style="fill:#656565;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 11,7 13.5,10 16,7 Z"
+ id="path4609"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#656565;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.1085854,11.109059 2.7823556,2.782356"
+ id="path4630"
+ inkscape:connector-curvature="0" />
+</svg>
diff --git a/templates/html/menu.js b/templates/html/menu.js
index 433c15b..2fe2214 100644
--- a/templates/html/menu.js
+++ b/templates/html/menu.js
@@ -1,25 +1,26 @@
/*
- @licstart The following is the entire license notice for the
- JavaScript code in this file.
+ @licstart The following is the entire license notice for the JavaScript code in this file.
- Copyright (C) 1997-2017 by Dimitri van Heesch
+ The MIT License (MIT)
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ Copyright (C) 1997-2020 by Dimitri van Heesch
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
- @licend The above is the entire license notice
- for the JavaScript code in this file
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
*/
function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
function makeTree(data,relPath) {
@@ -40,9 +41,9 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
if (searchEnabled) {
if (serverSide) {
- $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
+ $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.svg" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
} else {
- $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
+ $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.svg" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.svg" alt=""/></a></span></div></li>');
}
}
$('#main-menu').smartmenus();
diff --git a/templates/html/navtree.js b/templates/html/navtree.js
index edc31ef..1e272d3 100644
--- a/templates/html/navtree.js
+++ b/templates/html/navtree.js
@@ -1,24 +1,26 @@
/*
- @licstart The following is the entire license notice for the
- JavaScript code in this file.
+ @licstart The following is the entire license notice for the JavaScript code in this file.
- Copyright (C) 1997-2019 by Dimitri van Heesch
+ The MIT License (MIT)
- This program is free software; you can redistribute it and/or modify
- it under the terms of version 2 of the GNU General Public License as
- published by the Free Software Foundation.
+ Copyright (C) 1997-2020 by Dimitri van Heesch
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
- @licend The above is the entire license notice
- for the JavaScript code in this file
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
*/
var navTreeSubIndices = new Array();
var arrowDown = '&#9660;';
diff --git a/templates/html/resize.js b/templates/html/resize.js
index a0bb5f4..e1ad0fe 100644
--- a/templates/html/resize.js
+++ b/templates/html/resize.js
@@ -1,25 +1,26 @@
/*
- @licstart The following is the entire license notice for the
- JavaScript code in this file.
+ @licstart The following is the entire license notice for the JavaScript code in this file.
- Copyright (C) 1997-2017 by Dimitri van Heesch
+ The MIT License (MIT)
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ Copyright (C) 1997-2020 by Dimitri van Heesch
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
- @licend The above is the entire license notice
- for the JavaScript code in this file
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
*/
function initResizable()
{
@@ -91,7 +92,9 @@ function initResizable()
}
collapsedWidth=width;
}
- (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView();
+ if (location.hash.slice(1)) {
+ (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView();
+ }
}
function collapseExpand()
diff --git a/templates/html/search.css b/templates/html/search.css
index 859cf6a..830a23b 100644
--- a/templates/html/search.css
+++ b/templates/html/search.css
@@ -1,98 +1,82 @@
/*---------------- Search Box */
-#FSearchBox {
- float: left;
-}
-
#MSearchBox {
white-space : nowrap;
- float: none;
- margin-top: 8px;
- right: 0px;
- width: 170px;
- height: 24px;
+ background: white;
+ border-radius: 0.65em;
+ box-shadow: inset 0.5px 0.5px 3px 0px #555;
z-index: 102;
}
-#MSearchBox .left
-{
- display:block;
- position:absolute;
- left:10px;
- width:20px;
- height:19px;
- background:url('search_l.png') no-repeat;
- background-position:right;
+#MSearchBox .left {
+ display: inline-block;
+ vertical-align: middle;
+ height: 1.4em;
}
#MSearchSelect {
- display:block;
- position:absolute;
- width:20px;
- height:19px;
-}
-
-.left #MSearchSelect {
- left:4px;
-}
-
-.right #MSearchSelect {
- right:5px;
+ display: inline-block;
+ vertical-align: middle;
+ height: 1.4em;
+ padding: 0 0 0 0.3em;
+ margin: 0;
}
#MSearchField {
- display:block;
- position:absolute;
- height:19px;
- background:url('search_m.png') repeat-x;
+ display: inline-block;
+ vertical-align: middle;
+ width: 7.5em;
+ height: 1.1em;
+ margin: 0 0.15em;
+ padding: 0;
+ line-height: 1em;
border:none;
- width:115px;
- margin-left:20px;
- padding-left:4px;
color: #909090;
outline: none;
- font: 9pt Arial, Verdana, sans-serif;
+ font-family: Arial, Verdana, sans-serif;
-webkit-border-radius: 0px;
+ border-radius: 0px;
+ background: none;
}
-#FSearchBox #MSearchField {
- margin-left:15px;
-}
#MSearchBox .right {
- display:block;
- position:absolute;
- right:10px;
- top:8px;
- width:20px;
- height:19px;
- background:url('search_r.png') no-repeat;
- background-position:left;
+ display: inline-block;
+ vertical-align: middle;
+ width: 1.4em;
+ height: 1.4em;
}
#MSearchClose {
display: none;
- position: absolute;
- top: 4px;
+ font-size: inherit;
background : none;
border: none;
- margin: 0px 4px 0px 0px;
- padding: 0px 0px;
+ margin: 0;
+ padding: 0;
outline: none;
-}
-.left #MSearchClose {
- left: 6px;
}
-.right #MSearchClose {
- right: 2px;
+#MSearchCloseImg {
+ height: 1.4em;
+ padding: 0.3em;
+ margin: 0;
}
.MSearchBoxActive #MSearchField {
color: #000000;
}
+#main-menu > li:last-child {
+ /* This <li> object is the parent of the search bar */
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 36px;
+ margin-right: 1em;
+}
+
/*---------------- Search filter selection */
#MSearchSelectWindow {
@@ -220,19 +204,21 @@ a.SRScope:focus, a.SRScope:active {
span.SRScope {
padding-left: 4px;
+ font-family: Arial, Verdana, sans-serif;
}
.SRPage .SRStatus {
padding: 2px 5px;
font-size: 8pt;
font-style: italic;
+ font-family: Arial, Verdana, sans-serif;
}
.SRResult {
display: none;
}
-DIV.searchresults {
+div.searchresults {
margin-left: 10px;
margin-right: 10px;
}
diff --git a/templates/html/search.js b/templates/html/search.js
index a554ab9..fb226f7 100644
--- a/templates/html/search.js
+++ b/templates/html/search.js
@@ -1,25 +1,26 @@
/*
- @licstart The following is the entire license notice for the
- JavaScript code in this file.
+ @licstart The following is the entire license notice for the JavaScript code in this file.
- Copyright (C) 1997-2017 by Dimitri van Heesch
+ The MIT License (MIT)
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ Copyright (C) 1997-2020 by Dimitri van Heesch
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ The above copyright notice and this permission notice shall be included in all copies or
+ substantial portions of the Software.
- @licend The above is the entire license notice
- for the JavaScript code in this file
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
*/
function convertToId(search)
{
@@ -79,9 +80,10 @@ function getYPos(item)
storing this instance. Is needed to be able to set timeouts.
resultPath - path to use for external files
*/
-function SearchBox(name, resultsPath, inFrame, label)
+function SearchBox(name, resultsPath, inFrame, label, extension)
{
if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
+ if (!extension || extension == "") { extension = ".html"; }
// ---------- Instance variables
this.name = name;
@@ -96,6 +98,7 @@ function SearchBox(name, resultsPath, inFrame, label)
this.searchActive = false;
this.insideFrame = inFrame;
this.searchLabel = label;
+ this.extension = extension;
// ----------- DOM Elements
@@ -200,10 +203,9 @@ function SearchBox(name, resultsPath, inFrame, label)
}
return;
}
- else if (window.frames.MSearchResults.searchResults)
+ else
{
- var elem = window.frames.MSearchResults.searchResults.NavNext(0);
- if (elem) elem.focus();
+ window.frames.MSearchResults.postMessage("take_focus", "*");
}
}
else if (e.keyCode==27) // Escape out of the search field
@@ -347,13 +349,13 @@ function SearchBox(name, resultsPath, inFrame, label)
if (idx!=-1)
{
var hexCode=idx.toString(16);
- resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+ resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension;
resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
hasResultsPage = true;
}
else // nothing available for this search term
{
- resultsPage = this.resultsPath + '/nomatches.html';
+ resultsPage = this.resultsPath + '/nomatches' + this.extension;
resultsPageWithSearch = resultsPage;
hasResultsPage = false;
}
@@ -364,7 +366,7 @@ function SearchBox(name, resultsPath, inFrame, label)
if (domPopupSearchResultsWindow.style.display!='block')
{
var domSearchBox = this.DOMSearchBox();
- this.DOMSearchClose().style.display = 'inline';
+ this.DOMSearchClose().style.display = 'inline-block';
if (this.insideFrame)
{
var domPopupSearchResults = this.DOMPopupSearchResults();
@@ -439,12 +441,12 @@ function SearchResults(name)
while (element && element!=parentElement)
{
- if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+ if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren')
{
return element;
}
- if (element.nodeName == 'DIV' && element.hasChildNodes())
+ if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes())
{
element = element.firstChild;
}
diff --git a/templates/html/search_functions.php b/templates/html/search_functions.php
index 7374de9..22481db 100644
--- a/templates/html/search_functions.php
+++ b/templates/html/search_functions.php
@@ -7,7 +7,7 @@ function end_form($value)
global $translator;
if ($config['DISABLE_INDEX'] == false)
{
- echo " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"$value\" size=\"20\" accesskey=\"S\" onfocus=\"searchBox.OnSearchFieldFocus(true)\" onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n </form>\n </div><div class=\"right\"></div>\n </div>\n </li>\n </ul>\n </div>\n</div>\n";
+ echo "</div>\n";
}
if ($config['GENERATE_TREEVIEW'])
{
@@ -15,11 +15,6 @@ function end_form($value)
}
}
-function end_page()
-{
- echo "</body></html>";
-}
-
function search_results()
{
global $translator;
@@ -361,6 +356,5 @@ function main()
end_form(preg_replace("/[^a-zA-Z0-9\-\_\.\x80-\xFF]/i", " ", $query ));
// report results to the user
report_results($sorted);
- end_page();
}
?>
diff --git a/templates/html/svgpan.js b/templates/html/svgpan.js
index 1cad257..2678d38 100644
--- a/templates/html/svgpan.js
+++ b/templates/html/svgpan.js
@@ -1,57 +1,37 @@
/*
- @licstart The following is the entire license notice for the
- JavaScript code in this file.
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+ The code below is based on SVGPan Library 1.2 and was modified for doxygen
+ to support both zooming and panning via the mouse and via embedded buttons.
- Copyright (C) 1997-2017 by Dimitri van Heesch
+ This code is licensed under the following BSD license:
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ Copyright 2009-2010 Andrea Leofreddi <a.leofreddi@itcharm.com>. All rights reserved.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ Redistribution and use in source and binary forms, with or without modification, are
+ permitted provided that the following conditions are met:
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ 1. Redistributions of source code must retain the above copyright notice, this list of
+ conditions and the following disclaimer.
- @licend The above is the entire license notice
- for the JavaScript code in this file
- */
-/**
- * The code below is based on SVGPan Library 1.2 and was modified for doxygen
- * to support both zooming and panning via the mouse and via embedded buttons.
- *
- * This code is licensed under the following BSD license:
- *
- * Copyright 2009-2010 Andrea Leofreddi <a.leofreddi@itcharm.com>. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of Andrea Leofreddi.
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ of conditions and the following disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ The views and conclusions contained in the software and documentation are those of the
+ authors and should not be interpreted as representing official policies, either expressed
+ or implied, of Andrea Leofreddi.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
*/
var root = document.documentElement;
diff --git a/templates/latex/doxygen.sty b/templates/latex/doxygen.sty
index 78a5254..8f59bcc 100644
--- a/templates/latex/doxygen.sty
+++ b/templates/latex/doxygen.sty
@@ -13,6 +13,7 @@
\RequirePackage{tabu_doxygen}
\RequirePackage{fancyvrb}
\RequirePackage{tabularx}
+\RequirePackage{multicol}
\RequirePackage{multirow}
\RequirePackage{hanging}
\RequirePackage{ifpdf}
@@ -186,9 +187,8 @@
% (only if caption is specified)
\newenvironment{DoxyImage}{%
\begin{figure}[H]%
- \begin{center}%
+ \centering%
}{%
- \end{center}%
\end{figure}%
}
@@ -571,6 +571,6 @@
% Define caption that is also suitable in a table
\makeatletter
\def\doxyfigcaption{%
-\refstepcounter{figure}%
+\H@refstepcounter{figure}%
\@dblarg{\@caption{figure}}}
\makeatother
diff --git a/templates/xml/compound.xsd b/templates/xml/compound.xsd
index 67d7843..974a43c 100644
--- a/templates/xml/compound.xsd
+++ b/templates/xml/compound.xsd
@@ -1,5 +1,7 @@
<?xml version='1.0' encoding='utf-8' ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
+
<xsd:element name="doxygen" type="DoxygenType"/>
<!-- Complex types -->
@@ -9,6 +11,7 @@
<xsd:element name="compounddef" type="compounddefType" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="version" type="DoxVersionNumber" use="required" />
+ <xsd:attribute ref="xml:lang" use="required"/>
</xsd:complexType>
<xsd:complexType name="compounddefType">
@@ -43,6 +46,7 @@
<xsd:attribute name="language" type="DoxLanguage" use="optional"/>
<xsd:attribute name="prot" type="DoxProtectionKind" />
<xsd:attribute name="final" type="DoxBool" use="optional"/>
+ <xsd:attribute name="inline" type="DoxBool" use="optional"/>
<xsd:attribute name="sealed" type="DoxBool" use="optional"/>
<xsd:attribute name="abstract" type="DoxBool" use="optional"/>
</xsd:complexType>
@@ -104,6 +108,7 @@
<xsd:extension base="xsd:string">
<xsd:attribute name="refid" type="xsd:string" />
<xsd:attribute name="prot" type="DoxProtectionKind" use="optional"/>
+ <xsd:attribute name="inline" type="DoxBool" use="optional"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
@@ -447,7 +452,6 @@
<xsd:group name="docCmdGroup">
<xsd:choice>
<xsd:group ref="docTitleCmdGroup"/>
- <xsd:element name="linebreak" type="docEmptyType" />
<xsd:element name="hruler" type="docEmptyType" />
<xsd:element name="preformatted" type="docMarkupType" />
<xsd:element name="programlisting" type="listingType" />
@@ -460,7 +464,6 @@
<xsd:element name="variablelist" type="docVariableListType" />
<xsd:element name="table" type="docTableType" />
<xsd:element name="heading" type="docHeadingType" />
- <xsd:element name="image" type="docImageType" />
<xsd:element name="dotfile" type="docImageType" />
<xsd:element name="mscfile" type="docImageType" />
<xsd:element name="diafile" type="docImageType" />
@@ -570,6 +573,11 @@
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="thead" type="DoxBool" />
+ <xsd:attribute name="colspan" type="xsd:integer" />
+ <xsd:attribute name="rowspan" type="xsd:integer" />
+ <xsd:attribute name="align" type="DoxAlign" />
+ <xsd:attribute name="class" type="xsd:string" />
+ <xsd:anyAttribute processContents="skip"/>
</xsd:complexType>
<xsd:complexType name="docCaptionType" mixed="true">
@@ -772,7 +780,6 @@
<xsd:enumeration value="VHDL" />
<xsd:enumeration value="XML" />
<xsd:enumeration value="SQL" />
- <xsd:enumeration value="Tcl" />
<xsd:enumeration value="Markdown" />
</xsd:restriction>
</xsd:simpleType>
@@ -936,5 +943,13 @@
</xsd:restriction>
</xsd:simpleType>
+ <xsd:simpleType name="DoxAlign">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="left"/>
+ <xsd:enumeration value="right"/>
+ <xsd:enumeration value="center"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
</xsd:schema>
diff --git a/templates/xml/index.xsd b/templates/xml/index.xsd
index 04cb2f1..edb1d34 100644
--- a/templates/xml/index.xsd
+++ b/templates/xml/index.xsd
@@ -1,5 +1,7 @@
<?xml version='1.0' encoding='utf-8' ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
+
<xsd:element name="doxygenindex" type="DoxygenType"/>
<xsd:complexType name="DoxygenType">
@@ -7,6 +9,7 @@
<xsd:element name="compound" type="CompoundType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="version" type="xsd:string" use="required"/>
+ <xsd:attribute ref="xml:lang" use="required"/>
</xsd:complexType>
<xsd:complexType name="CompoundType">
diff --git a/templates/xml/xml.xsd b/templates/xml/xml.xsd
new file mode 100644
index 0000000..9f80fe1
--- /dev/null
+++ b/templates/xml/xml.xsd
@@ -0,0 +1,23 @@
+<?xml version='1.0'?>
+<xsd:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xml:lang="en">
+
+ <xsd:attribute name="lang" type="xsd:language">
+ </xsd:attribute>
+
+ <xsd:attribute name="space" default="preserve">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:NCName">
+ <xsd:enumeration value="default"/>
+ <xsd:enumeration value="preserve"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+
+ <xsd:attributeGroup name="specialAttrs">
+ <xsd:attribute ref="xml:lang"/>
+ <xsd:attribute ref="xml:space"/>
+ </xsd:attributeGroup>
+
+</xsd:schema>
diff --git a/testing/001/indexpage.xml b/testing/001/indexpage.xml
index 0d567f5..df18edd 100644
--- a/testing/001/indexpage.xml
+++ b/testing/001/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/002/indexpage.xml b/testing/002/indexpage.xml
index 25a731b..c74349b 100644
--- a/testing/002/indexpage.xml
+++ b/testing/002/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/003/indexpage.xml b/testing/003/indexpage.xml
index dbd1559..b1caea6 100644
--- a/testing/003/indexpage.xml
+++ b/testing/003/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/004/indexpage.xml b/testing/004/indexpage.xml
index fdaea0d..9ab6ae4 100644
--- a/testing/004/indexpage.xml
+++ b/testing/004/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/005/indexpage.xml b/testing/005/indexpage.xml
index 4a12dfd..5a3d36a 100644
--- a/testing/005/indexpage.xml
+++ b/testing/005/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/006/indexpage.xml b/testing/006/indexpage.xml
index 162aac0..b3c66ef 100644
--- a/testing/006/indexpage.xml
+++ b/testing/006/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/007/indexpage.xml b/testing/007/indexpage.xml
index 8e85063..62f3636 100644
--- a/testing/007/indexpage.xml
+++ b/testing/007/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/008/008__brief_8c.xml b/testing/008/008__brief_8c.xml
index 4fcf6a6..b8c3a32 100644
--- a/testing/008/008__brief_8c.xml
+++ b/testing/008/008__brief_8c.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="008__brief_8c" kind="file" language="C++">
<compoundname>008_brief.c</compoundname>
<briefdescription>
diff --git a/testing/009/bug.xml b/testing/009/bug.xml
index ca3a22a..ebafb9a 100644
--- a/testing/009/bug.xml
+++ b/testing/009/bug.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="bug" kind="page">
<compoundname>bug</compoundname>
<title>Bug List</title>
diff --git a/testing/009/class_bug.xml b/testing/009/class_bug.xml
index f972b4a..b629592 100644
--- a/testing/009/class_bug.xml
+++ b/testing/009/class_bug.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_bug" kind="class" language="C++" prot="public">
<compoundname>Bug</compoundname>
<sectiondef kind="public-func">
@@ -32,7 +32,7 @@
</xrefsect>
</para>
</detaileddescription>
- <location file="009_bug.cpp" line="16" column="1" bodyfile="009_bug.cpp" bodystart="15" bodyend="26"/>
+ <location file="009_bug.cpp" line="15" column="1" bodyfile="009_bug.cpp" bodystart="16" bodyend="26"/>
<listofallmembers>
<member refid="class_bug_1a1f720954dd97cd1203e80501a6eae74c" prot="public" virt="non-virtual">
<scope>Bug</scope>
diff --git a/testing/009/class_deprecated.xml b/testing/009/class_deprecated.xml
index 061bb34..0c08227 100644
--- a/testing/009/class_deprecated.xml
+++ b/testing/009/class_deprecated.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_deprecated" kind="class" language="C++" prot="public">
<compoundname>Deprecated</compoundname>
<sectiondef kind="public-func">
@@ -30,7 +30,7 @@
</xrefsect>
</para>
</detaileddescription>
- <location file="009_bug.cpp" line="30" column="1" bodyfile="009_bug.cpp" bodystart="29" bodyend="36"/>
+ <location file="009_bug.cpp" line="29" column="1" bodyfile="009_bug.cpp" bodystart="30" bodyend="36"/>
<listofallmembers>
<member refid="class_deprecated_1a1d5f6803e72c625727e7083d1722dbf9" prot="public" virt="non-virtual">
<scope>Deprecated</scope>
diff --git a/testing/009/class_reminder.xml b/testing/009/class_reminder.xml
index bdf2ee0..bd09607 100644
--- a/testing/009/class_reminder.xml
+++ b/testing/009/class_reminder.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_reminder" kind="class" language="C++" prot="public">
<compoundname>Reminder</compoundname>
<sectiondef kind="public-func">
@@ -37,7 +37,7 @@
</xrefsect>
</para>
</detaileddescription>
- <location file="009_bug.cpp" line="56" column="1" bodyfile="009_bug.cpp" bodystart="55" bodyend="60"/>
+ <location file="009_bug.cpp" line="55" column="1" bodyfile="009_bug.cpp" bodystart="56" bodyend="60"/>
<listofallmembers>
<member refid="class_reminder_1a173b5218bb11287b0e86a550d9f0728d" prot="public" virt="non-virtual">
<scope>Reminder</scope>
diff --git a/testing/009/class_test.xml b/testing/009/class_test.xml
index 64f287f..79a9ca7 100644
--- a/testing/009/class_test.xml
+++ b/testing/009/class_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_test" kind="class" language="C++" prot="public">
<compoundname>Test</compoundname>
<sectiondef kind="public-func">
@@ -37,7 +37,7 @@
</xrefsect>
</para>
</detaileddescription>
- <location file="009_bug.cpp" line="48" column="1" bodyfile="009_bug.cpp" bodystart="47" bodyend="52"/>
+ <location file="009_bug.cpp" line="47" column="1" bodyfile="009_bug.cpp" bodystart="48" bodyend="52"/>
<listofallmembers>
<member refid="class_test_1a9fc54b716f326514a4c5f434137f4fc0" prot="public" virt="non-virtual">
<scope>Test</scope>
diff --git a/testing/009/class_todo.xml b/testing/009/class_todo.xml
index a4fed63..00e55d2 100644
--- a/testing/009/class_todo.xml
+++ b/testing/009/class_todo.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_todo" kind="class" language="C++" prot="public">
<compoundname>Todo</compoundname>
<sectiondef kind="public-func">
@@ -37,7 +37,7 @@
</xrefsect>
</para>
</detaileddescription>
- <location file="009_bug.cpp" line="40" column="1" bodyfile="009_bug.cpp" bodystart="39" bodyend="44"/>
+ <location file="009_bug.cpp" line="39" column="1" bodyfile="009_bug.cpp" bodystart="40" bodyend="44"/>
<listofallmembers>
<member refid="class_todo_1a9e70ec9176ac4c1b20e011b4daddc9d8" prot="public" virt="non-virtual">
<scope>Todo</scope>
diff --git a/testing/009/deprecated.xml b/testing/009/deprecated.xml
index c3fc2a2..e25331d 100644
--- a/testing/009/deprecated.xml
+++ b/testing/009/deprecated.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="deprecated" kind="page">
<compoundname>deprecated</compoundname>
<title>Deprecated List</title>
diff --git a/testing/009/reminders.xml b/testing/009/reminders.xml
index 4818541..ccdedf1 100644
--- a/testing/009/reminders.xml
+++ b/testing/009/reminders.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="reminders" kind="page">
<compoundname>reminders</compoundname>
<title>Reminders</title>
diff --git a/testing/009/test.xml b/testing/009/test.xml
index 665dc0e..04d615c 100644
--- a/testing/009/test.xml
+++ b/testing/009/test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="test" kind="page">
<compoundname>test</compoundname>
<title>Test List</title>
diff --git a/testing/009/todo.xml b/testing/009/todo.xml
index c3b160f..7cdaea6 100644
--- a/testing/009/todo.xml
+++ b/testing/009/todo.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="todo" kind="page">
<compoundname>todo</compoundname>
<title>Todo List</title>
diff --git a/testing/010/indexpage.xml b/testing/010/indexpage.xml
index 05c297e..6deac96 100644
--- a/testing/010/indexpage.xml
+++ b/testing/010/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/011/category_integer_07_arithmetic_08.xml b/testing/011/category_integer_07_arithmetic_08.xml
index 0705628..bfde98e 100644
--- a/testing/011/category_integer_07_arithmetic_08.xml
+++ b/testing/011/category_integer_07_arithmetic_08.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="category_integer_07_arithmetic_08" kind="category" language="Objective-C" prot="public">
<compoundname>Integer(Arithmetic)</compoundname>
<sectiondef kind="public-func">
@@ -45,7 +45,7 @@
<detaileddescription>
<para>A category </para>
</detaileddescription>
- <location file="011_category.m" line="17" column="19" bodyfile="011_category.m" bodystart="17" bodyend="-1"/>
+ <location file="011_category.m" line="17" column="12" bodyfile="011_category.m" bodystart="17" bodyend="-1"/>
<listofallmembers>
<member refid="category_integer_07_arithmetic_08_1a12f411c5872ba3bafb8ea7dd1826cf2a" prot="public" virt="virtual">
<scope>Integer(Arithmetic)</scope>
diff --git a/testing/011/interface_integer.xml b/testing/011/interface_integer.xml
index 21d71fd..45833d8 100644
--- a/testing/011/interface_integer.xml
+++ b/testing/011/interface_integer.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="interface_integer" kind="class" language="Objective-C" prot="public">
<compoundname>Integer</compoundname>
<basecompoundref prot="public" virt="non-virtual">Object</basecompoundref>
@@ -80,7 +80,7 @@
</childnode>
</node>
</collaborationgraph>
- <location file="011_category.m" line="6" column="26" bodyfile="011_category.m" bodystart="6" bodyend="-1"/>
+ <location file="011_category.m" line="6" column="12" bodyfile="011_category.m" bodystart="6" bodyend="-1"/>
<listofallmembers>
<member refid="interface_integer_1a35e89216966d8179a1b77f14b8211fda" prot="protected" virt="non-virtual">
<scope>Integer</scope>
diff --git a/testing/012/citelist.xml b/testing/012/citelist.xml
index 81e46e5..f5addb1 100644
--- a/testing/012/citelist.xml
+++ b/testing/012/citelist.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="citelist" kind="page">
<compoundname>citelist</compoundname>
<title>Bibliography</title>
@@ -12,14 +12,14 @@
<term><anchor id="citelist_1CITEREF_Be09"/>[1]</term>
</varlistentry>
<listitem>
- <para>P.<nonbreakablespace/>Belotti. <ulink url="http://doi.org/10.1007/978-1-4614-1927-3_5">Disjunctive cuts for non-convex MINLP</ulink>. In <ulink url="#CITEREF_LeLe12">Lee and Leyffer</ulink> <ulink url="#CITEREF_LeLe12">[4]</ulink>, pages 117<ndash/>144.</para>
+ <para>P.<nonbreakablespace/>Belotti. <ulink url="https://link.springer.com/10.1007/978-1-4614-1927-3_5">Disjunctive cuts for non-convex MINLP</ulink>. In <ulink url="#CITEREF_LeLe12">Lee and Leyffer</ulink> <ulink url="#CITEREF_LeLe12">[4]</ulink>, pages 117<ndash/>144.</para>
<para/>
</listitem>
<varlistentry>
<term><anchor id="citelist_1CITEREF_BertholdHeinzVigerske2009"/>[2]</term>
</varlistentry>
<listitem>
- <para>T.<nonbreakablespace/>Berthold, S.<nonbreakablespace/>Heinz, and S.<nonbreakablespace/>Vigerske. <ulink url="http://doi.org/10.1007/978-1-4614-1927-3_15">Extending a CIP framework to solve MIQCPs</ulink>. In <ulink url="#CITEREF_LeLe12">Lee and Leyffer</ulink> <ulink url="#CITEREF_LeLe12">[4]</ulink>, pages 427<ndash/>444.</para>
+ <para>T.<nonbreakablespace/>Berthold, S.<nonbreakablespace/>Heinz, and S.<nonbreakablespace/>Vigerske. <ulink url="https://link.springer.com/10.1007/978-1-4614-1927-3_15">Extending a CIP framework to solve MIQCPs</ulink>. In <ulink url="#CITEREF_LeLe12">Lee and Leyffer</ulink> <ulink url="#CITEREF_LeLe12">[4]</ulink>, pages 427<ndash/>444.</para>
<para/>
</listitem>
<varlistentry>
@@ -33,7 +33,7 @@
<term><anchor id="citelist_1CITEREF_LeLe12"/>[4]</term>
</varlistentry>
<listitem>
- <para>Jon Lee and Sven Leyffer, editors. <ulink url="http://doi.org/10.1007/978-1-4614-1927-3"><emphasis>Mixed Integer Nonlinear Programming</emphasis></ulink>, volume 154 of <emphasis>The IMA Volumes in Mathematics and its Applications</emphasis>. Springer, 2012.</para>
+ <para>Jon Lee and Sven Leyffer, editors. <ulink url="https://link.springer.com/10.1007/978-1-4614-1927-3"><emphasis>Mixed Integer Nonlinear Programming</emphasis></ulink>, volume 154 of <emphasis>The IMA Volumes in Mathematics and its Applications</emphasis>. Springer, 2012.</para>
<para/>
</listitem>
</variablelist>
diff --git a/testing/012/indexpage.xml b/testing/012/indexpage.xml
index 3ee0fc8..26e588c 100644
--- a/testing/012/indexpage.xml
+++ b/testing/012/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/013/class_t1.xml b/testing/013/class_t1.xml
index ba91621..9d921a0 100644
--- a/testing/013/class_t1.xml
+++ b/testing/013/class_t1.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_t1" kind="class" language="C++" prot="public">
<compoundname>T1</compoundname>
<includes refid="013__class_8h" local="yes">inc/013_class.h</includes>
@@ -8,7 +8,7 @@
<detaileddescription>
<para>A class </para>
</detaileddescription>
- <location file="013_class.h" line="11" column="1" bodyfile="013_class.h" bodystart="10" bodyend="12"/>
+ <location file="013_class.h" line="10" column="1" bodyfile="013_class.h" bodystart="11" bodyend="12"/>
<listofallmembers>
</listofallmembers>
</compounddef>
diff --git a/testing/013/class_t2.xml b/testing/013/class_t2.xml
index 9df47e2..ee8c2f1 100644
--- a/testing/013/class_t2.xml
+++ b/testing/013/class_t2.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_t2" kind="class" language="C++" prot="public">
<compoundname>T2</compoundname>
<includes refid="013__class_8h" local="no">013_class.h</includes>
@@ -8,7 +8,7 @@
<detaileddescription>
<para>class <ref refid="class_t2" kindref="compound">T2</ref> </para>
</detaileddescription>
- <location file="013_class.h" line="15" column="1" bodyfile="013_class.h" bodystart="14" bodyend="16"/>
+ <location file="013_class.h" line="14" column="1" bodyfile="013_class.h" bodystart="15" bodyend="16"/>
<listofallmembers>
</listofallmembers>
</compounddef>
diff --git a/testing/013/class_t3.xml b/testing/013/class_t3.xml
index dc0cd3f..0b64499 100644
--- a/testing/013/class_t3.xml
+++ b/testing/013/class_t3.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_t3" kind="class" language="C++" prot="public">
<compoundname>T3</compoundname>
<includes refid="013__class_8h" local="no">013_class.h</includes>
@@ -8,7 +8,7 @@
<detaileddescription>
<para>class <ref refid="class_t3" kindref="compound">T3</ref> </para>
</detaileddescription>
- <location file="013_class.h" line="19" column="1" bodyfile="013_class.h" bodystart="18" bodyend="20"/>
+ <location file="013_class.h" line="18" column="1" bodyfile="013_class.h" bodystart="19" bodyend="20"/>
<listofallmembers>
</listofallmembers>
</compounddef>
diff --git a/testing/013/class_t4.xml b/testing/013/class_t4.xml
index 52955d2..bb0aec0 100644
--- a/testing/013/class_t4.xml
+++ b/testing/013/class_t4.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_t4" kind="class" language="C++" prot="public">
<compoundname>T4</compoundname>
<includes refid="013__class_8h" local="yes">inc/013_class.h</includes>
@@ -8,7 +8,7 @@
<detaileddescription>
<para>class <ref refid="class_t4" kindref="compound">T4</ref> </para>
</detaileddescription>
- <location file="013_class.h" line="23" column="1" bodyfile="013_class.h" bodystart="22" bodyend="24"/>
+ <location file="013_class.h" line="22" column="1" bodyfile="013_class.h" bodystart="23" bodyend="24"/>
<listofallmembers>
</listofallmembers>
</compounddef>
diff --git a/testing/014/indexpage.xml b/testing/014/indexpage.xml
index 3fb3867..0d60a80 100644
--- a/testing/014/indexpage.xml
+++ b/testing/014/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/015/015__cond_8c.xml b/testing/015/015__cond_8c.xml
index 8700967..81ec4b5 100644
--- a/testing/015/015__cond_8c.xml
+++ b/testing/015/015__cond_8c.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="015__cond_8c" kind="file" language="C++">
<compoundname>015_cond.c</compoundname>
<sectiondef kind="func">
diff --git a/testing/016/016__copydoc_8c.xml b/testing/016/016__copydoc_8c.xml
index 78a746a..4d0d786 100644
--- a/testing/016/016__copydoc_8c.xml
+++ b/testing/016/016__copydoc_8c.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="016__copydoc_8c" kind="file" language="C++">
<compoundname>016_copydoc.c</compoundname>
<sectiondef kind="func">
diff --git a/testing/017/indexpage.xml b/testing/017/indexpage.xml
index 3326ee8..c6739e9 100644
--- a/testing/017/indexpage.xml
+++ b/testing/017/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/018/018__def_8c.xml b/testing/018/018__def_8c.xml
index 837a85a..ec26900 100644
--- a/testing/018/018__def_8c.xml
+++ b/testing/018/018__def_8c.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="018__def_8c" kind="file" language="C++">
<compoundname>018_def.c</compoundname>
<sectiondef kind="define">
@@ -41,7 +41,7 @@
</detaileddescription>
<inbodydescription>
</inbodydescription>
- <location file="018_def.c" line="13" column="7" bodyfile="018_def.c" bodystart="13" bodyend="13"/>
+ <location file="018_def.c" line="13" column="1" bodyfile="018_def.c" bodystart="13" bodyend="13"/>
</memberdef>
</sectiondef>
<sectiondef kind="typedef">
diff --git a/testing/019/group__g1.xml b/testing/019/group__g1.xml
index d6807ca..5754a4e 100644
--- a/testing/019/group__g1.xml
+++ b/testing/019/group__g1.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="group__g1" kind="group">
<compoundname>g1</compoundname>
<title>First Group</title>
@@ -20,9 +20,9 @@
</memberdef>
</sectiondef>
<briefdescription>
- <para>Text for first group. </para>
</briefdescription>
<detaileddescription>
+ <para>Text for first group. </para>
</detaileddescription>
</compounddef>
</doxygen>
diff --git a/testing/019/group__g2.xml b/testing/019/group__g2.xml
index 3514d89..2a9a98e 100644
--- a/testing/019/group__g2.xml
+++ b/testing/019/group__g2.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="group__g2" kind="group">
<compoundname>g2</compoundname>
<title>Second Group</title>
@@ -21,9 +21,9 @@
</memberdef>
</sectiondef>
<briefdescription>
- <para>Text for second group. </para>
</briefdescription>
<detaileddescription>
+ <para>Text for second group. </para>
</detaileddescription>
</compounddef>
</doxygen>
diff --git a/testing/019/group__g3.xml b/testing/019/group__g3.xml
index 0f21232..f65be47 100644
--- a/testing/019/group__g3.xml
+++ b/testing/019/group__g3.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="group__g3" kind="group">
<compoundname>g3</compoundname>
<title>Third Group</title>
@@ -34,9 +34,9 @@
</memberdef>
</sectiondef>
<briefdescription>
- <para>Text for third group. </para>
</briefdescription>
<detaileddescription>
+ <para>Text for third group. </para>
</detaileddescription>
</compounddef>
</doxygen>
diff --git a/testing/019_defgroup.c b/testing/019_defgroup.c
index d42d63e..d7e440e 100644
--- a/testing/019_defgroup.c
+++ b/testing/019_defgroup.c
@@ -38,7 +38,7 @@ void func_g3();
/** \} */
/** \addtogroup g3
- * \{
+ * \{
*/
/** Another function added to the third group */
diff --git a/testing/020/indexpage.xml b/testing/020/indexpage.xml
index 8820cf7..863a088 100644
--- a/testing/020/indexpage.xml
+++ b/testing/020/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/021/indexpage.xml b/testing/021/indexpage.xml
index 3ecbd0a..477f206 100644
--- a/testing/021/indexpage.xml
+++ b/testing/021/indexpage.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
<briefdescription>
</briefdescription>
<detaileddescription>
- <para> Our main function starts like this: <programlisting filename="example_test.cpp"><codeline><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>main()</highlight></codeline><codeline><highlight class="normal">{</highlight></codeline></programlisting> First we create a object <computeroutput>t</computeroutput> of the <ref refid="class_test" kindref="compound">Test</ref> class. <programlisting filename="example_test.cpp"><codeline><highlight class="normal"><sp/><sp/><ref refid="class_test" kindref="compound">Test</ref><sp/>t;</highlight></codeline></programlisting> Then we call the example member function <programlisting filename="example_test.cpp"><codeline><highlight class="normal"><sp/><sp/>t.<ref refid="class_test_1a47b775f65718978f1ffcd96376f8ecfa" kindref="member">example</ref>();</highlight></codeline></programlisting> After that our little test routine ends. <programlisting filename="example_test.cpp"><codeline><highlight class="normal">}</highlight></codeline></programlisting> </para>
+ <para> Our main function starts like this: <programlisting filename="example_test.cpp"><codeline><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>main()</highlight></codeline><codeline><highlight class="normal">{</highlight></codeline></programlisting> First we create a object <computeroutput>t</computeroutput> of the <ref refid="class_test" kindref="compound">Test</ref> class. <programlisting filename="example_test.cpp"><codeline><highlight class="normal"><sp/><sp/><ref refid="class_test" kindref="compound">Test</ref><sp/>t;</highlight></codeline></programlisting> Then we call the example member function <programlisting filename="example_test.cpp"><codeline><highlight class="normal"><sp/><sp/>t.<ref refid="class_test_1a47b775f65718978f1ffcd96376f8ecfa" kindref="member">example</ref>();</highlight></codeline></programlisting> After that our little test routine ends. <programlisting filename="example_test.cpp"><codeline><highlight class="normal">}</highlight></codeline></programlisting> </para>
</detaileddescription>
</compounddef>
</doxygen>
diff --git a/testing/022/indexpage.xml b/testing/022/indexpage.xml
index 0fcee9c..581130a 100644
--- a/testing/022/indexpage.xml
+++ b/testing/022/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/023/indexpage.xml b/testing/023/indexpage.xml
index c87860c..3f605db 100644
--- a/testing/023/indexpage.xml
+++ b/testing/023/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/024/indexpage.xml b/testing/024/indexpage.xml
index 7396177..bd94eb8 100644
--- a/testing/024/indexpage.xml
+++ b/testing/024/indexpage.xml
@@ -1,12 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
<briefdescription>
</briefdescription>
<detaileddescription>
- <para>Unconditional (start) Enabled (if). Enabled (else). Unconditional (middle) Enabled (else). Unconditional (end) </para>
+ <para>Unconditional (start) Enabled (if). Enabled (else). Unconditional (middle) Enabled (else). Unconditional (end)</para>
+ <sect1 id="index_1autotoc_md0">
+ <title>with spaces</title>
+ <para>test1 test3 test4.</para>
+ <para>test1 test2 test4.</para>
+ <para>test1 test2 test3.</para>
+ <para>test1 test3.</para>
+ </sect1>
+ <sect1 id="index_1autotoc_md1">
+ <title>without spaces</title>
+ <para>test1test3test4.</para>
+ <para>test1test2test4.</para>
+ <para>test1test2test3.</para>
+ <para>test1test3. </para>
+ </sect1>
</detaileddescription>
</compounddef>
</doxygen>
diff --git a/testing/024_if.dox b/testing/024_if.dox
index f24be43..281ffe5 100644
--- a/testing/024_if.dox
+++ b/testing/024_if.dox
@@ -18,4 +18,24 @@
* Enabled (else).
* \endif
* Unconditional (end)
+ *
+ * # with spaces
+ *
+ * test1 \ifnot GUARD_ENABLED test2 \else test3 \endif test4.
+ *
+ * test1 \if GUARD_ENABLED test2 \else test3 \endif test4.
+ *
+ * test1 \if GUARD_ENABLED test2 \endif test3.
+ *
+ * test1 \if NOT_ENABLED test2 \endif test3.
+ *
+ * # without spaces
+ *
+ * test1\ifnot GUARD_ENABLED test2\else test3\endif test4.
+ *
+ * test1\if GUARD_ENABLED test2\else test3\endif test4.
+ *
+ * test1\if GUARD_ENABLED test2\endif test3.
+ *
+ * test1\if NOT_ENABLED test2\endif test3.
*/
diff --git a/testing/025/class_test.xml b/testing/025/class_test.xml
index 7438488..f181488 100644
--- a/testing/025/class_test.xml
+++ b/testing/025/class_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_test" kind="class" language="C++" prot="public">
<compoundname>Test</compoundname>
<sectiondef kind="public-func">
@@ -25,7 +25,7 @@
<detaileddescription>
<para>More details about this class. </para>
</detaileddescription>
- <location file="025_example.cpp" line="11" column="1" bodyfile="025_example.cpp" bodystart="10" bodyend="18"/>
+ <location file="025_example.cpp" line="10" column="1" bodyfile="025_example.cpp" bodystart="11" bodyend="18"/>
<listofallmembers>
<member refid="class_test_1a47b775f65718978f1ffcd96376f8ecfa" prot="public" virt="non-virtual">
<scope>Test</scope>
diff --git a/testing/025/example_test_8cpp-example.xml b/testing/025/example_test_8cpp-example.xml
index 6bcee68..55bcfd6 100644
--- a/testing/025/example_test_8cpp-example.xml
+++ b/testing/025/example_test_8cpp-example.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="example_test_8cpp-example" kind="example">
<compoundname>example_test.cpp</compoundname>
<briefdescription>
diff --git a/testing/026/class_test.xml b/testing/026/class_test.xml
index 469ba7c..872746e 100644
--- a/testing/026/class_test.xml
+++ b/testing/026/class_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_test" kind="class" language="C++" prot="public">
<compoundname>Test</compoundname>
<templateparamlist>
@@ -41,7 +41,7 @@
<para>A <ref refid="class_test" kindref="compound">Test</ref> class. More details about this class. <parameterlist kind="templateparam"><parameteritem><parameternamelist><parametername>T</parametername></parameternamelist><parameterdescription><para>A template parameter. </para></parameterdescription></parameteritem></parameterlist>
</para>
</detaileddescription>
- <location file="026_exception.cpp" line="9" column="1" bodyfile="026_exception.cpp" bodystart="8" bodyend="20"/>
+ <location file="026_exception.cpp" line="8" column="11" bodyfile="026_exception.cpp" bodystart="9" bodyend="20"/>
<listofallmembers>
<member refid="class_test_1abf9d5fbdaa4c23d0a513ee9746060779" prot="public" virt="non-virtual">
<scope>Test</scope>
diff --git a/testing/027/struct_car.xml b/testing/027/struct_car.xml
index b3d9894..8b203e5 100644
--- a/testing/027/struct_car.xml
+++ b/testing/027/struct_car.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="struct_car" kind="struct" language="C++" prot="public">
<compoundname>Car</compoundname>
<basecompoundref refid="struct_vehicle" prot="public" virt="non-virtual">Vehicle</basecompoundref>
@@ -68,7 +68,7 @@
</childnode>
</node>
</collaborationgraph>
- <location file="027_extends.c" line="68" column="1" bodyfile="027_extends.c" bodystart="67" bodyend="70"/>
+ <location file="027_extends.c" line="67" column="1" bodyfile="027_extends.c" bodystart="68" bodyend="70"/>
<listofallmembers>
<member refid="struct_car_1ab8ff28306286da5a8b14fa9bdccaafaa" prot="protected" virt="non-virtual">
<scope>Car</scope>
diff --git a/testing/027/struct_object.xml b/testing/027/struct_object.xml
index 754906e..7ab7e7a 100644
--- a/testing/027/struct_object.xml
+++ b/testing/027/struct_object.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="struct_object" kind="struct" language="C++" prot="public">
<compoundname>Object</compoundname>
<derivedcompoundref refid="struct_vehicle" prot="public" virt="non-virtual">Vehicle</derivedcompoundref>
@@ -86,7 +86,7 @@
</childnode>
</node>
</inheritancegraph>
- <location file="027_extends.c" line="20" column="1" bodyfile="027_extends.c" bodystart="19" bodyend="22"/>
+ <location file="027_extends.c" line="19" column="1" bodyfile="027_extends.c" bodystart="20" bodyend="22"/>
<listofallmembers>
<member refid="struct_object_1a71225073d06a793b9a6ea9263ed37b12" prot="public" virt="non-virtual">
<scope>Object</scope>
diff --git a/testing/027/struct_truck.xml b/testing/027/struct_truck.xml
index 0da26dc..588f425 100644
--- a/testing/027/struct_truck.xml
+++ b/testing/027/struct_truck.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="struct_truck" kind="struct" language="C++" prot="public">
<compoundname>Truck</compoundname>
<basecompoundref refid="struct_vehicle" prot="public" virt="non-virtual">Vehicle</basecompoundref>
@@ -68,7 +68,7 @@
<link refid="struct_object"/>
</node>
</collaborationgraph>
- <location file="027_extends.c" line="78" column="1" bodyfile="027_extends.c" bodystart="77" bodyend="80"/>
+ <location file="027_extends.c" line="77" column="1" bodyfile="027_extends.c" bodystart="78" bodyend="80"/>
<listofallmembers>
<member refid="struct_truck_1ad0ac321609dda1a6c552488b05ec7ac8" prot="protected" virt="non-virtual">
<scope>Truck</scope>
diff --git a/testing/027/struct_vehicle.xml b/testing/027/struct_vehicle.xml
index 40c2be2..380f3e7 100644
--- a/testing/027/struct_vehicle.xml
+++ b/testing/027/struct_vehicle.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="struct_vehicle" kind="struct" language="C++" prot="public">
<compoundname>Vehicle</compoundname>
<basecompoundref refid="struct_object" prot="public" virt="non-virtual">Object</basecompoundref>
@@ -105,7 +105,7 @@
<link refid="struct_object"/>
</node>
</collaborationgraph>
- <location file="027_extends.c" line="44" column="1" bodyfile="027_extends.c" bodystart="43" bodyend="46"/>
+ <location file="027_extends.c" line="43" column="1" bodyfile="027_extends.c" bodystart="44" bodyend="46"/>
<listofallmembers>
<member refid="struct_vehicle_1ad7970f528d429f6fc1725173e93a77c2" prot="protected" virt="non-virtual">
<scope>Vehicle</scope>
diff --git a/testing/028/indexpage.xml b/testing/028/indexpage.xml
index c13e1b2..11d3932 100644
--- a/testing/028/indexpage.xml
+++ b/testing/028/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/029/029__hideinit_8c.xml b/testing/029/029__hideinit_8c.xml
index c13192f..0a0a57b 100644
--- a/testing/029/029__hideinit_8c.xml
+++ b/testing/029/029__hideinit_8c.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="029__hideinit_8c" kind="file" language="C++">
<compoundname>029_hideinit.c</compoundname>
<sectiondef kind="var">
diff --git a/testing/030/indexpage.xml b/testing/030/indexpage.xml
index a45eb8d..646a128 100644
--- a/testing/030/indexpage.xml
+++ b/testing/030/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/031/indexpage.xml b/testing/031/indexpage.xml
index eaf374b..fc030f6 100644
--- a/testing/031/indexpage.xml
+++ b/testing/031/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
@@ -11,43 +11,43 @@
<image type="docbook" name="sample.png"/>
More text.</para>
<para>SVG image with caption:<linebreak/>
-<image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.svg">A caption</image>
+<image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.svg">A caption</image>
</para>
<para>PNG image with caption:<linebreak/>
-<image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.png">A caption</image>
+<image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.png">A caption</image>
</para>
<para>SVG image without caption:<linebreak/>
-<image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.svg"/>
+<image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.svg"/>
</para>
<para>PNG image without caption:<linebreak/>
-<image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.png"/>
+<image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.png"/>
</para>
<para>Inline SVG image with caption:<linebreak/>
-This image is inline <image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.svg" inline="yes">MIT license</image>
+This image is inline <image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.svg" inline="yes">MIT license</image>
within the text.</para>
<para>Inline PNG image with caption:<linebreak/>
-This image is inline <image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.png" inline="yes">MIT license</image>
+This image is inline <image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.png" inline="yes">MIT license</image>
within the text.</para>
<para>Markdown style linked SVG image:<linebreak/>
-<ulink url="http://opensource.org/licenses/MIT"><image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.svg" inline="yes"/></ulink></para>
+<ulink url="https://opensource.org/licenses/MIT"><image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.svg" inline="yes"/></ulink></para>
<para>Markdown style linked PNG image:<linebreak/>
-<ulink url="http://opensource.org/licenses/MIT"><image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.png" inline="yes"/></ulink></para>
+<ulink url="https://opensource.org/licenses/MIT"><image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.png" inline="yes"/></ulink></para>
<para>HTML style linked SVG image:<linebreak/>
-<ulink url="http://opensource.org/licenses/MIT"><image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.svg" inline="yes"/></ulink></para>
+<ulink url="https://opensource.org/licenses/MIT"><image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.svg" inline="yes"/></ulink></para>
<para>HTML style linked PNG image:<linebreak/>
-<ulink url="http://opensource.org/licenses/MIT"><image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.png" inline="yes"/></ulink></para>
+<ulink url="https://opensource.org/licenses/MIT"><image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.png" inline="yes"/></ulink></para>
<para>HTML style unlinked SVG image:<linebreak/>
-<image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.svg" inline="yes"/>
+<image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.svg" inline="yes"/>
</para>
<para>HTML style unlinked PNG image:<linebreak/>
-<image type="html" name="http://img.shields.io/badge/license-MIT-brightgreen.png" inline="yes"/>
+<image type="html" name="https://raster.shields.io/badge/license-MIT-brightgreen.png" inline="yes"/>
</para>
<para>Some markdown image tests<linebreak/>
-<image type="html" name="https://img.shields.io/badge/docs-Doxygen-blue.svg?foo&amp;bar" inline="yes"/>
- <ulink url="http://www.doxygen.nl?foo&amp;bar">Some normal link</ulink></para>
+<image type="html" name="https://raster.shields.io/badge/docs-Doxygen-blue.svg?foo&amp;bar" inline="yes"/>
+ <ulink url="https://www.doxygen.nl/index.html?foo&amp;bar">Some normal link</ulink></para>
<para>
- <image type="html" name="https://img.shields.io/badge/docs-Doxygen-blue.svg?foo&amp;bar" inline="yes"/>
- <ulink url="http://www.doxygen.nl?foo&amp;bar">Some normal link</ulink>
+ <image type="html" name="https://raster.shields.io/badge/docs-Doxygen-blue.svg?foo&amp;bar" inline="yes"/>
+ <ulink url="https://www.doxygen.nl/index.html?foo&amp;bar">Some normal link</ulink>
</para>
</detaileddescription>
</compounddef>
diff --git a/testing/031_image.dox b/testing/031_image.dox
index e451592..4a67116 100644
--- a/testing/031_image.dox
+++ b/testing/031_image.dox
@@ -9,51 +9,51 @@ Some text.
More text.
SVG image with caption:\n
-\image html http://img.shields.io/badge/license-MIT-brightgreen.svg "A caption"
+\image html https://raster.shields.io/badge/license-MIT-brightgreen.svg "A caption"
PNG image with caption:\n
-\image html http://img.shields.io/badge/license-MIT-brightgreen.png "A caption"
+\image html https://raster.shields.io/badge/license-MIT-brightgreen.png "A caption"
SVG image without caption:\n
-\image html http://img.shields.io/badge/license-MIT-brightgreen.svg
+\image html https://raster.shields.io/badge/license-MIT-brightgreen.svg
PNG image without caption:\n
-\image html http://img.shields.io/badge/license-MIT-brightgreen.png
+\image html https://raster.shields.io/badge/license-MIT-brightgreen.png
Inline SVG image with caption:\n
-This image is inline \image{inline} html http://img.shields.io/badge/license-MIT-brightgreen.svg "MIT license" within the text.
+This image is inline \image{inline} html https://raster.shields.io/badge/license-MIT-brightgreen.svg "MIT license" within the text.
Inline PNG image with caption:\n
This image is inline
-\image{inline} html http://img.shields.io/badge/license-MIT-brightgreen.png "MIT license"
+\image{inline} html https://raster.shields.io/badge/license-MIT-brightgreen.png "MIT license"
within the text.
Markdown style linked SVG image:\n
-[![MIT license](http://img.shields.io/badge/license-MIT-brightgreen.svg)](http://opensource.org/licenses/MIT)
+[![MIT license](https://raster.shields.io/badge/license-MIT-brightgreen.svg)](https://opensource.org/licenses/MIT)
Markdown style linked PNG image:\n
-[![MIT license](http://img.shields.io/badge/license-MIT-brightgreen.png)](http://opensource.org/licenses/MIT)
+[![MIT license](https://raster.shields.io/badge/license-MIT-brightgreen.png)](https://opensource.org/licenses/MIT)
HTML style linked SVG image:\n
-<a href="http://opensource.org/licenses/MIT">
-<img src="http://img.shields.io/badge/license-MIT-brightgreen.svg" alt="MIT license">
+<a href="https://opensource.org/licenses/MIT">
+<img src="https://raster.shields.io/badge/license-MIT-brightgreen.svg" alt="MIT license">
</a>
HTML style linked PNG image:\n
-<a href="http://opensource.org/licenses/MIT">
-<img src="http://img.shields.io/badge/license-MIT-brightgreen.png" alt="MIT license">
+<a href="https://opensource.org/licenses/MIT">
+<img src="https://raster.shields.io/badge/license-MIT-brightgreen.png" alt="MIT license">
</a>
HTML style unlinked SVG image:\n
-<img src="http://img.shields.io/badge/license-MIT-brightgreen.svg" alt="MIT license"/>
+<img src="https://raster.shields.io/badge/license-MIT-brightgreen.svg" alt="MIT license"/>
HTML style unlinked PNG image:\n
-<img src="http://img.shields.io/badge/license-MIT-brightgreen.png" alt="MIT license"/>
+<img src="https://raster.shields.io/badge/license-MIT-brightgreen.png" alt="MIT license"/>
Some markdown image tests\n
-![Some SVG image](https://img.shields.io/badge/docs-Doxygen-blue.svg?foo&bar)
-[Some normal link](http://www.doxygen.nl?foo&bar)
+![Some SVG image](https://raster.shields.io/badge/docs-Doxygen-blue.svg?foo&bar)
+[Some normal link](https://www.doxygen.nl/index.html?foo&bar)
-![Some SVG image](https://img.shields.io/badge/docs-Doxygen-blue.svg?foo&amp;bar)
-[Some normal link](http://www.doxygen.nl?foo&amp;bar)
+![Some SVG image](https://raster.shields.io/badge/docs-Doxygen-blue.svg?foo&amp;bar)
+[Some normal link](https://www.doxygen.nl/index.html?foo&amp;bar)
*/
diff --git a/testing/032/indexpage.xml b/testing/032/indexpage.xml
index 89d8c1f..742c401 100644
--- a/testing/032/indexpage.xml
+++ b/testing/032/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/033/indexpage.xml b/testing/033/indexpage.xml
index 652e5de..8894e6c 100644
--- a/testing/033/indexpage.xml
+++ b/testing/033/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/034/indexpage.xml b/testing/034/indexpage.xml
index 0252b3c..409298d 100644
--- a/testing/034/indexpage.xml
+++ b/testing/034/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/035/035__invariant_8c.xml b/testing/035/035__invariant_8c.xml
index 0bdd7a6..d1c6455 100644
--- a/testing/035/035__invariant_8c.xml
+++ b/testing/035/035__invariant_8c.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="035__invariant_8c" kind="file" language="C++">
<compoundname>035_invariant.c</compoundname>
<sectiondef kind="func">
diff --git a/testing/036/036__link_8c.xml b/testing/036/036__link_8c.xml
index db238fb..e045d1b 100644
--- a/testing/036/036__link_8c.xml
+++ b/testing/036/036__link_8c.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="036__link_8c" kind="file" language="C++">
<compoundname>036_link.c</compoundname>
<innerclass refid="class_test" prot="public">Test</innerclass>
diff --git a/testing/037/037__msc_8cpp.xml b/testing/037/037__msc_8cpp.xml
new file mode 100644
index 0000000..487880c
--- /dev/null
+++ b/testing/037/037__msc_8cpp.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="037__msc_8cpp" kind="file" language="C++">
+ <compoundname>037_msc.cpp</compoundname>
+ <innerclass refid="class_sender" prot="public">Sender</innerclass>
+ <innerclass refid="class_receiver" prot="public">Receiver</innerclass>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ <para>A bit more complex msc diagram, with also parallel events. <msc>
+Sender_1,Receiver_1,Sender1_1,
+Sender,Receiver,Sender1,
+Sender_2,Receiver_2,Sender1_2;
+
+Sender_1-&gt;Receiver_1 [label="Command()", URL="nref Receiver::Command()"],
+Sender1_1&lt;-Receiver_1 [label="Ack()", URL="nref Ack()", ID="1"];
+
+Sender-&gt;Receiver [label="Command()", URL="nref Receiver::Command()"];
+Sender1&lt;-Receiver [label="Ack()", URL="nref Ack()", ID="1"];
+Sender_2-&gt;Receiver_2 [label="Command()", URL="nref Receiver::Command()"],
+Sender1_2&lt;-Receiver_2 [label="Ack()", URL="nref Ack()", ID="1"];
+</msc>
+ </para>
+ </detaileddescription>
+ <location file="037_msc.cpp"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/037/class_receiver.xml b/testing/037/class_receiver.xml
index 21156d7..15f3611 100644
--- a/testing/037/class_receiver.xml
+++ b/testing/037/class_receiver.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_receiver" kind="class" language="C++" prot="public">
<compoundname>Receiver</compoundname>
<sectiondef kind="public-func">
@@ -19,7 +19,7 @@
</detaileddescription>
<inbodydescription>
</inbodydescription>
- <location file="037_msc.cpp" line="32" column="10"/>
+ <location file="037_msc.cpp" line="50" column="10"/>
</memberdef>
</sectiondef>
<briefdescription>
@@ -32,7 +32,7 @@
</msc>
</para>
</detaileddescription>
- <location file="037_msc.cpp" line="29" column="1" bodyfile="037_msc.cpp" bodystart="28" bodyend="33"/>
+ <location file="037_msc.cpp" line="46" column="1" bodyfile="037_msc.cpp" bodystart="47" bodyend="51"/>
<listofallmembers>
<member refid="class_receiver_1a162099741e0324e6254c9bc570566e40" prot="public" virt="non-virtual">
<scope>Receiver</scope>
diff --git a/testing/037/class_sender.xml b/testing/037/class_sender.xml
index 53ba04e..91dd3d6 100644
--- a/testing/037/class_sender.xml
+++ b/testing/037/class_sender.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_sender" kind="class" language="C++" prot="public">
<compoundname>Sender</compoundname>
<sectiondef kind="public-func">
@@ -19,7 +19,7 @@
</detaileddescription>
<inbodydescription>
</inbodydescription>
- <location file="037_msc.cpp" line="17" column="10"/>
+ <location file="037_msc.cpp" line="35" column="10"/>
</memberdef>
</sectiondef>
<briefdescription>
@@ -32,7 +32,7 @@
</msc>
</para>
</detaileddescription>
- <location file="037_msc.cpp" line="14" column="1" bodyfile="037_msc.cpp" bodystart="13" bodyend="18"/>
+ <location file="037_msc.cpp" line="31" column="1" bodyfile="037_msc.cpp" bodystart="32" bodyend="36"/>
<listofallmembers>
<member refid="class_sender_1a8ad2c6f9baa4e798868fe4a4d45f8fda" prot="public" virt="non-virtual">
<scope>Sender</scope>
diff --git a/testing/037_msc.cpp b/testing/037_msc.cpp
index 84ffc55..a3c0e4b 100644
--- a/testing/037_msc.cpp
+++ b/testing/037_msc.cpp
@@ -1,6 +1,24 @@
// objective: test the \msc and \endmsc commands
// check: class_sender.xml
// check: class_receiver.xml
+// check: 037__msc_8cpp.xml
+
+/** \file
+ * A bit more complex msc diagram, with also parallel events.
+ * \msc
+ * Sender_1,Receiver_1,Sender1_1,
+ * Sender,Receiver,Sender1,
+ * Sender_2,Receiver_2,Sender1_2;
+ *
+ * Sender_1->Receiver_1 [label="Command()", URL="nref Receiver::Command()"],
+ * Sender1_1<-Receiver_1 [label="Ack()", URL="nref Ack()", ID="1"];
+ *
+ * Sender->Receiver [label="Command()", URL="nref Receiver::Command()"];
+ * Sender1<-Receiver [label="Ack()", URL="nref Ack()", ID="1"];
+ * Sender_2->Receiver_2 [label="Command()", URL="nref Receiver::Command()"],
+ * Sender1_2<-Receiver_2 [label="Ack()", URL="nref Ack()", ID="1"];
+ * \endmsc
+ */
/** Sender class. Can be used to send a command to the server.
* The receiver will acknowledge the command by calling Ack().
diff --git a/testing/038/indexpage.xml b/testing/038/indexpage.xml
index 2258113..3309dda 100644
--- a/testing/038/indexpage.xml
+++ b/testing/038/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/039/class_test.xml b/testing/039/class_test.xml
index ca7ff62..8dd6574 100644
--- a/testing/039/class_test.xml
+++ b/testing/039/class_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_test" kind="class" language="C++" prot="public">
<compoundname>Test</compoundname>
<sectiondef kind="user-defined">
@@ -55,7 +55,7 @@
<detaileddescription>
<para>More details about this class. </para>
</detaileddescription>
- <location file="039_name.cpp" line="9" column="1" bodyfile="039_name.cpp" bodystart="8" bodyend="24"/>
+ <location file="039_name.cpp" line="8" column="1" bodyfile="039_name.cpp" bodystart="9" bodyend="24"/>
<listofallmembers>
<member refid="class_test_1a78e37a450a276b60a5a2fa4a46c86f2e" prot="public" virt="non-virtual">
<scope>Test</scope>
diff --git a/testing/040/namespace_n_s.xml b/testing/040/namespace_n_s.xml
index 64beb23..c751aa6 100644
--- a/testing/040/namespace_n_s.xml
+++ b/testing/040/namespace_n_s.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="namespace_n_s" kind="namespace" language="C++">
<compoundname>NS</compoundname>
<briefdescription>
@@ -7,6 +7,6 @@
<detaileddescription>
<para>A namespace </para>
</detaileddescription>
- <location file="040_namespace.cpp" line="5" column="1"/>
+ <location file="040_namespace.cpp" line="4" column="1"/>
</compounddef>
</doxygen>
diff --git a/testing/041/class_test.xml b/testing/041/class_test.xml
index c4c1d9c..c4dda88 100644
--- a/testing/041/class_test.xml
+++ b/testing/041/class_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_test" kind="class" language="C++" prot="public">
<compoundname>Test</compoundname>
<sectiondef kind="public-func">
@@ -81,7 +81,7 @@
<detaileddescription>
<para>More text. </para>
</detaileddescription>
- <location file="041_overload.cpp" line="5" column="1" bodyfile="041_overload.cpp" bodystart="4" bodyend="10"/>
+ <location file="041_overload.cpp" line="4" column="1" bodyfile="041_overload.cpp" bodystart="5" bodyend="10"/>
<listofallmembers>
<member refid="class_test_1a8e7b46ceaf7bd2ab94114b390b3288ca" prot="public" virt="non-virtual">
<scope>Test</scope>
diff --git a/testing/042/namespaceorg_1_1doxygen_1_1_test.xml b/testing/042/namespaceorg_1_1doxygen_1_1_test.xml
index cd243d5..1446a50 100644
--- a/testing/042/namespaceorg_1_1doxygen_1_1_test.xml
+++ b/testing/042/namespaceorg_1_1doxygen_1_1_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="namespaceorg_1_1doxygen_1_1_test" kind="namespace" language="Java">
<compoundname>org::doxygen::Test</compoundname>
<briefdescription>
diff --git a/testing/043/another.xml b/testing/043/another.xml
index 2c2e61b..66688bd 100644
--- a/testing/043/another.xml
+++ b/testing/043/another.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="another" kind="page">
<compoundname>another</compoundname>
<title>Another Page</title>
diff --git a/testing/043/mypage.xml b/testing/043/mypage.xml
index c9bd6d0..c02b4c4 100644
--- a/testing/043/mypage.xml
+++ b/testing/043/mypage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="mypage" kind="page">
<compoundname>mypage</compoundname>
<title>Page Title</title>
diff --git a/testing/044/struct_s.xml b/testing/044/struct_s.xml
index 7214f29..4aa6bfd 100644
--- a/testing/044/struct_s.xml
+++ b/testing/044/struct_s.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="struct_s" kind="struct" language="C++" prot="public">
<compoundname>S</compoundname>
<includes refid="044__section_8h" local="no">044_section.h</includes>
@@ -98,7 +98,7 @@
<detaileddescription>
<para>A struct </para>
</detaileddescription>
- <location file="044_section.h" line="6" column="1" bodyfile="044_section.h" bodystart="5" bodyend="27"/>
+ <location file="044_section.h" line="5" column="1" bodyfile="044_section.h" bodystart="6" bodyend="27"/>
<listofallmembers>
<member refid="struct_s_1ab754fee7e3500035f644d0ac528cbfc3" prot="private" virt="non-virtual">
<scope>S</scope>
diff --git a/testing/045/indexpage.xml b/testing/045/indexpage.xml
index 294ceb8..aaa8934 100644
--- a/testing/045/indexpage.xml
+++ b/testing/045/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/046/046__related_8cpp.xml b/testing/046/046__related_8cpp.xml
index 6386d5d..a63565c 100644
--- a/testing/046/046__related_8cpp.xml
+++ b/testing/046/046__related_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="046__related_8cpp" kind="file" language="C++">
<compoundname>046_related.cpp</compoundname>
<innerclass refid="class_test" prot="public">Test</innerclass>
diff --git a/testing/046/class_test.xml b/testing/046/class_test.xml
index 0a9f22c..453b463 100644
--- a/testing/046/class_test.xml
+++ b/testing/046/class_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_test" kind="class" language="C++" prot="public">
<compoundname>Test</compoundname>
<sectiondef kind="public-func">
@@ -61,7 +61,7 @@
<para>A test class <simplesect kind="see"><para><ref refid="class_test_1a1683da699dc049d74101488d143c8e98" kindref="member">Test::method()</ref></para></simplesect>
</para>
</detaileddescription>
- <location file="046_related.cpp" line="11" column="1" bodyfile="046_related.cpp" bodystart="10" bodyend="15"/>
+ <location file="046_related.cpp" line="10" column="1" bodyfile="046_related.cpp" bodystart="11" bodyend="15"/>
<listofallmembers>
<member refid="class_test_1a1283d836e0611ff772c1b06a31ecbbfe" prot="public" virt="non-virtual">
<scope>Test</scope>
diff --git a/testing/047/047__return_8cpp.xml b/testing/047/047__return_8cpp.xml
index 4e3d3e9..8692da0 100644
--- a/testing/047/047__return_8cpp.xml
+++ b/testing/047/047__return_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="047__return_8cpp" kind="file" language="C++">
<compoundname>047_return.cpp</compoundname>
<sectiondef kind="func">
diff --git a/testing/048/048__showinit_8c.xml b/testing/048/048__showinit_8c.xml
index 3037c9c..de17a15 100644
--- a/testing/048/048__showinit_8c.xml
+++ b/testing/048/048__showinit_8c.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="048__showinit_8c" kind="file" language="C++">
<compoundname>048_showinit.c</compoundname>
<sectiondef kind="var">
diff --git a/testing/049/indexpage.xml b/testing/049/indexpage.xml
index f7cb48c..c5ae30f 100644
--- a/testing/049/indexpage.xml
+++ b/testing/049/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/050/indexpage.xml b/testing/050/indexpage.xml
index f3cd647..1987274 100644
--- a/testing/050/indexpage.xml
+++ b/testing/050/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
@@ -19,7 +19,7 @@
title = {Extending a {CIP} framework to solve {MIQCP}s},
crossref = {LeLe12},
pages = {427--444},
- url = {http://doi.org/10.1007/978-1-4614-1927-3_15}
+ url = {https://link.springer.com/10.1007/978-1-4614-1927-3_15}
}
@Book{ LeLe12,
title = {Mixed Integer Nonlinear Programming},
@@ -29,7 +29,7 @@
editor = {Jon Lee and Sven Leyffer},
volume = {154},
series = {The IMA Volumes in Mathematics and its Applications},
- url = {http://doi.org/10.1007/978-1-4614-1927-3},
+ url = {https://link.springer.com/10.1007/978-1-4614-1927-3},
issn = {978-1-4614-1926-6}
}
@InCollection{ Be09,
@@ -37,7 +37,7 @@
title = {Disjunctive cuts for non-convex {MINLP}},
crossref = {LeLe12},
pages = {117--144},
- url = {http://doi.org/10.1007/978-1-4614-1927-3_5}
+ url = {https://link.springer.com/10.1007/978-1-4614-1927-3_5}
}
</verbatim> More text after the verbatim section. </para>
</detaileddescription>
diff --git a/testing/051/indexpage.xml b/testing/051/indexpage.xml
index 2d37333..63f2d91 100644
--- a/testing/051/indexpage.xml
+++ b/testing/051/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/052/indexpage.xml b/testing/052/indexpage.xml
index d952781..0306320 100644
--- a/testing/052/indexpage.xml
+++ b/testing/052/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/053/indexpage.xml b/testing/053/indexpage.xml
index 211bb9a..9f33bcf 100644
--- a/testing/053/indexpage.xml
+++ b/testing/053/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="nl">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/054/054__parblock_8cpp.xml b/testing/054/054__parblock_8cpp.xml
index 0eefc0b..4ebf1f1 100644
--- a/testing/054/054__parblock_8cpp.xml
+++ b/testing/054/054__parblock_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="054__parblock_8cpp" kind="file" language="C++">
<compoundname>054_parblock.cpp</compoundname>
<sectiondef kind="func">
diff --git a/testing/055/md_055_markdown.xml b/testing/055/md_055_markdown.xml
index 18555aa..423a28c 100644
--- a/testing/055/md_055_markdown.xml
+++ b/testing/055/md_055_markdown.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="md_055_markdown" kind="page">
<compoundname>md_055_markdown</compoundname>
<title>055_markdown</title>
@@ -25,6 +25,12 @@
</para>
<para>Dash - NDash <ndash/> MDash <mdash/> EDash - ENDash -- EMDash --- E3Dash --- </para>
</sect2>
+ <sect2 id="md_055_markdown_1autotoc_md3">
+ <title>Markdown in HTML</title>
+ <para>
+ <heading level="3"><bold>Header3</bold> blah <emphasis>blah</emphasis> <computeroutput>blah</computeroutput></heading>
+ </para>
+ </sect2>
</sect1>
</detaileddescription>
</compounddef>
diff --git a/testing/055_markdown.md b/testing/055_markdown.md
index 375040e..695c340 100644
--- a/testing/055_markdown.md
+++ b/testing/055_markdown.md
@@ -22,3 +22,7 @@ More text
[U]: http://example.com/last-line
Dash - NDash -- MDash --- EDash \- ENDash \-- EMDash \--- E3Dash \-\-\-
+
+## Markdown in HTML
+
+<h3>**Header3** blah _blah_ `blah`</h3>
diff --git a/testing/056/indexpage.xml b/testing/056/indexpage.xml
index 55240e9..ac89900 100644
--- a/testing/056/indexpage.xml
+++ b/testing/056/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/057/057__caller__graphs_8tcl.xml b/testing/057/057__caller__graphs_8tcl.xml
deleted file mode 100644
index 1046e30..0000000
--- a/testing/057/057__caller__graphs_8tcl.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="057__caller__graphs_8tcl" kind="file" language="Tcl">
- <compoundname>057_caller_graphs.tcl</compoundname>
- <innernamespace refid="namespacebar">bar</innernamespace>
- <innernamespace refid="namespacefoo">foo</innernamespace>
- <innernamespace refid="namespace1_1_11_1_11">1::1::1</innernamespace>
- <innernamespace refid="namespace1">1</innernamespace>
- <innernamespace refid="namespace1_1_11">1::1</innernamespace>
- <innernamespace refid="namespace2_1_12_1_12_1_12_1_12">2::2::2::2::2</innernamespace>
- <innernamespace refid="namespace2">2</innernamespace>
- <innernamespace refid="namespace2_1_12">2::2</innernamespace>
- <innernamespace refid="namespace2_1_12_1_12">2::2::2</innernamespace>
- <innernamespace refid="namespace2_1_12_1_12_1_12">2::2::2::2</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="057__caller__graphs_8tcl_1a85c692c418fec91930cfc7b3e82857d7" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>baz</definition>
- <argsstring>args</argsstring>
- <name>baz</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="59" column="1" bodyfile="057_caller_graphs.tcl" bodystart="59" bodyend="61"/>
- </memberdef>
- <memberdef kind="function" id="057__caller__graphs_8tcl_1ae4e1c2bb3adfdfbb71f52de84a8285b0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>bar</definition>
- <argsstring>args</argsstring>
- <name>bar</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="65" column="1" bodyfile="057_caller_graphs.tcl" bodystart="65" bodyend="67"/>
- <referencedby refid="namespace1_1a9722420639306872cea2593b83028a45" compoundref="057__caller__graphs_8tcl" startline="85" endline="88">1::test3</referencedby>
- </memberdef>
- <memberdef kind="function" id="057__caller__graphs_8tcl_1a3f808a00e1b937978455d707851ab33a" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>next</definition>
- <argsstring>args</argsstring>
- <name>next</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="102" column="1" bodyfile="057_caller_graphs.tcl" bodystart="102" bodyend="105"/>
- <references refid="namespace2_1a2839d9dea7f0d08f48958c3fc0cd00d3" compoundref="057__caller__graphs_8tcl" startline="106" endline="114">2::next</references>
- </memberdef>
- <memberdef kind="function" id="057__caller__graphs_8tcl_1a12acb916374f925e7b7ba302a1ca4efb" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>master</definition>
- <argsstring>args</argsstring>
- <name>master</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="136" column="1" bodyfile="057_caller_graphs.tcl" bodystart="136" bodyend="140"/>
- <references refid="__057__caller__graphs_8tcl_1a7c3c8acee94bf61ba9e911dafe35adac" compoundref="__057__caller__graphs_8tcl" startline="1" endline="4">inFileB</references>
- </memberdef>
- <memberdef kind="function" id="057__caller__graphs_8tcl_1a7482c00c17357cf4846b0c1bd715979c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>inFileA</definition>
- <argsstring>args</argsstring>
- <name>inFileA</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="141" column="1" bodyfile="057_caller_graphs.tcl" bodystart="141" bodyend="144"/>
- <referencedby refid="__057__caller__graphs_8tcl_1a7c3c8acee94bf61ba9e911dafe35adac" compoundref="__057__caller__graphs_8tcl" startline="1" endline="4">inFileB</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="057_caller_graphs.tcl"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/__057__caller__graphs_8tcl.xml b/testing/057/__057__caller__graphs_8tcl.xml
deleted file mode 100644
index a71e7b5..0000000
--- a/testing/057/__057__caller__graphs_8tcl.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="__057__caller__graphs_8tcl" kind="file" language="Tcl">
- <compoundname>_057_caller_graphs.tcl</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="__057__caller__graphs_8tcl_1a7c3c8acee94bf61ba9e911dafe35adac" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>inFileB</definition>
- <argsstring>args</argsstring>
- <name>inFileB</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="_057_caller_graphs.tcl" line="1" column="1" bodyfile="_057_caller_graphs.tcl" bodystart="1" bodyend="4"/>
- <references refid="057__caller__graphs_8tcl_1a7482c00c17357cf4846b0c1bd715979c" compoundref="057__caller__graphs_8tcl" startline="141" endline="144">inFileA</references>
- <referencedby refid="057__caller__graphs_8tcl_1a12acb916374f925e7b7ba302a1ca4efb" compoundref="057__caller__graphs_8tcl" startline="136" endline="140">master</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="_057_caller_graphs.tcl"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespace1.xml b/testing/057/namespace1.xml
deleted file mode 100644
index 33d073d..0000000
--- a/testing/057/namespace1.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespace1" kind="namespace" language="Tcl">
- <compoundname>1</compoundname>
- <innernamespace refid="namespace1_1_11">1::1</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespace1_1a5024a7bc323958c7230615f2fcaeaef8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>1::baz</definition>
- <argsstring>args</argsstring>
- <name>baz</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="62" column="1" bodyfile="057_caller_graphs.tcl" bodystart="62" bodyend="64"/>
- <referencedby refid="namespace1_1a4a8285288ee1994ac886e2039777339e" compoundref="057__caller__graphs_8tcl" startline="77" endline="80">test1</referencedby>
- <referencedby refid="namespace1_1a11615154d3c207ed4106dd0bcb0639e8" compoundref="057__caller__graphs_8tcl" startline="93" endline="96">test5</referencedby>
- </memberdef>
- <memberdef kind="function" id="namespace1_1ad58c8f16ad5f12178c71ca988865bb58" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>1::bar</definition>
- <argsstring>args</argsstring>
- <name>bar</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="68" column="1" bodyfile="057_caller_graphs.tcl" bodystart="68" bodyend="70"/>
- <referencedby refid="namespace1_1ae1e88bb7ddd332348d7e29ac4a211b00" compoundref="057__caller__graphs_8tcl" startline="81" endline="84">test2</referencedby>
- </memberdef>
- <memberdef kind="function" id="namespace1_1a4a8285288ee1994ac886e2039777339e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>1::test1</definition>
- <argsstring>args</argsstring>
- <name>test1</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="77" column="1" bodyfile="057_caller_graphs.tcl" bodystart="77" bodyend="80"/>
- <references refid="namespace1_1a5024a7bc323958c7230615f2fcaeaef8" compoundref="057__caller__graphs_8tcl" startline="62" endline="64">baz</references>
- </memberdef>
- <memberdef kind="function" id="namespace1_1ae1e88bb7ddd332348d7e29ac4a211b00" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>1::test2</definition>
- <argsstring>args</argsstring>
- <name>test2</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="81" column="1" bodyfile="057_caller_graphs.tcl" bodystart="81" bodyend="84"/>
- <references refid="namespace1_1ad58c8f16ad5f12178c71ca988865bb58" compoundref="057__caller__graphs_8tcl" startline="68" endline="70">bar</references>
- </memberdef>
- <memberdef kind="function" id="namespace1_1a9722420639306872cea2593b83028a45" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>1::test3</definition>
- <argsstring>args</argsstring>
- <name>test3</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="85" column="1" bodyfile="057_caller_graphs.tcl" bodystart="85" bodyend="88"/>
- <references refid="057__caller__graphs_8tcl_1ae4e1c2bb3adfdfbb71f52de84a8285b0" compoundref="057__caller__graphs_8tcl" startline="65" endline="67">bar</references>
- </memberdef>
- <memberdef kind="function" id="namespace1_1addc9b30656419de5e2651e27a013db29" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>1::test4</definition>
- <argsstring>args</argsstring>
- <name>test4</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="89" column="1" bodyfile="057_caller_graphs.tcl" bodystart="89" bodyend="92"/>
- <references refid="namespace1_1_11_1acebecc4cb718010d00c3c150158b75ab" compoundref="057__caller__graphs_8tcl" startline="71" endline="73">1::1::bar</references>
- </memberdef>
- <memberdef kind="function" id="namespace1_1a11615154d3c207ed4106dd0bcb0639e8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>1::test5</definition>
- <argsstring>args</argsstring>
- <name>test5</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="93" column="1" bodyfile="057_caller_graphs.tcl" bodystart="93" bodyend="96"/>
- <references refid="namespace1_1a5024a7bc323958c7230615f2fcaeaef8" compoundref="057__caller__graphs_8tcl" startline="62" endline="64">baz</references>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="[generated]" line="1" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespace1_1_11.xml b/testing/057/namespace1_1_11.xml
deleted file mode 100644
index e13e261..0000000
--- a/testing/057/namespace1_1_11.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespace1_1_11" kind="namespace" language="Tcl">
- <compoundname>1::1</compoundname>
- <innernamespace refid="namespace1_1_11_1_11">1::1::1</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespace1_1_11_1acebecc4cb718010d00c3c150158b75ab" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>1::1::bar</definition>
- <argsstring>args</argsstring>
- <name>bar</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="71" column="1" bodyfile="057_caller_graphs.tcl" bodystart="71" bodyend="73"/>
- <referencedby refid="namespace1_1addc9b30656419de5e2651e27a013db29" compoundref="057__caller__graphs_8tcl" startline="89" endline="92">1::test4</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="[generated]" line="1" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespace1_1_11_1_11.xml b/testing/057/namespace1_1_11_1_11.xml
deleted file mode 100644
index 55b7838..0000000
--- a/testing/057/namespace1_1_11_1_11.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespace1_1_11_1_11" kind="namespace" language="Tcl">
- <compoundname>1::1::1</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespace1_1_11_1_11_1aa604df053f7ebe36205d1a5675459b96" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>1::1::1::bar</definition>
- <argsstring>args</argsstring>
- <name>bar</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="74" column="1" bodyfile="057_caller_graphs.tcl" bodystart="74" bodyend="76"/>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="057_caller_graphs.tcl" line="58" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespace2.xml b/testing/057/namespace2.xml
deleted file mode 100644
index a8a9bc6..0000000
--- a/testing/057/namespace2.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespace2" kind="namespace" language="Tcl">
- <compoundname>2</compoundname>
- <innernamespace refid="namespace2_1_12">2::2</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespace2_1a2839d9dea7f0d08f48958c3fc0cd00d3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>2::next</definition>
- <argsstring>args</argsstring>
- <name>next</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="106" column="1" bodyfile="057_caller_graphs.tcl" bodystart="106" bodyend="114"/>
- <references refid="namespace2_1_12_1aceefa876cf364f44da1f523d3f7b0649" compoundref="057__caller__graphs_8tcl" startline="115" endline="118">2::2::next</references>
- <referencedby refid="057__caller__graphs_8tcl_1a3f808a00e1b937978455d707851ab33a" compoundref="057__caller__graphs_8tcl" startline="102" endline="105">next</referencedby>
- <referencedby refid="namespace2_1_12_1_12_1_12_1_12_1ac07f64c62783fd8b44317389b4a711f8" compoundref="057__caller__graphs_8tcl" startline="127" endline="130">2::2::2::2::2::next</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="[generated]" line="1" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespace2_1_12.xml b/testing/057/namespace2_1_12.xml
deleted file mode 100644
index a188f00..0000000
--- a/testing/057/namespace2_1_12.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespace2_1_12" kind="namespace" language="Tcl">
- <compoundname>2::2</compoundname>
- <innernamespace refid="namespace2_1_12_1_12">2::2::2</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespace2_1_12_1aceefa876cf364f44da1f523d3f7b0649" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>2::2::next</definition>
- <argsstring>args</argsstring>
- <name>next</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="115" column="1" bodyfile="057_caller_graphs.tcl" bodystart="115" bodyend="118"/>
- <references refid="namespace2_1_12_1_12_1a85524e2015e377d433cd8384335c11d6" compoundref="057__caller__graphs_8tcl" startline="119" endline="122">2::2::2::next</references>
- <referencedby refid="namespace2_1a2839d9dea7f0d08f48958c3fc0cd00d3" compoundref="057__caller__graphs_8tcl" startline="106" endline="114">2::next</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="[generated]" line="1" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespace2_1_12_1_12.xml b/testing/057/namespace2_1_12_1_12.xml
deleted file mode 100644
index e83b3fd..0000000
--- a/testing/057/namespace2_1_12_1_12.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespace2_1_12_1_12" kind="namespace" language="Tcl">
- <compoundname>2::2::2</compoundname>
- <innernamespace refid="namespace2_1_12_1_12_1_12">2::2::2::2</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespace2_1_12_1_12_1a85524e2015e377d433cd8384335c11d6" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>2::2::2::next</definition>
- <argsstring>args</argsstring>
- <name>next</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="119" column="1" bodyfile="057_caller_graphs.tcl" bodystart="119" bodyend="122"/>
- <references refid="namespace2_1_12_1_12_1_12_1a3ea6e2ce66f4a9c30009852e4c7da2fe" compoundref="057__caller__graphs_8tcl" startline="123" endline="126">2::2::2::2::next</references>
- <referencedby refid="namespace2_1_12_1aceefa876cf364f44da1f523d3f7b0649" compoundref="057__caller__graphs_8tcl" startline="115" endline="118">2::2::next</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="[generated]" line="1" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespace2_1_12_1_12_1_12.xml b/testing/057/namespace2_1_12_1_12_1_12.xml
deleted file mode 100644
index 83c2a73..0000000
--- a/testing/057/namespace2_1_12_1_12_1_12.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespace2_1_12_1_12_1_12" kind="namespace" language="Tcl">
- <compoundname>2::2::2::2</compoundname>
- <innernamespace refid="namespace2_1_12_1_12_1_12_1_12">2::2::2::2::2</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespace2_1_12_1_12_1_12_1a3ea6e2ce66f4a9c30009852e4c7da2fe" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>2::2::2::2::next</definition>
- <argsstring>args</argsstring>
- <name>next</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="123" column="1" bodyfile="057_caller_graphs.tcl" bodystart="123" bodyend="126"/>
- <references refid="namespace2_1_12_1_12_1_12_1_12_1ac07f64c62783fd8b44317389b4a711f8" compoundref="057__caller__graphs_8tcl" startline="127" endline="130">2::2::2::2::2::next</references>
- <referencedby refid="namespace2_1_12_1_12_1a85524e2015e377d433cd8384335c11d6" compoundref="057__caller__graphs_8tcl" startline="119" endline="122">2::2::2::next</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="[generated]" line="1" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespace2_1_12_1_12_1_12_1_12.xml b/testing/057/namespace2_1_12_1_12_1_12_1_12.xml
deleted file mode 100644
index 9222625..0000000
--- a/testing/057/namespace2_1_12_1_12_1_12_1_12.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespace2_1_12_1_12_1_12_1_12" kind="namespace" language="Tcl">
- <compoundname>2::2::2::2::2</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespace2_1_12_1_12_1_12_1_12_1ac07f64c62783fd8b44317389b4a711f8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>2::2::2::2::2::next</definition>
- <argsstring>args</argsstring>
- <name>next</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="127" column="1" bodyfile="057_caller_graphs.tcl" bodystart="127" bodyend="130"/>
- <references refid="namespace2_1a2839d9dea7f0d08f48958c3fc0cd00d3" compoundref="057__caller__graphs_8tcl" startline="106" endline="114">2::next</references>
- <referencedby refid="namespace2_1_12_1_12_1_12_1a3ea6e2ce66f4a9c30009852e4c7da2fe" compoundref="057__caller__graphs_8tcl" startline="123" endline="126">2::2::2::2::next</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="057_caller_graphs.tcl" line="101" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespacebar.xml b/testing/057/namespacebar.xml
deleted file mode 100644
index e16966e..0000000
--- a/testing/057/namespacebar.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespacebar" kind="namespace" language="Tcl">
- <compoundname>bar</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespacebar_1aa1678a9adb588c0b91b118de7cc38ddb" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>bar::slave</definition>
- <argsstring/>
- <name>slave</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="29" column="1" bodyfile="057_caller_graphs.tcl" bodystart="29" bodyend="35"/>
- <references refid="namespacebar_1a3426cd3a2eebcffa0dc333bcf5e2fe5e" compoundref="057__caller__graphs_8tcl" startline="36" endline="39">baz</references>
- <referencedby refid="namespacefoo_1a265acdcaea6da32c3bbd9afb5d0e32a4" compoundref="057__caller__graphs_8tcl" startline="44" endline="48">foo::master</referencedby>
- </memberdef>
- <memberdef kind="function" id="namespacebar_1a3426cd3a2eebcffa0dc333bcf5e2fe5e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>bar::baz</definition>
- <argsstring/>
- <name>baz</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="36" column="1" bodyfile="057_caller_graphs.tcl" bodystart="36" bodyend="39"/>
- <references refid="namespacebar_1a88879545dee287d377e638b87cdf6dd7" compoundref="057__caller__graphs_8tcl" startline="40" endline="42">bazbaz</references>
- <referencedby refid="namespacebar_1aa1678a9adb588c0b91b118de7cc38ddb" compoundref="057__caller__graphs_8tcl" startline="29" endline="35">slave</referencedby>
- </memberdef>
- <memberdef kind="function" id="namespacebar_1a88879545dee287d377e638b87cdf6dd7" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>bar::bazbaz</definition>
- <argsstring/>
- <name>bazbaz</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="40" column="1" bodyfile="057_caller_graphs.tcl" bodystart="40" bodyend="42"/>
- <referencedby refid="namespacebar_1a3426cd3a2eebcffa0dc333bcf5e2fe5e" compoundref="057__caller__graphs_8tcl" startline="36" endline="39">baz</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="057_caller_graphs.tcl" line="28" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespacefoo.xml b/testing/057/namespacefoo.xml
deleted file mode 100644
index 8d0ac75..0000000
--- a/testing/057/namespacefoo.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespacefoo" kind="namespace" language="Tcl">
- <compoundname>foo</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespacefoo_1a265acdcaea6da32c3bbd9afb5d0e32a4" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>foo::master</definition>
- <argsstring/>
- <name>master</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="057_caller_graphs.tcl" line="44" column="1" bodyfile="057_caller_graphs.tcl" bodystart="44" bodyend="48"/>
- <references refid="namespacebar_1aa1678a9adb588c0b91b118de7cc38ddb" compoundref="057__caller__graphs_8tcl" startline="29" endline="35">bar::slave</references>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="057_caller_graphs.tcl" line="43" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/057/namespacelibrary.xml b/testing/057/namespacelibrary.xml
new file mode 100644
index 0000000..5321ad7
--- /dev/null
+++ b/testing/057/namespacelibrary.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacelibrary" kind="namespace" language="C++">
+ <compoundname>library</compoundname>
+ <innerclass refid="classlibrary_1_1v2_1_1foo" prot="public">library::foo</innerclass>
+ <innernamespace refid="namespacelibrary_1_1v2_1_1_n_s">library::NS</innernamespace>
+ <innernamespace refid="namespacelibrary_1_1v1">library::v1</innernamespace>
+ <innernamespace refid="namespacelibrary_1_1v2" inline="yes">library::v2</innernamespace>
+ <sectiondef kind="func">
+ <memberdef kind="function" id="namespacelibrary_1_1v2_1aba9375172f5b36e1f4fda9b1dec39d90" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>void</type>
+ <definition>void library::v2::func</definition>
+ <argsstring>()</argsstring>
+ <name>func</name>
+ <briefdescription>
+ <para>a method </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="057_inlinenamespace.cpp" line="33" column="14" declfile="057_inlinenamespace.cpp" declline="33" declcolumn="14"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ <para>the main namespace </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="057_inlinenamespace.cpp" line="7" column="1"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/057/namespacelibrary_1_1v1.xml b/testing/057/namespacelibrary_1_1v1.xml
new file mode 100644
index 0000000..9a01e02
--- /dev/null
+++ b/testing/057/namespacelibrary_1_1v1.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacelibrary_1_1v1" kind="namespace" language="C++">
+ <compoundname>library::v1</compoundname>
+ <innerclass refid="classlibrary_1_1v1_1_1foo" prot="public">library::v1::foo</innerclass>
+ <innernamespace refid="namespacelibrary_1_1v1_1_1_n_s">library::v1::NS</innernamespace>
+ <sectiondef kind="func">
+ <memberdef kind="function" id="namespacelibrary_1_1v1_1a2257981298fec15f79c54c28880ac15c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>void</type>
+ <definition>void library::v1::func</definition>
+ <argsstring>()</argsstring>
+ <name>func</name>
+ <briefdescription>
+ <para>a method </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="057_inlinenamespace.cpp" line="19" column="14" declfile="057_inlinenamespace.cpp" declline="19" declcolumn="14"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ <para>the first namespace </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="057_inlinenamespace.cpp" line="10" column="5"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/057/namespacelibrary_1_1v2.xml b/testing/057/namespacelibrary_1_1v2.xml
new file mode 100644
index 0000000..fd848fd
--- /dev/null
+++ b/testing/057/namespacelibrary_1_1v2.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
+ <compounddef id="namespacelibrary_1_1v2" kind="namespace" inline="yes" language="C++">
+ <compoundname>library::v2</compoundname>
+ <innerclass refid="classlibrary_1_1v2_1_1foo" prot="public">library::v2::foo</innerclass>
+ <innernamespace refid="namespacelibrary_1_1v2_1_1_n_s">library::v2::NS</innernamespace>
+ <sectiondef kind="func">
+ <memberdef kind="function" id="namespacelibrary_1_1v2_1aba9375172f5b36e1f4fda9b1dec39d90" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type>void</type>
+ <definition>void library::v2::func</definition>
+ <argsstring>()</argsstring>
+ <name>func</name>
+ <briefdescription>
+ <para>a method </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="057_inlinenamespace.cpp" line="33" column="14" declfile="057_inlinenamespace.cpp" declline="33" declcolumn="14"/>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ <para>the inline namespace </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="057_inlinenamespace.cpp" line="24" column="12"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/057_caller_graphs.tcl b/testing/057_caller_graphs.tcl
deleted file mode 100644
index 464d8aa..0000000
--- a/testing/057_caller_graphs.tcl
+++ /dev/null
@@ -1,155 +0,0 @@
-#// objective: test for completeness and correctness of references/referencedby relations
-#// check: 057__caller__graphs_8tcl.xml
-#// check: __057__caller__graphs_8tcl.xml
-#// check: namespacebar.xml
-#// check: namespacefoo.xml
-#// check: namespace1.xml
-#// check: namespace1_1_11.xml
-#// check: namespace1_1_11_1_11.xml
-#// check: namespace2.xml
-#// check: namespace2_1_12.xml
-#// check: namespace2_1_12_1_12.xml
-#// check: namespace2_1_12_1_12_1_12.xml
-#// check: namespace2_1_12_1_12_1_12_1_12.xml
-#// config: EXTRACT_ALL = yes
-#// config: INLINE_SOURCES = no
-#// config: REFERENCED_BY_RELATION = yes
-#// config: REFERENCES_RELATION = yes
-#// config: INPUT = $INPUTDIR/057_caller_graphs.tcl $INPUTDIR/_057_caller_graphs.tcl
-# config: HAVE_DOT = yes
-# config: CALLER_GRAPH = yes
-# config: CALL_GRAPH = yes
-# config: GENERATE_HTML = yes
-
-# This is a stripped down example from my code.
-# Doxygen 1.8.7 generates the correct relations (xml)
-# but caller graphs will be incomplete.
-# It does not generate any relations at all if INLINE_SOURCES = no.
-namespace eval bar {}
-proc bar::slave { } {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- if {1} then {
- bar::baz
- }
- return
-}
-proc bar::baz {} {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- bar::bazbaz
-}
-proc bar::bazbaz {} {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
-}
-namespace eval foo {}
-proc foo::master { } {
- array set info [info frame 0]; puts -nonewline $info(proc)
- bar::slave
- return
-}
-#
-# now we check tcl's rules: from the help
-# NAME RESOLUTION
-#... Command names are also always resolved by looking in the current
-#namespace first. If not found there, they are searched for in every namespace on
-#the current namespace's command path (which is empty by default). If not found
-#there, command names are looked up in the global namespace (or, failing that,
-#are processed by the unknown command.) ...
-#
-namespace eval ::1::1::1 {}
-proc ::baz args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
-}
-proc ::1::baz args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
-}
-proc ::bar args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
-}
-proc ::1::bar args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
-}
-proc ::1::1::bar args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
-}
-proc ::1::1::1::bar args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
-}
-proc ::1::test1 args {
- array set info [info frame 0]; puts -nonewline $info(proc)
- baz
-}
-proc ::1::test2 args {
- array set info [info frame 0]; puts -nonewline $info(proc)
- bar
-}
-proc ::1::test3 args {
- array set info [info frame 0]; puts -nonewline $info(proc)
- ::bar
-}
-proc ::1::test4 args {
- array set info [info frame 0]; puts -nonewline $info(proc)
- 1::bar
-}
-proc ::1::test5 args {
- array set info [info frame 0]; puts -nonewline $info(proc)
- 1::baz
-}
-#
-# funny example, do you see the infinite loop?
-# we stop before the interpreter crashes
-set ::countdown 10
-namespace eval ::2::2::2::2::2 {}
-proc ::next args {
- array set info [info frame 0]; puts $info(proc)
- 2::next
-}
-proc ::2::next args {
- array set info [info frame 0]; puts $info(proc)
- incr ::countdown -1
- if {$::countdown>0} then {
- 2::next
- } else {
- puts "stop after 10 rounds."
- }
-}
-proc ::2::2::next args {
- array set info [info frame 0]; puts $info(proc)
- 2::next
-}
-proc ::2::2::2::next args {
- array set info [info frame 0]; puts $info(proc)
- 2::next
-}
-proc ::2::2::2::2::next args {
- array set info [info frame 0]; puts $info(proc)
- 2::next
-}
-proc ::2::2::2::2::2::next args {
- array set info [info frame 0]; puts $info(proc)
- 2::next
-}
-#
-# cross check with two files
-# If doxygen did not do two passes, then xrefs would depend on file order
-# and would be incomplete.
-source _057_caller_graphs.tcl
-proc master args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- inFileB
- return
-}
-proc inFileA args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- return
-}
-# now, check with tcl what is called
-foo::master
-puts ""
-foreach proc [lsort [info procs ::1::test?]] {
- $proc
- puts ""
-}
-::next
-master
-exit
-
diff --git a/testing/057_inlinenamespace.cpp b/testing/057_inlinenamespace.cpp
new file mode 100644
index 0000000..337c4b1
--- /dev/null
+++ b/testing/057_inlinenamespace.cpp
@@ -0,0 +1,37 @@
+// objective: test inline namespaces
+// check: namespacelibrary.xml
+// check: namespacelibrary_1_1v1.xml
+// check: namespacelibrary_1_1v2.xml
+
+/// the main namespace
+namespace library
+{
+ /// the first namespace
+ namespace v1
+ {
+ /// the class
+ class foo {
+ public:
+ /// member of the class
+ void member();
+ };
+ /// a method
+ void func();
+ /// a namespace
+ namespace NS {}
+ }
+ /// the inline namespace
+ inline namespace v2
+ {
+ /// the class
+ class foo {
+ public:
+ /// member of the class
+ void member();
+ };
+ /// a method
+ void func();
+ /// a namespace
+ namespace NS {}
+ }
+}
diff --git a/testing/058/058__bracket__recursion_8tcl.xml b/testing/058/058__bracket__recursion_8tcl.xml
deleted file mode 100644
index 0381b83..0000000
--- a/testing/058/058__bracket__recursion_8tcl.xml
+++ /dev/null
@@ -1,384 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="058__bracket__recursion_8tcl" kind="file" language="Tcl">
- <compoundname>058_bracket_recursion.tcl</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>Invoked</definition>
- <argsstring>args</argsstring>
- <name>Invoked</name>
- <briefdescription>
- <para>should be reference by every proc below </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="10" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="10" bodyend="13"/>
- <referencedby refid="058__bracket__recursion_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" compoundref="058__bracket__recursion_8tcl" startline="22" endline="25">a</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a68bdb74c144118d936931c46f75d4b3e" compoundref="058__bracket__recursion_8tcl" startline="28" endline="32">b</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" compoundref="058__bracket__recursion_8tcl" startline="33" endline="37">c</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" compoundref="058__bracket__recursion_8tcl" startline="38" endline="42">d</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" compoundref="058__bracket__recursion_8tcl" startline="43" endline="46">e</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1af6830d2c644b45088ea8f1f74a46b778" compoundref="058__bracket__recursion_8tcl" startline="47" endline="50">f</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" compoundref="058__bracket__recursion_8tcl" startline="51" endline="55">g</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1af96fd0966e32a310a0778d2e5c357700" compoundref="058__bracket__recursion_8tcl" startline="56" endline="59">h</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" compoundref="058__bracket__recursion_8tcl" startline="64" endline="68">i</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a2aaa92757686acea102cba3475f0c13b" compoundref="058__bracket__recursion_8tcl" startline="69" endline="73">j</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a20363f854eb4098a446733d63d34dbc1" compoundref="058__bracket__recursion_8tcl" startline="74" endline="77">k</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1aff56f84b49947b84b2a304f51cf8e678" compoundref="058__bracket__recursion_8tcl" startline="78" endline="81">l</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" compoundref="058__bracket__recursion_8tcl" startline="82" endline="85">m</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" compoundref="058__bracket__recursion_8tcl" startline="86" endline="89">n</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a495e7a4ede0831107e9d435080a7c268" compoundref="058__bracket__recursion_8tcl" startline="90" endline="94">o</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" compoundref="058__bracket__recursion_8tcl" startline="102" endline="107">p</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" compoundref="058__bracket__recursion_8tcl" startline="108" endline="114">q</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" compoundref="058__bracket__recursion_8tcl" startline="115" endline="120">r</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" compoundref="058__bracket__recursion_8tcl" startline="121" endline="126">s</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a69e959f6901827e4d8271aeaa5fba0fc" compoundref="058__bracket__recursion_8tcl" startline="128" endline="131">t</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a2fb1c5cf58867b5bbc9a1b145a86f3a0" compoundref="058__bracket__recursion_8tcl" startline="137" endline="142">y</referencedby>
- <referencedby refid="058__bracket__recursion_8tcl_1a25ed1bcb423b0b7200f485fc5ff71c8e" compoundref="058__bracket__recursion_8tcl" startline="143" endline="148">z</referencedby>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a3f55465410c57ed00ab28827a741b1c3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>NotInvoked</definition>
- <argsstring>args</argsstring>
- <name>NotInvoked</name>
- <briefdescription>
- <para>must not be reference by every proc below </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="16" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="16" bodyend="19"/>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>a</definition>
- <argsstring>args</argsstring>
- <name>a</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="22" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="22" bodyend="25"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a68bdb74c144118d936931c46f75d4b3e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>b</definition>
- <argsstring>args</argsstring>
- <name>b</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="28" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="28" bodyend="32"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>c</definition>
- <argsstring>args</argsstring>
- <name>c</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="33" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="33" bodyend="37"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>d</definition>
- <argsstring>args</argsstring>
- <name>d</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="38" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="38" bodyend="42"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>e</definition>
- <argsstring>args</argsstring>
- <name>e</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="43" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="43" bodyend="46"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1af6830d2c644b45088ea8f1f74a46b778" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>f</definition>
- <argsstring>args</argsstring>
- <name>f</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="47" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="47" bodyend="50"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>g</definition>
- <argsstring>args</argsstring>
- <name>g</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="51" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="51" bodyend="55"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1af96fd0966e32a310a0778d2e5c357700" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>h</definition>
- <argsstring>args</argsstring>
- <name>h</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="56" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="56" bodyend="59"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>i</definition>
- <argsstring>args</argsstring>
- <name>i</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="64" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="64" bodyend="68"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a2aaa92757686acea102cba3475f0c13b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>j</definition>
- <argsstring>args</argsstring>
- <name>j</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="69" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="69" bodyend="73"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a20363f854eb4098a446733d63d34dbc1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>k</definition>
- <argsstring>args</argsstring>
- <name>k</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="74" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="74" bodyend="77"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1aff56f84b49947b84b2a304f51cf8e678" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>l</definition>
- <argsstring>args</argsstring>
- <name>l</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="78" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="78" bodyend="81"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>m</definition>
- <argsstring>args</argsstring>
- <name>m</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="82" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="82" bodyend="85"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>n</definition>
- <argsstring>args</argsstring>
- <name>n</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="86" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="86" bodyend="89"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a495e7a4ede0831107e9d435080a7c268" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>o</definition>
- <argsstring>args</argsstring>
- <name>o</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="90" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="90" bodyend="94"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a8a57650834f5708d404e9c386b2edf87" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>$NotInvoked</definition>
- <argsstring>args</argsstring>
- <name>$NotInvoked</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="98" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="98" bodyend="101"/>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>p</definition>
- <argsstring>args</argsstring>
- <name>p</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="102" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="102" bodyend="107"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>q</definition>
- <argsstring>args</argsstring>
- <name>q</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="108" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="108" bodyend="114"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>r</definition>
- <argsstring>args</argsstring>
- <name>r</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="115" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="115" bodyend="120"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>s</definition>
- <argsstring>args</argsstring>
- <name>s</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="121" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="121" bodyend="126"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a69e959f6901827e4d8271aeaa5fba0fc" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>t</definition>
- <argsstring>args</argsstring>
- <name>t</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="128" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="128" bodyend="131"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a2fb1c5cf58867b5bbc9a1b145a86f3a0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>y</definition>
- <argsstring/>
- <name>y</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="137" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="137" bodyend="142"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="058__bracket__recursion_8tcl_1a25ed1bcb423b0b7200f485fc5ff71c8e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>z</definition>
- <argsstring/>
- <name>z</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="058_bracket_recursion.tcl" line="143" column="1" bodyfile="058_bracket_recursion.tcl" bodystart="143" bodyend="148"/>
- <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="058_bracket_recursion.tcl"/>
- </compounddef>
-</doxygen>
diff --git a/testing/058_bracket_recursion.tcl b/testing/058_bracket_recursion.tcl
deleted file mode 100644
index 2ecd673..0000000
--- a/testing/058_bracket_recursion.tcl
+++ /dev/null
@@ -1,157 +0,0 @@
-#// objective: tests processing of commands inside brackets [], only references/referencedby relations are relevant
-#// check: 058__bracket__recursion_8tcl.xml
-#// config: REFERENCED_BY_RELATION = yes
-#// config: REFERENCES_RELATION = yes
-#// config: EXTRACT_ALL = yes
-#// config: INLINE_SOURCES = yes
-
-##
-# \brief should be reference by every proc below
-proc Invoked args {
- puts "Procedure \"Invoked\" is invoked indeed. Ok."
- return $args
-}
-##
-# \brief must not be reference by every proc below
-proc NotInvoked args {
- puts "Procedure \"NotInvoked\" is invoked. Not Ok!"
- return $args
-}
-#
-# check if call references work at all
-proc a args {
- Invoked NotInvoked
- return
-}
-#
-# check brackets with various quoting, bracing
-proc b args {
- set r [Invoked]
- set r [list \[NotInvoked \]]
- return
-}
-proc c args {
- set r \{[Invoked]\}
- set r {[NotInvoked]}
- return
-}
-proc d args {
- set r "[Invoked]"
- set r "\[NotInvoked \]"
- return
-}
-proc e args {
- set r [list \[NotInvoked [Invoked]\]]
- return
-}
-proc f args {
- set r [list [Invoked \[NotInvoked \]]]
- return
-}
-proc g args {
- set r "{[Invoked]}"
- set r "{\[NotInvoked \]}"
- return
-}
-proc h args {
- [Invoked set] r {[NotInvoked]}
- return
-}
-# check brackets in tcl commands containing script arguments
-#
-# example generated according to
-# https://groups.google.com/d/msg/comp.lang.tcl/G5-mc3GiIyY/e-AVD9t7xMkJ
-proc i args {
- foreach item [Invoked] {
- return
- }
-}
-proc j args {
- foreach [Invoked item] [list one two three] {
- }
- return
-}
-proc k args {
- while {[Invoked 0]} {
- }
-}
-proc l args {
- for {} {[Invoked 0]} {} {
- }
-}
-proc m args {
- if {[Invoked 1]} {
- }
-}
-proc n args {
- if [Invoked 1] {
- }
-}
-proc o args {
- if {0} {
- } elseif {[Invoked 0]} {
- }
-}
-# these are really nasty examples
-# they shows, that the condition argument may not be parsed as a script
-set NotInvoked \$NotInvoked
-proc $NotInvoked args {
- puts "Procedure \"\$NotInvoked\" is invoked. Not Ok!"
- return $args
-}
-proc p args {
- set NotInvoked \$NotInvoked
- if {$NotInvoked eq [Invoked 1]} {
- }
- return
-}
-proc q args {
- set NotInvoked \$NotInvoked
- if {0} {
- } elseif {$NotInvoked eq [Invoked 1]} {
- }
- return
-}
-proc r args {
- set NotInvoked \$NotInvoked
- while {$NotInvoked eq [Invoked 1]} {
- }
- return
-}
-proc s args {
- set NotInvoked \$NotInvoked
- for {} {$NotInvoked eq [Invoked 1]} {} {
- }
- return
-}
-# dangling open brackets should not confuse the scanner
-proc t args {
- set foo ]]]][Invoked]
- return
-}
-# Example according to
-# https://bugzilla.gnome.org/show_bug.cgi?id=729135
-# |
-# Note the subtle difference in this | whitespace
-# V
-proc y {} {
- set classifier_state {{bphy} }
- if { ($classifier_state == {{bphy} }) } {
- Invoked
- }
-}
-proc z {} {
- set classifier_state {{bphy} }
- if { ($classifier_state == {{bphy} } ) } {
- Invoked
- }
-}
-#
-# call all single letter procs
-# let tcl check what is called and what is not called
-foreach p [info procs ?] {
- puts "Check procedure \"$p\""
- $p
-}
-exit
-
diff --git a/testing/059/059__command__catch_8tcl.xml b/testing/059/059__command__catch_8tcl.xml
deleted file mode 100644
index b5e5c96..0000000
--- a/testing/059/059__command__catch_8tcl.xml
+++ /dev/null
@@ -1,191 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="059__command__catch_8tcl" kind="file" language="Tcl">
- <compoundname>059_command_catch.tcl</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>Invoked</definition>
- <argsstring>args</argsstring>
- <name>Invoked</name>
- <briefdescription>
- <para>should be reference by every proc below </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="10" column="1" bodyfile="059_command_catch.tcl" bodystart="10" bodyend="13"/>
- <referencedby refid="059__command__catch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" compoundref="059__command__catch_8tcl" startline="22" endline="25">a</referencedby>
- <referencedby refid="059__command__catch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" compoundref="059__command__catch_8tcl" startline="29" endline="32">b</referencedby>
- <referencedby refid="059__command__catch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" compoundref="059__command__catch_8tcl" startline="33" endline="36">c</referencedby>
- <referencedby refid="059__command__catch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" compoundref="059__command__catch_8tcl" startline="37" endline="40">d</referencedby>
- <referencedby refid="059__command__catch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" compoundref="059__command__catch_8tcl" startline="41" endline="44">e</referencedby>
- <referencedby refid="059__command__catch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" compoundref="059__command__catch_8tcl" startline="45" endline="48">f</referencedby>
- <referencedby refid="059__command__catch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" compoundref="059__command__catch_8tcl" startline="49" endline="54">g</referencedby>
- <referencedby refid="059__command__catch_8tcl_1af96fd0966e32a310a0778d2e5c357700" compoundref="059__command__catch_8tcl" startline="56" endline="59">h</referencedby>
- <referencedby refid="059__command__catch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" compoundref="059__command__catch_8tcl" startline="60" endline="63">i</referencedby>
- <referencedby refid="059__command__catch_8tcl_1a2aaa92757686acea102cba3475f0c13b" compoundref="059__command__catch_8tcl" startline="75" endline="78">j</referencedby>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1a3f55465410c57ed00ab28827a741b1c3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>NotInvoked</definition>
- <argsstring>args</argsstring>
- <name>NotInvoked</name>
- <briefdescription>
- <para>must not be reference by every proc below </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="16" column="1" bodyfile="059_command_catch.tcl" bodystart="16" bodyend="19"/>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>a</definition>
- <argsstring>args</argsstring>
- <name>a</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="22" column="1" bodyfile="059_command_catch.tcl" bodystart="22" bodyend="25"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>b</definition>
- <argsstring>args</argsstring>
- <name>b</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="29" column="1" bodyfile="059_command_catch.tcl" bodystart="29" bodyend="32"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>c</definition>
- <argsstring>args</argsstring>
- <name>c</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="33" column="1" bodyfile="059_command_catch.tcl" bodystart="33" bodyend="36"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>d</definition>
- <argsstring>args</argsstring>
- <name>d</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="37" column="1" bodyfile="059_command_catch.tcl" bodystart="37" bodyend="40"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>e</definition>
- <argsstring>args</argsstring>
- <name>e</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="41" column="1" bodyfile="059_command_catch.tcl" bodystart="41" bodyend="44"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>f</definition>
- <argsstring>args</argsstring>
- <name>f</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="45" column="1" bodyfile="059_command_catch.tcl" bodystart="45" bodyend="48"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>g</definition>
- <argsstring>args</argsstring>
- <name>g</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="49" column="1" bodyfile="059_command_catch.tcl" bodystart="49" bodyend="54"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1af96fd0966e32a310a0778d2e5c357700" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>h</definition>
- <argsstring>args</argsstring>
- <name>h</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="56" column="1" bodyfile="059_command_catch.tcl" bodystart="56" bodyend="59"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>i</definition>
- <argsstring>args</argsstring>
- <name>i</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="60" column="1" bodyfile="059_command_catch.tcl" bodystart="60" bodyend="63"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="059__command__catch_8tcl_1a2aaa92757686acea102cba3475f0c13b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>j</definition>
- <argsstring>args</argsstring>
- <name>j</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="059_command_catch.tcl" line="75" column="1" bodyfile="059_command_catch.tcl" bodystart="75" bodyend="78"/>
- <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="059_command_catch.tcl"/>
- </compounddef>
-</doxygen>
diff --git a/testing/059_command_catch.tcl b/testing/059_command_catch.tcl
deleted file mode 100644
index 4227da7..0000000
--- a/testing/059_command_catch.tcl
+++ /dev/null
@@ -1,87 +0,0 @@
-#// objective: tests processing of catch/eval, only references/referencedby relations are relevant
-#// check: 059__command__catch_8tcl.xml
-#// config: REFERENCED_BY_RELATION = yes
-#// config: REFERENCES_RELATION = yes
-#// config: EXTRACT_ALL = yes
-#// config: INLINE_SOURCES = no
-
-##
-# \brief should be reference by every proc below
-proc Invoked args {
- puts "Procedure \"Invoked\" is invoked indeed. Ok."
- return $args
-}
-##
-# \brief must not be reference by every proc below
-proc NotInvoked args {
- puts "Procedure \"NotInvoked\" is invoked. Not Ok!"
- return $args
-}
-#
-# check if call references work at all
-proc a args {
- Invoked NotInvoked
- return
-}
-#
-# catch command
-# Tcl8.5: catch script ?resultVarName? ?optionsVarName?
-proc b args {
- catch Invoked
- return
-}
-proc c args {
- catch Invoked NotInvoked
- return
-}
-proc d args {
- catch Invoked NotInvoked NotInvoked
- return
-}
-proc e args {
- set r [catch Invoked NotInvoked NotInvoked]
- return
-}
-proc f args {
- set r [catch {Invoked} NotInvoked NotInvoked]
- return
-}
-proc g args {
- set r [catch {
- set x [Invoked]
- } NotInvoked NotInvoked]
- return
-}
-# eval arg ?arg ...?
-proc h args {
- eval Invoked NotInvoked
- return
-}
-proc i args {
- eval set NotInvoked [Invoked NotInvoked]
- return
-}
-# This is a striped down example. Original:
-#
-# jpeg.tcl --
-#
-# Querying and modifying JPEG image files.
-#
-# Copyright (c) 2004 Aaron Faupell <afaupell@users.sourceforge.net>
-#
-# ...
-# eval [list addComment $file] [lreplace $com 0 0 $comment]
-# ...
-proc j args {
- eval [list set] [list NotInvoked] [Invoked NotInvoked]
- return
-}
-#
-# call all single letter procs
-# let tcl check what is called and what is not called
-foreach p [info procs ?] {
- puts "Check procedure \"$p\""
- $p
-}
-exit
-
diff --git a/testing/060/060__command__switch_8tcl.xml b/testing/060/060__command__switch_8tcl.xml
deleted file mode 100644
index 2def3fc..0000000
--- a/testing/060/060__command__switch_8tcl.xml
+++ /dev/null
@@ -1,326 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="060__command__switch_8tcl" kind="file" language="Tcl">
- <compoundname>060_command_switch.tcl</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>Invoked</definition>
- <argsstring>args</argsstring>
- <name>Invoked</name>
- <briefdescription>
- <para>should be reference by every proc below </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="10" column="1" bodyfile="060_command_switch.tcl" bodystart="10" bodyend="13"/>
- <referencedby refid="060__command__switch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" compoundref="060__command__switch_8tcl" startline="22" endline="25">a</referencedby>
- <referencedby refid="060__command__switch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" compoundref="060__command__switch_8tcl" startline="29" endline="36">b</referencedby>
- <referencedby refid="060__command__switch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" compoundref="060__command__switch_8tcl" startline="37" endline="43">c</referencedby>
- <referencedby refid="060__command__switch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" compoundref="060__command__switch_8tcl" startline="44" endline="50">d</referencedby>
- <referencedby refid="060__command__switch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" compoundref="060__command__switch_8tcl" startline="51" endline="57">e</referencedby>
- <referencedby refid="060__command__switch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" compoundref="060__command__switch_8tcl" startline="58" endline="65">f</referencedby>
- <referencedby refid="060__command__switch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" compoundref="060__command__switch_8tcl" startline="66" endline="73">g</referencedby>
- <referencedby refid="060__command__switch_8tcl_1af96fd0966e32a310a0778d2e5c357700" compoundref="060__command__switch_8tcl" startline="74" endline="81">h</referencedby>
- <referencedby refid="060__command__switch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" compoundref="060__command__switch_8tcl" startline="83" endline="94">i</referencedby>
- <referencedby refid="060__command__switch_8tcl_1a2aaa92757686acea102cba3475f0c13b" compoundref="060__command__switch_8tcl" startline="95" endline="106">j</referencedby>
- <referencedby refid="060__command__switch_8tcl_1a20363f854eb4098a446733d63d34dbc1" compoundref="060__command__switch_8tcl" startline="107" endline="118">k</referencedby>
- <referencedby refid="060__command__switch_8tcl_1aff56f84b49947b84b2a304f51cf8e678" compoundref="060__command__switch_8tcl" startline="119" endline="129">l</referencedby>
- <referencedby refid="060__command__switch_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" compoundref="060__command__switch_8tcl" startline="130" endline="141">m</referencedby>
- <referencedby refid="060__command__switch_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" compoundref="060__command__switch_8tcl" startline="142" endline="153">n</referencedby>
- <referencedby refid="060__command__switch_8tcl_1a495e7a4ede0831107e9d435080a7c268" compoundref="060__command__switch_8tcl" startline="154" endline="165">o</referencedby>
- <referencedby refid="060__command__switch_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" compoundref="060__command__switch_8tcl" startline="166" endline="175">p</referencedby>
- <referencedby refid="060__command__switch_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" compoundref="060__command__switch_8tcl" startline="176" endline="185">q</referencedby>
- <referencedby refid="060__command__switch_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" compoundref="060__command__switch_8tcl" startline="186" endline="195">r</referencedby>
- <referencedby refid="060__command__switch_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" compoundref="060__command__switch_8tcl" startline="196" endline="205">s</referencedby>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a3f55465410c57ed00ab28827a741b1c3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>NotInvoked</definition>
- <argsstring>args</argsstring>
- <name>NotInvoked</name>
- <briefdescription>
- <para>must not be reference by every proc below </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="16" column="1" bodyfile="060_command_switch.tcl" bodystart="16" bodyend="19"/>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>a</definition>
- <argsstring>args</argsstring>
- <name>a</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="22" column="1" bodyfile="060_command_switch.tcl" bodystart="22" bodyend="25"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>b</definition>
- <argsstring>args</argsstring>
- <name>b</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="29" column="1" bodyfile="060_command_switch.tcl" bodystart="29" bodyend="36"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>c</definition>
- <argsstring>args</argsstring>
- <name>c</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="37" column="1" bodyfile="060_command_switch.tcl" bodystart="37" bodyend="43"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>d</definition>
- <argsstring>args</argsstring>
- <name>d</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="44" column="1" bodyfile="060_command_switch.tcl" bodystart="44" bodyend="50"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>e</definition>
- <argsstring>args</argsstring>
- <name>e</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="51" column="1" bodyfile="060_command_switch.tcl" bodystart="51" bodyend="57"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>f</definition>
- <argsstring>args</argsstring>
- <name>f</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="58" column="1" bodyfile="060_command_switch.tcl" bodystart="58" bodyend="65"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>g</definition>
- <argsstring>args</argsstring>
- <name>g</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="66" column="1" bodyfile="060_command_switch.tcl" bodystart="66" bodyend="73"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1af96fd0966e32a310a0778d2e5c357700" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>h</definition>
- <argsstring>args</argsstring>
- <name>h</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="74" column="1" bodyfile="060_command_switch.tcl" bodystart="74" bodyend="81"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>i</definition>
- <argsstring>args</argsstring>
- <name>i</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="83" column="1" bodyfile="060_command_switch.tcl" bodystart="83" bodyend="94"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a2aaa92757686acea102cba3475f0c13b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>j</definition>
- <argsstring>args</argsstring>
- <name>j</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="95" column="1" bodyfile="060_command_switch.tcl" bodystart="95" bodyend="106"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a20363f854eb4098a446733d63d34dbc1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>k</definition>
- <argsstring>args</argsstring>
- <name>k</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="107" column="1" bodyfile="060_command_switch.tcl" bodystart="107" bodyend="118"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1aff56f84b49947b84b2a304f51cf8e678" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>l</definition>
- <argsstring>args</argsstring>
- <name>l</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="119" column="1" bodyfile="060_command_switch.tcl" bodystart="119" bodyend="129"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>m</definition>
- <argsstring>args</argsstring>
- <name>m</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="130" column="1" bodyfile="060_command_switch.tcl" bodystart="130" bodyend="141"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>n</definition>
- <argsstring>args</argsstring>
- <name>n</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="142" column="1" bodyfile="060_command_switch.tcl" bodystart="142" bodyend="153"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a495e7a4ede0831107e9d435080a7c268" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>o</definition>
- <argsstring>args</argsstring>
- <name>o</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="154" column="1" bodyfile="060_command_switch.tcl" bodystart="154" bodyend="165"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>p</definition>
- <argsstring>args</argsstring>
- <name>p</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="166" column="1" bodyfile="060_command_switch.tcl" bodystart="166" bodyend="175"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>q</definition>
- <argsstring>args</argsstring>
- <name>q</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="176" column="1" bodyfile="060_command_switch.tcl" bodystart="176" bodyend="185"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>r</definition>
- <argsstring>args</argsstring>
- <name>r</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="186" column="1" bodyfile="060_command_switch.tcl" bodystart="186" bodyend="195"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- <memberdef kind="function" id="060__command__switch_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>s</definition>
- <argsstring>args</argsstring>
- <name>s</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="060_command_switch.tcl" line="196" column="1" bodyfile="060_command_switch.tcl" bodystart="196" bodyend="205"/>
- <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="060_command_switch.tcl"/>
- </compounddef>
-</doxygen>
diff --git a/testing/060_command_switch.tcl b/testing/060_command_switch.tcl
deleted file mode 100644
index 407f2e9..0000000
--- a/testing/060_command_switch.tcl
+++ /dev/null
@@ -1,238 +0,0 @@
-#// objective: tests processing of switch, only references/referencedby relations are relevant
-#// check: 060__command__switch_8tcl.xml
-#// config: REFERENCED_BY_RELATION = yes
-#// config: REFERENCES_RELATION = yes
-#// config: EXTRACT_ALL = yes
-#// config: INLINE_SOURCES = no
-
-##
-# \brief should be reference by every proc below
-proc Invoked args {
- puts "Procedure \"Invoked\" is invoked indeed. Ok."
- return $args
-}
-##
-# \brief must not be reference by every proc below
-proc NotInvoked args {
- puts "Procedure \"NotInvoked\" is invoked. Not Ok!"
- return $args
-}
-#
-# check if call references work at all
-proc a args {
- Invoked NotInvoked
- return
-}
-#
-# switch command
-# switch ?options? string pattern body ?pattern body ...?
-proc b args {
- switch value NotInvoked {
- } NotInvoked {
- } default {
- Invoked
- }
- return
-}
-proc c args {
- switch value NotInvoked {
- } [Invoked] {
- } default {
- }
- return
-}
-proc d args {
- switch NotInvoked pattern {
- } [Invoked] {
- } default {
- }
- return
-}
-proc e args {
- switch [Invoked] pattern {
- } NotInvoked {
- } default {
- }
- return
-}
-proc f args {
- switch -exact value pattern {
- } NotInvoked {
- } default {
- Invoked
- }
- return
-}
-proc g args {
- switch -exact -- value pattern {
- } NotInvoked {
- } default {
- Invoked
- }
- return
-}
-proc h args {
- switch -exact -- -value pattern {
- } NotInvoked {
- } default {
- Invoked
- }
- return
-}
-# switch ?options? string {pattern body ?pattern body ...?}
-proc i args {
- switch value {
- NotInvoked {
- }
- NotInvoked {
- }
- default {
- Invoked
- }
- }
- return
-}
-proc j args {
- switch vale {
- NotInvoked {
- }
- [NotInvoked] {
- }
- default {
- Invoked
- }
- }
- return
-}
-proc k args {
- switch NotInvoked {
- [NotInvoked] {
- }
- NotInvoked {
- Invoked
- }
- default {
- }
- }
- return
-}
-proc l args {
- switch [Invoked] {
- pattern {
- }
- NotInvoked {
- }
- default {
- }
- }
- return
-}
-proc m args {
- switch -exact value {
- pattern {
- }
- NotInvoked {
- }
- default {
- Invoked
- }
- }
- return
-}
-proc n args {
- switch -exact -- value {
- pattern {
- }
- NotInvoked {
- }
- default {
- Invoked
- }
- }
- return
-}
-proc o args {
- switch -exact -- -value {
- pattern {
- }
- NotInvoked {
- }
- default {
- Invoked
- }
- }
- return
-}
-proc p args {
- switch -exact -- inquotes {
- "inquotes" {
- Invoked
- }
- default {
- }
- }
- return
-}
-proc q args {
- switch -exact -- "in quotes" {
- "in quotes" {
- Invoked
- }
- default {
- }
- }
- return
-}
-proc r args {
- switch -exact -- inbraces {
- {inbraces} {
- Invoked
- }
- default {
- }
- }
- return
-}
-proc s args {
- switch -exact -- {in braces} {
- {in braces} {
- Invoked
- }
- default {
- }
- }
- return
-}
-# wrong syntax
-#proc x args {
-# catch {switch -exact -- [Invoked] pattern1 NotInvoked pattern2}
-# return
-#}
-# The current version does not check the last argument beforehand.
-# Therefore, all script elements are evaluated as scripts before
-# the parser detects the dangling pattern. It throws a warning, at the very least.
-# Anyway, for working code the documentation will be correct.
-#proc y args {
-# catch {switch -exact -- [Invoked] {
-# pattern {
-# NotInvoked
-# }
-# NotInvoked {
-# NotInvoked
-# }
-# default {
-# NotInvoked
-# }
-# pattern
-# }}
-# return
-#}
-#
-# call all single letter procs
-# let tcl check what is called and what is not called
-foreach p [info procs ?] {
- puts "Check procedure \"$p\""
- $p
-}
-exit
-
diff --git a/testing/061/class_test.xml b/testing/061/class_test.xml
deleted file mode 100644
index 47e70ac..0000000
--- a/testing/061/class_test.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="class_test" kind="class" language="Tcl" prot="public">
- <compoundname>Test</compoundname>
- <sectiondef kind="public-func">
- <memberdef kind="function" id="class_test_1af863c78bca81b4e276dcbb30f12e8ec6" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>Test::testmethod_one</definition>
- <argsstring>args</argsstring>
- <name>testmethod_one</name>
- <briefdescription>
- <para><ref refid="class_test" kindref="compound">Test</ref> method 1. </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="061_bug_705503.tcl" line="12" column="1" bodyfile="061_bug_705503.tcl" bodystart="12" bodyend="12"/>
- </memberdef>
- <memberdef kind="function" id="class_test_1ac7148d2852b30d157e078fe0fe58a350" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>Test::constructor</definition>
- <argsstring>args</argsstring>
- <name>constructor</name>
- <briefdescription>
- <para>Construction of class. </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="061_bug_705503.tcl" line="16" column="1" bodyfile="061_bug_705503.tcl" bodystart="16" bodyend="16"/>
- </memberdef>
- <memberdef kind="function" id="class_test_1abdf3375950ec49e29f4bae947b7e3f26" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>Test::testmethod_two</definition>
- <argsstring>args</argsstring>
- <name>testmethod_two</name>
- <briefdescription>
- <para><ref refid="class_test" kindref="compound">Test</ref> method 2. </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="061_bug_705503.tcl" line="19" column="1" bodyfile="061_bug_705503.tcl" bodystart="19" bodyend="19"/>
- </memberdef>
- </sectiondef>
- <briefdescription>
- <para>Testclass. </para>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="061_bug_705503.tcl" line="10" column="1" bodyfile="061_bug_705503.tcl" bodystart="10" bodyend="13"/>
- <listofallmembers>
- <member refid="class_test_1ac7148d2852b30d157e078fe0fe58a350" prot="public" virt="non-virtual">
- <scope>Test</scope>
- <name>constructor</name>
- </member>
- <member refid="class_test_1af863c78bca81b4e276dcbb30f12e8ec6" prot="public" virt="non-virtual">
- <scope>Test</scope>
- <name>testmethod_one</name>
- </member>
- <member refid="class_test_1abdf3375950ec49e29f4bae947b7e3f26" prot="public" virt="non-virtual">
- <scope>Test</scope>
- <name>testmethod_two</name>
- </member>
- </listofallmembers>
- </compounddef>
-</doxygen>
diff --git a/testing/061_bug_705503.tcl b/testing/061_bug_705503.tcl
deleted file mode 100644
index ce25d6e..0000000
--- a/testing/061_bug_705503.tcl
+++ /dev/null
@@ -1,19 +0,0 @@
-#// objective: test for bug 705503 - TCL: Documentation of oo::define is not working
-#// check: class_test.xml
-#// config: EXTRACT_ALL = yes
-
-# taken from
-# https://bugzilla.gnome.org/show_bug.cgi?id=705503
-
-## @class Test
-# @brief Testclass
-oo::class create Test {
- ## @brief Test method 1.
- method testmethod_one args {}
-}
-
-## @brief Construction of class
-oo::define Test constructor args {}
-
-## @brief Test method 2
-oo::define Test method testmethod_two args {}
diff --git a/testing/062/namespacen1.xml b/testing/062/namespacen1.xml
deleted file mode 100644
index 408ef87..0000000
--- a/testing/062/namespacen1.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespacen1" kind="namespace" language="Tcl">
- <compoundname>n1</compoundname>
- <innernamespace refid="namespacen1_1_1n1">n1::n1</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespacen1_1a9f23d7a7f141915457e8e26023d70cb4" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>n1::p1</definition>
- <argsstring>args</argsstring>
- <name>p1</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="062_namespace_resolution.tcl" line="12" column="1" bodyfile="062_namespace_resolution.tcl" bodystart="12" bodyend="16"/>
- <references refid="namespacen1_1a0bff29f718fa43e49b7ca79985afb5fa" compoundref="062__namespace__resolution_8tcl" startline="17" endline="20">p2</references>
- </memberdef>
- <memberdef kind="function" id="namespacen1_1a0bff29f718fa43e49b7ca79985afb5fa" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>n1::p2</definition>
- <argsstring>args</argsstring>
- <name>p2</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="062_namespace_resolution.tcl" line="17" column="1" bodyfile="062_namespace_resolution.tcl" bodystart="17" bodyend="20"/>
- <referencedby refid="namespacen1_1a9f23d7a7f141915457e8e26023d70cb4" compoundref="062__namespace__resolution_8tcl" startline="12" endline="16">p1</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="062_namespace_resolution.tcl" line="11" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/062/namespacen2.xml b/testing/062/namespacen2.xml
deleted file mode 100644
index f545576..0000000
--- a/testing/062/namespacen2.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespacen2" kind="namespace" language="Tcl">
- <compoundname>n2</compoundname>
- <innernamespace refid="namespacen2_1_1n2">n2::n2</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespacen2_1a74950c0185232e374220a0707b4903c6" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>n2::p1</definition>
- <argsstring>args</argsstring>
- <name>p1</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="062_namespace_resolution.tcl" line="31" column="1" bodyfile="062_namespace_resolution.tcl" bodystart="31" bodyend="35"/>
- <references refid="namespacen2_1a49fadfbefa795204a3c566ec76ff632f" compoundref="062__namespace__resolution_8tcl" startline="36" endline="39">p2</references>
- </memberdef>
- <memberdef kind="function" id="namespacen2_1a49fadfbefa795204a3c566ec76ff632f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>n2::p2</definition>
- <argsstring>args</argsstring>
- <name>p2</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="062_namespace_resolution.tcl" line="36" column="1" bodyfile="062_namespace_resolution.tcl" bodystart="36" bodyend="39"/>
- <referencedby refid="namespacen2_1a74950c0185232e374220a0707b4903c6" compoundref="062__namespace__resolution_8tcl" startline="31" endline="35">p1</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="062_namespace_resolution.tcl" line="29" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/062/namespacen3.xml b/testing/062/namespacen3.xml
deleted file mode 100644
index f8c2fb5..0000000
--- a/testing/062/namespacen3.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespacen3" kind="namespace" language="Tcl">
- <compoundname>n3</compoundname>
- <innernamespace refid="namespacen3_1_1n3">n3::n3</innernamespace>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespacen3_1ae7e87e49507bd56dad087cffecd35b29" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>n3::p1</definition>
- <argsstring>args</argsstring>
- <name>p1</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="062_namespace_resolution.tcl" line="47" column="1" bodyfile="062_namespace_resolution.tcl" bodystart="47" bodyend="51"/>
- <references refid="namespacen3_1a14e9fe1b27a6d36db9ace2eef4509979" compoundref="062__namespace__resolution_8tcl" startline="52" endline="55">p2</references>
- </memberdef>
- <memberdef kind="function" id="namespacen3_1a14e9fe1b27a6d36db9ace2eef4509979" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>n3::p2</definition>
- <argsstring>args</argsstring>
- <name>p2</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="062_namespace_resolution.tcl" line="52" column="1" bodyfile="062_namespace_resolution.tcl" bodystart="52" bodyend="55"/>
- <referencedby refid="namespacen3_1ae7e87e49507bd56dad087cffecd35b29" compoundref="062__namespace__resolution_8tcl" startline="47" endline="51">p1</referencedby>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="062_namespace_resolution.tcl" line="45" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/062_namespace_resolution.tcl b/testing/062_namespace_resolution.tcl
deleted file mode 100644
index dcc6701..0000000
--- a/testing/062_namespace_resolution.tcl
+++ /dev/null
@@ -1,68 +0,0 @@
-#// objective: tests correct namespace resolution, only references/referencedby relations are relevant
-#// check: namespacen1.xml
-#// check: namespacen2.xml
-#// check: namespacen3.xml
-#// config: REFERENCED_BY_RELATION = yes
-#// config: REFERENCES_RELATION = yes
-#// config: EXTRACT_ALL = yes
-#// config: INLINE_SOURCES = yes
-
-# now: combine namespace eval and qualified names
-namespace eval n1 {
- proc p1 args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- p2
- return
- }
- proc p2 args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- return
- }
- namespace eval n1 {
- proc p1 args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- return
- }
- }
-}
-# same thing, but fully qualified proc names
-namespace eval ::n2 {}
-namespace eval ::n2::n2 {}
-proc ::n2::p1 args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- p2
- return
-}
-proc ::n2::p2 args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- return
-}
-proc ::n2::n2::p2 args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- return
-}
-# same thing, without leading ::
-namespace eval n3 {}
-namespace eval n3::n3 {}
-proc n3::p1 args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- p2
- return
-}
-proc n3::p2 args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- return
-}
-proc n3::n3::p2 args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- return
-}
-# now, check with tcl what is called
-n1::p1
-puts ""
-n2::p1
-puts ""
-n3::p1
-puts ""
-exit
-
diff --git a/testing/063/namespaceoo.xml b/testing/063/namespaceoo.xml
deleted file mode 100644
index 044c364..0000000
--- a/testing/063/namespaceoo.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespaceoo" kind="namespace" language="Tcl">
- <compoundname>oo</compoundname>
- <innernamespace refid="namespaceoo_1_1define">oo::define</innernamespace>
- <innernamespace refid="namespaceoo_1_1_helpers">oo::Helpers</innernamespace>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="[generated]" line="1" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/063/namespaceoo_1_1_helpers.xml b/testing/063/namespaceoo_1_1_helpers.xml
deleted file mode 100644
index e9083dc..0000000
--- a/testing/063/namespaceoo_1_1_helpers.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespaceoo_1_1_helpers" kind="namespace" language="Tcl">
- <compoundname>oo::Helpers</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespaceoo_1_1_helpers_1a96c5b755588beb2e930cff23ce811d6c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>oo::Helpers::classvar</definition>
- <argsstring>args</argsstring>
- <name>classvar</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- <para>Extension to TclOO to add static variables. Defines variables on the class instead of on the object. Can be used to enforce a limited number of instantiations. </para>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="063_bug_729092.tcl" line="34" column="1" bodyfile="063_bug_729092.tcl" bodystart="34" bodyend="43"/>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="063_bug_729092.tcl" line="1" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/063/namespaceoo_1_1define.xml b/testing/063/namespaceoo_1_1define.xml
deleted file mode 100644
index c8c8e85..0000000
--- a/testing/063/namespaceoo_1_1define.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
- <compounddef id="namespaceoo_1_1define" kind="namespace" language="Tcl">
- <compoundname>oo::define</compoundname>
- <sectiondef kind="func">
- <memberdef kind="function" id="namespaceoo_1_1define_1a92656f535365dc915e04ca81bc8eb91b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
- <type/>
- <definition>oo::define::classmethod</definition>
- <argsstring>name ?args? ?body?</argsstring>
- <name>classmethod</name>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- <para>Extension to TclOO to add static methods. Defines the method on the class instead of on the object. Can be used for the creation of megawidgets using TclOO by overriding the unknown method to detect if the user is trying to instantiate a widget (because the method will be unknown and start with a dot). </para>
- </detaileddescription>
- <inbodydescription>
- </inbodydescription>
- <location file="063_bug_729092.tcl" line="18" column="1" bodyfile="063_bug_729092.tcl" bodystart="18" bodyend="27"/>
- </memberdef>
- </sectiondef>
- <briefdescription>
- </briefdescription>
- <detaileddescription>
- </detaileddescription>
- <location file="063_bug_729092.tcl" line="1" column="1"/>
- </compounddef>
-</doxygen>
diff --git a/testing/063_bug_729092.tcl b/testing/063_bug_729092.tcl
deleted file mode 100644
index a6d3341..0000000
--- a/testing/063_bug_729092.tcl
+++ /dev/null
@@ -1,43 +0,0 @@
-#// objective: test for bug 729092 - TCL: Full documentation not shown for procs in namespaces.
-#// check: namespaceoo.xml
-#// check: namespaceoo_1_1_helpers.xml
-#// check: namespaceoo_1_1define.xml
-#// config: EXTRACT_ALL = yes
-#// config: GENERATE_HTML = yes
-
-# taken from
-# https://bugzilla.gnome.org/show_bug.cgi?id=729092
-
-##
-# Extension to TclOO to add static methods.
-# Defines the method on the class instead of on the object. Can be used for
-# the creation of megawidgets using TclOO by overriding the unknown method to
-# detect if the user is trying to instantiate a widget (because the method
-# will be unknown and start with a dot).
-#
-proc ::oo::define::classmethod {name {args ""} {body ""}} {
- # Create the method on the class if the caller gave arguments and body.
- if {[llength [info level 0]] == 4} {
- uplevel 1 [list self method $name $args $body]
- }
- # Get the name of the class being defined.
- set cls [lindex [info level -1] 1]
- # Make connection to private class "my" command by forwarding.
- uplevel forward $name [info object namespace $cls]::my $name
-}
-
-##
-# Extension to TclOO to add static variables.
-# Defines variables on the class instead of on the object. Can be used to
-# enforce a limited number of instantiations.
-#
-proc ::oo::Helpers::classvar {args} {
- # Get reference to class's namespace.
- set nsCl [info object namespace [uplevel 1 {self class}]]
- set nsObj [uplevel 1 {namespace current}]
- # Link variables into local (caller's) scope.
- foreach v $args {
- uplevel "my variable $v"
- upvar #0 ${nsCl}::$v ${nsObj}::$v
- }
-}
diff --git a/testing/064/struct_foo.xml b/testing/064/struct_foo.xml
index d9e2486..9678cba 100644
--- a/testing/064/struct_foo.xml
+++ b/testing/064/struct_foo.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="struct_foo" kind="struct" language="C++" prot="public">
<compoundname>Foo</compoundname>
<sectiondef kind="public-func">
@@ -97,7 +97,7 @@
</itemizedlist>
</para>
</detaileddescription>
- <location file="064_castoperator.cpp" line="20" column="10" bodyfile="064_castoperator.cpp" bodystart="20" bodyend="25"/>
+ <location file="064_castoperator.cpp" line="20" column="1" bodyfile="064_castoperator.cpp" bodystart="20" bodyend="25"/>
<listofallmembers>
<member refid="struct_foo_1aab9774d892b6cd4a0fbebd034b4c1fad" prot="public" virt="non-virtual">
<scope>Foo</scope>
diff --git a/testing/065/indexpage.xml b/testing/065/indexpage.xml
index 09c7f8c..e86dcff 100644
--- a/testing/065/indexpage.xml
+++ b/testing/065/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="ja">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>My Project</title>
diff --git a/testing/066/class_class1.xml b/testing/066/class_class1.xml
index ccc412e..13ab56c 100644
--- a/testing/066/class_class1.xml
+++ b/testing/066/class_class1.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_class1" kind="class" language="C#" prot="public">
<compoundname>Class1</compoundname>
<sectiondef kind="property">
@@ -38,7 +38,7 @@
</briefdescription>
<detaileddescription>
</detaileddescription>
- <location file="066_property_initializer.cs" line="6" column="1" bodyfile="066_property_initializer.cs" bodystart="5" bodyend="9"/>
+ <location file="066_property_initializer.cs" line="5" column="1" bodyfile="066_property_initializer.cs" bodystart="6" bodyend="9"/>
<listofallmembers>
<member refid="class_class1_1a6b0b2ab73516e37adb38b8ff33f97c40" prot="public" virt="non-virtual">
<scope>Class1</scope>
diff --git a/testing/067/067__link__varargs_8cpp.xml b/testing/067/067__link__varargs_8cpp.xml
index c6eaac5..c775dee 100644
--- a/testing/067/067__link__varargs_8cpp.xml
+++ b/testing/067/067__link__varargs_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="067__link__varargs_8cpp" kind="file" language="C++">
<compoundname>067_link_varargs.cpp</compoundname>
<innerclass refid="class_test" prot="public">Test</innerclass>
diff --git a/testing/068/068__ref__varargs_8cpp.xml b/testing/068/068__ref__varargs_8cpp.xml
index 6cae853..edbc2c6 100644
--- a/testing/068/068__ref__varargs_8cpp.xml
+++ b/testing/068/068__ref__varargs_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="068__ref__varargs_8cpp" kind="file" language="C++">
<compoundname>068_ref_varargs.cpp</compoundname>
<innerclass refid="class_test" prot="public">Test</innerclass>
diff --git a/testing/069/069__link__variadic__template_8cpp.xml b/testing/069/069__link__variadic__template_8cpp.xml
index 02cffe1..24ac5c1 100644
--- a/testing/069/069__link__variadic__template_8cpp.xml
+++ b/testing/069/069__link__variadic__template_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="069__link__variadic__template_8cpp" kind="file" language="C++">
<compoundname>069_link_variadic_template.cpp</compoundname>
<innerclass refid="class_test" prot="public">Test</innerclass>
diff --git a/testing/070/070__ref__variadic__template_8cpp.xml b/testing/070/070__ref__variadic__template_8cpp.xml
index 828319c..74448ec 100644
--- a/testing/070/070__ref__variadic__template_8cpp.xml
+++ b/testing/070/070__ref__variadic__template_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="070__ref__variadic__template_8cpp" kind="file" language="C++">
<compoundname>070_ref_variadic_template.cpp</compoundname>
<innerclass refid="class_test" prot="public">Test</innerclass>
diff --git a/testing/071/namespace_a_namespace_1_1_0d0.xml b/testing/071/namespace_a_namespace_1_1_0d0.xml
index d439723..fbe2c7a 100644
--- a/testing/071/namespace_a_namespace_1_1_0d0.xml
+++ b/testing/071/namespace_a_namespace_1_1_0d0.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="namespace_a_namespace_1_1_0d0" kind="namespace" language="C++">
<compoundname>ANamespace::@0</compoundname>
<sectiondef kind="enum">
@@ -33,13 +33,13 @@
</detaileddescription>
<inbodydescription>
</inbodydescription>
- <location file="071_enum_in_anon_ns.cpp" line="6" column="19" bodyfile="071_enum_in_anon_ns.cpp" bodystart="6" bodyend="10"/>
+ <location file="071_enum_in_anon_ns.cpp" line="6" column="1" bodyfile="071_enum_in_anon_ns.cpp" bodystart="6" bodyend="10"/>
</memberdef>
</sectiondef>
<briefdescription>
</briefdescription>
<detaileddescription>
</detaileddescription>
- <location file="071_enum_in_anon_ns.cpp" line="4" column="30"/>
+ <location file="071_enum_in_anon_ns.cpp" line="4" column="20"/>
</compounddef>
</doxygen>
diff --git a/testing/072/072__using_8cpp.xml b/testing/072/072__using_8cpp.xml
index 784bb67..66f65ca 100644
--- a/testing/072/072__using_8cpp.xml
+++ b/testing/072/072__using_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="072__using_8cpp" kind="file" language="C++">
<compoundname>072_using.cpp</compoundname>
<sectiondef kind="typedef">
diff --git a/testing/073/073__typed__enum_8cpp.xml b/testing/073/073__typed__enum_8cpp.xml
index b0b2014..9d6947e 100644
--- a/testing/073/073__typed__enum_8cpp.xml
+++ b/testing/073/073__typed__enum_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="073__typed__enum_8cpp" kind="file" language="C++">
<compoundname>073_typed_enum.cpp</compoundname>
<sectiondef kind="enum">
@@ -13,7 +13,103 @@
</detaileddescription>
<inbodydescription>
</inbodydescription>
- <location file="073_typed_enum.cpp" line="7" column="13" bodyfile="073_typed_enum.cpp" bodystart="7" bodyend="7"/>
+ <location file="073_typed_enum.cpp" line="7" column="1" bodyfile="073_typed_enum.cpp" bodystart="7" bodyend="7"/>
+ </memberdef>
+ <memberdef kind="enum" id="073__typed__enum_8cpp_1a2890437f40d5bcd72710a06cd6a934f5" prot="public" static="no" strong="yes">
+ <type>unsigned char</type>
+ <name>Mem</name>
+ <enumvalue id="073__typed__enum_8cpp_1a2890437f40d5bcd72710a06cd6a934f5a2ad9d63b69c4a10a5cc9cad923133bc4" prot="public">
+ <name>Bottom</name>
+ <initializer>= 0</initializer>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ </enumvalue>
+ <enumvalue id="073__typed__enum_8cpp_1a2890437f40d5bcd72710a06cd6a934f5ac946366be0e03f425017b1a97b4a7fbb" prot="public">
+ <name>NotMem</name>
+ <initializer>= 1U &lt;&lt; 0</initializer>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ </enumvalue>
+ <enumvalue id="073__typed__enum_8cpp_1a2890437f40d5bcd72710a06cd6a934f5a165d3d525f6d0cbd55e42cc3058cafcc" prot="public">
+ <name>Ptr</name>
+ <initializer>= 1U &lt;&lt; 1</initializer>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ </enumvalue>
+ <enumvalue id="073__typed__enum_8cpp_1a2890437f40d5bcd72710a06cd6a934f5abd34ea97de15a451a2117e2e4cd49c12" prot="public">
+ <name>Lval</name>
+ <initializer>= 1U &lt;&lt; 2</initializer>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ </enumvalue>
+ <enumvalue id="073__typed__enum_8cpp_1a2890437f40d5bcd72710a06cd6a934f5adba5553473d129a7985fb532dc249ff4" prot="public">
+ <name>Mem</name>
+ <initializer>= Ptr | Lval</initializer>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ </enumvalue>
+ <enumvalue id="073__typed__enum_8cpp_1a2890437f40d5bcd72710a06cd6a934f5aa4ffdcf0dc1f31b9acaf295d75b51d00" prot="public">
+ <name>Top</name>
+ <initializer>= NotMem | Mem</initializer>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ </enumvalue>
+ <briefdescription>
+ <para>Strongly types enum when values that has the same name as the enum. </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="073_typed_enum.cpp" line="10" column="1" bodyfile="073_typed_enum.cpp" bodystart="10" bodyend="17"/>
+ </memberdef>
+ <memberdef kind="enum" id="073__typed__enum_8cpp_1a06fc87d81c62e9abb8790b6e5713c55b" prot="public" static="no" strong="no">
+ <type/>
+ <name>@0</name>
+ <enumvalue id="073__typed__enum_8cpp_1a06fc87d81c62e9abb8790b6e5713c55ba52c998ad250c15a855ff5559e6d0d1d6" prot="public">
+ <name>Unnamed1</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ </enumvalue>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="073_typed_enum.cpp" line="19" column="1" bodyfile="073_typed_enum.cpp" bodystart="19" bodyend="21"/>
+ </memberdef>
+ <memberdef kind="enum" id="073__typed__enum_8cpp_1adf764cbdea00d65edcd07bb9953ad2b7" prot="public" static="no" strong="no">
+ <type/>
+ <name>@1</name>
+ <enumvalue id="073__typed__enum_8cpp_1adf764cbdea00d65edcd07bb9953ad2b7a7b130af0c5cb18bfee8c60994fe1d5ee" prot="public">
+ <name>Unnamed2</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ </enumvalue>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="073_typed_enum.cpp" line="23" column="1" bodyfile="073_typed_enum.cpp" bodystart="23" bodyend="25"/>
</memberdef>
</sectiondef>
<briefdescription>
diff --git a/testing/073_typed_enum.cpp b/testing/073_typed_enum.cpp
index 0818463..7248c96 100644
--- a/testing/073_typed_enum.cpp
+++ b/testing/073_typed_enum.cpp
@@ -5,3 +5,21 @@
/** @brief A strongly-typed enum */
enum class E: unsigned short {};
+
+/** @brief Strongly types enum when values that has the same name as the enum */
+enum class Mem : unsigned char {
+ Bottom = 0,
+ NotMem = 1U << 0,
+ Ptr = 1U << 1,
+ Lval = 1U << 2,
+ Mem = Ptr | Lval,
+ Top = NotMem | Mem,
+};
+
+enum {
+ Unnamed1
+};
+
+enum {
+ Unnamed2
+};
diff --git a/testing/074/namespacens.xml b/testing/074/namespacens.xml
index 0ee93fc..f63fea5 100644
--- a/testing/074/namespacens.xml
+++ b/testing/074/namespacens.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="namespacens" kind="namespace" language="C++">
<compoundname>ns</compoundname>
<sectiondef kind="func">
@@ -76,6 +76,6 @@
</itemizedlist>
</para>
</detaileddescription>
- <location file="074_ref.cpp" line="64" column="12"/>
+ <location file="074_ref.cpp" line="64" column="1"/>
</compounddef>
</doxygen>
diff --git a/testing/074/struct_foo.xml b/testing/074/struct_foo.xml
index bf9c426..7cb81f5 100644
--- a/testing/074/struct_foo.xml
+++ b/testing/074/struct_foo.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="struct_foo" kind="struct" language="C++" prot="public">
<compoundname>Foo</compoundname>
<sectiondef kind="public-func">
@@ -243,7 +243,7 @@
</simplesect>
</para>
</detaileddescription>
- <location file="074_ref.cpp" line="19" column="10" bodyfile="074_ref.cpp" bodystart="19" bodyend="54"/>
+ <location file="074_ref.cpp" line="19" column="1" bodyfile="074_ref.cpp" bodystart="19" bodyend="54"/>
<listofallmembers>
<member refid="struct_foo_1a5c036d1b3561a0e1beffe8c6799a4276" prot="public" virt="non-virtual">
<scope>Foo</scope>
diff --git a/testing/075/struct_foo.xml b/testing/075/struct_foo.xml
index 53ed0a8..dc947e9 100644
--- a/testing/075/struct_foo.xml
+++ b/testing/075/struct_foo.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="struct_foo" kind="struct" language="C++" prot="public">
<compoundname>Foo</compoundname>
<sectiondef kind="public-func">
@@ -117,7 +117,7 @@
</briefdescription>
<detaileddescription>
</detaileddescription>
- <location file="075_argmatch.cpp" line="4" column="10" bodyfile="075_argmatch.cpp" bodystart="4" bodyend="11"/>
+ <location file="075_argmatch.cpp" line="4" column="1" bodyfile="075_argmatch.cpp" bodystart="4" bodyend="11"/>
<listofallmembers>
<member refid="struct_foo_1a4f9767677227174b2a9684b92e36cba7" prot="public" virt="non-virtual">
<scope>Foo</scope>
diff --git a/testing/076/indexpage.xml b/testing/076/indexpage.xml
index 5665d9b..f2ec00e 100644
--- a/testing/076/indexpage.xml
+++ b/testing/076/indexpage.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="indexpage" kind="page">
<compoundname>index</compoundname>
<title>Emoji test</title>
diff --git a/testing/077/077__no__xml__namespace__members__in__file__scope_8h.xml b/testing/077/077__no__xml__namespace__members__in__file__scope_8h.xml
index 9825cc1..963f103 100644
--- a/testing/077/077__no__xml__namespace__members__in__file__scope_8h.xml
+++ b/testing/077/077__no__xml__namespace__members__in__file__scope_8h.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="077__no__xml__namespace__members__in__file__scope_8h" kind="file" language="C++">
<compoundname>077_no_xml_namespace_members_in_file_scope.h</compoundname>
<innernamespace refid="namespace_namespace">Namespace</innernamespace>
diff --git a/testing/078/078__xml__namespace__members__in__file__scope_8h.xml b/testing/078/078__xml__namespace__members__in__file__scope_8h.xml
index 1198549..935ed11 100644
--- a/testing/078/078__xml__namespace__members__in__file__scope_8h.xml
+++ b/testing/078/078__xml__namespace__members__in__file__scope_8h.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="078__xml__namespace__members__in__file__scope_8h" kind="file" language="C++">
<compoundname>078_xml_namespace_members_in_file_scope.h</compoundname>
<innernamespace refid="namespace_namespace">Namespace</innernamespace>
@@ -14,7 +14,7 @@
</detaileddescription>
<inbodydescription>
</inbodydescription>
- <location file="078_xml_namespace_members_in_file_scope.h" line="15" column="16" bodyfile="078_xml_namespace_members_in_file_scope.h" bodystart="15" bodyend="15"/>
+ <location file="078_xml_namespace_members_in_file_scope.h" line="15" column="1" bodyfile="078_xml_namespace_members_in_file_scope.h" bodystart="15" bodyend="15"/>
</memberdef>
</sectiondef>
<sectiondef kind="func">
diff --git a/testing/079/empty.xml b/testing/079/empty.xml
index 83e7c99..3c753c1 100644
--- a/testing/079/empty.xml
+++ b/testing/079/empty.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="empty" kind="page">
<compoundname>empty</compoundname>
<title>An empty page</title>
diff --git a/testing/079/levels.xml b/testing/079/levels.xml
index bbb4232..8a208b4 100644
--- a/testing/079/levels.xml
+++ b/testing/079/levels.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="levels" kind="page">
<compoundname>levels</compoundname>
<title>A page with two-level TOC</title>
diff --git a/testing/080/class_interface.xml b/testing/080/class_interface.xml
index 2ee4379..fa5c853 100644
--- a/testing/080/class_interface.xml
+++ b/testing/080/class_interface.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="class_interface" kind="class" language="C++" prot="public" abstract="yes">
<compoundname>Interface</compoundname>
<sectiondef kind="public-func">
@@ -83,7 +83,7 @@
</briefdescription>
<detaileddescription>
</detaileddescription>
- <location file="080_extract_private_virtual.cpp" line="6" column="16" bodyfile="080_extract_private_virtual.cpp" bodystart="6" bodyend="35"/>
+ <location file="080_extract_private_virtual.cpp" line="6" column="1" bodyfile="080_extract_private_virtual.cpp" bodystart="6" bodyend="35"/>
<listofallmembers>
<member refid="class_interface_1a328e0a16ccee5d796ca93801a055d27d" prot="private" virt="pure-virtual">
<scope>Interface</scope>
diff --git a/testing/081/081__brief__lists_8h.xml b/testing/081/081__brief__lists_8h.xml
index 3f6052e..c19ff83 100644
--- a/testing/081/081__brief__lists_8h.xml
+++ b/testing/081/081__brief__lists_8h.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="081__brief__lists_8h" kind="file" language="C++">
<compoundname>081_brief_lists.h</compoundname>
<sectiondef kind="func">
diff --git a/testing/082/namespace_n.xml b/testing/082/namespace_n.xml
index 9f39bd1..784e4e3 100644
--- a/testing/082/namespace_n.xml
+++ b/testing/082/namespace_n.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="namespace_n" kind="namespace" language="C++">
<compoundname>N</compoundname>
<sectiondef kind="var">
@@ -45,6 +45,6 @@
<detaileddescription>
<para>Namespace </para>
</detaileddescription>
- <location file="decl_def.h" line="2" column="1"/>
+ <location file="decl_def.h" line="1" column="1"/>
</compounddef>
</doxygen>
diff --git a/testing/083/namespace_n.xml b/testing/083/namespace_n.xml
index 2b41072..d7fd8f9 100644
--- a/testing/083/namespace_n.xml
+++ b/testing/083/namespace_n.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="namespace_n" kind="namespace" language="C++">
<compoundname>N</compoundname>
<sectiondef kind="var">
@@ -45,6 +45,6 @@
<detaileddescription>
<para>Namespace </para>
</detaileddescription>
- <location file="083_decl_def.cpp" line="8" column="1"/>
+ <location file="083_decl_def.cpp" line="7" column="1"/>
</compounddef>
</doxygen>
diff --git a/testing/084/084__markdown__pre_8f90.xml b/testing/084/084__markdown__pre_8f90.xml
index 62fec7d..03de0de 100644
--- a/testing/084/084__markdown__pre_8f90.xml
+++ b/testing/084/084__markdown__pre_8f90.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="084__markdown__pre_8f90" kind="file" language="Fortran">
<compoundname>084_markdown_pre.f90</compoundname>
<sectiondef kind="func">
diff --git a/testing/085/085__tooltip_8cpp.xml b/testing/085/085__tooltip_8cpp.xml
index f9859d9..4924635 100644
--- a/testing/085/085__tooltip_8cpp.xml
+++ b/testing/085/085__tooltip_8cpp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="085__tooltip_8cpp" kind="file" language="C++">
<compoundname>085_tooltip.cpp</compoundname>
<sectiondef kind="define">
@@ -11,7 +11,7 @@
<param>
<defname>mod</defname>
</param>
- <initializer>if ((<ref refid="085__tooltip_8cpp_1a5cccf7694b5d688466063895f39ee5d1" kindref="member">unit</ref> = fopen(fn, mod)) == NULL) \
+ <initializer> if ((<ref refid="085__tooltip_8cpp_1a5cccf7694b5d688466063895f39ee5d1" kindref="member">unit</ref> = fopen(fn, mod)) == NULL) \
{ \
msg(OPEN_ERR,strerror(errno)); \
}</initializer>
@@ -26,7 +26,7 @@
</memberdef>
<memberdef kind="define" id="085__tooltip_8cpp_1a11a2c0486e2bbd915f975a3517817de6" prot="public" static="no">
<name>FCLOSE_MACRO</name>
- <initializer>if (fclose(<ref refid="085__tooltip_8cpp_1a5cccf7694b5d688466063895f39ee5d1" kindref="member">unit</ref>) != 0) \
+ <initializer> if (fclose(<ref refid="085__tooltip_8cpp_1a5cccf7694b5d688466063895f39ee5d1" kindref="member">unit</ref>) != 0) \
{ \
msg(CLOSE_ERR,strerror(errno)); \
}</initializer>
diff --git a/testing/086/086__style__tags_8h.xml b/testing/086/086__style__tags_8h.xml
index 5a21a9b..c7f1cda 100644
--- a/testing/086/086__style__tags_8h.xml
+++ b/testing/086/086__style__tags_8h.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US">
<compounddef id="086__style__tags_8h" kind="file" language="C++">
<compoundname>086_style_tags.h</compoundname>
<briefdescription>
diff --git a/testing/CMakeLists.txt b/testing/CMakeLists.txt
index 40cb40b..fd6912e 100644
--- a/testing/CMakeLists.txt
+++ b/testing/CMakeLists.txt
@@ -1,9 +1,24 @@
+# run all tests sequentially (keep for backward compatibility)
add_custom_target(tests
- COMMENT "Running doxygen tests..."
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/runtests.py --doxygen ${PROJECT_BINARY_DIR}/bin/doxygen --inputdir ${CMAKE_SOURCE_DIR}/testing --outputdir ${PROJECT_BINARY_DIR}/testing
- DEPENDS doxygen
-)
-add_test(NAME suite
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/runtests.py --doxygen $<TARGET_FILE:doxygen> --inputdir ${CMAKE_SOURCE_DIR}/testing --outputdir ${PROJECT_BINARY_DIR}/testing
+ COMMENT "Running doxygen tests..."
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/testing/runtests.py --doxygen ${PROJECT_BINARY_DIR}/bin/doxygen --inputdir ${PROJECT_SOURCE_DIR}/testing --outputdir ${PROJECT_BINARY_DIR}/testing
+ DEPENDS doxygen
)
+# get the files in the testing directory starting with 3 digits and an underscore
+if (${CMAKE_VERSION} VERSION_EQUAL "3.11.0" OR ${CMAKE_VERSION} VERSION_GREATER "3.11.0")
+ file(GLOB TEST_FILES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/[0-9][0-9][0-9]_*.*")
+else()
+ file(GLOB TEST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/[0-9][0-9][0-9]_*.*")
+endif()
+
+foreach(TEST_FILE ${TEST_FILES})
+ # extract the test name from the file name
+ string(REGEX REPLACE "^.*/([0-9][0-9][0-9]*.*)\\.[^.]*$" "\\1" TEST_NAME "${TEST_FILE}")
+ # extract the test id from the file name
+ string(REGEX REPLACE "^.*/([0-9][0-9][0-9]*).*$" "\\1" TEST_ID "${TEST_FILE}")
+ # add a test target for each test
+ add_test(NAME ${TEST_NAME}
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/testing/runtests.py --id ${TEST_ID} --doxygen $<TARGET_FILE:doxygen> --inputdir ${PROJECT_SOURCE_DIR}/testing --outputdir ${PROJECT_BINARY_DIR}/testing
+ )
+endforeach()
diff --git a/testing/README.txt b/testing/README.txt
index 39b2345..30e593d 100644
--- a/testing/README.txt
+++ b/testing/README.txt
@@ -1,5 +1,5 @@
Doxygen regression test suite
-============================
+=============================
This directory contains a set of regression tests. Each test consists of a
file starting with a 3 digit number and a corresponding directory whose name
@@ -9,32 +9,44 @@ result is the same, there is no regression and the test passes. If there is a
difference the test fails and the difference (in diff -u format) will be shown.
It is also possible to see whether or not the test can be built to a xhtml set
of files (and tested against a DTD), it is also possible to create a pdf file
-for each test to see if the LaTeX / pdf generation is possible.
+for each test to see if the LaTeX / pdf generation is possible, similar for
+rtf and docbook output.
The runtest.py script responsible for running the tests takes a number of
optional parameters:
- --updateref update the reference data for a test
+ --updateref update the reference files. Should be used in
+ combination with -id to update the reference file(s)
+ for the given test
--doxygen [DOXYGEN] path/name of the doxygen executable
--xmllint [XMLLINT] path/name of the xmllint executable
- --id IDS [IDS ...] id of the test to perform
+ --id IDS [IDS ...] run test with number n only (the option can be
+ specified to run test with number n only (the option
+ can be specified multiple times
--start_id START_ID run tests starting with number n
--end_id END_ID run tests ending with number n
- --all perform all tests
+ --all can be used in combination with -updateref to update
+ the reference files for all tests.
--inputdir [INPUTDIR]
input directory containing the tests
--outputdir [OUTPUTDIR]
output directory to write the doxygen output to
--noredir disable redirection of doxygen warnings
+ --pool [POOL] pool size of multiprocess tests
--xml create xml output and check
--rtf create rtf output
--docbook create docbook output and check with xmllint
--xhtml create xhtml output and check with xmllint
+ --xmlxsd create xml output and check with xmllint against xsd
--pdf create LaTeX output and create pdf from it
--subdirs use the configuration parameter CREATE_SUBDIRS=YES
+ --clang use CLANG_ASSISTED_PARSING, works only when doxygen
+ has been compiled with "use_libclang"
--keep keep result directories
- --cfg CFGS [CFGS ...] run test with extra doxygen configuration settings
+ --cfg CFGS [CFGS ...]
+ run test with extra doxygen configuration settings
(the option may be specified multiple times
-In case neither --xml, --pdf, --rtf, --docbook or --xhtml is used the default is set to --xml.
+In case neither --xml, --xmlxsd, --pdf, --rtf, --docbook or --xhtml is used the
+default is set to --xml.
The runtest.pl has the following dependencies on 3rd party tools:
- python to run the script
diff --git a/testing/_057_caller_graphs.tcl b/testing/_057_caller_graphs.tcl
deleted file mode 100644
index 24b9c20..0000000
--- a/testing/_057_caller_graphs.tcl
+++ /dev/null
@@ -1,4 +0,0 @@
-proc inFileB args {
- array set info [info frame 0]; puts -nonewline ->$info(proc)
- inFileA
-}
diff --git a/testing/runtests.py b/testing/runtests.py
index 10fe502..fde252d 100755
--- a/testing/runtests.py
+++ b/testing/runtests.py
@@ -35,6 +35,26 @@ def xpopen(cmd, cmd1="",encoding='utf-8-sig', getStderr=False):
proc = subprocess.Popen(shlex.split(cmd),stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=encoding) # Python 3 with encoding
return proc.stdout.read()
+def clean_header(errmsg):
+ # messages (due to the usage of more) have a contents like:
+ # ::::::::::::
+ # <file name>
+ # ::::::::::::
+ # we want to skip these
+ msg = errmsg.split('\n')
+ rtnmsg = ""
+ cnt = -1
+ for o in msg:
+ if (o):
+ if (cnt == -1):
+ if o.startswith(":::::::"):
+ cnt = 3
+ if (cnt > 0):
+ cnt-=1
+ else:
+ rtnmsg+=0
+ return rtnmsg
+
class Tester:
def __init__(self,args,test):
self.args = args
@@ -118,6 +138,7 @@ class Tester:
print('INPUT=%s/%s' % (self.args.inputdir,self.test), file=f)
print('STRIP_FROM_PATH=%s' % self.args.inputdir, file=f)
print('EXAMPLE_PATH=%s' % self.args.inputdir, file=f)
+ print('WARN_LOGFILE=%s/warnings.log' % self.test_out, file=f)
if 'config' in self.config:
for option in self.config['config']:
print(option, file=f)
@@ -150,11 +171,11 @@ class Tester:
if (self.args.clang):
print('CLANG_ASSISTED_PARSING=YES', file=f)
if (self.args.cfgs):
- for cfg in list(itertools.chain.from_iterable(self.args.cfgs)):
- if cfg.find('=') == -1:
+ for cfg in self.args.cfgs:
+ if cfg[0].find('=') == -1:
print("Not a doxygen configuration item, missing '=' sign: '%s'."%cfg)
sys.exit(1)
- print(cfg, file=f)
+ print(cfg[0], file=f)
if 'check' not in self.config or not self.config['check']:
print('Test doesn\'t specify any files to check')
@@ -162,7 +183,7 @@ class Tester:
# run doxygen
if (sys.platform == 'win32'):
- redir=' > nul:'
+ redir=' > nul: 2>&1'
else:
redir=' 2> /dev/null > /dev/null'
@@ -183,7 +204,7 @@ class Tester:
# check if the file we need to check is actually generated
if not os.path.isfile(check_file):
print('Non-existing file %s after \'check:\' statement' % check_file)
- return
+ return False
# convert output to canonical form
data = xpopen('%s --format --noblanks --nowarning %s' % (self.args.xmllint,check_file))
if data:
@@ -191,12 +212,13 @@ class Tester:
data = re.sub(r'xsd" version="[0-9.-]+"','xsd" version=""',data).rstrip('\n')
else:
print('Failed to run %s on the doxygen output file %s' % (self.args.xmllint,self.test_out))
- return
+ return False
out_file='%s/%s' % (self.test_out,check)
with xopen(out_file,'w') as f:
print(data,file=f)
shutil.rmtree(self.test_out+'/out',ignore_errors=True)
os.remove(self.test_out+'/Doxyfile')
+ return True
# check the relevant files of a doxygen run with the reference material
def perform_test(self,testmgr):
@@ -278,6 +300,8 @@ class Tester:
msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,index_xsd,index_xml),)
failed_xmlxsd=True
if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
msg += (xmllint_out,)
failed_xmlxsd=True
#
@@ -304,6 +328,8 @@ class Tester:
msg += ('Failed to run %s with schema %s for files: %s' % (self.args.xmllint,compound_xsd,compound_xml),)
failed_xmlxsd=True
if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
msg += (xmllint_out,)
failed_xmlxsd=True
@@ -336,6 +362,8 @@ class Tester:
xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
xmllint_out = self.cleanup_xmllint_docbook(xmllint_out)
if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
msg += (xmllint_out,)
failed_docbook=True
elif not self.args.keep:
@@ -359,6 +387,8 @@ class Tester:
xmllint_out = xpopen(exe_string,exe_string1,getStderr=True)
xmllint_out = self.cleanup_xmllint(xmllint_out)
if xmllint_out:
+ xmllint_out = clean_header(xmllint_out)
+ if xmllint_out:
msg += (xmllint_out,)
failed_html=True
elif not self.args.keep:
@@ -366,10 +396,13 @@ class Tester:
if (self.args.pdf):
failed_latex=False
latex_output='%s/latex' % self.test_out
+ # with languages like Hungarian we had problems with some tests on windows when stderr was used.
if (sys.platform == 'win32'):
+ outType=False
redirl='>nul: 2>temp'
mk='make.bat'
else:
+ outType=True
redirl='>/dev/null 2>temp'
mk='make'
cur_directory = os.getcwd()
@@ -377,34 +410,48 @@ class Tester:
exe_string = mk
exe_string1 = exe_string
exe_string += ' %s' % (redirl)
- exe_string += ' %s more temp' % (separ)
- latex_out = xpopen(exe_string,exe_string1,getStderr=True)
+ if outType:
+ exe_string += ' %s more temp' % (separ)
+ latex_out = xpopen(exe_string,exe_string1,getStderr=outType)
os.chdir(cur_directory);
- if latex_out.find("Error")!=-1:
+ if (outType and latex_out.find("Error")!=-1):
msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_html=True
- elif xopen(latex_output + "/refman.log",'r').read().find("Error")!= -1:
+ failed_latex=True
+ elif (not outType and xopen(latex_output + "/temp",'r').read().find("Error")!= -1):
msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_html=True
- elif xopen(latex_output + "/refman.log",'r').read().find("Emergency stop")!= -1:
+ failed_latex=True
+ elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Error")!= -1:
msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
- failed_html=True
+ failed_latex=True
+ elif xopen(latex_output + "/refman.log",'r',encoding='ISO-8859-1').read().find("Emergency stop")!= -1:
+ msg += ("PDF generation failed\n For a description of the problem see 'refman.log' in the latex directory of this test",)
+ failed_latex=True
elif not self.args.keep:
shutil.rmtree(latex_output,ignore_errors=True)
- if failed_xml or failed_html or failed_latex or failed_docbook or failed_rtf or failed_xmlxsd:
+ warnings = xopen(self.test_out + "/warnings.log",'r',encoding='ISO-8859-1').read()
+ failed_warn = len(warnings)!=0
+ if failed_warn:
+ msg += (warnings,)
+
+ if failed_warn or failed_xml or failed_html or failed_latex or failed_docbook or failed_rtf or failed_xmlxsd:
testmgr.ok(False,self.test_name,msg)
- return
+ return False
testmgr.ok(True,self.test_name)
if not self.args.keep:
shutil.rmtree(self.test_out,ignore_errors=True)
+ return True
def run(self,testmgr):
if self.update:
- self.update_test(testmgr)
+ return self.update_test(testmgr)
else:
- self.perform_test(testmgr)
+ return self.perform_test(testmgr)
+
+def do_generation_work(test):
+ tester = Tester(test[0].args,test[1])
+ return tester.run(test[0])
class TestManager:
def __init__(self,args,tests):
@@ -419,10 +466,10 @@ class TestManager:
def ok(self,result,test_name,msg='Ok'):
if result:
- print('ok %s - %s' % (self.count,test_name))
+ print('ok - %s' % (test_name))
self.passed = self.passed + 1
else:
- print('not ok %s - %s' % (self.count,test_name))
+ print('not ok - %s' % (test_name))
print('-------------------------------------')
for o in msg:
print(o)
@@ -437,9 +484,20 @@ class TestManager:
return 0 if self.passed==self.num_tests else 1
def perform_tests(self):
- for test in self.tests:
- tester = Tester(self.args,test)
- tester.run(self)
+ if (self.args.pool == 1):
+ passed = 0
+ for test in self.tests:
+ tester = Tester(self.args,test)
+ passed += tester.run(self)
+ self.passed = passed
+ else:
+ dl = []
+ for test in self.tests:
+ dl += [(self, test)]
+ import multiprocessing as mp
+ p = mp.Pool(processes=self.args.pool)
+ passed = p.map(do_generation_work, dl)
+ self.passed = sum(passed)
res=self.result()
if self.args.xhtml and self.args.inputdir!='.' and not res and not self.args.keep:
shutil.rmtree("dtd",ignore_errors=True)
@@ -450,6 +508,15 @@ class TestManager:
shutil.rmtree("dtd",ignore_errors=True)
shutil.copytree(self.args.inputdir+"/dtd", "dtd")
+def split_and_keep(s,sep):
+ s = s.replace('"','') # add token separator
+ s = s.replace(sep,'\0'+sep) # add token separator
+ s = s.split('\0') # split by null delimiter
+ s = [x.strip() for x in filter(None,s)] # strip and remove empty elements
+ s = [z.split(' ',1) for z in s] # split by first space
+ s = [i for ss in s for i in ss] # flatten the list
+ return s
+
def main():
# argument handling
parser = argparse.ArgumentParser(description='run doxygen tests')
@@ -476,6 +543,8 @@ def main():
'output directory to write the doxygen output to')
parser.add_argument('--noredir',help=
'disable redirection of doxygen warnings',action="store_true")
+ parser.add_argument('--pool',nargs='?',default='1',type=int,help=
+ 'pool size of multiprocess tests')
parser.add_argument('--xml',help='create xml output and check',
action="store_true")
parser.add_argument('--rtf',help=
@@ -498,7 +567,9 @@ def main():
parser.add_argument('--cfg',nargs='+',dest='cfgs',action='append',help=
'run test with extra doxygen configuration settings '
'(the option may be specified multiple times')
- test_flags = os.getenv('TEST_FLAGS', default='').split()
+
+ test_flags = split_and_keep(os.getenv('TEST_FLAGS', default=''), '--')
+
args = parser.parse_args(test_flags + sys.argv[1:])
# sanity check
diff --git a/testing/sample.bib b/testing/sample.bib
index c20175d..a012565 100644
--- a/testing/sample.bib
+++ b/testing/sample.bib
@@ -10,7 +10,7 @@
title = {Extending a {CIP} framework to solve {MIQCP}s},
crossref = {LeLe12},
pages = {427--444},
- url = {http://doi.org/10.1007/978-1-4614-1927-3_15}
+ url = {https://link.springer.com/10.1007/978-1-4614-1927-3_15}
}
@Book{ LeLe12,
title = {Mixed Integer Nonlinear Programming},
@@ -20,7 +20,7 @@
editor = {Jon Lee and Sven Leyffer},
volume = {154},
series = {The IMA Volumes in Mathematics and its Applications},
- url = {http://doi.org/10.1007/978-1-4614-1927-3},
+ url = {https://link.springer.com/10.1007/978-1-4614-1927-3},
issn = {978-1-4614-1926-6}
}
@InCollection{ Be09,
@@ -28,5 +28,5 @@
title = {Disjunctive cuts for non-convex {MINLP}},
crossref = {LeLe12},
pages = {117--144},
- url = {http://doi.org/10.1007/978-1-4614-1927-3_5}
+ url = {https://link.springer.com/10.1007/978-1-4614-1927-3_5}
}
diff --git a/testing/testsqlite3.py b/testing/testsqlite3.py
index b4227b4..1d94f70 100755
--- a/testing/testsqlite3.py
+++ b/testing/testsqlite3.py
@@ -13,7 +13,7 @@ g_conn=None
val=[]
def print_unprocessed_attributes(node):
for key in node.attrib:
- print "WARNING: '%s' has unprocessed attr '%s'" % (node.tag,key)
+ print("WARNING: '%s' has unprocessed attr '%s'" % (node.tag,key))
def extract_attribute(node,attribute,pnl):
if not attribute in node.attrib:
@@ -69,7 +69,7 @@ def process_memberdef(node):
extract_element(node,chld,q)
for chld in node.getchildren():
- print "WARNING: '%s' has unprocessed child elem '%s'" % (node.tag,chld.tag)
+ print("WARNING: '%s' has unprocessed child elem '%s'" % (node.tag,chld.tag))
extract_attribute(node,"kind",q)
extract_attribute(node,"prot",q)
@@ -90,12 +90,12 @@ def process_memberdef(node):
r=[]
try:
r = g_conn.execute(query,val).fetchall()
- except sqlite3.OperationalError,e:
- print "SQL_ERROR:%s"%e
+ except(sqlite3.OperationalError,e):
+ print("SQL_ERROR:%s"%e)
del val[:]
if not len(r) > 0:
- print "TEST_ERROR: Member not found in SQL DB"
+ print("TEST_ERROR: Member not found in SQL DB")
def load_xml(name):
@@ -104,7 +104,7 @@ def load_xml(name):
for event, elem in context:
if event == "end" and elem.tag == "memberdef":
process_memberdef(elem)
- print "\n== Unprocessed XML =="
+ print("\n== Unprocessed XML ==")
# ET.dump(root)
diff --git a/vhdlparser/CMakeLists.txt b/vhdlparser/CMakeLists.txt
index d9281c0..b610f5c 100644
--- a/vhdlparser/CMakeLists.txt
+++ b/vhdlparser/CMakeLists.txt
@@ -1,20 +1,48 @@
+#
+# Generate parser (default target)
+#
+# when generating the parser with debug options it will look like:
+# make JAVACC_FLAGS=-debug_parser
+# or
+# make JAVACC_FLAGS="-debug_parser -debug_lookahead"
+#
+# Available debug options:
+# -debug_parser
+# -debug_token_manager
+# -debug_lookahead
+#
+# For other javacc settings / options consult the documentation of javacc.
+
find_package(Javacc)
if (JAVACC_FOUND)
+ if (JAVACC_VERSION VERSION_LESS 7.0.5)
+ message(STATUS " Doxygen requires at least JavaCC version 7.0.5 (installed: ${JAVACC_VERSION})")
+ message(STATUS " Fall back to JavaCC not installed, using existing files.")
+ else()
+
add_custom_command(
- COMMAND ${JAVACC_EXECUTABLE} ${JAVACC_FLAGS} -OUTPUT_DIRECTORY=${CMAKE_SOURCE_DIR}/vhdlparser ${CMAKE_SOURCE_DIR}/vhdlparser/vhdlparser.jj
- DEPENDS ${CMAKE_SOURCE_DIR}/vhdlparser/vhdlparser.jj
- OUTPUT ${CMAKE_SOURCE_DIR}/vhdlparser/CharStream.cc ${CMAKE_SOURCE_DIR}/vhdlparser/CharStream.h ${CMAKE_SOURCE_DIR}/vhdlparser/ErrorHandler.h ${CMAKE_SOURCE_DIR}/vhdlparser/JavaCC.h ${CMAKE_SOURCE_DIR}/vhdlparser/ParseException.cc ${CMAKE_SOURCE_DIR}/vhdlparser/ParseException.h ${CMAKE_SOURCE_DIR}/vhdlparser/Token.cc ${CMAKE_SOURCE_DIR}/vhdlparser/Token.h ${CMAKE_SOURCE_DIR}/vhdlparser/TokenManager.h ${CMAKE_SOURCE_DIR}/vhdlparser/TokenMgrError.cc ${CMAKE_SOURCE_DIR}/vhdlparser/TokenMgrError.h ${CMAKE_SOURCE_DIR}/vhdlparser/VhdlParser.cc ${CMAKE_SOURCE_DIR}/vhdlparser/VhdlParser.h ${CMAKE_SOURCE_DIR}/vhdlparser/VhdlParserConstants.h ${CMAKE_SOURCE_DIR}/vhdlparser/VhdlParserTokenManager.cc ${CMAKE_SOURCE_DIR}/vhdlparser/VhdlParserTokenManager.h
+ COMMAND ${JAVACC_EXECUTABLE} ${JAVACC_FLAGS} -OUTPUT_DIRECTORY=${PROJECT_SOURCE_DIR}/vhdlparser ${PROJECT_SOURCE_DIR}/vhdlparser/vhdlparser.jj
+ DEPENDS ${PROJECT_SOURCE_DIR}/vhdlparser/vhdlparser.jj
+ OUTPUT ${PROJECT_SOURCE_DIR}/vhdlparser/CharStream.cc ${PROJECT_SOURCE_DIR}/vhdlparser/CharStream.h ${PROJECT_SOURCE_DIR}/vhdlparser/ErrorHandler.h ${PROJECT_SOURCE_DIR}/vhdlparser/ParseException.cc ${PROJECT_SOURCE_DIR}/vhdlparser/ParseException.h ${PROJECT_SOURCE_DIR}/vhdlparser/Token.cc ${PROJECT_SOURCE_DIR}/vhdlparser/Token.h ${PROJECT_SOURCE_DIR}/vhdlparser/TokenManager.h ${PROJECT_SOURCE_DIR}/vhdlparser/TokenMgrError.cc ${PROJECT_SOURCE_DIR}/vhdlparser/TokenMgrError.h ${PROJECT_SOURCE_DIR}/vhdlparser/VhdlParser.cc ${PROJECT_SOURCE_DIR}/vhdlparser/VhdlParser.h ${PROJECT_SOURCE_DIR}/vhdlparser/VhdlParserConstants.h ${PROJECT_SOURCE_DIR}/vhdlparser/VhdlParserTokenManager.cc ${PROJECT_SOURCE_DIR}/vhdlparser/VhdlParserTokenManager.h
)
+ endif()
endif()
-include_directories(${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/qtools ${GENERATED_SRC})
+add_custom_command(
+ COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/vhdlparser/vhdl_adj.py ${PROJECT_SOURCE_DIR}/vhdlparser/VhdlParser.cc ${GENERATED_SRC}/VhdlParser_adj.cc
+ DEPENDS ${PROJECT_SOURCE_DIR}/vhdlparser/VhdlParser.cc ${PROJECT_SOURCE_DIR}/vhdlparser/vhdl_adj.py
+ OUTPUT ${GENERATED_SRC}/VhdlParser_adj.cc
+)
+set_source_files_properties(${GENERATED_SRC}/VhdlParser_adj.cc PROPERTIES GENERATED 1)
+
+include_directories(${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/qtools ${PROJECT_SOURCE_DIR}/vhdlparser ${GENERATED_SRC})
add_library(vhdlparser STATIC
CharStream.cc
ParseException.cc
Token.cc
TokenMgrError.cc
-VhdlParser.cc
+${GENERATED_SRC}/VhdlParser_adj.cc
VhdlParserTokenManager.cc
)
add_dependencies(vhdlparser
diff --git a/vhdlparser/CharStream.cc b/vhdlparser/CharStream.cc
index 65179f5..05003ef 100644
--- a/vhdlparser/CharStream.cc
+++ b/vhdlparser/CharStream.cc
@@ -1,4 +1,4 @@
-/* Generated By:JavaCC: Do not edit this line. CharStream.cc Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. CharStream.cc Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
#include "CharStream.h"
@@ -12,8 +12,8 @@ void ArrayCopy(T* src, int src_offset, T* dest, int dest_offset, int len) {
class StringReaderStream : public ReaderStream {
public:
- StringReaderStream(const JAVACC_STRING_TYPE& str) : str_(str), cur_(0), max_(str.size()) {}
- virtual size_t read(JAVACC_CHAR_TYPE *bufptr, int offset, size_t len) {
+ StringReaderStream(const JJString& str) : str_(str), cur_(0), max_(str.size()) {}
+ virtual size_t read(JJChar *bufptr, int offset, size_t len) {
size_t count = str_.copy(bufptr + offset, len > max_ ? max_ : len, cur_);
cur_ += count;
max_ -= count;
@@ -25,7 +25,7 @@ class StringReaderStream : public ReaderStream {
}
private:
- const JAVACC_STRING_TYPE str_;
+ const JJString str_;
size_t cur_;
size_t max_;
};
@@ -33,7 +33,7 @@ class StringReaderStream : public ReaderStream {
namespace vhdl {
namespace parser {
-void CharStream::ReInit(const JAVACC_STRING_TYPE& str, int startline,
+void CharStream::ReInit(const JJString& str, int startline,
int startcolumn, int buffersize) {
StringReaderStream *stream = new StringReaderStream(str);
ReInit(stream, startline, startcolumn, buffersize);
@@ -46,12 +46,12 @@ void CharStream::ReInit(ReaderStream *input_stream, int startline,
delete inputStream;
}
- if (buffer != NULL) {
+ if (buffer) {
DeleteBuffers();
}
available = bufsize = buffersize;
- buffer = new JAVACC_CHAR_TYPE[buffersize];
+ buffer = new JJChar[buffersize];
bufline = new int[buffersize];
bufcolumn = new int[buffersize];
@@ -111,7 +111,7 @@ void CharStream::adjustBeginLineColumn(int newLine, int newCol) {
}
void CharStream::ExpandBuff(bool wrapAround) {
- JAVACC_CHAR_TYPE *newbuffer = new JAVACC_CHAR_TYPE[bufsize + 2048];
+ JJChar *newbuffer = new JJChar[bufsize + 2048];
int *newbufline = new int[bufsize + 2048];
int *newbufcolumn = new int[bufsize + 2048];
@@ -160,7 +160,7 @@ void CharStream::FillBuff() {
}
}
- int i = inputStream->read(buffer, maxNextCharInd, available - maxNextCharInd);
+ size_t i = inputStream->read(buffer, maxNextCharInd, available - maxNextCharInd);
if (i > 0) {
maxNextCharInd += i;
} else {
@@ -172,7 +172,7 @@ void CharStream::FillBuff() {
}
}
-void CharStream::UpdateLineColumn(JAVACC_CHAR_TYPE c) {
+void CharStream::UpdateLineColumn(JJChar c) {
column++;
if (prevCharIsLF) {
prevCharIsLF = false;
@@ -209,4 +209,4 @@ void CharStream::UpdateLineColumn(JAVACC_CHAR_TYPE c) {
}
}
-/* JavaCC - OriginalChecksum=ade3c1b57a731a003629de593814ffa6 (do not edit this line) */
+/* JavaCC - OriginalChecksum=0ba78d6c493d812eba61de6fa794fd15 (do not edit this line) */
diff --git a/vhdlparser/CharStream.h b/vhdlparser/CharStream.h
index 69b8ab5..a955d8e 100644
--- a/vhdlparser/CharStream.h
+++ b/vhdlparser/CharStream.h
@@ -1,7 +1,8 @@
-/* Generated By:JavaCC: Do not edit this line. CharStream.h Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. CharStream.h Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
-#ifndef CHARSTREAM_H
-#define CHARSTREAM_H
+#ifndef JAVACC_CHARSTREAM_H_
+#define JAVACC_CHARSTREAM_H_
+
#include "JavaCC.h"
#ifndef INITIAL_BUFFER_SIZE
@@ -29,9 +30,10 @@ namespace parser {
class CharStream {
public:
- void setTabSize(int i) { tabSize = i; }
- int getTabSize(int i) { return tabSize; }
- private:
+ void setTabSize(int i) { tabSize = i; }
+ int getTabSize(int i) { return tabSize; }
+
+private:
int getBufcolumn(int pos) {
if (trackLineColumn && pos>=0) {
return bufcolumn[pos];
@@ -46,13 +48,14 @@ public:
return -1;
}
}
- public:
- virtual int getColumn() { return getBufcolumn(bufpos); }
- virtual int getLine() { return getBufline(bufpos); }
- virtual int getEndColumn() { return getBufcolumn(bufpos); }
- virtual int getEndLine() { return getBufline(bufpos); }
- virtual int getBeginColumn() { return getBufcolumn(tokenBegin); }
- virtual int getBeginLine() { return getBufline(tokenBegin); }
+
+public:
+ virtual int getColumn() { return getBufcolumn(bufpos); }
+ virtual int getLine() { return getBufline(bufpos); }
+ virtual int getEndColumn() { return getBufcolumn(bufpos); }
+ virtual int getEndLine() { return getBufline(bufpos); }
+ virtual int getBeginColumn() { return getBufcolumn(tokenBegin); }
+ virtual int getBeginLine() { return getBufline(tokenBegin); }
virtual bool getTrackLineColumn() { return trackLineColumn; }
virtual void setTrackLineColumn(bool val) { trackLineColumn = val; }
@@ -61,7 +64,7 @@ public:
* Backs up the input stream by amount steps. Lexer calls this method if it
* had already read some characters, but could not use them to match a
* (longer) token. So, they will be used again as the prefix of the next
- * token and it is the implementation's responsibility to do this right.
+ * token and it is the implemetation's responsibility to do this right.
*/
virtual inline void backup(int amount) {
inBuf += amount;
@@ -76,9 +79,9 @@ public:
* All characters must remain in the buffer between two successive calls
* to this method to implement backup correctly.
*/
- virtual inline JAVACC_CHAR_TYPE BeginToken() {
+ virtual inline JJChar BeginToken() {
tokenBegin = -1;
- JAVACC_CHAR_TYPE c = readChar();
+ JJChar c = readChar();
tokenBegin = bufpos;
return c;
}
@@ -89,7 +92,7 @@ public:
* of selecting the input is the responsibility of the class
* implementing this class.
*/
- virtual inline JAVACC_CHAR_TYPE readChar() {
+ virtual inline JJChar readChar() {
if (inBuf > 0) {
--inBuf;
++bufpos;
@@ -104,7 +107,7 @@ public:
FillBuff();
}
- JAVACC_CHAR_TYPE c = buffer[bufpos];
+ JJChar c = buffer[bufpos];
if (trackLineColumn) {
UpdateLineColumn(c);
@@ -123,11 +126,11 @@ public:
* anything that they want to. For example, for efficiency, one might decide
* to just return NULL, which is a valid implementation.
*/
- virtual JAVACC_STRING_TYPE GetImage() {
+ virtual JJString GetImage() {
if (bufpos >= tokenBegin)
- return JAVACC_STRING_TYPE(buffer + tokenBegin, bufpos - tokenBegin + 1);
+ return JJString(buffer + tokenBegin, bufpos - tokenBegin + 1);
else
- return JAVACC_STRING_TYPE(buffer + tokenBegin, bufsize - tokenBegin).append(buffer, bufpos + 1);
+ return JJString(buffer + tokenBegin, bufsize - tokenBegin).append(buffer, bufpos + 1);
}
/**
@@ -136,11 +139,11 @@ public:
* for use in actions in the case of MORE. A simple and inefficient
* implementation of this is as follows :
*/
- virtual JAVACC_STRING_TYPE GetSuffix(int len) {
+ virtual JJString GetSuffix(int len) {
if ((bufpos + 1) >= len) {
- return JAVACC_STRING_TYPE(buffer + bufpos - len + 1, len);
+ return JJString(buffer + bufpos - len + 1, len);
}
- return JAVACC_STRING_TYPE(buffer + bufsize - (len - bufpos - 1), len - bufpos - 1).append(buffer, bufpos + 1);
+ return JJString(buffer + bufsize - (len - bufpos - 1), len - bufpos - 1).append(buffer, bufpos + 1);
}
/**
@@ -160,62 +163,62 @@ public:
return inBuf == 0 && bufpos + 1 >= maxNextCharInd && inputStream->endOfInput();
}
- CharStream(const JAVACC_CHAR_TYPE *buf, int sz, int startline,
+ CharStream(const JJChar *buf, int sz, int startline,
int startcolumn, int buffersize) :
- bufline(NULL), bufcolumn(NULL), buffer(NULL), bufpos(0), bufsize(0),
+ bufline(nullptr), bufcolumn(nullptr), buffer(nullptr), bufpos(0), bufsize(0),
tokenBegin(0), column(0), line(0), prevCharIsCR(false), prevCharIsLF(false),
available(0), maxNextCharInd(0), inBuf(0), tabSize(1), trackLineColumn(true),
- inputStream(NULL), deleteStream(false) {
- ReInit(JAVACC_STRING_TYPE(buf, sz), startline, startcolumn, buffersize);
+ inputStream(nullptr), deleteStream(false) {
+ ReInit(JJString(buf, sz), startline, startcolumn, buffersize);
}
- CharStream(const JAVACC_CHAR_TYPE *buf, int sz, int startline, int startcolumn) :
- bufline(NULL), bufcolumn(NULL), buffer(NULL), bufpos(0), bufsize(0),
+ CharStream(const JJChar *buf, int sz, int startline, int startcolumn) :
+ bufline(nullptr), bufcolumn(nullptr), buffer(nullptr), bufpos(0), bufsize(0),
tokenBegin(0), column(0), line(0), prevCharIsCR(false), prevCharIsLF(false),
available(0), maxNextCharInd(0), inBuf(0), tabSize(1), trackLineColumn(true),
- inputStream(NULL), deleteStream(false) {
- ReInit(JAVACC_STRING_TYPE(buf, sz), startline, startcolumn, INITIAL_BUFFER_SIZE);
+ inputStream(nullptr), deleteStream(false) {
+ ReInit(JJString(buf, sz), startline, startcolumn, INITIAL_BUFFER_SIZE);
}
- CharStream(const JAVACC_STRING_TYPE& str, int startline,
+ CharStream(const JJString& str, int startline,
int startcolumn, int buffersize) :
- bufline(NULL), bufcolumn(NULL), buffer(NULL), bufpos(0), bufsize(0),
+ bufline(nullptr), bufcolumn(nullptr), buffer(nullptr), bufpos(0), bufsize(0),
tokenBegin(0), column(0), line(0), prevCharIsCR(false), prevCharIsLF(false),
available(0), maxNextCharInd(0), inBuf(0), tabSize(1), trackLineColumn(true),
- inputStream(NULL), deleteStream(false) {
+ inputStream(nullptr), deleteStream(false) {
ReInit(str, startline, startcolumn, buffersize);
}
- CharStream(const JAVACC_STRING_TYPE& str, int startline, int startcolumn) :
- bufline(NULL), bufcolumn(NULL), buffer(NULL), bufpos(0), bufsize(0),
+ CharStream(const JJString& str, int startline, int startcolumn) :
+ bufline(nullptr), bufcolumn(nullptr), buffer(nullptr), bufpos(0), bufsize(0),
tokenBegin(0), column(0), line(0), prevCharIsCR(false), prevCharIsLF(false),
available(0), maxNextCharInd(0), inBuf(0), tabSize(1), trackLineColumn(true),
- inputStream(NULL), deleteStream(false) {
+ inputStream(nullptr), deleteStream(false) {
ReInit(str, startline, startcolumn, INITIAL_BUFFER_SIZE);
}
CharStream(ReaderStream *input_stream, int startline,
int startcolumn, int buffersize) :
- bufline(NULL), bufcolumn(NULL), buffer(NULL), bufpos(0), bufsize(0),
+ bufline(nullptr), bufcolumn(nullptr), buffer(nullptr), bufpos(0), bufsize(0),
tokenBegin(0), column(0), line(0), prevCharIsCR(false), prevCharIsLF(false),
available(0), maxNextCharInd(0), inBuf(0), tabSize(1), trackLineColumn(true),
- inputStream(NULL), deleteStream(false) {
- ReInit(input_stream, startline, startcolumn, INITIAL_BUFFER_SIZE);
+ inputStream(nullptr), deleteStream(false) {
+ ReInit(input_stream, startline, startcolumn, buffersize);
}
CharStream(ReaderStream *input_stream, int startline, int startcolumn) :
- bufline(NULL), bufcolumn(NULL), buffer(NULL), bufpos(0), bufsize(0),
+ bufline(nullptr), bufcolumn(nullptr), buffer(nullptr), bufpos(0), bufsize(0),
tokenBegin(0), column(0), line(0), prevCharIsCR(false), prevCharIsLF(false),
available(0), maxNextCharInd(0), inBuf(0), tabSize(1), trackLineColumn(true),
- inputStream(NULL), deleteStream(false) {
+ inputStream(nullptr), deleteStream(false) {
ReInit(input_stream, startline, startcolumn, INITIAL_BUFFER_SIZE);
}
CharStream(ReaderStream *input_stream) :
- bufline(NULL), bufcolumn(NULL), buffer(NULL), bufpos(0), bufsize(0),
+ bufline(nullptr), bufcolumn(nullptr), buffer(nullptr), bufpos(0), bufsize(0),
tokenBegin(0), column(0), line(0), prevCharIsCR(false), prevCharIsLF(false),
available(0), maxNextCharInd(0), inBuf(0), tabSize(1), trackLineColumn(true),
- inputStream(NULL), deleteStream(false) {
+ inputStream(nullptr), deleteStream(false) {
ReInit(input_stream, 1, 1, INITIAL_BUFFER_SIZE);
}
@@ -229,22 +232,22 @@ public:
ReInit(input_stream, 1, 1, INITIAL_BUFFER_SIZE);
}
- virtual void ReInit(const JAVACC_STRING_TYPE& str, int startline,
+ virtual void ReInit(const JJString& str, int startline,
int startcolumn, int buffersize);
- virtual void ReInit(const JAVACC_STRING_TYPE& str, int startline,
+ virtual void ReInit(const JJString& str, int startline,
int startcolumn) {
ReInit(str, startline, startcolumn, INITIAL_BUFFER_SIZE);
}
virtual void adjustBeginLineColumn(int newLine, int newCol);
- protected:
- virtual void UpdateLineColumn(JAVACC_CHAR_TYPE c);
+protected:
+ virtual void UpdateLineColumn(JJChar c);
int* bufline;
int* bufcolumn;
- JAVACC_CHAR_TYPE* buffer;
+ JJChar* buffer;
int bufpos;
int bufsize;
int tokenBegin;
@@ -263,5 +266,6 @@ public:
}
}
+
#endif
-/* JavaCC - OriginalChecksum=3f0e693d1617236429891c8c95713d73 (do not edit this line) */
+/* JavaCC - OriginalChecksum=c5b4b2e72393f865547f405cc9def169 (do not edit this line) */
diff --git a/vhdlparser/ErrorHandler.h b/vhdlparser/ErrorHandler.h
index 224500e..d5535e8 100644
--- a/vhdlparser/ErrorHandler.h
+++ b/vhdlparser/ErrorHandler.h
@@ -1,7 +1,8 @@
-/* Generated By:JavaCC: Do not edit this line. ErrorHandler.h Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. ErrorHandler.h Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true,BUILD_PARSER=true,BUILD_TOKEN_MANAGER=true */
-#ifndef ERRORHANDLER_H
-#define ERRORHANDLER_H
+#ifndef JAVACC_ERRORHANDLER_H
+#define JAVACC_ERRORHANDLER_H
+
#include <stdio.h>
#include <string>
#include "JavaCC.h"
@@ -10,7 +11,7 @@
namespace vhdl {
namespace parser {
-JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str);
+JJSimpleString addUnicodeEscapes(const JJString& str);
class VhdlParser;
class ErrorHandler {
@@ -24,22 +25,22 @@ JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str);
// expectedKind - token kind that the parser was trying to consume.
// expectedToken - the image of the token - tokenImages[expectedKind].
// actual - the actual token that the parser got instead.
- virtual void handleUnexpectedToken(int expectedKind, JAVACC_STRING_TYPE expectedToken, Token *actual, VhdlParser *parser) {
+ virtual void handleUnexpectedToken(int expectedKind, const JJString& expectedToken, Token *actual, VhdlParser *parser) {
error_count++;
fprintf(stderr, "Expecting %s at: %d:%d but got %s\n", addUnicodeEscapes(expectedToken).c_str(), actual->beginLine, actual->beginColumn, addUnicodeEscapes(actual->image).c_str());
}
// Called when the parser cannot continue parsing.
// last - the last token successfully parsed.
// unexpected - the token at which the error occurs.
- // production - the production in which this error occurs.
- virtual void handleParseError(Token *last, Token *unexpected, JAVACC_SIMPLE_STRING production, VhdlParser *parser) {
+ // production - the production in which this error occurrs.
+ virtual void handleParseError(Token *last, Token *unexpected, const JJSimpleString& production, VhdlParser *parser) {
error_count++;
fprintf(stderr, "Encountered: %s at: %d:%d while parsing: %s\n", addUnicodeEscapes(unexpected->image).c_str(), unexpected->beginLine, unexpected->beginColumn, production.c_str());
}
virtual int getErrorCount() {
return error_count;
}
- virtual void handleOtherError(JAVACC_STRING_TYPE message, VhdlParser *parser) {
+ virtual void handleOtherError(const JJString& message, VhdlParser *parser) {
fprintf(stderr, "Error: %s\n", (char*)message.c_str());
}
virtual ~ErrorHandler() {}
@@ -62,11 +63,11 @@ JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str);
// errorAfter : prefix that was seen before this error occurred
// curchar : the offending character
//
- virtual void lexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, VhdlParserTokenManager* token_manager) {
+ virtual void lexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, const JJString& errorAfter, JJChar curChar, VhdlParserTokenManager* token_manager) {
// by default, we just print an error message and return.
fprintf(stderr, "Lexical error at: %d:%d. Encountered: %c after: %s.\n", errorLine, errorColumn, curChar, (EOFSeen? "EOF" : (const char*)errorAfter.c_str()));
}
- virtual void lexicalError(JAVACC_STRING_TYPE errorMessage, VhdlParserTokenManager* token_manager) {
+ virtual void lexicalError(const JJString& errorMessage, VhdlParserTokenManager* token_manager) {
fprintf(stderr, "%s\n", (char*)errorMessage.c_str());
}
virtual ~TokenManagerErrorHandler() {}
@@ -76,4 +77,5 @@ JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str);
}
#endif
-/* JavaCC - OriginalChecksum=c18f1105ba178be8e21cc9f279f94496 (do not edit this line) */
+
+/* JavaCC - OriginalChecksum=5361b31ac6530c6c23511012deb15394 (do not edit this line) */
diff --git a/vhdlparser/JavaCC.h b/vhdlparser/JavaCC.h
index 2d34634..5889e93 100644
--- a/vhdlparser/JavaCC.h
+++ b/vhdlparser/JavaCC.h
@@ -35,10 +35,10 @@ public:
const JAVACC_CHAR_TYPE EMPTY[] = { 0 };
#ifndef MAX
-#define MAX(a,b) (a>=b?a:b)
+#define MAX(a,b) ((a)>=(b)?(a):(b))
#endif
#ifndef MIN
-#define MIN(a,b) (a<=b?a:b)
+#define MIN(a,b) ((a)<=(b)?(a):(b))
#endif
template<typename T>
diff --git a/vhdlparser/JavaCC.h.in b/vhdlparser/JavaCC.h.in
index 224b2b5..5889e93 100644
--- a/vhdlparser/JavaCC.h.in
+++ b/vhdlparser/JavaCC.h.in
@@ -1,31 +1,33 @@
-/* Generated By:JavaCC: Do not edit this line. JavaCC.h Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. JavaCC.h Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
-#ifndef JAVACC_H_
-#define JAVACC_H_
-#include <stdio.h>
+#ifndef JAVACC_JAVACC_H_
+#define JAVACC_JAVACC_H_
+
#include <string>
-#include <memory.h>
-#include <assert.h>
-#include "vhdlstring.h"
+#include <memory>
+#include <cassert>
+#include <functional>
#ifndef JAVACC_CHAR_TYPE
#define JAVACC_CHAR_TYPE char
#endif
#ifndef JAVACC_STRING_TYPE
-#define JAVACC_STRING_TYPE VhdlString
+#define JAVACC_STRING_TYPE std::basic_string<JAVACC_CHAR_TYPE>
#endif
-#define JAVACC_SIMPLE_STRING VhdlString
+#define JAVACC_SIMPLE_STRING std::basic_string<char>
-typedef JAVACC_STRING_TYPE StringBuffer;
-typedef JAVACC_STRING_TYPE String;
+typedef JAVACC_CHAR_TYPE JJChar;
+typedef JAVACC_STRING_TYPE JJString;
+typedef JAVACC_STRING_TYPE JJStringBuffer;
+typedef JAVACC_SIMPLE_STRING JJSimpleString;
// Abstraction on stream classes to read a block of data into a buffer.
class ReaderStream {
public:
// Read block of data into a buffer and return the actual number read.
- virtual size_t read(JAVACC_CHAR_TYPE * /*bufptr*/, int /*offset*/, size_t /*len*/) { return 0; }
+ virtual size_t read(JAVACC_CHAR_TYPE *buffer, int offset, size_t len) { return 0; }
virtual bool endOfInput() { return true; }
virtual ~ReaderStream() {}
};
@@ -33,11 +35,26 @@ public:
const JAVACC_CHAR_TYPE EMPTY[] = { 0 };
#ifndef MAX
-#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MAX(a,b) ((a)>=(b)?(a):(b))
#endif
#ifndef MIN
-#define MIN(a,b) ((a)<(b)?(a):(b))
+#define MIN(a,b) ((a)<=(b)?(a):(b))
#endif
+template<typename T>
+struct JJEnter
+{
+ JJEnter(T f_) : f{f_} {f();}
+ ~JJEnter(){}
+ T f;
+};
+template<typename T>
+struct JJExit
+{
+ JJExit(T f_) : f{f_} {}
+ ~JJExit(){f();}
+ T f;
+};
+
#endif
-/* JavaCC - OriginalChecksum=eb066370c81bb58bb68713327da9719f (do not edit this line) */
+/* JavaCC - OriginalChecksum=b719dd5e5f87efc5315d14df0b701850 (do not edit this line) */
diff --git a/vhdlparser/Makefile b/vhdlparser/Makefile
deleted file mode 100644
index 84bdccf..0000000
--- a/vhdlparser/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# Copyright (C) 1997-2015 by Dimitri van Heesch.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation under the terms of the GNU General Public License is hereby
-# granted. No representations are made about the suitability of this software
-# for any purpose. It is provided "as is" without express or implied warranty.
-# See the GNU General Public License for more details.
-#
-# Documents produced by doxygen are derivative works derived from the
-# input used in their production; they are not affected by this license.
-#
-
-#
-# Files generated by javacc
-#
-GEN_FILES=CharStream.cc CharStream.h ErrorHandler.h ParseException.cc ParseException.h \
- Token.cc Token.h TokenManager.h TokenMgrError.cc TokenMgrError.h VhdlParser.cc VhdlParser.h \
- VhdlParserConstants.h VhdlParserTokenManager.cc VhdlParserTokenManager.h \
- JavaCC.h
-#
-# Generate parser (default target)
-#
-# when generating the parser with debug options it will look like:
-# make JAVACC_FLAGS=-debug_parser
-# or
-# make JAVACC_FLAGS="-debug_parser -debug_lookahead"
-#
-# Available debug options:
-# -debug_parser
-# -debug_token_manager
-# -debug_lookahead
-#
-# For other javacc settings / options consult the documentation of javacc.
-
-regenerate:
- @rm -f $(GEN_FILES)
- @javacc $(JAVACC_FLAGS) vhdlparser.jj
- @cp JavaCC.h.in JavaCC.h
-
-#
-# reset the generated files back to their versions from git.
-#
-
-reset_gen_files:
- @rm -f $(GEN_FILES)
- @git checkout $(GEN_FILES)
-
-help:
- @echo "Targets:"
- @echo " regenerate (default)"
- @echo " reset_gen_files"
-
-FORCE:
diff --git a/vhdlparser/ParseException.cc b/vhdlparser/ParseException.cc
index 375ff6c..9f256d9 100644
--- a/vhdlparser/ParseException.cc
+++ b/vhdlparser/ParseException.cc
@@ -1,4 +1,4 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.cc Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. ParseException.cc Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
#include "ParseException.h"
@@ -23,7 +23,7 @@ namespace parser {
*/
ParseException::ParseException(Token currentTokenVal,
int** expectedTokenSequencesVal,
- JAVACC_STRING_TYPE* tokenImageVal
+ JJString* tokenImageVal
)
{
initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal);
@@ -46,14 +46,14 @@ namespace parser {
}
/** Constructor with message. */
- ParseException::ParseException(JAVACC_STRING_TYPE message) {
+ ParseException::ParseException(const JJString& message) {
}
/**
* This is the last token that has been consumed successfully. If
* this object has been created due to a parse error, the token
- * following this token will (therefore) be the first error token.
+ * followng this token will (therefore) be the first error token.
*/
Token currentToken;
@@ -69,7 +69,7 @@ namespace parser {
* parser within which the parse error occurred. This array is
* defined in the generated ...Constants class.
*/
- JAVACC_STRING_TYPE* tokenImage;
+ JJString* tokenImage;
/**
* It uses "currentToken" and "expectedTokenSequences" to generate a parse
@@ -78,12 +78,12 @@ namespace parser {
* from the parser) the correct error message
* gets displayed.
*/
- JAVACC_STRING_TYPE ParseException::initialise(Token currentToken,
+ JJString ParseException::initialise(Token currentToken,
int** expectedTokenSequences,
- JAVACC_STRING_TYPE* tokenImage) {
+ JJString* tokenImage) {
#if 0
- //JAVACC_STRING_TYPE eol = System.getProperty("line.separator", "\n");
- expected = new JAVACC_STRING_TYPE();
+ //JJString eol = System.getProperty("line.separator", "\n");
+ expected = new JJString();
int maxSize = 0;
for (int i = 0; i < expectedTokenSequences.length; i++) {
if (maxSize < expectedTokenSequences[i].length) {
@@ -93,39 +93,39 @@ namespace parser {
expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
}
if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
- expected.append((JAVACC_CHAR_TYPE*)"...");
+ expected.append((JJChar*)"...");
}
expected.append(eol).append(" ");
}
- JAVACC_STRING_TYPE retval = (JAVACC_CHAR_TYPE*)"Encountered \"";
+ JJString retval = (JJChar*)"Encountered \"";
Token tok = currentToken.next;
for (int i = 0; i < maxSize; i++) {
- if (i != 0) retval += (JAVACC_CHAR_TYPE*)" ";
+ if (i != 0) retval += (JJChar*)" ";
if (tok.kind == 0) {
retval += tokenImage[0];
break;
}
- retval += (JAVACC_CHAR_TYPE*)" " + tokenImage[tok.kind];
- retval += (JAVACC_CHAR_TYPE*)" \"";
+ retval += (JJChar*)" " + tokenImage[tok.kind];
+ retval += (JJChar*)" \"";
retval += add_escapes(tok.image);
- retval += (JAVACC_CHAR_TYPE*)" \"";
+ retval += (JJChar*)" \"";
tok = tok.next;
}
- retval += (JAVACC_CHAR_TYPE*)"\" at line " + currentToken.next.beginLine + (JAVACC_CHAR_TYPE*)", column " + currentToken.next.beginColumn;
- retval += (JAVACC_CHAR_TYPE*)"." + eol;
+ retval += (JJChar*)"\" at line " + currentToken.next.beginLine + (JJChar*)", column " + currentToken.next.beginColumn;
+ retval += (JJChar*)"." + eol;
if (expectedTokenSequences.length == 1) {
- retval += (JAVACC_CHAR_TYPE*)"Was expecting:" + eol + (JAVACC_CHAR_TYPE*)" ";
+ retval += (JJChar*)"Was expecting:" + eol + (JJChar*)" ";
} else {
- retval += (JAVACC_CHAR_TYPE*)"Was expecting one of:" + eol + (JAVACC_CHAR_TYPE*)" ";
+ retval += (JJChar*)"Was expecting one of:" + eol + (JJChar*)" ";
}
retval += expected.toString();
return retval;
#endif
- return (JAVACC_CHAR_TYPE*)"Parse exception";
+ return (JJChar*)"Parse exception";
}
/**
- * The end of line JAVACC_STRING_TYPE for this machine.
+ * The end of line JJString for this machine.
*/
#define eol "\n"
@@ -134,10 +134,10 @@ namespace parser {
* when these raw version cannot be used as part of an ASCII
* string literal.
*/
- JAVACC_STRING_TYPE ParseException::add_escapes(JAVACC_STRING_TYPE str) {
+ JJString ParseException::add_escapes(const JJString& str) {
/*
- JAVACC_STRING_TYPE *retval = new JAVACC_STRING_TYPE();
- JAVACC_CHAR_TYPE ch;
+ JJString *retval = new JJString();
+ JJChar ch;
for (int i = 0; i < str.length(); i++) {
switch (str.charAt(i))
{
@@ -167,7 +167,7 @@ namespace parser {
continue;
default:
if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
- JAVACC_STRING_TYPE s = "0000" + Integer.toString(ch, 16);
+ JJString s = "0000" + Integer.toString(ch, 16);
retval.append("\\u" + s.substring(s.length() - 4, s.length()));
} else {
retval.append(ch);
@@ -181,4 +181,4 @@ namespace parser {
}
}
-/* JavaCC - OriginalChecksum=9f6af8fd72f5fe3e4210cf02acbd8387 (do not edit this line) */
+/* JavaCC - OriginalChecksum=7a72405661a136830ccf7f3cab0fffdc (do not edit this line) */
diff --git a/vhdlparser/ParseException.h b/vhdlparser/ParseException.h
index 4a22772..c4afc27 100644
--- a/vhdlparser/ParseException.h
+++ b/vhdlparser/ParseException.h
@@ -1,7 +1,8 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.h Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. ParseException.h Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
-#ifndef _PARSE_EXCEPTION_H
-#define _PARSE_EXCEPTION_H
+#ifndef JAVACC_PARSE_EXCEPTION_H
+#define JAVACC_PARSE_EXCEPTION_H
+
#include "JavaCC.h"
#include "Token.h"
@@ -28,7 +29,7 @@ class ParseException {
*/
ParseException(Token currentTokenVal,
int** expectedTokenSequencesVal,
- JAVACC_STRING_TYPE* tokenImageVal
+ JJString* tokenImageVal
);
/**
@@ -44,13 +45,13 @@ class ParseException {
ParseException();
/** Constructor with message. */
- ParseException(JAVACC_STRING_TYPE message);
+ ParseException(const JJString& message);
/**
* This is the last token that has been consumed successfully. If
* this object has been created due to a parse error, the token
- * following this token will (therefore) be the first error token.
+ * followng this token will (therefore) be the first error token.
*/
Token currentToken;
@@ -66,7 +67,7 @@ class ParseException {
* parser within which the parse error occurred. This array is
* defined in the generated ...Constants class.
*/
- JAVACC_STRING_TYPE* tokenImage;
+ JJString* tokenImage;
/**
* It uses "currentToken" and "expectedTokenSequences" to generate a parse
@@ -75,9 +76,9 @@ class ParseException {
* from the parser) the correct error message
* gets displayed.
*/
- private: JAVACC_STRING_TYPE initialise(Token currentToken,
+ private: JJString initialise(Token currentToken,
int** expectedTokenSequences,
- JAVACC_STRING_TYPE* tokenImage);
+ JJString* tokenImage);
/**
* The end of line string for this machine.
@@ -89,11 +90,12 @@ class ParseException {
* when these raw version cannot be used as part of an ASCII
* string literal.
*/
- JAVACC_STRING_TYPE add_escapes(JAVACC_STRING_TYPE str);
+ JJString add_escapes(const JJString& str);
};
}
}
+
#endif
-/* JavaCC - OriginalChecksum=bd87c2fc11a4306bd2c2482fd1025b7c (do not edit this line) */
+/* JavaCC - OriginalChecksum=6705523c0ea4e83f3c38da57253c0aea (do not edit this line) */
diff --git a/vhdlparser/Token.cc b/vhdlparser/Token.cc
index 735091d..d47dc68 100644
--- a/vhdlparser/Token.cc
+++ b/vhdlparser/Token.cc
@@ -1,4 +1,4 @@
-/* Generated By:JavaCC: Do not edit this line. Token.cc Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. Token.cc Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true,TOKEN_INCLUDES=,TOKEN_EXTENDS= */
#include "Token.h"
@@ -18,42 +18,46 @@ namespace parser {
* override this method as appropriate.
*/
void * Token::getValue() {
- return NULL;
+ return nullptr;
}
/**
* No-argument constructor
*/
- Token::Token() {
- this->next = NULL;
- this->specialToken = NULL;
+ Token::Token() :
+ beginLine(0), beginColumn(0), endLine(0), endColumn(0)
+ {
+ this->next = nullptr;
+ this->specialToken = nullptr;
}
/**
* Constructs a new token for the specified Image.
*/
- Token::Token(int kind)
+ Token::Token(int kind) :
+ beginLine(0), beginColumn(0), endLine(0), endColumn(0)
{
this->kind = kind;
- this->next = NULL;
- this->specialToken = NULL;
+ this->next = nullptr;
+ this->specialToken = nullptr;
}
/**
* Constructs a new token for the specified Image and Kind.
*/
- Token::Token(int kind, JAVACC_STRING_TYPE image)
+ Token::Token(int kind, const JJString& image)
+ : beginLine(0), beginColumn(0), endLine(0), endColumn(0)
{
this->kind = kind;
this->image = image;
- this->next = NULL;
- this->specialToken = NULL;
+ this->next = nullptr;
+ this->specialToken = nullptr;
}
/**
* Returns the image.
*/
- JAVACC_STRING_TYPE Token::toString()
+ const JJString& Token::toString()
{
return image;
}
@@ -70,7 +74,7 @@ namespace parser {
* to the following switch statement. Then you can cast matchedToken
* variable to the appropriate type and use sit in your lexical actions.
*/
- Token *Token::newToken(int ofKind, JAVACC_STRING_TYPE image)
+ Token *Token::newToken(int ofKind, const JJString& image)
{
switch(ofKind)
{
@@ -80,13 +84,16 @@ namespace parser {
Token *Token::newToken(int ofKind)
{
- return newToken(ofKind, JAVACC_STRING_TYPE((JAVACC_CHAR_TYPE*)""));
+ return newToken(ofKind, JJString());
}
Token::~Token() {
if (specialToken) delete specialToken;
+ this->kind = 0;
+ this->next = nullptr;
+ this->specialToken = nullptr;
}
}
}
-/* JavaCC - OriginalChecksum=dcb0f64486aa6455ae5af05d6bb539ec (do not edit this line) */
+/* JavaCC - OriginalChecksum=01131f3b3906a670aa8fee6224233701 (do not edit this line) */
diff --git a/vhdlparser/Token.h b/vhdlparser/Token.h
index 040899e..3575005 100644
--- a/vhdlparser/Token.h
+++ b/vhdlparser/Token.h
@@ -1,7 +1,8 @@
-/* Generated By:JavaCC: Do not edit this line. Token.h Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. Token.h Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true,TOKEN_INCLUDES=,TOKEN_EXTENDS= */
-#ifndef TOKEN_H
-#define TOKEN_H
+#ifndef JAVACC_TOKEN_H
+#define JAVACC_TOKEN_H
+
#include "JavaCC.h"
@@ -35,7 +36,7 @@ class Token
/**
* The string image of the token.
*/
- JAVACC_STRING_TYPE image;
+ JJString image;
/**
* A reference to the next regular (non-special) token from the input
@@ -84,14 +85,14 @@ class Token
/**
* Constructs a new token for the specified Image and Kind.
*/
- Token(int kind, JAVACC_STRING_TYPE image);
+ Token(int kind, const JJString& image);
virtual ~Token();
/**
* Returns the image.
*/
- JAVACC_STRING_TYPE toString();
+ const JJString& toString();
/**
@@ -106,12 +107,13 @@ class Token
* to the following switch statement. Then you can cast matchedToken
* variable to the appropriate type and use sit in your lexical actions.
*/
- static Token *newToken(int ofKind, JAVACC_STRING_TYPE image);
+ static Token *newToken(int ofKind, const JJString& image);
static Token *newToken(int ofKind);
};
}
}
+
#endif
-/* JavaCC - OriginalChecksum=4748c3d6443aa3445d3c95ab54f14c2a (do not edit this line) */
+/* JavaCC - OriginalChecksum=8c237423e3d9695c3bfcf539bcf92375 (do not edit this line) */
diff --git a/vhdlparser/TokenManager.h b/vhdlparser/TokenManager.h
index 0c2caa6..6b158ae 100644
--- a/vhdlparser/TokenManager.h
+++ b/vhdlparser/TokenManager.h
@@ -1,13 +1,12 @@
-/* Generated By:JavaCC: Do not edit this line. TokenManager.h Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. TokenManager.h Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
-#ifndef TOKENMANAGER_H
-#define TOKENMANAGER_H
+#ifndef JAVACC_TOKENMANAGER_H
+#define JAVACC_TOKENMANAGER_H
+
#include <iostream>
#include "JavaCC.h"
#include "Token.h"
-using namespace std;
-
namespace vhdl {
namespace parser {
/**
@@ -23,13 +22,15 @@ public:
*/
virtual ~TokenManager() { }
virtual Token *getNextToken() = 0;
+ virtual void setParser(void* parser) {};
virtual void lexicalError() {
- cerr << "Lexical error encountered." << endl;
+ std::cerr << "Lexical error encountered." << std::endl;
}
};
}
}
+
#endif
-/* JavaCC - OriginalChecksum=918e2eba53e028d6c4142283ce3f498f (do not edit this line) */
+/* JavaCC - OriginalChecksum=c5e389e7ee25f48da34e517ae429ac2a (do not edit this line) */
diff --git a/vhdlparser/TokenMgrError.cc b/vhdlparser/TokenMgrError.cc
index 74908f0..3560805 100644
--- a/vhdlparser/TokenMgrError.cc
+++ b/vhdlparser/TokenMgrError.cc
@@ -1,4 +1,4 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.cc Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.cc Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
#include "TokenMgrError.h"
@@ -14,17 +14,17 @@ namespace parser {
* errorLine : line number when the error occurred
* errorColumn : column number when the error occurred
* errorAfter : prefix that was seen before this error occurred
- * curJAVACC_CHAR_TYPE : the offending character
+ * curJJChar : the offending character
* Note: You can customize the lexical error message by modifying this method.
*/
- JAVACC_STRING_TYPE TokenMgrError::LexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar) {
+ JJString TokenMgrError::LexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, const JJString& errorAfter, JJChar curChar) {
#if 0
- JAVACC_STRING_TYPE s;
- stringstream<JAVACC_STRING_TYPE> ss;
+ JJString s;
+ stringstream<JJString> ss;
ss << "Lexical error at line " << errorLine << " column " << errorColumn
<< ". Encountered: " << curChar << "(" << (int)curChar
<< ") after : \"" << errorAfter.c_str() << "\"";
- return (JAVACC_STRING_TYPE)ss.rdbuf()->str();
+ return (JJString)ss.rdbuf()->str();
#endif
return EMPTY;
}
@@ -38,7 +38,7 @@ namespace parser {
*
* from this method for such cases in the release version of your parser.
*/
- JAVACC_STRING_TYPE TokenMgrError::getMessage() {
+ JJString TokenMgrError::getMessage() {
return message;
}
@@ -51,12 +51,12 @@ namespace parser {
}
/** Constructor with message and reason. */
- TokenMgrError::TokenMgrError(JAVACC_STRING_TYPE message, int reason) {
+ TokenMgrError::TokenMgrError(const JJString& message, int reason) {
errorCode = reason;
}
/** Full Constructor. */
- TokenMgrError::TokenMgrError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, int reason) {
+ TokenMgrError::TokenMgrError(bool EOFSeen, int lexState, int errorLine, int errorColumn, const JJString& errorAfter, JJChar curChar, int reason) {
message = LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar);
errorCode = reason;
}
@@ -64,7 +64,7 @@ namespace parser {
// i < 16 - guaranteed
char hexChar(int i) {
if (i < 10) {
- return i + '0';
+ return i - '0';
}
return 'a' + (i - 10);
}
@@ -73,10 +73,10 @@ char hexChar(int i) {
* Replaces unprintable characters by their escaped (or unicode escaped)
* equivalents in the given string
*/
-JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str) {
- JAVACC_SIMPLE_STRING retval;
+JJSimpleString addUnicodeEscapes(const JJString& str) {
+ JJSimpleString retval;
for (size_t i = 0; i < str.size(); i++) {
- JAVACC_CHAR_TYPE ch = str[i];
+ JJChar ch = str[i];
switch (ch)
{
case '\b':
@@ -115,4 +115,4 @@ JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str) {
}
}
-/* JavaCC - OriginalChecksum=72f292bc267bd0602e63291bf864f942 (do not edit this line) */
+/* JavaCC - OriginalChecksum=ed66d80b94c73435ce2644e44f7b4d49 (do not edit this line) */
diff --git a/vhdlparser/TokenMgrError.h b/vhdlparser/TokenMgrError.h
index abb305d..90c7530 100644
--- a/vhdlparser/TokenMgrError.h
+++ b/vhdlparser/TokenMgrError.h
@@ -1,7 +1,8 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.h Version 6.2 */
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.h Version 7.0 */
/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
-#ifndef _TOKENMGRERROR_H
-#define _TOKENMGRERROR_H
+#ifndef JAVACC_TOKENMGRERROR_H
+#define JAVACC_TOKENMGRERROR_H
+
#include "JavaCC.h"
@@ -54,10 +55,10 @@ public:
* curchar : the offending character
* Note: You can customize the lexical error message by modifying this method.
*/
- JAVACC_STRING_TYPE LexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar);
+ JJString LexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, const JJString& errorAfter, JJChar curChar);
private:
- JAVACC_STRING_TYPE message;
+ JJString message;
/**
* You can also modify the body of this method to customize your error messages.
@@ -69,7 +70,7 @@ private:
* from this method for such cases in the release version of your parser.
*/
public:
- JAVACC_STRING_TYPE getMessage() ;
+ JJString getMessage() ;
/*
* Constructors of various flavors follow.
@@ -79,13 +80,14 @@ public:
TokenMgrError() ;
/** Constructor with message and reason. */
- TokenMgrError(JAVACC_STRING_TYPE message, int reason) ;
+ TokenMgrError(const JJString& message, int reason) ;
/** Full Constructor. */
- TokenMgrError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, int reason) ;
+ TokenMgrError(bool EOFSeen, int lexState, int errorLine, int errorColumn, const JJString& errorAfter, JJChar curChar, int reason) ;
};
}
}
+
#endif
-/* JavaCC - OriginalChecksum=c22a1b25630ec91deb47dcba22b6b39d (do not edit this line) */
+/* JavaCC - OriginalChecksum=4ab4cdcdef6a3feec22fd9c00ba86e07 (do not edit this line) */
diff --git a/vhdlparser/VhdlParser.cc b/vhdlparser/VhdlParser.cc
index 49e9bd9..e039b33 100644
--- a/vhdlparser/VhdlParser.cc
+++ b/vhdlparser/VhdlParser.cc
@@ -4,17 +4,17 @@
namespace vhdl {
namespace parser {
unsigned int jj_la1_0[] = {
-0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x0,0x90404000,0x20080000,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x90004000,0x400000,0x0,0x90404000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20080000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x40000000,0x0,0x400000,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x40020000,0x40020001,0x0,0x0,0x0,0x40000000,0xd0020000,0x0,0x0,0x800000,0x0,0x0,0x80004000,0x400000,0x0,0x0,0x80404000,0x0,0x0,0x0,0x0,0x8000,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x10000,0x0,0x800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x10000000,0x0,0x50000000,0x8000,0x0,0x80000000,0x0,0x80000000,0x80000000,0x4000000,0x8000000,0x0,0x0,0x20000,0x0,0x0,0x0,0x0,0x800,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,0x0,0x80004000,0x0,0x80004000,0x0,0x0,0x0,0x0,0x90004000,0x400000,0x0,0x0,0x90404000,0x0,0x0,0x0,0x40000000,0x0,0x0,0x80004000,0x400000,0x0,0x80404000,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x20080000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x0,0x20000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x8000000,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80004000,0x400000,0x0,0x80404000,0x0,0x0,0x0,0x0,0x0,0x0,0x20080000,0x8000,0x0,0x0,0x41000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x2000,0x0,0x80004000,0x400000,0x0,0x80404000,0x0,0x400000,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x90c04000,0x20080000,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x0,0x90404000,0x20080000,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x90004000,0x400000,0x0,0x90404000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20080000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x40000000,0x0,0x400000,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x40020000,0x40020001,0x0,0x0,0x0,0x40000000,0xd0020000,0x0,0x0,0x800000,0x0,0x0,0x80004000,0x400000,0x0,0x0,0x80404000,0x0,0x0,0x0,0x0,0x8000,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x10000,0x0,0x10800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10800,0x10000000,0x0,0x50000000,0x8000,0x80000000,0x0,0x80000000,0x80000000,0x4000000,0x8000000,0x0,0x0,0x20000,0x0,0x0,0x0,0x0,0x800,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,0x0,0x80004000,0x0,0x80004000,0x0,0x0,0x0,0x0,0x0,0x0,0x90004000,0x400000,0x0,0x0,0x90404000,0x0,0x0,0x0,0x40000000,0x0,0x0,0x80004000,0x400000,0x0,0x80404000,0x0,0x0,0x0,0x0,0x0,0x0,0x20080000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10800,0x0,0x0,0x20000,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x8000000,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80004000,0x400000,0x0,0x80404000,0x0,0x0,0x0,0x0,0x0,0x0,0x20080000,0x0,0x8000,0x0,0x0,0x41000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10800,0x2000,0x0,0x80004000,0x400000,0x0,0x80404000,0x0,0x400000,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x90c04000,0x20080000,0x0,0x0,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
unsigned int jj_la1_1[] = {
-0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x125808,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x0,0x0,0x1000,0x104800,0x1008,0x20000,0x125808,0x10000,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x1000,0x1000000,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x20000,0x1000,0x0,0x4000000,0x4000000,0x0,0x400000,0x4000101,0x4000101,0x0,0x10,0x0,0x100,0x12024900,0x0,0x0,0x0,0x100,0x0,0x104800,0x8,0x20000,0x0,0x124808,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x0,0x0,0x81000,0x0,0x0,0x0,0x0,0x0,0x40,0x20,0x0,0x0,0x0,0x0,0x0,0x100,0x0,0x0,0x800,0x0,0x0,0x0,0x8a00000,0x0,0x0,0x1000,0x1,0x0,0x0,0x1000,0x0,0x0,0x8a00000,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x40000,0x400000,0x0,0x0,0x104800,0x20000,0x124800,0x0,0x0,0x10000,0x10000,0x104800,0x8,0x20000,0x0,0x124808,0x0,0x0,0x0,0x100,0x0,0x0,0x104800,0x0,0x20000,0x124800,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x20081200,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000,0x0,0x104000,0x1000000,0x1104800,0x0,0x20000,0x1124800,0x4000,0x0,0x100000,0x100000,0x0,0x104000,0x20081200,0x0,0x0,0x0,0x800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x0,0x0,0x0,0x0,0x1104800,0x0,0x20000,0x1124800,0x0,0x104000,0x104000,0x4000001,0x1,0x0,0x4000001,0x10000,0x10000,0x10000,0x0,0x0,0x125808,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x400000,0x20,0x0,0x200000,0x0,0x0,0x0,0x0,0x0,0x400000,0x0,0x200000,0x0,0x0,0x0,0x200000,0x0,0x20,0x104000,0x100000,0x100000,0x0,0x1000000,0x0,0x0,0x104000,};
+0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x125808,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x0,0x0,0x1000,0x104800,0x1008,0x20000,0x125808,0x10000,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x1000,0x1000000,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x20000,0x1000,0x0,0x4000000,0x1,0x0,0x400000,0x4000101,0x4000101,0x0,0x10,0x0,0x100,0x12024900,0x0,0x0,0x0,0x100,0x0,0x104800,0x8,0x20000,0x0,0x124808,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x200000,0x0,0x0,0x0,0x81000,0x0,0x0,0x0,0x0,0x0,0x40,0x20,0x0,0x0,0x0,0x0,0x0,0x100,0x0,0x800,0x0,0x0,0x0,0x8a00000,0x0,0x0,0x1000,0x0,0x0,0x0,0x1000,0x0,0x0,0x8a00000,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x40000,0x400000,0x0,0x0,0x104800,0x20000,0x124800,0x10000,0x10000,0x0,0x0,0x10000,0x10000,0x104800,0x8,0x20000,0x0,0x124808,0x0,0x0,0x0,0x100,0x1,0x0,0x104800,0x0,0x20000,0x124800,0x0,0x0,0x0,0x1000000,0x0,0x0,0x20081200,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000,0x0,0x104000,0x1000000,0x1104800,0x0,0x20000,0x1124800,0x4000,0x0,0x100000,0x100000,0x0,0x104000,0x20081200,0x0,0x0,0x0,0x0,0x800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x0,0x0,0x0,0x0,0x1104800,0x0,0x20000,0x1124800,0x0,0x104000,0x104000,0x0,0x4000001,0x1,0x0,0x4000001,0x10000,0x10000,0x10000,0x0,0x0,0x125808,0x0,0x20,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x400000,0x20,0x0,0x200000,0x0,0x0,0x0,0x0,0x0,0x400000,0x0,0x200000,0x0,0x0,0x0,0x200000,0x0,0x20,0x104000,0x100000,0x100000,0x0,0x1000000,0x0,0x0,0x104000,};
unsigned int jj_la1_2[] = {
-0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x110000,0x28000,0x0,0x20000000,0x0,0x0,0x0,0x200000,0x0,0x0,0x0,0x4000,0x0,0x0,0x110000,0x0,0x0,0x110000,0x0,0x4000,0x4000,0x0,0x0,0x0,0x0,0x28000,0x0,0x0,0x0,0x400,0x0,0x4000,0x0,0x0,0x0,0x4000,0x0,0x4000,0x400000,0x8000,0x8000,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x1000000,0x1000,0x1000,0x0,0x0,0x0,0x100,0x11000,0x0,0x0,0x0,0x0,0x0,0x110000,0x0,0x0,0x1000,0x111000,0x0,0x0,0x4000,0x0,0x400,0x8000,0x28000,0x0,0x0,0x0,0x0,0x0,0x0,0x209,0x209,0x0,0x32,0x100,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x32,0x0,0x0,0x0,0x400,0x1000,0x0,0x0,0x0,0x0,0x800,0x0,0x0,0x0,0x1000,0x20,0x0,0x0,0x0,0x10,0x800,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x1000,0x0,0x110000,0x0,0x110000,0x1000,0x0,0x0,0x0,0x110000,0x0,0x0,0x1000,0x111000,0x0,0x0,0x2,0x0,0x1000,0x0,0x110000,0x0,0x0,0x110000,0x0,0x8000,0x0,0x0,0x0,0x8000,0x0,0x20000024,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x32,0x200000,0x1000,0x0,0x0,0x20,0xc0000000,0xc0000000,0x0,0x1000000,0x0,0x800000,0x0,0x800000,0x0,0x400,0x0,0x0,0x0,0x0,0x10000,0x0,0x110000,0x0,0x110000,0x0,0x0,0x110000,0x10000,0x0,0x100000,0x100000,0x0,0x110000,0x20000024,0x0,0x0,0x0,0x600000,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x32,0x0,0x0,0x110000,0x0,0x0,0x110000,0x0,0x110000,0x110000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x110000,0x28000,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x800,0x32,0x0,0x0,0x0,0x0,0x1000000,0x0,0x800,0x0,0x0,0x0,0x800,0x0,0x0,0x110000,0x100000,0x100000,0x0,0x0,0x2000,0x0,0x138000,};
+0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x110000,0x28000,0x0,0x20000000,0x0,0x0,0x0,0x200000,0x200000,0x0,0x0,0x0,0x4000,0x0,0x0,0x110000,0x0,0x0,0x110000,0x0,0x4000,0x4000,0x0,0x0,0x0,0x0,0x28000,0x0,0x0,0x0,0x0,0x400,0x0,0x4000,0x0,0x0,0x0,0x4000,0x0,0x4000,0x400000,0x8000,0x8000,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x1000000,0x1000,0x1000,0x0,0x0,0x0,0x100,0x11000,0x0,0x0,0x0,0x0,0x0,0x110000,0x0,0x0,0x1000,0x111000,0x0,0x0,0x4000,0x0,0x400,0x8000,0x28000,0x0,0x0,0x0,0x0,0x0,0x0,0x209,0x209,0x0,0x23b,0x100,0x100,0x800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23b,0x0,0x0,0x0,0x400,0x0,0x0,0x0,0x0,0x800,0x0,0x0,0x0,0x1000,0x20,0x0,0x0,0x0,0x10,0x800,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x1000,0x0,0x110000,0x0,0x110000,0x0,0x0,0x1000,0x0,0x0,0x0,0x110000,0x0,0x0,0x1000,0x111000,0x0,0x0,0x0,0x0,0x1000,0x0,0x110000,0x0,0x0,0x110000,0x0,0x8000,0x0,0x0,0x8000,0x0,0x20000024,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23b,0x0,0x200000,0x1000,0x0,0x0,0x0,0x20,0xc0000000,0xc0000000,0x0,0x1000000,0x0,0x800000,0x0,0x800000,0x0,0x400,0x0,0x0,0x0,0x0,0x10000,0x0,0x110000,0x0,0x110000,0x0,0x0,0x110000,0x10000,0x0,0x100000,0x100000,0x0,0x110000,0x20000024,0x0,0x0,0x0,0x0,0x600000,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x23b,0x0,0x0,0x110000,0x0,0x0,0x110000,0x0,0x110000,0x110000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x110000,0x28000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x800,0x23b,0x0,0x0,0x0,0x0,0x1000000,0x0,0x800,0x0,0x0,0x0,0x800,0x0,0x0,0x110000,0x100000,0x100000,0x0,0x0,0x2000,0x0,0x138000,};
unsigned int jj_la1_3[] = {
-0x0,0x0,0x0,0x40000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x188830,0x8000000,0x0,0x0,0x8,0x0,0x0,0x0,0x0,0x80000,0x0,0x0,0x80000,0x0,0x108830,0x80000,0x0,0x188830,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x2000000,0x0,0x0,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x0,0x2000000,0x0,0x0,0x80000,0x80000,0x0,0x0,0x80000,0x80000,0x0,0x4000,0x80000,0x80000,0x0,0x2000,0x0,0x0,0x128810,0x0,0x0,0x0,0x0,0x0,0x108830,0x80000,0x0,0x0,0x188830,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x30000000,0x30000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x108030,0x0,0x100030,0x100030,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x0,0x0,0x108030,0x0,0x4000,0x0,0x0,0x188820,0x0,0x188820,0x0,0x0,0x0,0x0,0x108830,0x80000,0x0,0x0,0x188830,0x0,0x0,0x0,0x0,0x0,0x0,0x108820,0x80000,0x0,0x188820,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xd000001,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3c0,0x3c0,0x0,0x4000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x108820,0x80000,0x0,0x188820,0x0,0x0,0x0,0x0,0x0,0x0,0xd000001,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x8000000,0x20,0x0,0x0,0x0,0x40000,0x0,0x0,0x10000,0x0,0x0,0x108820,0x80000,0x0,0x188820,0x0,0x80000,0x80000,0x80000,0x0,0x0,0x80000,0x0,0x0,0x0,0x2000000,0x0,0x188830,0x8000000,0x100010,0x0,0x0,0x0,0x0,0x0,0x4000,0x0,0x2000000,0x0,0x0,0x8000000,0x0,0x0,0x0,0x4000,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+0x0,0x0,0x0,0x0,0x40000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x188830,0x8000000,0x0,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x80000,0x0,0x0,0x80000,0x0,0x108830,0x80000,0x0,0x188830,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x0,0x2000000,0x0,0x0,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x0,0x2000000,0x0,0x0,0x80000,0x80000,0x0,0x0,0x80000,0x0,0x0,0x4000,0x80000,0x80000,0x0,0x2000,0x0,0x0,0x128810,0x0,0x0,0x0,0x0,0x0,0x108830,0x80000,0x0,0x0,0x188830,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x30000000,0x30000000,0x0,0x30000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x30000000,0x0,0x0,0x0,0x0,0x108030,0x0,0x100030,0x100030,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x0,0x0,0x108030,0x0,0x4000,0x0,0x0,0x188820,0x0,0x188820,0x0,0x0,0x0,0x0,0x0,0x0,0x108830,0x80000,0x0,0x0,0x188830,0x0,0x0,0x0,0x0,0x0,0x0,0x108820,0x80000,0x0,0x188820,0x0,0x0,0x0,0x0,0x0,0x0,0xd000001,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x30000000,0x20000,0x0,0x0,0x0,0x0,0x0,0x0,0x3c0,0x3c0,0x0,0x4000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x108820,0x80000,0x0,0x188820,0x0,0x0,0x0,0x0,0x0,0x0,0xd000001,0x0,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x8000000,0x20,0x0,0x0,0x0,0x40000,0x0,0x0,0x30010000,0x0,0x0,0x108820,0x80000,0x0,0x188820,0x0,0x80000,0x80000,0x0,0x80000,0x0,0x0,0x80000,0x0,0x0,0x0,0x2000000,0x0,0x188830,0x8000000,0x0,0x0,0x100010,0x0,0x0,0x0,0x0,0x0,0x4000,0x0,0x2000000,0x0,0x30000000,0x8000000,0x0,0x0,0x0,0x4000,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
unsigned int jj_la1_4[] = {
-0x0,0x0,0x60000,0x30,0x40,0x100,0x0,0x0,0x0,0x0,0x40000,0x0,0x40001,0x0,0x0,0x0,0x0,0x40,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x40001,0x0,0x0,0x0,0x0,0x10000000,0x200,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x20000,0x40,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x40000,0x40000,0x40000,0x40000,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x4,0x40001,0x0,0x0,0x40000,0x1,0x0,0x0,0x40000,0x40,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x40031,0x0,0x1,0x0,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x40000008,0x40000,0x40,0x1,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x1,0x0,0x0,0x0,0x40001,0x1,0x0,0x40000,0xfc00,0xfc00,0x0,0x0,0x0,0x40031,0x1,0x0,0x40,0x40,0x0,0x0,0x0,0x30,0x0,0x40001,0x0,0x80,0x0,0x40,0x40000,0x40,0x40000,0x0,0x30,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1,0x0,0x40001,0x0,0x40001,0x0,0x1,0x0,0x40,0x40,0x40001,0x0,0x80,0x0,0x0,0x0,0x0,0x40,0x40031,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40001,0x0,0xa0000000,0x20000000,0x0,0x1,0x40001,0x0,0x0,0x0,0x0,0x40031,0x0,0x8000000,0x40000,0x8000000,0x0,0x8000000,0x0,0x240,0x240,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x0,0x0,0x1,0x0,};
+0x0,0x0,0x0,0x20000,0x30,0x40,0x100,0x0,0x0,0x0,0x0,0x40000,0x0,0x40001,0x0,0x0,0x0,0x0,0x40,0x0,0x40000,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x40001,0x8000000,0x0,0x0,0x0,0x0,0x10000000,0x200,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x20000,0x40,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x40000,0x40000,0x40000,0x40000,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x4,0x140001,0x0,0x0,0x0,0x40000,0x1,0x0,0x0,0x40000,0x40,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x140031,0x0,0x1,0x0,0x40000,0x0,0x200,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x40000008,0x40000,0x40,0x1,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x40001,0x1,0x40000,0x40000,0x7e0fc00,0x7e0fc00,0x0,0x0,0x0,0x140031,0x0,0x0,0x0,0x40,0x40,0x40000,0x0,0x0,0x0,0x30,0x0,0x40001,0x0,0x80,0x0,0x40,0x40000,0x40,0x40000,0x0,0x30,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1,0x0,0x40001,0x40000,0x0,0x40001,0x0,0x1,0x0,0x40,0x40,0x40001,0x0,0x80,0x0,0x0,0x0,0x0,0x40,0x140031,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40001,0x0,0x0,0x0,0xa0000000,0x20000000,0x0,0x1,0x40001,0x0,0x0,0x0,0x0,0x140031,0x0,0x8000000,0x40000,0x8000000,0x0,0x8000000,0x0,0x240,0x240,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x0,0x0,0x1,0x0,};
unsigned int jj_la1_5[] = {
-0x1420,0x0,0x1c0,0x0,0x0,0x0,0x2,0x3c0,0x0,0x0,0x1c0,0x0,0x200001c0,0x0,0x0,0x0,0x180,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x200001c0,0x180,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x20000000,0x20000000,0x2,0x0,0x0,0x3c0,0x3c0,0x1c0,0x1c0,0x3c0,0x380,0x0,0x180,0x180,0x0,0x0,0x0,0x0,0x1017e0,0x0,0x0,0x1e0,0x0,0x180,0x0,0x3c0,0x0,0x180,0x0,0x180,0x0,0x0,0x180,0x0,0x1017e0,0x0,0x0,0x180,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x180,0x0,0x180,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x180,0x180,0x0,0x180,0x1420,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x1c0,0x0,0x0,0x0,0x180,0x1c0,0x0,0x180,0x1c0,0x0,0x0,0x180,0x0,0x180,0x1017e0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x1c0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x240,0x1c0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x1017e0,0x0,0x180,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x200001c0,0x0,0x1,0x0,0x1,0x0,0x1c0,0x0,0x0,0x0,0x0,0x1017e0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x180,};
+0x1420,0x0,0x180,0x0,0x0,0x0,0x0,0x2,0x3c0,0x0,0x0,0x1c0,0x0,0x200001c0,0x0,0x0,0x0,0x180,0x0,0x180,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x200001c0,0x0,0x180,0x0,0x180,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x20000000,0x20000000,0x2,0x0,0x0,0x0,0x3c0,0x1c0,0x1c0,0x3c0,0x380,0x0,0x180,0x180,0x0,0x0,0x0,0x0,0x1017e0,0x0,0x0,0x0,0x1e0,0x0,0x180,0x0,0x3c0,0x0,0x180,0x0,0x180,0x0,0x0,0x180,0x0,0x1017e0,0x0,0x0,0x180,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x180,0x0,0x180,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x180,0x180,0x0,0x180,0x1420,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x180,0x1c0,0x0,0x1c0,0x1c0,0x0,0x0,0x180,0x0,0x180,0x1017e0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x180,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x1c0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x1c0,0x240,0x1c0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x1017e0,0x0,0x180,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x200001c0,0x0,0x0,0x0,0x1,0x0,0x1,0x0,0x1c0,0x0,0x0,0x0,0x0,0x1017e0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x180,};
/** Constructor with user supplied TokenManager. */
@@ -23,37 +23,31 @@ namespace parser {
QCString VhdlParser::abstract_literal() {Token *tok;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case DECIMAL_LITERAL:{if (!hasError) {
-
+ case DECIMAL_LITERAL:{
+ if (!hasError) {
tok = jj_consume_token(DECIMAL_LITERAL);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
- case INTEGER:{if (!hasError) {
-
+ case INTEGER:{
+ if (!hasError) {
tok = jj_consume_token(INTEGER);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
- case BASED_LITERAL:{if (!hasError) {
-
+ case BASED_LITERAL:{
+ if (!hasError) {
tok = jj_consume_token(BASED_LITERAL);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
default:
@@ -65,15 +59,13 @@ assert(false);
}
-QCString VhdlParser::access_type_definition() {Token *tok=0;QCString str,str1;if (!hasError) {
-
+QCString VhdlParser::access_type_definition() {Token *tok=0;QCString str,str1;
+ if (!hasError) {
tok = jj_consume_token(ACCESS_T);
}
if (!hasError) {
-
str1 = subtype_indication();
}
-
str=tok->image.c_str(); return str+str1;
assert(false);
}
@@ -81,109 +73,97 @@ assert(false);
QCString VhdlParser::actual_designator() {QCString str;Token *t=0;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case OPEN_T:{if (!hasError) {
-
+ case OPEN_T:{
+ if (!hasError) {
t = jj_consume_token(OPEN_T);
}
if (!hasError) {
-
return t->image.c_str();
}
-
break;
}
default:
jj_la1[1] = jj_gen;
- if (jj_2_1(2147483647)) {if (!hasError) {
-
+ if (jj_2_1(2147483647)) {
+ if (!hasError) {
str = expression();
}
if (!hasError) {
-
return str;
}
-
- } else if (jj_2_2(2147483647)) {if (!hasError) {
-
- str = name();
- }
- if (!hasError) {
-
+ } else {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case BASIC_IDENTIFIER:
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
+ str = identifier();
+ }
+ if (!hasError) {
return str;
+ }
+ break;
+ }
+ default:
+ jj_la1[2] = jj_gen;
+ jj_consume_token(-1);
+ errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
-
- } else {
- jj_consume_token(-1);
- errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
assert(false);
}
-QCString VhdlParser::actual_parameter_part() {QCString s;if (!hasError) {
-
+QCString VhdlParser::actual_parameter_part() {QCString s;
+ if (!hasError) {
s = association_list();
}
-
return s;
assert(false);
}
QCString VhdlParser::actual_part() {QCString s,s1;
- if (jj_2_3(2147483647)) {if (!hasError) {
-
+ if (jj_2_2(2147483647)) {
+ if (!hasError) {
s = actual_designator();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case BOX_T:{if (!hasError) {
-
+ case BOX_T:{
+ if (!hasError) {
jj_consume_token(BOX_T);
}
if (!hasError) {
-
return "<>";
}
-
break;
}
- case SLSL_T:
- case STRINGLITERAL:
- case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
- s = name();
- }
- if (!hasError) {
-
- jj_consume_token(LPAREN_T);
- }
- if (!hasError) {
-
- s1 = actual_designator();
- }
- if (!hasError) {
-
- jj_consume_token(RPAREN_T);
- }
- if (!hasError) {
-
+ default:
+ jj_la1[3] = jj_gen;
+ if (jj_2_3(2147483647)) {
+ if (!hasError) {
+ s = name();
+ }
+ if (!hasError) {
+ jj_consume_token(LPAREN_T);
+ }
+ if (!hasError) {
+ s1 = actual_designator();
+ }
+ if (!hasError) {
+ jj_consume_token(RPAREN_T);
+ }
+ if (!hasError) {
s+="(";s+=s1+")";return s;
+ }
+ } else {
+ jj_consume_token(-1);
+ errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
-
- break;
- }
- default:
- jj_la1[2] = jj_gen;
- jj_consume_token(-1);
- errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
assert(false);
@@ -192,41 +172,35 @@ assert(false);
QCString VhdlParser::adding_operator() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PLUS_T:{if (!hasError) {
-
+ case PLUS_T:{
+ if (!hasError) {
jj_consume_token(PLUS_T);
}
if (!hasError) {
-
return "+";
}
-
break;
}
- case MINUS_T:{if (!hasError) {
-
+ case MINUS_T:{
+ if (!hasError) {
jj_consume_token(MINUS_T);
}
if (!hasError) {
-
return "-";
}
-
break;
}
- case AMPERSAND_T:{if (!hasError) {
-
+ case AMPERSAND_T:{
+ if (!hasError) {
jj_consume_token(AMPERSAND_T);
}
if (!hasError) {
-
return "&";
}
-
break;
}
default:
- jj_la1[3] = jj_gen;
+ jj_la1[4] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -234,16 +208,14 @@ assert(false);
}
-QCString VhdlParser::aggregate() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::aggregate() {QCString s,s1,s2;
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s = element_association();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -251,109 +223,89 @@ QCString VhdlParser::aggregate() {QCString s,s1,s2;if (!hasError) {
break;
}
default:
- jj_la1[4] = jj_gen;
+ jj_la1[5] = jj_gen;
goto end_label_1;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = element_association();
}
if (!hasError) {
-
s+=","+s1;
}
-
}
end_label_1: ;
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
return "("+s+")";
assert(false);
}
-QCString VhdlParser::alias_declaration() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::alias_declaration() {QCString s,s1,s2;
+ if (!hasError) {
jj_consume_token(ALIAS_T);
}
if (!hasError) {
-
s2 = alias_designator();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case COLON_T:{if (!hasError) {
-
+ case COLON_T:{
+ if (!hasError) {
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s+=":";
}
if (!hasError) {
-
s1 = subtype_indication();
}
if (!hasError) {
-
s+=s1;
}
-
break;
}
default:
- jj_la1[5] = jj_gen;
+ jj_la1[6] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
s+=" is ";
}
if (!hasError) {
-
s1 = name();
}
if (!hasError) {
-
s+=s1;
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LBRACKET_T:{if (!hasError) {
-
+ case LBRACKET_T:{
+ if (!hasError) {
s1 = signature();
}
if (!hasError) {
-
s+=s1;
}
-
break;
}
default:
- jj_la1[6] = jj_gen;
+ jj_la1[7] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
outlineParser()->addVhdlType(s2.data(),outlineParser()->getLine(ALIAS_T),Entry::VARIABLE_SEC,VhdlDocGen::ALIAS,0,s.data(),Public);
return s2+" "+s+";";
@@ -364,41 +316,35 @@ assert(false);
QCString VhdlParser::alias_designator() {Token *tok=0;QCString s;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case CHARACTER_LITERAL:{if (!hasError) {
-
+ case CHARACTER_LITERAL:{
+ if (!hasError) {
tok = jj_consume_token(CHARACTER_LITERAL);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
- case STRINGLITERAL:{if (!hasError) {
-
+ case STRINGLITERAL:{
+ if (!hasError) {
s = operator_symbol();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[7] = jj_gen;
+ jj_la1[8] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -407,30 +353,26 @@ assert(false);
void VhdlParser::allocator() {
- if (jj_2_4(3)) {if (!hasError) {
-
+ if (jj_2_4(3)) {
+ if (!hasError) {
jj_consume_token(NEW_T);
}
if (!hasError) {
-
qualified_expression();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case NEW_T:{if (!hasError) {
-
+ case NEW_T:{
+ if (!hasError) {
jj_consume_token(NEW_T);
}
if (!hasError) {
-
subtype_indication();
}
-
break;
}
default:
- jj_la1[8] = jj_gen;
+ jj_la1[9] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -438,28 +380,23 @@ void VhdlParser::allocator() {
}
-void VhdlParser::architecture_body() {QCString s,s1;if (!hasError) {
-
+void VhdlParser::architecture_body() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(ARCHITECTURE_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(OF_T);
}
if (!hasError) {
-
s1 = name();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
QCString t=s1+"::"+s;
m_sharedState->genLabels.resize(0);
outlineParser()->pushLabel(m_sharedState->genLabels,s1);
@@ -467,72 +404,61 @@ QCString t=s1+"::"+s;
outlineParser()->addVhdlType(t,outlineParser()->getLine(ARCHITECTURE_T),Entry::CLASS_SEC,VhdlDocGen::ARCHITECTURE,0,0,Private);
}
if (!hasError) {
-
- try {if (!hasError) {
-
+ try {
+ if (!hasError) {
architecture_declarative_part();
}
-
} catch ( ...) {
outlineParser()->error_skipto(BEGIN_T);
}
}
if (!hasError) {
-
jj_consume_token(BEGIN_T);
}
if (!hasError) {
-
architecture_statement_part();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ARCHITECTURE_T:{if (!hasError) {
-
+ case ARCHITECTURE_T:{
+ if (!hasError) {
jj_consume_token(ARCHITECTURE_T);
}
-
break;
}
default:
- jj_la1[9] = jj_gen;
+ jj_la1[10] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
name();
}
-
break;
}
default:
- jj_la1[10] = jj_gen;
+ jj_la1[11] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->lastEntity=0;m_sharedState->lastCompound=0; m_sharedState->genLabels.resize(0);
}
-void VhdlParser::architecture_declarative_part() {if (!hasError) {
-
+void VhdlParser::architecture_declarative_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ALIAS_T:
@@ -557,22 +483,20 @@ void VhdlParser::architecture_declarative_part() {if (!hasError) {
break;
}
default:
- jj_la1[11] = jj_gen;
+ jj_la1[12] = jj_gen;
goto end_label_2;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
block_declarative_item();
}
-
}
end_label_2: ;
}
-
}
-void VhdlParser::architecture_statement_part() {if (!hasError) {
-
+void VhdlParser::architecture_statement_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ASSERT_T:
@@ -590,45 +514,39 @@ void VhdlParser::architecture_statement_part() {if (!hasError) {
break;
}
default:
- jj_la1[12] = jj_gen;
+ jj_la1[13] = jj_gen;
goto end_label_3;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
concurrent_statement();
}
-
}
end_label_3: ;
}
-
}
QCString VhdlParser::array_type_definition() {QCString s;
- if (jj_2_5(2147483647)) {if (!hasError) {
-
- s = unconstraint_array_definition();
+ if (jj_2_5(2147483647)) {
+ if (!hasError) {
+ s = constraint_array_definition();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ARRAY_T:{if (!hasError) {
-
- s = constraint_array_definition();
+ case ARRAY_T:{
+ if (!hasError) {
+ s = unconstraint_array_definition();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[13] = jj_gen;
+ jj_la1[14] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -637,53 +555,45 @@ assert(false);
}
-QCString VhdlParser::assertion() {QCString s,s1,s2;Token *t=0;Token *t1=0;if (!hasError) {
-
+QCString VhdlParser::assertion() {QCString s,s1,s2;Token *t=0;Token *t1=0;
+ if (!hasError) {
jj_consume_token(ASSERT_T);
}
if (!hasError) {
-
s = condition();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case REPORT_T:{if (!hasError) {
-
+ case REPORT_T:{
+ if (!hasError) {
t = jj_consume_token(REPORT_T);
}
if (!hasError) {
-
s1 = expression();
}
-
break;
}
default:
- jj_la1[14] = jj_gen;
+ jj_la1[15] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case SEVERITY_T:{if (!hasError) {
-
+ case SEVERITY_T:{
+ if (!hasError) {
t1 = jj_consume_token(SEVERITY_T);
}
if (!hasError) {
-
s2 = expression();
}
-
break;
}
default:
- jj_la1[15] = jj_gen;
+ jj_la1[16] = jj_gen;
;
}
}
-
s.prepend("assert ");
if(t) s1.prepend(" report ");
if(t1) s2.prepend(" report ");
@@ -692,72 +602,62 @@ assert(false);
}
-QCString VhdlParser::assertion_statement() {QCString s,s1,s2;Token *t=0;if (!hasError) {
-
+QCString VhdlParser::assertion_statement() {QCString s,s1,s2;Token *t=0;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = label();
}
if (!hasError) {
-
t = jj_consume_token(COLON_T);
}
-
break;
}
default:
- jj_la1[16] = jj_gen;
+ jj_la1[17] = jj_gen;
;
}
}
if (!hasError) {
-
s1 = assertion();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
if(t) s+=":";
return s+s1+";";
assert(false);
}
-QCString VhdlParser::association_element() {QCString s,s1;if (!hasError) {
-
- if (jj_2_6(2147483647)) {if (!hasError) {
-
+QCString VhdlParser::association_element() {QCString s,s1;
+ if (!hasError) {
+ if (jj_2_6(2147483647)) {
+ if (!hasError) {
s = formal_part();
}
if (!hasError) {
-
jj_consume_token(ARROW_T);
}
-
} else {
;
}
}
if (!hasError) {
-
s1 = actual_part();
}
-
return s+" => "+s1;
assert(false);
}
-QCString VhdlParser::association_list() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::association_list() {QCString s,s1;
+ if (!hasError) {
s = association_element();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -765,51 +665,42 @@ QCString VhdlParser::association_list() {QCString s,s1;if (!hasError) {
break;
}
default:
- jj_la1[17] = jj_gen;
+ jj_la1[18] = jj_gen;
goto end_label_4;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = association_element();
}
if (!hasError) {
-
s+=","+s1;
}
-
}
end_label_4: ;
}
-
return s;
assert(false);
}
-QCString VhdlParser::attribute_declaration() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::attribute_declaration() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(ATTRIBUTE_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s1 = type_mark();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(ATTRIBUTE_T),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,s1.data(),Public);
return " attribute "+s+":"+s1+";";
assert(false);
@@ -819,30 +710,26 @@ assert(false);
QCString VhdlParser::attribute_designator() {QCString s;Token *tok=0;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case RANGE_T:{if (!hasError) {
-
+ case RANGE_T:{
+ if (!hasError) {
tok = jj_consume_token(RANGE_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
default:
- jj_la1[18] = jj_gen;
+ jj_la1[19] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -850,84 +737,88 @@ assert(false);
}
-QCString VhdlParser::attribute_name() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::attribute_name() {QCString s,s1;
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(APOSTROPHE_T);
}
if (!hasError) {
-
- s1 = name();
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case RANGE_T:{
+ if (!hasError) {
+ jj_consume_token(RANGE_T);
+ }
+ break;
+ }
+ case SLSL_T:
+ case STRINGLITERAL:
+ case BASIC_IDENTIFIER:
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
+ s1 = name();
+ }
+ break;
+ }
+ default:
+ jj_la1[20] = jj_gen;
+ jj_consume_token(-1);
+ errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
+ }
}
if (!hasError) {
-
-s+="'"+s1;
+s+=s1;
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
-s+"("+s1+")";
+s+=s1;
}
-
break;
}
default:
- jj_la1[19] = jj_gen;
+ jj_la1[21] = jj_gen;
;
}
}
-
return s;
assert(false);
}
-QCString VhdlParser::attribute_specification() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::attribute_specification() {QCString s,s1,s2;
+ if (!hasError) {
jj_consume_token(ATTRIBUTE_T);
}
if (!hasError) {
-
s = attribute_designator();
}
if (!hasError) {
-
jj_consume_token(OF_T);
}
if (!hasError) {
-
s1 = entity_specification();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
s2 = expression();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
QCString t= s1+" is "+s2;
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(ATTRIBUTE_T),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,t.data(),Public);
return " attribute "+s+" of "+s1+ " is "+s2+";";
@@ -935,149 +826,132 @@ assert(false);
}
-QCString VhdlParser::base() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::base() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(INTEGER);
}
-
return tok->image.c_str();
assert(false);
}
-QCString VhdlParser::base_specifier() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::base_specifier() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(BASIC_IDENTIFIER);
}
-
return tok->image.c_str();
assert(false);
}
-QCString VhdlParser::base_unit_declaration() {QCString s;if (!hasError) {
-
+QCString VhdlParser::base_unit_declaration() {QCString s;
+ if (!hasError) {
s = identifier();
}
-
return s;
assert(false);
}
-QCString VhdlParser::based_integer() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::based_integer() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(BASIC_IDENTIFIER);
}
-
return tok->image.c_str();
assert(false);
}
-QCString VhdlParser::based_literal() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::based_literal() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(BASED_LITERAL);
}
-
return tok->image.c_str();
assert(false);
}
-QCString VhdlParser::basic_identifier() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::basic_identifier() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(BASIC_IDENTIFIER);
}
-
return tok->image.c_str();
assert(false);
}
-void VhdlParser::binding_indication() {if (!hasError) {
-
+void VhdlParser::binding_indication() {
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
jj_consume_token(USE_T);
}
if (!hasError) {
-
entity_aspect();
}
-
break;
}
default:
- jj_la1[20] = jj_gen;
+ jj_la1[22] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GENERIC_T:{if (!hasError) {
-
+ case GENERIC_T:{
+ if (!hasError) {
generic_map_aspect();
}
-
break;
}
default:
- jj_la1[21] = jj_gen;
+ jj_la1[23] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PORT_T:{if (!hasError) {
-
+ case PORT_T:{
+ if (!hasError) {
port_map_aspect();
}
-
break;
}
default:
- jj_la1[22] = jj_gen;
+ jj_la1[24] = jj_gen;
;
}
}
-
}
-QCString VhdlParser::bit_string_literal() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::bit_string_literal() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(BIT_STRING_LITERAL);
}
-
return tok->image.c_str();
assert(false);
}
-QCString VhdlParser::bit_value() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::bit_value() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(BASIC_IDENTIFIER);
}
-
return tok->image.c_str();
assert(false);
}
-void VhdlParser::block_configuration() {if (!hasError) {
-
+void VhdlParser::block_configuration() {
+ if (!hasError) {
jj_consume_token(FOR_T);
}
if (!hasError) {
-
block_specification();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case USE_T:{
@@ -1085,18 +959,16 @@ void VhdlParser::block_configuration() {if (!hasError) {
break;
}
default:
- jj_la1[23] = jj_gen;
+ jj_la1[25] = jj_gen;
goto end_label_5;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
use_clause();
}
-
}
end_label_5: ;
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case FOR_T:{
@@ -1104,29 +976,24 @@ void VhdlParser::block_configuration() {if (!hasError) {
break;
}
default:
- jj_la1[24] = jj_gen;
+ jj_la1[26] = jj_gen;
goto end_label_6;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
configuration_item();
}
-
}
end_label_6: ;
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(FOR_T);
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
@@ -1135,125 +1002,109 @@ void VhdlParser::block_declarative_item() {
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_declaration();
}
-
break;
}
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
type_declaration();
}
-
break;
}
- case SUBTYPE_T:{if (!hasError) {
-
+ case SUBTYPE_T:{
+ if (!hasError) {
subtype_declaration();
}
-
break;
}
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
constant_declaration();
}
-
break;
}
- case SIGNAL_T:{if (!hasError) {
-
+ case SIGNAL_T:{
+ if (!hasError) {
signal_declaration();
}
-
break;
}
case SHARED_T:
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
variable_declaration();
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
file_declaration();
}
-
break;
}
- case ALIAS_T:{if (!hasError) {
-
+ case ALIAS_T:{
+ if (!hasError) {
alias_declaration();
}
-
break;
}
- case COMPONENT_T:{if (!hasError) {
-
+ case COMPONENT_T:{
+ if (!hasError) {
component_declaration();
}
-
break;
}
default:
- jj_la1[25] = jj_gen;
- if (jj_2_7(2147483647)) {if (!hasError) {
-
+ jj_la1[27] = jj_gen;
+ if (jj_2_7(2147483647)) {
+ if (!hasError) {
attribute_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ATTRIBUTE_T:{if (!hasError) {
-
+ case ATTRIBUTE_T:{
+ if (!hasError) {
attribute_specification();
}
-
break;
}
- case FOR_T:{if (!hasError) {
-
+ case FOR_T:{
+ if (!hasError) {
configuration_specification();
}
-
break;
}
- case DISCONNECT_T:{if (!hasError) {
-
+ case DISCONNECT_T:{
+ if (!hasError) {
disconnection_specification();
}
-
break;
}
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
use_clause();
}
-
break;
}
default:
- jj_la1[26] = jj_gen;
- if (jj_2_8(3)) {if (!hasError) {
-
+ jj_la1[28] = jj_gen;
+ if (jj_2_8(3)) {
+ if (!hasError) {
group_template_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GROUP_T:{if (!hasError) {
-
+ case GROUP_T:{
+ if (!hasError) {
group_declaration();
}
-
break;
}
default:
- jj_la1[27] = jj_gen;
+ jj_la1[29] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -1264,8 +1115,8 @@ void VhdlParser::block_declarative_item() {
}
-void VhdlParser::block_declarative_part() {if (!hasError) {
-
+void VhdlParser::block_declarative_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ALIAS_T:
@@ -1290,224 +1141,188 @@ void VhdlParser::block_declarative_part() {if (!hasError) {
break;
}
default:
- jj_la1[28] = jj_gen;
+ jj_la1[30] = jj_gen;
goto end_label_7;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
block_declarative_item();
}
-
}
end_label_7: ;
}
-
}
-void VhdlParser::block_header() {if (!hasError) {
-
- if (jj_2_9(2147483647)) {if (!hasError) {
-
+void VhdlParser::block_header() {
+ if (!hasError) {
+ if (jj_2_9(2147483647)) {
+ if (!hasError) {
generic_clause();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GENERIC_T:{if (!hasError) {
-
+ case GENERIC_T:{
+ if (!hasError) {
generic_map_aspect();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
break;
}
default:
- jj_la1[29] = jj_gen;
+ jj_la1[31] = jj_gen;
;
}
}
-
} else {
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PORT_T:{if (!hasError) {
-
+ case PORT_T:{
+ if (!hasError) {
port_clause();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PORT_T:{if (!hasError) {
-
+ case PORT_T:{
+ if (!hasError) {
port_map_aspect();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
break;
}
default:
- jj_la1[30] = jj_gen;
+ jj_la1[32] = jj_gen;
;
}
}
-
break;
}
default:
- jj_la1[31] = jj_gen;
+ jj_la1[33] = jj_gen;
;
}
}
-
}
-void VhdlParser::block_specification() {if (!hasError) {
-
+void VhdlParser::block_specification() {
+ if (!hasError) {
name();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
index_specification();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
break;
}
default:
- jj_la1[32] = jj_gen;
+ jj_la1[34] = jj_gen;
;
}
}
-
}
-void VhdlParser::block_statement() {QCString s;if (!hasError) {
-
+void VhdlParser::block_statement() {QCString s;
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
jj_consume_token(BLOCK_T);
}
if (!hasError) {
-
outlineParser()->pushLabel(m_sharedState->genLabels,s);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
break;
}
default:
- jj_la1[33] = jj_gen;
+ jj_la1[35] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case IS_T:{if (!hasError) {
-
+ case IS_T:{
+ if (!hasError) {
jj_consume_token(IS_T);
}
-
break;
}
default:
- jj_la1[34] = jj_gen;
+ jj_la1[36] = jj_gen;
;
}
}
if (!hasError) {
-
block_header();
}
if (!hasError) {
-
block_declarative_part();
}
if (!hasError) {
-
jj_consume_token(BEGIN_T);
}
if (!hasError) {
-
block_statement_part();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(BLOCK_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[35] = jj_gen;
+ jj_la1[37] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->genLabels=outlineParser()->popLabel(m_sharedState->genLabels);
}
-void VhdlParser::block_statement_part() {if (!hasError) {
-
+void VhdlParser::block_statement_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ASSERT_T:
@@ -1525,63 +1340,66 @@ void VhdlParser::block_statement_part() {if (!hasError) {
break;
}
default:
- jj_la1[36] = jj_gen;
+ jj_la1[38] = jj_gen;
goto end_label_8;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
concurrent_statement();
}
-
}
end_label_8: ;
}
-
}
-void VhdlParser::case_statement() {QCString s;if (!hasError) {
-
+void VhdlParser::case_statement() {QCString s;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
if (!hasError) {
-
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case Q_T:{
+ if (!hasError) {
+ jj_consume_token(Q_T);
+ }
+ break;
+ }
+ default:
+ jj_la1[39] = jj_gen;
+ ;
+ }
+ }
+ if (!hasError) {
jj_consume_token(COLON_T);
}
-
break;
}
default:
- jj_la1[37] = jj_gen;
+ jj_la1[40] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(CASE_T);
}
if (!hasError) {
-
s = expression();
}
if (!hasError) {
-
QCString ca="case "+s;
FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca);
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
case_statement_alternative();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case WHEN_T:{
@@ -1589,130 +1407,119 @@ QCString ca="case "+s;
break;
}
default:
- jj_la1[38] = jj_gen;
+ jj_la1[41] = jj_gen;
goto end_label_9;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
case_statement_alternative();
}
-
}
end_label_9: ;
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(CASE_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[39] = jj_gen;
+ jj_la1[42] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
FlowChart::moveToPrevLevel();
FlowChart::addFlowChart(FlowChart::END_CASE,"end case",0);
}
-void VhdlParser::case_statement_alternative() {QCString s;if (!hasError) {
-
+void VhdlParser::case_statement_alternative() {QCString s;
+ if (!hasError) {
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
s = choices();
}
if (!hasError) {
-
jj_consume_token(ARROW_T);
}
if (!hasError) {
-
QCString t="when ";
t+=s+"=> ";
FlowChart::addFlowChart(FlowChart::WHEN_NO,s.data(),t);
}
if (!hasError) {
-
sequence_of_statement();
}
-
FlowChart::moveToPrevLevel();
}
-QCString VhdlParser::character_literal() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::character_literal() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(CHARACTER_LITERAL);
}
-
return tok->image.c_str();
assert(false);
}
QCString VhdlParser::choice() {QCString s;
- if (jj_2_10(2147483647)) {if (!hasError) {
-
- s = discrete_range();
+ if (jj_2_10(2147483647)) {
+ if (!hasError) {
+ s = range();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_11(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_11(2147483647)) {
+ if (!hasError) {
s = simple_expression();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_12(2147483647)) {if (!hasError) {
-
- s = identifier();
+ } else if (jj_2_12(2147483647)) {
+ if (!hasError) {
+ s = discrete_range();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case OTHER_T:{if (!hasError) {
-
+ case BASIC_IDENTIFIER:
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
+ s = identifier();
+ }
+ if (!hasError) {
+return s;
+ }
+ break;
+ }
+ case OTHER_T:{
+ if (!hasError) {
jj_consume_token(OTHER_T);
}
if (!hasError) {
-
return " others ";
}
-
break;
}
default:
- jj_la1[40] = jj_gen;
+ jj_la1[43] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -1721,12 +1528,11 @@ assert(false);
}
-QCString VhdlParser::choices() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::choices() {QCString s,s1;
+ if (!hasError) {
s = choice();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BAR_T:{
@@ -1734,199 +1540,167 @@ QCString VhdlParser::choices() {QCString s,s1;if (!hasError) {
break;
}
default:
- jj_la1[41] = jj_gen;
+ jj_la1[44] = jj_gen;
goto end_label_10;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(BAR_T);
}
if (!hasError) {
-
s1 = choice();
}
if (!hasError) {
-
s+="|";s+=s1;
}
-
}
end_label_10: ;
}
-
return s;
assert(false);
}
-void VhdlParser::component_configuration() {if (!hasError) {
-
+void VhdlParser::component_configuration() {
+ if (!hasError) {
jj_consume_token(FOR_T);
}
if (!hasError) {
-
component_specification();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case GENERIC_T:
case PORT_T:
case USE_T:
- case SEMI_T:{if (!hasError) {
-
+ case SEMI_T:{
+ if (!hasError) {
binding_indication();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
break;
}
default:
- jj_la1[42] = jj_gen;
+ jj_la1[45] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case FOR_T:{if (!hasError) {
-
+ case FOR_T:{
+ if (!hasError) {
block_configuration();
}
-
break;
}
default:
- jj_la1[43] = jj_gen;
+ jj_la1[46] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(FOR_T);
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::component_declaration() {QCString s;if (!hasError) {
-
+void VhdlParser::component_declaration() {QCString s;
+ if (!hasError) {
jj_consume_token(COMPONENT_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case IS_T:{if (!hasError) {
-
+ case IS_T:{
+ if (!hasError) {
jj_consume_token(IS_T);
}
-
break;
}
default:
- jj_la1[44] = jj_gen;
+ jj_la1[47] = jj_gen;
;
}
}
if (!hasError) {
-
m_sharedState->currP=VhdlDocGen::COMPONENT;
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GENERIC_T:{if (!hasError) {
-
+ case GENERIC_T:{
+ if (!hasError) {
generic_clause();
}
-
break;
}
default:
- jj_la1[45] = jj_gen;
+ jj_la1[48] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PORT_T:{if (!hasError) {
-
+ case PORT_T:{
+ if (!hasError) {
port_clause();
}
-
break;
}
default:
- jj_la1[46] = jj_gen;
+ jj_la1[49] = jj_gen;
;
}
}
if (!hasError) {
-
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(COMPONENT_T),Entry::VARIABLE_SEC,VhdlDocGen::COMPONENT,0,0,Public);
m_sharedState->currP=0;
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(COMPONENT_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[47] = jj_gen;
+ jj_la1[50] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::component_instantiation_statement() {QCString s,s1;if (!hasError) {
-
+void VhdlParser::component_instantiation_statement() {QCString s,s1;
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s1 = instantiation_unit();
}
if (!hasError) {
-
QCString s3;
if (s1.contains("|")) {
s3=VhdlDocGen::getIndexWord(s1.data(),0);
@@ -1936,81 +1710,68 @@ QCString s3;
outlineParser()->addCompInst(s.lower().data(),s1.lower().data(),s3.data(),outlineParser()->getLine());
}
if (!hasError) {
-
- if (jj_2_13(2147483647)) {if (!hasError) {
-
+ if (jj_2_13(2147483647)) {
+ if (!hasError) {
generic_map_aspect();
}
-
} else {
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PORT_T:{if (!hasError) {
-
+ case PORT_T:{
+ if (!hasError) {
port_map_aspect();
}
-
break;
}
default:
- jj_la1[48] = jj_gen;
+ jj_la1[51] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::component_specification() {if (!hasError) {
-
+void VhdlParser::component_specification() {
+ if (!hasError) {
instantiation_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
name();
}
-
}
QCString VhdlParser::composite_type_definition() {QCString s,s1;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ARRAY_T:{if (!hasError) {
-
+ case ARRAY_T:{
+ if (!hasError) {
s = array_type_definition();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case RECORD_T:{if (!hasError) {
-
+ case RECORD_T:{
+ if (!hasError) {
record_type_definition();
}
if (!hasError) {
-
return s+"#";
}
-
break;
}
default:
- jj_la1[49] = jj_gen;
+ jj_la1[52] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -2018,205 +1779,174 @@ assert(false);
}
-void VhdlParser::concurrent_assertion_statement() {if (!hasError) {
-
- if (jj_2_14(2)) {if (!hasError) {
-
+void VhdlParser::concurrent_assertion_statement() {
+ if (!hasError) {
+ if (jj_2_14(2)) {
+ if (!hasError) {
identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
-
} else {
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case POSTPONED_T:{if (!hasError) {
-
+ case POSTPONED_T:{
+ if (!hasError) {
jj_consume_token(POSTPONED_T);
}
-
break;
}
default:
- jj_la1[50] = jj_gen;
+ jj_la1[53] = jj_gen;
;
}
}
if (!hasError) {
-
assertion();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::concurrent_procedure_call_statement() {if (!hasError) {
-
- if (jj_2_15(2)) {if (!hasError) {
-
+void VhdlParser::concurrent_procedure_call_statement() {
+ if (!hasError) {
+ if (jj_2_15(2)) {
+ if (!hasError) {
identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
-
} else {
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case POSTPONED_T:{if (!hasError) {
-
+ case POSTPONED_T:{
+ if (!hasError) {
jj_consume_token(POSTPONED_T);
}
-
break;
}
default:
- jj_la1[51] = jj_gen;
+ jj_la1[54] = jj_gen;
;
}
}
if (!hasError) {
-
procedure_call();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::concurrent_signal_assignment_statement() {if (!hasError) {
-
- if (jj_2_16(2)) {if (!hasError) {
-
+void VhdlParser::concurrent_signal_assignment_statement() {
+ if (!hasError) {
+ if (jj_2_16(2)) {
+ if (!hasError) {
identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
-
} else {
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case POSTPONED_T:{if (!hasError) {
-
+ case POSTPONED_T:{
+ if (!hasError) {
jj_consume_token(POSTPONED_T);
}
-
break;
}
default:
- jj_la1[52] = jj_gen;
+ jj_la1[55] = jj_gen;
;
}
}
if (!hasError) {
-
- if (jj_2_17(2147483647)) {if (!hasError) {
-
+ if (jj_2_17(2147483647)) {
+ if (!hasError) {
conditional_signal_assignment();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case WITH_T:{if (!hasError) {
-
+ case WITH_T:{
+ if (!hasError) {
selected_signal_assignment();
}
-
break;
}
default:
- jj_la1[53] = jj_gen;
+ jj_la1[56] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
}
-
}
void VhdlParser::concurrent_statement() {
- if (jj_2_18(2147483647)) {if (!hasError) {
-
+ if (jj_2_18(2147483647)) {
+ if (!hasError) {
block_statement();
}
-
- } else if (jj_2_19(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_19(2147483647)) {
+ if (!hasError) {
process_statement();
}
-
- } else if (jj_2_20(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_20(3)) {
+ if (!hasError) {
generate_statement();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case CASE_T:{if (!hasError) {
-
+ case CASE_T:{
+ if (!hasError) {
case_scheme();
}
-
break;
}
default:
- jj_la1[54] = jj_gen;
- if (jj_2_21(2147483647)) {if (!hasError) {
-
+ jj_la1[57] = jj_gen;
+ if (jj_2_21(2147483647)) {
+ if (!hasError) {
concurrent_assertion_statement();
}
-
- } else if (jj_2_22(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_22(2147483647)) {
+ if (!hasError) {
concurrent_signal_assignment_statement();
}
-
- } else if (jj_2_23(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_23(2147483647)) {
+ if (!hasError) {
component_instantiation_statement();
}
-
- } else if (jj_2_24(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_24(2147483647)) {
+ if (!hasError) {
concurrent_procedure_call_statement();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case VHDL2008TOOLDIR:{if (!hasError) {
-
+ case VHDL2008TOOLDIR:{
+ if (!hasError) {
jj_consume_token(VHDL2008TOOLDIR);
}
-
break;
}
default:
- jj_la1[55] = jj_gen;
+ jj_la1[58] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -2226,220 +1956,186 @@ void VhdlParser::concurrent_statement() {
}
-QCString VhdlParser::condition() {QCString s;if (!hasError) {
-
+QCString VhdlParser::condition() {QCString s;
+ if (!hasError) {
s = expression();
}
-
return s;
assert(false);
}
-QCString VhdlParser::condition_clause() {QCString s;if (!hasError) {
-
+QCString VhdlParser::condition_clause() {QCString s;
+ if (!hasError) {
jj_consume_token(UNTIL_T);
}
if (!hasError) {
-
s = condition();
}
-
return " until "+s;
assert(false);
}
-void VhdlParser::conditional_signal_assignment() {if (!hasError) {
-
+void VhdlParser::conditional_signal_assignment() {
+ if (!hasError) {
target();
}
if (!hasError) {
-
jj_consume_token(LESSTHAN_T);
}
if (!hasError) {
-
options();
}
if (!hasError) {
-
conditional_waveforms();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::conditional_waveforms() {if (!hasError) {
-
+void VhdlParser::conditional_waveforms() {
+ if (!hasError) {
waveform();
}
if (!hasError) {
-
while (!hasError) {
if (jj_2_25(2147483647)) {
;
} else {
goto end_label_11;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
condition();
}
if (!hasError) {
-
jj_consume_token(ELSE_T);
}
if (!hasError) {
-
waveform();
}
-
}
end_label_11: ;
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case WHEN_T:{if (!hasError) {
-
+ case WHEN_T:{
+ if (!hasError) {
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
condition();
}
-
break;
}
default:
- jj_la1[56] = jj_gen;
+ jj_la1[59] = jj_gen;
;
}
}
-
}
-void VhdlParser::configuration_declaration() {QCString s,s1;if (!hasError) {
-
+void VhdlParser::configuration_declaration() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(CONFIGURATION_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(OF_T);
}
if (!hasError) {
-
s1 = name();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
m_sharedState->confName=s+"::"+s1;
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(CONFIGURATION_T),Entry::VARIABLE_SEC,VhdlDocGen::CONFIG,"configuration",s1.data(),Public);
}
if (!hasError) {
-
configuration_declarative_part();
}
if (!hasError) {
-
block_configuration();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case CONFIGURATION_T:{if (!hasError) {
-
+ case CONFIGURATION_T:{
+ if (!hasError) {
jj_consume_token(CONFIGURATION_T);
}
-
break;
}
default:
- jj_la1[57] = jj_gen;
+ jj_la1[60] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
name();
}
-
break;
}
default:
- jj_la1[58] = jj_gen;
+ jj_la1[61] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->genLabels.resize(0); m_sharedState->confName="";
}
void VhdlParser::configuration_declarative_item() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
use_clause();
}
-
break;
}
- case ATTRIBUTE_T:{if (!hasError) {
-
+ case ATTRIBUTE_T:{
+ if (!hasError) {
attribute_specification();
}
-
break;
}
- case GROUP_T:{if (!hasError) {
-
+ case GROUP_T:{
+ if (!hasError) {
group_declaration();
}
-
break;
}
default:
- jj_la1[59] = jj_gen;
+ jj_la1[62] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-void VhdlParser::configuration_declarative_part() {if (!hasError) {
-
+void VhdlParser::configuration_declarative_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ATTRIBUTE_T:
@@ -2449,37 +2145,33 @@ void VhdlParser::configuration_declarative_part() {if (!hasError) {
break;
}
default:
- jj_la1[60] = jj_gen;
+ jj_la1[63] = jj_gen;
goto end_label_12;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
configuration_declarative_item();
}
-
}
end_label_12: ;
}
-
}
void VhdlParser::configuration_item() {
- if (jj_2_26(2147483647)) {if (!hasError) {
-
+ if (jj_2_26(2147483647)) {
+ if (!hasError) {
component_configuration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case FOR_T:{if (!hasError) {
-
+ case FOR_T:{
+ if (!hasError) {
block_configuration();
}
-
break;
}
default:
- jj_la1[61] = jj_gen;
+ jj_la1[64] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -2487,66 +2179,54 @@ void VhdlParser::configuration_item() {
}
-void VhdlParser::configuration_specification() {if (!hasError) {
-
+void VhdlParser::configuration_specification() {
+ if (!hasError) {
jj_consume_token(FOR_T);
}
if (!hasError) {
-
component_specification();
}
if (!hasError) {
-
binding_indication();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-QCString VhdlParser::constant_declaration() {QCString s,s1,s2;Token *t=0;if (!hasError) {
-
+QCString VhdlParser::constant_declaration() {QCString s,s1,s2;Token *t=0;
+ if (!hasError) {
jj_consume_token(CONSTANT_T);
}
if (!hasError) {
-
s = identifier_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s1 = subtype_indication();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case VARASSIGN_T:{if (!hasError) {
-
+ case VARASSIGN_T:{
+ if (!hasError) {
t = jj_consume_token(VARASSIGN_T);
}
if (!hasError) {
-
s2 = expression();
}
-
break;
}
default:
- jj_la1[62] = jj_gen;
+ jj_la1[65] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
if(t)
s2.prepend(":=");
QCString it=s1+s2;
@@ -2557,71 +2237,56 @@ assert(false);
}
-QCString VhdlParser::constraint_array_definition() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::constraint_array_definition() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(ARRAY_T);
}
if (!hasError) {
-
s = index_constraint();
}
if (!hasError) {
-
jj_consume_token(OF_T);
}
if (!hasError) {
-
s1 = subtype_indication();
}
-
return s+" "+s1;
assert(false);
}
-void VhdlParser::context_clause() {if (!hasError) {
-
+void VhdlParser::context_clause() {
+ if (!hasError) {
while (!hasError) {
- switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LIBRARY_T:
- case USE_T:{
+ if (jj_2_27(3)) {
;
- break;
- }
- default:
- jj_la1[63] = jj_gen;
+ } else {
goto end_label_13;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
context_item();
}
-
}
end_label_13: ;
}
-
}
QCString VhdlParser::constraint() {QCString s;
- if (jj_2_27(2147483647)) {if (!hasError) {
-
+ if (jj_2_28(2147483647)) {
+ if (!hasError) {
s = range_constraint();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_28(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_29(2147483647)) {
+ if (!hasError) {
s = index_constraint();
}
if (!hasError) {
-
return s;
}
-
} else {
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
@@ -2632,33 +2297,46 @@ assert(false);
void VhdlParser::context_item() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LIBRARY_T:{if (!hasError) {
-
+ case LIBRARY_T:{
+ if (!hasError) {
library_clause();
}
-
break;
}
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
use_clause();
}
-
break;
}
default:
- jj_la1[64] = jj_gen;
- jj_consume_token(-1);
- errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
+ jj_la1[66] = jj_gen;
+ if (jj_2_30(2147483647)) {
+ if (!hasError) {
+ context_declaration();
+ }
+ } else {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case CONTEXT_T:{
+ if (!hasError) {
+ context_ref();
+ }
+ break;
+ }
+ default:
+ jj_la1[67] = jj_gen;
+ jj_consume_token(-1);
+ errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
+ }
+ }
}
}
-QCString VhdlParser::decimal_literal() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::decimal_literal() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(DECIMAL_LITERAL);
}
-
return tok->image.c_str();
assert(false);
}
@@ -2666,54 +2344,46 @@ assert(false);
QCString VhdlParser::delay_mechanism() {QCString s;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case TRANSPORT_T:{if (!hasError) {
-
+ case TRANSPORT_T:{
+ if (!hasError) {
jj_consume_token(TRANSPORT_T);
}
if (!hasError) {
-
return " transport ";
}
-
break;
}
case INERTIAL_T:
- case REJECT_T:{if (!hasError) {
-
+ case REJECT_T:{
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case REJECT_T:{if (!hasError) {
-
+ case REJECT_T:{
+ if (!hasError) {
jj_consume_token(REJECT_T);
}
if (!hasError) {
-
s = expression();
}
if (!hasError) {
-
s.prepend(" reject ");
}
-
break;
}
default:
- jj_la1[65] = jj_gen;
+ jj_la1[68] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(INERTIAL_T);
}
if (!hasError) {
-
return s+" inertial ";
}
-
break;
}
default:
- jj_la1[66] = jj_gen;
+ jj_la1[69] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -2729,13 +2399,12 @@ void VhdlParser::design_file() {
case ENTITY_T:
case LIBRARY_T:
case PACKAGE_T:
- case USE_T:{if (!hasError) {
-
- while (!hasError) {if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
+ while (!hasError) {
+ if (!hasError) {
design_unit();
}
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ARCHITECTURE_T:
case CONFIGURATION_T:
@@ -2748,73 +2417,64 @@ void VhdlParser::design_file() {
break;
}
default:
- jj_la1[67] = jj_gen;
+ jj_la1[70] = jj_gen;
goto end_label_14;
}
}
end_label_14: ;
}
if (!hasError) {
-
}
-
break;
}
- case 0:{if (!hasError) {
-
+ case 0:{
+ if (!hasError) {
jj_consume_token(0);
}
-
break;
}
default:
- jj_la1[68] = jj_gen;
+ jj_la1[71] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-void VhdlParser::design_unit() {if (!hasError) {
-
+void VhdlParser::design_unit() {
+ if (!hasError) {
context_clause();
}
if (!hasError) {
-
library_unit();
}
-
}
QCString VhdlParser::designator() {QCString s;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case STRINGLITERAL:{if (!hasError) {
-
+ case STRINGLITERAL:{
+ if (!hasError) {
s = operator_symbol();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[69] = jj_gen;
+ jj_la1[72] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -2824,30 +2484,26 @@ assert(false);
QCString VhdlParser::direction() {Token *tok=0;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case TO_T:{if (!hasError) {
-
+ case TO_T:{
+ if (!hasError) {
tok = jj_consume_token(TO_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
- case DOWNTO_T:{if (!hasError) {
-
+ case DOWNTO_T:{
+ if (!hasError) {
tok = jj_consume_token(DOWNTO_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
default:
- jj_la1[70] = jj_gen;
+ jj_la1[73] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -2855,65 +2511,53 @@ assert(false);
}
-void VhdlParser::disconnection_specification() {if (!hasError) {
-
+void VhdlParser::disconnection_specification() {
+ if (!hasError) {
jj_consume_token(DISCONNECT_T);
}
if (!hasError) {
-
guarded_signal_specificatio();
}
if (!hasError) {
-
jj_consume_token(AFTER_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::guarded_signal_specificatio() {if (!hasError) {
-
+void VhdlParser::guarded_signal_specificatio() {
+ if (!hasError) {
signal_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
name();
}
-
}
QCString VhdlParser::discrete_range() {QCString s;
- if (jj_2_29(2147483647)) {if (!hasError) {
-
+ if (jj_2_31(2147483647)) {
+ if (!hasError) {
s = range();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_30(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_32(2147483647)) {
+ if (!hasError) {
s = subtype_indication();
}
if (!hasError) {
-
return s;
}
-
} else {
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
@@ -2922,26 +2566,22 @@ assert(false);
}
-QCString VhdlParser::element_association() {QCString s,s1;if (!hasError) {
-
- if (jj_2_31(2147483647)) {if (!hasError) {
-
+QCString VhdlParser::element_association() {QCString s,s1;
+ if (!hasError) {
+ if (jj_2_33(2147483647)) {
+ if (!hasError) {
s = choices();
}
if (!hasError) {
-
jj_consume_token(ARROW_T);
}
-
} else {
;
}
}
if (!hasError) {
-
s1 = expression();
}
-
if(!s.isEmpty())
return s+"=>"+s1;
return s1;
@@ -2949,102 +2589,92 @@ assert(false);
}
-QCString VhdlParser::element_declaration() {QCString s,s1;if (!hasError) {
-
- s = identifier_list();
+QCString VhdlParser::element_declaration() {QCString rec_name,s1,s2;
+ if (!hasError) {
+ rec_name = identifier_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s1 = subtype_indication();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
-outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::RECORD,0,s1.data(),Public);
- //outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s1.data(),Public);
- return s+":"+s1;
+QCString name;
+ QCStringList ql=QCStringList::split(",",rec_name);
+ for (uint j=0;j<ql.count();j++)
+ {
+ name=ql[j]+"~";
+ name+=outlineParser()->getNameID().data();;
+ outlineParser()->addVhdlType(name.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::RECORD,0,s1.data(),Public);
+ }
+ s2=rec_name+":"+s1;
+ return s2;
assert(false);
}
QCString VhdlParser::entity_aspect() {Token *tok=0;QCString s,s1;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ENTITY_T:{if (!hasError) {
-
+ case ENTITY_T:{
+ if (!hasError) {
tok = jj_consume_token(ENTITY_T);
}
if (!hasError) {
-
s = name();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = identifier();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
s+="("+s1+")";
}
-
break;
}
default:
- jj_la1[71] = jj_gen;
+ jj_la1[74] = jj_gen;
;
}
}
if (!hasError) {
-
return s;
}
-
break;
}
- case CONFIGURATION_T:{if (!hasError) {
-
+ case CONFIGURATION_T:{
+ if (!hasError) {
tok = jj_consume_token(CONFIGURATION_T);
}
if (!hasError) {
-
s = name();
}
if (!hasError) {
-
return tok->image.c_str()+s;
}
-
break;
}
- case OPEN_T:{if (!hasError) {
-
+ case OPEN_T:{
+ if (!hasError) {
tok = jj_consume_token(OPEN_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
default:
- jj_la1[72] = jj_gen;
+ jj_la1[75] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -3054,195 +2684,161 @@ assert(false);
QCString VhdlParser::entity_class() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ENTITY_T:{if (!hasError) {
-
+ case ENTITY_T:{
+ if (!hasError) {
jj_consume_token(ENTITY_T);
}
if (!hasError) {
-
return "entity";
}
-
break;
}
- case ARCHITECTURE_T:{if (!hasError) {
-
+ case ARCHITECTURE_T:{
+ if (!hasError) {
jj_consume_token(ARCHITECTURE_T);
}
if (!hasError) {
-
return "architecture";
}
-
break;
}
- case CONFIGURATION_T:{if (!hasError) {
-
+ case CONFIGURATION_T:{
+ if (!hasError) {
jj_consume_token(CONFIGURATION_T);
}
if (!hasError) {
-
return "configuration";
}
-
break;
}
- case PROCEDURE_T:{if (!hasError) {
-
+ case PROCEDURE_T:{
+ if (!hasError) {
jj_consume_token(PROCEDURE_T);
}
if (!hasError) {
-
return "procedure";
}
-
break;
}
- case FUNCTION_T:{if (!hasError) {
-
+ case FUNCTION_T:{
+ if (!hasError) {
jj_consume_token(FUNCTION_T);
}
if (!hasError) {
-
return "function";
}
-
break;
}
- case PACKAGE_T:{if (!hasError) {
-
+ case PACKAGE_T:{
+ if (!hasError) {
jj_consume_token(PACKAGE_T);
}
if (!hasError) {
-
return "package";
}
-
break;
}
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
jj_consume_token(TYPE_T);
}
if (!hasError) {
-
return "type";
}
-
break;
}
- case SUBTYPE_T:{if (!hasError) {
-
+ case SUBTYPE_T:{
+ if (!hasError) {
jj_consume_token(SUBTYPE_T);
}
if (!hasError) {
-
return "subtype";
}
-
break;
}
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
jj_consume_token(CONSTANT_T);
}
if (!hasError) {
-
return "constant";
}
-
break;
}
- case SIGNAL_T:{if (!hasError) {
-
+ case SIGNAL_T:{
+ if (!hasError) {
jj_consume_token(SIGNAL_T);
}
if (!hasError) {
-
return "signal";
}
-
break;
}
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
jj_consume_token(VARIABLE_T);
}
if (!hasError) {
-
return "variable";
}
-
break;
}
- case COMPONENT_T:{if (!hasError) {
-
+ case COMPONENT_T:{
+ if (!hasError) {
jj_consume_token(COMPONENT_T);
}
if (!hasError) {
-
return "component";
}
-
break;
}
- case LABEL_T:{if (!hasError) {
-
+ case LABEL_T:{
+ if (!hasError) {
jj_consume_token(LABEL_T);
}
if (!hasError) {
-
return "label";
}
-
break;
}
- case LITERAL_T:{if (!hasError) {
-
+ case LITERAL_T:{
+ if (!hasError) {
jj_consume_token(LITERAL_T);
}
if (!hasError) {
-
return "literal";
}
-
break;
}
- case UNITS_T:{if (!hasError) {
-
+ case UNITS_T:{
+ if (!hasError) {
jj_consume_token(UNITS_T);
}
if (!hasError) {
-
return "units";
}
-
break;
}
- case GROUP_T:{if (!hasError) {
-
+ case GROUP_T:{
+ if (!hasError) {
jj_consume_token(GROUP_T);
}
if (!hasError) {
-
return "group";
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
jj_consume_token(FILE_T);
}
if (!hasError) {
-
return "file";
}
-
break;
}
default:
- jj_la1[73] = jj_gen;
+ jj_la1[76] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -3250,48 +2846,41 @@ assert(false);
}
-QCString VhdlParser::entity_class_entry() {QCString s;if (!hasError) {
-
+QCString VhdlParser::entity_class_entry() {QCString s;
+ if (!hasError) {
s = entity_class();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case BOX_T:{if (!hasError) {
-
+ case BOX_T:{
+ if (!hasError) {
jj_consume_token(BOX_T);
}
if (!hasError) {
-
s+="<>";
}
-
break;
}
default:
- jj_la1[74] = jj_gen;
+ jj_la1[77] = jj_gen;
;
}
}
-
return s;
assert(false);
}
-QCString VhdlParser::entity_class_entry_list() {QCString s,s1,s2;if (!hasError) {
+QCString VhdlParser::entity_class_entry_list() {QCString s,s1,s2;
+ if (!hasError) {
if (!hasError) {
-
s1 = entity_class_entry();
}
if (!hasError) {
-
s+=s1;
}
-
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -3299,117 +2888,98 @@ s+=s1;
break;
}
default:
- jj_la1[75] = jj_gen;
+ jj_la1[78] = jj_gen;
goto end_label_15;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s = entity_class_entry();
}
if (!hasError) {
-
s2+=",";s2+=s;
}
-
}
end_label_15: ;
}
-
return s1+s2;
assert(false);
}
-void VhdlParser::entity_declaration() {QCString s;if (!hasError) {
-
+void VhdlParser::entity_declaration() {QCString s;
+ if (!hasError) {
jj_consume_token(ENTITY_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
m_sharedState->lastEntity=m_sharedState->current;
m_sharedState->lastCompound=0;
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(ENTITY_T),Entry::CLASS_SEC,VhdlDocGen::ENTITY,0,0,Public);
}
if (!hasError) {
-
entity_header();
}
if (!hasError) {
-
entity_declarative_part();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case BEGIN_T:{if (!hasError) {
-
+ case BEGIN_T:{
+ if (!hasError) {
jj_consume_token(BEGIN_T);
}
if (!hasError) {
-
entity_statement_part();
}
-
break;
}
default:
- jj_la1[76] = jj_gen;
+ jj_la1[79] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ENTITY_T:{if (!hasError) {
-
+ case ENTITY_T:{
+ if (!hasError) {
jj_consume_token(ENTITY_T);
}
-
break;
}
default:
- jj_la1[77] = jj_gen;
+ jj_la1[80] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
name();
}
-
break;
}
default:
- jj_la1[78] = jj_gen;
+ jj_la1[81] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->lastEntity=0;m_sharedState->lastCompound=0; m_sharedState->genLabels.resize(0);
}
@@ -3419,134 +2989,117 @@ void VhdlParser::entity_declarative_item() {
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_declaration();
}
-
break;
}
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
type_declaration();
}
-
break;
}
- case SUBTYPE_T:{if (!hasError) {
-
+ case SUBTYPE_T:{
+ if (!hasError) {
subtype_declaration();
}
-
break;
}
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
constant_declaration();
}
-
break;
}
- case SIGNAL_T:{if (!hasError) {
-
+ case SIGNAL_T:{
+ if (!hasError) {
signal_declaration();
}
-
break;
}
case SHARED_T:
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
variable_declaration();
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
file_declaration();
}
-
break;
}
- case ALIAS_T:{if (!hasError) {
-
+ case ALIAS_T:{
+ if (!hasError) {
alias_declaration();
}
-
break;
}
default:
- jj_la1[79] = jj_gen;
- if (jj_2_32(2147483647)) {if (!hasError) {
-
+ jj_la1[82] = jj_gen;
+ if (jj_2_34(2147483647)) {
+ if (!hasError) {
attribute_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ATTRIBUTE_T:{if (!hasError) {
-
+ case ATTRIBUTE_T:{
+ if (!hasError) {
attribute_specification();
}
-
break;
}
- case DISCONNECT_T:{if (!hasError) {
-
+ case DISCONNECT_T:{
+ if (!hasError) {
disconnection_specification();
}
-
break;
}
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
use_clause();
}
-
break;
}
default:
- jj_la1[80] = jj_gen;
- if (jj_2_33(3)) {if (!hasError) {
-
+ jj_la1[83] = jj_gen;
+ if (jj_2_35(3)) {
+ if (!hasError) {
group_template_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GROUP_T:{if (!hasError) {
-
+ case GROUP_T:{
+ if (!hasError) {
group_declaration();
}
-
break;
}
default:
- jj_la1[81] = jj_gen;
- if (jj_2_34(5)) {if (!hasError) {
-
+ jj_la1[84] = jj_gen;
+ if (jj_2_36(5)) {
+ if (!hasError) {
package_instantiation_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PACKAGE_T:{if (!hasError) {
-
+ case PACKAGE_T:{
+ if (!hasError) {
package_declaration();
}
-
break;
}
- case VHDL2008TOOLDIR:{if (!hasError) {
-
+ case VHDL2008TOOLDIR:{
+ if (!hasError) {
jj_consume_token(VHDL2008TOOLDIR);
}
-
break;
}
default:
- jj_la1[82] = jj_gen;
+ jj_la1[85] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -3559,8 +3112,8 @@ void VhdlParser::entity_declarative_item() {
}
-void VhdlParser::entity_declarative_part() {if (!hasError) {
-
+void VhdlParser::entity_declarative_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ALIAS_T:
@@ -3585,151 +3138,136 @@ void VhdlParser::entity_declarative_part() {if (!hasError) {
break;
}
default:
- jj_la1[83] = jj_gen;
+ jj_la1[86] = jj_gen;
goto end_label_16;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
entity_declarative_item();
}
-
}
end_label_16: ;
}
-
}
-QCString VhdlParser::entity_designator() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::entity_designator() {QCString s,s1;
+ if (!hasError) {
s = entity_tag();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LBRACKET_T:{if (!hasError) {
-
+ case LBRACKET_T:{
+ if (!hasError) {
s1 = signature();
}
-
break;
}
default:
- jj_la1[84] = jj_gen;
+ jj_la1[87] = jj_gen;
;
}
}
-
return s+s1;
assert(false);
}
-void VhdlParser::entity_header() {if (!hasError) {
-
+void VhdlParser::entity_header() {
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GENERIC_T:{if (!hasError) {
-
+ case GENERIC_T:{
+ if (!hasError) {
m_sharedState->currP=VhdlDocGen::GENERIC;m_sharedState->parse_sec=GEN_SEC;
}
if (!hasError) {
-
generic_clause();
}
-
break;
}
default:
- jj_la1[85] = jj_gen;
+ jj_la1[88] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PORT_T:{if (!hasError) {
-
+ case PORT_T:{
+ if (!hasError) {
m_sharedState->currP=VhdlDocGen::PORT;
}
if (!hasError) {
-
port_clause();
}
-
break;
}
default:
- jj_la1[86] = jj_gen;
+ jj_la1[89] = jj_gen;
;
}
}
-
}
-QCString VhdlParser::entity_name_list() {QCString s,s1;
+QCString VhdlParser::entity_name_list() {QCString s,s1,s2;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
case EXTENDED_CHARACTER:
- case CHARACTER_LITERAL:{if (!hasError) {
-
- while (!hasError) {if (!hasError) {
-
- s1 = entity_designator();
- }
- if (!hasError) {
-
-s+=s1;
- }
-
+ case CHARACTER_LITERAL:{
+ if (!hasError) {
+ if (!hasError) {
+ s1 = entity_designator();
+ }
+ }
+ if (!hasError) {
+ while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case SLSL_T:
- case STRINGLITERAL:
- case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:
- case CHARACTER_LITERAL:{
+ case COMMA_T:{
;
break;
}
default:
- jj_la1[87] = jj_gen;
+ jj_la1[90] = jj_gen;
goto end_label_17;
}
+ if (!hasError) {
+ jj_consume_token(COMMA_T);
+ }
+ if (!hasError) {
+ s = entity_designator();
+ }
+ if (!hasError) {
+s2+=s;
+ }
}
end_label_17: ;
}
if (!hasError) {
-
-return s;
+return s2;
}
-
break;
}
- case OTHER_T:{if (!hasError) {
-
+ case OTHER_T:{
+ if (!hasError) {
jj_consume_token(OTHER_T);
}
if (!hasError) {
-
return "other";
}
-
break;
}
- case ALL_T:{if (!hasError) {
-
+ case ALL_T:{
+ if (!hasError) {
jj_consume_token(ALL_T);
}
if (!hasError) {
-
return "all";
}
-
break;
}
default:
- jj_la1[88] = jj_gen;
+ jj_la1[91] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -3737,50 +3275,44 @@ assert(false);
}
-QCString VhdlParser::entity_specification() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::entity_specification() {QCString s,s1;
+ if (!hasError) {
s = entity_name_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s1 = entity_class();
}
-
return s+":"+s1;
assert(false);
}
void VhdlParser::entity_statement() {
- if (jj_2_35(2147483647)) {if (!hasError) {
-
+ if (jj_2_37(2147483647)) {
+ if (!hasError) {
concurrent_assertion_statement();
}
-
- } else if (jj_2_36(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_38(2147483647)) {
+ if (!hasError) {
process_statement();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case POSTPONED_T:
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
concurrent_procedure_call_statement();
}
-
break;
}
default:
- jj_la1[89] = jj_gen;
+ jj_la1[92] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -3788,8 +3320,8 @@ void VhdlParser::entity_statement() {
}
-void VhdlParser::entity_statement_part() {if (!hasError) {
-
+void VhdlParser::entity_statement_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ASSERT_T:
@@ -3803,17 +3335,15 @@ void VhdlParser::entity_statement_part() {if (!hasError) {
break;
}
default:
- jj_la1[90] = jj_gen;
+ jj_la1[93] = jj_gen;
goto end_label_18;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
entity_statement();
}
-
}
end_label_18: ;
}
-
}
@@ -3822,30 +3352,26 @@ QCString VhdlParser::entity_tag() {QCString s;
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case CHARACTER_LITERAL:{if (!hasError) {
-
+ case CHARACTER_LITERAL:{
+ if (!hasError) {
s = character_literal();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[91] = jj_gen;
+ jj_la1[94] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -3856,30 +3382,26 @@ assert(false);
QCString VhdlParser::enumeration_literal() {QCString s;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case CHARACTER_LITERAL:{if (!hasError) {
-
+ case CHARACTER_LITERAL:{
+ if (!hasError) {
s = character_literal();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[92] = jj_gen;
+ jj_la1[95] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -3887,16 +3409,14 @@ assert(false);
}
-QCString VhdlParser::enumeration_type_definition() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::enumeration_type_definition() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s = enumeration_literal();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -3904,98 +3424,83 @@ QCString VhdlParser::enumeration_type_definition() {QCString s,s1;if (!hasError)
break;
}
default:
- jj_la1[93] = jj_gen;
+ jj_la1[96] = jj_gen;
goto end_label_19;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = enumeration_literal();
}
if (!hasError) {
-
s+=",";s+=s1;
}
-
}
end_label_19: ;
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
return "("+s+")";
assert(false);
}
-QCString VhdlParser::exit_statement() {QCString s,s1,s2;Token *t=0;Token *t1=0;if (!hasError) {
-
+QCString VhdlParser::exit_statement() {QCString s,s1,s2;Token *t=0;Token *t1=0;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
t = jj_consume_token(COLON_T);
}
-
break;
}
default:
- jj_la1[94] = jj_gen;
+ jj_la1[97] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(EXIT_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s1 = identifier();
}
-
break;
}
default:
- jj_la1[95] = jj_gen;
+ jj_la1[98] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case WHEN_T:{if (!hasError) {
-
+ case WHEN_T:{
+ if (!hasError) {
t1 = jj_consume_token(WHEN_T);
}
if (!hasError) {
-
s2 = condition();
}
-
break;
}
default:
- jj_la1[96] = jj_gen;
+ jj_la1[99] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->lab.resize(0);
if(t) s+=":";
if(t1) s2.prepend(" when ");
@@ -4006,12 +3511,11 @@ assert(false);
}
-QCString VhdlParser::expression() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::expression() {QCString s,s1,s2;
+ if (!hasError) {
s = relation();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case AND_T:
@@ -4024,25 +3528,21 @@ QCString VhdlParser::expression() {QCString s,s1,s2;if (!hasError) {
break;
}
default:
- jj_la1[97] = jj_gen;
+ jj_la1[100] = jj_gen;
goto end_label_20;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
s1 = logop();
}
if (!hasError) {
-
s2 = relation();
}
if (!hasError) {
-
s+=s1;s+=s2;
}
-
}
end_label_20: ;
}
-
return s;
assert(false);
}
@@ -4050,74 +3550,62 @@ assert(false);
QCString VhdlParser::logop() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case AND_T:{if (!hasError) {
-
+ case AND_T:{
+ if (!hasError) {
jj_consume_token(AND_T);
}
if (!hasError) {
-
return "and" ;
}
-
break;
}
- case NAND_T:{if (!hasError) {
-
+ case NAND_T:{
+ if (!hasError) {
jj_consume_token(NAND_T);
}
if (!hasError) {
-
return "nand" ;
}
-
break;
}
- case NOR_T:{if (!hasError) {
-
+ case NOR_T:{
+ if (!hasError) {
jj_consume_token(NOR_T);
}
if (!hasError) {
-
return "nor" ;
}
-
break;
}
- case XNOR_T:{if (!hasError) {
-
+ case XNOR_T:{
+ if (!hasError) {
jj_consume_token(XNOR_T);
}
if (!hasError) {
-
return "xnor" ;
}
-
break;
}
- case XOR_T:{if (!hasError) {
-
+ case XOR_T:{
+ if (!hasError) {
jj_consume_token(XOR_T);
}
if (!hasError) {
-
return "xor" ;
}
-
break;
}
- case OR_T:{if (!hasError) {
-
+ case OR_T:{
+ if (!hasError) {
jj_consume_token(OR_T);
}
if (!hasError) {
-
return "or" ;
}
-
break;
}
default:
- jj_la1[98] = jj_gen;
+ jj_la1[101] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -4125,11 +3613,10 @@ assert(false);
}
-QCString VhdlParser::extended_identifier() {Token *t;if (!hasError) {
-
+QCString VhdlParser::extended_identifier() {Token *t;
+ if (!hasError) {
t = jj_consume_token(EXTENDED_CHARACTER);
}
-
return t->image.c_str();
assert(false);
}
@@ -4148,72 +3635,89 @@ QCString VhdlParser::factor() {QCString s,s1;
case CHARACTER_LITERAL:
case DECIMAL_LITERAL:
case BASED_LITERAL:
- case BIT_STRING_LITERAL:{if (!hasError) {
-
+ case BIT_STRING_LITERAL:{
+ if (!hasError) {
s = primary();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case DOUBLEMULT_T:{if (!hasError) {
-
+ case DOUBLEMULT_T:{
+ if (!hasError) {
jj_consume_token(DOUBLEMULT_T);
}
if (!hasError) {
-
s1 = primary();
}
if (!hasError) {
-
s+="**";s+=s1;
}
-
break;
}
default:
- jj_la1[99] = jj_gen;
+ jj_la1[102] = jj_gen;
;
}
}
if (!hasError) {
-
return s;
}
-
break;
}
- case ABS_T:{if (!hasError) {
-
+ case ABS_T:{
+ if (!hasError) {
jj_consume_token(ABS_T);
}
if (!hasError) {
-
s = primary();
}
if (!hasError) {
-
s1 = "abs "; return s1+s;
}
-
break;
}
- case NOT_T:{if (!hasError) {
-
+ case NOT_T:{
+ if (!hasError) {
jj_consume_token(NOT_T);
}
if (!hasError) {
-
s = primary();
}
if (!hasError) {
-
s1="not ";return s1+s;
}
-
+ break;
+ }
+ case QQ_T:{
+ if (!hasError) {
+ jj_consume_token(QQ_T);
+ }
+ if (!hasError) {
+ s = primary();
+ }
+ if (!hasError) {
+s1="?? ";return s1;
+ }
+ break;
+ }
+ case AND_T:
+ case NAND_T:
+ case NOR_T:
+ case OR_T:
+ case XOR_T:
+ case XNOR_T:{
+ if (!hasError) {
+ s = logop();
+ }
+ if (!hasError) {
+ s1 = primary();
+ }
+ if (!hasError) {
+return s;
+ }
break;
}
default:
- jj_la1[100] = jj_gen;
+ jj_la1[103] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -4221,43 +3725,36 @@ assert(false);
}
-QCString VhdlParser::file_declaration() {QCString s,s1,s2,s3;if (!hasError) {
-
+QCString VhdlParser::file_declaration() {QCString s,s1,s2,s3;
+ if (!hasError) {
jj_consume_token(FILE_T);
}
if (!hasError) {
-
s = identifier_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s2 = subtype_indication();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IS_T:
- case OPEN_T:{if (!hasError) {
-
+ case OPEN_T:{
+ if (!hasError) {
s3 = file_open_information();
}
-
break;
}
default:
- jj_la1[101] = jj_gen;
+ jj_la1[104] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
QCString t1=s2+" "+s3;
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,t1.data(),Public);
return " file "+s+":"+s2+" "+s3+";";
@@ -4265,72 +3762,76 @@ assert(false);
}
-QCString VhdlParser::file_logical_name() {QCString s;if (!hasError) {
-
+QCString VhdlParser::file_logical_name() {QCString s;
+ if (!hasError) {
s = expression();
}
-
return s;
assert(false);
}
-QCString VhdlParser::file_open_information() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::file_open_information() {QCString s,s1,s2;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case OPEN_T:{if (!hasError) {
-
+ case OPEN_T:{
+ if (!hasError) {
jj_consume_token(OPEN_T);
}
if (!hasError) {
-
s = expression();
}
-
break;
}
default:
- jj_la1[102] = jj_gen;
+ jj_la1[105] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case IN_T:
+ case OUT_T:{
+ if (!hasError) {
+ inout_stat();
+ }
+ break;
+ }
+ default:
+ jj_la1[106] = jj_gen;
+ ;
+ }
+ }
+ if (!hasError) {
s1 = file_logical_name();
}
-
s2="open "+s+" is "+s1; return s2;
assert(false);
}
-QCString VhdlParser::file_type_definition() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::file_type_definition() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(FILE_T);
}
if (!hasError) {
-
jj_consume_token(OF_T);
}
if (!hasError) {
-
s = type_mark();
}
-
s1=" file of "+s; return s1;
assert(false);
}
-QCString VhdlParser::floating_type_definition() {QCString s;if (!hasError) {
-
+QCString VhdlParser::floating_type_definition() {QCString s;
+ if (!hasError) {
s = range_constraint();
}
-
return s;
assert(false);
}
@@ -4341,30 +3842,26 @@ QCString VhdlParser::formal_designator() {QCString s;Token *tok=0;
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case INTEGER:{if (!hasError) {
-
+ case INTEGER:{
+ if (!hasError) {
tok = jj_consume_token(INTEGER);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
default:
- jj_la1[103] = jj_gen;
+ jj_la1[107] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -4372,287 +3869,245 @@ assert(false);
}
-QCString VhdlParser::formal_parameter_list() {QCString s;if (!hasError) {
-
+QCString VhdlParser::formal_parameter_list() {QCString s;
+ if (!hasError) {
s = interface_list();
}
-
return s;
assert(false);
}
-QCString VhdlParser::formal_part() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::formal_part() {QCString s,s1;
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
formal_designator();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
s+"("+s1+")";
}
-
break;
}
default:
- jj_la1[104] = jj_gen;
+ jj_la1[108] = jj_gen;
;
}
}
-
return s;
assert(false);
}
-QCString VhdlParser::full_type_declaration() {std::shared_ptr<Entry> tmpEntry;QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::full_type_declaration() {std::shared_ptr<Entry> tmpEntry;QCString s,s1,s2;
+ if (!hasError) {
jj_consume_token(TYPE_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
tmpEntry=m_sharedState->current;
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::RECORD,0,0,Public);
}
if (!hasError) {
-
- try {if (!hasError) {
-
- s2 = type_definition();
- }
-
- } catch ( ...) {
-outlineParser()->error_skipto(SEMI_T);
- }
+ s2 = type_definition();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
if (s2.contains("#")) {
VhdlDocGen::deleteAllChars(s2,'#');
tmpEntry->spec=VhdlDocGen::RECORD;
tmpEntry->type=s2.data();
- //outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(TYPE_T),Entry::VARIABLE_SEC,VhdlDocGen::RECORD,0,s2.data(),Public);
}
else if (s2.contains("%")) {
VhdlDocGen::deleteAllChars(s2,'%');
tmpEntry->spec=VhdlDocGen::UNITS;
tmpEntry->type=s2.data();
- //outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(TYPE_T),Entry::VARIABLE_SEC,VhdlDocGen::UNITS,s2.data(),s2.data(),Public);
- }
+ }
else {
tmpEntry->spec=VhdlDocGen::TYPE;
tmpEntry->type=s2.data();
- //outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(TYPE_T),Entry::VARIABLE_SEC,VhdlDocGen::TYPE,0,s2.data(),Public);
}
+
tmpEntry.reset();
return "type "+s+" is "+s2+";";
assert(false);
}
-QCString VhdlParser::function_call() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::function_call() {QCString s,s1;
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = actual_parameter_part();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
return s+"("+s1+")";
assert(false);
}
-void VhdlParser::generate_statement() {QCString s;if (!hasError) {
-
+void VhdlParser::generate_statement() {QCString s;
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
- try {if (!hasError) {
-
+ try {
+ if (!hasError) {
generate_scheme();
}
if (!hasError) {
-
jj_consume_token(GENERATE_T);
}
if (!hasError) {
-
outlineParser()->pushLabel(m_sharedState->genLabels,s);
}
if (!hasError) {
-
generate_statement_body1();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
-
} catch ( ...) {
outlineParser()->error_skipto(GENERATE_T);
}
}
if (!hasError) {
-
jj_consume_token(GENERATE_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[105] = jj_gen;
+ jj_la1[109] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->genLabels=outlineParser()->popLabel(m_sharedState->genLabels);
}
void VhdlParser::generate_scheme() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case FOR_T:{if (!hasError) {
-
+ case FOR_T:{
+ if (!hasError) {
jj_consume_token(FOR_T);
}
if (!hasError) {
-
parameter_specification();
}
-
break;
}
- case IF_T:{if (!hasError) {
-
+ case IF_T:{
+ if (!hasError) {
jj_consume_token(IF_T);
}
if (!hasError) {
-
+ if (jj_2_39(2)) {
+ if (!hasError) {
+ identifier();
+ }
+ if (!hasError) {
+ jj_consume_token(COLON_T);
+ }
+ } else {
+ ;
+ }
+ }
+ if (!hasError) {
condition();
}
-
break;
}
default:
- jj_la1[106] = jj_gen;
+ jj_la1[110] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-void VhdlParser::generic_clause() {QCString s;if (!hasError) {
-
+void VhdlParser::generic_clause() {QCString s;
+ if (!hasError) {
jj_consume_token(GENERIC_T);
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
m_sharedState->parse_sec=GEN_SEC;
}
if (!hasError) {
-
s = generic_list();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->parse_sec=0;
}
-QCString VhdlParser::generic_list() {QCString s;if (!hasError) {
-
+QCString VhdlParser::generic_list() {QCString s;
+ if (!hasError) {
s = interface_list();
}
-
return s;
assert(false);
}
-void VhdlParser::generic_map_aspect() {if (!hasError) {
-
+void VhdlParser::generic_map_aspect() {
+ if (!hasError) {
jj_consume_token(GENERIC_T);
}
if (!hasError) {
-
jj_consume_token(MAP_T);
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
association_list();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
}
@@ -4661,30 +4116,26 @@ QCString VhdlParser::group_constituent() {QCString s;
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case CHARACTER_LITERAL:{if (!hasError) {
-
+ case CHARACTER_LITERAL:{
+ if (!hasError) {
s = character_literal();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[107] = jj_gen;
+ jj_la1[111] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -4692,15 +4143,13 @@ assert(false);
}
-QCString VhdlParser::group_constituent_list() {QCString s,s1,s2;if (!hasError) {
+QCString VhdlParser::group_constituent_list() {QCString s,s1,s2;
+ if (!hasError) {
if (!hasError) {
-
s1 = group_constituent();
}
-
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -4708,144 +4157,118 @@ QCString VhdlParser::group_constituent_list() {QCString s,s1,s2;if (!hasError) {
break;
}
default:
- jj_la1[108] = jj_gen;
+ jj_la1[112] = jj_gen;
goto end_label_21;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s = group_constituent();
}
if (!hasError) {
-
s2+=",";s2+=s1;
}
-
}
end_label_21: ;
}
-
return s+s2;
assert(false);
}
-QCString VhdlParser::group_declaration() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::group_declaration() {QCString s,s1,s2;
+ if (!hasError) {
jj_consume_token(GROUP_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s1 = identifier();
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s2 = group_constituent_list();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
return "group "+s+":"+s1+"("+s2+");";
assert(false);
}
-QCString VhdlParser::group_template_declaration() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::group_template_declaration() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(GROUP_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = entity_class_entry_list();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
return "group "+s+ "is ("+s1+");";
assert(false);
}
-void VhdlParser::guarded_signal_specification() {if (!hasError) {
-
+void VhdlParser::guarded_signal_specification() {
+ if (!hasError) {
signal_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
type_mark();
}
-
}
QCString VhdlParser::identifier() {Token *tok=0;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
tok = jj_consume_token(EXTENDED_CHARACTER);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
- case BASIC_IDENTIFIER:{if (!hasError) {
-
+ case BASIC_IDENTIFIER:{
+ if (!hasError) {
tok = jj_consume_token(BASIC_IDENTIFIER);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
default:
- jj_la1[109] = jj_gen;
+ jj_la1[113] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -4853,12 +4276,11 @@ assert(false);
}
-QCString VhdlParser::identifier_list() {QCString str,str1;if (!hasError) {
-
- str = identifier();
+QCString VhdlParser::identifier_list() {QCString str,str1;
+ if (!hasError) {
+ str = name();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -4866,73 +4288,61 @@ QCString VhdlParser::identifier_list() {QCString str,str1;if (!hasError) {
break;
}
default:
- jj_la1[110] = jj_gen;
+ jj_la1[114] = jj_gen;
goto end_label_22;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
- str1 = identifier();
+ str1 = name();
}
if (!hasError) {
-
str+=",";str+=str1;
}
-
}
end_label_22: ;
}
-
return str;
assert(false);
}
-void VhdlParser::if_statement() {QCString s,s1;if (!hasError) {
-
+void VhdlParser::if_statement() {QCString s,s1;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
-
break;
}
default:
- jj_la1[111] = jj_gen;
+ jj_la1[115] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(IF_T);
}
if (!hasError) {
-
s = condition();
}
if (!hasError) {
-
jj_consume_token(THEN_T);
}
if (!hasError) {
-
s.prepend("if ");
FlowChart::addFlowChart(FlowChart::IF_NO,0,s);
}
if (!hasError) {
-
sequence_of_statement();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ELSIF_T:{
@@ -4940,122 +4350,101 @@ s.prepend("if ");
break;
}
default:
- jj_la1[112] = jj_gen;
+ jj_la1[116] = jj_gen;
goto end_label_23;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(ELSIF_T);
}
if (!hasError) {
-
s1 = condition();
}
if (!hasError) {
-
jj_consume_token(THEN_T);
}
if (!hasError) {
-
s1.prepend("elsif ");
FlowChart::addFlowChart(FlowChart::ELSIF_NO,0,s1.data());
}
if (!hasError) {
-
sequence_of_statement();
}
-
}
end_label_23: ;
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ELSE_T:{if (!hasError) {
-
+ case ELSE_T:{
+ if (!hasError) {
jj_consume_token(ELSE_T);
}
if (!hasError) {
-
FlowChart::addFlowChart(FlowChart::ELSE_NO,0,0);
}
if (!hasError) {
-
sequence_of_statement();
}
-
break;
}
default:
- jj_la1[113] = jj_gen;
+ jj_la1[117] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(IF_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[114] = jj_gen;
+ jj_la1[118] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
FlowChart::moveToPrevLevel();
FlowChart::addFlowChart(FlowChart::ENDIF_NO,0,0);
}
-QCString VhdlParser::incomplete_type_declaration() {QCString s;if (!hasError) {
-
+QCString VhdlParser::incomplete_type_declaration() {QCString s;
+ if (!hasError) {
jj_consume_token(TYPE_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
return "type "+s+";";
assert(false);
}
-QCString VhdlParser::index_constraint() {QCString s="("; QCString s1,s2;if (!hasError) {
-
+QCString VhdlParser::index_constraint() {QCString s="("; QCString s1,s2;
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s2 = discrete_range();
}
if (!hasError) {
-
s+=s2;
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -5063,54 +4452,54 @@ s+=s2;
break;
}
default:
- jj_la1[115] = jj_gen;
+ jj_la1[119] = jj_gen;
goto end_label_24;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = discrete_range();
}
if (!hasError) {
-
s+=",";s+=s1;
}
-
}
end_label_24: ;
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
return s+")";
assert(false);
}
QCString VhdlParser::index_specification() {QCString s;
- if (jj_2_37(2147483647)) {if (!hasError) {
-
+ if (jj_2_40(2147483647)) {
+ if (!hasError) {
s = discrete_range();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ABS_T:
+ case AND_T:
+ case NAND_T:
case NEW_T:
+ case NOR_T:
case NOT_T:
case NULL_T:
+ case OR_T:
+ case XOR_T:
+ case XNOR_T:
case LPAREN_T:
case PLUS_T:
case MINUS_T:
case SLSL_T:
+ case QQ_T:
case INTEGER:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
@@ -5118,19 +4507,17 @@ return s;
case CHARACTER_LITERAL:
case DECIMAL_LITERAL:
case BASED_LITERAL:
- case BIT_STRING_LITERAL:{if (!hasError) {
-
+ case BIT_STRING_LITERAL:{
+ if (!hasError) {
s = expression();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[116] = jj_gen;
+ jj_la1[120] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -5139,132 +4526,110 @@ assert(false);
}
-QCString VhdlParser::index_subtype_definition() {QCString s;if (!hasError) {
-
+QCString VhdlParser::index_subtype_definition() {QCString s;
+ if (!hasError) {
s = type_mark();
}
if (!hasError) {
-
jj_consume_token(RANGE_T);
}
if (!hasError) {
-
jj_consume_token(BOX_T);
}
-
return s+" range <> ";
assert(false);
}
-QCString VhdlParser::instantiation_unit() {QCString s,s1,s2;Token *tok;
+QCString VhdlParser::instantiation_unit() {QCString s,s1,s2;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMPONENT_T:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case COMPONENT_T:{if (!hasError) {
-
+ case COMPONENT_T:{
+ if (!hasError) {
jj_consume_token(COMPONENT_T);
}
-
break;
}
default:
- jj_la1[117] = jj_gen;
+ jj_la1[121] = jj_gen;
;
}
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
s1="component "; return s;
}
-
break;
}
- case ENTITY_T:{if (!hasError) {
-
+ case ENTITY_T:{
+ if (!hasError) {
jj_consume_token(ENTITY_T);
}
if (!hasError) {
-
- if (jj_2_38(2)) {if (!hasError) {
-
+ if (jj_2_41(2)) {
+ if (!hasError) {
jj_consume_token(BASIC_IDENTIFIER);
}
if (!hasError) {
-
jj_consume_token(DOT_T);
}
-
} else {
;
}
}
if (!hasError) {
-
s2 = name();
}
if (!hasError) {
-
s="entity|"+s2;
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = identifier();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
s+="(";s+=s1;s+=")" ;
}
-
break;
}
default:
- jj_la1[118] = jj_gen;
+ jj_la1[122] = jj_gen;
;
}
}
if (!hasError) {
-
return s;
}
-
break;
}
- case CONFIGURATION_T:{if (!hasError) {
-
+ case CONFIGURATION_T:{
+ if (!hasError) {
jj_consume_token(CONFIGURATION_T);
}
if (!hasError) {
-
s = name();
}
if (!hasError) {
-
s1="configuration ";return s;
}
-
break;
}
default:
- jj_la1[119] = jj_gen;
+ jj_la1[123] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -5274,42 +4639,38 @@ assert(false);
QCString VhdlParser::instantiation_list() {QCString s;Token *tok=0;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case SLSL_T:
+ case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier_list();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case OTHER_T:{if (!hasError) {
-
+ case OTHER_T:{
+ if (!hasError) {
tok = jj_consume_token(OTHER_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
- case ALL_T:{if (!hasError) {
-
+ case ALL_T:{
+ if (!hasError) {
tok = jj_consume_token(ALL_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
default:
- jj_la1[120] = jj_gen;
+ jj_la1[124] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -5317,153 +4678,124 @@ assert(false);
}
-QCString VhdlParser::integer() {Token *t;if (!hasError) {
-
+QCString VhdlParser::integer() {Token *t;
+ if (!hasError) {
t = jj_consume_token(INTEGER);
}
-
return t->image.c_str();
assert(false);
}
-QCString VhdlParser::integer_type_definition() {QCString s;if (!hasError) {
-
+QCString VhdlParser::integer_type_definition() {QCString s;
+ if (!hasError) {
s = range_constraint();
}
-
return s;
assert(false);
}
QCString VhdlParser::interface_declaration() {QCString s,s1;
- if (jj_2_39(5)) {if (!hasError) {
-
+ if (jj_2_42(5)) {
+ if (!hasError) {
s = interface_subprogram_declaration();
}
if (!hasError) {
-
return s;
}
-
+ } else if (jj_2_43(5)) {
+ if (!hasError) {
+ interface_package_declaration();
+ }
+ if (!hasError) {
+return s;
+ }
+ } else if (jj_2_44(5)) {
+ if (!hasError) {
+ s = interface_variable_declaration();
+ }
+ if (!hasError) {
+return s;
+ }
+ } else if (jj_2_45(5)) {
+ if (!hasError) {
+ interface_file_declaration();
+ }
+ if (!hasError) {
+return s;
+ }
+ } else if (jj_2_46(2147483647)) {
+ if (!hasError) {
+ subprogram_declaration();
+ }
+ if (!hasError) {
+return s;
+ }
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PACKAGE_T:{if (!hasError) {
-
- interface_package_declaration();
- }
+ case CONSTANT_T:
+ case FILE_T:
+ case SIGNAL_T:
+ case SHARED_T:
+ case TYPE_T:
+ case VARIABLE_T:{
if (!hasError) {
-
-return s;
+ s = object_class();
}
-
- break;
+ if (!hasError) {
+ s1 = identifier();
}
- default:
- jj_la1[121] = jj_gen;
- if (jj_2_40(5)) {if (!hasError) {
-
- s = interface_variable_declaration();
- }
- if (!hasError) {
-
-return s;
- }
-
- } else if (jj_2_41(5)) {if (!hasError) {
-
- interface_file_declaration();
- }
- if (!hasError) {
-
-return s;
- }
-
- } else if (jj_2_42(2147483647)) {if (!hasError) {
-
- subprogram_declaration();
- }
- if (!hasError) {
-
-return s;
- }
-
- } else {
- switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case CONSTANT_T:
- case FILE_T:
- case SIGNAL_T:
- case SHARED_T:
- case TYPE_T:
- case VARIABLE_T:{if (!hasError) {
-
- s = object_class();
- }
- if (!hasError) {
-
- s1 = identifier();
- }
- if (!hasError) {
-
+ if (!hasError) {
if (m_sharedState->parse_sec==GEN_SEC)
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,m_sharedState->currP,s1.data(),0,Public);
return s;
- }
-
- break;
- }
- default:
- jj_la1[122] = jj_gen;
- jj_consume_token(-1);
- errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
- }
}
+ break;
+ }
+ default:
+ jj_la1[125] = jj_gen;
+ jj_consume_token(-1);
+ errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
assert(false);
}
-QCString VhdlParser::interface_element() {QCString s;if (!hasError) {
-
+QCString VhdlParser::interface_element() {QCString s;
+ if (!hasError) {
s = interface_declaration();
}
-
return s;
assert(false);
}
-QCString VhdlParser::interface_file_declaration() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::interface_file_declaration() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(FILE_T);
}
if (!hasError) {
-
s = identifier_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s1 = subtype_indication();
}
-
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s1.data(),Public);
return " file "+s+":"+s1;
assert(false);
}
-QCString VhdlParser::interface_list() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::interface_list() {QCString s,s1,s2;
+ if (!hasError) {
s = interface_element();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SEMI_T:{
@@ -5471,147 +4803,127 @@ QCString VhdlParser::interface_list() {QCString s,s1,s2;if (!hasError) {
break;
}
default:
- jj_la1[123] = jj_gen;
+ jj_la1[126] = jj_gen;
goto end_label_25;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(SEMI_T);
}
if (!hasError) {
-
s1 = interface_element();
}
if (!hasError) {
-
s2+=";";s2+=s1;
}
-
}
end_label_25: ;
}
-
return s+s2;
assert(false);
}
-QCString VhdlParser::interface_variable_declaration() {Token *tok=0;Token *tok1=0;Token *tok2=0;QCString s,s1,s2,s3,s4,s5;if (!hasError) {
-
+QCString VhdlParser::interface_variable_declaration() {Token *tok=0;Token *tok1=0;Token *tok2=0;QCString s,s1,s2,s3,s4,s5;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case CONSTANT_T:
case SIGNAL_T:
case SHARED_T:
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
tok = jj_consume_token(VARIABLE_T);
}
-
break;
}
- case SIGNAL_T:{if (!hasError) {
-
+ case SIGNAL_T:{
+ if (!hasError) {
tok = jj_consume_token(SIGNAL_T);
}
-
break;
}
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
tok = jj_consume_token(CONSTANT_T);
}
-
break;
}
- case SHARED_T:{if (!hasError) {
-
+ case SHARED_T:{
+ if (!hasError) {
tok = jj_consume_token(SHARED_T);
}
-
break;
}
default:
- jj_la1[124] = jj_gen;
+ jj_la1[127] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-
break;
}
default:
- jj_la1[125] = jj_gen;
+ jj_la1[128] = jj_gen;
;
}
}
if (!hasError) {
-
s = identifier_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BUFFER_T:
case IN_T:
case INOUT_T:
case LINKAGE_T:
- case OUT_T:{if (!hasError) {
-
+ case OUT_T:{
+ if (!hasError) {
s1 = mode();
}
-
break;
}
default:
- jj_la1[126] = jj_gen;
+ jj_la1[129] = jj_gen;
;
}
}
if (!hasError) {
-
s2 = subtype_indication();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case BUS_T:{if (!hasError) {
-
+ case BUS_T:{
+ if (!hasError) {
tok1 = jj_consume_token(BUS_T);
}
-
break;
}
default:
- jj_la1[127] = jj_gen;
+ jj_la1[130] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case VARASSIGN_T:{if (!hasError) {
-
+ case VARASSIGN_T:{
+ if (!hasError) {
tok2 = jj_consume_token(VARASSIGN_T);
}
if (!hasError) {
-
s4 = expression();
}
-
break;
}
default:
- jj_la1[128] = jj_gen;
+ jj_la1[131] = jj_gen;
;
}
}
-
if(tok)
s5=tok->image.c_str();
@@ -5645,44 +4957,38 @@ assert(false);
QCString VhdlParser::iteration_scheme() {QCString s;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case WHILE_T:{if (!hasError) {
-
+ case WHILE_T:{
+ if (!hasError) {
jj_consume_token(WHILE_T);
}
if (!hasError) {
-
s = condition();
}
if (!hasError) {
-
s.prepend("while ");
FlowChart::addFlowChart(FlowChart::WHILE_NO,0,s.data(),m_sharedState->lab.data());
m_sharedState->lab="";
return s;
}
-
break;
}
- case FOR_T:{if (!hasError) {
-
+ case FOR_T:{
+ if (!hasError) {
jj_consume_token(FOR_T);
}
if (!hasError) {
-
s = parameter_specification();
}
if (!hasError) {
-
QCString q=m_sharedState->lab+" for "+s;
FlowChart::addFlowChart(FlowChart::FOR_NO,0,q.data(),m_sharedState->lab.data());
m_sharedState->lab="";
return q;
}
-
break;
}
default:
- jj_la1[129] = jj_gen;
+ jj_la1[132] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -5690,32 +4996,27 @@ assert(false);
}
-QCString VhdlParser::label() {QCString s;if (!hasError) {
-
+QCString VhdlParser::label() {QCString s;
+ if (!hasError) {
s = identifier();
}
-
return s;
assert(false);
}
-QCString VhdlParser::library_clause() {QCString s;if (!hasError) {
+QCString VhdlParser::library_clause() {QCString s;
+ if (!hasError) {
if (!hasError) {
-
jj_consume_token(LIBRARY_T);
}
if (!hasError) {
-
s = identifier_list();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-
if ( m_sharedState->parse_sec==0 && Config_getBool(SHOW_INCLUDE_FILES) )
{
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,s.data(),"_library_",Public);
@@ -5727,38 +5028,27 @@ assert(false);
QCString VhdlParser::library_unit() {QCString s;
- if (jj_2_43(2)) {if (!hasError) {
-
+ if (jj_2_47(2)) {
+ if (!hasError) {
primary_unit();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ARCHITECTURE_T:
- case PACKAGE_T:{if (!hasError) {
-
+ case PACKAGE_T:{
+ if (!hasError) {
secondary_unit();
}
if (!hasError) {
-
return s;
}
-
- break;
- }
- case CONTEXT_T:{if (!hasError) {
-
- context_declaration();
- }
-
break;
}
default:
- jj_la1[130] = jj_gen;
+ jj_la1[133] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -5768,59 +5058,49 @@ assert(false);
QCString VhdlParser::literal() {QCString s;
- if (jj_2_44(2147483647)) {if (!hasError) {
-
+ if (jj_2_48(2147483647)) {
+ if (!hasError) {
s = bit_string_literal();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_45(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_49(2147483647)) {
+ if (!hasError) {
s = numeric_literal();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_46(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_50(2147483647)) {
+ if (!hasError) {
s = enumeration_literal();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case STRINGLITERAL:{if (!hasError) {
-
+ case STRINGLITERAL:{
+ if (!hasError) {
s = string_literal();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case NULL_T:{if (!hasError) {
-
+ case NULL_T:{
+ if (!hasError) {
jj_consume_token(NULL_T);
}
if (!hasError) {
-
return "null";
}
-
break;
}
default:
- jj_la1[131] = jj_gen;
+ jj_la1[134] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -5829,98 +5109,83 @@ assert(false);
}
-QCString VhdlParser::logical_operator() {QCString s;if (!hasError) {
-
+QCString VhdlParser::logical_operator() {QCString s;
+ if (!hasError) {
s = logop();
}
-
return s;
assert(false);
}
-QCString VhdlParser::loop_statement() {QCString s,s1,s2,s3;if (!hasError) {
-
+QCString VhdlParser::loop_statement() {QCString s,s1,s2,s3;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s+=":";
}
-
break;
}
default:
- jj_la1[132] = jj_gen;
+ jj_la1[135] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case FOR_T:
- case WHILE_T:{if (!hasError) {
-
+ case WHILE_T:{
+ if (!hasError) {
s1 = iteration_scheme();
}
-
break;
}
default:
- jj_la1[133] = jj_gen;
+ jj_la1[136] = jj_gen;
;
}
}
if (!hasError) {
-
if(s1.isEmpty())
FlowChart::addFlowChart(FlowChart::LOOP_NO,0,"infinite");
}
if (!hasError) {
-
jj_consume_token(LOOP_T);
}
if (!hasError) {
-
s2 = sequence_of_statement();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(LOOP_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s3 = identifier();
}
-
break;
}
default:
- jj_la1[134] = jj_gen;
+ jj_la1[137] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
QCString q = s+" loop "+s2+" end loop" +s3;
QCString endLoop="end loop" + s3;
FlowChart::moveToPrevLevel();
@@ -5932,41 +5197,35 @@ assert(false);
QCString VhdlParser::miscellaneous_operator() {Token *t=0;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case DOUBLEMULT_T:{if (!hasError) {
-
+ case DOUBLEMULT_T:{
+ if (!hasError) {
jj_consume_token(DOUBLEMULT_T);
}
if (!hasError) {
-
return "**";
}
-
break;
}
- case ABS_T:{if (!hasError) {
-
+ case ABS_T:{
+ if (!hasError) {
jj_consume_token(ABS_T);
}
if (!hasError) {
-
return "abs";
}
-
break;
}
- case NOT_T:{if (!hasError) {
-
+ case NOT_T:{
+ if (!hasError) {
jj_consume_token(NOT_T);
}
if (!hasError) {
-
return "not";
}
-
break;
}
default:
- jj_la1[135] = jj_gen;
+ jj_la1[138] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -5976,63 +5235,53 @@ assert(false);
QCString VhdlParser::mode() {Token *tok=0;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case IN_T:{if (!hasError) {
-
+ case IN_T:{
+ if (!hasError) {
tok = jj_consume_token(IN_T);
}
if (!hasError) {
-
return "in";
}
-
break;
}
- case OUT_T:{if (!hasError) {
-
+ case OUT_T:{
+ if (!hasError) {
tok = jj_consume_token(OUT_T);
}
if (!hasError) {
-
return "out";
}
-
break;
}
- case INOUT_T:{if (!hasError) {
-
+ case INOUT_T:{
+ if (!hasError) {
tok = jj_consume_token(INOUT_T);
}
if (!hasError) {
-
return "inout";
}
-
break;
}
- case BUFFER_T:{if (!hasError) {
-
+ case BUFFER_T:{
+ if (!hasError) {
tok = jj_consume_token(BUFFER_T);
}
if (!hasError) {
-
return "buffer";
}
-
break;
}
- case LINKAGE_T:{if (!hasError) {
-
+ case LINKAGE_T:{
+ if (!hasError) {
tok = jj_consume_token(LINKAGE_T);
}
if (!hasError) {
-
return "linkage";
}
-
break;
}
default:
- jj_la1[136] = jj_gen;
+ jj_la1[139] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -6042,52 +5291,44 @@ assert(false);
QCString VhdlParser::multiplying_operation() {Token *tok=0;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case MULT_T:{if (!hasError) {
-
+ case MULT_T:{
+ if (!hasError) {
tok = jj_consume_token(MULT_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
- case SLASH_T:{if (!hasError) {
-
+ case SLASH_T:{
+ if (!hasError) {
tok = jj_consume_token(SLASH_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
- case MOD_T:{if (!hasError) {
-
+ case MOD_T:{
+ if (!hasError) {
tok = jj_consume_token(MOD_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
- case REM_T:{if (!hasError) {
-
+ case REM_T:{
+ if (!hasError) {
tok = jj_consume_token(REM_T);
}
if (!hasError) {
-
return tok->image.c_str();
}
-
break;
}
default:
- jj_la1[137] = jj_gen;
+ jj_la1[140] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -6095,155 +5336,161 @@ assert(false);
}
-QCString VhdlParser::name() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::name() {QCString s,s1;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case STRINGLITERAL:{if (!hasError) {
-
+ case STRINGLITERAL:{
+ if (!hasError) {
s = operator_symbol();
}
-
- break;
+ if (!hasError) {
+ if (jj_2_51(2147483647)) {
+ if (!hasError) {
+ s1 = name_ext1();
+ }
+ if (!hasError) {
+s+=s1;
+ }
+ } else {
+ ;
}
- case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
- s = identifier();
}
-
+ if (!hasError) {
+return s;
+ }
break;
}
- case SLSL_T:{if (!hasError) {
-
+ case SLSL_T:{
+ if (!hasError) {
s = external_name();
}
-
+ if (!hasError) {
+ if (jj_2_52(2147483647)) {
+ if (!hasError) {
+ s1 = name_ext1();
+ }
+ if (!hasError) {
+s+=s1;
+ }
+ } else {
+ ;
+ }
+ }
+ if (!hasError) {
+return s;
+ }
break;
}
- default:
- jj_la1[138] = jj_gen;
- jj_consume_token(-1);
- errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
- }
- }
- if (!hasError) {
-
- if (jj_2_47(2147483647)) {if (!hasError) {
-
- s1 = name_ext1();
+ case BASIC_IDENTIFIER:
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
+ s = identifier();
}
if (!hasError) {
-
+ if (jj_2_53(2147483647)) {
+ if (!hasError) {
+ s1 = name_ext1();
+ }
+ if (!hasError) {
s+=s1;
+ }
+ } else {
+ ;
}
-
- } else {
- ;
+ }
+ if (!hasError) {
+return s;
+ }
+ break;
+ }
+ default:
+ jj_la1[141] = jj_gen;
+ jj_consume_token(-1);
+ errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-
-return s;
assert(false);
}
-QCString VhdlParser::name_ext1() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::name_ext1() {QCString s,s1,s2;
+ if (!hasError) {
s = name_ext();
}
if (!hasError) {
-
while (!hasError) {
- if (jj_2_48(2147483647)) {
+ if (jj_2_54(2147483647)) {
;
} else {
goto end_label_26;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
s1 = name_ext();
}
if (!hasError) {
-
s+=s1;
}
-
}
end_label_26: ;
}
-
return s;
assert(false);
}
-QCString VhdlParser::name_ext() {QCString s,s1,s2;if (!hasError) {
-
- if (jj_2_49(2147483647)) {if (!hasError) {
-
+QCString VhdlParser::name_ext() {QCString s,s1,s2;
+ if (!hasError) {
+ if (jj_2_55(2147483647)) {
+ if (!hasError) {
jj_consume_token(APOSTROPHE_T);
}
if (!hasError) {
-
jj_consume_token(SUBTYPE_T);
}
if (!hasError) {
-
-s+="'subtype";
+s+="'subtype"; return s;
}
-
- } else if (jj_2_50(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_56(2147483647)) {
+ if (!hasError) {
jj_consume_token(DOT_T);
}
if (!hasError) {
-
s1 = suffix();
}
if (!hasError) {
-
-s+=".";s+=s1;
+s+=".";s+=s1; return s;
}
-
- } else if (jj_2_51(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_57(2147483647)) {
+ if (!hasError) {
s1 = test_att_name();
}
if (!hasError) {
-
-s+=s1;
+s+=s1;return s;
}
-
- } else if (jj_2_52(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_58(2147483647)) {
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = discrete_range();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
-s+="(";s+=s1;s+=")";
+s+="(";s+=s1;s+=")";return s;
}
-
- } else if (jj_2_53(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_59(2147483647)) {
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
s+="(";s+=s1;
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -6251,122 +5498,99 @@ s+="(";s+=s1;
break;
}
default:
- jj_la1[139] = jj_gen;
+ jj_la1[142] = jj_gen;
goto end_label_27;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
s+=",";s+=s1;
}
-
}
end_label_27: ;
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
-s+=")";
+s+=")";return s;
}
-
} else {
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-
-return s;
assert(false);
}
-QCString VhdlParser::test_att_name() {QCString s,s1;if (!hasError) {
-
- if (jj_2_54(2147483647)) {if (!hasError) {
-
+QCString VhdlParser::test_att_name() {QCString s,s1;
+ if (!hasError) {
+ if (jj_2_60(2147483647)) {
+ if (!hasError) {
s1 = signature();
}
if (!hasError) {
-
s=s1;
}
-
} else {
;
}
}
if (!hasError) {
-
jj_consume_token(APOSTROPHE_T);
}
if (!hasError) {
-
s1 = attribute_designator();
}
if (!hasError) {
-
s+="'";s+=s1;
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
s+="(";s+=s1;s+=")";
}
-
break;
}
default:
- jj_la1[140] = jj_gen;
+ jj_la1[143] = jj_gen;
;
}
}
-
return s;
assert(false);
}
-QCString VhdlParser::indexed_name() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::indexed_name() {QCString s,s1,s2;
+ if (!hasError) {
s2 = identifier();
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
s=s2+"("+s1;
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -6374,98 +5598,83 @@ s=s2+"("+s1;
break;
}
default:
- jj_la1[141] = jj_gen;
+ jj_la1[144] = jj_gen;
goto end_label_28;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
s+=",";s+=s1;
}
-
}
end_label_28: ;
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
return s+")";
assert(false);
}
-QCString VhdlParser::next_statement() {QCString s,s1,s2;Token *t=0;Token *t1=0;if (!hasError) {
-
+QCString VhdlParser::next_statement() {QCString s,s1,s2;Token *t=0;Token *t1=0;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
t = jj_consume_token(COLON_T);
}
-
break;
}
default:
- jj_la1[142] = jj_gen;
+ jj_la1[145] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(NEXT_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s1 = identifier();
}
-
break;
}
default:
- jj_la1[143] = jj_gen;
+ jj_la1[146] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case WHEN_T:{if (!hasError) {
-
+ case WHEN_T:{
+ if (!hasError) {
t1 = jj_consume_token(WHEN_T);
}
if (!hasError) {
-
s2 = condition();
}
-
break;
}
default:
- jj_la1[144] = jj_gen;
+ jj_la1[147] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
if(t) s+=":";
FlowChart::addFlowChart(FlowChart::NEXT_NO,"next ",s2.data(),s1.data());
m_sharedState->lab.resize(0);
@@ -6475,71 +5684,61 @@ assert(false);
}
-QCString VhdlParser::null_statement() {QCString s;if (!hasError) {
-
+QCString VhdlParser::null_statement() {QCString s;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s+=":";
}
-
break;
}
default:
- jj_la1[145] = jj_gen;
+ jj_la1[148] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(NULL_T);
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
return s+="null";
assert(false);
}
QCString VhdlParser::numeric_literal() {QCString s;
- if (jj_2_55(2147483647)) {if (!hasError) {
-
+ if (jj_2_61(2147483647)) {
+ if (!hasError) {
s = physical_literal();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case INTEGER:
case DECIMAL_LITERAL:
- case BASED_LITERAL:{if (!hasError) {
-
+ case BASED_LITERAL:{
+ if (!hasError) {
s = abstract_literal();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[146] = jj_gen;
+ jj_la1[149] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -6550,78 +5749,65 @@ assert(false);
QCString VhdlParser::object_class() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
jj_consume_token(CONSTANT_T);
}
if (!hasError) {
-
return "constant";
}
-
break;
}
- case SIGNAL_T:{if (!hasError) {
-
+ case SIGNAL_T:{
+ if (!hasError) {
jj_consume_token(SIGNAL_T);
}
if (!hasError) {
-
return "signal";
}
-
break;
}
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
jj_consume_token(VARIABLE_T);
}
if (!hasError) {
-
return "variable";
}
-
break;
}
- case SHARED_T:{if (!hasError) {
-
+ case SHARED_T:{
+ if (!hasError) {
jj_consume_token(SHARED_T);
}
if (!hasError) {
-
jj_consume_token(VARIABLE_T);
}
if (!hasError) {
-
return "shared variable";
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
jj_consume_token(FILE_T);
}
if (!hasError) {
-
return "file";
}
-
break;
}
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
jj_consume_token(TYPE_T);
}
if (!hasError) {
-
return "type";
}
-
break;
}
default:
- jj_la1[147] = jj_gen;
+ jj_la1[150] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -6629,124 +5815,106 @@ assert(false);
}
-QCString VhdlParser::operator_symbol() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::operator_symbol() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(STRINGLITERAL);
}
-
return tok->image.c_str();
assert(false);
}
-void VhdlParser::options() {if (!hasError) {
-
+void VhdlParser::options() {
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GUARDED_T:{if (!hasError) {
-
+ case GUARDED_T:{
+ if (!hasError) {
jj_consume_token(GUARDED_T);
}
-
break;
}
default:
- jj_la1[148] = jj_gen;
+ jj_la1[151] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case INERTIAL_T:
case REJECT_T:
- case TRANSPORT_T:{if (!hasError) {
-
+ case TRANSPORT_T:{
+ if (!hasError) {
delay_mechanism();
}
-
break;
}
default:
- jj_la1[149] = jj_gen;
+ jj_la1[152] = jj_gen;
;
}
}
-
}
-void VhdlParser::package_body() {QCString s;if (!hasError) {
-
+void VhdlParser::package_body() {QCString s;
+ if (!hasError) {
jj_consume_token(PACKAGE_T);
}
if (!hasError) {
-
jj_consume_token(BODY_T);
}
if (!hasError) {
-
s = name();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
m_sharedState->lastCompound=m_sharedState->current;
s.prepend("_");
outlineParser()->addVhdlType(s,outlineParser()->getLine(),Entry::CLASS_SEC,VhdlDocGen::PACKAGE_BODY,0,0,Protected);
}
if (!hasError) {
-
package_body_declarative_part();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PACKAGE_T:{if (!hasError) {
-
+ case PACKAGE_T:{
+ if (!hasError) {
jj_consume_token(PACKAGE_T);
}
if (!hasError) {
-
jj_consume_token(BODY_T);
}
-
break;
}
default:
- jj_la1[150] = jj_gen;
+ jj_la1[153] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
name();
}
-
break;
}
default:
- jj_la1[151] = jj_gen;
+ jj_la1[154] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->lastCompound=0; m_sharedState->genLabels.resize(0);
}
@@ -6756,81 +5924,71 @@ void VhdlParser::package_body_declarative_item() {
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_declaration();
}
-
break;
}
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
type_declaration();
}
-
break;
}
- case SUBTYPE_T:{if (!hasError) {
-
+ case SUBTYPE_T:{
+ if (!hasError) {
subtype_declaration();
}
-
break;
}
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
constant_declaration();
}
-
break;
}
case SHARED_T:
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
variable_declaration();
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
file_declaration();
}
-
break;
}
- case ALIAS_T:{if (!hasError) {
-
+ case ALIAS_T:{
+ if (!hasError) {
alias_declaration();
}
-
break;
}
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
use_clause();
}
-
break;
}
default:
- jj_la1[152] = jj_gen;
- if (jj_2_56(3)) {if (!hasError) {
-
+ jj_la1[155] = jj_gen;
+ if (jj_2_62(3)) {
+ if (!hasError) {
group_template_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GROUP_T:{if (!hasError) {
-
+ case GROUP_T:{
+ if (!hasError) {
group_declaration();
}
-
break;
}
default:
- jj_la1[153] = jj_gen;
+ jj_la1[156] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -6839,8 +5997,8 @@ void VhdlParser::package_body_declarative_item() {
}
-void VhdlParser::package_body_declarative_part() {if (!hasError) {
-
+void VhdlParser::package_body_declarative_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ALIAS_T:
@@ -6860,34 +6018,62 @@ void VhdlParser::package_body_declarative_part() {if (!hasError) {
break;
}
default:
- jj_la1[154] = jj_gen;
+ jj_la1[157] = jj_gen;
goto end_label_29;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
package_body_declarative_item();
}
-
}
end_label_29: ;
}
-
}
-void VhdlParser::package_declaration() {QCString s;if (!hasError) {
-
+void VhdlParser::package_header() {QCString s;
+ if (!hasError) {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case GENERIC_T:{
+ if (!hasError) {
+ generic_clause();
+ }
+ if (!hasError) {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case GENERIC_T:{
+ if (!hasError) {
+ generic_map_aspect();
+ }
+ if (!hasError) {
+ jj_consume_token(SEMI_T);
+ }
+ break;
+ }
+ default:
+ jj_la1[158] = jj_gen;
+ ;
+ }
+ }
+ break;
+ }
+ default:
+ jj_la1[159] = jj_gen;
+ ;
+ }
+ }
+}
+
+
+void VhdlParser::package_declaration() {QCString s;
+ if (!hasError) {
jj_consume_token(PACKAGE_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
m_sharedState->lastCompound=m_sharedState->current;
std::shared_ptr<Entry> clone=std::make_shared<Entry>(*m_sharedState->current);
clone->section=Entry::NAMESPACE_SEC;
@@ -6900,94 +6086,83 @@ m_sharedState->lastCompound=m_sharedState->current;
outlineParser()->addVhdlType(s,outlineParser()->getLine(PACKAGE_T),Entry::CLASS_SEC,VhdlDocGen::PACKAGE,0,0,Package);
}
if (!hasError) {
-
+ package_header();
+ }
+ if (!hasError) {
package_declarative_part();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PACKAGE_T:{if (!hasError) {
-
+ case PACKAGE_T:{
+ if (!hasError) {
jj_consume_token(PACKAGE_T);
}
-
break;
}
default:
- jj_la1[155] = jj_gen;
+ jj_la1[160] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
name();
}
-
break;
}
default:
- jj_la1[156] = jj_gen;
+ jj_la1[161] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->lastEntity=0;m_sharedState->lastCompound=0; m_sharedState->genLabels.resize(0);
}
-void VhdlParser::geninter() {if (!hasError) {
-
+void VhdlParser::geninter() {
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GENERIC_T:{if (!hasError) {
-
+ case GENERIC_T:{
+ if (!hasError) {
gen_interface_list();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GENERIC_T:{if (!hasError) {
-
+ case GENERIC_T:{
+ if (!hasError) {
gen_assoc_list();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
break;
}
default:
- jj_la1[157] = jj_gen;
+ jj_la1[162] = jj_gen;
;
}
}
-
break;
}
default:
- jj_la1[158] = jj_gen;
+ jj_la1[163] = jj_gen;
;
}
}
-
}
@@ -6996,134 +6171,117 @@ void VhdlParser::package_declarative_item() {
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_declaration();
}
-
break;
}
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
type_declaration();
}
-
break;
}
- case SUBTYPE_T:{if (!hasError) {
-
+ case SUBTYPE_T:{
+ if (!hasError) {
subtype_declaration();
}
-
break;
}
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
constant_declaration();
}
-
break;
}
- case SIGNAL_T:{if (!hasError) {
-
+ case SIGNAL_T:{
+ if (!hasError) {
signal_declaration();
}
-
break;
}
case SHARED_T:
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
variable_declaration();
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
file_declaration();
}
-
break;
}
- case ALIAS_T:{if (!hasError) {
-
+ case ALIAS_T:{
+ if (!hasError) {
alias_declaration();
}
-
break;
}
- case COMPONENT_T:{if (!hasError) {
-
+ case COMPONENT_T:{
+ if (!hasError) {
component_declaration();
}
-
break;
}
default:
- jj_la1[159] = jj_gen;
- if (jj_2_57(2147483647)) {if (!hasError) {
-
+ jj_la1[164] = jj_gen;
+ if (jj_2_63(2147483647)) {
+ if (!hasError) {
attribute_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ATTRIBUTE_T:{if (!hasError) {
-
+ case ATTRIBUTE_T:{
+ if (!hasError) {
attribute_specification();
}
-
break;
}
- case DISCONNECT_T:{if (!hasError) {
-
+ case DISCONNECT_T:{
+ if (!hasError) {
disconnection_specification();
}
-
break;
}
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
use_clause();
}
-
break;
}
default:
- jj_la1[160] = jj_gen;
- if (jj_2_58(3)) {if (!hasError) {
-
+ jj_la1[165] = jj_gen;
+ if (jj_2_64(3)) {
+ if (!hasError) {
group_template_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GROUP_T:{if (!hasError) {
-
+ case GROUP_T:{
+ if (!hasError) {
group_declaration();
}
-
break;
}
default:
- jj_la1[161] = jj_gen;
- if (jj_2_59(5)) {if (!hasError) {
-
+ jj_la1[166] = jj_gen;
+ if (jj_2_65(5)) {
+ if (!hasError) {
package_instantiation_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PACKAGE_T:{if (!hasError) {
-
+ case PACKAGE_T:{
+ if (!hasError) {
package_declaration();
}
-
break;
}
default:
- jj_la1[162] = jj_gen;
+ jj_la1[167] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -7136,8 +6294,8 @@ void VhdlParser::package_declarative_item() {
}
-void VhdlParser::package_declarative_part() {if (!hasError) {
-
+void VhdlParser::package_declarative_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ALIAS_T:
@@ -7162,77 +6320,65 @@ void VhdlParser::package_declarative_part() {if (!hasError) {
break;
}
default:
- jj_la1[163] = jj_gen;
+ jj_la1[168] = jj_gen;
goto end_label_30;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
package_declarative_item();
}
-
}
end_label_30: ;
}
-
}
-QCString VhdlParser::parameter_specification() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::parameter_specification() {QCString s,s1;
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IN_T);
}
if (!hasError) {
-
s1 = discrete_range();
}
-
return s+" in "+s1;
assert(false);
}
-QCString VhdlParser::physical_literal() {QCString s,s1;if (!hasError) {
-
- if (jj_2_60(2147483647)) {if (!hasError) {
-
+QCString VhdlParser::physical_literal() {QCString s,s1;
+ if (!hasError) {
+ if (jj_2_66(2147483647)) {
+ if (!hasError) {
s = abstract_literal();
}
-
} else {
;
}
}
if (!hasError) {
-
s1 = name();
}
-
s+=" ";s+=s1;s.prepend(" "); return s;
assert(false);
}
-QCString VhdlParser::physical_type_definition() {QCString s,s1,s2;if (!hasError) {
-
- jj_consume_token(UNITS_T);
+QCString VhdlParser::physical_type_definition() {QCString s,s1,s2;Token *t=0;
+ if (!hasError) {
+ t = jj_consume_token(UNITS_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
if (!hasError) {
-
-outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::UNITS,0,0,Public);
+outlineParser()->addVhdlType(s.data(),t->beginLine,Entry::VARIABLE_SEC,VhdlDocGen::UNITS,0,0,Public);
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
@@ -7241,196 +6387,159 @@ outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE
break;
}
default:
- jj_la1[164] = jj_gen;
+ jj_la1[169] = jj_gen;
goto end_label_31;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
s1 = secondary_unit_declaration();
}
-
}
end_label_31: ;
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(UNITS_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
name();
}
-
break;
}
default:
- jj_la1[165] = jj_gen;
+ jj_la1[170] = jj_gen;
;
}
}
-
-return s+"%";
+return s;
assert(false);
}
-void VhdlParser::port_clause() {if (!hasError) {
-
+void VhdlParser::port_clause() {
+ if (!hasError) {
jj_consume_token(PORT_T);
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
port_list();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->currP=0;
}
-QCString VhdlParser::port_list() {QCString s;if (!hasError) {
-
+QCString VhdlParser::port_list() {QCString s;
+ if (!hasError) {
s = interface_list();
}
-
return s;
assert(false);
}
-void VhdlParser::port_map_aspect() {if (!hasError) {
-
+void VhdlParser::port_map_aspect() {
+ if (!hasError) {
jj_consume_token(PORT_T);
}
if (!hasError) {
-
jj_consume_token(MAP_T);
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
association_list();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
}
QCString VhdlParser::primary() {QCString s,s1;
- if (jj_2_61(2147483647)) {if (!hasError) {
-
+ if (jj_2_67(2147483647)) {
+ if (!hasError) {
s = function_call();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_62(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_68(2147483647)) {
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
s="("+s1+")"; return s;
}
-
- } else if (jj_2_63(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_69(2147483647)) {
+ if (!hasError) {
s = qualified_expression();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_64(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_70(2147483647)) {
+ if (!hasError) {
s = type_conversion();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_65(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_71(2147483647)) {
+ if (!hasError) {
s = literal();
}
if (!hasError) {
-
s.prepend(" ");return s;
}
-
- } else if (jj_2_66(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_72(2147483647)) {
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
return s;
}
-
+ } else if (jj_2_73(2147483647)) {
+ if (!hasError) {
+ allocator();
+ }
+ if (!hasError) {
+return "";
+ }
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case NEW_T:{if (!hasError) {
-
- allocator();
- }
+ case LPAREN_T:{
if (!hasError) {
-
-return "";
- }
-
- break;
- }
- case LPAREN_T:{if (!hasError) {
-
s = aggregate();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[166] = jj_gen;
+ jj_la1[171] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -7441,43 +6550,44 @@ assert(false);
void VhdlParser::primary_unit() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ENTITY_T:{if (!hasError) {
-
+ case ENTITY_T:{
+ if (!hasError) {
entity_declaration();
}
-
break;
}
- case CONFIGURATION_T:{if (!hasError) {
-
+ case CONFIGURATION_T:{
+ if (!hasError) {
configuration_declaration();
}
-
break;
}
default:
- jj_la1[167] = jj_gen;
- if (jj_2_67(2147483647)) {if (!hasError) {
-
+ jj_la1[172] = jj_gen;
+ if (jj_2_74(2147483647)) {
+ if (!hasError) {
package_instantiation_declaration();
}
-
- } else if (jj_2_68(4)) {if (!hasError) {
-
+ } else if (jj_2_75(4)) {
+ if (!hasError) {
interface_package_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PACKAGE_T:{if (!hasError) {
-
+ case PACKAGE_T:{
+ if (!hasError) {
package_declaration();
}
-
+ break;
+ }
+ case CONTEXT_T:{
+ if (!hasError) {
+ context_declaration();
+ }
break;
}
default:
- jj_la1[168] = jj_gen;
+ jj_la1[173] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -7486,71 +6596,59 @@ void VhdlParser::primary_unit() {
}
-QCString VhdlParser::procedure_call() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::procedure_call() {QCString s,s1;
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = actual_parameter_part();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
s1.prepend("("); s1.append(")");
}
-
break;
}
default:
- jj_la1[169] = jj_gen;
+ jj_la1[174] = jj_gen;
;
}
}
-
return s+s1;
assert(false);
}
-QCString VhdlParser::procedure_call_statement() {QCString s,s1;if (!hasError) {
-
- if (jj_2_69(2)) {if (!hasError) {
-
+QCString VhdlParser::procedure_call_statement() {QCString s,s1;
+ if (!hasError) {
+ if (jj_2_76(2)) {
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s+=":";
}
-
} else {
;
}
}
if (!hasError) {
-
s1 = procedure_call();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
return s+s1+";";
assert(false);
}
@@ -7561,145 +6659,121 @@ QCString VhdlParser::process_declarative_item() {QCString s;
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_declaration();
}
if (!hasError) {
-
return "";
}
-
break;
}
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
s = type_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case SUBTYPE_T:{if (!hasError) {
-
+ case SUBTYPE_T:{
+ if (!hasError) {
s = subtype_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
s = constant_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
case SHARED_T:
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
s = variable_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
s = file_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case ALIAS_T:{if (!hasError) {
-
+ case ALIAS_T:{
+ if (!hasError) {
s = alias_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[170] = jj_gen;
- if (jj_2_70(3)) {if (!hasError) {
-
+ jj_la1[175] = jj_gen;
+ if (jj_2_77(3)) {
+ if (!hasError) {
s = attribute_declaration();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ATTRIBUTE_T:{if (!hasError) {
-
+ case ATTRIBUTE_T:{
+ if (!hasError) {
s = attribute_specification();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
s = use_clause();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[171] = jj_gen;
- if (jj_2_71(3)) {if (!hasError) {
-
+ jj_la1[176] = jj_gen;
+ if (jj_2_78(3)) {
+ if (!hasError) {
s = group_template_declaration();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GROUP_T:{if (!hasError) {
-
+ case GROUP_T:{
+ if (!hasError) {
s = group_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[172] = jj_gen;
+ jj_la1[177] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -7711,8 +6785,8 @@ assert(false);
}
-QCString VhdlParser::process_declarative_part() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::process_declarative_part() {QCString s,s1;
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ALIAS_T:
@@ -7733,200 +6807,153 @@ QCString VhdlParser::process_declarative_part() {QCString s,s1;if (!hasError) {
break;
}
default:
- jj_la1[173] = jj_gen;
+ jj_la1[178] = jj_gen;
goto end_label_32;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
s1 = process_declarative_item();
}
if (!hasError) {
-
s+=s1;
}
-
}
end_label_32: ;
}
-
return s;
assert(false);
}
-void VhdlParser::process_statement() {QCString s,s1,s2;Token *tok=0;if (!hasError) {
-
+void VhdlParser::process_statement() {QCString s,s1,s2;Token *tok=0;Token *tok1=0;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
-
break;
}
default:
- jj_la1[174] = jj_gen;
+ jj_la1[179] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case POSTPONED_T:{if (!hasError) {
-
+ case POSTPONED_T:{
+ if (!hasError) {
jj_consume_token(POSTPONED_T);
}
-
break;
}
default:
- jj_la1[175] = jj_gen;
+ jj_la1[180] = jj_gen;
;
}
}
if (!hasError) {
-
-m_sharedState->currP=VhdlDocGen::PROCESS;
- m_sharedState->current->startLine=outlineParser()->getLine();
- m_sharedState->current->bodyLine=outlineParser()->getLine();
+ tok1 = jj_consume_token(PROCESS_T);
}
if (!hasError) {
-
- jj_consume_token(PROCESS_T);
+m_sharedState->currP=VhdlDocGen::PROCESS;
+ m_sharedState->current->startLine=tok1->beginLine;
+ m_sharedState->current->bodyLine=tok1->beginLine;
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
- switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ALL_T:{if (!hasError) {
-
- tok = jj_consume_token(ALL_T);
- }
-
- break;
- }
- case SLSL_T:
- case STRINGLITERAL:
- case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
- s1 = sensitivity_list();
- }
-
- break;
- }
- default:
- jj_la1[176] = jj_gen;
- jj_consume_token(-1);
- errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
+ if (!hasError) {
+ s1 = sensitivity_list();
}
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
break;
}
default:
- jj_la1[177] = jj_gen;
+ jj_la1[181] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case IS_T:{if (!hasError) {
-
+ case IS_T:{
+ if (!hasError) {
jj_consume_token(IS_T);
}
-
break;
}
default:
- jj_la1[178] = jj_gen;
+ jj_la1[182] = jj_gen;
;
}
}
if (!hasError) {
-
s2 = process_declarative_part();
}
if (!hasError) {
-
if (s2.data())
- FlowChart::addFlowChart(FlowChart::VARIABLE_NO,s2.data(),0);
+ FlowChart::addFlowChart(FlowChart::VARIABLE_NO,s2.data(),0);
FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0);
}
if (!hasError) {
-
jj_consume_token(BEGIN_T);
}
if (!hasError) {
-
process_statement_part();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case POSTPONED_T:{if (!hasError) {
-
+ case POSTPONED_T:{
+ if (!hasError) {
jj_consume_token(POSTPONED_T);
}
-
break;
}
default:
- jj_la1[179] = jj_gen;
+ jj_la1[183] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(PROCESS_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[180] = jj_gen;
+ jj_la1[184] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
if(s.isEmpty())
m_sharedState->currName=VhdlDocGen::getProcessNumber();
else
m_sharedState->currName=s;
-
m_sharedState->current->name=m_sharedState->currName;
m_sharedState->tempEntry=m_sharedState->current;
+ m_sharedState->tempEntry->type="";
m_sharedState->current->endBodyLine=outlineParser()->getLine();
m_sharedState->currP=0;
if(tok)
@@ -7938,8 +6965,8 @@ if(s.isEmpty())
}
-void VhdlParser::process_statement_part() {if (!hasError) {
-
+void VhdlParser::process_statement_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ASSERT_T:
@@ -7964,104 +6991,86 @@ void VhdlParser::process_statement_part() {if (!hasError) {
break;
}
default:
- jj_la1[181] = jj_gen;
+ jj_la1[185] = jj_gen;
goto end_label_33;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
sequential_statement();
}
-
}
end_label_33: ;
}
-
}
-QCString VhdlParser::qualified_expression() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::qualified_expression() {QCString s,s1;
+ if (!hasError) {
s1 = identifier();
}
if (!hasError) {
-
jj_consume_token(APOSTROPHE_T);
}
if (!hasError) {
-
s=s1+"'";
}
if (!hasError) {
-
- if (jj_2_72(2147483647)) {if (!hasError) {
-
+ if (jj_2_79(2147483647)) {
+ if (!hasError) {
s1 = aggregate();
}
if (!hasError) {
-
s+=s1;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
s+="(";s+=s1;s+=")";
}
-
break;
}
default:
- jj_la1[182] = jj_gen;
+ jj_la1[186] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
}
-
return s;
assert(false);
}
QCString VhdlParser::range() {QCString s,s1,s2;
- if (jj_2_73(2147483647)) {if (!hasError) {
-
+ if (jj_2_80(2147483647)) {
+ if (!hasError) {
s = simple_expression();
}
if (!hasError) {
-
s1 = direction();
}
if (!hasError) {
-
s2 = simple_expression();
}
if (!hasError) {
-
return s+" "+s1+" "+s2;
}
-
- } else if (jj_2_74(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_81(2147483647)) {
+ if (!hasError) {
s = attribute_name();
}
if (!hasError) {
-
return s;
}
-
} else {
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
@@ -8070,103 +7079,98 @@ assert(false);
}
-QCString VhdlParser::range_constraint() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::range_constraint() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(RANGE_T);
}
if (!hasError) {
-
s = range();
}
-
return " range "+s;
assert(false);
}
-void VhdlParser::record_type_definition() {if (!hasError) {
-
+void VhdlParser::record_type_definition() {
+ if (!hasError) {
jj_consume_token(RECORD_T);
}
if (!hasError) {
-
- while (!hasError) {if (!hasError) {
-
+ while (!hasError) {
+ if (!hasError) {
element_declaration();
}
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case SLSL_T:
+ case STRINGLITERAL:
case BASIC_IDENTIFIER:
case EXTENDED_CHARACTER:{
;
break;
}
default:
- jj_la1[183] = jj_gen;
+ jj_la1[187] = jj_gen;
goto end_label_34;
}
}
end_label_34: ;
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(RECORD_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
name();
}
-
break;
}
default:
- jj_la1[184] = jj_gen;
+ jj_la1[188] = jj_gen;
;
}
}
-
}
-QCString VhdlParser::relation() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::relation() {QCString s,s1,s2;
+ if (!hasError) {
s = shift_expression();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case LESSTHAN_T:
case GREATERTHAN_T:
case LT_T:
case GT_T:
case EQU_T:
- case NOTEQU_T:{if (!hasError) {
-
+ case NOTEQU_T:
+ case QGT_T:
+ case QLT_T:
+ case QG_T:
+ case QL_T:
+ case QEQU_T:
+ case QNEQU_T:{
+ if (!hasError) {
s1 = relation_operator();
}
if (!hasError) {
-
s2 = shift_expression();
}
-
break;
}
default:
- jj_la1[185] = jj_gen;
+ jj_la1[189] = jj_gen;
;
}
}
-
return s+s1+s2;
assert(false);
}
@@ -8174,74 +7178,116 @@ assert(false);
QCString VhdlParser::relation_operator() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LT_T:{if (!hasError) {
-
+ case LT_T:{
+ if (!hasError) {
jj_consume_token(LT_T);
}
if (!hasError) {
-
return "<";
}
-
break;
}
- case GT_T:{if (!hasError) {
-
+ case GT_T:{
+ if (!hasError) {
jj_consume_token(GT_T);
}
if (!hasError) {
-
return ">";
}
-
break;
}
- case EQU_T:{if (!hasError) {
-
+ case EQU_T:{
+ if (!hasError) {
jj_consume_token(EQU_T);
}
if (!hasError) {
-
return "=";
}
-
break;
}
- case GREATERTHAN_T:{if (!hasError) {
-
+ case GREATERTHAN_T:{
+ if (!hasError) {
jj_consume_token(GREATERTHAN_T);
}
if (!hasError) {
-
return ">=";
}
-
break;
}
- case LESSTHAN_T:{if (!hasError) {
-
+ case LESSTHAN_T:{
+ if (!hasError) {
jj_consume_token(LESSTHAN_T);
}
if (!hasError) {
-
return "<=";
}
-
break;
}
- case NOTEQU_T:{if (!hasError) {
-
+ case NOTEQU_T:{
+ if (!hasError) {
jj_consume_token(NOTEQU_T);
}
if (!hasError) {
-
return "/=";
}
-
+ break;
+ }
+ case QGT_T:{
+ if (!hasError) {
+ jj_consume_token(QGT_T);
+ }
+ if (!hasError) {
+return "?>=";
+ }
+ break;
+ }
+ case QLT_T:{
+ if (!hasError) {
+ jj_consume_token(QLT_T);
+ }
+ if (!hasError) {
+return "?<=";
+ }
+ break;
+ }
+ case QG_T:{
+ if (!hasError) {
+ jj_consume_token(QG_T);
+ }
+ if (!hasError) {
+return "?>";
+ }
+ break;
+ }
+ case QL_T:{
+ if (!hasError) {
+ jj_consume_token(QL_T);
+ }
+ if (!hasError) {
+return "?<";
+ }
+ break;
+ }
+ case QEQU_T:{
+ if (!hasError) {
+ jj_consume_token(QEQU_T);
+ }
+ if (!hasError) {
+return "?=";
+ }
+ break;
+ }
+ case QNEQU_T:{
+ if (!hasError) {
+ jj_consume_token(QNEQU_T);
+ }
+ if (!hasError) {
+return "?/=";
+ }
break;
}
default:
- jj_la1[186] = jj_gen;
+ jj_la1[190] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -8249,58 +7295,49 @@ assert(false);
}
-QCString VhdlParser::report_statement() {Token *t=0;Token *t1=0;QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::report_statement() {Token *t=0;Token *t1=0;QCString s,s1,s2;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
t = jj_consume_token(COLON_T);
}
-
break;
}
default:
- jj_la1[187] = jj_gen;
+ jj_la1[191] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(REPORT_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case SEVERITY_T:{if (!hasError) {
-
+ case SEVERITY_T:{
+ if (!hasError) {
t1 = jj_consume_token(SEVERITY_T);
}
if (!hasError) {
-
s2 = expression();
}
-
break;
}
default:
- jj_la1[188] = jj_gen;
+ jj_la1[192] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
if(t) s.append(":");
s1.prepend(" report ");
if(t1) s2.prepend(" severity ");
@@ -8309,45 +7346,47 @@ assert(false);
}
-QCString VhdlParser::return_statement() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::return_statement() {QCString s,s1;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s+=":";
}
-
break;
}
default:
- jj_la1[189] = jj_gen;
+ jj_la1[193] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(RETURN_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ABS_T:
+ case AND_T:
+ case NAND_T:
case NEW_T:
+ case NOR_T:
case NOT_T:
case NULL_T:
+ case OR_T:
+ case XOR_T:
+ case XNOR_T:
case LPAREN_T:
case PLUS_T:
case MINUS_T:
case SLSL_T:
+ case QQ_T:
case INTEGER:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
@@ -8355,67 +7394,62 @@ s+=":";
case CHARACTER_LITERAL:
case DECIMAL_LITERAL:
case BASED_LITERAL:
- case BIT_STRING_LITERAL:{if (!hasError) {
-
+ case BIT_STRING_LITERAL:{
+ if (!hasError) {
s1 = expression();
}
-
break;
}
default:
- jj_la1[190] = jj_gen;
+ jj_la1[194] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
return s+" return "+s1+";";
assert(false);
}
QCString VhdlParser::scalar_type_definition() {QCString s,s1;
- switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ if (jj_2_82(2147483647)) {
+ if (!hasError) {
s = enumeration_type_definition();
}
if (!hasError) {
-
return s;
}
-
- break;
- }
- case RANGE_T:{if (!hasError) {
-
- s = range_constraint();
- }
- if (!hasError) {
-
- if (jj_2_75(2147483647)) {if (!hasError) {
-
- s1 = physical_type_definition();
+ } else {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case RANGE_T:{
+ if (!hasError) {
+ s = range_constraint();
}
-
- } else {
- ;
- }
- }
- if (!hasError) {
-
-return s+" "+s1+"%";
- }
-
- break;
+ if (!hasError) {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case UNITS_T:{
+ if (!hasError) {
+ s1 = physical_type_definition();
+ }
+ break;
+ }
+ default:
+ jj_la1[195] = jj_gen;
+ ;
+ }
+ }
+ if (!hasError) {
+return s+" "+s1;
+ }
+ break;
+ }
+ default:
+ jj_la1[196] = jj_gen;
+ jj_consume_token(-1);
+ errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
- default:
- jj_la1[191] = jj_gen;
- jj_consume_token(-1);
- errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
assert(false);
}
@@ -8423,121 +7457,99 @@ assert(false);
void VhdlParser::secondary_unit() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ARCHITECTURE_T:{if (!hasError) {
-
+ case ARCHITECTURE_T:{
+ if (!hasError) {
architecture_body();
}
-
break;
}
- case PACKAGE_T:{if (!hasError) {
-
+ case PACKAGE_T:{
+ if (!hasError) {
package_body();
}
-
break;
}
default:
- jj_la1[192] = jj_gen;
+ jj_la1[197] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-QCString VhdlParser::secondary_unit_declaration() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::secondary_unit_declaration() {QCString s,s1;Token *t1=0;
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
- jj_consume_token(EQU_T);
+ t1 = jj_consume_token(EQU_T);
}
if (!hasError) {
-
s1 = physical_literal();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
-//printf("\n %s %s [%d]",s.data(),s1.data(),outlineParser()->getLine());
- outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::UNITS,0,s1.data(),Public);
-
- return s+"="+s1;
+outlineParser()->addVhdlType(s.data(),t1->beginLine,Entry::VARIABLE_SEC,VhdlDocGen::UNITS,0,s1.data(),Public);
+ return s+"="+s1;
assert(false);
}
-QCString VhdlParser::selected_name() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::selected_name() {QCString s,s1;
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(DOT_T);
}
if (!hasError) {
-
s1 = suffix();
}
-
return s+"."+s1;
assert(false);
}
-void VhdlParser::selected_signal_assignment() {if (!hasError) {
-
+void VhdlParser::selected_signal_assignment() {
+ if (!hasError) {
jj_consume_token(WITH_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
jj_consume_token(SELECT_T);
}
if (!hasError) {
-
target();
}
if (!hasError) {
-
jj_consume_token(LESSTHAN_T);
}
if (!hasError) {
-
options();
}
if (!hasError) {
-
selected_waveforms();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::selected_waveforms() {if (!hasError) {
-
+void VhdlParser::selected_waveforms() {
+ if (!hasError) {
waveform();
}
if (!hasError) {
-
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
choices();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -8545,235 +7557,217 @@ void VhdlParser::selected_waveforms() {if (!hasError) {
break;
}
default:
- jj_la1[193] = jj_gen;
+ jj_la1[198] = jj_gen;
goto end_label_35;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
waveform();
}
if (!hasError) {
-
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
choices();
}
-
}
end_label_35: ;
}
-
}
-QCString VhdlParser::sensitivity_clause() {QCString s;if (!hasError) {
-
+QCString VhdlParser::sensitivity_clause() {QCString s;
+ if (!hasError) {
jj_consume_token(ON_T);
}
if (!hasError) {
-
s = sensitivity_list();
}
-
s.prepend(" on ");
return s;
assert(false);
}
-QCString VhdlParser::sensitivity_list() {QCString s,s1;if (!hasError) {
-
- s = name();
- }
- if (!hasError) {
-
- while (!hasError) {
- switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case COMMA_T:{
- ;
- break;
- }
- default:
- jj_la1[194] = jj_gen;
- goto end_label_36;
- }if (!hasError) {
-
- jj_consume_token(COMMA_T);
+QCString VhdlParser::sensitivity_list() {QCString s,s1;Token* tok=0;
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case ALL_T:{
+ if (!hasError) {
+ tok = jj_consume_token(ALL_T);
}
if (!hasError) {
-
- s1 = name();
+if(tok) return "all" ;
+ }
+ break;
+ }
+ case SLSL_T:
+ case STRINGLITERAL:
+ case BASIC_IDENTIFIER:
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
+ s = name();
}
if (!hasError) {
-
+ while (!hasError) {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case COMMA_T:{
+ ;
+ break;
+ }
+ default:
+ jj_la1[199] = jj_gen;
+ goto end_label_36;
+ }
+ if (!hasError) {
+ jj_consume_token(COMMA_T);
+ }
+ if (!hasError) {
+ s1 = name();
+ }
+ if (!hasError) {
s+=",";s+=s1;
+ }
}
-
- }
- end_label_36: ;
- }
-
+ end_label_36: ;
+ }
+ if (!hasError) {
return s;
+ }
+ break;
+ }
+ default:
+ jj_la1[200] = jj_gen;
+ jj_consume_token(-1);
+ errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
+ }
assert(false);
}
-QCString VhdlParser::sequence_of_statement() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::sequence_of_statement() {QCString s,s1;
+ if (!hasError) {
while (!hasError) {
- if (jj_2_76(3)) {
+ if (jj_2_83(3)) {
;
} else {
goto end_label_37;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
s1 = sequential_statement();
}
if (!hasError) {
-
s+=s1;
}
-
}
end_label_37: ;
}
-
return s;
assert(false);
}
QCString VhdlParser::sequential_statement() {QCString s;
- if (jj_2_77(2147483647)) {if (!hasError) {
-
+ if (jj_2_84(2147483647)) {
+ if (!hasError) {
s = signal_assignment_statement();
}
if (!hasError) {
-
FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
}
-
- } else if (jj_2_78(3)) {if (!hasError) {
-
+ } else if (jj_2_85(3)) {
+ if (!hasError) {
s = assertion_statement();
}
if (!hasError) {
-
FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
}
-
- } else if (jj_2_79(3)) {if (!hasError) {
-
+ } else if (jj_2_86(3)) {
+ if (!hasError) {
s = report_statement();
}
if (!hasError) {
-
FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
}
-
- } else if (jj_2_80(3)) {if (!hasError) {
-
+ } else if (jj_2_87(3)) {
+ if (!hasError) {
s = wait_statement();
}
if (!hasError) {
-
FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
}
-
- } else if (jj_2_81(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_88(2147483647)) {
+ if (!hasError) {
s = variable_assignment_statement();
}
if (!hasError) {
-
FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
}
-
- } else if (jj_2_82(3)) {if (!hasError) {
-
+ } else if (jj_2_89(3)) {
+ if (!hasError) {
s = procedure_call_statement();
}
if (!hasError) {
-
FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
}
-
- } else if (jj_2_83(3)) {if (!hasError) {
-
+ } else if (jj_2_90(3)) {
+ if (!hasError) {
if_statement();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_84(3)) {if (!hasError) {
-
+ } else if (jj_2_91(3)) {
+ if (!hasError) {
case_statement();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_85(3)) {if (!hasError) {
-
+ } else if (jj_2_92(3)) {
+ if (!hasError) {
loop_statement();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_86(3)) {if (!hasError) {
-
+ } else if (jj_2_93(3)) {
+ if (!hasError) {
s = next_statement();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_87(3)) {if (!hasError) {
-
+ } else if (jj_2_94(3)) {
+ if (!hasError) {
s = exit_statement();
}
if (!hasError) {
-
return s;
}
-
- } else if (jj_2_88(3)) {if (!hasError) {
-
+ } else if (jj_2_95(3)) {
+ if (!hasError) {
s = return_statement();
}
if (!hasError) {
-
FlowChart::addFlowChart(FlowChart::RETURN_NO,s.data(),0);return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case NULL_T:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = null_statement();
}
if (!hasError) {
-
FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
}
-
break;
}
default:
- jj_la1[195] = jj_gen;
+ jj_la1[201] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -8782,35 +7776,31 @@ assert(false);
}
-QCString VhdlParser::shift_expression() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::shift_expression() {QCString s,s1,s2;
+ if (!hasError) {
s = simple_expression();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ROL_T:
case ROR_T:
case SLA_T:
case SLL_T:
case SRA_T:
- case SRL_T:{if (!hasError) {
-
+ case SRL_T:{
+ if (!hasError) {
s1 = shift_operator();
}
if (!hasError) {
-
s2 = simple_expression();
}
-
break;
}
default:
- jj_la1[196] = jj_gen;
+ jj_la1[202] = jj_gen;
;
}
}
-
return s+s1+s2;
assert(false);
}
@@ -8818,74 +7808,62 @@ assert(false);
QCString VhdlParser::shift_operator() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case SLL_T:{if (!hasError) {
-
+ case SLL_T:{
+ if (!hasError) {
jj_consume_token(SLL_T);
}
if (!hasError) {
-
return "sll";
}
-
break;
}
- case SRL_T:{if (!hasError) {
-
+ case SRL_T:{
+ if (!hasError) {
jj_consume_token(SRL_T);
}
if (!hasError) {
-
return "srl";
}
-
break;
}
- case SLA_T:{if (!hasError) {
-
+ case SLA_T:{
+ if (!hasError) {
jj_consume_token(SLA_T);
}
if (!hasError) {
-
return "sla";
}
-
break;
}
- case SRA_T:{if (!hasError) {
-
+ case SRA_T:{
+ if (!hasError) {
jj_consume_token(SRA_T);
}
if (!hasError) {
-
return "sra";
}
-
break;
}
- case ROL_T:{if (!hasError) {
-
+ case ROL_T:{
+ if (!hasError) {
jj_consume_token(ROL_T);
}
if (!hasError) {
-
return "rol";
}
-
break;
}
- case ROR_T:{if (!hasError) {
-
+ case ROR_T:{
+ if (!hasError) {
jj_consume_token(ROR_T);
}
if (!hasError) {
-
return "ror";
}
-
break;
}
default:
- jj_la1[197] = jj_gen;
+ jj_la1[203] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -8895,30 +7873,26 @@ assert(false);
QCString VhdlParser::sign() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PLUS_T:{if (!hasError) {
-
+ case PLUS_T:{
+ if (!hasError) {
jj_consume_token(PLUS_T);
}
if (!hasError) {
-
return "+";
}
-
break;
}
- case MINUS_T:{if (!hasError) {
-
+ case MINUS_T:{
+ if (!hasError) {
jj_consume_token(MINUS_T);
}
if (!hasError) {
-
return "-";
}
-
break;
}
default:
- jj_la1[198] = jj_gen;
+ jj_la1[204] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -8927,91 +7901,76 @@ assert(false);
QCString VhdlParser::signal_assignment_statement() {QCString s,s1,s2,s3;
- if (jj_2_90(2147483647)) {if (!hasError) {
-
+ if (jj_2_97(2147483647)) {
+ if (!hasError) {
conditional_signal_assignment_wave();
}
if (!hasError) {
-
return "";
}
-
- } else if (jj_2_91(2147483647)) {if (!hasError) {
-
+ } else if (jj_2_98(2147483647)) {
+ if (!hasError) {
selected_signal_assignment_wave();
}
if (!hasError) {
-
return "";
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case LPAREN_T:
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
- if (jj_2_89(2)) {if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
+ if (jj_2_96(2)) {
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s+=":";
}
-
} else {
;
}
}
if (!hasError) {
-
s1 = target();
}
if (!hasError) {
-
jj_consume_token(LESSTHAN_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case INERTIAL_T:
case REJECT_T:
- case TRANSPORT_T:{if (!hasError) {
-
+ case TRANSPORT_T:{
+ if (!hasError) {
s2 = delay_mechanism();
}
-
break;
}
default:
- jj_la1[199] = jj_gen;
+ jj_la1[205] = jj_gen;
;
}
}
if (!hasError) {
-
s3 = waveform();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
if (!hasError) {
-
return s+s1+"<="+s2+s3+";";
}
-
break;
}
default:
- jj_la1[200] = jj_gen;
+ jj_la1[206] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -9020,70 +7979,59 @@ assert(false);
}
-void VhdlParser::semi() {if (!hasError) {
-
+void VhdlParser::semi() {
+ if (!hasError) {
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::signal_declaration() {Token* tok=0;QCString s,s1,s2,s3,s4;if (!hasError) {
-
+void VhdlParser::signal_declaration() {Token* tok=0;QCString s,s1,s2,s3,s4;
+ if (!hasError) {
jj_consume_token(SIGNAL_T);
}
if (!hasError) {
-
s = identifier_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s1 = subtype_indication();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BUS_T:
- case REGISTER_T:{if (!hasError) {
-
+ case REGISTER_T:{
+ if (!hasError) {
s2 = signal_kind();
}
-
break;
}
default:
- jj_la1[201] = jj_gen;
+ jj_la1[207] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case VARASSIGN_T:{if (!hasError) {
-
+ case VARASSIGN_T:{
+ if (!hasError) {
tok = jj_consume_token(VARASSIGN_T);
}
if (!hasError) {
-
s3 = expression();
}
-
break;
}
default:
- jj_la1[202] = jj_gen;
+ jj_la1[208] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
if(tok)
s3.prepend(":=");
s4=s1+s2+s3;
@@ -9093,30 +8041,26 @@ if(tok)
QCString VhdlParser::signal_kind() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case REGISTER_T:{if (!hasError) {
-
+ case REGISTER_T:{
+ if (!hasError) {
jj_consume_token(REGISTER_T);
}
if (!hasError) {
-
return "register";
}
-
break;
}
- case BUS_T:{if (!hasError) {
-
+ case BUS_T:{
+ if (!hasError) {
jj_consume_token(BUS_T);
}
if (!hasError) {
-
return "bus";
}
-
break;
}
default:
- jj_la1[203] = jj_gen;
+ jj_la1[209] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -9129,12 +8073,11 @@ QCString VhdlParser::signal_list() {QCString s,s1;
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -9142,51 +8085,43 @@ QCString VhdlParser::signal_list() {QCString s,s1;
break;
}
default:
- jj_la1[204] = jj_gen;
+ jj_la1[210] = jj_gen;
goto end_label_38;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = name();
}
if (!hasError) {
-
s+=",";s+=s1;
}
-
}
end_label_38: ;
}
-
break;
}
- case OTHER_T:{if (!hasError) {
-
+ case OTHER_T:{
+ if (!hasError) {
jj_consume_token(OTHER_T);
}
if (!hasError) {
-
return "other";
}
-
break;
}
- case ALL_T:{if (!hasError) {
-
+ case ALL_T:{
+ if (!hasError) {
jj_consume_token(ALL_T);
}
if (!hasError) {
-
return "all";
}
-
break;
}
default:
- jj_la1[205] = jj_gen;
+ jj_la1[211] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -9194,22 +8129,20 @@ assert(false);
}
-QCString VhdlParser::signature() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::signature() {QCString s,s1,s2;
+ if (!hasError) {
jj_consume_token(LBRACKET_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -9217,169 +8150,143 @@ QCString VhdlParser::signature() {QCString s,s1,s2;if (!hasError) {
break;
}
default:
- jj_la1[206] = jj_gen;
+ jj_la1[212] = jj_gen;
goto end_label_39;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = name();
}
if (!hasError) {
-
s+=",";s+=s1;
}
-
}
end_label_39: ;
}
-
break;
}
default:
- jj_la1[207] = jj_gen;
+ jj_la1[213] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case RETURN_T:{if (!hasError) {
-
+ case RETURN_T:{
+ if (!hasError) {
jj_consume_token(RETURN_T);
}
if (!hasError) {
-
s1 = name();
}
if (!hasError) {
-
s+="return ";s+=s1;
}
-
break;
}
default:
- jj_la1[208] = jj_gen;
+ jj_la1[214] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(RBRACKET_T);
}
-
s1="["+s+"]";return s1;
assert(false);
}
-QCString VhdlParser::simple_expression() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::simple_expression() {QCString s,s1,s2;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case PLUS_T:
- case MINUS_T:{if (!hasError) {
-
+ case MINUS_T:{
+ if (!hasError) {
s = sign();
}
-
break;
}
default:
- jj_la1[209] = jj_gen;
+ jj_la1[215] = jj_gen;
;
}
}
if (!hasError) {
-
s1 = term();
}
if (!hasError) {
-
s+=s1;
}
if (!hasError) {
-
while (!hasError) {
- if (jj_2_92(2147483647)) {
+ if (jj_2_99(2147483647)) {
;
} else {
goto end_label_40;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
s1 = adding_operator();
}
if (!hasError) {
-
s2 = term();
}
if (!hasError) {
-
s+=s1;s+=s2;
}
-
}
end_label_40: ;
}
-
return s;
assert(false);
}
-void VhdlParser::simple_name() {if (!hasError) {
-
+void VhdlParser::simple_name() {
+ if (!hasError) {
name();
}
-
}
-QCString VhdlParser::slice_name() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::slice_name() {QCString s,s1;
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = discrete_range();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
return s+"("+s1+")";
assert(false);
}
-QCString VhdlParser::string_literal() {Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::string_literal() {Token *tok=0;
+ if (!hasError) {
tok = jj_consume_token(STRINGLITERAL);
}
-
return tok->image.c_str();
assert(false);
}
-void VhdlParser::subprogram_body() {QCString s;if (!hasError) {
-
+void VhdlParser::subprogram_body() {QCString s;
+ if (!hasError) {
jj_consume_token(IS_T);
}
if (!hasError) {
-
//try{
s = subprogram_declarative_part();
}
if (!hasError) {
-
if (s.data())
{
FlowChart::addFlowChart(FlowChart::VARIABLE_NO,s,0);
@@ -9387,55 +8294,46 @@ if (s.data())
FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0);
}
if (!hasError) {
-
jj_consume_token(BEGIN_T);
}
if (!hasError) {
-
subprogram_statement_part();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case FUNCTION_T:
- case PROCEDURE_T:{if (!hasError) {
-
+ case PROCEDURE_T:{
+ if (!hasError) {
subprogram_kind();
}
-
break;
}
default:
- jj_la1[210] = jj_gen;
+ jj_la1[216] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
designator();
}
-
break;
}
default:
- jj_la1[211] = jj_gen;
+ jj_la1[217] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->tempEntry->endBodyLine=outlineParser()->getLine(END_T);
outlineParser()->createFlow();
m_sharedState->currP=0;
@@ -9443,33 +8341,29 @@ m_sharedState->tempEntry->endBodyLine=outlineParser()->getLine(END_T);
void VhdlParser::subprogram_declaration() {
- if (jj_2_93(2147483647)) {if (!hasError) {
-
+ if (jj_2_100(2147483647)) {
+ if (!hasError) {
subprogram_instantiation_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_specification();
}
if (!hasError) {
-
subprogram_1();
}
if (!hasError) {
-
m_sharedState->currP=0;
}
-
break;
}
default:
- jj_la1[212] = jj_gen;
+ jj_la1[218] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -9479,22 +8373,20 @@ m_sharedState->currP=0;
void VhdlParser::subprogram_1() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case IS_T:{if (!hasError) {
-
+ case IS_T:{
+ if (!hasError) {
subprogram_body();
}
-
break;
}
- case SEMI_T:{if (!hasError) {
-
+ case SEMI_T:{
+ if (!hasError) {
jj_consume_token(SEMI_T);
}
-
break;
}
default:
- jj_la1[213] = jj_gen;
+ jj_la1[219] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -9506,156 +8398,130 @@ QCString VhdlParser::subprogram_declarative_item() {QCString s;
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_declaration();
}
if (!hasError) {
-
return "";
}
-
break;
}
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
s = type_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case IS_T:{if (!hasError) {
-
+ case IS_T:{
+ if (!hasError) {
subprogram_body();
}
if (!hasError) {
-
return "";
}
-
break;
}
- case SUBTYPE_T:{if (!hasError) {
-
+ case SUBTYPE_T:{
+ if (!hasError) {
s = subtype_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
s = constant_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
case SHARED_T:
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
s = variable_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
s = file_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case ALIAS_T:{if (!hasError) {
-
+ case ALIAS_T:{
+ if (!hasError) {
s = alias_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[214] = jj_gen;
- if (jj_2_94(2147483647)) {if (!hasError) {
-
+ jj_la1[220] = jj_gen;
+ if (jj_2_101(2147483647)) {
+ if (!hasError) {
s = attribute_declaration();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ATTRIBUTE_T:{if (!hasError) {
-
+ case ATTRIBUTE_T:{
+ if (!hasError) {
s = attribute_specification();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
s = use_clause();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[215] = jj_gen;
- if (jj_2_95(3)) {if (!hasError) {
-
+ jj_la1[221] = jj_gen;
+ if (jj_2_102(3)) {
+ if (!hasError) {
s = group_template_declaration();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GROUP_T:{if (!hasError) {
-
+ case GROUP_T:{
+ if (!hasError) {
s = group_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[216] = jj_gen;
+ jj_la1[222] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -9667,8 +8533,8 @@ assert(false);
}
-QCString VhdlParser::subprogram_declarative_part() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::subprogram_declarative_part() {QCString s,s1;
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ALIAS_T:
@@ -9690,21 +8556,18 @@ QCString VhdlParser::subprogram_declarative_part() {QCString s,s1;if (!hasError)
break;
}
default:
- jj_la1[217] = jj_gen;
+ jj_la1[223] = jj_gen;
goto end_label_41;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
s1 = subprogram_declarative_item();
}
if (!hasError) {
-
s+=s1;
}
-
}
end_label_41: ;
}
-
return s;
assert(false);
}
@@ -9712,22 +8575,20 @@ assert(false);
void VhdlParser::subprogram_kind() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case FUNCTION_T:{if (!hasError) {
-
+ case FUNCTION_T:{
+ if (!hasError) {
jj_consume_token(FUNCTION_T);
}
-
break;
}
- case PROCEDURE_T:{if (!hasError) {
-
+ case PROCEDURE_T:{
+ if (!hasError) {
jj_consume_token(PROCEDURE_T);
}
-
break;
}
default:
- jj_la1[218] = jj_gen;
+ jj_la1[224] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -9736,16 +8597,14 @@ void VhdlParser::subprogram_kind() {
void VhdlParser::subprogram_specification() {QCString s;Token *tok=0;Token *t;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PROCEDURE_T:{if (!hasError) {
-
+ case PROCEDURE_T:{
+ if (!hasError) {
jj_consume_token(PROCEDURE_T);
}
if (!hasError) {
-
s = designator();
}
if (!hasError) {
-
m_sharedState->currP=VhdlDocGen::PROCEDURE;
outlineParser()->createFunction(s.data(),m_sharedState->currP,0);
m_sharedState->tempEntry=m_sharedState->current;
@@ -9753,116 +8612,97 @@ m_sharedState->currP=VhdlDocGen::PROCEDURE;
m_sharedState->current->bodyLine=outlineParser()->getLine(PROCEDURE_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
m_sharedState->param_sec=PARAM_SEC;
}
if (!hasError) {
-
interface_list();
}
if (!hasError) {
-
m_sharedState->param_sec=0;
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
break;
}
default:
- jj_la1[219] = jj_gen;
+ jj_la1[225] = jj_gen;
;
}
}
if (!hasError) {
-
- if (jj_2_96(2)) {if (!hasError) {
-
+ if (jj_2_103(2)) {
+ if (!hasError) {
gen_interface_list();
}
-
} else {
;
}
}
if (!hasError) {
-
- if (jj_2_97(2)) {if (!hasError) {
-
+ if (jj_2_104(2)) {
+ if (!hasError) {
gen_assoc_list();
}
-
} else {
;
}
}
if (!hasError) {
-
param();
}
if (!hasError) {
-
outlineParser()->newEntry();
}
-
break;
}
case FUNCTION_T:
case IMPURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IMPURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
tok = jj_consume_token(PURE_T);
}
-
break;
}
- case IMPURE_T:{if (!hasError) {
-
+ case IMPURE_T:{
+ if (!hasError) {
tok = jj_consume_token(IMPURE_T);
}
-
break;
}
default:
- jj_la1[220] = jj_gen;
+ jj_la1[226] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-
break;
}
default:
- jj_la1[221] = jj_gen;
+ jj_la1[227] = jj_gen;
;
}
}
if (!hasError) {
-
t = jj_consume_token(FUNCTION_T);
}
if (!hasError) {
-
s = designator();
}
if (!hasError) {
-
m_sharedState->currP=VhdlDocGen::FUNCTION;
if(tok)
outlineParser()->createFunction(tok->image.c_str(),m_sharedState->currP,s.data());
@@ -9873,63 +8713,53 @@ m_sharedState->currP=VhdlDocGen::FUNCTION;
m_sharedState->current->bodyLine=outlineParser()->getLine(FUNCTION_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
m_sharedState->param_sec=PARAM_SEC;
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
formal_parameter_list();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
m_sharedState->param_sec=0;
}
-
break;
}
default:
- jj_la1[222] = jj_gen;
+ jj_la1[228] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(RETURN_T);
}
if (!hasError) {
-
s = type_mark();
}
if (!hasError) {
-
m_sharedState->tempEntry=m_sharedState->current;
m_sharedState->current->type=s;
outlineParser()->newEntry();
}
-
break;
}
default:
- jj_la1[223] = jj_gen;
+ jj_la1[229] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-void VhdlParser::subprogram_statement_part() {if (!hasError) {
-
+void VhdlParser::subprogram_statement_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ASSERT_T:
@@ -9954,126 +8784,138 @@ void VhdlParser::subprogram_statement_part() {if (!hasError) {
break;
}
default:
- jj_la1[224] = jj_gen;
+ jj_la1[230] = jj_gen;
goto end_label_42;
- }if (!hasError) {
-
+ }
+ if (!hasError) {
sequential_statement();
}
-
}
end_label_42: ;
}
-
}
-QCString VhdlParser::subtype_declaration() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::subtype_declaration() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(SUBTYPE_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
s1 = subtype_indication();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::SUBTYPE,0,s1.data(),Public);
return " subtype "+s+" is "+s1+";";
assert(false);
}
-QCString VhdlParser::subtype_indication() {QCString s,s1,s2;if (!hasError) {
-
- s = name();
+QCString VhdlParser::reslution_indication() {QCString s;
+ if (!hasError) {
+ jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
- if (jj_2_98(2147483647)) {if (!hasError) {
-
- s1 = name();
+ s = expression();
+ }
+ if (!hasError) {
+ jj_consume_token(RPAREN_T);
+ }
+return "("+s+")";
+assert(false);
+}
+
+
+QCString VhdlParser::subtype_indication() {QCString s,s1,s2;
+ if (!hasError) {
+ if (jj_2_105(5)) {
+ if (!hasError) {
+ s = reslution_indication();
}
-
} else {
;
}
}
if (!hasError) {
-
- if (jj_2_99(2147483647)) {if (!hasError) {
-
+ while (!hasError) {
+ if (!hasError) {
+ s1 = name();
+ }
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case SLSL_T:
+ case STRINGLITERAL:
+ case BASIC_IDENTIFIER:
+ case EXTENDED_CHARACTER:{
+ ;
+ break;
+ }
+ default:
+ jj_la1[231] = jj_gen;
+ goto end_label_43;
+ }
+ }
+ end_label_43: ;
+ }
+ if (!hasError) {
+ if (jj_2_106(2147483647)) {
+ if (!hasError) {
s2 = constraint();
}
-
} else {
;
}
}
-
return s+" "+s1+" "+s2;
assert(false);
}
QCString VhdlParser::suffix() {QCString s;
- if (jj_2_100(2147483647)) {if (!hasError) {
-
+ if (jj_2_107(2147483647)) {
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case CHARACTER_LITERAL:{if (!hasError) {
-
+ case CHARACTER_LITERAL:{
+ if (!hasError) {
s = character_literal();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case STRINGLITERAL:{if (!hasError) {
-
+ case STRINGLITERAL:{
+ if (!hasError) {
s = operator_symbol();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case ALL_T:{if (!hasError) {
-
+ case ALL_T:{
+ if (!hasError) {
jj_consume_token(ALL_T);
}
if (!hasError) {
-
return " all ";
}
-
break;
}
default:
- jj_la1[225] = jj_gen;
+ jj_la1[232] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -10087,30 +8929,26 @@ QCString VhdlParser::target() {QCString s;
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
s = aggregate();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[226] = jj_gen;
+ jj_la1[233] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -10118,100 +8956,85 @@ assert(false);
}
-QCString VhdlParser::term() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::term() {QCString s,s1,s2;
+ if (!hasError) {
s = factor();
}
if (!hasError) {
-
while (!hasError) {
- if (jj_2_101(2)) {
+ if (jj_2_108(2)) {
;
} else {
- goto end_label_43;
- }if (!hasError) {
-
+ goto end_label_44;
+ }
+ if (!hasError) {
s1 = multiplying_operation();
}
if (!hasError) {
-
s2 = factor();
}
if (!hasError) {
-
s+=s1;s+=s2;
}
-
}
- end_label_43: ;
+ end_label_44: ;
}
-
return s;
assert(false);
}
-QCString VhdlParser::timeout_clause() {QCString s;if (!hasError) {
-
+QCString VhdlParser::timeout_clause() {QCString s;
+ if (!hasError) {
jj_consume_token(FOR_T);
}
if (!hasError) {
-
s = expression();
}
-
return " for "+s;
assert(false);
}
-QCString VhdlParser::type_conversion() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::type_conversion() {QCString s,s1;
+ if (!hasError) {
s = name();
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
return s+"("+s1+")";
assert(false);
}
QCString VhdlParser::type_declaration() {QCString s;
- if (jj_2_102(3)) {if (!hasError) {
-
+ if (jj_2_109(3)) {
+ if (!hasError) {
s = full_type_declaration();
}
if (!hasError) {
-
return s;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
s = incomplete_type_declaration();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[227] = jj_gen;
+ jj_la1[234] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -10223,78 +9046,66 @@ assert(false);
QCString VhdlParser::type_definition() {QCString s;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case RANGE_T:
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
//try{
s = scalar_type_definition();
}
if (!hasError) {
-
return s;
}
-
break;
}
case ARRAY_T:
- case RECORD_T:{if (!hasError) {
-
+ case RECORD_T:{
+ if (!hasError) {
s = composite_type_definition();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case ACCESS_T:{if (!hasError) {
-
+ case ACCESS_T:{
+ if (!hasError) {
s = access_type_definition();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
s = file_type_definition();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[228] = jj_gen;
- if (jj_2_103(2)) {if (!hasError) {
-
+ jj_la1[235] = jj_gen;
+ if (jj_2_110(2)) {
+ if (!hasError) {
protected_type_body();
}
if (!hasError) {
-
return "";
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PROTECTED_T:{if (!hasError) {
-
+ case PROTECTED_T:{
+ if (!hasError) {
protected_type_declaration();
}
if (!hasError) {
-
return "";
}
-
break;
}
default:
- jj_la1[229] = jj_gen;
+ jj_la1[236] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -10304,30 +9115,26 @@ assert(false);
}
-QCString VhdlParser::type_mark() {QCString s;if (!hasError) {
-
+QCString VhdlParser::type_mark() {QCString s;
+ if (!hasError) {
s = name();
}
-
return s;
assert(false);
}
-QCString VhdlParser::unconstraint_array_definition() {QCString s,s1,s2,s3;if (!hasError) {
-
+QCString VhdlParser::unconstraint_array_definition() {QCString s,s1,s2,s3;
+ if (!hasError) {
jj_consume_token(ARRAY_T);
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s = index_subtype_definition();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -10335,52 +9142,43 @@ QCString VhdlParser::unconstraint_array_definition() {QCString s,s1,s2,s3;if (!h
break;
}
default:
- jj_la1[230] = jj_gen;
- goto end_label_44;
- }if (!hasError) {
-
+ jj_la1[237] = jj_gen;
+ goto end_label_45;
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = index_subtype_definition();
}
if (!hasError) {
-
s3+=",";s3+=s1;
}
-
}
- end_label_44: ;
+ end_label_45: ;
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
if (!hasError) {
-
jj_consume_token(OF_T);
}
if (!hasError) {
-
s2 = subtype_indication();
}
-
return "array("+s+s3+") of "+s2;
assert(false);
}
-QCString VhdlParser::use_clause() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::use_clause() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(USE_T);
}
if (!hasError) {
-
s = selected_name();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -10388,29 +9186,24 @@ QCString VhdlParser::use_clause() {QCString s,s1;if (!hasError) {
break;
}
default:
- jj_la1[231] = jj_gen;
- goto end_label_45;
- }if (!hasError) {
-
+ jj_la1[238] = jj_gen;
+ goto end_label_46;
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = selected_name();
}
if (!hasError) {
-
s+=",";s+=s1;
}
-
}
- end_label_45: ;
+ end_label_46: ;
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
QCStringList ql1=QCStringList::split(",",s);
for (uint j=0;j<ql1.count();j++)
{
@@ -10433,61 +9226,50 @@ QCString VhdlParser::variable_assignment_statement() {QCString s,s1,s2;
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
- if (jj_2_104(2)) {if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
+ if (jj_2_111(2)) {
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s+=":";
}
-
} else {
;
}
}
if (!hasError) {
-
s1 = target();
}
if (!hasError) {
-
jj_consume_token(VARASSIGN_T);
}
if (!hasError) {
-
s2 = expression();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
if (!hasError) {
-
return s+s1+":="+s2+";";
}
-
break;
}
- case WITH_T:{if (!hasError) {
-
+ case WITH_T:{
+ if (!hasError) {
selected_variable_assignment();
}
if (!hasError) {
-
return "";
}
-
break;
}
default:
- jj_la1[232] = jj_gen;
+ jj_la1[239] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -10495,61 +9277,51 @@ assert(false);
}
-QCString VhdlParser::variable_declaration() {Token *tok=0;Token *t1=0;QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::variable_declaration() {Token *tok=0;Token *t1=0;QCString s,s1,s2;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case SHARED_T:{if (!hasError) {
-
+ case SHARED_T:{
+ if (!hasError) {
tok = jj_consume_token(SHARED_T);
}
-
break;
}
default:
- jj_la1[233] = jj_gen;
+ jj_la1[240] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(VARIABLE_T);
}
if (!hasError) {
-
s = identifier_list();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s1 = subtype_indication();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case VARASSIGN_T:{if (!hasError) {
-
+ case VARASSIGN_T:{
+ if (!hasError) {
t1 = jj_consume_token(VARASSIGN_T);
}
if (!hasError) {
-
s2 = expression();
}
-
break;
}
default:
- jj_la1[234] = jj_gen;
+ jj_la1[241] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
int spec;
if(t1)
s2.prepend(":=");
@@ -10575,80 +9347,69 @@ assert(false);
}
-QCString VhdlParser::wait_statement() {QCString s,s1,s2,s3;Token *t=0;if (!hasError) {
-
+QCString VhdlParser::wait_statement() {QCString s,s1,s2,s3;Token *t=0;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
t = jj_consume_token(COLON_T);
}
-
break;
}
default:
- jj_la1[235] = jj_gen;
+ jj_la1[242] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(WAIT_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ON_T:{if (!hasError) {
-
+ case ON_T:{
+ if (!hasError) {
s1 = sensitivity_clause();
}
-
break;
}
default:
- jj_la1[236] = jj_gen;
+ jj_la1[243] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case UNTIL_T:{if (!hasError) {
-
+ case UNTIL_T:{
+ if (!hasError) {
s2 = condition_clause();
}
-
break;
}
default:
- jj_la1[237] = jj_gen;
+ jj_la1[244] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case FOR_T:{if (!hasError) {
-
+ case FOR_T:{
+ if (!hasError) {
s3 = timeout_clause();
}
-
break;
}
default:
- jj_la1[238] = jj_gen;
+ jj_la1[245] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
if(t) s.append(":");
return s+" wait "+s1+s2+s3+";";
assert(false);
@@ -10658,13 +9419,20 @@ assert(false);
QCString VhdlParser::waveform() {QCString s,s1;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ABS_T:
+ case AND_T:
+ case NAND_T:
case NEW_T:
+ case NOR_T:
case NOT_T:
case NULL_T:
+ case OR_T:
+ case XOR_T:
+ case XNOR_T:
case LPAREN_T:
case PLUS_T:
case MINUS_T:
case SLSL_T:
+ case QQ_T:
case INTEGER:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
@@ -10672,12 +9440,11 @@ QCString VhdlParser::waveform() {QCString s,s1;
case CHARACTER_LITERAL:
case DECIMAL_LITERAL:
case BASED_LITERAL:
- case BIT_STRING_LITERAL:{if (!hasError) {
-
+ case BIT_STRING_LITERAL:{
+ if (!hasError) {
s = waveform_element();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -10685,44 +9452,37 @@ QCString VhdlParser::waveform() {QCString s,s1;
break;
}
default:
- jj_la1[239] = jj_gen;
- goto end_label_46;
- }if (!hasError) {
-
+ jj_la1[246] = jj_gen;
+ goto end_label_47;
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
s1 = waveform_element();
}
if (!hasError) {
-
s+=","; s+=s1;
}
-
}
- end_label_46: ;
+ end_label_47: ;
}
if (!hasError) {
-
return s;
}
-
break;
}
- case UNAFFECTED_T:{if (!hasError) {
-
+ case UNAFFECTED_T:{
+ if (!hasError) {
jj_consume_token(UNAFFECTED_T);
}
if (!hasError) {
-
return " unaffected ";
}
-
break;
}
default:
- jj_la1[240] = jj_gen;
+ jj_la1[247] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -10730,80 +9490,67 @@ assert(false);
}
-QCString VhdlParser::waveform_element() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::waveform_element() {QCString s,s1;
+ if (!hasError) {
s = expression();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case AFTER_T:{if (!hasError) {
-
+ case AFTER_T:{
+ if (!hasError) {
jj_consume_token(AFTER_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
s1.prepend(" after ");
}
-
break;
}
default:
- jj_la1[241] = jj_gen;
+ jj_la1[248] = jj_gen;
;
}
}
-
return s+s1;
assert(false);
}
-QCString VhdlParser::protected_type_body() {if (!hasError) {
-
+QCString VhdlParser::protected_type_body() {
+ if (!hasError) {
jj_consume_token(PROTECTED_T);
}
if (!hasError) {
-
jj_consume_token(BODY_T);
}
if (!hasError) {
-
protected_type_body_declarative_part();
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(PROTECTED_T);
}
if (!hasError) {
-
jj_consume_token(BODY_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[242] = jj_gen;
+ jj_la1[249] = jj_gen;
;
}
}
-
return "";
assert(false);
}
@@ -10814,104 +9561,91 @@ void VhdlParser::protected_type_body_declarative_item() {
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_declaration();
}
-
break;
}
- case IS_T:{if (!hasError) {
-
+ case IS_T:{
+ if (!hasError) {
subprogram_body();
}
-
break;
}
- case TYPE_T:{if (!hasError) {
-
+ case TYPE_T:{
+ if (!hasError) {
type_declaration();
}
-
break;
}
- case SUBTYPE_T:{if (!hasError) {
-
+ case SUBTYPE_T:{
+ if (!hasError) {
subtype_declaration();
}
-
break;
}
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
constant_declaration();
}
-
break;
}
case SHARED_T:
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
variable_declaration();
}
-
break;
}
- case FILE_T:{if (!hasError) {
-
+ case FILE_T:{
+ if (!hasError) {
file_declaration();
}
-
break;
}
- case ALIAS_T:{if (!hasError) {
-
+ case ALIAS_T:{
+ if (!hasError) {
alias_declaration();
}
-
break;
}
default:
- jj_la1[243] = jj_gen;
- if (jj_2_105(2147483647)) {if (!hasError) {
-
+ jj_la1[250] = jj_gen;
+ if (jj_2_112(2147483647)) {
+ if (!hasError) {
attribute_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ATTRIBUTE_T:{if (!hasError) {
-
+ case ATTRIBUTE_T:{
+ if (!hasError) {
attribute_specification();
}
-
break;
}
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
use_clause();
}
-
break;
}
default:
- jj_la1[244] = jj_gen;
- if (jj_2_106(3)) {if (!hasError) {
-
+ jj_la1[251] = jj_gen;
+ if (jj_2_113(3)) {
+ if (!hasError) {
group_template_declaration();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GROUP_T:{if (!hasError) {
-
+ case GROUP_T:{
+ if (!hasError) {
group_declaration();
}
-
break;
}
default:
- jj_la1[245] = jj_gen;
+ jj_la1[252] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -10922,8 +9656,8 @@ void VhdlParser::protected_type_body_declarative_item() {
}
-void VhdlParser::protected_type_body_declarative_part() {if (!hasError) {
-
+void VhdlParser::protected_type_body_declarative_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ALIAS_T:
@@ -10945,60 +9679,51 @@ void VhdlParser::protected_type_body_declarative_part() {if (!hasError) {
break;
}
default:
- jj_la1[246] = jj_gen;
- goto end_label_47;
- }if (!hasError) {
-
+ jj_la1[253] = jj_gen;
+ goto end_label_48;
+ }
+ if (!hasError) {
protected_type_body_declarative_item();
}
-
}
- end_label_47: ;
+ end_label_48: ;
}
-
}
-QCString VhdlParser::protected_type_declaration() {if (!hasError) {
-
+QCString VhdlParser::protected_type_declaration() {
+ if (!hasError) {
jj_consume_token(PROTECTED_T);
}
if (!hasError) {
-
- try {if (!hasError) {
-
+ try {
+ if (!hasError) {
protected_type_declarative_part();
}
-
} catch ( ...) {
outlineParser()->error_skipto(END_T);
}
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(PROTECTED_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[247] = jj_gen;
+ jj_la1[254] = jj_gen;
;
}
}
-
return "";
assert(false);
}
@@ -11009,37 +9734,34 @@ void VhdlParser::protected_type_declarative_item() {
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_specification();
}
-
break;
}
- case ATTRIBUTE_T:{if (!hasError) {
-
+ case ATTRIBUTE_T:{
+ if (!hasError) {
attribute_specification();
}
-
break;
}
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
use_clause();
}
-
break;
}
default:
- jj_la1[248] = jj_gen;
+ jj_la1[255] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-void VhdlParser::protected_type_declarative_part() {if (!hasError) {
-
+void VhdlParser::protected_type_declarative_part() {
+ if (!hasError) {
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ATTRIBUTE_T:
@@ -11052,60 +9774,73 @@ void VhdlParser::protected_type_declarative_part() {if (!hasError) {
break;
}
default:
- jj_la1[249] = jj_gen;
- goto end_label_48;
- }if (!hasError) {
-
+ jj_la1[256] = jj_gen;
+ goto end_label_49;
+ }
+ if (!hasError) {
protected_type_declarative_item();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
- end_label_48: ;
+ end_label_49: ;
}
-
}
-QCString VhdlParser::context_ref() {QCString s;if (!hasError) {
-
+QCString VhdlParser::context_ref() {QCString s, s1;
+ if (!hasError) {
jj_consume_token(CONTEXT_T);
}
if (!hasError) {
-
- s = identifier_list();
+ s = identifier();
+ }
+ if (!hasError) {
+ while (!hasError) {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case DOT_T:{
+ ;
+ break;
+ }
+ default:
+ jj_la1[257] = jj_gen;
+ goto end_label_50;
+ }
+ if (!hasError) {
+ jj_consume_token(DOT_T);
+ }
+ if (!hasError) {
+ s1 = identifier();
+ }
+ if (!hasError) {
+s+=".";s+=s1;
+ }
+ }
+ end_label_50: ;
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
return "context "+s ;
assert(false);
}
-void VhdlParser::context_declaration() {QCString s,s1;if (!hasError) {
-
+void VhdlParser::context_declaration() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(CONTEXT_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
m_sharedState->parse_sec=CONTEXT_SEC;
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case CONTEXT_T:
@@ -11115,56 +9850,48 @@ m_sharedState->parse_sec=CONTEXT_SEC;
break;
}
default:
- jj_la1[250] = jj_gen;
- goto end_label_49;
- }if (!hasError) {
-
+ jj_la1[258] = jj_gen;
+ goto end_label_51;
+ }
+ if (!hasError) {
s1 = libustcont_stats();
}
-
}
- end_label_49: ;
+ end_label_51: ;
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case CONTEXT_T:{if (!hasError) {
-
+ case CONTEXT_T:{
+ if (!hasError) {
jj_consume_token(CONTEXT_T);
}
-
break;
}
default:
- jj_la1[251] = jj_gen;
+ jj_la1[259] = jj_gen;
;
}
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[252] = jj_gen;
+ jj_la1[260] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
m_sharedState->parse_sec=0;
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(LIBRARY_T),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,"context",s1.data(),Public);
}
@@ -11172,41 +9899,35 @@ m_sharedState->parse_sec=0;
QCString VhdlParser::libustcont_stats() {QCString s;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case USE_T:{if (!hasError) {
-
+ case USE_T:{
+ if (!hasError) {
s = use_clause();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case LIBRARY_T:{if (!hasError) {
-
+ case LIBRARY_T:{
+ if (!hasError) {
s = library_clause();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case CONTEXT_T:{if (!hasError) {
-
+ case CONTEXT_T:{
+ if (!hasError) {
s = context_ref();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[253] = jj_gen;
+ jj_la1[261] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -11214,141 +9935,116 @@ assert(false);
}
-void VhdlParser::package_instantiation_declaration() {QCString s,s1,s2;if (!hasError) {
-
+void VhdlParser::package_instantiation_declaration() {QCString s,s1,s2;
+ if (!hasError) {
jj_consume_token(PACKAGE_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
jj_consume_token(NEW_T);
}
if (!hasError) {
-
s1 = name();
}
if (!hasError) {
-
s2 = signature();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GENERIC_T:{if (!hasError) {
-
+ case GENERIC_T:{
+ if (!hasError) {
gen_assoc_list();
}
-
break;
}
default:
- jj_la1[254] = jj_gen;
+ jj_la1[262] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
QCString q=" is new "+s1+s2;
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(PACKAGE_T),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"package",q.data(),Public);
}
-QCString VhdlParser::interface_package_declaration() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::interface_package_declaration() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(PACKAGE_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
jj_consume_token(NEW_T);
}
if (!hasError) {
-
s1 = name();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GENERIC_T:{if (!hasError) {
-
+ case GENERIC_T:{
+ if (!hasError) {
gen_assoc_list();
}
-
break;
}
default:
- jj_la1[255] = jj_gen;
+ jj_la1[263] = jj_gen;
;
}
}
-
m_sharedState->current->name=s;
return "package "+s+" is new "+s1;
assert(false);
}
-QCString VhdlParser::subprogram_instantiation_declaration() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::subprogram_instantiation_declaration() {QCString s,s1,s2;
+ if (!hasError) {
jj_consume_token(FUNCTION_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
jj_consume_token(IS_T);
}
if (!hasError) {
-
jj_consume_token(NEW_T);
}
if (!hasError) {
-
s1 = name();
}
if (!hasError) {
-
s2 = signature();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case GENERIC_T:{if (!hasError) {
-
+ case GENERIC_T:{
+ if (!hasError) {
gen_assoc_list();
}
-
break;
}
default:
- jj_la1[256] = jj_gen;
+ jj_la1[264] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
QCString q= " is new "+s1+s2;
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(FUNCTION_T),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"function ",q.data(),Public);
return q;
@@ -11356,199 +10052,154 @@ assert(false);
}
-void VhdlParser::gen_assoc_list() {if (!hasError) {
-
+void VhdlParser::gen_assoc_list() {
+ if (!hasError) {
jj_consume_token(GENERIC_T);
}
if (!hasError) {
-
jj_consume_token(MAP_T);
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
association_list();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
}
-void VhdlParser::gen_interface_list() {if (!hasError) {
-
+void VhdlParser::gen_interface_list() {
+ if (!hasError) {
jj_consume_token(GENERIC_T);
}
if (!hasError) {
-
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
//int u=s_str.iLine;
m_sharedState->parse_sec=GEN_SEC;
}
if (!hasError) {
-
interface_list();
}
if (!hasError) {
-
// QCString vo=$3;
m_sharedState->parse_sec=0;
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
}
-void VhdlParser::case_scheme() {if (!hasError) {
-
+void VhdlParser::case_scheme() {
+ if (!hasError) {
jj_consume_token(CASE_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
jj_consume_token(GENERATE_T);
}
if (!hasError) {
-
when_stats();
}
if (!hasError) {
-
- if (jj_2_107(3)) {if (!hasError) {
-
+ if (jj_2_114(3)) {
+ if (!hasError) {
ttend();
}
-
} else {
;
}
}
if (!hasError) {
-
jj_consume_token(END_T);
}
if (!hasError) {
-
jj_consume_token(GENERATE_T);
}
if (!hasError) {
-
generate_statement_body();
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::when_stats() {if (!hasError) {
-
- while (!hasError) {if (!hasError) {
-
+void VhdlParser::when_stats() {
+ if (!hasError) {
+ while (!hasError) {
+ if (!hasError) {
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
- if (jj_2_108(2)) {if (!hasError) {
-
+ if (jj_2_115(2)) {
+ if (!hasError) {
label();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
-
} else {
;
}
}
if (!hasError) {
-
choices();
}
if (!hasError) {
-
jj_consume_token(ARROW_T);
}
if (!hasError) {
-
generate_statement_body();
}
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case WHEN_T:{
;
break;
}
default:
- jj_la1[257] = jj_gen;
- goto end_label_50;
+ jj_la1[265] = jj_gen;
+ goto end_label_52;
}
}
- end_label_50: ;
+ end_label_52: ;
}
-
}
-void VhdlParser::ttend() {if (!hasError) {
-
+void VhdlParser::ttend() {
+ if (!hasError) {
jj_consume_token(END_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
identifier();
}
-
break;
}
default:
- jj_la1[258] = jj_gen;
+ jj_la1[266] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::generate_statement_body() {if (!hasError) {
-
- jj_consume_token(BEGIN_T);
- }
+void VhdlParser::generate_statement_body() {
if (!hasError) {
-
- generate_statement_body();
- }
-
-}
-
-
-void VhdlParser::generate_statement_body1() {if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ALIAS_T:
case ATTRIBUTE_T:
@@ -11568,35 +10219,31 @@ void VhdlParser::generate_statement_body1() {if (!hasError) {
case SUBTYPE_T:
case TYPE_T:
case USE_T:
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
while (!hasError) {
- if (jj_2_109(2147483647)) {
+ if (jj_2_116(2147483647)) {
;
} else {
- goto end_label_51;
- }if (!hasError) {
-
+ goto end_label_53;
+ }
+ if (!hasError) {
block_declarative_item();
}
-
}
- end_label_51: ;
+ end_label_53: ;
}
if (!hasError) {
-
jj_consume_token(BEGIN_T);
}
-
break;
}
default:
- jj_la1[259] = jj_gen;
+ jj_la1[267] = jj_gen;
;
}
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ASSERT_T:
@@ -11614,45 +10261,134 @@ void VhdlParser::generate_statement_body1() {if (!hasError) {
break;
}
default:
- jj_la1[260] = jj_gen;
- goto end_label_52;
- }if (!hasError) {
-
+ jj_la1[268] = jj_gen;
+ goto end_label_54;
+ }
+ if (!hasError) {
concurrent_statement();
}
-
}
- end_label_52: ;
+ end_label_54: ;
+ }
+}
+
+
+void VhdlParser::generate_statement_body1() {
+ if (!hasError) {
+ generate_statement_body();
+ }
+ if (!hasError) {
+ generate_scheme_1();
+ }
+ if (!hasError) {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case ELSE_T:{
+ if (!hasError) {
+ generate_scheme_2();
+ }
+ break;
+ }
+ default:
+ jj_la1[269] = jj_gen;
+ ;
+ }
+ }
+}
+
+
+void VhdlParser::generate_scheme_1() {
+ if (!hasError) {
+ while (!hasError) {
+ switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
+ case ELSIF_T:{
+ ;
+ break;
+ }
+ default:
+ jj_la1[270] = jj_gen;
+ goto end_label_55;
+ }
+ if (!hasError) {
+ generate_scheme_3();
+ }
+ }
+ end_label_55: ;
+ }
+}
+
+
+void VhdlParser::generate_scheme_2() {
+ if (!hasError) {
+ jj_consume_token(ELSE_T);
+ }
+ if (!hasError) {
+ if (jj_2_117(2)) {
+ if (!hasError) {
+ identifier();
+ }
+ if (!hasError) {
+ jj_consume_token(COLON_T);
+ }
+ } else {
+ ;
+ }
+ }
+ if (!hasError) {
+ jj_consume_token(GENERATE_T);
+ }
+ if (!hasError) {
+ generate_statement_body();
+ }
+}
+
+
+void VhdlParser::generate_scheme_3() {
+ if (!hasError) {
+ jj_consume_token(ELSIF_T);
+ }
+ if (!hasError) {
+ if (jj_2_118(2)) {
+ if (!hasError) {
+ identifier();
+ }
+ if (!hasError) {
+ jj_consume_token(COLON_T);
+ }
+ } else {
+ ;
+ }
+ }
+ if (!hasError) {
+ expression();
+ }
+ if (!hasError) {
+ jj_consume_token(GENERATE_T);
+ }
+ if (!hasError) {
+ generate_statement_body();
}
-
}
-QCString VhdlParser::external_name() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::external_name() {QCString s,s1,s2;
+ if (!hasError) {
jj_consume_token(SLSL_T);
}
if (!hasError) {
-
s = sig_stat();
}
if (!hasError) {
-
s1 = external_pathname();
}
if (!hasError) {
-
jj_consume_token(COLON_T);
}
if (!hasError) {
-
s2 = subtype_indication();
}
if (!hasError) {
-
jj_consume_token(RSRS_T);
}
-
QCString t="<<"+s;
QCString t1=s1+":"+s2+">>";
return s+s1;
@@ -11662,41 +10398,35 @@ assert(false);
QCString VhdlParser::sig_stat() {Token *t;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case CONSTANT_T:{if (!hasError) {
-
+ case CONSTANT_T:{
+ if (!hasError) {
t = jj_consume_token(CONSTANT_T);
}
if (!hasError) {
-
return t->image.data();
}
-
break;
}
- case SIGNAL_T:{if (!hasError) {
-
+ case SIGNAL_T:{
+ if (!hasError) {
t = jj_consume_token(SIGNAL_T);
}
if (!hasError) {
-
return t->image.data();
}
-
break;
}
- case VARIABLE_T:{if (!hasError) {
-
+ case VARIABLE_T:{
+ if (!hasError) {
t = jj_consume_token(VARIABLE_T);
}
if (!hasError) {
-
return t->image.data();
}
-
break;
}
default:
- jj_la1[261] = jj_gen;
+ jj_la1[271] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -11706,41 +10436,35 @@ assert(false);
QCString VhdlParser::external_pathname() {QCString s;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case DOT_T:{if (!hasError) {
-
+ case DOT_T:{
+ if (!hasError) {
s = absolute_pathname();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case NEG_T:{if (!hasError) {
-
+ case NEG_T:{
+ if (!hasError) {
s = relative_pathname();
}
if (!hasError) {
-
return s;
}
-
break;
}
- case AT_T:{if (!hasError) {
-
+ case AT_T:{
+ if (!hasError) {
s = package_path_name();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[262] = jj_gen;
+ jj_la1[272] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -11749,42 +10473,35 @@ assert(false);
QCString VhdlParser::absolute_pathname() {QCString s,s1;
- if (jj_2_110(2147483647)) {if (!hasError) {
-
+ if (jj_2_119(2147483647)) {
+ if (!hasError) {
jj_consume_token(DOT_T);
}
if (!hasError) {
-
s = pathname_element_list();
}
if (!hasError) {
-
s1 = identifier();
}
if (!hasError) {
-
return "."+s+s1;
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case DOT_T:{if (!hasError) {
-
+ case DOT_T:{
+ if (!hasError) {
jj_consume_token(DOT_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
return "."+s;
}
-
break;
}
default:
- jj_la1[263] = jj_gen;
+ jj_la1[273] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -11793,92 +10510,79 @@ assert(false);
}
-QCString VhdlParser::relative_pathname() {QCString s,s1,s2;if (!hasError) {
-
+QCString VhdlParser::relative_pathname() {QCString s,s1,s2;
+ if (!hasError) {
s = neg_list();
}
if (!hasError) {
-
- if (jj_2_111(2147483647)) {if (!hasError) {
-
+ if (jj_2_120(2147483647)) {
+ if (!hasError) {
s1 = pathname_element_list();
}
-
} else {
;
}
}
if (!hasError) {
-
s2 = identifier();
}
-
return s+s1+s2;
assert(false);
}
-QCString VhdlParser::neg_list() {QCString s;if (!hasError) {
-
- while (!hasError) {if (!hasError) {
-
+QCString VhdlParser::neg_list() {QCString s;
+ if (!hasError) {
+ while (!hasError) {
+ if (!hasError) {
jj_consume_token(NEG_T);
}
if (!hasError) {
-
jj_consume_token(DOT_T);
}
if (!hasError) {
-
s+="^.";
}
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case NEG_T:{
;
break;
}
default:
- jj_la1[264] = jj_gen;
- goto end_label_53;
+ jj_la1[274] = jj_gen;
+ goto end_label_56;
}
}
- end_label_53: ;
+ end_label_56: ;
}
-
return s;
assert(false);
}
-QCString VhdlParser::pathname_element() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::pathname_element() {QCString s,s1;
+ if (!hasError) {
s = identifier();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = expression();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
break;
}
default:
- jj_la1[265] = jj_gen;
+ jj_la1[275] = jj_gen;
;
}
}
-
if(!s1.isEmpty())
return s+"("+s1+")";
@@ -11887,85 +10591,73 @@ assert(false);
}
-QCString VhdlParser::pathname_element_list() {QCString s,s1,s2;if (!hasError) {
+QCString VhdlParser::pathname_element_list() {QCString s,s1,s2;
+ if (!hasError) {
if (!hasError) {
-
s = pathname_element();
}
if (!hasError) {
-
jj_consume_token(DOT_T);
}
-
}
if (!hasError) {
-
s+=".";
}
if (!hasError) {
-
while (!hasError) {
- if (jj_2_112(2147483647)) {
+ if (jj_2_121(2147483647)) {
;
} else {
- goto end_label_54;
- }if (!hasError) {
-
+ goto end_label_57;
+ }
+ if (!hasError) {
s1 = pathname_element();
}
if (!hasError) {
-
jj_consume_token(DOT_T);
}
if (!hasError) {
-
s2+=s1;s2+=".";
}
-
}
- end_label_54: ;
+ end_label_57: ;
}
-
return s+s2;
assert(false);
}
-QCString VhdlParser::package_path_name() {QCString s;if (!hasError) {
-
+QCString VhdlParser::package_path_name() {QCString s;
+ if (!hasError) {
jj_consume_token(AT_T);
}
if (!hasError) {
-
s = name();
}
-
return "@"+s;
assert(false);
}
void VhdlParser::conditional_signal_assignment_wave() {
- if (jj_2_113(2147483647)) {if (!hasError) {
-
+ if (jj_2_122(2147483647)) {
+ if (!hasError) {
conditional_force_assignment();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case LPAREN_T:
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
conditional_waveform_assignment();
}
-
break;
}
default:
- jj_la1[266] = jj_gen;
+ jj_la1[276] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -11973,144 +10665,129 @@ void VhdlParser::conditional_signal_assignment_wave() {
}
-void VhdlParser::conditional_waveform_assignment() {if (!hasError) {
-
+void VhdlParser::conditional_waveform_assignment() {
+ if (!hasError) {
target();
}
if (!hasError) {
-
jj_consume_token(LESSTHAN_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case INERTIAL_T:
case REJECT_T:
- case TRANSPORT_T:{if (!hasError) {
-
+ case TRANSPORT_T:{
+ if (!hasError) {
delay_mechanism();
}
-
break;
}
default:
- jj_la1[267] = jj_gen;
+ jj_la1[277] = jj_gen;
;
}
}
if (!hasError) {
-
waveform_element();
}
if (!hasError) {
-
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case ELSE_T:{if (!hasError) {
-
+ case ELSE_T:{
+ if (!hasError) {
else_wave_list();
}
-
break;
}
default:
- jj_la1[268] = jj_gen;
+ jj_la1[278] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
-void VhdlParser::else_wave_list() {if (!hasError) {
-
+void VhdlParser::else_wave_list() {
+ if (!hasError) {
jj_consume_token(ELSE_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case WHEN_T:{if (!hasError) {
-
+ case WHEN_T:{
+ if (!hasError) {
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
expression();
}
-
break;
}
default:
- jj_la1[269] = jj_gen;
+ jj_la1[279] = jj_gen;
;
}
}
-
}
-void VhdlParser::conditional_force_assignment() {if (!hasError) {
-
+void VhdlParser::conditional_force_assignment() {
+ if (!hasError) {
target();
}
if (!hasError) {
-
jj_consume_token(LESSTHAN_T);
}
if (!hasError) {
-
jj_consume_token(FORCE_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IN_T:
- case OUT_T:{if (!hasError) {
-
+ case OUT_T:{
+ if (!hasError) {
inout_stat();
}
-
break;
}
default:
- jj_la1[270] = jj_gen;
+ jj_la1[280] = jj_gen;
;
}
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ABS_T:
+ case AND_T:
+ case NAND_T:
case NEW_T:
+ case NOR_T:
case NOT_T:
case NULL_T:
+ case OR_T:
+ case XOR_T:
+ case XNOR_T:
case LPAREN_T:
case PLUS_T:
case MINUS_T:
case SLSL_T:
+ case QQ_T:
case INTEGER:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
@@ -12118,47 +10795,41 @@ void VhdlParser::conditional_force_assignment() {if (!hasError) {
case CHARACTER_LITERAL:
case DECIMAL_LITERAL:
case BASED_LITERAL:
- case BIT_STRING_LITERAL:{if (!hasError) {
-
+ case BIT_STRING_LITERAL:{
+ if (!hasError) {
expression();
}
if (!hasError) {
-
else_stat();
}
-
break;
}
default:
- jj_la1[271] = jj_gen;
+ jj_la1[281] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
void VhdlParser::selected_signal_assignment_wave() {
- if (jj_2_114(2147483647)) {if (!hasError) {
-
+ if (jj_2_123(2147483647)) {
+ if (!hasError) {
selected_force_assignment();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case WITH_T:{if (!hasError) {
-
+ case WITH_T:{
+ if (!hasError) {
selected_waveform_assignment();
}
-
break;
}
default:
- jj_la1[272] = jj_gen;
+ jj_la1[282] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -12166,69 +10837,59 @@ void VhdlParser::selected_signal_assignment_wave() {
}
-void VhdlParser::selected_variable_assignment() {if (!hasError) {
-
+void VhdlParser::selected_variable_assignment() {
+ if (!hasError) {
jj_consume_token(WITH_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
jj_consume_token(SELECT_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case Q_T:{if (!hasError) {
-
+ case Q_T:{
+ if (!hasError) {
jj_consume_token(Q_T);
}
-
break;
}
default:
- jj_la1[273] = jj_gen;
+ jj_la1[283] = jj_gen;
;
}
}
if (!hasError) {
-
select_name();
}
if (!hasError) {
-
jj_consume_token(VARASSIGN_T);
}
if (!hasError) {
-
sel_var_list();
}
-
}
void VhdlParser::select_name() {
- if (jj_2_115(2147483647)) {if (!hasError) {
-
+ if (jj_2_124(2147483647)) {
+ if (!hasError) {
aggregate();
}
-
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case SLSL_T:
case STRINGLITERAL:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
name();
}
-
break;
}
default:
- jj_la1[274] = jj_gen;
+ jj_la1[284] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -12236,231 +10897,193 @@ void VhdlParser::select_name() {
}
-void VhdlParser::selected_waveform_assignment() {if (!hasError) {
-
+void VhdlParser::selected_waveform_assignment() {
+ if (!hasError) {
jj_consume_token(WITH_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
jj_consume_token(SELECT_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case Q_T:{if (!hasError) {
-
+ case Q_T:{
+ if (!hasError) {
jj_consume_token(Q_T);
}
-
break;
}
default:
- jj_la1[275] = jj_gen;
+ jj_la1[285] = jj_gen;
;
}
}
if (!hasError) {
-
target();
}
if (!hasError) {
-
jj_consume_token(LESSTHAN_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case INERTIAL_T:
case REJECT_T:
- case TRANSPORT_T:{if (!hasError) {
-
+ case TRANSPORT_T:{
+ if (!hasError) {
delay_mechanism();
}
-
break;
}
default:
- jj_la1[276] = jj_gen;
+ jj_la1[286] = jj_gen;
;
}
}
if (!hasError) {
-
sel_wave_list();
}
-
}
-void VhdlParser::selected_force_assignment() {if (!hasError) {
-
+void VhdlParser::selected_force_assignment() {
+ if (!hasError) {
jj_consume_token(WITH_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
jj_consume_token(SELECT_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case Q_T:{if (!hasError) {
-
+ case Q_T:{
+ if (!hasError) {
jj_consume_token(Q_T);
}
-
break;
}
default:
- jj_la1[277] = jj_gen;
+ jj_la1[287] = jj_gen;
;
}
}
if (!hasError) {
-
target();
}
if (!hasError) {
-
jj_consume_token(LESSTHAN_T);
}
if (!hasError) {
-
jj_consume_token(FORCE_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IN_T:
- case OUT_T:{if (!hasError) {
-
+ case OUT_T:{
+ if (!hasError) {
inout_stat();
}
-
break;
}
default:
- jj_la1[278] = jj_gen;
+ jj_la1[288] = jj_gen;
;
}
}
if (!hasError) {
-
sel_var_list();
}
-
}
-void VhdlParser::sel_var_list() {if (!hasError) {
+void VhdlParser::sel_var_list() {
+ if (!hasError) {
if (!hasError) {
-
expression();
}
if (!hasError) {
-
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
choices();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case COMMA_T:{if (!hasError) {
-
+ case COMMA_T:{
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
-
break;
}
- case SEMI_T:{if (!hasError) {
-
+ case SEMI_T:{
+ if (!hasError) {
jj_consume_token(SEMI_T);
}
-
break;
}
default:
- jj_la1[279] = jj_gen;
+ jj_la1[289] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-
}
if (!hasError) {
-
while (!hasError) {
- if (jj_2_116(2147483647)) {
+ if (jj_2_125(2147483647)) {
;
} else {
- goto end_label_55;
- }if (!hasError) {
-
+ goto end_label_58;
+ }
+ if (!hasError) {
expression();
}
if (!hasError) {
-
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
choices();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case COMMA_T:{if (!hasError) {
-
+ case COMMA_T:{
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
-
break;
}
- case SEMI_T:{if (!hasError) {
-
+ case SEMI_T:{
+ if (!hasError) {
jj_consume_token(SEMI_T);
}
-
break;
}
default:
- jj_la1[280] = jj_gen;
+ jj_la1[290] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-
}
- end_label_55: ;
+ end_label_58: ;
}
-
}
-void VhdlParser::sel_wave_list() {if (!hasError) {
-
+void VhdlParser::sel_wave_list() {
+ if (!hasError) {
waveform_element();
}
if (!hasError) {
-
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
choices();
}
if (!hasError) {
-
while (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA_T:{
@@ -12468,126 +11091,110 @@ void VhdlParser::sel_wave_list() {if (!hasError) {
break;
}
default:
- jj_la1[281] = jj_gen;
- goto end_label_56;
- }if (!hasError) {
-
+ jj_la1[291] = jj_gen;
+ goto end_label_59;
+ }
+ if (!hasError) {
jj_consume_token(COMMA_T);
}
if (!hasError) {
-
sel_wave_list();
}
-
}
- end_label_56: ;
+ end_label_59: ;
}
if (!hasError) {
-
jj_consume_token(SEMI_T);
}
-
}
void VhdlParser::inout_stat() {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case IN_T:{if (!hasError) {
-
+ case IN_T:{
+ if (!hasError) {
jj_consume_token(IN_T);
}
-
break;
}
- case OUT_T:{if (!hasError) {
-
+ case OUT_T:{
+ if (!hasError) {
jj_consume_token(OUT_T);
}
-
break;
}
default:
- jj_la1[282] = jj_gen;
+ jj_la1[292] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-void VhdlParser::else_stat() {if (!hasError) {
-
- while (!hasError) {if (!hasError) {
-
+void VhdlParser::else_stat() {
+ if (!hasError) {
+ while (!hasError) {
+ if (!hasError) {
jj_consume_token(ELSE_T);
}
if (!hasError) {
-
expression();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case WHEN_T:{if (!hasError) {
-
+ case WHEN_T:{
+ if (!hasError) {
jj_consume_token(WHEN_T);
}
if (!hasError) {
-
expression();
}
-
break;
}
default:
- jj_la1[283] = jj_gen;
+ jj_la1[293] = jj_gen;
;
}
}
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case ELSE_T:{
;
break;
}
default:
- jj_la1[284] = jj_gen;
- goto end_label_57;
+ jj_la1[294] = jj_gen;
+ goto end_label_60;
}
}
- end_label_57: ;
+ end_label_60: ;
}
-
}
QCString VhdlParser::interface_subprogram_declaration() {QCString s;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PROCEDURE_T:{if (!hasError) {
-
+ case PROCEDURE_T:{
+ if (!hasError) {
s = iproc();
}
if (!hasError) {
-
return s;
}
-
break;
}
case FUNCTION_T:
case IMPURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
s = ifunc();
}
if (!hasError) {
-
return s;
}
-
break;
}
default:
- jj_la1[285] = jj_gen;
+ jj_la1[295] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
@@ -12595,117 +11202,101 @@ assert(false);
}
-QCString VhdlParser::iproc() {QCString s,s1;if (!hasError) {
-
+QCString VhdlParser::iproc() {QCString s,s1;
+ if (!hasError) {
jj_consume_token(PROCEDURE_T);
}
if (!hasError) {
-
s = identifier();
}
if (!hasError) {
-
s1 = param();
}
-
m_sharedState->current->name=s;
return "procedure "+s+s1;
assert(false);
}
-QCString VhdlParser::ifunc() {QCString s,s1,s2,s3;Token *t=0;Token *t1=0;Token *t2=0;if (!hasError) {
-
+QCString VhdlParser::ifunc() {QCString s,s1,s2,s3;Token *t=0;Token *t1=0;Token *t2=0;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IMPURE_T:
case PURE_T:{
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
t = jj_consume_token(PURE_T);
}
-
break;
}
- case IMPURE_T:{if (!hasError) {
-
+ case IMPURE_T:{
+ if (!hasError) {
t = jj_consume_token(IMPURE_T);
}
-
break;
}
default:
- jj_la1[286] = jj_gen;
+ jj_la1[296] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
break;
}
default:
- jj_la1[287] = jj_gen;
+ jj_la1[297] = jj_gen;
;
}
}
if (!hasError) {
-
jj_consume_token(FUNCTION_T);
}
if (!hasError) {
-
s = name();
}
if (!hasError) {
-
s1 = param();
}
if (!hasError) {
-
jj_consume_token(RETURN_T);
}
if (!hasError) {
-
s2 = name();
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case IS_T:{if (!hasError) {
-
+ case IS_T:{
+ if (!hasError) {
t1 = jj_consume_token(IS_T);
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
s3 = identifier();
}
-
break;
}
- case BOX_T:{if (!hasError) {
-
+ case BOX_T:{
+ if (!hasError) {
t2 = jj_consume_token(BOX_T);
}
-
break;
}
default:
- jj_la1[288] = jj_gen;
+ jj_la1[298] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
-
break;
}
default:
- jj_la1[289] = jj_gen;
+ jj_la1[299] = jj_gen;
;
}
}
-
QCString q;
if(t) q=t->image.data();
if(t2) s3="<>";
@@ -12728,49 +11319,42 @@ assert(false);
}
-QCString VhdlParser::param() {QCString s,s1;Token *tok=0;if (!hasError) {
-
+QCString VhdlParser::param() {QCString s,s1;Token *tok=0;
+ if (!hasError) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case PARAMETER_T:{if (!hasError) {
-
+ case PARAMETER_T:{
+ if (!hasError) {
tok = jj_consume_token(PARAMETER_T);
}
-
break;
}
default:
- jj_la1[290] = jj_gen;
+ jj_la1[300] = jj_gen;
;
}
}
if (!hasError) {
-
m_sharedState->param_sec=PARAM_SEC;
}
if (!hasError) {
-
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
- case LPAREN_T:{if (!hasError) {
-
+ case LPAREN_T:{
+ if (!hasError) {
jj_consume_token(LPAREN_T);
}
if (!hasError) {
-
s1 = interface_list();
}
if (!hasError) {
-
jj_consume_token(RPAREN_T);
}
-
break;
}
default:
- jj_la1[291] = jj_gen;
+ jj_la1[301] = jj_gen;
;
}
}
-
if(tok)
{
s = tok->image.data();
@@ -12786,61 +11370,57 @@ void VhdlParser::parseInline() {
case POSTPONED_T:
case PROCESS_T:
case BASIC_IDENTIFIER:
- case EXTENDED_CHARACTER:{if (!hasError) {
-
+ case EXTENDED_CHARACTER:{
+ if (!hasError) {
process_statement();
}
-
break;
}
case FUNCTION_T:
case IMPURE_T:
case PROCEDURE_T:
- case PURE_T:{if (!hasError) {
-
+ case PURE_T:{
+ if (!hasError) {
subprogram_declaration();
}
-
break;
}
default:
- jj_la1[292] = jj_gen;
+ jj_la1[302] = jj_gen;
jj_consume_token(-1);
errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
}
}
- VhdlParser::VhdlParser(TokenManager *tm){
- head = NULL;
- errorHandlerCreated = false;
- ReInit(tm);
+ VhdlParser::VhdlParser(TokenManager *tokenManager){
+ head = nullptr;
+ ReInit(tokenManager);
}
VhdlParser::~VhdlParser()
{
clear();
}
-void VhdlParser::ReInit(TokenManager *tm){
+void VhdlParser::ReInit(TokenManager* tokenManager){
clear();
errorHandler = new ErrorHandler();
- errorHandlerCreated = true;
hasError = false;
- token_source = tm;
+ token_source = tokenManager;
head = token = new Token();
token->kind = 0;
- token->next = NULL;
+ token->next = nullptr;
jj_lookingAhead = false;
jj_rescan = false;
jj_done = false;
- jj_scanpos = jj_lastpos = NULL;
+ jj_scanpos = jj_lastpos = nullptr;
jj_gc = 0;
jj_kind = -1;
- trace_indent = 0;
- trace_enabled = false;
+ indent = 0;
+ trace = false;
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 293; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 303; i++) jj_la1[i] = -1;
}
@@ -12856,25 +11436,25 @@ void VhdlParser::clear(){
t = next;
}
}
- if (errorHandlerCreated) {
- delete errorHandler;
+ if (errorHandler) {
+ delete errorHandler, errorHandler = nullptr;
}
}
Token * VhdlParser::jj_consume_token(int kind) {
Token *oldToken;
- if ((oldToken = token)->next != NULL) token = token->next;
+ if ((oldToken = token)->next != nullptr) token = token->next;
else token = token->next = token_source->getNextToken();
jj_ntk = -1;
if (token->kind == kind) {
jj_gen++;
if (++jj_gc > 100) {
jj_gc = 0;
- for (int i = 0; i < 116; i++) {
+ for (int i = 0; i < 125; i++) {
JJCalls *c = &jj_2_rtns[i];
- while (c != NULL) {
- if (c->gen < jj_gen) c->first = NULL;
+ while (c != nullptr) {
+ if (c->gen < jj_gen) c->first = nullptr;
c = c->next;
}
}
@@ -12883,7 +11463,7 @@ Token * VhdlParser::jj_consume_token(int kind) {
}
token = oldToken;
jj_kind = kind;
- JAVACC_STRING_TYPE image = kind >= 0 ? tokenImage[kind] : tokenImage[0];
+ JJString image = kind >= 0 ? tokenImage[kind] : tokenImage[0];
errorHandler->handleUnexpectedToken(kind, image.substr(1, image.size() - 2), getToken(1), this);
hasError = true;
return token;
@@ -12893,7 +11473,7 @@ Token * VhdlParser::jj_consume_token(int kind) {
bool VhdlParser::jj_scan_token(int kind){
if (jj_scanpos == jj_lastpos) {
jj_la--;
- if (jj_scanpos->next == NULL) {
+ if (jj_scanpos->next == nullptr) {
jj_lastpos = jj_scanpos = jj_scanpos->next = token_source->getNextToken();
} else {
jj_lastpos = jj_scanpos = jj_scanpos->next;
@@ -12903,8 +11483,8 @@ bool VhdlParser::jj_scan_token(int kind){
}
if (jj_rescan) {
int i = 0; Token *tok = token;
- while (tok != NULL && tok != jj_scanpos) { i++; tok = tok->next; }
- if (tok != NULL) jj_add_error_token(kind, i);
+ while (tok != nullptr && tok != jj_scanpos) { i++; tok = tok->next; }
+ if (tok != nullptr) jj_add_error_token(kind, i);
}
if (jj_scanpos->kind != kind) return true;
if (jj_la == 0 && jj_scanpos == jj_lastpos) { return jj_done = true; }
@@ -12915,7 +11495,7 @@ bool VhdlParser::jj_scan_token(int kind){
/** Get the next Token. */
Token * VhdlParser::getNextToken(){
- if (token->next != NULL) token = token->next;
+ if (token->next != nullptr) token = token->next;
else token = token->next = token_source->getNextToken();
jj_ntk = -1;
jj_gen++;
@@ -12927,7 +11507,7 @@ Token * VhdlParser::getNextToken(){
Token * VhdlParser::getToken(int index){
Token *t = token;
for (int i = 0; i < index; i++) {
- if (t->next != NULL) t = t->next;
+ if (t->next != nullptr) t = t->next;
else t = t->next = token_source->getNextToken();
}
return t;
@@ -12935,7 +11515,7 @@ Token * VhdlParser::getToken(int index){
int VhdlParser::jj_ntk_f(){
- if ((jj_nt=token->next) == NULL)
+ if ((jj_nt=token->next) == nullptr)
return (jj_ntk = (token->next=token_source->getNextToken())->kind);
else
return (jj_ntk = jj_nt->kind);
@@ -12951,6 +11531,11 @@ int VhdlParser::jj_ntk_f(){
}
+ bool VhdlParser::trace_enabled() {
+ return trace;
+ }
+
+
void VhdlParser::enable_tracing() {
}
@@ -12960,7 +11545,7 @@ int VhdlParser::jj_ntk_f(){
void VhdlParser::jj_rescan_token(){
jj_rescan = true;
- for (int i = 0; i < 116; i++) {
+ for (int i = 0; i < 125; i++) {
JJCalls *p = &jj_2_rtns[i];
do {
if (p->gen > jj_gen) {
@@ -13082,10 +11667,19 @@ int VhdlParser::jj_ntk_f(){
case 113: jj_3_114(); break;
case 114: jj_3_115(); break;
case 115: jj_3_116(); break;
+ case 116: jj_3_117(); break;
+ case 117: jj_3_118(); break;
+ case 118: jj_3_119(); break;
+ case 119: jj_3_120(); break;
+ case 120: jj_3_121(); break;
+ case 121: jj_3_122(); break;
+ case 122: jj_3_123(); break;
+ case 123: jj_3_124(); break;
+ case 124: jj_3_125(); break;
}
}
p = p->next;
- } while (p != NULL);
+ } while (p != nullptr);
}
jj_rescan = false;
}
@@ -13094,7 +11688,7 @@ int VhdlParser::jj_ntk_f(){
void VhdlParser::jj_save(int index, int xla){
JJCalls *p = &jj_2_rtns[index];
while (p->gen > jj_gen) {
- if (p->next == NULL) { p = p->next = new JJCalls(); break; }
+ if (p->next == nullptr) { p = p->next = new JJCalls(); break; }
p = p->next;
}
p->gen = jj_gen + xla - jj_la; p->first = token; p->arg = xla;
diff --git a/vhdlparser/VhdlParser.h b/vhdlparser/VhdlParser.h
index f2948a3..891b085 100644
--- a/vhdlparser/VhdlParser.h
+++ b/vhdlparser/VhdlParser.h
@@ -4,9 +4,7 @@
#include "CharStream.h"
#include "Token.h"
#include "TokenManager.h"
-#include "VhdlParserTokenManager.h"
#include "vhdljjparser.h"
-
#include "VhdlParserConstants.h"
#include "ErrorHandler.h"
namespace vhdl {
@@ -17,566 +15,293 @@ namespace parser {
JJCalls* next;
Token* first;
~JJCalls() { if (next) delete next; }
- JJCalls() { next = NULL; arg = 0; gen = -1; first = NULL; }
+ JJCalls() { next = nullptr; arg = 0; gen = -1; first = nullptr; }
};
class VhdlParser {
- public:
-
+public:
QCString abstract_literal();
-
QCString access_type_definition();
-
QCString actual_designator();
-
QCString actual_parameter_part();
-
QCString actual_part();
-
QCString adding_operator();
-
QCString aggregate();
-
QCString alias_declaration();
-
QCString alias_designator();
-
void allocator();
-
void architecture_body();
-
void architecture_declarative_part();
-
void architecture_statement_part();
-
QCString array_type_definition();
-
QCString assertion();
-
QCString assertion_statement();
-
QCString association_element();
-
QCString association_list();
-
QCString attribute_declaration();
-
QCString attribute_designator();
-
QCString attribute_name();
-
QCString attribute_specification();
-
QCString base();
-
QCString base_specifier();
-
QCString base_unit_declaration();
-
QCString based_integer();
-
QCString based_literal();
-
QCString basic_identifier();
-
void binding_indication();
-
QCString bit_string_literal();
-
QCString bit_value();
-
void block_configuration();
-
void block_declarative_item();
-
void block_declarative_part();
-
void block_header();
-
void block_specification();
-
void block_statement();
-
void block_statement_part();
-
void case_statement();
-
void case_statement_alternative();
-
QCString character_literal();
-
QCString choice();
-
QCString choices();
-
void component_configuration();
-
void component_declaration();
-
void component_instantiation_statement();
-
void component_specification();
-
QCString composite_type_definition();
-
void concurrent_assertion_statement();
-
void concurrent_procedure_call_statement();
-
void concurrent_signal_assignment_statement();
-
void concurrent_statement();
-
QCString condition();
-
QCString condition_clause();
-
void conditional_signal_assignment();
-
void conditional_waveforms();
-
void configuration_declaration();
-
void configuration_declarative_item();
-
void configuration_declarative_part();
-
void configuration_item();
-
void configuration_specification();
-
QCString constant_declaration();
-
QCString constraint_array_definition();
-
void context_clause();
-
QCString constraint();
-
void context_item();
-
QCString decimal_literal();
-
QCString delay_mechanism();
-
void design_file();
-
void design_unit();
-
QCString designator();
-
QCString direction();
-
void disconnection_specification();
-
void guarded_signal_specificatio();
-
QCString discrete_range();
-
QCString element_association();
-
QCString element_declaration();
-
QCString entity_aspect();
-
QCString entity_class();
-
QCString entity_class_entry();
-
QCString entity_class_entry_list();
-
void entity_declaration();
-
void entity_declarative_item();
-
void entity_declarative_part();
-
QCString entity_designator();
-
void entity_header();
-
QCString entity_name_list();
-
QCString entity_specification();
-
void entity_statement();
-
void entity_statement_part();
-
QCString entity_tag();
-
QCString enumeration_literal();
-
QCString enumeration_type_definition();
-
QCString exit_statement();
-
QCString expression();
-
QCString logop();
-
QCString extended_identifier();
-
QCString factor();
-
QCString file_declaration();
-
QCString file_logical_name();
-
QCString file_open_information();
-
QCString file_type_definition();
-
QCString floating_type_definition();
-
QCString formal_designator();
-
QCString formal_parameter_list();
-
QCString formal_part();
-
QCString full_type_declaration();
-
QCString function_call();
-
void generate_statement();
-
void generate_scheme();
-
void generic_clause();
-
QCString generic_list();
-
void generic_map_aspect();
-
QCString group_constituent();
-
QCString group_constituent_list();
-
QCString group_declaration();
-
QCString group_template_declaration();
-
void guarded_signal_specification();
-
QCString identifier();
-
QCString identifier_list();
-
void if_statement();
-
QCString incomplete_type_declaration();
-
QCString index_constraint();
-
QCString index_specification();
-
QCString index_subtype_definition();
-
QCString instantiation_unit();
-
QCString instantiation_list();
-
QCString integer();
-
QCString integer_type_definition();
-
QCString interface_declaration();
-
QCString interface_element();
-
QCString interface_file_declaration();
-
QCString interface_list();
-
QCString interface_variable_declaration();
-
QCString iteration_scheme();
-
QCString label();
-
QCString library_clause();
-
QCString library_unit();
-
QCString literal();
-
QCString logical_operator();
-
QCString loop_statement();
-
QCString miscellaneous_operator();
-
QCString mode();
-
QCString multiplying_operation();
-
QCString name();
-
QCString name_ext1();
-
QCString name_ext();
-
QCString test_att_name();
-
QCString indexed_name();
-
QCString next_statement();
-
QCString null_statement();
-
QCString numeric_literal();
-
QCString object_class();
-
QCString operator_symbol();
-
void options();
-
void package_body();
-
void package_body_declarative_item();
-
void package_body_declarative_part();
-
+void package_header();
void package_declaration();
-
void geninter();
-
void package_declarative_item();
-
void package_declarative_part();
-
QCString parameter_specification();
-
QCString physical_literal();
-
QCString physical_type_definition();
-
void port_clause();
-
QCString port_list();
-
void port_map_aspect();
-
QCString primary();
-
void primary_unit();
-
QCString procedure_call();
-
QCString procedure_call_statement();
-
QCString process_declarative_item();
-
QCString process_declarative_part();
-
void process_statement();
-
void process_statement_part();
-
QCString qualified_expression();
-
QCString range();
-
QCString range_constraint();
-
void record_type_definition();
-
QCString relation();
-
QCString relation_operator();
-
QCString report_statement();
-
QCString return_statement();
-
QCString scalar_type_definition();
-
void secondary_unit();
-
QCString secondary_unit_declaration();
-
QCString selected_name();
-
void selected_signal_assignment();
-
void selected_waveforms();
-
QCString sensitivity_clause();
-
QCString sensitivity_list();
-
QCString sequence_of_statement();
-
QCString sequential_statement();
-
QCString shift_expression();
-
QCString shift_operator();
-
QCString sign();
-
QCString signal_assignment_statement();
-
void semi();
-
void signal_declaration();
-
QCString signal_kind();
-
QCString signal_list();
-
QCString signature();
-
QCString simple_expression();
-
void simple_name();
-
QCString slice_name();
-
QCString string_literal();
-
void subprogram_body();
-
void subprogram_declaration();
-
void subprogram_1();
-
QCString subprogram_declarative_item();
-
QCString subprogram_declarative_part();
-
void subprogram_kind();
-
void subprogram_specification();
-
void subprogram_statement_part();
-
QCString subtype_declaration();
-
+QCString reslution_indication();
QCString subtype_indication();
-
QCString suffix();
-
QCString target();
-
QCString term();
-
QCString timeout_clause();
-
QCString type_conversion();
-
QCString type_declaration();
-
QCString type_definition();
-
QCString type_mark();
-
QCString unconstraint_array_definition();
-
QCString use_clause();
-
QCString variable_assignment_statement();
-
QCString variable_declaration();
-
QCString wait_statement();
-
QCString waveform();
-
QCString waveform_element();
-
QCString protected_type_body();
-
void protected_type_body_declarative_item();
-
void protected_type_body_declarative_part();
-
QCString protected_type_declaration();
-
void protected_type_declarative_item();
-
void protected_type_declarative_part();
-
QCString context_ref();
-
void context_declaration();
-
QCString libustcont_stats();
-
void package_instantiation_declaration();
-
QCString interface_package_declaration();
-
QCString subprogram_instantiation_declaration();
-
void gen_assoc_list();
-
void gen_interface_list();
-
void case_scheme();
-
void when_stats();
-
void ttend();
-
void generate_statement_body();
-
void generate_statement_body1();
-
+void generate_scheme_1();
+void generate_scheme_2();
+void generate_scheme_3();
QCString external_name();
-
QCString sig_stat();
-
QCString external_pathname();
-
QCString absolute_pathname();
-
QCString relative_pathname();
-
QCString neg_list();
-
QCString pathname_element();
-
QCString pathname_element_list();
-
QCString package_path_name();
-
void conditional_signal_assignment_wave();
-
void conditional_waveform_assignment();
-
void else_wave_list();
-
void conditional_force_assignment();
-
void selected_signal_assignment_wave();
-
void selected_variable_assignment();
-
void select_name();
-
void selected_waveform_assignment();
-
void selected_force_assignment();
-
void sel_var_list();
-
void sel_wave_list();
-
void inout_stat();
-
void else_stat();
-
QCString interface_subprogram_declaration();
-
QCString iproc();
-
QCString ifunc();
-
QCString param();
-
void parseInline();
inline bool jj_2_1(int xla)
{
@@ -1506,228 +1231,296 @@ void parseInline();
{ jj_save(115, xla); }
}
- inline bool jj_3R_139()
+ inline bool jj_2_117(int xla)
{
- if (jj_done) return true;
- if (jj_3R_69()) return true;
- return false;
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ jj_done = false;
+ return (!jj_3_117() || jj_done);
+ { jj_save(116, xla); }
}
- inline bool jj_3R_198()
+ inline bool jj_2_118(int xla)
+ {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ jj_done = false;
+ return (!jj_3_118() || jj_done);
+ { jj_save(117, xla); }
+ }
+
+ inline bool jj_2_119(int xla)
+ {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ jj_done = false;
+ return (!jj_3_119() || jj_done);
+ { jj_save(118, xla); }
+ }
+
+ inline bool jj_2_120(int xla)
+ {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ jj_done = false;
+ return (!jj_3_120() || jj_done);
+ { jj_save(119, xla); }
+ }
+
+ inline bool jj_2_121(int xla)
+ {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ jj_done = false;
+ return (!jj_3_121() || jj_done);
+ { jj_save(120, xla); }
+ }
+
+ inline bool jj_2_122(int xla)
+ {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ jj_done = false;
+ return (!jj_3_122() || jj_done);
+ { jj_save(121, xla); }
+ }
+
+ inline bool jj_2_123(int xla)
+ {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ jj_done = false;
+ return (!jj_3_123() || jj_done);
+ { jj_save(122, xla); }
+ }
+
+ inline bool jj_2_124(int xla)
+ {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ jj_done = false;
+ return (!jj_3_124() || jj_done);
+ { jj_save(123, xla); }
+ }
+
+ inline bool jj_2_125(int xla)
+ {
+ jj_la = xla; jj_lastpos = jj_scanpos = token;
+ jj_done = false;
+ return (!jj_3_125() || jj_done);
+ { jj_save(124, xla); }
+ }
+
+ inline bool jj_3R_207()
{
if (jj_done) return true;
if (jj_scan_token(VARASSIGN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_443()
+ inline bool jj_3R_461()
{
if (jj_done) return true;
if (jj_scan_token(FOR_T)) return true;
- if (jj_3R_408()) return true;
+ if (jj_3R_543()) return true;
return false;
}
- inline bool jj_3R_197()
+ inline bool jj_3R_206()
{
if (jj_done) return true;
- if (jj_3R_346()) return true;
+ if (jj_3R_363()) return true;
return false;
}
- inline bool jj_3R_367()
+ inline bool jj_3R_383()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_442()) {
+ if (!jj_3R_460()) return false;
jj_scanpos = xsp;
- if (jj_3R_443()) return true;
- }
+ if (jj_3R_461()) return true;
return false;
}
- inline bool jj_3R_442()
+ inline bool jj_3R_460()
{
if (jj_done) return true;
if (jj_scan_token(WHILE_T)) return true;
- if (jj_3R_79()) return true;
+ if (jj_3R_83()) return true;
return false;
}
- inline bool jj_3R_400()
+ inline bool jj_3R_415()
{
if (jj_done) return true;
if (jj_scan_token(SEMI_T)) return true;
- if (jj_3R_399()) return true;
+ if (jj_3R_414()) return true;
return false;
}
- inline bool jj_3R_412()
+ inline bool jj_3R_424()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_195()
+ inline bool jj_3R_204()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_scan_token(116)) {
+ if (!jj_scan_token(116)) return false;
jj_scanpos = xsp;
- if (jj_scan_token(100)) {
+ if (!jj_scan_token(100)) return false;
jj_scanpos = xsp;
- if (jj_scan_token(31)) {
+ if (!jj_scan_token(31)) return false;
jj_scanpos = xsp;
if (jj_scan_token(101)) return true;
- }
- }
- }
return false;
}
- inline bool jj_3R_90()
+ inline bool jj_3R_96()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_195()) jj_scanpos = xsp;
- if (jj_3R_196()) return true;
+ if (jj_3R_204()) jj_scanpos = xsp;
+ if (jj_3R_205()) return true;
if (jj_scan_token(COLON_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_197()) jj_scanpos = xsp;
- if (jj_3R_84()) return true;
+ if (jj_3R_206()) jj_scanpos = xsp;
+ if (jj_3R_89()) return true;
xsp = jj_scanpos;
if (jj_scan_token(27)) jj_scanpos = xsp;
xsp = jj_scanpos;
- if (jj_3R_198()) jj_scanpos = xsp;
+ if (jj_3R_207()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_313()
+ inline bool jj_3R_327()
{
if (jj_done) return true;
- if (jj_3R_399()) return true;
+ if (jj_3R_414()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_400()) { jj_scanpos = xsp; break; }
+ if (jj_3R_415()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_91()
+ inline bool jj_3R_97()
{
if (jj_done) return true;
if (jj_scan_token(FILE_T)) return true;
- if (jj_3R_196()) return true;
+ if (jj_3R_205()) return true;
if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_84()) return true;
+ if (jj_3R_89()) return true;
return false;
}
- inline bool jj_3R_399()
+ inline bool jj_3R_693()
{
if (jj_done) return true;
- if (jj_3R_490()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3_42()
+ inline bool jj_3R_414()
{
if (jj_done) return true;
- if (jj_3R_92()) return true;
+ if (jj_3R_513()) return true;
return false;
}
- inline bool jj_3R_558()
+ inline bool jj_3_46()
{
if (jj_done) return true;
- if (jj_3R_613()) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_98()) return true;
return false;
}
- inline bool jj_3R_557()
+ inline bool jj_3R_444()
{
if (jj_done) return true;
- if (jj_3R_92()) return true;
+ if (jj_scan_token(IS_T)) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_693()) return false;
+ jj_scanpos = xsp;
+ if (jj_scan_token(145)) return true;
return false;
}
- inline bool jj_3_41()
+ inline bool jj_3R_572()
{
if (jj_done) return true;
- if (jj_3R_91()) return true;
+ if (jj_3R_625()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3_40()
+ inline bool jj_3R_571()
{
if (jj_done) return true;
- if (jj_3R_90()) return true;
+ if (jj_3R_98()) return true;
return false;
}
- inline bool jj_3R_556()
+ inline bool jj_3_45()
{
if (jj_done) return true;
- if (jj_3R_107()) return true;
+ if (jj_3R_97()) return true;
return false;
}
- inline bool jj_3_39()
+ inline bool jj_3_44()
{
if (jj_done) return true;
- if (jj_3R_89()) return true;
+ if (jj_3R_96()) return true;
return false;
}
- inline bool jj_3R_490()
+ inline bool jj_3_43()
+ {
+ if (jj_done) return true;
+ if (jj_3R_95()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_513()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3_39()) {
+ if (!jj_3_42()) return false;
jj_scanpos = xsp;
- if (jj_3R_556()) {
+ if (!jj_3_43()) return false;
jj_scanpos = xsp;
- if (jj_3_40()) {
+ if (!jj_3_44()) return false;
jj_scanpos = xsp;
- if (jj_3_41()) {
+ if (!jj_3_45()) return false;
jj_scanpos = xsp;
- if (jj_3R_557()) {
+ if (!jj_3R_571()) return false;
jj_scanpos = xsp;
- if (jj_3R_558()) return true;
- }
- }
- }
- }
- }
+ if (jj_3R_572()) return true;
return false;
}
- inline bool jj_3R_180()
+ inline bool jj_3_42()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_67()) return true;
+ if (jj_3R_94()) return true;
return false;
}
- inline bool jj_3R_696()
+ inline bool jj_3R_159()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_72()) return true;
return false;
}
- inline bool jj_3_38()
+ inline bool jj_3_41()
{
if (jj_done) return true;
if (jj_scan_token(BASIC_IDENTIFIER)) return true;
@@ -1735,501 +1528,377 @@ void parseInline();
return false;
}
- inline bool jj_3R_415()
+ inline bool jj_3R_427()
{
if (jj_done) return true;
if (jj_scan_token(ALL_T)) return true;
return false;
}
- inline bool jj_3R_414()
+ inline bool jj_3R_426()
{
if (jj_done) return true;
if (jj_scan_token(OTHER_T)) return true;
return false;
}
- inline bool jj_3R_625()
+ inline bool jj_3R_631()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_331()
+ inline bool jj_3R_343()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_413()) {
+ if (!jj_3R_425()) return false;
jj_scanpos = xsp;
- if (jj_3R_414()) {
+ if (!jj_3R_426()) return false;
jj_scanpos = xsp;
- if (jj_3R_415()) return true;
- }
- }
- return false;
- }
-
- inline bool jj_3R_413()
- {
- if (jj_done) return true;
- if (jj_3R_196()) return true;
+ if (jj_3R_427()) return true;
return false;
}
- inline bool jj_3R_426()
+ inline bool jj_3R_425()
{
if (jj_done) return true;
- if (jj_scan_token(IS_T)) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_696()) {
- jj_scanpos = xsp;
- if (jj_scan_token(145)) return true;
- }
+ if (jj_3R_205()) return true;
return false;
}
- inline bool jj_3R_328()
+ inline bool jj_3R_340()
{
if (jj_done) return true;
if (jj_scan_token(CONFIGURATION_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_327()
+ inline bool jj_3R_339()
{
if (jj_done) return true;
if (jj_scan_token(ENTITY_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3_38()) jj_scanpos = xsp;
- if (jj_3R_59()) return true;
+ if (jj_3_41()) jj_scanpos = xsp;
+ if (jj_3R_63()) return true;
xsp = jj_scanpos;
- if (jj_3R_412()) jj_scanpos = xsp;
+ if (jj_3R_424()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_173()
+ inline bool jj_3R_177()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_326()) {
+ if (!jj_3R_338()) return false;
jj_scanpos = xsp;
- if (jj_3R_327()) {
+ if (!jj_3R_339()) return false;
jj_scanpos = xsp;
- if (jj_3R_328()) return true;
- }
- }
+ if (jj_3R_340()) return true;
return false;
}
- inline bool jj_3_37()
+ inline bool jj_3_40()
{
if (jj_done) return true;
- if (jj_3R_67()) return true;
+ if (jj_3R_72()) return true;
return false;
}
- inline bool jj_3R_326()
+ inline bool jj_3R_338()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
if (jj_scan_token(28)) jj_scanpos = xsp;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_154()
+ inline bool jj_3R_722()
{
if (jj_done) return true;
- if (jj_3R_157()) return true;
+ if (jj_3R_161()) return true;
if (jj_scan_token(RANGE_T)) return true;
if (jj_scan_token(BOX_T)) return true;
return false;
}
- inline bool jj_3R_622()
+ inline bool jj_3R_628()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_621()
+ inline bool jj_3R_627()
{
if (jj_done) return true;
- if (jj_3R_67()) return true;
+ if (jj_3R_72()) return true;
return false;
}
- inline bool jj_3R_565()
+ inline bool jj_3R_577()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_621()) {
+ if (!jj_3R_627()) return false;
jj_scanpos = xsp;
- if (jj_3R_622()) return true;
- }
- return false;
- }
-
- inline bool jj_3R_82()
- {
- if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_67()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_180()) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(RPAREN_T)) return true;
- return false;
- }
-
- inline bool jj_3R_532()
- {
- if (jj_done) return true;
- if (jj_scan_token(TYPE_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(SEMI_T)) return true;
- return false;
- }
-
- inline bool jj_3R_624()
- {
- if (jj_done) return true;
- if (jj_scan_token(ELSE_T)) return true;
- if (jj_3R_259()) return true;
- return false;
- }
-
- inline bool jj_3R_345()
- {
- if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_628()) return true;
return false;
}
- inline bool jj_3R_623()
- {
- if (jj_done) return true;
- if (jj_scan_token(ELSIF_T)) return true;
- if (jj_3R_79()) return true;
- if (jj_scan_token(THEN_T)) return true;
- if (jj_3R_259()) return true;
- return false;
- }
-
- inline bool jj_3R_520()
+ inline bool jj_3R_535()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_313()) return true;
+ if (jj_3R_327()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3_116()
+ inline bool jj_3_125()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(WHEN_T)) return true;
return false;
}
- inline bool jj_3R_424()
+ inline bool jj_3R_442()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
if (jj_scan_token(77)) jj_scanpos = xsp;
xsp = jj_scanpos;
- if (jj_3R_520()) jj_scanpos = xsp;
+ if (jj_3R_535()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_255()
- {
- if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
- return false;
- }
-
- inline bool jj_3R_120()
+ inline bool jj_3R_65()
{
if (jj_done) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_72()) return true;
Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_255()) jj_scanpos = xsp;
- if (jj_scan_token(IF_T)) return true;
- if (jj_3R_79()) return true;
- if (jj_scan_token(THEN_T)) return true;
- if (jj_3R_259()) return true;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_623()) { jj_scanpos = xsp; break; }
+ if (jj_3R_159()) { jj_scanpos = xsp; break; }
}
- xsp = jj_scanpos;
- if (jj_3R_624()) jj_scanpos = xsp;
- if (jj_scan_token(END_T)) return true;
- if (jj_scan_token(IF_T)) return true;
- xsp = jj_scanpos;
- if (jj_3R_625()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_196()
+ inline bool jj_3R_547()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_345()) { jj_scanpos = xsp; break; }
- }
+ if (jj_scan_token(TYPE_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_386()
+ inline bool jj_3R_401()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_85()) return true;
+ if (jj_3R_90()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_scan_token(134)) {
+ if (!jj_scan_token(134)) return false;
jj_scanpos = xsp;
if (jj_scan_token(137)) return true;
- }
return false;
}
- inline bool jj_3R_164()
- {
- if (jj_done) return true;
- if (jj_scan_token(BASIC_IDENTIFIER)) return true;
- return false;
- }
-
- inline bool jj_3R_163()
- {
- if (jj_done) return true;
- if (jj_scan_token(EXTENDED_CHARACTER)) return true;
- return false;
- }
-
- inline bool jj_3R_69()
- {
- if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_163()) {
- jj_scanpos = xsp;
- if (jj_3R_164()) return true;
- }
- return false;
- }
-
- inline bool jj_3R_545()
+ inline bool jj_3R_546()
{
if (jj_done) return true;
if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_544()) return true;
+ if (jj_3R_466()) return true;
return false;
}
- inline bool jj_3R_530()
+ inline bool jj_3R_630()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_448()) return true;
+ if (jj_scan_token(ELSE_T)) return true;
+ if (jj_3R_268()) return true;
return false;
}
- inline bool jj_3R_305()
+ inline bool jj_3R_316()
{
if (jj_done) return true;
- if (jj_3R_384()) return true;
+ if (jj_3R_399()) return true;
return false;
}
- inline bool jj_3R_546()
+ inline bool jj_3R_561()
{
if (jj_done) return true;
if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_425()
+ inline bool jj_3R_443()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_scan_token(84)) {
+ if (!jj_scan_token(84)) return false;
jj_scanpos = xsp;
if (jj_scan_token(52)) return true;
- }
return false;
}
- inline bool jj_3R_65()
+ inline bool jj_3R_629()
{
if (jj_done) return true;
- if (jj_scan_token(GROUP_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(IS_T)) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_474()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_scan_token(ELSIF_T)) return true;
+ if (jj_3R_83()) return true;
+ if (jj_scan_token(THEN_T)) return true;
+ if (jj_3R_268()) return true;
return false;
}
- inline bool jj_3R_344()
+ inline bool jj_3R_361()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_425()) jj_scanpos = xsp;
+ if (jj_3R_443()) jj_scanpos = xsp;
if (jj_scan_token(FUNCTION_T)) return true;
- if (jj_3R_59()) return true;
- if (jj_3R_424()) return true;
+ if (jj_3R_63()) return true;
+ if (jj_3R_442()) return true;
if (jj_scan_token(RETURN_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
xsp = jj_scanpos;
- if (jj_3R_426()) jj_scanpos = xsp;
+ if (jj_3R_444()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_383()
+ inline bool jj_3R_362()
{
if (jj_done) return true;
- if (jj_scan_token(GROUP_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_475()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_343()
+ inline bool jj_3R_360()
{
if (jj_done) return true;
if (jj_scan_token(PROCEDURE_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_3R_424()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_3R_442()) return true;
return false;
}
- inline bool jj_3R_475()
+ inline bool jj_3R_264()
+ {
+ if (jj_done) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_125()
{
if (jj_done) return true;
- if (jj_3R_544()) return true;
Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_264()) jj_scanpos = xsp;
+ if (jj_scan_token(IF_T)) return true;
+ if (jj_3R_83()) return true;
+ if (jj_scan_token(THEN_T)) return true;
+ if (jj_3R_268()) return true;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_545()) { jj_scanpos = xsp; break; }
+ if (jj_3R_629()) { jj_scanpos = xsp; break; }
}
+ xsp = jj_scanpos;
+ if (jj_3R_630()) jj_scanpos = xsp;
+ if (jj_scan_token(END_T)) return true;
+ if (jj_scan_token(IF_T)) return true;
+ xsp = jj_scanpos;
+ if (jj_3R_631()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_194()
+ inline bool jj_3R_203()
{
if (jj_done) return true;
- if (jj_3R_344()) return true;
+ if (jj_3R_361()) return true;
return false;
}
- inline bool jj_3R_193()
+ inline bool jj_3R_202()
{
if (jj_done) return true;
- if (jj_3R_343()) return true;
+ if (jj_3R_360()) return true;
return false;
}
- inline bool jj_3R_89()
+ inline bool jj_3R_94()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_193()) {
+ if (!jj_3R_202()) return false;
jj_scanpos = xsp;
- if (jj_3R_194()) return true;
- }
+ if (jj_3R_203()) return true;
return false;
}
- inline bool jj_3R_608()
- {
- if (jj_done) return true;
- if (jj_3R_352()) return true;
- return false;
- }
-
- inline bool jj_3R_607()
- {
- if (jj_done) return true;
- if (jj_3R_59()) return true;
- return false;
- }
-
- inline bool jj_3R_544()
+ inline bool jj_3R_205()
{
if (jj_done) return true;
+ if (jj_3R_63()) return true;
Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_607()) {
- jj_scanpos = xsp;
- if (jj_3R_608()) return true;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_362()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_476()
+ inline bool jj_3R_493()
{
if (jj_done) return true;
if (jj_scan_token(ELSE_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_546()) jj_scanpos = xsp;
+ if (jj_3R_561()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_70()
+ inline bool jj_3R_171()
{
if (jj_done) return true;
- if (jj_scan_token(GENERIC_T)) return true;
- if (jj_scan_token(MAP_T)) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_165()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_scan_token(BASIC_IDENTIFIER)) return true;
return false;
}
- inline bool jj_3R_385()
+ inline bool jj_3R_400()
{
if (jj_done) return true;
Token * xsp;
- if (jj_3R_476()) return true;
+ if (jj_3R_493()) return true;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_476()) { jj_scanpos = xsp; break; }
+ if (jj_3R_493()) { jj_scanpos = xsp; break; }
}
return false;
}
@@ -2237,179 +1906,208 @@ void parseInline();
inline bool jj_3R_170()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_scan_token(EXTENDED_CHARACTER)) return true;
return false;
}
- inline bool jj_3R_384()
+ inline bool jj_3R_74()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_scan_token(53)) {
+ if (!jj_3R_170()) return false;
jj_scanpos = xsp;
- if (jj_scan_token(75)) return true;
- }
+ if (jj_3R_171()) return true;
return false;
}
- inline bool jj_3R_158()
+ inline bool jj_3R_560()
{
if (jj_done) return true;
- if (jj_3R_313()) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_559()) return true;
return false;
}
- inline bool jj_3R_448()
+ inline bool jj_3R_399()
{
if (jj_done) return true;
- if (jj_3R_445()) return true;
- if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_85()) return true;
Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_530()) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(SEMI_T)) return true;
+ xsp = jj_scanpos;
+ if (!jj_scan_token(53)) return false;
+ jj_scanpos = xsp;
+ if (jj_scan_token(75)) return true;
return false;
}
- inline bool jj_3R_66()
+ inline bool jj_3R_466()
{
if (jj_done) return true;
- if (jj_scan_token(GENERIC_T)) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_158()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_463()) return true;
+ if (jj_scan_token(WHEN_T)) return true;
+ if (jj_3R_90()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_546()) { jj_scanpos = xsp; break; }
+ }
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_447()
+ inline bool jj_3R_465()
{
if (jj_done) return true;
- if (jj_3R_405()) return true;
+ if (jj_3R_420()) return true;
return false;
}
- inline bool jj_3R_322()
+ inline bool jj_3R_68()
{
if (jj_done) return true;
- if (jj_scan_token(IF_T)) return true;
- if (jj_3R_79()) return true;
+ if (jj_scan_token(GROUP_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(IS_T)) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_491()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_306()
+ inline bool jj_3R_317()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_85()) return true;
+ if (jj_3R_90()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_scan_token(134)) {
+ if (!jj_scan_token(134)) return false;
jj_scanpos = xsp;
if (jj_scan_token(137)) return true;
- }
while (true) {
xsp = jj_scanpos;
- if (jj_3R_386()) { jj_scanpos = xsp; break; }
+ if (jj_3R_401()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_168()
- {
- if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_321()) {
- jj_scanpos = xsp;
- if (jj_3R_322()) return true;
- }
- return false;
- }
-
- inline bool jj_3R_321()
+ inline bool jj_3R_398()
{
if (jj_done) return true;
- if (jj_scan_token(FOR_T)) return true;
- if (jj_3R_408()) return true;
+ if (jj_scan_token(GROUP_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_492()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_144()
+ inline bool jj_3R_150()
{
if (jj_done) return true;
if (jj_scan_token(WITH_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(SELECT_T)) return true;
Token * xsp;
xsp = jj_scanpos;
if (jj_scan_token(155)) jj_scanpos = xsp;
- if (jj_3R_114()) return true;
+ if (jj_3R_119()) return true;
if (jj_scan_token(LESSTHAN_T)) return true;
if (jj_scan_token(FORCE_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_305()) jj_scanpos = xsp;
- if (jj_3R_306()) return true;
+ if (jj_3R_316()) jj_scanpos = xsp;
+ if (jj_3R_317()) return true;
return false;
}
- inline bool jj_3_115()
+ inline bool jj_3R_492()
{
if (jj_done) return true;
- if (jj_3R_108()) return true;
+ if (jj_3R_559()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_560()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3R_369()
+ inline bool jj_3_124()
+ {
+ if (jj_done) return true;
+ if (jj_3R_114()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_385()
{
if (jj_done) return true;
if (jj_scan_token(WITH_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(SELECT_T)) return true;
Token * xsp;
xsp = jj_scanpos;
if (jj_scan_token(155)) jj_scanpos = xsp;
- if (jj_3R_114()) return true;
+ if (jj_3R_119()) return true;
if (jj_scan_token(LESSTHAN_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_447()) jj_scanpos = xsp;
- if (jj_3R_448()) return true;
+ if (jj_3R_465()) jj_scanpos = xsp;
+ if (jj_3R_466()) return true;
return false;
}
- inline bool jj_3R_74()
+ inline bool jj_3R_620()
+ {
+ if (jj_done) return true;
+ if (jj_3R_369()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_619()
+ {
+ if (jj_done) return true;
+ if (jj_3R_63()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_559()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_168()) return true;
- if (jj_scan_token(GENERATE_T)) return true;
- if (jj_3R_169()) return true;
- if (jj_scan_token(END_T)) return true;
- if (jj_scan_token(GENERATE_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_170()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (!jj_3R_619()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_620()) return true;
return false;
}
inline bool jj_3R_687()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_73()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(GENERIC_T)) return true;
+ if (jj_scan_token(MAP_T)) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_169()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
inline bool jj_3R_686()
{
if (jj_done) return true;
- if (jj_3R_108()) return true;
+ if (jj_3R_114()) return true;
return false;
}
@@ -2418,1200 +2116,1277 @@ void parseInline();
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_686()) {
+ if (!jj_3R_686()) return false;
jj_scanpos = xsp;
if (jj_3R_687()) return true;
- }
return false;
}
- inline bool jj_3R_104()
+ inline bool jj_3_121()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_226()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
- return false;
- }
-
- inline bool jj_3_112()
- {
- if (jj_done) return true;
- if (jj_3R_142()) return true;
+ if (jj_3R_148()) return true;
if (jj_scan_token(DOT_T)) return true;
return false;
}
- inline bool jj_3R_575()
+ inline bool jj_3R_587()
{
if (jj_done) return true;
if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3_114()
+ inline bool jj_3_123()
{
if (jj_done) return true;
- if (jj_3R_144()) return true;
+ if (jj_3R_150()) return true;
return false;
}
- inline bool jj_3R_527()
+ inline bool jj_3R_542()
{
if (jj_done) return true;
if (jj_scan_token(WITH_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(SELECT_T)) return true;
Token * xsp;
xsp = jj_scanpos;
if (jj_scan_token(155)) jj_scanpos = xsp;
if (jj_3R_663()) return true;
if (jj_scan_token(VARASSIGN_T)) return true;
- if (jj_3R_306()) return true;
+ if (jj_3R_317()) return true;
return false;
}
- inline bool jj_3R_303()
+ inline bool jj_3R_162()
{
if (jj_done) return true;
- if (jj_3R_384()) return true;
+ if (jj_3R_327()) return true;
return false;
}
- inline bool jj_3R_301()
+ inline bool jj_3_39()
{
if (jj_done) return true;
- if (jj_3R_142()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_314()
+ {
+ if (jj_done) return true;
+ if (jj_3R_399()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_312()
+ {
+ if (jj_done) return true;
+ if (jj_3R_148()) return true;
if (jj_scan_token(DOT_T)) return true;
return false;
}
- inline bool jj_3R_304()
+ inline bool jj_3R_315()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
- if (jj_3R_385()) return true;
+ if (jj_3R_61()) return true;
+ if (jj_3R_400()) return true;
return false;
}
- inline bool jj_3R_446()
+ inline bool jj_3R_464()
{
if (jj_done) return true;
- if (jj_3R_529()) return true;
+ if (jj_3R_545()) return true;
return false;
}
- inline bool jj_3R_271()
+ inline bool jj_3R_69()
{
if (jj_done) return true;
- if (jj_3R_369()) return true;
+ if (jj_scan_token(GENERIC_T)) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_162()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_127()
+ inline bool jj_3R_280()
+ {
+ if (jj_done) return true;
+ if (jj_3R_385()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_132()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_270()) {
+ if (!jj_3R_279()) return false;
jj_scanpos = xsp;
- if (jj_3R_271()) return true;
- }
+ if (jj_3R_280()) return true;
return false;
}
- inline bool jj_3R_270()
+ inline bool jj_3R_279()
{
if (jj_done) return true;
- if (jj_3R_144()) return true;
+ if (jj_3R_150()) return true;
return false;
}
- inline bool jj_3R_463()
+ inline bool jj_3R_336()
{
if (jj_done) return true;
- if (jj_3R_534()) return true;
+ if (jj_scan_token(IF_T)) return true;
return false;
}
- inline bool jj_3R_444()
+ inline bool jj_3R_174()
{
if (jj_done) return true;
- if (jj_3R_405()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_335()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_336()) return true;
return false;
}
- inline bool jj_3R_143()
+ inline bool jj_3R_335()
{
if (jj_done) return true;
- if (jj_3R_114()) return true;
+ if (jj_scan_token(FOR_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_462()
+ {
+ if (jj_done) return true;
+ if (jj_3R_420()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_149()
+ {
+ if (jj_done) return true;
+ if (jj_3R_119()) return true;
if (jj_scan_token(LESSTHAN_T)) return true;
if (jj_scan_token(FORCE_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_303()) jj_scanpos = xsp;
- if (jj_3R_58()) return true;
+ if (jj_3R_314()) jj_scanpos = xsp;
+ if (jj_3R_61()) return true;
if (jj_scan_token(WHEN_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_304()) jj_scanpos = xsp;
+ if (jj_3R_315()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_529()
+ inline bool jj_3R_545()
{
if (jj_done) return true;
if (jj_scan_token(ELSE_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_575()) jj_scanpos = xsp;
+ if (jj_3R_587()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_156()
- {
- if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_312()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
- return false;
- }
-
- inline bool jj_3_113()
+ inline bool jj_3R_78()
{
if (jj_done) return true;
- if (jj_3R_143()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_174()) return true;
return false;
}
- inline bool jj_3R_324()
+ inline bool jj_3_122()
{
if (jj_done) return true;
- if (jj_3R_410()) return true;
+ if (jj_3R_149()) return true;
return false;
}
- inline bool jj_3R_136()
+ inline bool jj_3R_110()
{
if (jj_done) return true;
- if (jj_scan_token(TYPE_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(IS_T)) return true;
- if (jj_3R_577()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_63()) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_236()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_368()
+ inline bool jj_3R_384()
{
if (jj_done) return true;
- if (jj_3R_114()) return true;
+ if (jj_3R_119()) return true;
if (jj_scan_token(LESSTHAN_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_444()) jj_scanpos = xsp;
- if (jj_3R_445()) return true;
+ if (jj_3R_462()) jj_scanpos = xsp;
+ if (jj_3R_463()) return true;
if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
xsp = jj_scanpos;
- if (jj_3R_446()) jj_scanpos = xsp;
+ if (jj_3R_464()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_269()
+ inline bool jj_3R_278()
{
if (jj_done) return true;
- if (jj_3R_368()) return true;
+ if (jj_3R_384()) return true;
return false;
}
- inline bool jj_3R_63()
+ inline bool jj_3R_131()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_156()) jj_scanpos = xsp;
+ if (!jj_3R_277()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_278()) return true;
return false;
}
- inline bool jj_3R_126()
+ inline bool jj_3R_277()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_268()) {
- jj_scanpos = xsp;
- if (jj_3R_269()) return true;
- }
+ if (jj_3R_149()) return true;
return false;
}
- inline bool jj_3R_268()
+ inline bool jj_3R_570()
{
if (jj_done) return true;
- if (jj_3R_143()) return true;
+ if (jj_scan_token(AT_T)) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_570()
+ inline bool jj_3R_481()
{
if (jj_done) return true;
- if (jj_3R_313()) return true;
+ if (jj_3R_549()) return true;
return false;
}
- inline bool jj_3R_555()
+ inline bool jj_3R_313()
{
if (jj_done) return true;
- if (jj_scan_token(AT_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_61()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_398()
+ inline bool jj_3_120()
{
if (jj_done) return true;
- if (jj_scan_token(INTEGER)) return true;
+ if (jj_3R_147()) return true;
return false;
}
- inline bool jj_3R_302()
+ inline bool jj_3R_147()
+ {
+ if (jj_done) return true;
+ if (jj_3R_148()) return true;
+ if (jj_scan_token(DOT_T)) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_312()) { jj_scanpos = xsp; break; }
+ }
+ return false;
+ }
+
+ inline bool jj_3R_624()
+ {
+ if (jj_done) return true;
+ if (jj_3R_147()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_592()
+ {
+ if (jj_done) return true;
+ if (jj_3R_399()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_160()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_326()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_312()
+ inline bool jj_3R_148()
{
if (jj_done) return true;
+ if (jj_3R_74()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_397()) {
- jj_scanpos = xsp;
- if (jj_3R_398()) return true;
- }
+ if (jj_3R_313()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_397()
+ inline bool jj_3R_142()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_scan_token(TYPE_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(IS_T)) return true;
+ if (jj_3R_588()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3_111()
+ inline bool jj_3R_647()
{
if (jj_done) return true;
- if (jj_3R_141()) return true;
+ if (jj_scan_token(NEG_T)) return true;
+ if (jj_scan_token(DOT_T)) return true;
return false;
}
- inline bool jj_3R_141()
+ inline bool jj_3R_623()
{
if (jj_done) return true;
- if (jj_3R_142()) return true;
- if (jj_scan_token(DOT_T)) return true;
Token * xsp;
+ if (jj_3R_647()) return true;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_301()) { jj_scanpos = xsp; break; }
+ if (jj_3R_647()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_612()
+ inline bool jj_3R_66()
{
if (jj_done) return true;
- if (jj_3R_141()) return true;
+ if (jj_3R_63()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_160()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_657()
+ inline bool jj_3_119()
{
if (jj_done) return true;
- if (jj_scan_token(FILE_T)) return true;
- if (jj_scan_token(OF_T)) return true;
- if (jj_3R_157()) return true;
+ if (jj_scan_token(DOT_T)) return true;
+ if (jj_3R_147()) return true;
return false;
}
- inline bool jj_3R_142()
+ inline bool jj_3R_569()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_623()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_302()) jj_scanpos = xsp;
+ if (jj_3R_624()) jj_scanpos = xsp;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_580()
+ inline bool jj_3R_582()
{
if (jj_done) return true;
- if (jj_scan_token(OPEN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_327()) return true;
return false;
}
- inline bool jj_3R_534()
+ inline bool jj_3R_413()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_580()) jj_scanpos = xsp;
- if (jj_scan_token(IS_T)) return true;
- if (jj_3R_581()) return true;
+ if (jj_scan_token(INTEGER)) return true;
return false;
}
- inline bool jj_3R_640()
+ inline bool jj_3R_622()
{
if (jj_done) return true;
- if (jj_scan_token(NEG_T)) return true;
if (jj_scan_token(DOT_T)) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_611()
+ inline bool jj_3R_326()
{
if (jj_done) return true;
Token * xsp;
- if (jj_3R_640()) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_640()) { jj_scanpos = xsp; break; }
- }
+ xsp = jj_scanpos;
+ if (!jj_3R_412()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_413()) return true;
return false;
}
- inline bool jj_3R_581()
+ inline bool jj_3R_412()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3_110()
+ inline bool jj_3R_621()
{
if (jj_done) return true;
if (jj_scan_token(DOT_T)) return true;
- if (jj_3R_141()) return true;
+ if (jj_3R_147()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_554()
+ inline bool jj_3R_568()
{
if (jj_done) return true;
- if (jj_3R_611()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_612()) jj_scanpos = xsp;
- if (jj_3R_69()) return true;
- return false;
- }
-
- inline bool jj_3R_449()
- {
- if (jj_done) return true;
- if (jj_scan_token(DOUBLEMULT_T)) return true;
- if (jj_3R_370()) return true;
+ if (!jj_3R_621()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_622()) return true;
return false;
}
- inline bool jj_3R_610()
+ inline bool jj_3R_512()
{
if (jj_done) return true;
- if (jj_scan_token(DOT_T)) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_570()) return true;
return false;
}
- inline bool jj_3R_609()
+ inline bool jj_3R_511()
{
if (jj_done) return true;
- if (jj_scan_token(DOT_T)) return true;
- if (jj_3R_141()) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_569()) return true;
return false;
}
- inline bool jj_3R_553()
+ inline bool jj_3R_411()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_609()) {
+ if (!jj_3R_510()) return false;
jj_scanpos = xsp;
- if (jj_3R_610()) return true;
- }
+ if (!jj_3R_511()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_512()) return true;
return false;
}
- inline bool jj_3R_376()
+ inline bool jj_3R_510()
{
if (jj_done) return true;
- if (jj_scan_token(FILE_T)) return true;
- if (jj_3R_196()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_84()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_463()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_568()) return true;
return false;
}
- inline bool jj_3R_264()
+ inline bool jj_3R_189()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_489()
+ inline bool jj_3R_509()
{
if (jj_done) return true;
- if (jj_3R_555()) return true;
+ if (jj_scan_token(VARIABLE_T)) return true;
return false;
}
- inline bool jj_3R_284()
+ inline bool jj_3R_659()
{
if (jj_done) return true;
- if (jj_scan_token(NOT_T)) return true;
- if (jj_3R_370()) return true;
+ if (jj_scan_token(FILE_T)) return true;
+ if (jj_scan_token(OF_T)) return true;
+ if (jj_3R_161()) return true;
return false;
}
- inline bool jj_3R_488()
+ inline bool jj_3R_508()
{
if (jj_done) return true;
- if (jj_3R_554()) return true;
+ if (jj_scan_token(SIGNAL_T)) return true;
return false;
}
- inline bool jj_3R_283()
+ inline bool jj_3R_591()
{
if (jj_done) return true;
- if (jj_scan_token(ABS_T)) return true;
- if (jj_3R_370()) return true;
+ if (jj_scan_token(OPEN_T)) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_396()
+ inline bool jj_3R_410()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_487()) {
+ if (!jj_3R_507()) return false;
jj_scanpos = xsp;
- if (jj_3R_488()) {
+ if (!jj_3R_508()) return false;
jj_scanpos = xsp;
- if (jj_3R_489()) return true;
- }
- }
+ if (jj_3R_509()) return true;
return false;
}
- inline bool jj_3R_487()
+ inline bool jj_3R_507()
{
if (jj_done) return true;
- if (jj_3R_553()) return true;
+ if (jj_scan_token(CONSTANT_T)) return true;
return false;
}
- inline bool jj_3R_135()
+ inline bool jj_3R_549()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_282()) {
- jj_scanpos = xsp;
- if (jj_3R_283()) {
- jj_scanpos = xsp;
- if (jj_3R_284()) return true;
- }
- }
+ if (jj_3R_591()) jj_scanpos = xsp;
+ if (jj_scan_token(IS_T)) return true;
+ xsp = jj_scanpos;
+ if (jj_3R_592()) jj_scanpos = xsp;
+ if (jj_3R_593()) return true;
return false;
}
- inline bool jj_3R_282()
+ inline bool jj_3R_593()
{
if (jj_done) return true;
- if (jj_3R_370()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_449()) jj_scanpos = xsp;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3_107()
+ inline bool jj_3_114()
{
if (jj_done) return true;
- if (jj_3R_138()) return true;
+ if (jj_3R_144()) return true;
return false;
}
- inline bool jj_3R_486()
+ inline bool jj_3_118()
{
if (jj_done) return true;
- if (jj_scan_token(VARIABLE_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_485()
+ inline bool jj_3R_323()
{
if (jj_done) return true;
- if (jj_scan_token(SIGNAL_T)) return true;
+ if (jj_scan_token(SLSL_T)) return true;
+ if (jj_3R_410()) return true;
+ if (jj_3R_411()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_89()) return true;
+ if (jj_scan_token(RSRS_T)) return true;
return false;
}
- inline bool jj_3R_697()
+ inline bool jj_3_117()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_96()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_146()
+ inline bool jj_3R_467()
{
if (jj_done) return true;
- if (jj_3R_309()) return true;
- if (jj_3R_145()) return true;
+ if (jj_scan_token(DOUBLEMULT_T)) return true;
+ if (jj_3R_386()) return true;
return false;
}
- inline bool jj_3R_395()
+ inline bool jj_3R_392()
{
if (jj_done) return true;
+ if (jj_scan_token(FILE_T)) return true;
+ if (jj_3R_205()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_89()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_484()) {
- jj_scanpos = xsp;
- if (jj_3R_485()) {
- jj_scanpos = xsp;
- if (jj_3R_486()) return true;
- }
- }
- return false;
- }
-
- inline bool jj_3R_484()
- {
- if (jj_done) return true;
- if (jj_scan_token(CONSTANT_T)) return true;
+ if (jj_3R_481()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_394()
+ inline bool jj_3R_284()
{
if (jj_done) return true;
- if (jj_scan_token(OR_T)) return true;
+ if (jj_3R_137()) return true;
return false;
}
- inline bool jj_3R_393()
+ inline bool jj_3R_273()
{
if (jj_done) return true;
- if (jj_scan_token(XOR_T)) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_392()
+ inline bool jj_3_116()
{
if (jj_done) return true;
- if (jj_scan_token(XNOR_T)) return true;
+ if (jj_3R_146()) return true;
return false;
}
- inline bool jj_3_109()
+ inline bool jj_3R_295()
{
if (jj_done) return true;
- if (jj_3R_140()) return true;
+ if (jj_3R_320()) return true;
+ if (jj_3R_386()) return true;
return false;
}
- inline bool jj_3R_275()
+ inline bool jj_3R_294()
{
if (jj_done) return true;
- if (jj_3R_132()) return true;
+ if (jj_scan_token(QQ_T)) return true;
+ if (jj_3R_386()) return true;
return false;
}
- inline bool jj_3R_391()
+ inline bool jj_3R_293()
{
if (jj_done) return true;
- if (jj_scan_token(NOR_T)) return true;
+ if (jj_scan_token(NOT_T)) return true;
+ if (jj_3R_386()) return true;
return false;
}
- inline bool jj_3R_390()
+ inline bool jj_3R_292()
{
if (jj_done) return true;
- if (jj_scan_token(NAND_T)) return true;
+ if (jj_scan_token(ABS_T)) return true;
+ if (jj_3R_386()) return true;
return false;
}
- inline bool jj_3R_309()
+ inline bool jj_3R_141()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_389()) {
- jj_scanpos = xsp;
- if (jj_3R_390()) {
+ if (!jj_3R_291()) return false;
jj_scanpos = xsp;
- if (jj_3R_391()) {
+ if (!jj_3R_292()) return false;
jj_scanpos = xsp;
- if (jj_3R_392()) {
+ if (!jj_3R_293()) return false;
jj_scanpos = xsp;
- if (jj_3R_393()) {
+ if (!jj_3R_294()) return false;
jj_scanpos = xsp;
- if (jj_3R_394()) return true;
- }
- }
- }
- }
- }
+ if (jj_3R_295()) return true;
return false;
}
- inline bool jj_3R_389()
+ inline bool jj_3R_291()
{
if (jj_done) return true;
- if (jj_scan_token(AND_T)) return true;
+ if (jj_3R_386()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_467()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_311()
+ inline bool jj_3R_251()
{
if (jj_done) return true;
- if (jj_scan_token(SLSL_T)) return true;
- if (jj_3R_395()) return true;
- if (jj_3R_396()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_84()) return true;
- if (jj_scan_token(RSRS_T)) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_102()) return true;
return false;
}
- inline bool jj_3R_409()
+ inline bool jj_3R_152()
{
if (jj_done) return true;
- if (jj_3R_140()) return true;
+ if (jj_3R_320()) return true;
+ if (jj_3R_151()) return true;
return false;
}
- inline bool jj_3R_323()
+ inline bool jj_3R_296()
{
if (jj_done) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_409()) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(BEGIN_T)) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_58()
+ inline bool jj_3R_409()
{
if (jj_done) return true;
- if (jj_3R_145()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_146()) { jj_scanpos = xsp; break; }
- }
+ if (jj_scan_token(OR_T)) return true;
return false;
}
- inline bool jj_3R_169()
+ inline bool jj_3R_408()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_323()) jj_scanpos = xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_324()) { jj_scanpos = xsp; break; }
- }
+ if (jj_scan_token(XOR_T)) return true;
return false;
}
- inline bool jj_3R_285()
+ inline bool jj_3R_407()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_scan_token(XNOR_T)) return true;
return false;
}
- inline bool jj_3R_662()
+ inline bool jj_3R_246()
{
if (jj_done) return true;
- if (jj_scan_token(BEGIN_T)) return true;
- if (jj_3R_662()) return true;
+ if (jj_3R_137()) return true;
return false;
}
- inline bool jj_3R_235()
+ inline bool jj_3R_406()
{
if (jj_done) return true;
- if (jj_3R_132()) return true;
+ if (jj_scan_token(NOR_T)) return true;
return false;
}
- inline bool jj_3_108()
+ inline bool jj_3_115()
{
if (jj_done) return true;
- if (jj_3R_139()) return true;
+ if (jj_3R_145()) return true;
if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_265()
+ inline bool jj_3R_405()
{
if (jj_done) return true;
- if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_79()) return true;
+ if (jj_scan_token(NAND_T)) return true;
return false;
}
- inline bool jj_3R_263()
+ inline bool jj_3R_320()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_404()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_405()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_406()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_407()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_408()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_409()) return true;
return false;
}
- inline bool jj_3R_124()
+ inline bool jj_3R_404()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_263()) jj_scanpos = xsp;
- if (jj_scan_token(EXIT_T)) return true;
- xsp = jj_scanpos;
- if (jj_3R_264()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_265()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_scan_token(AND_T)) return true;
return false;
}
- inline bool jj_3R_138()
+ inline bool jj_3R_144()
{
if (jj_done) return true;
if (jj_scan_token(END_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_285()) jj_scanpos = xsp;
+ if (jj_3R_296()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_641()
+ inline bool jj_3R_648()
{
if (jj_done) return true;
- if (jj_3R_132()) return true;
+ if (jj_3R_137()) return true;
return false;
}
- inline bool jj_3R_688()
+ inline bool jj_3R_188()
{
if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_96()) return true;
+ if (jj_3R_349()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_61()
+ {
+ if (jj_done) return true;
+ if (jj_3R_151()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_697()) { jj_scanpos = xsp; break; }
+ if (jj_3R_152()) { jj_scanpos = xsp; break; }
}
- if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_652()
+ inline bool jj_3R_274()
{
if (jj_done) return true;
if (jj_scan_token(WHEN_T)) return true;
+ if (jj_3R_83()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_272()
+ {
+ if (jj_done) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_129()
+ {
+ if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3_108()) jj_scanpos = xsp;
- if (jj_3R_85()) return true;
- if (jj_scan_token(ARROW_T)) return true;
- if (jj_3R_662()) return true;
+ if (jj_3R_272()) jj_scanpos = xsp;
+ if (jj_scan_token(EXIT_T)) return true;
+ xsp = jj_scanpos;
+ if (jj_3R_273()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_274()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_619()
+ inline bool jj_3R_116()
{
if (jj_done) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_102()) return true;
Token * xsp;
- if (jj_3R_652()) return true;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_652()) { jj_scanpos = xsp; break; }
+ if (jj_3R_251()) { jj_scanpos = xsp; break; }
}
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_208()
+ inline bool jj_3R_136()
{
if (jj_done) return true;
- if (jj_3R_352()) return true;
+ if (jj_scan_token(GENERIC_T)) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_327()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_207()
+ inline bool jj_3R_218()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_369()) return true;
return false;
}
- inline bool jj_3R_96()
+ inline bool jj_3R_217()
+ {
+ if (jj_done) return true;
+ if (jj_3R_74()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_102()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_207()) {
+ if (!jj_3R_217()) return false;
jj_scanpos = xsp;
- if (jj_3R_208()) return true;
- }
+ if (jj_3R_218()) return true;
return false;
}
- inline bool jj_3R_561()
+ inline bool jj_3R_137()
{
if (jj_done) return true;
- if (jj_scan_token(CASE_T)) return true;
- if (jj_3R_58()) return true;
- if (jj_scan_token(GENERATE_T)) return true;
- if (jj_3R_619()) return true;
+ if (jj_scan_token(GENERIC_T)) return true;
+ if (jj_scan_token(MAP_T)) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_169()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_695()
+ inline bool jj_3R_685()
{
if (jj_done) return true;
- if (jj_3R_352()) return true;
+ if (jj_3R_369()) return true;
return false;
}
- inline bool jj_3R_694()
+ inline bool jj_3R_684()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_684()
+ inline bool jj_3R_661()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_694()) {
+ if (!jj_3R_684()) return false;
jj_scanpos = xsp;
- if (jj_3R_695()) return true;
- }
+ if (jj_3R_685()) return true;
return false;
}
- inline bool jj_3_36()
+ inline bool jj_3R_645()
{
if (jj_done) return true;
- if (jj_3R_88()) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_644()) return true;
return false;
}
- inline bool jj_3_35()
+ inline bool jj_3_38()
{
if (jj_done) return true;
- if (jj_3R_87()) return true;
+ if (jj_3R_93()) return true;
return false;
}
- inline bool jj_3R_131()
+ inline bool jj_3_37()
{
if (jj_done) return true;
- if (jj_scan_token(GENERIC_T)) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_313()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_92()) return true;
return false;
}
- inline bool jj_3R_132()
+ inline bool jj_3R_135()
{
if (jj_done) return true;
- if (jj_scan_token(GENERIC_T)) return true;
- if (jj_scan_token(MAP_T)) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_165()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_scan_token(FUNCTION_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(IS_T)) return true;
+ if (jj_scan_token(NEW_T)) return true;
+ if (jj_3R_63()) return true;
+ if (jj_3R_245()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_284()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_470()
+ inline bool jj_3R_95()
{
if (jj_done) return true;
- if (jj_3R_539()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_540()) return true;
+ if (jj_scan_token(PACKAGE_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(IS_T)) return true;
+ if (jj_scan_token(NEW_T)) return true;
+ if (jj_3R_63()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_648()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_685()
+ inline bool jj_3R_435()
{
if (jj_done) return true;
- if (jj_3R_234()) return true;
+ if (jj_scan_token(DOT_T)) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_585()
+ inline bool jj_3R_488()
{
if (jj_done) return true;
- if (jj_scan_token(ALL_T)) return true;
+ if (jj_3R_554()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_555()) return true;
return false;
}
- inline bool jj_3R_584()
+ inline bool jj_3R_662()
{
if (jj_done) return true;
- if (jj_scan_token(OTHER_T)) return true;
+ if (jj_3R_245()) return true;
return false;
}
- inline bool jj_3R_130()
+ inline bool jj_3R_91()
{
if (jj_done) return true;
- if (jj_scan_token(FUNCTION_T)) return true;
- if (jj_3R_69()) return true;
+ if (jj_scan_token(PACKAGE_T)) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(IS_T)) return true;
if (jj_scan_token(NEW_T)) return true;
- if (jj_3R_59()) return true;
- if (jj_3R_234()) return true;
+ if (jj_3R_63()) return true;
+ if (jj_3R_245()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_275()) jj_scanpos = xsp;
+ if (jj_3R_246()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_638()
+ inline bool jj_3R_438()
{
if (jj_done) return true;
- if (jj_3R_659()) return true;
+ if (jj_3R_348()) return true;
return false;
}
- inline bool jj_3R_583()
+ inline bool jj_3R_597()
{
if (jj_done) return true;
- Token * xsp;
- if (jj_3R_638()) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_638()) { jj_scanpos = xsp; break; }
- }
+ if (jj_scan_token(ALL_T)) return true;
return false;
}
- inline bool jj_3R_539()
+ inline bool jj_3R_437()
+ {
+ if (jj_done) return true;
+ if (jj_3R_346()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_596()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(OTHER_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_349()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_583()) {
+ if (!jj_3R_436()) return false;
jj_scanpos = xsp;
- if (jj_3R_584()) {
+ if (!jj_3R_437()) return false;
jj_scanpos = xsp;
- if (jj_3R_585()) return true;
- }
- }
+ if (jj_3R_438()) return true;
return false;
}
- inline bool jj_3R_107()
+ inline bool jj_3R_436()
{
if (jj_done) return true;
- if (jj_scan_token(PACKAGE_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(IS_T)) return true;
- if (jj_scan_token(NEW_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_347()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_595()
+ {
+ if (jj_done) return true;
+ if (jj_3R_644()) return true;
Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_641()) jj_scanpos = xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_645()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3R_659()
+ inline bool jj_3R_554()
{
if (jj_done) return true;
- if (jj_3R_684()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_685()) jj_scanpos = xsp;
+ if (!jj_3R_595()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_596()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_597()) return true;
return false;
}
- inline bool jj_3R_86()
+ inline bool jj_3R_87()
{
if (jj_done) return true;
- if (jj_scan_token(PACKAGE_T)) return true;
- if (jj_3R_69()) return true;
+ if (jj_scan_token(CONTEXT_T)) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(IS_T)) return true;
- if (jj_scan_token(NEW_T)) return true;
- if (jj_3R_59()) return true;
- if (jj_3R_234()) return true;
Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_188()) { jj_scanpos = xsp; break; }
+ }
+ if (jj_scan_token(END_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_235()) jj_scanpos = xsp;
+ if (jj_scan_token(32)) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_189()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3_32()
+ inline bool jj_3R_683()
{
if (jj_done) return true;
- if (jj_3R_64()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3_34()
+ inline bool jj_3R_644()
{
if (jj_done) return true;
- if (jj_3R_86()) return true;
+ if (jj_3R_661()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_662()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3_33()
+ inline bool jj_3R_263()
{
if (jj_done) return true;
- if (jj_3R_65()) return true;
+ if (jj_3R_382()) return true;
return false;
}
- inline bool jj_3R_543()
+ inline bool jj_3R_348()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_542()) return true;
+ if (jj_scan_token(CONTEXT_T)) return true;
+ if (jj_3R_74()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_435()) { jj_scanpos = xsp; break; }
+ }
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_683()
+ inline bool jj_3R_692()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_700()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_254()
+ inline bool jj_3R_682()
{
if (jj_done) return true;
- if (jj_3R_366()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_692()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3R_693()
+ inline bool jj_3_36()
{
if (jj_done) return true;
- if (jj_3R_703()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_91()) return true;
return false;
}
- inline bool jj_3R_682()
+ inline bool jj_3_34()
{
if (jj_done) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_693()) { jj_scanpos = xsp; break; }
- }
+ if (jj_3R_67()) return true;
return false;
}
inline bool jj_3R_720()
{
if (jj_done) return true;
- if (jj_3R_382()) return true;
+ if (jj_3R_347()) return true;
return false;
}
inline bool jj_3R_719()
{
if (jj_done) return true;
- if (jj_3R_379()) return true;
+ if (jj_3R_395()) return true;
return false;
}
- inline bool jj_3R_606()
+ inline bool jj_3_35()
{
if (jj_done) return true;
- if (jj_scan_token(BOX_T)) return true;
+ if (jj_3R_68()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_558()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_557()) return true;
return false;
}
inline bool jj_3R_718()
{
if (jj_done) return true;
- if (jj_3R_347()) return true;
+ if (jj_3R_364()) return true;
return false;
}
- inline bool jj_3R_703()
+ inline bool jj_3R_700()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_718()) {
+ if (!jj_3R_718()) return false;
jj_scanpos = xsp;
- if (jj_3R_719()) {
+ if (!jj_3R_719()) return false;
jj_scanpos = xsp;
if (jj_3R_720()) return true;
- }
- }
- return false;
- }
-
- inline bool jj_3R_349()
- {
- if (jj_done) return true;
- if (jj_scan_token(ENTITY_T)) return true;
- if (jj_3R_69()) return true;
return false;
}
inline bool jj_3R_681()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_253()
+ inline bool jj_3R_262()
{
if (jj_done) return true;
- if (jj_3R_365()) return true;
+ if (jj_3R_381()) return true;
return false;
}
- inline bool jj_3R_658()
+ inline bool jj_3R_660()
{
if (jj_done) return true;
if (jj_scan_token(PROTECTED_T)) return true;
@@ -3624,3802 +3399,3656 @@ void parseInline();
return false;
}
- inline bool jj_3R_474()
+ inline bool jj_3R_691()
+ {
+ if (jj_done) return true;
+ if (jj_3R_699()) return true;
+ return false;
+ }
+
+ inline bool jj_3_112()
+ {
+ if (jj_done) return true;
+ if (jj_3R_67()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_680()
{
if (jj_done) return true;
- if (jj_3R_542()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_543()) { jj_scanpos = xsp; break; }
+ if (jj_3R_691()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_692()
+ inline bool jj_3R_717()
{
if (jj_done) return true;
- if (jj_3R_702()) return true;
+ if (jj_3R_398()) return true;
return false;
}
- inline bool jj_3_105()
+ inline bool jj_3R_618()
{
if (jj_done) return true;
- if (jj_3R_64()) return true;
+ if (jj_scan_token(BOX_T)) return true;
return false;
}
- inline bool jj_3R_680()
+ inline bool jj_3_113()
{
if (jj_done) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_692()) { jj_scanpos = xsp; break; }
- }
+ if (jj_3R_68()) return true;
return false;
}
- inline bool jj_3R_542()
+ inline bool jj_3R_716()
{
if (jj_done) return true;
- if (jj_3R_540()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_606()) jj_scanpos = xsp;
+ if (jj_3R_347()) return true;
return false;
}
- inline bool jj_3R_717()
+ inline bool jj_3R_715()
{
if (jj_done) return true;
- if (jj_3R_383()) return true;
+ if (jj_3R_395()) return true;
return false;
}
- inline bool jj_3R_620()
+ inline bool jj_3R_714()
{
if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_67()) return true;
return false;
}
- inline bool jj_3R_602()
+ inline bool jj_3R_366()
{
if (jj_done) return true;
- if (jj_scan_token(FILE_T)) return true;
+ if (jj_scan_token(ENTITY_T)) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3_106()
+ inline bool jj_3R_713()
{
if (jj_done) return true;
- if (jj_3R_65()) return true;
+ if (jj_3R_393()) return true;
return false;
}
- inline bool jj_3R_716()
+ inline bool jj_3R_712()
{
if (jj_done) return true;
- if (jj_3R_382()) return true;
+ if (jj_3R_392()) return true;
return false;
}
- inline bool jj_3R_601()
+ inline bool jj_3R_711()
{
if (jj_done) return true;
- if (jj_scan_token(GROUP_T)) return true;
+ if (jj_3R_391()) return true;
return false;
}
- inline bool jj_3R_715()
+ inline bool jj_3R_710()
{
if (jj_done) return true;
- if (jj_3R_379()) return true;
+ if (jj_3R_389()) return true;
return false;
}
- inline bool jj_3R_600()
+ inline bool jj_3R_709()
{
if (jj_done) return true;
- if (jj_scan_token(UNITS_T)) return true;
+ if (jj_3R_388()) return true;
return false;
}
- inline bool jj_3R_599()
+ inline bool jj_3R_708()
{
if (jj_done) return true;
- if (jj_scan_token(LITERAL_T)) return true;
+ if (jj_3R_387()) return true;
return false;
}
- inline bool jj_3R_714()
+ inline bool jj_3R_707()
{
if (jj_done) return true;
- if (jj_3R_64()) return true;
+ if (jj_3R_540()) return true;
return false;
}
- inline bool jj_3R_598()
+ inline bool jj_3R_491()
{
if (jj_done) return true;
- if (jj_scan_token(LABEL_T)) return true;
+ if (jj_3R_557()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_558()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3R_597()
+ inline bool jj_3R_706()
{
if (jj_done) return true;
- if (jj_scan_token(COMPONENT_T)) return true;
+ if (jj_3R_98()) return true;
return false;
}
- inline bool jj_3R_713()
+ inline bool jj_3R_699()
{
if (jj_done) return true;
- if (jj_3R_377()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_706()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_707()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_708()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_709()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_710()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_711()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_712()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_713()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_714()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_715()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_716()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3_113()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_717()) return true;
return false;
}
- inline bool jj_3R_596()
+ inline bool jj_3R_261()
{
if (jj_done) return true;
- if (jj_scan_token(VARIABLE_T)) return true;
+ if (jj_3R_380()) return true;
return false;
}
- inline bool jj_3R_712()
+ inline bool jj_3R_557()
{
if (jj_done) return true;
- if (jj_3R_376()) return true;
+ if (jj_3R_555()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_618()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_595()
+ inline bool jj_3R_626()
{
if (jj_done) return true;
- if (jj_scan_token(SIGNAL_T)) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_711()
+ inline bool jj_3R_614()
{
if (jj_done) return true;
- if (jj_3R_375()) return true;
+ if (jj_scan_token(FILE_T)) return true;
return false;
}
- inline bool jj_3R_594()
+ inline bool jj_3R_544()
{
if (jj_done) return true;
- if (jj_scan_token(CONSTANT_T)) return true;
+ if (jj_scan_token(AFTER_T)) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_710()
+ inline bool jj_3R_613()
{
if (jj_done) return true;
- if (jj_3R_373()) return true;
+ if (jj_scan_token(GROUP_T)) return true;
return false;
}
- inline bool jj_3R_593()
+ inline bool jj_3R_612()
{
if (jj_done) return true;
- if (jj_scan_token(SUBTYPE_T)) return true;
+ if (jj_scan_token(UNITS_T)) return true;
return false;
}
- inline bool jj_3R_709()
+ inline bool jj_3R_611()
{
if (jj_done) return true;
- if (jj_3R_372()) return true;
+ if (jj_scan_token(LITERAL_T)) return true;
return false;
}
- inline bool jj_3R_592()
+ inline bool jj_3R_143()
{
if (jj_done) return true;
- if (jj_scan_token(TYPE_T)) return true;
+ if (jj_scan_token(PROTECTED_T)) return true;
+ if (jj_scan_token(BODY_T)) return true;
+ if (jj_3R_680()) return true;
+ if (jj_scan_token(END_T)) return true;
+ if (jj_scan_token(PROTECTED_T)) return true;
+ if (jj_scan_token(BODY_T)) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_681()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_708()
+ inline bool jj_3R_610()
{
if (jj_done) return true;
- if (jj_3R_371()) return true;
+ if (jj_scan_token(LABEL_T)) return true;
return false;
}
- inline bool jj_3R_591()
+ inline bool jj_3R_519()
{
if (jj_done) return true;
- if (jj_scan_token(PACKAGE_T)) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_463()) return true;
return false;
}
- inline bool jj_3R_707()
+ inline bool jj_3R_609()
{
if (jj_done) return true;
- if (jj_3R_525()) return true;
+ if (jj_scan_token(COMPONENT_T)) return true;
return false;
}
- inline bool jj_3R_590()
+ inline bool jj_3R_608()
{
if (jj_done) return true;
- if (jj_scan_token(FUNCTION_T)) return true;
+ if (jj_scan_token(VARIABLE_T)) return true;
return false;
}
- inline bool jj_3R_589()
+ inline bool jj_3R_607()
{
if (jj_done) return true;
- if (jj_scan_token(PROCEDURE_T)) return true;
+ if (jj_scan_token(SIGNAL_T)) return true;
return false;
}
- inline bool jj_3R_588()
+ inline bool jj_3R_606()
{
if (jj_done) return true;
- if (jj_scan_token(CONFIGURATION_T)) return true;
+ if (jj_scan_token(CONSTANT_T)) return true;
return false;
}
- inline bool jj_3R_706()
+ inline bool jj_3R_605()
{
if (jj_done) return true;
- if (jj_3R_92()) return true;
+ if (jj_scan_token(SUBTYPE_T)) return true;
return false;
}
- inline bool jj_3R_702()
+ inline bool jj_3R_604()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_706()) {
- jj_scanpos = xsp;
- if (jj_3R_707()) {
- jj_scanpos = xsp;
- if (jj_3R_708()) {
- jj_scanpos = xsp;
- if (jj_3R_709()) {
- jj_scanpos = xsp;
- if (jj_3R_710()) {
- jj_scanpos = xsp;
- if (jj_3R_711()) {
- jj_scanpos = xsp;
- if (jj_3R_712()) {
- jj_scanpos = xsp;
- if (jj_3R_713()) {
- jj_scanpos = xsp;
- if (jj_3R_714()) {
- jj_scanpos = xsp;
- if (jj_3R_715()) {
- jj_scanpos = xsp;
- if (jj_3R_716()) {
- jj_scanpos = xsp;
- if (jj_3_106()) {
- jj_scanpos = xsp;
- if (jj_3R_717()) return true;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
+ if (jj_scan_token(TYPE_T)) return true;
return false;
}
- inline bool jj_3R_587()
+ inline bool jj_3R_603()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(PACKAGE_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_602()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(FUNCTION_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_601()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(PROCEDURE_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_600()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(CONFIGURATION_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_599()
{
if (jj_done) return true;
if (jj_scan_token(ARCHITECTURE_T)) return true;
return false;
}
- inline bool jj_3R_252()
+ inline bool jj_3R_463()
{
if (jj_done) return true;
- if (jj_3R_364()) return true;
+ if (jj_3R_61()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_544()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_586()
+ inline bool jj_3R_598()
{
if (jj_done) return true;
if (jj_scan_token(ENTITY_T)) return true;
return false;
}
- inline bool jj_3R_540()
+ inline bool jj_3R_555()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_586()) {
+ if (!jj_3R_598()) return false;
jj_scanpos = xsp;
- if (jj_3R_587()) {
+ if (!jj_3R_599()) return false;
jj_scanpos = xsp;
- if (jj_3R_588()) {
+ if (!jj_3R_600()) return false;
jj_scanpos = xsp;
- if (jj_3R_589()) {
+ if (!jj_3R_601()) return false;
jj_scanpos = xsp;
- if (jj_3R_590()) {
+ if (!jj_3R_602()) return false;
jj_scanpos = xsp;
- if (jj_3R_591()) {
+ if (!jj_3R_603()) return false;
jj_scanpos = xsp;
- if (jj_3R_592()) {
+ if (!jj_3R_604()) return false;
jj_scanpos = xsp;
- if (jj_3R_593()) {
+ if (!jj_3R_605()) return false;
jj_scanpos = xsp;
- if (jj_3R_594()) {
+ if (!jj_3R_606()) return false;
jj_scanpos = xsp;
- if (jj_3R_595()) {
+ if (!jj_3R_607()) return false;
jj_scanpos = xsp;
- if (jj_3R_596()) {
+ if (!jj_3R_608()) return false;
jj_scanpos = xsp;
- if (jj_3R_597()) {
+ if (!jj_3R_609()) return false;
jj_scanpos = xsp;
- if (jj_3R_598()) {
+ if (!jj_3R_610()) return false;
jj_scanpos = xsp;
- if (jj_3R_599()) {
+ if (!jj_3R_611()) return false;
jj_scanpos = xsp;
- if (jj_3R_600()) {
+ if (!jj_3R_612()) return false;
jj_scanpos = xsp;
- if (jj_3R_601()) {
+ if (!jj_3R_613()) return false;
jj_scanpos = xsp;
- if (jj_3R_602()) return true;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
+ if (jj_3R_614()) return true;
return false;
}
- inline bool jj_3R_564()
+ inline bool jj_3R_576()
{
if (jj_done) return true;
if (jj_scan_token(OPEN_T)) return true;
return false;
}
- inline bool jj_3R_563()
+ inline bool jj_3R_575()
{
if (jj_done) return true;
if (jj_scan_token(CONFIGURATION_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_528()
+ inline bool jj_3R_422()
{
if (jj_done) return true;
- if (jj_scan_token(AFTER_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_scan_token(UNAFFECTED_T)) return true;
return false;
}
- inline bool jj_3R_562()
+ inline bool jj_3R_574()
{
if (jj_done) return true;
if (jj_scan_token(ENTITY_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_620()) jj_scanpos = xsp;
+ if (jj_3R_626()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_506()
+ inline bool jj_3R_521()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_562()) {
+ if (!jj_3R_574()) return false;
jj_scanpos = xsp;
- if (jj_3R_563()) {
+ if (!jj_3R_575()) return false;
jj_scanpos = xsp;
- if (jj_3R_564()) return true;
- }
- }
+ if (jj_3R_576()) return true;
return false;
}
- inline bool jj_3R_137()
+ inline bool jj_3R_332()
{
if (jj_done) return true;
- if (jj_scan_token(PROTECTED_T)) return true;
- if (jj_scan_token(BODY_T)) return true;
- if (jj_3R_680()) return true;
- if (jj_scan_token(END_T)) return true;
- if (jj_scan_token(PROTECTED_T)) return true;
- if (jj_scan_token(BODY_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_681()) jj_scanpos = xsp;
+ if (!jj_3R_421()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_422()) return true;
return false;
}
- inline bool jj_3R_496()
+ inline bool jj_3R_421()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_445()) return true;
+ if (jj_3R_463()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_519()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3_31()
+ inline bool jj_3R_260()
{
if (jj_done) return true;
- if (jj_3R_85()) return true;
- if (jj_scan_token(ARROW_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_705()
+ inline bool jj_3R_122()
{
if (jj_done) return true;
- if (jj_3R_196()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_84()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_260()) jj_scanpos = xsp;
+ if (jj_scan_token(WAIT_T)) return true;
+ xsp = jj_scanpos;
+ if (jj_3R_261()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_262()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_263()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_445()
+ inline bool jj_3_33()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_528()) jj_scanpos = xsp;
+ if (jj_3R_90()) return true;
+ if (jj_scan_token(ARROW_T)) return true;
return false;
}
- inline bool jj_3_30()
+ inline bool jj_3R_705()
{
if (jj_done) return true;
- if (jj_3R_84()) return true;
+ if (jj_3R_205()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_89()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3_29()
+ inline bool jj_3_32()
{
if (jj_done) return true;
- if (jj_3R_83()) return true;
+ if (jj_3R_89()) return true;
return false;
}
- inline bool jj_3R_359()
+ inline bool jj_3R_723()
{
if (jj_done) return true;
- if (jj_3R_85()) return true;
- if (jj_scan_token(ARROW_T)) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_722()) return true;
return false;
}
- inline bool jj_3R_407()
+ inline bool jj_3_31()
{
if (jj_done) return true;
- if (jj_scan_token(UNAFFECTED_T)) return true;
+ if (jj_3R_88()) return true;
return false;
}
- inline bool jj_3R_236()
+ inline bool jj_3R_376()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_359()) jj_scanpos = xsp;
- if (jj_3R_58()) return true;
+ if (jj_3R_90()) return true;
+ if (jj_scan_token(ARROW_T)) return true;
return false;
}
- inline bool jj_3R_318()
+ inline bool jj_3R_247()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_406()) {
- jj_scanpos = xsp;
- if (jj_3R_407()) return true;
- }
+ if (jj_3R_376()) jj_scanpos = xsp;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_406()
+ inline bool jj_3R_168()
{
if (jj_done) return true;
- if (jj_3R_445()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_496()) { jj_scanpos = xsp; break; }
- }
+ if (jj_3R_89()) return true;
return false;
}
- inline bool jj_3R_160()
+ inline bool jj_3R_167()
{
if (jj_done) return true;
- if (jj_3R_84()) return true;
+ if (jj_3R_88()) return true;
return false;
}
- inline bool jj_3R_159()
+ inline bool jj_3R_72()
{
if (jj_done) return true;
- if (jj_3R_83()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_167()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_168()) return true;
return false;
}
- inline bool jj_3R_67()
+ inline bool jj_3R_480()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_159()) {
- jj_scanpos = xsp;
- if (jj_3R_160()) return true;
- }
+ if (jj_scan_token(VARASSIGN_T)) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_251()
+ inline bool jj_3R_489()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_556()) return true;
if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_117()
+ inline bool jj_3R_391()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_251()) jj_scanpos = xsp;
- if (jj_scan_token(WAIT_T)) return true;
- xsp = jj_scanpos;
- if (jj_3R_252()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_253()) jj_scanpos = xsp;
+ if (jj_scan_token(101)) jj_scanpos = xsp;
+ if (jj_scan_token(VARIABLE_T)) return true;
+ if (jj_3R_205()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_89()) return true;
xsp = jj_scanpos;
- if (jj_3R_254()) jj_scanpos = xsp;
+ if (jj_3R_480()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_471()
+ inline bool jj_3R_490()
{
if (jj_done) return true;
- if (jj_3R_541()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_434()) return true;
return false;
}
- inline bool jj_3R_381()
+ inline bool jj_3R_458()
{
if (jj_done) return true;
- if (jj_scan_token(DISCONNECT_T)) return true;
- if (jj_3R_471()) return true;
- if (jj_scan_token(AFTER_T)) return true;
- if (jj_3R_58()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_542()) return true;
return false;
}
- inline bool jj_3R_459()
+ inline bool jj_3R_397()
{
if (jj_done) return true;
- if (jj_scan_token(VARASSIGN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_scan_token(DISCONNECT_T)) return true;
+ if (jj_3R_489()) return true;
+ if (jj_scan_token(AFTER_T)) return true;
+ if (jj_3R_61()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_239()
+ inline bool jj_3_111()
{
if (jj_done) return true;
- if (jj_scan_token(DOWNTO_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_155()
+ inline bool jj_3R_166()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_154()) return true;
+ if (jj_scan_token(DOWNTO_T)) return true;
return false;
}
- inline bool jj_3R_109()
+ inline bool jj_3R_378()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_238()) {
+ if (!jj_3R_457()) return false;
jj_scanpos = xsp;
- if (jj_3R_239()) return true;
- }
+ if (jj_3R_458()) return true;
return false;
}
- inline bool jj_3R_238()
+ inline bool jj_3R_457()
{
if (jj_done) return true;
- if (jj_scan_token(TO_T)) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3_111()) jj_scanpos = xsp;
+ if (jj_3R_119()) return true;
+ if (jj_scan_token(VARASSIGN_T)) return true;
+ if (jj_3R_61()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_569()
+ inline bool jj_3R_477()
{
if (jj_done) return true;
- if (jj_3R_310()) return true;
+ if (jj_scan_token(VARASSIGN_T)) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_568()
+ inline bool jj_3R_165()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_scan_token(TO_T)) return true;
return false;
}
- inline bool jj_3R_521()
+ inline bool jj_3R_71()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_568()) {
+ if (!jj_3R_165()) return false;
jj_scanpos = xsp;
- if (jj_3R_569()) return true;
- }
+ if (jj_3R_166()) return true;
return false;
}
- inline bool jj_3R_462()
+ inline bool jj_3R_581()
{
if (jj_done) return true;
- if (jj_scan_token(VARASSIGN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_321()) return true;
return false;
}
- inline bool jj_3R_375()
+ inline bool jj_3R_580()
+ {
+ if (jj_done) return true;
+ if (jj_3R_74()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_536()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_scan_token(101)) jj_scanpos = xsp;
- if (jj_scan_token(VARIABLE_T)) return true;
- if (jj_3R_196()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_84()) return true;
- xsp = jj_scanpos;
- if (jj_3R_462()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (!jj_3R_580()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_581()) return true;
return false;
}
- inline bool jj_3R_473()
+ inline bool jj_3R_347()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_472()) return true;
+ if (jj_scan_token(USE_T)) return true;
+ if (jj_3R_434()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_490()) { jj_scanpos = xsp; break; }
+ }
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_559()
+ inline bool jj_3R_573()
{
if (jj_done) return true;
if (jj_scan_token(REJECT_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_440()
+ inline bool jj_3_106()
{
if (jj_done) return true;
- if (jj_3R_527()) return true;
+ if (jj_3R_139()) return true;
return false;
}
- inline bool jj_3R_495()
+ inline bool jj_3R_518()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_559()) jj_scanpos = xsp;
+ if (jj_3R_573()) jj_scanpos = xsp;
if (jj_scan_token(INERTIAL_T)) return true;
return false;
}
- inline bool jj_3R_405()
+ inline bool jj_3R_704()
{
if (jj_done) return true;
+ if (jj_scan_token(ARRAY_T)) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_722()) return true;
Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_494()) {
- jj_scanpos = xsp;
- if (jj_3R_495()) return true;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_723()) { jj_scanpos = xsp; break; }
}
+ if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_scan_token(OF_T)) return true;
+ if (jj_3R_89()) return true;
return false;
}
- inline bool jj_3R_494()
+ inline bool jj_3R_517()
{
if (jj_done) return true;
if (jj_scan_token(TRANSPORT_T)) return true;
return false;
}
- inline bool jj_3_104()
+ inline bool jj_3_30()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_87()) return true;
return false;
}
- inline bool jj_3R_362()
+ inline bool jj_3R_420()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_439()) {
+ if (!jj_3R_517()) return false;
jj_scanpos = xsp;
- if (jj_3R_440()) return true;
- }
+ if (jj_3R_518()) return true;
return false;
}
- inline bool jj_3R_439()
+ inline bool jj_3R_161()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3_104()) jj_scanpos = xsp;
- if (jj_3R_114()) return true;
- if (jj_scan_token(VARASSIGN_T)) return true;
- if (jj_3R_58()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3_28()
+ inline bool jj_3_29()
{
if (jj_done) return true;
- if (jj_3R_82()) return true;
+ if (jj_3R_65()) return true;
return false;
}
- inline bool jj_3_27()
+ inline bool jj_3R_193()
{
if (jj_done) return true;
- if (jj_3R_81()) return true;
+ if (jj_3R_139()) return true;
return false;
}
- inline bool jj_3R_277()
+ inline bool jj_3R_643()
{
if (jj_done) return true;
- if (jj_3R_82()) return true;
+ if (jj_3R_660()) return true;
return false;
}
- inline bool jj_3R_133()
+ inline bool jj_3R_187()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_276()) {
- jj_scanpos = xsp;
- if (jj_3R_277()) return true;
- }
+ if (jj_3R_348()) return true;
return false;
}
- inline bool jj_3R_276()
+ inline bool jj_3_28()
{
if (jj_done) return true;
- if (jj_3R_81()) return true;
+ if (jj_3R_86()) return true;
return false;
}
- inline bool jj_3R_382()
+ inline bool jj_3R_186()
{
if (jj_done) return true;
- if (jj_scan_token(USE_T)) return true;
- if (jj_3R_472()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_473()) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_87()) return true;
return false;
}
- inline bool jj_3R_62()
+ inline bool jj_3_110()
{
if (jj_done) return true;
- if (jj_scan_token(ARRAY_T)) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_154()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_155()) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(RPAREN_T)) return true;
- if (jj_scan_token(OF_T)) return true;
- if (jj_3R_84()) return true;
+ if (jj_3R_143()) return true;
return false;
}
- inline bool jj_3R_157()
+ inline bool jj_3R_642()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_659()) return true;
return false;
}
- inline bool jj_3R_704()
+ inline bool jj_3R_185()
{
if (jj_done) return true;
- if (jj_scan_token(ARRAY_T)) return true;
- if (jj_3R_82()) return true;
- if (jj_scan_token(OF_T)) return true;
- if (jj_3R_84()) return true;
+ if (jj_3R_347()) return true;
return false;
}
- inline bool jj_3R_637()
+ inline bool jj_3R_641()
{
if (jj_done) return true;
if (jj_3R_658()) return true;
return false;
}
- inline bool jj_3_103()
- {
- if (jj_done) return true;
- if (jj_3R_137()) return true;
- return false;
- }
-
- inline bool jj_3R_636()
+ inline bool jj_3R_640()
{
if (jj_done) return true;
if (jj_3R_657()) return true;
return false;
}
- inline bool jj_3R_635()
- {
- if (jj_done) return true;
- if (jj_3R_656()) return true;
- return false;
- }
-
- inline bool jj_3R_634()
+ inline bool jj_3R_184()
{
if (jj_done) return true;
- if (jj_3R_655()) return true;
+ if (jj_3R_346()) return true;
return false;
}
- inline bool jj_3R_373()
+ inline bool jj_3R_85()
{
if (jj_done) return true;
- if (jj_scan_token(CONSTANT_T)) return true;
- if (jj_3R_196()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_84()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_459()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (!jj_3R_184()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_185()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_186()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_187()) return true;
return false;
}
- inline bool jj_3R_633()
+ inline bool jj_3R_639()
{
if (jj_done) return true;
- if (jj_3R_654()) return true;
+ if (jj_3R_656()) return true;
return false;
}
- inline bool jj_3R_577()
+ inline bool jj_3R_588()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_633()) {
+ if (!jj_3R_639()) return false;
jj_scanpos = xsp;
- if (jj_3R_634()) {
+ if (!jj_3R_640()) return false;
jj_scanpos = xsp;
- if (jj_3R_635()) {
+ if (!jj_3R_641()) return false;
jj_scanpos = xsp;
- if (jj_3R_636()) {
+ if (!jj_3R_642()) return false;
jj_scanpos = xsp;
- if (jj_3_103()) {
+ if (!jj_3_110()) return false;
jj_scanpos = xsp;
- if (jj_3R_637()) return true;
- }
- }
- }
- }
- }
+ if (jj_3R_643()) return true;
return false;
}
- inline bool jj_3_26()
+ inline bool jj_3R_286()
{
if (jj_done) return true;
- if (jj_3R_80()) return true;
+ if (jj_3R_65()) return true;
return false;
}
- inline bool jj_3_99()
+ inline bool jj_3R_139()
{
if (jj_done) return true;
- if (jj_3R_133()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_285()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_286()) return true;
return false;
}
- inline bool jj_3R_458()
+ inline bool jj_3R_285()
{
if (jj_done) return true;
- if (jj_3R_532()) return true;
+ if (jj_3R_86()) return true;
return false;
}
- inline bool jj_3R_380()
+ inline bool jj_3R_192()
{
if (jj_done) return true;
- if (jj_scan_token(FOR_T)) return true;
- if (jj_3R_177()) return true;
- if (jj_3R_332()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_567()
+ inline bool jj_3R_476()
{
if (jj_done) return true;
- if (jj_3R_333()) return true;
+ if (jj_3R_547()) return true;
return false;
}
- inline bool jj_3_102()
+ inline bool jj_3_109()
{
if (jj_done) return true;
- if (jj_3R_136()) return true;
+ if (jj_3R_142()) return true;
return false;
}
- inline bool jj_3R_371()
+ inline bool jj_3R_387()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3_102()) {
+ if (!jj_3_109()) return false;
jj_scanpos = xsp;
- if (jj_3R_458()) return true;
- }
- return false;
- }
-
- inline bool jj_3R_105()
- {
- if (jj_done) return true;
- if (jj_3R_59()) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_476()) return true;
return false;
}
- inline bool jj_3R_566()
+ inline bool jj_3_27()
{
if (jj_done) return true;
- if (jj_3R_80()) return true;
+ if (jj_3R_85()) return true;
return false;
}
- inline bool jj_3R_508()
+ inline bool jj_3R_111()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_566()) {
- jj_scanpos = xsp;
- if (jj_3R_567()) return true;
- }
+ if (jj_3R_63()) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_61()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3_101()
+ inline bool jj_3_108()
{
if (jj_done) return true;
- if (jj_3R_134()) return true;
- if (jj_3R_135()) return true;
+ if (jj_3R_140()) return true;
+ if (jj_3R_141()) return true;
return false;
}
- inline bool jj_3R_184()
+ inline bool jj_3R_703()
{
if (jj_done) return true;
- if (jj_3R_133()) return true;
+ if (jj_scan_token(ARRAY_T)) return true;
+ if (jj_3R_65()) return true;
+ if (jj_scan_token(OF_T)) return true;
+ if (jj_3R_89()) return true;
return false;
}
- inline bool jj_3R_366()
+ inline bool jj_3R_382()
{
if (jj_done) return true;
if (jj_scan_token(FOR_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_129()
+ inline bool jj_3R_134()
{
if (jj_done) return true;
- if (jj_3R_135()) return true;
+ if (jj_3R_141()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3_101()) { jj_scanpos = xsp; break; }
+ if (jj_3_108()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_247()
+ inline bool jj_3R_389()
{
if (jj_done) return true;
- if (jj_3R_108()) return true;
+ if (jj_scan_token(CONSTANT_T)) return true;
+ if (jj_3R_205()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_89()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_477()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_114()
+ inline bool jj_3R_256()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_246()) {
- jj_scanpos = xsp;
- if (jj_3R_247()) return true;
- }
+ if (jj_3R_114()) return true;
return false;
}
- inline bool jj_3_100()
+ inline bool jj_3R_119()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_255()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_256()) return true;
return false;
}
- inline bool jj_3R_246()
+ inline bool jj_3_107()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3_98()
+ inline bool jj_3R_255()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_218()
+ inline bool jj_3_26()
{
if (jj_done) return true;
- if (jj_scan_token(ALL_T)) return true;
+ if (jj_3R_84()) return true;
return false;
}
- inline bool jj_3R_217()
+ inline bool jj_3R_228()
{
if (jj_done) return true;
- if (jj_3R_310()) return true;
+ if (jj_scan_token(ALL_T)) return true;
return false;
}
- inline bool jj_3R_216()
+ inline bool jj_3R_396()
{
if (jj_done) return true;
- if (jj_3R_352()) return true;
+ if (jj_scan_token(FOR_T)) return true;
+ if (jj_3R_181()) return true;
+ if (jj_3R_344()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3_25()
+ inline bool jj_3R_227()
{
if (jj_done) return true;
- if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_79()) return true;
- if (jj_scan_token(ELSE_T)) return true;
+ if (jj_3R_321()) return true;
return false;
}
- inline bool jj_3R_350()
+ inline bool jj_3R_226()
{
if (jj_done) return true;
- if (jj_scan_token(CONFIGURATION_T)) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_369()) return true;
return false;
}
- inline bool jj_3R_215()
+ inline bool jj_3R_579()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_345()) return true;
return false;
}
- inline bool jj_3R_99()
+ inline bool jj_3R_105()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_215()) {
+ if (!jj_3R_225()) return false;
jj_scanpos = xsp;
- if (jj_3R_216()) {
+ if (!jj_3R_226()) return false;
jj_scanpos = xsp;
- if (jj_3R_217()) {
+ if (!jj_3R_227()) return false;
jj_scanpos = xsp;
- if (jj_3R_218()) return true;
- }
- }
- }
+ if (jj_3R_228()) return true;
return false;
}
- inline bool jj_3R_183()
+ inline bool jj_3R_225()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_320()
+ inline bool jj_3R_578()
{
if (jj_done) return true;
- if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_79()) return true;
+ if (jj_3R_84()) return true;
return false;
}
- inline bool jj_3R_84()
+ inline bool jj_3R_523()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_183()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_184()) jj_scanpos = xsp;
+ if (!jj_3R_578()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_579()) return true;
return false;
}
- inline bool jj_3R_319()
+ inline bool jj_3_105()
{
if (jj_done) return true;
- if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_79()) return true;
- if (jj_scan_token(ELSE_T)) return true;
- if (jj_3R_318()) return true;
+ if (jj_3R_138()) return true;
return false;
}
- inline bool jj_3R_167()
+ inline bool jj_3R_89()
{
if (jj_done) return true;
- if (jj_3R_318()) return true;
Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3_105()) jj_scanpos = xsp;
+ if (jj_3R_192()) return true;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_319()) { jj_scanpos = xsp; break; }
+ if (jj_3R_192()) { jj_scanpos = xsp; break; }
}
xsp = jj_scanpos;
- if (jj_3R_320()) jj_scanpos = xsp;
+ if (jj_3R_193()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_372()
+ inline bool jj_3R_138()
{
if (jj_done) return true;
- if (jj_scan_token(SUBTYPE_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(IS_T)) return true;
- if (jj_3R_84()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_61()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_631()
+ inline bool jj_3_25()
{
if (jj_done) return true;
- if (jj_3R_112()) return true;
+ if (jj_scan_token(WHEN_T)) return true;
+ if (jj_3R_83()) return true;
+ if (jj_scan_token(ELSE_T)) return true;
return false;
}
- inline bool jj_3R_71()
+ inline bool jj_3R_388()
{
if (jj_done) return true;
- if (jj_3R_114()) return true;
- if (jj_scan_token(LESSTHAN_T)) return true;
- if (jj_3R_166()) return true;
- if (jj_3R_167()) return true;
+ if (jj_scan_token(SUBTYPE_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(IS_T)) return true;
+ if (jj_3R_89()) return true;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_572()
+ inline bool jj_3R_637()
{
if (jj_done) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_631()) { jj_scanpos = xsp; break; }
- }
+ if (jj_3R_117()) return true;
return false;
}
- inline bool jj_3R_365()
+ inline bool jj_3R_584()
{
if (jj_done) return true;
- if (jj_scan_token(UNTIL_T)) return true;
- if (jj_3R_79()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_637()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3R_524()
+ inline bool jj_3R_367()
{
if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_570()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_scan_token(CONFIGURATION_T)) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_79()
+ inline bool jj_3R_334()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
+ if (jj_scan_token(WHEN_T)) return true;
+ if (jj_3R_83()) return true;
return false;
}
- inline bool jj_3_24()
+ inline bool jj_3R_333()
{
if (jj_done) return true;
- if (jj_3R_78()) return true;
+ if (jj_scan_token(WHEN_T)) return true;
+ if (jj_3R_83()) return true;
+ if (jj_scan_token(ELSE_T)) return true;
+ if (jj_3R_332()) return true;
return false;
}
- inline bool jj_3_23()
+ inline bool jj_3R_539()
{
if (jj_done) return true;
- if (jj_3R_77()) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_582()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_523()
+ inline bool jj_3R_173()
{
if (jj_done) return true;
+ if (jj_3R_332()) return true;
Token * xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(84)) {
- jj_scanpos = xsp;
- if (jj_scan_token(52)) return true;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_333()) { jj_scanpos = xsp; break; }
}
- return false;
- }
-
- inline bool jj_3_22()
- {
- if (jj_done) return true;
- if (jj_3R_76()) return true;
- return false;
- }
-
- inline bool jj_3_97()
- {
- if (jj_done) return true;
- if (jj_3R_132()) return true;
- return false;
- }
-
- inline bool jj_3R_433()
- {
- if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_523()) jj_scanpos = xsp;
- if (jj_scan_token(FUNCTION_T)) return true;
- if (jj_3R_521()) return true;
xsp = jj_scanpos;
- if (jj_3R_524()) jj_scanpos = xsp;
- if (jj_scan_token(RETURN_T)) return true;
- if (jj_3R_157()) return true;
+ if (jj_3R_334()) jj_scanpos = xsp;
return false;
}
inline bool jj_3R_75()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_119()) return true;
+ if (jj_scan_token(LESSTHAN_T)) return true;
+ if (jj_3R_172()) return true;
+ if (jj_3R_173()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3_96()
+ inline bool jj_3R_538()
{
if (jj_done) return true;
- if (jj_3R_131()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_scan_token(84)) return false;
+ jj_scanpos = xsp;
+ if (jj_scan_token(52)) return true;
return false;
}
- inline bool jj_3R_522()
+ inline bool jj_3_104()
{
if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_313()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_137()) return true;
return false;
}
- inline bool jj_3_21()
+ inline bool jj_3R_451()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_75()) jj_scanpos = xsp;
+ if (jj_3R_538()) jj_scanpos = xsp;
+ if (jj_scan_token(FUNCTION_T)) return true;
+ if (jj_3R_536()) return true;
xsp = jj_scanpos;
- if (jj_scan_token(79)) jj_scanpos = xsp;
- if (jj_scan_token(ASSERT_T)) return true;
- return false;
- }
-
- inline bool jj_3R_504()
- {
- if (jj_done) return true;
- if (jj_3R_78()) return true;
- return false;
- }
-
- inline bool jj_3R_503()
- {
- if (jj_done) return true;
- if (jj_3R_77()) return true;
+ if (jj_3R_539()) jj_scanpos = xsp;
+ if (jj_scan_token(RETURN_T)) return true;
+ if (jj_3R_161()) return true;
return false;
}
- inline bool jj_3_20()
+ inline bool jj_3_103()
{
if (jj_done) return true;
- if (jj_3R_74()) return true;
+ if (jj_3R_136()) return true;
return false;
}
- inline bool jj_3R_73()
+ inline bool jj_3R_537()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_327()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_502()
+ inline bool jj_3R_381()
{
if (jj_done) return true;
- if (jj_3R_76()) return true;
+ if (jj_scan_token(UNTIL_T)) return true;
+ if (jj_3R_83()) return true;
return false;
}
- inline bool jj_3_19()
+ inline bool jj_3R_83()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_73()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(79)) jj_scanpos = xsp;
- if (jj_scan_token(PROCESS_T)) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_72()
+ inline bool jj_3_24()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_82()) return true;
return false;
}
- inline bool jj_3R_501()
+ inline bool jj_3_23()
{
if (jj_done) return true;
- if (jj_3R_87()) return true;
+ if (jj_3R_81()) return true;
return false;
}
- inline bool jj_3_18()
+ inline bool jj_3_22()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_72()) jj_scanpos = xsp;
- if (jj_scan_token(BLOCK_T)) return true;
+ if (jj_3R_80()) return true;
return false;
}
- inline bool jj_3R_347()
+ inline bool jj_3R_364()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_432()) {
+ if (!jj_3R_450()) return false;
jj_scanpos = xsp;
- if (jj_3R_433()) return true;
- }
+ if (jj_3R_451()) return true;
return false;
}
- inline bool jj_3R_432()
+ inline bool jj_3R_450()
{
if (jj_done) return true;
if (jj_scan_token(PROCEDURE_T)) return true;
- if (jj_3R_521()) return true;
+ if (jj_3R_536()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_522()) jj_scanpos = xsp;
+ if (jj_3R_537()) jj_scanpos = xsp;
xsp = jj_scanpos;
- if (jj_3_96()) jj_scanpos = xsp;
+ if (jj_3_103()) jj_scanpos = xsp;
xsp = jj_scanpos;
- if (jj_3_97()) jj_scanpos = xsp;
- if (jj_3R_424()) return true;
+ if (jj_3_104()) jj_scanpos = xsp;
+ if (jj_3R_442()) return true;
return false;
}
- inline bool jj_3R_500()
+ inline bool jj_3R_79()
{
if (jj_done) return true;
- if (jj_3R_561()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_499()
+ inline bool jj_3_21()
{
if (jj_done) return true;
- if (jj_3R_74()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_79()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(79)) jj_scanpos = xsp;
+ if (jj_scan_token(ASSERT_T)) return true;
return false;
}
- inline bool jj_3R_632()
+ inline bool jj_3R_638()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_scan_token(46)) {
+ if (!jj_scan_token(46)) return false;
jj_scanpos = xsp;
if (jj_scan_token(80)) return true;
- }
return false;
}
- inline bool jj_3R_498()
+ inline bool jj_3R_636()
{
if (jj_done) return true;
- if (jj_3R_88()) return true;
+ if (jj_3R_655()) return true;
return false;
}
- inline bool jj_3R_630()
+ inline bool jj_3R_583()
{
if (jj_done) return true;
- if (jj_3R_653()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_636()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3R_571()
+ inline bool jj_3R_77()
{
if (jj_done) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_630()) { jj_scanpos = xsp; break; }
- }
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_410()
+ inline bool jj_3_19()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_497()) {
- jj_scanpos = xsp;
- if (jj_3R_498()) {
- jj_scanpos = xsp;
- if (jj_3R_499()) {
- jj_scanpos = xsp;
- if (jj_3R_500()) {
- jj_scanpos = xsp;
- if (jj_3R_501()) {
- jj_scanpos = xsp;
- if (jj_3R_502()) {
- jj_scanpos = xsp;
- if (jj_3R_503()) {
- jj_scanpos = xsp;
- if (jj_3R_504()) {
- jj_scanpos = xsp;
- if (jj_scan_token(189)) return true;
- }
- }
- }
- }
- }
- }
- }
- }
+ if (jj_3R_77()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(79)) jj_scanpos = xsp;
+ if (jj_scan_token(PROCESS_T)) return true;
return false;
}
- inline bool jj_3R_497()
+ inline bool jj_3R_76()
{
if (jj_done) return true;
- if (jj_3R_560()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3_17()
+ inline bool jj_3_18()
{
if (jj_done) return true;
- if (jj_3R_71()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_76()) jj_scanpos = xsp;
+ if (jj_scan_token(BLOCK_T)) return true;
return false;
}
- inline bool jj_3_94()
+ inline bool jj_3_101()
{
if (jj_done) return true;
- if (jj_3R_64()) return true;
+ if (jj_3R_67()) return true;
return false;
}
inline bool jj_3R_675()
{
if (jj_done) return true;
- if (jj_3R_383()) return true;
+ if (jj_3R_398()) return true;
return false;
}
- inline bool jj_3R_172()
+ inline bool jj_3_20()
{
if (jj_done) return true;
- if (jj_3R_325()) return true;
+ if (jj_3R_78()) return true;
return false;
}
inline bool jj_3R_674()
{
if (jj_done) return true;
- if (jj_3R_382()) return true;
+ if (jj_3R_347()) return true;
return false;
}
- inline bool jj_3_95()
+ inline bool jj_3_102()
{
if (jj_done) return true;
- if (jj_3R_65()) return true;
+ if (jj_3R_68()) return true;
return false;
}
inline bool jj_3R_673()
{
if (jj_done) return true;
- if (jj_3R_379()) return true;
- return false;
- }
-
- inline bool jj_3R_171()
- {
- if (jj_done) return true;
- if (jj_3R_71()) return true;
- return false;
- }
-
- inline bool jj_3_16()
- {
- if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
- return false;
- }
-
- inline bool jj_3R_76()
- {
- if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3_16()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(79)) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_171()) {
- jj_scanpos = xsp;
- if (jj_3R_172()) return true;
- }
+ if (jj_3R_395()) return true;
return false;
}
inline bool jj_3R_672()
{
if (jj_done) return true;
- if (jj_3R_64()) return true;
+ if (jj_3R_67()) return true;
return false;
}
inline bool jj_3R_671()
{
if (jj_done) return true;
- if (jj_3R_377()) return true;
+ if (jj_3R_393()) return true;
return false;
}
inline bool jj_3R_670()
{
if (jj_done) return true;
- if (jj_3R_376()) return true;
+ if (jj_3R_392()) return true;
return false;
}
- inline bool jj_3_15()
+ inline bool jj_3_17()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_75()) return true;
return false;
}
inline bool jj_3R_669()
{
if (jj_done) return true;
- if (jj_3R_375()) return true;
+ if (jj_3R_391()) return true;
return false;
}
- inline bool jj_3R_574()
+ inline bool jj_3R_586()
{
if (jj_done) return true;
- if (jj_3R_521()) return true;
+ if (jj_3R_536()) return true;
return false;
}
inline bool jj_3R_668()
{
if (jj_done) return true;
- if (jj_3R_373()) return true;
+ if (jj_3R_389()) return true;
return false;
}
inline bool jj_3R_667()
{
if (jj_done) return true;
- if (jj_3R_372()) return true;
+ if (jj_3R_388()) return true;
return false;
}
inline bool jj_3R_666()
{
if (jj_done) return true;
- if (jj_3R_525()) return true;
- return false;
- }
-
- inline bool jj_3R_78()
- {
- if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3_15()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(79)) jj_scanpos = xsp;
- if (jj_3R_176()) return true;
- if (jj_scan_token(SEMI_T)) return true;
- return false;
- }
-
- inline bool jj_3_14()
- {
- if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_540()) return true;
return false;
}
- inline bool jj_3_13()
+ inline bool jj_3R_665()
{
if (jj_done) return true;
- if (jj_3R_70()) return true;
+ if (jj_3R_387()) return true;
return false;
}
- inline bool jj_3R_665()
+ inline bool jj_3R_176()
{
if (jj_done) return true;
- if (jj_3R_371()) return true;
+ if (jj_3R_337()) return true;
return false;
}
inline bool jj_3R_664()
{
if (jj_done) return true;
- if (jj_3R_92()) return true;
+ if (jj_3R_98()) return true;
return false;
}
- inline bool jj_3R_653()
+ inline bool jj_3R_655()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_664()) {
+ if (!jj_3R_664()) return false;
jj_scanpos = xsp;
- if (jj_3R_665()) {
+ if (!jj_3R_665()) return false;
jj_scanpos = xsp;
- if (jj_3R_666()) {
+ if (!jj_3R_666()) return false;
jj_scanpos = xsp;
- if (jj_3R_667()) {
+ if (!jj_3R_667()) return false;
jj_scanpos = xsp;
- if (jj_3R_668()) {
+ if (!jj_3R_668()) return false;
jj_scanpos = xsp;
- if (jj_3R_669()) {
+ if (!jj_3R_669()) return false;
jj_scanpos = xsp;
- if (jj_3R_670()) {
+ if (!jj_3R_670()) return false;
jj_scanpos = xsp;
- if (jj_3R_671()) {
+ if (!jj_3R_671()) return false;
jj_scanpos = xsp;
- if (jj_3R_672()) {
+ if (!jj_3R_672()) return false;
jj_scanpos = xsp;
- if (jj_3R_673()) {
+ if (!jj_3R_673()) return false;
jj_scanpos = xsp;
- if (jj_3R_674()) {
+ if (!jj_3R_674()) return false;
jj_scanpos = xsp;
- if (jj_3_95()) {
+ if (!jj_3_102()) return false;
jj_scanpos = xsp;
if (jj_3R_675()) return true;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
return false;
}
- inline bool jj_3R_87()
+ inline bool jj_3R_175()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3_14()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(79)) jj_scanpos = xsp;
- if (jj_3R_187()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_75()) return true;
return false;
}
- inline bool jj_3R_679()
+ inline bool jj_3_16()
{
if (jj_done) return true;
- if (jj_3R_691()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_461()
+ inline bool jj_3R_479()
{
if (jj_done) return true;
if (jj_scan_token(VARASSIGN_T)) return true;
- if (jj_3R_58()) return true;
- return false;
- }
-
- inline bool jj_3R_678()
- {
- if (jj_done) return true;
- if (jj_3R_690()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_655()
+ inline bool jj_3R_80()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_678()) {
+ if (jj_3_16()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(79)) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_175()) return false;
jj_scanpos = xsp;
- if (jj_3R_679()) return true;
- }
+ if (jj_3R_176()) return true;
return false;
}
- inline bool jj_3_93()
+ inline bool jj_3_100()
{
if (jj_done) return true;
- if (jj_3R_130()) return true;
+ if (jj_3R_135()) return true;
return false;
}
- inline bool jj_3R_348()
+ inline bool jj_3R_365()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_434()) {
+ if (!jj_3R_452()) return false;
jj_scanpos = xsp;
if (jj_scan_token(137)) return true;
- }
return false;
}
- inline bool jj_3R_434()
+ inline bool jj_3R_452()
{
if (jj_done) return true;
- if (jj_3R_525()) return true;
+ if (jj_3R_540()) return true;
return false;
}
- inline bool jj_3R_175()
+ inline bool jj_3_15()
{
if (jj_done) return true;
- if (jj_3R_329()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_174()
+ inline bool jj_3R_82()
{
if (jj_done) return true;
- if (jj_3R_70()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3_15()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(79)) jj_scanpos = xsp;
+ if (jj_3R_180()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_469()
+ inline bool jj_3_14()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_177()
+ inline bool jj_3_13()
{
if (jj_done) return true;
- if (jj_3R_331()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_73()) return true;
return false;
}
- inline bool jj_3R_200()
+ inline bool jj_3R_209()
{
if (jj_done) return true;
- if (jj_3R_347()) return true;
- if (jj_3R_348()) return true;
+ if (jj_3R_364()) return true;
+ if (jj_3R_365()) return true;
return false;
}
- inline bool jj_3R_573()
+ inline bool jj_3R_92()
{
if (jj_done) return true;
- if (jj_3R_632()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3_14()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(79)) jj_scanpos = xsp;
+ if (jj_3R_196()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_199()
+ inline bool jj_3R_585()
{
if (jj_done) return true;
- if (jj_3R_130()) return true;
+ if (jj_3R_638()) return true;
return false;
}
- inline bool jj_3R_92()
+ inline bool jj_3R_208()
+ {
+ if (jj_done) return true;
+ if (jj_3R_135()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_98()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_199()) {
+ if (!jj_3R_208()) return false;
jj_scanpos = xsp;
- if (jj_3R_200()) return true;
- }
+ if (jj_3R_209()) return true;
return false;
}
- inline bool jj_3_92()
+ inline bool jj_3_99()
{
if (jj_done) return true;
- if (jj_3R_128()) return true;
- if (jj_3R_129()) return true;
+ if (jj_3R_133()) return true;
+ if (jj_3R_134()) return true;
return false;
}
- inline bool jj_3R_460()
+ inline bool jj_3R_679()
{
if (jj_done) return true;
- if (jj_3R_533()) return true;
+ if (jj_3R_690()) return true;
return false;
}
- inline bool jj_3R_162()
+ inline bool jj_3R_678()
{
if (jj_done) return true;
- if (jj_3R_128()) return true;
- if (jj_3R_129()) return true;
+ if (jj_3R_689()) return true;
return false;
}
- inline bool jj_3R_77()
+ inline bool jj_3R_657()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_173()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_174()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_175()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (!jj_3R_678()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_679()) return true;
return false;
}
- inline bool jj_3R_468()
+ inline bool jj_3R_179()
{
if (jj_done) return true;
- if (jj_3R_538()) return true;
+ if (jj_3R_341()) return true;
return false;
}
- inline bool jj_3R_467()
+ inline bool jj_3R_178()
{
if (jj_done) return true;
- if (jj_3R_66()) return true;
+ if (jj_3R_73()) return true;
return false;
}
- inline bool jj_3R_525()
+ inline bool jj_3R_487()
{
if (jj_done) return true;
- if (jj_scan_token(IS_T)) return true;
- if (jj_3R_571()) return true;
- if (jj_scan_token(BEGIN_T)) return true;
- if (jj_3R_572()) return true;
- if (jj_scan_token(END_T)) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_573()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_574()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_179()
+ inline bool jj_3R_478()
{
if (jj_done) return true;
- if (jj_3R_333()) return true;
+ if (jj_3R_548()) return true;
return false;
}
- inline bool jj_3R_178()
+ inline bool jj_3R_181()
{
if (jj_done) return true;
- if (jj_3R_332()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_343()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_614()
+ inline bool jj_3R_164()
{
if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_133()) return true;
+ if (jj_3R_134()) return true;
return false;
}
- inline bool jj_3R_186()
+ inline bool jj_3R_540()
{
if (jj_done) return true;
- if (jj_scan_token(BAR_T)) return true;
- if (jj_3R_185()) return true;
+ if (jj_scan_token(IS_T)) return true;
+ if (jj_3R_583()) return true;
+ if (jj_scan_token(BEGIN_T)) return true;
+ if (jj_3R_584()) return true;
+ if (jj_scan_token(END_T)) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_585()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_586()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_378()
+ inline bool jj_3R_81()
{
if (jj_done) return true;
- if (jj_scan_token(COMPONENT_T)) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_177()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_scan_token(56)) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_467()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_468()) jj_scanpos = xsp;
- if (jj_scan_token(END_T)) return true;
- if (jj_scan_token(COMPONENT_T)) return true;
+ if (jj_3R_178()) jj_scanpos = xsp;
xsp = jj_scanpos;
- if (jj_3R_469()) jj_scanpos = xsp;
+ if (jj_3R_179()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_356()
+ inline bool jj_3R_373()
{
if (jj_done) return true;
if (jj_scan_token(STRINGLITERAL)) return true;
return false;
}
- inline bool jj_3R_80()
+ inline bool jj_3R_486()
{
if (jj_done) return true;
- if (jj_scan_token(FOR_T)) return true;
- if (jj_3R_177()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_178()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_179()) jj_scanpos = xsp;
- if (jj_scan_token(END_T)) return true;
- if (jj_scan_token(FOR_T)) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_553()) return true;
return false;
}
- inline bool jj_3_12()
+ inline bool jj_3R_485()
{
if (jj_done) return true;
if (jj_3R_69()) return true;
return false;
}
- inline bool jj_3_11()
+ inline bool jj_3R_183()
{
if (jj_done) return true;
- if (jj_3R_68()) return true;
+ if (jj_3R_345()) return true;
return false;
}
- inline bool jj_3R_85()
+ inline bool jj_3R_182()
{
if (jj_done) return true;
- if (jj_3R_185()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_186()) { jj_scanpos = xsp; break; }
- }
+ if (jj_3R_344()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_435()
+ inline bool jj_3R_453()
{
if (jj_done) return true;
if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3_10()
+ inline bool jj_3R_195()
{
if (jj_done) return true;
- if (jj_3R_67()) return true;
+ if (jj_scan_token(BAR_T)) return true;
+ if (jj_3R_194()) return true;
return false;
}
- inline bool jj_3R_337()
+ inline bool jj_3R_394()
{
if (jj_done) return true;
- if (jj_scan_token(OTHER_T)) return true;
+ if (jj_scan_token(COMPONENT_T)) return true;
+ if (jj_3R_74()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(56)) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_485()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_486()) jj_scanpos = xsp;
+ if (jj_scan_token(END_T)) return true;
+ if (jj_scan_token(COMPONENT_T)) return true;
+ xsp = jj_scanpos;
+ if (jj_3R_487()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_161()
+ inline bool jj_3R_163()
{
if (jj_done) return true;
- if (jj_3R_314()) return true;
+ if (jj_3R_328()) return true;
return false;
}
- inline bool jj_3R_68()
+ inline bool jj_3R_70()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_161()) jj_scanpos = xsp;
- if (jj_3R_129()) return true;
+ if (jj_3R_163()) jj_scanpos = xsp;
+ if (jj_3R_134()) return true;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_162()) { jj_scanpos = xsp; break; }
+ if (jj_3R_164()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_336()
- {
- if (jj_done) return true;
- if (jj_3R_69()) return true;
- return false;
- }
-
- inline bool jj_3R_335()
+ inline bool jj_3R_84()
{
if (jj_done) return true;
- if (jj_3R_68()) return true;
+ if (jj_scan_token(FOR_T)) return true;
+ if (jj_3R_181()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_182()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_183()) jj_scanpos = xsp;
+ if (jj_scan_token(END_T)) return true;
+ if (jj_scan_token(FOR_T)) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_358()
+ inline bool jj_3R_375()
{
if (jj_done) return true;
if (jj_scan_token(RETURN_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_639()
+ inline bool jj_3R_646()
{
if (jj_done) return true;
if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_357()
+ inline bool jj_3R_374()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_435()) { jj_scanpos = xsp; break; }
+ if (jj_3R_453()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_628()
+ inline bool jj_3_12()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_72()) return true;
return false;
}
- inline bool jj_3R_185()
+ inline bool jj_3R_90()
{
if (jj_done) return true;
+ if (jj_3R_194()) return true;
Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_334()) {
- jj_scanpos = xsp;
- if (jj_3R_335()) {
- jj_scanpos = xsp;
- if (jj_3R_336()) {
- jj_scanpos = xsp;
- if (jj_3R_337()) return true;
- }
- }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_195()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_334()
- {
- if (jj_done) return true;
- if (jj_3R_67()) return true;
- return false;
- }
-
- inline bool jj_3R_234()
+ inline bool jj_3R_245()
{
if (jj_done) return true;
if (jj_scan_token(LBRACKET_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_357()) jj_scanpos = xsp;
+ if (jj_3R_374()) jj_scanpos = xsp;
xsp = jj_scanpos;
- if (jj_3R_358()) jj_scanpos = xsp;
+ if (jj_3R_375()) jj_scanpos = xsp;
if (jj_scan_token(RBRACKET_T)) return true;
return false;
}
- inline bool jj_3R_605()
+ inline bool jj_3_11()
+ {
+ if (jj_done) return true;
+ if (jj_3R_70()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_617()
{
if (jj_done) return true;
if (jj_scan_token(ALL_T)) return true;
return false;
}
- inline bool jj_3R_352()
+ inline bool jj_3R_354()
{
if (jj_done) return true;
- if (jj_scan_token(CHARACTER_LITERAL)) return true;
+ if (jj_scan_token(OTHER_T)) return true;
return false;
}
- inline bool jj_3R_604()
+ inline bool jj_3R_616()
{
if (jj_done) return true;
if (jj_scan_token(OTHER_T)) return true;
return false;
}
- inline bool jj_3R_603()
+ inline bool jj_3_10()
+ {
+ if (jj_done) return true;
+ if (jj_3R_70()) return true;
+ if (jj_3R_71()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_353()
+ {
+ if (jj_done) return true;
+ if (jj_3R_74()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_615()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_639()) { jj_scanpos = xsp; break; }
+ if (jj_3R_646()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_541()
+ inline bool jj_3R_556()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_603()) {
+ if (!jj_3R_615()) return false;
jj_scanpos = xsp;
- if (jj_3R_604()) {
+ if (!jj_3R_616()) return false;
jj_scanpos = xsp;
- if (jj_3R_605()) return true;
- }
- }
+ if (jj_3R_617()) return true;
return false;
}
- inline bool jj_3R_579()
+ inline bool jj_3R_590()
{
if (jj_done) return true;
if (jj_scan_token(BUS_T)) return true;
return false;
}
- inline bool jj_3R_578()
+ inline bool jj_3R_352()
{
if (jj_done) return true;
- if (jj_scan_token(REGISTER_T)) return true;
+ if (jj_3R_72()) return true;
return false;
}
- inline bool jj_3R_533()
+ inline bool jj_3R_589()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_578()) {
- jj_scanpos = xsp;
- if (jj_3R_579()) return true;
- }
+ if (jj_scan_token(REGISTER_T)) return true;
return false;
}
- inline bool jj_3R_626()
+ inline bool jj_3R_548()
{
if (jj_done) return true;
- if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_85()) return true;
- if (jj_scan_token(ARROW_T)) return true;
- if (jj_3R_259()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_589()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_590()) return true;
return false;
}
- inline bool jj_3R_618()
+ inline bool jj_3R_351()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_70()) return true;
return false;
}
- inline bool jj_3R_627()
+ inline bool jj_3R_194()
{
if (jj_done) return true;
- if (jj_3R_626()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_350()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_351()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_352()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_353()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_354()) return true;
return false;
}
- inline bool jj_3R_660()
+ inline bool jj_3R_350()
{
if (jj_done) return true;
- if (jj_3R_70()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_88()) return true;
return false;
}
- inline bool jj_3R_374()
+ inline bool jj_3R_634()
{
if (jj_done) return true;
- if (jj_scan_token(SIGNAL_T)) return true;
- if (jj_3R_196()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_84()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_460()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_461()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3_91()
+ inline bool jj_3R_369()
{
if (jj_done) return true;
- if (jj_3R_127()) return true;
+ if (jj_scan_token(CHARACTER_LITERAL)) return true;
return false;
}
- inline bool jj_3R_256()
+ inline bool jj_3R_390()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_scan_token(SIGNAL_T)) return true;
+ if (jj_3R_205()) return true;
if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_89()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_478()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_479()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_121()
+ inline bool jj_3R_632()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_256()) jj_scanpos = xsp;
- if (jj_scan_token(CASE_T)) return true;
- if (jj_3R_58()) return true;
- if (jj_scan_token(IS_T)) return true;
- if (jj_3R_626()) return true;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_627()) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(END_T)) return true;
- if (jj_scan_token(CASE_T)) return true;
- xsp = jj_scanpos;
- if (jj_3R_628()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_scan_token(WHEN_T)) return true;
+ if (jj_3R_90()) return true;
+ if (jj_scan_token(ARROW_T)) return true;
+ if (jj_3R_268()) return true;
return false;
}
- inline bool jj_3_90()
+ inline bool jj_3_98()
{
if (jj_done) return true;
- if (jj_3R_126()) return true;
+ if (jj_3R_132()) return true;
return false;
}
- inline bool jj_3R_651()
+ inline bool jj_3R_633()
{
if (jj_done) return true;
- if (jj_3R_410()) return true;
+ if (jj_3R_632()) return true;
return false;
}
- inline bool jj_3R_526()
+ inline bool jj_3_97()
{
if (jj_done) return true;
- if (jj_3R_405()) return true;
+ if (jj_3R_131()) return true;
return false;
}
- inline bool jj_3R_617()
+ inline bool jj_3R_541()
{
if (jj_done) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_651()) { jj_scanpos = xsp; break; }
- }
+ if (jj_3R_420()) return true;
return false;
}
- inline bool jj_3_89()
+ inline bool jj_3_96()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_438()
+ inline bool jj_3R_456()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3_89()) jj_scanpos = xsp;
- if (jj_3R_114()) return true;
+ if (jj_3_96()) jj_scanpos = xsp;
+ if (jj_3R_119()) return true;
if (jj_scan_token(LESSTHAN_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_526()) jj_scanpos = xsp;
- if (jj_3R_318()) return true;
+ if (jj_3R_541()) jj_scanpos = xsp;
+ if (jj_3R_332()) return true;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_437()
+ inline bool jj_3R_455()
{
if (jj_done) return true;
- if (jj_3R_127()) return true;
+ if (jj_3R_132()) return true;
return false;
}
- inline bool jj_3R_387()
+ inline bool jj_3R_402()
{
if (jj_done) return true;
- if (jj_3R_477()) return true;
- if (jj_3R_68()) return true;
+ if (jj_3R_494()) return true;
+ if (jj_3R_70()) return true;
return false;
}
- inline bool jj_3R_361()
+ inline bool jj_3R_377()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_436()) {
+ if (!jj_3R_454()) return false;
jj_scanpos = xsp;
- if (jj_3R_437()) {
+ if (!jj_3R_455()) return false;
jj_scanpos = xsp;
- if (jj_3R_438()) return true;
- }
- }
- return false;
- }
-
- inline bool jj_3R_436()
- {
- if (jj_done) return true;
- if (jj_3R_126()) return true;
+ if (jj_3R_456()) return true;
return false;
}
- inline bool jj_3R_661()
+ inline bool jj_3R_454()
{
if (jj_done) return true;
- if (jj_3R_329()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_131()) return true;
return false;
}
- inline bool jj_3R_507()
+ inline bool jj_3R_265()
{
if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_565()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_74()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(155)) jj_scanpos = xsp;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_402()
+ inline bool jj_3R_417()
{
if (jj_done) return true;
if (jj_scan_token(MINUS_T)) return true;
return false;
}
- inline bool jj_3R_560()
+ inline bool jj_3R_126()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_scan_token(BLOCK_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_614()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(56)) jj_scanpos = xsp;
- if (jj_3R_615()) return true;
- if (jj_3R_616()) return true;
- if (jj_scan_token(BEGIN_T)) return true;
- if (jj_3R_617()) return true;
+ if (jj_3R_265()) jj_scanpos = xsp;
+ if (jj_scan_token(CASE_T)) return true;
+ if (jj_3R_61()) return true;
+ if (jj_scan_token(IS_T)) return true;
+ if (jj_3R_632()) return true;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_633()) { jj_scanpos = xsp; break; }
+ }
if (jj_scan_token(END_T)) return true;
- if (jj_scan_token(BLOCK_T)) return true;
+ if (jj_scan_token(CASE_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_618()) jj_scanpos = xsp;
+ if (jj_3R_634()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_314()
+ inline bool jj_3R_328()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_401()) {
+ if (!jj_3R_416()) return false;
jj_scanpos = xsp;
- if (jj_3R_402()) return true;
- }
+ if (jj_3R_417()) return true;
return false;
}
- inline bool jj_3R_401()
+ inline bool jj_3R_416()
{
if (jj_done) return true;
if (jj_scan_token(PLUS_T)) return true;
return false;
}
- inline bool jj_3_9()
- {
- if (jj_done) return true;
- if (jj_3R_66()) return true;
- return false;
- }
-
- inline bool jj_3R_552()
+ inline bool jj_3R_567()
{
if (jj_done) return true;
if (jj_scan_token(ROR_T)) return true;
return false;
}
- inline bool jj_3R_551()
+ inline bool jj_3R_566()
{
if (jj_done) return true;
if (jj_scan_token(ROL_T)) return true;
return false;
}
- inline bool jj_3R_550()
+ inline bool jj_3R_565()
{
if (jj_done) return true;
if (jj_scan_token(SRA_T)) return true;
return false;
}
- inline bool jj_3R_419()
- {
- if (jj_done) return true;
- if (jj_3R_59()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_507()) jj_scanpos = xsp;
- return false;
- }
-
- inline bool jj_3R_549()
+ inline bool jj_3R_564()
{
if (jj_done) return true;
if (jj_scan_token(SLA_T)) return true;
return false;
}
- inline bool jj_3R_548()
+ inline bool jj_3R_563()
{
if (jj_done) return true;
if (jj_scan_token(SRL_T)) return true;
return false;
}
- inline bool jj_3R_649()
- {
- if (jj_done) return true;
- if (jj_3R_538()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_661()) jj_scanpos = xsp;
- return false;
- }
-
- inline bool jj_3R_547()
+ inline bool jj_3R_562()
{
if (jj_done) return true;
if (jj_scan_token(SLL_T)) return true;
return false;
}
- inline bool jj_3R_477()
+ inline bool jj_3R_494()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_547()) {
+ if (!jj_3R_562()) return false;
jj_scanpos = xsp;
- if (jj_3R_548()) {
+ if (!jj_3R_563()) return false;
jj_scanpos = xsp;
- if (jj_3R_549()) {
+ if (!jj_3R_564()) return false;
jj_scanpos = xsp;
- if (jj_3R_550()) {
+ if (!jj_3R_565()) return false;
jj_scanpos = xsp;
- if (jj_3R_551()) {
+ if (!jj_3R_566()) return false;
jj_scanpos = xsp;
- if (jj_3R_552()) return true;
- }
- }
- }
- }
- }
+ if (jj_3R_567()) return true;
return false;
}
- inline bool jj_3R_648()
+ inline bool jj_3R_522()
{
if (jj_done) return true;
- if (jj_3R_66()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_660()) jj_scanpos = xsp;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_577()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_615()
+ inline bool jj_3R_318()
{
if (jj_done) return true;
+ if (jj_3R_70()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_648()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_649()) jj_scanpos = xsp;
+ if (jj_3R_402()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_650()
- {
- if (jj_done) return true;
- if (jj_3R_140()) return true;
- return false;
- }
-
- inline bool jj_3R_616()
+ inline bool jj_3R_254()
{
if (jj_done) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_650()) { jj_scanpos = xsp; break; }
- }
+ if (jj_3R_379()) return true;
return false;
}
- inline bool jj_3R_307()
+ inline bool jj_3_9()
{
if (jj_done) return true;
- if (jj_3R_68()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_387()) jj_scanpos = xsp;
+ if (jj_3R_69()) return true;
return false;
}
- inline bool jj_3R_245()
+ inline bool jj_3_95()
{
if (jj_done) return true;
- if (jj_3R_363()) return true;
+ if (jj_3R_130()) return true;
return false;
}
- inline bool jj_3_88()
+ inline bool jj_3R_431()
{
if (jj_done) return true;
- if (jj_3R_125()) return true;
+ if (jj_3R_63()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_522()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_300()
+ inline bool jj_3_94()
{
if (jj_done) return true;
- if (jj_3R_383()) return true;
+ if (jj_3R_129()) return true;
return false;
}
- inline bool jj_3_7()
+ inline bool jj_3_93()
{
if (jj_done) return true;
- if (jj_3R_64()) return true;
+ if (jj_3R_128()) return true;
return false;
}
- inline bool jj_3_87()
+ inline bool jj_3R_123()
{
if (jj_done) return true;
- if (jj_3R_124()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3_8()
+ inline bool jj_3_88()
{
if (jj_done) return true;
- if (jj_3R_65()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_123()) jj_scanpos = xsp;
+ if (jj_3R_119()) return true;
+ if (jj_scan_token(VARASSIGN_T)) return true;
return false;
}
- inline bool jj_3R_299()
+ inline bool jj_3_92()
{
if (jj_done) return true;
- if (jj_3R_382()) return true;
+ if (jj_3R_127()) return true;
return false;
}
- inline bool jj_3_86()
+ inline bool jj_3_91()
{
if (jj_done) return true;
- if (jj_3R_123()) return true;
+ if (jj_3R_126()) return true;
return false;
}
- inline bool jj_3R_298()
+ inline bool jj_3_90()
{
if (jj_done) return true;
- if (jj_3R_381()) return true;
+ if (jj_3R_125()) return true;
return false;
}
- inline bool jj_3R_118()
+ inline bool jj_3_89()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_124()) return true;
return false;
}
- inline bool jj_3R_297()
+ inline bool jj_3R_311()
{
if (jj_done) return true;
- if (jj_3R_380()) return true;
+ if (jj_3R_398()) return true;
return false;
}
- inline bool jj_3R_296()
+ inline bool jj_3_7()
{
if (jj_done) return true;
- if (jj_3R_379()) return true;
+ if (jj_3R_67()) return true;
return false;
}
- inline bool jj_3_81()
+ inline bool jj_3R_118()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_118()) jj_scanpos = xsp;
- if (jj_3R_114()) return true;
- if (jj_scan_token(VARASSIGN_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3_85()
+ inline bool jj_3R_253()
{
if (jj_done) return true;
- if (jj_3R_122()) return true;
+ if (jj_3R_378()) return true;
return false;
}
inline bool jj_3_84()
{
if (jj_done) return true;
- if (jj_3R_121()) return true;
- return false;
- }
-
- inline bool jj_3R_294()
- {
- if (jj_done) return true;
- if (jj_3R_378()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_118()) jj_scanpos = xsp;
+ if (jj_3R_119()) return true;
+ if (jj_scan_token(LESSTHAN_T)) return true;
return false;
}
- inline bool jj_3R_295()
+ inline bool jj_3_8()
{
if (jj_done) return true;
- if (jj_3R_64()) return true;
+ if (jj_3R_68()) return true;
return false;
}
- inline bool jj_3R_293()
+ inline bool jj_3R_310()
{
if (jj_done) return true;
- if (jj_3R_377()) return true;
+ if (jj_3R_347()) return true;
return false;
}
- inline bool jj_3_83()
+ inline bool jj_3R_309()
{
if (jj_done) return true;
- if (jj_3R_120()) return true;
+ if (jj_3R_397()) return true;
return false;
}
- inline bool jj_3R_292()
+ inline bool jj_3_87()
{
if (jj_done) return true;
- if (jj_3R_376()) return true;
+ if (jj_3R_122()) return true;
return false;
}
- inline bool jj_3R_291()
+ inline bool jj_3R_308()
{
if (jj_done) return true;
- if (jj_3R_375()) return true;
+ if (jj_3R_396()) return true;
return false;
}
- inline bool jj_3R_290()
+ inline bool jj_3R_307()
{
if (jj_done) return true;
- if (jj_3R_374()) return true;
+ if (jj_3R_395()) return true;
return false;
}
- inline bool jj_3R_289()
+ inline bool jj_3_86()
{
if (jj_done) return true;
- if (jj_3R_373()) return true;
+ if (jj_3R_121()) return true;
return false;
}
- inline bool jj_3_82()
+ inline bool jj_3R_305()
{
if (jj_done) return true;
- if (jj_3R_119()) return true;
+ if (jj_3R_394()) return true;
return false;
}
- inline bool jj_3R_288()
+ inline bool jj_3R_306()
{
if (jj_done) return true;
- if (jj_3R_372()) return true;
+ if (jj_3R_67()) return true;
return false;
}
- inline bool jj_3R_287()
+ inline bool jj_3_85()
{
if (jj_done) return true;
- if (jj_3R_371()) return true;
+ if (jj_3R_120()) return true;
return false;
}
- inline bool jj_3R_421()
+ inline bool jj_3R_304()
{
if (jj_done) return true;
- if (jj_3R_508()) return true;
+ if (jj_3R_393()) return true;
return false;
}
- inline bool jj_3R_113()
+ inline bool jj_3R_520()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_332()) return true;
+ if (jj_scan_token(WHEN_T)) return true;
+ if (jj_3R_90()) return true;
return false;
}
- inline bool jj_3R_420()
+ inline bool jj_3R_303()
{
if (jj_done) return true;
- if (jj_3R_382()) return true;
+ if (jj_3R_392()) return true;
return false;
}
- inline bool jj_3R_244()
+ inline bool jj_3R_302()
{
if (jj_done) return true;
- if (jj_3R_362()) return true;
+ if (jj_3R_391()) return true;
return false;
}
- inline bool jj_3R_140()
+ inline bool jj_3R_117()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_286()) {
- jj_scanpos = xsp;
- if (jj_3R_287()) {
- jj_scanpos = xsp;
- if (jj_3R_288()) {
+ if (!jj_3R_252()) return false;
jj_scanpos = xsp;
- if (jj_3R_289()) {
+ if (!jj_3_85()) return false;
jj_scanpos = xsp;
- if (jj_3R_290()) {
+ if (!jj_3_86()) return false;
jj_scanpos = xsp;
- if (jj_3R_291()) {
+ if (!jj_3_87()) return false;
jj_scanpos = xsp;
- if (jj_3R_292()) {
+ if (!jj_3R_253()) return false;
jj_scanpos = xsp;
- if (jj_3R_293()) {
+ if (!jj_3_89()) return false;
jj_scanpos = xsp;
- if (jj_3R_294()) {
+ if (!jj_3_90()) return false;
jj_scanpos = xsp;
- if (jj_3R_295()) {
+ if (!jj_3_91()) return false;
jj_scanpos = xsp;
- if (jj_3R_296()) {
+ if (!jj_3_92()) return false;
jj_scanpos = xsp;
- if (jj_3R_297()) {
+ if (!jj_3_93()) return false;
jj_scanpos = xsp;
- if (jj_3R_298()) {
+ if (!jj_3_94()) return false;
jj_scanpos = xsp;
- if (jj_3R_299()) {
+ if (!jj_3_95()) return false;
jj_scanpos = xsp;
- if (jj_3_8()) {
- jj_scanpos = xsp;
- if (jj_3R_300()) return true;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
+ if (jj_3R_254()) return true;
return false;
}
- inline bool jj_3R_286()
+ inline bool jj_3R_252()
{
if (jj_done) return true;
- if (jj_3R_92()) return true;
+ if (jj_3R_377()) return true;
return false;
}
- inline bool jj_3_77()
+ inline bool jj_3R_301()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_113()) jj_scanpos = xsp;
- if (jj_3R_114()) return true;
- if (jj_scan_token(LESSTHAN_T)) return true;
+ if (jj_3R_390()) return true;
return false;
}
- inline bool jj_3_80()
+ inline bool jj_3R_300()
{
if (jj_done) return true;
- if (jj_3R_117()) return true;
+ if (jj_3R_389()) return true;
return false;
}
- inline bool jj_3_79()
+ inline bool jj_3R_524()
{
if (jj_done) return true;
- if (jj_3R_116()) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_333()
+ inline bool jj_3R_299()
{
if (jj_done) return true;
- if (jj_scan_token(FOR_T)) return true;
- if (jj_3R_419()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_420()) { jj_scanpos = xsp; break; }
- }
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_421()) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(END_T)) return true;
- if (jj_scan_token(FOR_T)) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_388()) return true;
return false;
}
- inline bool jj_3_78()
+ inline bool jj_3R_433()
{
if (jj_done) return true;
- if (jj_3R_115()) return true;
+ if (jj_3R_523()) return true;
return false;
}
- inline bool jj_3R_505()
+ inline bool jj_3R_298()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_318()) return true;
- if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_85()) return true;
+ if (jj_3R_387()) return true;
return false;
}
- inline bool jj_3R_112()
+ inline bool jj_3R_432()
+ {
+ if (jj_done) return true;
+ if (jj_3R_347()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_146()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_243()) {
+ if (!jj_3R_297()) return false;
jj_scanpos = xsp;
- if (jj_3_78()) {
+ if (!jj_3R_298()) return false;
jj_scanpos = xsp;
- if (jj_3_79()) {
+ if (!jj_3R_299()) return false;
jj_scanpos = xsp;
- if (jj_3_80()) {
+ if (!jj_3R_300()) return false;
jj_scanpos = xsp;
- if (jj_3R_244()) {
+ if (!jj_3R_301()) return false;
jj_scanpos = xsp;
- if (jj_3_82()) {
+ if (!jj_3R_302()) return false;
jj_scanpos = xsp;
- if (jj_3_83()) {
+ if (!jj_3R_303()) return false;
jj_scanpos = xsp;
- if (jj_3_84()) {
+ if (!jj_3R_304()) return false;
jj_scanpos = xsp;
- if (jj_3_85()) {
+ if (!jj_3R_305()) return false;
jj_scanpos = xsp;
- if (jj_3_86()) {
+ if (!jj_3R_306()) return false;
jj_scanpos = xsp;
- if (jj_3_87()) {
+ if (!jj_3R_307()) return false;
jj_scanpos = xsp;
- if (jj_3_88()) {
+ if (!jj_3R_308()) return false;
jj_scanpos = xsp;
- if (jj_3R_245()) return true;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
+ if (!jj_3R_309()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_310()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3_8()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_311()) return true;
return false;
}
- inline bool jj_3R_243()
+ inline bool jj_3R_297()
{
if (jj_done) return true;
- if (jj_3R_361()) return true;
+ if (jj_3R_98()) return true;
return false;
}
- inline bool jj_3R_509()
+ inline bool jj_3_83()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_117()) return true;
return false;
}
- inline bool jj_3_76()
+ inline bool jj_3R_268()
{
if (jj_done) return true;
- if (jj_3R_112()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3_83()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3R_94()
+ inline bool jj_3R_345()
{
if (jj_done) return true;
- if (jj_scan_token(BIT_STRING_LITERAL)) return true;
+ if (jj_scan_token(FOR_T)) return true;
+ if (jj_3R_431()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_432()) { jj_scanpos = xsp; break; }
+ }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_433()) { jj_scanpos = xsp; break; }
+ }
+ if (jj_scan_token(END_T)) return true;
+ if (jj_scan_token(FOR_T)) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_240()
+ inline bool jj_3R_250()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_259()
+ inline bool jj_3R_440()
{
if (jj_done) return true;
+ if (jj_3R_63()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3_76()) { jj_scanpos = xsp; break; }
+ if (jj_3R_524()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_418()
+ inline bool jj_3R_357()
{
if (jj_done) return true;
- if (jj_3R_329()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_439()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_440()) return true;
return false;
}
- inline bool jj_3R_417()
+ inline bool jj_3R_439()
{
if (jj_done) return true;
- if (jj_3R_70()) return true;
+ if (jj_scan_token(ALL_T)) return true;
return false;
}
- inline bool jj_3R_422()
+ inline bool jj_3R_276()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_509()) { jj_scanpos = xsp; break; }
- }
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_416()
+ inline bool jj_3R_100()
{
if (jj_done) return true;
- if (jj_scan_token(USE_T)) return true;
- if (jj_3R_506()) return true;
+ if (jj_scan_token(BIT_STRING_LITERAL)) return true;
return false;
}
- inline bool jj_3R_332()
+ inline bool jj_3R_380()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_416()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_417()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_418()) jj_scanpos = xsp;
+ if (jj_scan_token(ON_T)) return true;
+ if (jj_3R_357()) return true;
return false;
}
- inline bool jj_3R_267()
+ inline bool jj_3R_430()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_341()) return true;
return false;
}
- inline bool jj_3R_364()
+ inline bool jj_3R_429()
{
if (jj_done) return true;
- if (jj_scan_token(ON_T)) return true;
- if (jj_3R_422()) return true;
+ if (jj_3R_73()) return true;
return false;
}
- inline bool jj_3_75()
+ inline bool jj_3R_423()
{
if (jj_done) return true;
- if (jj_3R_111()) return true;
+ if (jj_3R_332()) return true;
+ if (jj_scan_token(WHEN_T)) return true;
+ if (jj_3R_90()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_520()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3R_411()
+ inline bool jj_3R_428()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(USE_T)) return true;
+ if (jj_3R_521()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_344()
{
if (jj_done) return true;
- if (jj_3R_318()) return true;
- if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_85()) return true;
Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_505()) { jj_scanpos = xsp; break; }
- }
+ xsp = jj_scanpos;
+ if (jj_3R_428()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_429()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_430()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_325()
+ inline bool jj_3R_249()
+ {
+ if (jj_done) return true;
+ if (jj_3R_63()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_337()
{
if (jj_done) return true;
if (jj_scan_token(WITH_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(SELECT_T)) return true;
- if (jj_3R_114()) return true;
+ if (jj_3R_119()) return true;
if (jj_scan_token(LESSTHAN_T)) return true;
- if (jj_3R_166()) return true;
- if (jj_3R_411()) return true;
+ if (jj_3R_172()) return true;
+ if (jj_3R_423()) return true;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_689()
+ inline bool jj_3R_688()
{
if (jj_done) return true;
- if (jj_3R_111()) return true;
+ if (jj_3R_694()) return true;
return false;
}
- inline bool jj_3R_472()
+ inline bool jj_3R_434()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(DOT_T)) return true;
- if (jj_3R_99()) return true;
+ if (jj_3R_105()) return true;
return false;
}
- inline bool jj_3R_339()
+ inline bool jj_3R_721()
{
if (jj_done) return true;
- if (jj_scan_token(SEVERITY_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(EQU_T)) return true;
+ if (jj_3R_108()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_360()
+ inline bool jj_3_82()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(EQU_T)) return true;
- if (jj_3R_102()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_116()) return true;
return false;
}
- inline bool jj_3R_379()
+ inline bool jj_3R_677()
{
if (jj_done) return true;
- if (jj_scan_token(ATTRIBUTE_T)) return true;
- if (jj_3R_220()) return true;
- if (jj_scan_token(OF_T)) return true;
- if (jj_3R_470()) return true;
- if (jj_scan_token(IS_T)) return true;
- if (jj_3R_58()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_86()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_688()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_677()
+ inline bool jj_3R_676()
+ {
+ if (jj_done) return true;
+ if (jj_3R_116()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_656()
{
if (jj_done) return true;
- if (jj_3R_81()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_689()) jj_scanpos = xsp;
+ if (!jj_3R_676()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_677()) return true;
return false;
}
- inline bool jj_3R_316()
+ inline bool jj_3R_356()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_315()) return true;
+ if (jj_scan_token(SEVERITY_T)) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_676()
+ inline bool jj_3R_275()
{
if (jj_done) return true;
- if (jj_3R_688()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_654()
+ inline bool jj_3R_130()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_676()) {
- jj_scanpos = xsp;
- if (jj_3R_677()) return true;
- }
+ if (jj_3R_275()) jj_scanpos = xsp;
+ if (jj_scan_token(RETURN_T)) return true;
+ xsp = jj_scanpos;
+ if (jj_3R_276()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_110()
+ inline bool jj_3R_259()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(APOSTROPHE_T)) return true;
- if (jj_3R_59()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_240()) jj_scanpos = xsp;
+ if (jj_scan_token(SEVERITY_T)) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_355()
+ inline bool jj_3R_395()
{
if (jj_done) return true;
- if (jj_scan_token(RANGE_T)) return true;
+ if (jj_scan_token(ATTRIBUTE_T)) return true;
+ if (jj_3R_230()) return true;
+ if (jj_scan_token(OF_T)) return true;
+ if (jj_3R_488()) return true;
+ if (jj_scan_token(IS_T)) return true;
+ if (jj_3R_61()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_266()
+ inline bool jj_3R_330()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_329()) return true;
return false;
}
- inline bool jj_3R_220()
+ inline bool jj_3R_115()
{
if (jj_done) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(APOSTROPHE_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_354()) {
+ if (!jj_scan_token(85)) return false;
jj_scanpos = xsp;
- if (jj_3R_355()) return true;
- }
+ if (jj_3R_249()) return true;
+ xsp = jj_scanpos;
+ if (jj_3R_250()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_354()
+ inline bool jj_3R_258()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_125()
+ inline bool jj_3R_372()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(RANGE_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_319()
+ {
+ if (jj_done) return true;
+ if (jj_3R_403()) return true;
+ if (jj_3R_318()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_121()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_266()) jj_scanpos = xsp;
- if (jj_scan_token(RETURN_T)) return true;
+ if (jj_3R_258()) jj_scanpos = xsp;
+ if (jj_scan_token(REPORT_T)) return true;
+ if (jj_3R_61()) return true;
xsp = jj_scanpos;
- if (jj_3R_267()) jj_scanpos = xsp;
+ if (jj_3R_259()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_250()
+ inline bool jj_3R_230()
{
if (jj_done) return true;
- if (jj_scan_token(SEVERITY_T)) return true;
- if (jj_3R_58()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_371()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_372()) return true;
return false;
}
- inline bool jj_3R_308()
+ inline bool jj_3R_371()
{
if (jj_done) return true;
- if (jj_3R_388()) return true;
- if (jj_3R_307()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3_6()
+ inline bool jj_3R_506()
{
if (jj_done) return true;
- if (jj_3R_63()) return true;
- if (jj_scan_token(ARROW_T)) return true;
+ if (jj_scan_token(QNEQU_T)) return true;
return false;
}
- inline bool jj_3R_64()
+ inline bool jj_3R_505()
{
if (jj_done) return true;
- if (jj_scan_token(ATTRIBUTE_T)) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_157()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_scan_token(QEQU_T)) return true;
return false;
}
- inline bool jj_3R_338()
+ inline bool jj_3R_504()
{
if (jj_done) return true;
- if (jj_scan_token(REPORT_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_scan_token(QL_T)) return true;
return false;
}
- inline bool jj_3R_249()
+ inline bool jj_3R_698()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_116()
+ inline bool jj_3R_503()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_249()) jj_scanpos = xsp;
- if (jj_scan_token(REPORT_T)) return true;
- if (jj_3R_58()) return true;
- xsp = jj_scanpos;
- if (jj_3R_250()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_scan_token(QG_T)) return true;
return false;
}
- inline bool jj_3R_701()
+ inline bool jj_3R_502()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_scan_token(QLT_T)) return true;
return false;
}
- inline bool jj_3R_165()
+ inline bool jj_3R_501()
{
if (jj_done) return true;
- if (jj_3R_315()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_316()) { jj_scanpos = xsp; break; }
- }
+ if (jj_scan_token(QGT_T)) return true;
return false;
}
- inline bool jj_3R_483()
+ inline bool jj_3R_500()
{
if (jj_done) return true;
if (jj_scan_token(NOTEQU_T)) return true;
return false;
}
- inline bool jj_3R_482()
+ inline bool jj_3_6()
{
if (jj_done) return true;
- if (jj_scan_token(LESSTHAN_T)) return true;
+ if (jj_3R_66()) return true;
+ if (jj_scan_token(ARROW_T)) return true;
return false;
}
- inline bool jj_3R_403()
+ inline bool jj_3R_67()
{
if (jj_done) return true;
- if (jj_3R_63()) return true;
- if (jj_scan_token(ARROW_T)) return true;
+ if (jj_scan_token(ATTRIBUTE_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_161()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_481()
+ inline bool jj_3R_499()
{
if (jj_done) return true;
- if (jj_scan_token(GREATERTHAN_T)) return true;
+ if (jj_scan_token(LESSTHAN_T)) return true;
return false;
}
- inline bool jj_3R_315()
+ inline bool jj_3R_355()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_403()) jj_scanpos = xsp;
- if (jj_3R_404()) return true;
+ if (jj_scan_token(REPORT_T)) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_480()
+ inline bool jj_3R_498()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(GREATERTHAN_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_497()
{
if (jj_done) return true;
if (jj_scan_token(EQU_T)) return true;
return false;
}
- inline bool jj_3R_479()
+ inline bool jj_3R_496()
{
if (jj_done) return true;
if (jj_scan_token(GT_T)) return true;
return false;
}
- inline bool jj_3R_388()
+ inline bool jj_3R_403()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_478()) {
+ if (!jj_3R_495()) return false;
jj_scanpos = xsp;
- if (jj_3R_479()) {
+ if (!jj_3R_496()) return false;
jj_scanpos = xsp;
- if (jj_3R_480()) {
+ if (!jj_3R_497()) return false;
jj_scanpos = xsp;
- if (jj_3R_481()) {
+ if (!jj_3R_498()) return false;
jj_scanpos = xsp;
- if (jj_3R_482()) {
+ if (!jj_3R_499()) return false;
jj_scanpos = xsp;
- if (jj_3R_483()) return true;
- }
- }
- }
- }
- }
+ if (!jj_3R_500()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_501()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_502()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_503()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_504()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_505()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_506()) return true;
return false;
}
- inline bool jj_3R_478()
+ inline bool jj_3R_495()
{
if (jj_done) return true;
if (jj_scan_token(LT_T)) return true;
return false;
}
- inline bool jj_3R_248()
+ inline bool jj_3R_169()
{
if (jj_done) return true;
- if (jj_3R_139()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_329()) return true;
+ Token * xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_330()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- inline bool jj_3R_115()
+ inline bool jj_3R_151()
{
if (jj_done) return true;
+ if (jj_3R_318()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_248()) jj_scanpos = xsp;
- if (jj_3R_187()) return true;
- if (jj_scan_token(SEMI_T)) return true;
+ if (jj_3R_319()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_145()
+ inline bool jj_3R_418()
+ {
+ if (jj_done) return true;
+ if (jj_3R_66()) return true;
+ if (jj_scan_token(ARROW_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_697()
+ {
+ if (jj_done) return true;
+ if (jj_3R_705()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_329()
{
if (jj_done) return true;
- if (jj_3R_307()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_308()) jj_scanpos = xsp;
+ if (jj_3R_418()) jj_scanpos = xsp;
+ if (jj_3R_419()) return true;
return false;
}
- inline bool jj_3R_700()
+ inline bool jj_3R_257()
{
if (jj_done) return true;
- if (jj_3R_705()) return true;
+ if (jj_3R_145()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_691()
+ inline bool jj_3R_690()
{
if (jj_done) return true;
if (jj_scan_token(RECORD_T)) return true;
Token * xsp;
- if (jj_3R_700()) return true;
+ if (jj_3R_697()) return true;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_700()) { jj_scanpos = xsp; break; }
+ if (jj_3R_697()) { jj_scanpos = xsp; break; }
}
if (jj_scan_token(END_T)) return true;
if (jj_scan_token(RECORD_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_701()) jj_scanpos = xsp;
+ if (jj_3R_698()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_187()
+ inline bool jj_3R_120()
{
if (jj_done) return true;
- if (jj_scan_token(ASSERT_T)) return true;
- if (jj_3R_79()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_338()) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_339()) jj_scanpos = xsp;
+ if (jj_3R_257()) jj_scanpos = xsp;
+ if (jj_3R_196()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3_5()
+ inline bool jj_3_80()
{
if (jj_done) return true;
- if (jj_3R_62()) return true;
+ if (jj_3R_70()) return true;
+ if (jj_3R_71()) return true;
+ if (jj_3R_70()) return true;
return false;
}
- inline bool jj_3_73()
+ inline bool jj_3_81()
{
if (jj_done) return true;
- if (jj_3R_68()) return true;
- if (jj_3R_109()) return true;
- if (jj_3R_68()) return true;
+ if (jj_3R_115()) return true;
return false;
}
- inline bool jj_3_74()
+ inline bool jj_3R_86()
{
if (jj_done) return true;
- if (jj_3R_110()) return true;
+ if (jj_scan_token(RANGE_T)) return true;
+ if (jj_3R_88()) return true;
return false;
}
- inline bool jj_3R_699()
+ inline bool jj_3R_196()
{
if (jj_done) return true;
- if (jj_3R_704()) return true;
+ if (jj_scan_token(ASSERT_T)) return true;
+ if (jj_3R_83()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_355()) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_356()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_81()
+ inline bool jj_3_5()
{
if (jj_done) return true;
- if (jj_scan_token(RANGE_T)) return true;
- if (jj_3R_83()) return true;
+ if (jj_scan_token(ARRAY_T)) return true;
+ if (jj_3R_65()) return true;
+ if (jj_scan_token(OF_T)) return true;
return false;
}
- inline bool jj_3R_698()
+ inline bool jj_3_79()
{
if (jj_done) return true;
- if (jj_3R_62()) return true;
+ if (jj_3R_114()) return true;
return false;
}
- inline bool jj_3R_690()
+ inline bool jj_3R_191()
+ {
+ if (jj_done) return true;
+ if (jj_3R_115()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_190()
+ {
+ if (jj_done) return true;
+ if (jj_3R_70()) return true;
+ if (jj_3R_71()) return true;
+ if (jj_3R_70()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_88()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_698()) {
+ if (!jj_3R_190()) return false;
jj_scanpos = xsp;
- if (jj_3R_699()) return true;
- }
+ if (jj_3R_191()) return true;
return false;
}
- inline bool jj_3_72()
+ inline bool jj_3R_696()
{
if (jj_done) return true;
- if (jj_3R_108()) return true;
+ if (jj_3R_704()) return true;
return false;
}
- inline bool jj_3R_182()
+ inline bool jj_3R_238()
{
if (jj_done) return true;
- if (jj_3R_110()) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_61()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_181()
+ inline bool jj_3R_695()
{
if (jj_done) return true;
- if (jj_3R_68()) return true;
- if (jj_3R_109()) return true;
- if (jj_3R_68()) return true;
+ if (jj_3R_703()) return true;
return false;
}
- inline bool jj_3R_83()
+ inline bool jj_3R_689()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_181()) {
+ if (!jj_3R_695()) return false;
jj_scanpos = xsp;
- if (jj_3R_182()) return true;
- }
- return false;
- }
-
- inline bool jj_3R_228()
- {
- if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_696()) return true;
return false;
}
- inline bool jj_3R_227()
+ inline bool jj_3R_237()
{
if (jj_done) return true;
- if (jj_3R_108()) return true;
+ if (jj_3R_114()) return true;
return false;
}
- inline bool jj_3R_61()
+ inline bool jj_3R_64()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(APOSTROPHE_T)) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_227()) {
+ if (!jj_3R_237()) return false;
jj_scanpos = xsp;
- if (jj_3R_228()) return true;
- }
+ if (jj_3R_238()) return true;
return false;
}
- inline bool jj_3R_342()
+ inline bool jj_3R_359()
{
if (jj_done) return true;
- if (jj_3R_112()) return true;
+ if (jj_3R_117()) return true;
return false;
}
- inline bool jj_3R_191()
+ inline bool jj_3R_200()
{
if (jj_done) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_342()) { jj_scanpos = xsp; break; }
+ if (jj_3R_359()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_466()
+ inline bool jj_3R_201()
{
if (jj_done) return true;
- if (jj_3R_234()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_192()
+ inline bool jj_3R_484()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_245()) return true;
return false;
}
- inline bool jj_3R_340()
+ inline bool jj_3R_248()
{
if (jj_done) return true;
- if (jj_3R_422()) return true;
+ if (jj_scan_token(COMMA_T)) return true;
+ if (jj_3R_247()) return true;
return false;
}
- inline bool jj_3R_237()
+ inline bool jj_3R_244()
{
if (jj_done) return true;
- if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_236()) return true;
+ if (jj_scan_token(NEW_T)) return true;
+ if (jj_3R_89()) return true;
return false;
}
- inline bool jj_3R_576()
+ inline bool jj_3R_198()
{
if (jj_done) return true;
- if (jj_scan_token(NEW_T)) return true;
- if (jj_3R_84()) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_357()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_531()
+ inline bool jj_3R_113()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3_4()) {
+ if (!jj_3_4()) return false;
jj_scanpos = xsp;
- if (jj_3R_576()) return true;
- }
+ if (jj_3R_244()) return true;
return false;
}
@@ -7427,363 +7056,296 @@ void parseInline();
{
if (jj_done) return true;
if (jj_scan_token(NEW_T)) return true;
- if (jj_3R_61()) return true;
+ if (jj_3R_64()) return true;
return false;
}
- inline bool jj_3R_537()
+ inline bool jj_3R_552()
{
if (jj_done) return true;
- if (jj_3R_310()) return true;
+ if (jj_3R_321()) return true;
return false;
}
- inline bool jj_3R_536()
+ inline bool jj_3R_551()
{
if (jj_done) return true;
if (jj_scan_token(CHARACTER_LITERAL)) return true;
return false;
}
- inline bool jj_3R_189()
+ inline bool jj_3R_197()
{
if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(15)) {
- jj_scanpos = xsp;
- if (jj_3R_340()) return true;
- }
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_535()
+ inline bool jj_3R_550()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_464()
+ inline bool jj_3R_482()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_535()) {
+ if (!jj_3R_550()) return false;
jj_scanpos = xsp;
- if (jj_3R_536()) {
+ if (!jj_3R_551()) return false;
jj_scanpos = xsp;
- if (jj_3R_537()) return true;
- }
- }
- return false;
- }
-
- inline bool jj_3R_188()
- {
- if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
- return false;
- }
-
- inline bool jj_3R_465()
- {
- if (jj_done) return true;
- if (jj_scan_token(COLON_T)) return true;
- if (jj_3R_84()) return true;
+ if (jj_3R_552()) return true;
return false;
}
- inline bool jj_3R_88()
+ inline bool jj_3R_93()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_188()) jj_scanpos = xsp;
+ if (jj_3R_197()) jj_scanpos = xsp;
xsp = jj_scanpos;
if (jj_scan_token(79)) jj_scanpos = xsp;
if (jj_scan_token(PROCESS_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_189()) jj_scanpos = xsp;
+ if (jj_3R_198()) jj_scanpos = xsp;
xsp = jj_scanpos;
if (jj_scan_token(56)) jj_scanpos = xsp;
- if (jj_3R_190()) return true;
+ if (jj_3R_199()) return true;
if (jj_scan_token(BEGIN_T)) return true;
- if (jj_3R_191()) return true;
+ if (jj_3R_200()) return true;
if (jj_scan_token(END_T)) return true;
xsp = jj_scanpos;
if (jj_scan_token(79)) jj_scanpos = xsp;
if (jj_scan_token(PROCESS_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_192()) jj_scanpos = xsp;
- if (jj_scan_token(SEMI_T)) return true;
- return false;
- }
-
- inline bool jj_3R_377()
- {
- if (jj_done) return true;
- if (jj_scan_token(ALIAS_T)) return true;
- if (jj_3R_464()) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_465()) jj_scanpos = xsp;
- if (jj_scan_token(IS_T)) return true;
- if (jj_3R_59()) return true;
- xsp = jj_scanpos;
- if (jj_3R_466()) jj_scanpos = xsp;
+ if (jj_3R_201()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_341()
+ inline bool jj_3R_358()
{
if (jj_done) return true;
- if (jj_3R_423()) return true;
+ if (jj_3R_441()) return true;
return false;
}
- inline bool jj_3R_190()
+ inline bool jj_3R_199()
{
if (jj_done) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_341()) { jj_scanpos = xsp; break; }
+ if (jj_3R_358()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_108()
+ inline bool jj_3R_534()
{
if (jj_done) return true;
- if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_236()) return true;
- Token * xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3R_237()) { jj_scanpos = xsp; break; }
- }
- if (jj_scan_token(RPAREN_T)) return true;
+ if (jj_3R_398()) return true;
return false;
}
- inline bool jj_3R_519()
+ inline bool jj_3R_483()
{
if (jj_done) return true;
- if (jj_3R_383()) return true;
+ if (jj_scan_token(COLON_T)) return true;
+ if (jj_3R_89()) return true;
return false;
}
- inline bool jj_3R_273()
+ inline bool jj_3R_533()
{
if (jj_done) return true;
- if (jj_scan_token(MINUS_T)) return true;
+ if (jj_3R_347()) return true;
return false;
}
- inline bool jj_3R_274()
+ inline bool jj_3_78()
{
if (jj_done) return true;
- if (jj_scan_token(AMPERSAND_T)) return true;
+ if (jj_3R_68()) return true;
return false;
}
- inline bool jj_3R_518()
+ inline bool jj_3R_532()
{
if (jj_done) return true;
- if (jj_3R_382()) return true;
+ if (jj_3R_395()) return true;
return false;
}
- inline bool jj_3_71()
+ inline bool jj_3R_393()
{
if (jj_done) return true;
- if (jj_3R_65()) return true;
+ if (jj_scan_token(ALIAS_T)) return true;
+ if (jj_3R_482()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_483()) jj_scanpos = xsp;
+ if (jj_scan_token(IS_T)) return true;
+ if (jj_3R_63()) return true;
+ xsp = jj_scanpos;
+ if (jj_3R_484()) jj_scanpos = xsp;
+ if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_517()
+ inline bool jj_3R_531()
{
if (jj_done) return true;
- if (jj_3R_379()) return true;
+ if (jj_3R_393()) return true;
return false;
}
- inline bool jj_3R_128()
+ inline bool jj_3R_114()
{
if (jj_done) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_247()) return true;
Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_272()) {
- jj_scanpos = xsp;
- if (jj_3R_273()) {
- jj_scanpos = xsp;
- if (jj_3R_274()) return true;
- }
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_248()) { jj_scanpos = xsp; break; }
}
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_272()
+ inline bool jj_3_77()
{
if (jj_done) return true;
- if (jj_scan_token(PLUS_T)) return true;
+ if (jj_3R_67()) return true;
return false;
}
- inline bool jj_3_3()
+ inline bool jj_3R_530()
{
if (jj_done) return true;
- if (jj_3R_60()) return true;
+ if (jj_3R_392()) return true;
return false;
}
- inline bool jj_3_70()
+ inline bool jj_3R_529()
{
if (jj_done) return true;
- if (jj_3R_64()) return true;
+ if (jj_3R_391()) return true;
return false;
}
- inline bool jj_3R_516()
+ inline bool jj_3R_528()
{
if (jj_done) return true;
- if (jj_3R_377()) return true;
+ if (jj_3R_389()) return true;
return false;
}
- inline bool jj_3R_515()
+ inline bool jj_3R_527()
{
if (jj_done) return true;
- if (jj_3R_376()) return true;
+ if (jj_3R_388()) return true;
return false;
}
- inline bool jj_3R_514()
+ inline bool jj_3R_282()
{
if (jj_done) return true;
- if (jj_3R_375()) return true;
+ if (jj_scan_token(MINUS_T)) return true;
return false;
}
- inline bool jj_3R_513()
+ inline bool jj_3R_283()
{
if (jj_done) return true;
- if (jj_3R_373()) return true;
+ if (jj_scan_token(AMPERSAND_T)) return true;
return false;
}
- inline bool jj_3R_492()
+ inline bool jj_3R_526()
{
if (jj_done) return true;
- if (jj_scan_token(BOX_T)) return true;
+ if (jj_3R_387()) return true;
return false;
}
- inline bool jj_3R_493()
+ inline bool jj_3_3()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_60()) return true;
- if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_512()
- {
- if (jj_done) return true;
- if (jj_3R_372()) return true;
- return false;
- }
-
- inline bool jj_3R_511()
+ inline bool jj_3R_133()
{
if (jj_done) return true;
- if (jj_3R_371()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_281()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_282()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_283()) return true;
return false;
}
- inline bool jj_3R_404()
+ inline bool jj_3R_281()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_491()) {
- jj_scanpos = xsp;
- if (jj_3R_492()) {
- jj_scanpos = xsp;
- if (jj_3R_493()) return true;
- }
- }
+ if (jj_scan_token(PLUS_T)) return true;
return false;
}
- inline bool jj_3R_491()
+ inline bool jj_3R_525()
{
if (jj_done) return true;
- if (jj_3R_60()) return true;
+ if (jj_3R_98()) return true;
return false;
}
- inline bool jj_3R_423()
+ inline bool jj_3R_441()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_510()) {
+ if (!jj_3R_525()) return false;
jj_scanpos = xsp;
- if (jj_3R_511()) {
+ if (!jj_3R_526()) return false;
jj_scanpos = xsp;
- if (jj_3R_512()) {
+ if (!jj_3R_527()) return false;
jj_scanpos = xsp;
- if (jj_3R_513()) {
+ if (!jj_3R_528()) return false;
jj_scanpos = xsp;
- if (jj_3R_514()) {
+ if (!jj_3R_529()) return false;
jj_scanpos = xsp;
- if (jj_3R_515()) {
+ if (!jj_3R_530()) return false;
jj_scanpos = xsp;
- if (jj_3R_516()) {
+ if (!jj_3R_531()) return false;
jj_scanpos = xsp;
- if (jj_3_70()) {
+ if (!jj_3_77()) return false;
jj_scanpos = xsp;
- if (jj_3R_517()) {
+ if (!jj_3R_532()) return false;
jj_scanpos = xsp;
- if (jj_3R_518()) {
+ if (!jj_3R_533()) return false;
jj_scanpos = xsp;
- if (jj_3_71()) {
+ if (!jj_3_78()) return false;
jj_scanpos = xsp;
- if (jj_3R_519()) return true;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- return false;
- }
-
- inline bool jj_3R_510()
- {
- if (jj_done) return true;
- if (jj_3R_92()) return true;
+ if (jj_3R_534()) return true;
return false;
}
- inline bool jj_3R_330()
+ inline bool jj_3R_342()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_226()) return true;
+ if (jj_3R_236()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
@@ -7791,505 +7353,543 @@ void parseInline();
inline bool jj_3_2()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_62()) return true;
return false;
}
- inline bool jj_3R_226()
+ inline bool jj_3R_516()
{
if (jj_done) return true;
- if (jj_3R_165()) return true;
+ if (jj_3R_63()) return true;
+ if (jj_scan_token(LPAREN_T)) return true;
+ if (jj_3R_62()) return true;
+ if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3_1()
+ inline bool jj_3R_515()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
+ if (jj_scan_token(BOX_T)) return true;
return false;
}
- inline bool jj_3_69()
+ inline bool jj_3_76()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_119()
+ inline bool jj_3R_124()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3_69()) jj_scanpos = xsp;
- if (jj_3R_176()) return true;
+ if (jj_3_76()) jj_scanpos = xsp;
+ if (jj_3R_180()) return true;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_153()
+ inline bool jj_3R_514()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_62()) return true;
return false;
}
- inline bool jj_3R_176()
+ inline bool jj_3R_419()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_330()) jj_scanpos = xsp;
+ if (!jj_3R_514()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_515()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_516()) return true;
return false;
}
- inline bool jj_3_67()
+ inline bool jj_3R_180()
{
if (jj_done) return true;
- if (jj_3R_86()) return true;
+ if (jj_3R_63()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_342()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_152()
+ inline bool jj_3R_236()
{
if (jj_done) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_169()) return true;
return false;
}
- inline bool jj_3R_204()
+ inline bool jj_3_74()
{
if (jj_done) return true;
- if (jj_3R_351()) return true;
+ if (jj_3R_91()) return true;
return false;
}
- inline bool jj_3R_151()
+ inline bool jj_3R_214()
{
if (jj_done) return true;
- if (jj_scan_token(OPEN_T)) return true;
+ if (jj_3R_87()) return true;
return false;
}
- inline bool jj_3R_60()
+ inline bool jj_3R_213()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_3R_151()) {
- jj_scanpos = xsp;
- if (jj_3R_152()) {
- jj_scanpos = xsp;
- if (jj_3R_153()) return true;
- }
- }
+ if (jj_3R_368()) return true;
return false;
}
- inline bool jj_3_68()
+ inline bool jj_3_1()
{
if (jj_done) return true;
- if (jj_3R_107()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_656()
+ inline bool jj_3_75()
{
if (jj_done) return true;
- if (jj_scan_token(ACCESS_T)) return true;
- if (jj_3R_84()) return true;
+ if (jj_3R_95()) return true;
return false;
}
- inline bool jj_3R_203()
+ inline bool jj_3R_155()
{
if (jj_done) return true;
- if (jj_3R_86()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_202()
+ inline bool jj_3R_212()
{
if (jj_done) return true;
- if (jj_3R_350()) return true;
+ if (jj_3R_91()) return true;
return false;
}
- inline bool jj_3R_225()
+ inline bool jj_3R_211()
{
if (jj_done) return true;
- if (jj_scan_token(BASED_LITERAL)) return true;
+ if (jj_3R_367()) return true;
return false;
}
- inline bool jj_3R_201()
+ inline bool jj_3_73()
{
if (jj_done) return true;
- if (jj_3R_349()) return true;
+ if (jj_3R_113()) return true;
return false;
}
- inline bool jj_3R_93()
+ inline bool jj_3R_210()
+ {
+ if (jj_done) return true;
+ if (jj_3R_366()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_99()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_201()) {
+ if (!jj_3R_210()) return false;
jj_scanpos = xsp;
- if (jj_3R_202()) {
+ if (!jj_3R_211()) return false;
jj_scanpos = xsp;
- if (jj_3R_203()) {
+ if (!jj_3R_212()) return false;
jj_scanpos = xsp;
- if (jj_3_68()) {
+ if (!jj_3_75()) return false;
jj_scanpos = xsp;
- if (jj_3R_204()) return true;
- }
- }
- }
- }
+ if (!jj_3R_213()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_214()) return true;
return false;
}
- inline bool jj_3R_224()
+ inline bool jj_3R_154()
{
if (jj_done) return true;
- if (jj_scan_token(INTEGER)) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3_66()
+ inline bool jj_3_72()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_223()
+ inline bool jj_3R_153()
{
if (jj_done) return true;
- if (jj_scan_token(DECIMAL_LITERAL)) return true;
+ if (jj_scan_token(OPEN_T)) return true;
return false;
}
- inline bool jj_3R_103()
+ inline bool jj_3R_62()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_223()) {
+ if (!jj_3R_153()) return false;
jj_scanpos = xsp;
- if (jj_3R_224()) {
+ if (!jj_3R_154()) return false;
jj_scanpos = xsp;
- if (jj_3R_225()) return true;
- }
- }
+ if (jj_3R_155()) return true;
return false;
}
- inline bool jj_3_65()
+ inline bool jj_3_71()
{
if (jj_done) return true;
- if (jj_3R_106()) return true;
+ if (jj_3R_112()) return true;
return false;
}
- inline bool jj_3R_457()
+ inline bool jj_3R_475()
{
if (jj_done) return true;
- if (jj_3R_108()) return true;
+ if (jj_3R_114()) return true;
return false;
}
- inline bool jj_3_64()
+ inline bool jj_3_70()
{
if (jj_done) return true;
- if (jj_3R_105()) return true;
+ if (jj_3R_111()) return true;
return false;
}
- inline bool jj_3R_456()
+ inline bool jj_3R_658()
{
if (jj_done) return true;
- if (jj_3R_531()) return true;
+ if (jj_scan_token(ACCESS_T)) return true;
+ if (jj_3R_89()) return true;
return false;
}
- inline bool jj_3_63()
+ inline bool jj_3R_474()
{
if (jj_done) return true;
- if (jj_3R_61()) return true;
+ if (jj_3R_113()) return true;
return false;
}
- inline bool jj_3R_455()
+ inline bool jj_3_69()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ if (jj_3R_64()) return true;
return false;
}
- inline bool jj_3_62()
+ inline bool jj_3R_473()
+ {
+ if (jj_done) return true;
+ if (jj_3R_63()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_235()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(BASED_LITERAL)) return true;
+ return false;
+ }
+
+ inline bool jj_3_68()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_454()
+ inline bool jj_3R_234()
{
if (jj_done) return true;
- if (jj_3R_106()) return true;
+ if (jj_scan_token(INTEGER)) return true;
return false;
}
- inline bool jj_3_61()
+ inline bool jj_3R_472()
{
if (jj_done) return true;
- if (jj_3R_104()) return true;
+ if (jj_3R_112()) return true;
return false;
}
- inline bool jj_3R_242()
+ inline bool jj_3R_109()
{
if (jj_done) return true;
- if (jj_3R_59()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (!jj_3R_233()) return false;
+ jj_scanpos = xsp;
+ if (!jj_3R_234()) return false;
+ jj_scanpos = xsp;
+ if (jj_3R_235()) return true;
return false;
}
- inline bool jj_3R_453()
+ inline bool jj_3R_233()
{
if (jj_done) return true;
- if (jj_3R_105()) return true;
+ if (jj_scan_token(DECIMAL_LITERAL)) return true;
return false;
}
- inline bool jj_3R_452()
+ inline bool jj_3R_702()
{
if (jj_done) return true;
- if (jj_3R_61()) return true;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_451()
+ inline bool jj_3_67()
+ {
+ if (jj_done) return true;
+ if (jj_3R_110()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_471()
+ {
+ if (jj_done) return true;
+ if (jj_3R_111()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_470()
+ {
+ if (jj_done) return true;
+ if (jj_3R_64()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_469()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_370()
+ inline bool jj_3R_386()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_450()) {
+ if (!jj_3R_468()) return false;
jj_scanpos = xsp;
- if (jj_3R_451()) {
+ if (!jj_3R_469()) return false;
jj_scanpos = xsp;
- if (jj_3R_452()) {
+ if (!jj_3R_470()) return false;
jj_scanpos = xsp;
- if (jj_3R_453()) {
+ if (!jj_3R_471()) return false;
jj_scanpos = xsp;
- if (jj_3R_454()) {
+ if (!jj_3R_472()) return false;
jj_scanpos = xsp;
- if (jj_3R_455()) {
+ if (!jj_3R_473()) return false;
jj_scanpos = xsp;
- if (jj_3R_456()) {
+ if (!jj_3R_474()) return false;
jj_scanpos = xsp;
- if (jj_3R_457()) return true;
- }
- }
- }
- }
- }
- }
- }
+ if (jj_3R_475()) return true;
return false;
}
- inline bool jj_3R_450()
+ inline bool jj_3R_468()
{
if (jj_done) return true;
- if (jj_3R_104()) return true;
+ if (jj_3R_110()) return true;
return false;
}
- inline bool jj_3R_329()
+ inline bool jj_3R_341()
{
if (jj_done) return true;
if (jj_scan_token(PORT_T)) return true;
if (jj_scan_token(MAP_T)) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_165()) return true;
+ if (jj_3R_169()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_582()
+ inline bool jj_3R_594()
{
if (jj_done) return true;
- if (jj_3R_313()) return true;
+ if (jj_3R_327()) return true;
return false;
}
- inline bool jj_3R_241()
+ inline bool jj_3R_701()
{
if (jj_done) return true;
- if (jj_3R_360()) return true;
+ if (jj_3R_721()) return true;
return false;
}
- inline bool jj_3R_538()
+ inline bool jj_3R_553()
{
if (jj_done) return true;
if (jj_scan_token(PORT_T)) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_582()) return true;
+ if (jj_3R_594()) return true;
if (jj_scan_token(RPAREN_T)) return true;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_111()
+ inline bool jj_3R_694()
{
if (jj_done) return true;
if (jj_scan_token(UNITS_T)) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(SEMI_T)) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_241()) { jj_scanpos = xsp; break; }
+ if (jj_3R_701()) { jj_scanpos = xsp; break; }
}
if (jj_scan_token(END_T)) return true;
if (jj_scan_token(UNITS_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_242()) jj_scanpos = xsp;
+ if (jj_3R_702()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3_60()
+ inline bool jj_3_66()
{
if (jj_done) return true;
- if (jj_3R_103()) return true;
+ if (jj_3R_109()) return true;
return false;
}
- inline bool jj_3R_222()
+ inline bool jj_3R_232()
{
if (jj_done) return true;
- if (jj_3R_103()) return true;
+ if (jj_3R_109()) return true;
return false;
}
- inline bool jj_3R_102()
+ inline bool jj_3R_108()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_222()) jj_scanpos = xsp;
- if (jj_3R_59()) return true;
+ if (jj_3R_232()) jj_scanpos = xsp;
+ if (jj_3R_63()) return true;
return false;
}
- inline bool jj_3R_408()
+ inline bool jj_3R_543()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(IN_T)) return true;
- if (jj_3R_67()) return true;
+ if (jj_3R_72()) return true;
return false;
}
- inline bool jj_3_59()
+ inline bool jj_3_65()
{
if (jj_done) return true;
- if (jj_3R_86()) return true;
+ if (jj_3R_91()) return true;
return false;
}
- inline bool jj_3_57()
+ inline bool jj_3_63()
{
if (jj_done) return true;
- if (jj_3R_64()) return true;
+ if (jj_3R_67()) return true;
return false;
}
- inline bool jj_3_58()
+ inline bool jj_3_64()
{
if (jj_done) return true;
- if (jj_3R_65()) return true;
+ if (jj_3R_68()) return true;
return false;
}
- inline bool jj_3R_351()
+ inline bool jj_3R_368()
{
if (jj_done) return true;
if (jj_scan_token(PACKAGE_T)) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3_56()
+ inline bool jj_3_62()
{
if (jj_done) return true;
- if (jj_3R_65()) return true;
+ if (jj_3R_68()) return true;
return false;
}
- inline bool jj_3R_317()
+ inline bool jj_3R_331()
{
if (jj_done) return true;
- if (jj_3R_405()) return true;
+ if (jj_3R_420()) return true;
return false;
}
- inline bool jj_3R_261()
+ inline bool jj_3R_172()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(50)) jj_scanpos = xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_331()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_166()
+ inline bool jj_3R_270()
{
if (jj_done) return true;
- Token * xsp;
- xsp = jj_scanpos;
- if (jj_scan_token(50)) jj_scanpos = xsp;
- xsp = jj_scanpos;
- if (jj_3R_317()) jj_scanpos = xsp;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_310()
+ inline bool jj_3R_321()
{
if (jj_done) return true;
if (jj_scan_token(STRINGLITERAL)) return true;
return false;
}
- inline bool jj_3R_647()
+ inline bool jj_3R_654()
{
if (jj_done) return true;
if (jj_scan_token(TYPE_T)) return true;
return false;
}
- inline bool jj_3R_646()
+ inline bool jj_3R_653()
{
if (jj_done) return true;
if (jj_scan_token(FILE_T)) return true;
return false;
}
- inline bool jj_3R_645()
+ inline bool jj_3R_652()
{
if (jj_done) return true;
if (jj_scan_token(SHARED_T)) return true;
@@ -8297,292 +7897,321 @@ void parseInline();
return false;
}
- inline bool jj_3_55()
+ inline bool jj_3_61()
{
if (jj_done) return true;
- if (jj_3R_102()) return true;
+ if (jj_3R_108()) return true;
return false;
}
- inline bool jj_3R_644()
+ inline bool jj_3R_651()
{
if (jj_done) return true;
if (jj_scan_token(VARIABLE_T)) return true;
return false;
}
- inline bool jj_3R_643()
+ inline bool jj_3R_650()
{
if (jj_done) return true;
if (jj_scan_token(SIGNAL_T)) return true;
return false;
}
- inline bool jj_3R_642()
+ inline bool jj_3R_649()
{
if (jj_done) return true;
if (jj_scan_token(CONSTANT_T)) return true;
return false;
}
- inline bool jj_3R_613()
+ inline bool jj_3R_625()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_642()) {
+ if (!jj_3R_649()) return false;
jj_scanpos = xsp;
- if (jj_3R_643()) {
+ if (!jj_3R_650()) return false;
jj_scanpos = xsp;
- if (jj_3R_644()) {
+ if (!jj_3R_651()) return false;
jj_scanpos = xsp;
- if (jj_3R_645()) {
+ if (!jj_3R_652()) return false;
jj_scanpos = xsp;
- if (jj_3R_646()) {
+ if (!jj_3R_653()) return false;
jj_scanpos = xsp;
- if (jj_3R_647()) return true;
- }
- }
- }
- }
- }
+ if (jj_3R_654()) return true;
return false;
}
- inline bool jj_3R_353()
+ inline bool jj_3R_370()
{
if (jj_done) return true;
if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_206()
+ inline bool jj_3R_216()
{
if (jj_done) return true;
- if (jj_3R_103()) return true;
+ if (jj_3R_109()) return true;
return false;
}
- inline bool jj_3R_205()
+ inline bool jj_3R_215()
{
if (jj_done) return true;
- if (jj_3R_102()) return true;
+ if (jj_3R_108()) return true;
return false;
}
- inline bool jj_3R_95()
+ inline bool jj_3R_101()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_205()) {
+ if (!jj_3R_215()) return false;
jj_scanpos = xsp;
- if (jj_3R_206()) return true;
- }
+ if (jj_3R_216()) return true;
return false;
}
- inline bool jj_3R_441()
+ inline bool jj_3R_459()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_363()
+ inline bool jj_3R_379()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_441()) jj_scanpos = xsp;
+ if (jj_3R_459()) jj_scanpos = xsp;
if (jj_scan_token(NULL_T)) return true;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_101()
+ inline bool jj_3R_107()
{
if (jj_done) return true;
if (jj_scan_token(COMMA_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
return false;
}
- inline bool jj_3R_262()
+ inline bool jj_3R_271()
{
if (jj_done) return true;
if (jj_scan_token(WHEN_T)) return true;
- if (jj_3R_79()) return true;
+ if (jj_3R_83()) return true;
return false;
}
- inline bool jj_3_54()
+ inline bool jj_3R_269()
{
if (jj_done) return true;
- if (jj_scan_token(LBRACKET_T)) return true;
+ if (jj_3R_74()) return true;
+ if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_260()
+ inline bool jj_3_60()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
- if (jj_scan_token(COLON_T)) return true;
+ if (jj_scan_token(LBRACKET_T)) return true;
return false;
}
- inline bool jj_3R_123()
+ inline bool jj_3R_128()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_260()) jj_scanpos = xsp;
+ if (jj_3R_269()) jj_scanpos = xsp;
if (jj_scan_token(NEXT_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_261()) jj_scanpos = xsp;
+ if (jj_3R_270()) jj_scanpos = xsp;
xsp = jj_scanpos;
- if (jj_3R_262()) jj_scanpos = xsp;
+ if (jj_3R_271()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3R_221()
+ inline bool jj_3R_231()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_219()
- {
- if (jj_done) return true;
- if (jj_3R_234()) return true;
- return false;
- }
-
- inline bool jj_3_53()
+ inline bool jj_3_59()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_101()) { jj_scanpos = xsp; break; }
+ if (jj_3R_107()) { jj_scanpos = xsp; break; }
}
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_100()
+ inline bool jj_3R_229()
+ {
+ if (jj_done) return true;
+ if (jj_3R_245()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_106()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_219()) jj_scanpos = xsp;
+ if (jj_3R_229()) jj_scanpos = xsp;
if (jj_scan_token(APOSTROPHE_T)) return true;
- if (jj_3R_220()) return true;
+ if (jj_3R_230()) return true;
xsp = jj_scanpos;
- if (jj_3R_221()) jj_scanpos = xsp;
+ if (jj_3R_231()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3_52()
+ inline bool jj_3_58()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_67()) return true;
+ if (jj_3R_72()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3_48()
+ inline bool jj_3_54()
{
if (jj_done) return true;
- if (jj_3R_98()) return true;
+ if (jj_3R_104()) return true;
+ return false;
+ }
+
+ inline bool jj_3_57()
+ {
+ if (jj_done) return true;
+ if (jj_3R_106()) return true;
+ return false;
+ }
+
+ inline bool jj_3_52()
+ {
+ if (jj_done) return true;
+ if (jj_3R_103()) return true;
return false;
}
inline bool jj_3_51()
{
if (jj_done) return true;
- if (jj_3R_100()) return true;
+ if (jj_3R_103()) return true;
return false;
}
- inline bool jj_3R_214()
+ inline bool jj_3_53()
+ {
+ if (jj_done) return true;
+ if (jj_3R_103()) return true;
+ return false;
+ }
+
+ inline bool jj_3_56()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(DOT_T)) return true;
+ if (jj_3R_105()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_224()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_58()) return true;
+ if (jj_3R_61()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_353()) { jj_scanpos = xsp; break; }
+ if (jj_3R_370()) { jj_scanpos = xsp; break; }
}
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3_50()
+ inline bool jj_3_55()
{
if (jj_done) return true;
- if (jj_scan_token(DOT_T)) return true;
- if (jj_3R_99()) return true;
+ if (jj_scan_token(APOSTROPHE_T)) return true;
+ if (jj_scan_token(SUBTYPE_T)) return true;
return false;
}
- inline bool jj_3_49()
+ inline bool jj_3R_219()
{
if (jj_done) return true;
- if (jj_scan_token(APOSTROPHE_T)) return true;
- if (jj_scan_token(SUBTYPE_T)) return true;
+ if (jj_3R_104()) return true;
return false;
}
- inline bool jj_3R_213()
+ inline bool jj_3R_223()
{
if (jj_done) return true;
if (jj_scan_token(LPAREN_T)) return true;
- if (jj_3R_67()) return true;
+ if (jj_3R_72()) return true;
if (jj_scan_token(RPAREN_T)) return true;
return false;
}
- inline bool jj_3R_209()
+ inline bool jj_3R_222()
{
if (jj_done) return true;
- if (jj_3R_98()) return true;
+ if (jj_3R_106()) return true;
return false;
}
- inline bool jj_3R_212()
+ inline bool jj_3R_322()
{
if (jj_done) return true;
- if (jj_3R_100()) return true;
+ if (jj_3R_103()) return true;
return false;
}
- inline bool jj_3R_149()
+ inline bool jj_3R_324()
{
if (jj_done) return true;
- if (jj_3R_311()) return true;
+ if (jj_3R_103()) return true;
return false;
}
- inline bool jj_3R_211()
+ inline bool jj_3R_325()
+ {
+ if (jj_done) return true;
+ if (jj_3R_103()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_221()
{
if (jj_done) return true;
if (jj_scan_token(DOT_T)) return true;
- if (jj_3R_99()) return true;
+ if (jj_3R_105()) return true;
return false;
}
- inline bool jj_3R_210()
+ inline bool jj_3R_220()
{
if (jj_done) return true;
if (jj_scan_token(APOSTROPHE_T)) return true;
@@ -8590,321 +8219,326 @@ void parseInline();
return false;
}
- inline bool jj_3R_98()
+ inline bool jj_3R_104()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_210()) {
+ if (!jj_3R_220()) return false;
jj_scanpos = xsp;
- if (jj_3R_211()) {
+ if (!jj_3R_221()) return false;
jj_scanpos = xsp;
- if (jj_3R_212()) {
+ if (!jj_3R_222()) return false;
jj_scanpos = xsp;
- if (jj_3R_213()) {
+ if (!jj_3R_223()) return false;
jj_scanpos = xsp;
- if (jj_3R_214()) return true;
- }
- }
- }
- }
- return false;
- }
-
- inline bool jj_3_47()
- {
- if (jj_done) return true;
- if (jj_3R_97()) return true;
+ if (jj_3R_224()) return true;
return false;
}
- inline bool jj_3R_97()
+ inline bool jj_3R_103()
{
if (jj_done) return true;
- if (jj_3R_98()) return true;
+ if (jj_3R_104()) return true;
Token * xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3R_209()) { jj_scanpos = xsp; break; }
+ if (jj_3R_219()) { jj_scanpos = xsp; break; }
}
return false;
}
- inline bool jj_3R_148()
+ inline bool jj_3R_158()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_325()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_150()
+ inline bool jj_3R_157()
{
if (jj_done) return true;
- if (jj_3R_97()) return true;
+ if (jj_3R_323()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_324()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_147()
+ inline bool jj_3R_156()
{
if (jj_done) return true;
- if (jj_3R_310()) return true;
+ if (jj_3R_321()) return true;
+ Token * xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_322()) jj_scanpos = xsp;
return false;
}
- inline bool jj_3R_59()
+ inline bool jj_3R_63()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_147()) {
+ if (!jj_3R_156()) return false;
jj_scanpos = xsp;
- if (jj_3R_148()) {
+ if (!jj_3R_157()) return false;
jj_scanpos = xsp;
- if (jj_3R_149()) return true;
- }
- }
- xsp = jj_scanpos;
- if (jj_3R_150()) jj_scanpos = xsp;
+ if (jj_3R_158()) return true;
return false;
}
- inline bool jj_3R_281()
+ inline bool jj_3R_290()
{
if (jj_done) return true;
if (jj_scan_token(REM_T)) return true;
return false;
}
- inline bool jj_3R_280()
+ inline bool jj_3R_289()
{
if (jj_done) return true;
if (jj_scan_token(MOD_T)) return true;
return false;
}
- inline bool jj_3R_279()
+ inline bool jj_3R_288()
{
if (jj_done) return true;
if (jj_scan_token(SLASH_T)) return true;
return false;
}
- inline bool jj_3R_134()
+ inline bool jj_3R_140()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_278()) {
+ if (!jj_3R_287()) return false;
jj_scanpos = xsp;
- if (jj_3R_279()) {
+ if (!jj_3R_288()) return false;
jj_scanpos = xsp;
- if (jj_3R_280()) {
+ if (!jj_3R_289()) return false;
jj_scanpos = xsp;
- if (jj_3R_281()) return true;
- }
- }
- }
+ if (jj_3R_290()) return true;
return false;
}
- inline bool jj_3R_278()
+ inline bool jj_3R_287()
{
if (jj_done) return true;
if (jj_scan_token(MULT_T)) return true;
return false;
}
- inline bool jj_3R_629()
+ inline bool jj_3R_635()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
return false;
}
- inline bool jj_3R_431()
+ inline bool jj_3R_449()
{
if (jj_done) return true;
if (jj_scan_token(LINKAGE_T)) return true;
return false;
}
- inline bool jj_3R_430()
+ inline bool jj_3R_448()
{
if (jj_done) return true;
if (jj_scan_token(BUFFER_T)) return true;
return false;
}
- inline bool jj_3R_429()
+ inline bool jj_3R_447()
{
if (jj_done) return true;
if (jj_scan_token(INOUT_T)) return true;
return false;
}
- inline bool jj_3R_428()
+ inline bool jj_3R_446()
{
if (jj_done) return true;
if (jj_scan_token(OUT_T)) return true;
return false;
}
- inline bool jj_3R_346()
+ inline bool jj_3R_363()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_427()) {
+ if (!jj_3R_445()) return false;
jj_scanpos = xsp;
- if (jj_3R_428()) {
+ if (!jj_3R_446()) return false;
jj_scanpos = xsp;
- if (jj_3R_429()) {
+ if (!jj_3R_447()) return false;
jj_scanpos = xsp;
- if (jj_3R_430()) {
+ if (!jj_3R_448()) return false;
jj_scanpos = xsp;
- if (jj_3R_431()) return true;
- }
- }
- }
- }
+ if (jj_3R_449()) return true;
return false;
}
- inline bool jj_3R_427()
+ inline bool jj_3R_445()
{
if (jj_done) return true;
if (jj_scan_token(IN_T)) return true;
return false;
}
- inline bool jj_3R_258()
+ inline bool jj_3R_267()
{
if (jj_done) return true;
- if (jj_3R_367()) return true;
+ if (jj_3R_383()) return true;
return false;
}
- inline bool jj_3R_257()
+ inline bool jj_3R_266()
{
if (jj_done) return true;
- if (jj_3R_69()) return true;
+ if (jj_3R_74()) return true;
if (jj_scan_token(COLON_T)) return true;
return false;
}
- inline bool jj_3R_122()
+ inline bool jj_3R_127()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_257()) jj_scanpos = xsp;
+ if (jj_3R_266()) jj_scanpos = xsp;
xsp = jj_scanpos;
- if (jj_3R_258()) jj_scanpos = xsp;
+ if (jj_3R_267()) jj_scanpos = xsp;
if (jj_scan_token(LOOP_T)) return true;
- if (jj_3R_259()) return true;
+ if (jj_3R_268()) return true;
if (jj_scan_token(END_T)) return true;
if (jj_scan_token(LOOP_T)) return true;
xsp = jj_scanpos;
- if (jj_3R_629()) jj_scanpos = xsp;
+ if (jj_3R_635()) jj_scanpos = xsp;
if (jj_scan_token(SEMI_T)) return true;
return false;
}
- inline bool jj_3_46()
+ inline bool jj_3_50()
{
if (jj_done) return true;
- if (jj_3R_96()) return true;
+ if (jj_3R_102()) return true;
return false;
}
- inline bool jj_3_45()
+ inline bool jj_3_49()
{
if (jj_done) return true;
- if (jj_3R_95()) return true;
+ if (jj_3R_101()) return true;
return false;
}
- inline bool jj_3R_233()
+ inline bool jj_3R_243()
{
if (jj_done) return true;
if (jj_scan_token(NULL_T)) return true;
return false;
}
- inline bool jj_3_44()
+ inline bool jj_3_48()
{
if (jj_done) return true;
- if (jj_3R_94()) return true;
+ if (jj_3R_100()) return true;
return false;
}
- inline bool jj_3R_232()
+ inline bool jj_3R_242()
{
if (jj_done) return true;
- if (jj_3R_356()) return true;
+ if (jj_3R_373()) return true;
return false;
}
- inline bool jj_3R_231()
+ inline bool jj_3R_241()
{
if (jj_done) return true;
- if (jj_3R_96()) return true;
+ if (jj_3R_102()) return true;
return false;
}
- inline bool jj_3R_230()
+ inline bool jj_3R_240()
{
if (jj_done) return true;
- if (jj_3R_95()) return true;
+ if (jj_3R_101()) return true;
return false;
}
- inline bool jj_3R_106()
+ inline bool jj_3R_112()
{
if (jj_done) return true;
Token * xsp;
xsp = jj_scanpos;
- if (jj_3R_229()) {
+ if (!jj_3R_239()) return false;
jj_scanpos = xsp;
- if (jj_3R_230()) {
+ if (!jj_3R_240()) return false;
jj_scanpos = xsp;
- if (jj_3R_231()) {
+ if (!jj_3R_241()) return false;
jj_scanpos = xsp;
- if (jj_3R_232()) {
+ if (!jj_3R_242()) return false;
jj_scanpos = xsp;
- if (jj_3R_233()) return true;
- }
- }
- }
- }
+ if (jj_3R_243()) return true;
return false;
}
- inline bool jj_3R_229()
+ inline bool jj_3R_239()
{
if (jj_done) return true;
- if (jj_3R_94()) return true;
+ if (jj_3R_100()) return true;
return false;
}
- inline bool jj_3_43()
+ inline bool jj_3_47()
{
if (jj_done) return true;
- if (jj_3R_93()) return true;
+ if (jj_3R_99()) return true;
+ return false;
+ }
+
+ inline bool jj_3R_346()
+ {
+ if (jj_done) return true;
+ if (jj_scan_token(LIBRARY_T)) return true;
+ if (jj_3R_205()) return true;
+ if (jj_scan_token(SEMI_T)) return true;
+ return false;
+ }
+
+ inline bool jj_3R_145()
+ {
+ if (jj_done) return true;
+ if (jj_3R_74()) return true;
return false;
}
public:
- TokenManager *token_source;
- CharStream *jj_input_stream;
+ void setErrorHandler(ErrorHandler *eh) {
+ if (errorHandler) delete errorHandler;
+ errorHandler = eh;
+ }
+
+ TokenManager *token_source = nullptr;
+ CharStream *jj_input_stream = nullptr;
/** Current token. */
- Token *token;
+ Token *token = nullptr;
/** Next token. */
- Token *jj_nt;
+ Token *jj_nt = nullptr;
+
private:
int jj_ntk;
- JJCalls jj_2_rtns[117];
+ JJCalls jj_2_rtns[126];
bool jj_rescan;
int jj_gc;
Token *jj_scanpos, *jj_lastpos;
@@ -8913,58 +8547,40 @@ private:
bool jj_lookingAhead;
bool jj_semLA;
int jj_gen;
- int jj_la1[294];
- ErrorHandler *errorHandler;
- bool errorHandlerCreated;
+ int jj_la1[304];
+ ErrorHandler *errorHandler = nullptr;
+
protected:
bool hasError;
-public:
- void setErrorHandler(ErrorHandler *eh) {
- if (errorHandlerCreated) delete errorHandler;
- errorHandler = eh;
- errorHandlerCreated = false;
- }
+
Token *head;
public:
-
- VhdlParser(TokenManager *tm);
+ VhdlParser(TokenManager *tokenManager);
virtual ~VhdlParser();
-
-void ReInit(TokenManager *tm);
-
+void ReInit(TokenManager* tokenManager);
void clear();
-
Token * jj_consume_token(int kind);
-
bool jj_scan_token(int kind);
-
Token * getNextToken();
-
Token * getToken(int index);
-
int jj_ntk_f();
private:
int jj_kind;
int **jj_expentries;
int *jj_expentry;
-
void jj_add_error_token(int kind, int pos);
protected:
/** Generate ParseException. */
-
virtual void parseError();
private:
- int trace_indent;
- bool trace_enabled;
+ int indent; // trace indentation
+ bool trace = false; // trace enabled if true
public:
-
+ bool trace_enabled();
void enable_tracing();
-
void disable_tracing();
-
void jj_rescan_token();
-
void jj_save(int index, int xla);
struct SharedState
{
diff --git a/vhdlparser/VhdlParserConstants.h b/vhdlparser/VhdlParserConstants.h
index 882402b..e87567f 100644
--- a/vhdlparser/VhdlParserConstants.h
+++ b/vhdlparser/VhdlParserConstants.h
@@ -2,7 +2,7 @@
/**
* Token literal values and constants.
- * Generated by org.javacc.parser.OtherFilesGen#start()
+ * Generated by org.javacc.parser.OtherFilesGenCPP#start()
*/
#ifndef VHDLPARSERCONSTANTS_H
#define VHDLPARSERCONSTANTS_H
@@ -382,392 +382,396 @@ const int LOWER_CASE_LETTER = 187;
const int QUOTE = 188;
/** RegularExpression Id. */
const int VHDL2008TOOLDIR = 189;
+ /** RegularExpression Id. */
+const int SPEC_ATTR = 190;
/** Lexical state. */
const int DEFAULT = 0;
/** Literal token values. */
- static JAVACC_CHAR_TYPE tokenImage_arr_0[] =
+ static const JJChar tokenImage_arr_0[] =
{0x3c, 0x45, 0x4f, 0x46, 0x3e, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_1[] =
+ static const JJChar tokenImage_arr_1[] =
{0x22, 0x20, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_2[] =
+ static const JJChar tokenImage_arr_2[] =
{0x22, 0x9, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_3[] =
+ static const JJChar tokenImage_arr_3[] =
{0x22, 0xa, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_4[] =
+ static const JJChar tokenImage_arr_4[] =
{0x22, 0xd, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_5[] =
+ static const JJChar tokenImage_arr_5[] =
{0x22, 0x3c, 0x44, 0x4f, 0x58, 0x59, 0x47, 0x45, 0x4e, 0x5f, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_6[] =
+ static const JJChar tokenImage_arr_6[] =
{0x22, 0x3c, 0x4d, 0x55, 0x4c, 0x54, 0x5f, 0x44, 0x4f, 0x58, 0x59, 0x47, 0x45, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_7[] =
+ static const JJChar tokenImage_arr_7[] =
{0x22, 0x3c, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x43, 0x48, 0x41, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_8[] =
+ static const JJChar tokenImage_arr_8[] =
{0x22, 0x3c, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_9[] =
+ static const JJChar tokenImage_arr_9[] =
{0x22, 0x3c, 0x4d, 0x55, 0x4c, 0x54, 0x5f, 0x44, 0x4f, 0x58, 0x59, 0x47, 0x45, 0x4e, 0x5f, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x32, 0x30, 0x30, 0x38, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_10[] =
+ static const JJChar tokenImage_arr_10[] =
{0x22, 0x3c, 0x4d, 0x55, 0x4c, 0x54, 0x5f, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x32, 0x30, 0x30, 0x38, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_11[] =
+ static const JJChar tokenImage_arr_11[] =
{0x22, 0x61, 0x62, 0x73, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_12[] =
+ static const JJChar tokenImage_arr_12[] =
{0x22, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_13[] =
+ static const JJChar tokenImage_arr_13[] =
{0x22, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_14[] =
+ static const JJChar tokenImage_arr_14[] =
{0x22, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_15[] =
+ static const JJChar tokenImage_arr_15[] =
{0x22, 0x61, 0x6c, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_16[] =
+ static const JJChar tokenImage_arr_16[] =
{0x22, 0x61, 0x6e, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_17[] =
+ static const JJChar tokenImage_arr_17[] =
{0x22, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_18[] =
+ static const JJChar tokenImage_arr_18[] =
{0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_19[] =
+ static const JJChar tokenImage_arr_19[] =
{0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_20[] =
+ static const JJChar tokenImage_arr_20[] =
{0x22, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_21[] =
+ static const JJChar tokenImage_arr_21[] =
{0x22, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_22[] =
+ static const JJChar tokenImage_arr_22[] =
{0x22, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_23[] =
+ static const JJChar tokenImage_arr_23[] =
{0x22, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_24[] =
+ static const JJChar tokenImage_arr_24[] =
{0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_25[] =
+ static const JJChar tokenImage_arr_25[] =
{0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_26[] =
+ static const JJChar tokenImage_arr_26[] =
{0x22, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_27[] =
+ static const JJChar tokenImage_arr_27[] =
{0x22, 0x62, 0x75, 0x73, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_28[] =
+ static const JJChar tokenImage_arr_28[] =
{0x22, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_29[] =
+ static const JJChar tokenImage_arr_29[] =
{0x22, 0x63, 0x61, 0x73, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_30[] =
+ static const JJChar tokenImage_arr_30[] =
{0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_31[] =
+ static const JJChar tokenImage_arr_31[] =
{0x22, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_32[] =
+ static const JJChar tokenImage_arr_32[] =
{0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_33[] =
+ static const JJChar tokenImage_arr_33[] =
{0x22, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_34[] =
+ static const JJChar tokenImage_arr_34[] =
{0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_35[] =
+ static const JJChar tokenImage_arr_35[] =
{0x22, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_36[] =
+ static const JJChar tokenImage_arr_36[] =
{0x22, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x6f, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_37[] =
+ static const JJChar tokenImage_arr_37[] =
{0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_38[] =
+ static const JJChar tokenImage_arr_38[] =
{0x22, 0x65, 0x6c, 0x73, 0x69, 0x66, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_39[] =
+ static const JJChar tokenImage_arr_39[] =
{0x22, 0x65, 0x6e, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_40[] =
+ static const JJChar tokenImage_arr_40[] =
{0x22, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_41[] =
+ static const JJChar tokenImage_arr_41[] =
{0x22, 0x65, 0x78, 0x69, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_42[] =
+ static const JJChar tokenImage_arr_42[] =
{0x22, 0x66, 0x61, 0x69, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_43[] =
+ static const JJChar tokenImage_arr_43[] =
{0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_44[] =
+ static const JJChar tokenImage_arr_44[] =
{0x22, 0x66, 0x6f, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_45[] =
+ static const JJChar tokenImage_arr_45[] =
{0x22, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_46[] =
+ static const JJChar tokenImage_arr_46[] =
{0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_47[] =
+ static const JJChar tokenImage_arr_47[] =
{0x22, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_48[] =
+ static const JJChar tokenImage_arr_48[] =
{0x22, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_49[] =
+ static const JJChar tokenImage_arr_49[] =
{0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_50[] =
+ static const JJChar tokenImage_arr_50[] =
{0x22, 0x67, 0x75, 0x61, 0x72, 0x64, 0x65, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_51[] =
+ static const JJChar tokenImage_arr_51[] =
{0x22, 0x69, 0x66, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_52[] =
+ static const JJChar tokenImage_arr_52[] =
{0x22, 0x69, 0x6d, 0x70, 0x75, 0x72, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_53[] =
+ static const JJChar tokenImage_arr_53[] =
{0x22, 0x69, 0x6e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_54[] =
+ static const JJChar tokenImage_arr_54[] =
{0x22, 0x69, 0x6e, 0x65, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_55[] =
+ static const JJChar tokenImage_arr_55[] =
{0x22, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_56[] =
+ static const JJChar tokenImage_arr_56[] =
{0x22, 0x69, 0x73, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_57[] =
+ static const JJChar tokenImage_arr_57[] =
{0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_58[] =
+ static const JJChar tokenImage_arr_58[] =
{0x22, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_59[] =
+ static const JJChar tokenImage_arr_59[] =
{0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x67, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_60[] =
+ static const JJChar tokenImage_arr_60[] =
{0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_61[] =
+ static const JJChar tokenImage_arr_61[] =
{0x22, 0x6c, 0x6f, 0x6f, 0x70, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_62[] =
+ static const JJChar tokenImage_arr_62[] =
{0x22, 0x6d, 0x61, 0x70, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_63[] =
+ static const JJChar tokenImage_arr_63[] =
{0x22, 0x6d, 0x6f, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_64[] =
+ static const JJChar tokenImage_arr_64[] =
{0x22, 0x6e, 0x61, 0x6e, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_65[] =
+ static const JJChar tokenImage_arr_65[] =
{0x22, 0x6e, 0x65, 0x77, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_66[] =
+ static const JJChar tokenImage_arr_66[] =
{0x22, 0x6e, 0x65, 0x78, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_67[] =
+ static const JJChar tokenImage_arr_67[] =
{0x22, 0x6e, 0x6f, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_68[] =
+ static const JJChar tokenImage_arr_68[] =
{0x22, 0x6e, 0x6f, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_69[] =
+ static const JJChar tokenImage_arr_69[] =
{0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_70[] =
+ static const JJChar tokenImage_arr_70[] =
{0x22, 0x6f, 0x66, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_71[] =
+ static const JJChar tokenImage_arr_71[] =
{0x22, 0x6f, 0x6e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_72[] =
+ static const JJChar tokenImage_arr_72[] =
{0x22, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_73[] =
+ static const JJChar tokenImage_arr_73[] =
{0x22, 0x6f, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_74[] =
+ static const JJChar tokenImage_arr_74[] =
{0x22, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_75[] =
+ static const JJChar tokenImage_arr_75[] =
{0x22, 0x6f, 0x75, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_76[] =
+ static const JJChar tokenImage_arr_76[] =
{0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_77[] =
+ static const JJChar tokenImage_arr_77[] =
{0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_78[] =
+ static const JJChar tokenImage_arr_78[] =
{0x22, 0x70, 0x6f, 0x72, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_79[] =
+ static const JJChar tokenImage_arr_79[] =
{0x22, 0x70, 0x6f, 0x73, 0x74, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_80[] =
+ static const JJChar tokenImage_arr_80[] =
{0x22, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_81[] =
+ static const JJChar tokenImage_arr_81[] =
{0x22, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_82[] =
+ static const JJChar tokenImage_arr_82[] =
{0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_83[] =
+ static const JJChar tokenImage_arr_83[] =
{0x22, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_84[] =
+ static const JJChar tokenImage_arr_84[] =
{0x22, 0x70, 0x75, 0x72, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_85[] =
+ static const JJChar tokenImage_arr_85[] =
{0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_86[] =
+ static const JJChar tokenImage_arr_86[] =
{0x22, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_87[] =
+ static const JJChar tokenImage_arr_87[] =
{0x22, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_88[] =
+ static const JJChar tokenImage_arr_88[] =
{0x22, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_89[] =
+ static const JJChar tokenImage_arr_89[] =
{0x22, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_90[] =
+ static const JJChar tokenImage_arr_90[] =
{0x22, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_91[] =
+ static const JJChar tokenImage_arr_91[] =
{0x22, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_92[] =
+ static const JJChar tokenImage_arr_92[] =
{0x22, 0x72, 0x65, 0x6d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_93[] =
+ static const JJChar tokenImage_arr_93[] =
{0x22, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_94[] =
+ static const JJChar tokenImage_arr_94[] =
{0x22, 0x72, 0x6f, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_95[] =
+ static const JJChar tokenImage_arr_95[] =
{0x22, 0x72, 0x6f, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_96[] =
+ static const JJChar tokenImage_arr_96[] =
{0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_97[] =
+ static const JJChar tokenImage_arr_97[] =
{0x22, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_98[] =
+ static const JJChar tokenImage_arr_98[] =
{0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_99[] =
+ static const JJChar tokenImage_arr_99[] =
{0x22, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_100[] =
+ static const JJChar tokenImage_arr_100[] =
{0x22, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_101[] =
+ static const JJChar tokenImage_arr_101[] =
{0x22, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_102[] =
+ static const JJChar tokenImage_arr_102[] =
{0x22, 0x73, 0x6c, 0x61, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_103[] =
+ static const JJChar tokenImage_arr_103[] =
{0x22, 0x73, 0x6c, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_104[] =
+ static const JJChar tokenImage_arr_104[] =
{0x22, 0x73, 0x72, 0x61, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_105[] =
+ static const JJChar tokenImage_arr_105[] =
{0x22, 0x73, 0x72, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_106[] =
+ static const JJChar tokenImage_arr_106[] =
{0x22, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_107[] =
+ static const JJChar tokenImage_arr_107[] =
{0x22, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_108[] =
+ static const JJChar tokenImage_arr_108[] =
{0x22, 0x74, 0x68, 0x65, 0x6e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_109[] =
+ static const JJChar tokenImage_arr_109[] =
{0x22, 0x74, 0x6f, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_110[] =
+ static const JJChar tokenImage_arr_110[] =
{0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_111[] =
+ static const JJChar tokenImage_arr_111[] =
{0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_112[] =
+ static const JJChar tokenImage_arr_112[] =
{0x22, 0x75, 0x6e, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_113[] =
+ static const JJChar tokenImage_arr_113[] =
{0x22, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_114[] =
+ static const JJChar tokenImage_arr_114[] =
{0x22, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_115[] =
+ static const JJChar tokenImage_arr_115[] =
{0x22, 0x75, 0x73, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_116[] =
+ static const JJChar tokenImage_arr_116[] =
{0x22, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_117[] =
+ static const JJChar tokenImage_arr_117[] =
{0x22, 0x76, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_118[] =
+ static const JJChar tokenImage_arr_118[] =
{0x22, 0x76, 0x70, 0x72, 0x6f, 0x70, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_119[] =
+ static const JJChar tokenImage_arr_119[] =
{0x22, 0x76, 0x75, 0x6e, 0x69, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_120[] =
+ static const JJChar tokenImage_arr_120[] =
{0x22, 0x77, 0x61, 0x69, 0x74, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_121[] =
+ static const JJChar tokenImage_arr_121[] =
{0x22, 0x77, 0x68, 0x65, 0x6e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_122[] =
+ static const JJChar tokenImage_arr_122[] =
{0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_123[] =
+ static const JJChar tokenImage_arr_123[] =
{0x22, 0x77, 0x69, 0x74, 0x68, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_124[] =
+ static const JJChar tokenImage_arr_124[] =
{0x22, 0x78, 0x6f, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_125[] =
+ static const JJChar tokenImage_arr_125[] =
{0x22, 0x78, 0x6e, 0x6f, 0x72, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_126[] =
+ static const JJChar tokenImage_arr_126[] =
{0x22, 0x26, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_127[] =
+ static const JJChar tokenImage_arr_127[] =
{0x22, 0x27, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_128[] =
+ static const JJChar tokenImage_arr_128[] =
{0x22, 0x28, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_129[] =
+ static const JJChar tokenImage_arr_129[] =
{0x22, 0x29, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_130[] =
+ static const JJChar tokenImage_arr_130[] =
{0x22, 0x2a, 0x2a, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_131[] =
+ static const JJChar tokenImage_arr_131[] =
{0x22, 0x2a, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_132[] =
+ static const JJChar tokenImage_arr_132[] =
{0x22, 0x2b, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_133[] =
+ static const JJChar tokenImage_arr_133[] =
{0x22, 0x2d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_134[] =
+ static const JJChar tokenImage_arr_134[] =
{0x22, 0x2c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_135[] =
+ static const JJChar tokenImage_arr_135[] =
{0x22, 0x3a, 0x3d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_136[] =
+ static const JJChar tokenImage_arr_136[] =
{0x22, 0x3a, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_137[] =
+ static const JJChar tokenImage_arr_137[] =
{0x22, 0x3b, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_138[] =
+ static const JJChar tokenImage_arr_138[] =
{0x22, 0x3c, 0x3d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_139[] =
+ static const JJChar tokenImage_arr_139[] =
{0x22, 0x3e, 0x3d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_140[] =
+ static const JJChar tokenImage_arr_140[] =
{0x22, 0x3c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_141[] =
+ static const JJChar tokenImage_arr_141[] =
{0x22, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_142[] =
+ static const JJChar tokenImage_arr_142[] =
{0x22, 0x3d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_143[] =
+ static const JJChar tokenImage_arr_143[] =
{0x22, 0x2f, 0x3d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_144[] =
+ static const JJChar tokenImage_arr_144[] =
{0x22, 0x3d, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_145[] =
+ static const JJChar tokenImage_arr_145[] =
{0x22, 0x3c, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_146[] =
+ static const JJChar tokenImage_arr_146[] =
{0x22, 0x3c, 0x3c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_147[] =
+ static const JJChar tokenImage_arr_147[] =
{0x22, 0x3e, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_148[] =
+ static const JJChar tokenImage_arr_148[] =
{0x22, 0x3f, 0x3f, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_149[] =
+ static const JJChar tokenImage_arr_149[] =
{0x22, 0x3f, 0x3e, 0x3d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_150[] =
+ static const JJChar tokenImage_arr_150[] =
{0x22, 0x3f, 0x3c, 0x3d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_151[] =
+ static const JJChar tokenImage_arr_151[] =
{0x22, 0x3f, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_152[] =
+ static const JJChar tokenImage_arr_152[] =
{0x22, 0x3f, 0x3c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_153[] =
+ static const JJChar tokenImage_arr_153[] =
{0x22, 0x3f, 0x3d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_154[] =
+ static const JJChar tokenImage_arr_154[] =
{0x22, 0x3f, 0x2f, 0x3d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_155[] =
+ static const JJChar tokenImage_arr_155[] =
{0x22, 0x3f, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_156[] =
+ static const JJChar tokenImage_arr_156[] =
{0x22, 0x7c, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_157[] =
+ static const JJChar tokenImage_arr_157[] =
{0x22, 0x2e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_158[] =
+ static const JJChar tokenImage_arr_158[] =
{0x22, 0x2f, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_159[] =
+ static const JJChar tokenImage_arr_159[] =
{0x22, 0x40, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_160[] =
+ static const JJChar tokenImage_arr_160[] =
{0x22, 0x5e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_161[] =
+ static const JJChar tokenImage_arr_161[] =
{0x22, 0x5b, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_162[] =
+ static const JJChar tokenImage_arr_162[] =
{0x22, 0x5d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_163[] =
+ static const JJChar tokenImage_arr_163[] =
{0x22, 0x7b, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_164[] =
+ static const JJChar tokenImage_arr_164[] =
{0x22, 0x7d, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_165[] =
+ static const JJChar tokenImage_arr_165[] =
{0x22, 0x3c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_166[] =
+ static const JJChar tokenImage_arr_166[] =
{0x22, 0x3c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_167[] =
+ static const JJChar tokenImage_arr_167[] =
{0x22, 0x3c, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x46, 0x49, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_168[] =
+ static const JJChar tokenImage_arr_168[] =
{0x22, 0x3c, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_169[] =
+ static const JJChar tokenImage_arr_169[] =
{0x22, 0x3c, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_170[] =
+ static const JJChar tokenImage_arr_170[] =
{0x22, 0x3c, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, 0x4c, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_171[] =
+ static const JJChar tokenImage_arr_171[] =
{0x22, 0x3c, 0x42, 0x41, 0x53, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_172[] =
+ static const JJChar tokenImage_arr_172[] =
{0x22, 0x3c, 0x42, 0x41, 0x53, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_173[] =
+ static const JJChar tokenImage_arr_173[] =
{0x22, 0x3c, 0x45, 0x58, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_174[] =
+ static const JJChar tokenImage_arr_174[] =
{0x22, 0x3c, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x47, 0x52, 0x41, 0x50, 0x48, 0x49, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_175[] =
+ static const JJChar tokenImage_arr_175[] =
{0x22, 0x3c, 0x47, 0x52, 0x41, 0x50, 0x48, 0x49, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_176[] =
+ static const JJChar tokenImage_arr_176[] =
{0x22, 0x3c, 0x4c, 0x45, 0x54, 0x54, 0x45, 0x52, 0x5f, 0x4f, 0x52, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_177[] =
+ static const JJChar tokenImage_arr_177[] =
{0x22, 0x3c, 0x4c, 0x45, 0x54, 0x54, 0x45, 0x52, 0x5f, 0x4f, 0x52, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x5f, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x44, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_178[] =
+ static const JJChar tokenImage_arr_178[] =
{0x22, 0x3c, 0x4c, 0x45, 0x54, 0x54, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_179[] =
+ static const JJChar tokenImage_arr_179[] =
{0x22, 0x3c, 0x55, 0x50, 0x50, 0x45, 0x52, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x54, 0x54, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_180[] =
+ static const JJChar tokenImage_arr_180[] =
{0x22, 0x3c, 0x42, 0x49, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_181[] =
+ static const JJChar tokenImage_arr_181[] =
{0x22, 0x3c, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_182[] =
+ static const JJChar tokenImage_arr_182[] =
{0x22, 0x3c, 0x53, 0x54, 0x44, 0x5f, 0x4c, 0x4f, 0x47, 0x49, 0x43, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_183[] =
+ static const JJChar tokenImage_arr_183[] =
{0x22, 0x3c, 0x44, 0x49, 0x47, 0x49, 0x54, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_184[] =
+ static const JJChar tokenImage_arr_184[] =
{0x22, 0x3c, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_185[] =
+ static const JJChar tokenImage_arr_185[] =
{0x22, 0x3c, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_186[] =
+ static const JJChar tokenImage_arr_186[] =
{0x22, 0x3c, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_187[] =
+ static const JJChar tokenImage_arr_187[] =
{0x22, 0x3c, 0x4c, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x54, 0x54, 0x45, 0x52, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_188[] =
+ static const JJChar tokenImage_arr_188[] =
{0x22, 0x3c, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x3e, 0x22, 0};
- static JAVACC_CHAR_TYPE tokenImage_arr_189[] =
+ static const JJChar tokenImage_arr_189[] =
{0x22, 0x3c, 0x56, 0x48, 0x44, 0x4c, 0x32, 0x30, 0x30, 0x38, 0x54, 0x4f, 0x4f, 0x4c, 0x44, 0x49, 0x52, 0x3e, 0x22, 0};
- static JAVACC_STRING_TYPE tokenImage[] = {
+ static const JJChar tokenImage_arr_190[] =
+{0x22, 0x3c, 0x53, 0x50, 0x45, 0x43, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x3e, 0x22, 0};
+ static const JJChar* const tokenImage[] = {
tokenImage_arr_0,
tokenImage_arr_1,
tokenImage_arr_2,
@@ -958,6 +962,7 @@ tokenImage_arr_186,
tokenImage_arr_187,
tokenImage_arr_188,
tokenImage_arr_189,
+tokenImage_arr_190,
};
}
diff --git a/vhdlparser/VhdlParserErrorHandler.hpp b/vhdlparser/VhdlParserErrorHandler.hpp
index 0337f1f..efdf20e 100644
--- a/vhdlparser/VhdlParserErrorHandler.hpp
+++ b/vhdlparser/VhdlParserErrorHandler.hpp
@@ -18,21 +18,21 @@ class VhdlErrorHandler: public ErrorHandler
public:
VhdlErrorHandler(const char *fileName) : m_fileName(fileName) {}
- virtual void handleUnexpectedToken(int expectedKind, JAVACC_STRING_TYPE expectedToken, Token *actual, VhdlParser *parser)
+ virtual void handleUnexpectedToken(int expectedKind, const JJString& expectedToken, Token *actual, VhdlParser *parser)
{
warn(m_fileName,actual->beginLine,"syntax error '%s'",actual->image.data());
error_count++;
throw std::exception();
}
- virtual void handleParseError(Token *last, Token *unexpected, JAVACC_SIMPLE_STRING production, VhdlParser *parser)
+ virtual void handleParseError(Token *last, Token *unexpected, const JJSimpleString& production, VhdlParser *parser)
{
warn(m_fileName,last->beginLine,"unexpected token: '%s'", unexpected->image.data());
error_count++;
throw std::exception();
}
- virtual void handleOtherError(JAVACC_STRING_TYPE message, VhdlParser *parser)
+ virtual void handleOtherError(const JJString& message, VhdlParser *parser)
{
warn(m_fileName, -1, "unexpected error: '%s'", (char*)message.c_str());
error_count++;
@@ -48,12 +48,12 @@ class VhdlTokenManagerErrorHandler: public TokenManagerErrorHandler
public:
VhdlTokenManagerErrorHandler(const char *fileName) : m_fileName(fileName) {}
- virtual void lexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, VhdlParserTokenManager* token_manager)
+ virtual void lexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, const JJString& errorAfter, JJChar curChar, VhdlParserTokenManager* token_manager)
{
warn(m_fileName,errorLine,"Lexical error, Encountered: '%c' after: '%s'",curChar, (EOFSeen? "EOF" : (const char*)errorAfter.c_str()));
}
- virtual void lexicalError(JAVACC_STRING_TYPE errorMessage, VhdlParserTokenManager* token_manager)
+ virtual void lexicalError(const JJString& errorMessage, VhdlParserTokenManager* token_manager)
{
warn(m_fileName,-1,"Unknown error: '%s'", (char*)errorMessage.c_str());
}
diff --git a/vhdlparser/VhdlParserTokenManager.cc b/vhdlparser/VhdlParserTokenManager.cc
index 2970785..341469f 100644
--- a/vhdlparser/VhdlParserTokenManager.cc
+++ b/vhdlparser/VhdlParserTokenManager.cc
@@ -13,232 +13,234 @@ static const unsigned long long jjbitVec3[] = {
0x0ULL, 0x0ULL, 0xffffffff00000000ULL, 0xffffffffffffffffULL
};
static const int jjnextStates[] = {
- 58, 59, 60, 61, 62, 65, 69, 70, 71, 80, 21, 50, 51, 2, 37, 38,
- 0, 3, 4, 5, 7, 12, 13, 15, 16, 24, 23, 25, 33, 34, 36, 39,
- 40, 42, 46, 47, 49, 53, 54, 56, 60, 61, 62, 65, 64, 63, 65, 69,
- 70, 71, 72, 73, 75, 9, 10, 28, 29, 27, 30,
+ 56, 57, 58, 59, 60, 63, 67, 68, 69, 78, 18, 19, 79, 81, 83, 48,
+ 49, 2, 35, 36, 0, 3, 4, 5, 7, 12, 13, 15, 16, 22, 21, 23,
+ 31, 32, 34, 37, 38, 40, 44, 45, 47, 51, 52, 54, 58, 59, 60, 63,
+ 62, 61, 63, 67, 68, 69, 70, 71, 73, 78, 18, 19, 78, 18, 19, 79,
+ 9, 10, 26, 27, 25, 28,
};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_0[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_1[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_2[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_3[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_4[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_5[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_6[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_7[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_8[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_9[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_10[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_11[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_12[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_13[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_14[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_15[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_16[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_17[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_18[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_19[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_20[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_21[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_22[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_23[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_24[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_25[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_26[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_27[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_28[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_29[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_30[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_31[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_32[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_33[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_34[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_35[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_36[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_37[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_38[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_39[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_40[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_41[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_42[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_43[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_44[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_45[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_46[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_47[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_48[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_49[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_50[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_51[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_52[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_53[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_54[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_55[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_56[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_57[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_58[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_59[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_60[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_61[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_62[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_63[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_64[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_65[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_66[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_67[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_68[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_69[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_70[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_71[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_72[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_73[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_74[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_75[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_76[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_77[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_78[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_79[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_80[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_81[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_82[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_83[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_84[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_85[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_86[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_87[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_88[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_89[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_90[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_91[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_92[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_93[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_94[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_95[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_96[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_97[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_98[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_99[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_100[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_101[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_102[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_103[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_104[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_105[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_106[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_107[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_108[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_109[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_110[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_111[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_112[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_113[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_114[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_115[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_116[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_117[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_118[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_119[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_120[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_121[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_122[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_123[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_124[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_125[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_126[] = {0x26, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_127[] = {0x27, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_128[] = {0x28, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_129[] = {0x29, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_130[] = {0x2a, 0x2a, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_131[] = {0x2a, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_132[] = {0x2b, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_133[] = {0x2d, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_134[] = {0x2c, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_135[] = {0x3a, 0x3d, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_136[] = {0x3a, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_137[] = {0x3b, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_138[] = {0x3c, 0x3d, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_139[] = {0x3e, 0x3d, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_140[] = {0x3c, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_141[] = {0x3e, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_142[] = {0x3d, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_143[] = {0x2f, 0x3d, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_144[] = {0x3d, 0x3e, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_145[] = {0x3c, 0x3e, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_146[] = {0x3c, 0x3c, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_147[] = {0x3e, 0x3e, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_148[] = {0x3f, 0x3f, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_149[] = {0x3f, 0x3e, 0x3d, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_150[] = {0x3f, 0x3c, 0x3d, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_151[] = {0x3f, 0x3e, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_152[] = {0x3f, 0x3c, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_153[] = {0x3f, 0x3d, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_154[] = {0x3f, 0x2f, 0x3d, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_155[] = {0x3f, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_156[] = {0x7c, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_157[] = {0x2e, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_158[] = {0x2f, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_159[] = {0x40, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_160[] = {0x5e, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_161[] = {0x5b, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_162[] = {0x5d, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_163[] = {0x7b, 0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_164[] = {0x7d, 0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_165[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_166[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_167[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_168[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_169[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_170[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_171[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_172[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_173[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_174[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_175[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_176[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_177[] = {0};
-
-static JAVACC_CHAR_TYPE jjstrLiteralChars_178[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_179[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_180[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_181[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_182[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_183[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_184[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_185[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_186[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_187[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_188[] = {0};
-static JAVACC_CHAR_TYPE jjstrLiteralChars_189[] = {0};
-static const JAVACC_STRING_TYPE jjstrLiteralImages[] = {
+static JJChar jjstrLiteralChars_0[] = {0};
+static JJChar jjstrLiteralChars_1[] = {0};
+static JJChar jjstrLiteralChars_2[] = {0};
+static JJChar jjstrLiteralChars_3[] = {0};
+static JJChar jjstrLiteralChars_4[] = {0};
+static JJChar jjstrLiteralChars_5[] = {0};
+static JJChar jjstrLiteralChars_6[] = {0};
+
+static JJChar jjstrLiteralChars_7[] = {0};
+static JJChar jjstrLiteralChars_8[] = {0};
+static JJChar jjstrLiteralChars_9[] = {0};
+static JJChar jjstrLiteralChars_10[] = {0};
+static JJChar jjstrLiteralChars_11[] = {0};
+static JJChar jjstrLiteralChars_12[] = {0};
+static JJChar jjstrLiteralChars_13[] = {0};
+static JJChar jjstrLiteralChars_14[] = {0};
+static JJChar jjstrLiteralChars_15[] = {0};
+static JJChar jjstrLiteralChars_16[] = {0};
+static JJChar jjstrLiteralChars_17[] = {0};
+static JJChar jjstrLiteralChars_18[] = {0};
+static JJChar jjstrLiteralChars_19[] = {0};
+static JJChar jjstrLiteralChars_20[] = {0};
+
+static JJChar jjstrLiteralChars_21[] = {0};
+static JJChar jjstrLiteralChars_22[] = {0};
+static JJChar jjstrLiteralChars_23[] = {0};
+static JJChar jjstrLiteralChars_24[] = {0};
+static JJChar jjstrLiteralChars_25[] = {0};
+static JJChar jjstrLiteralChars_26[] = {0};
+static JJChar jjstrLiteralChars_27[] = {0};
+static JJChar jjstrLiteralChars_28[] = {0};
+static JJChar jjstrLiteralChars_29[] = {0};
+static JJChar jjstrLiteralChars_30[] = {0};
+static JJChar jjstrLiteralChars_31[] = {0};
+static JJChar jjstrLiteralChars_32[] = {0};
+static JJChar jjstrLiteralChars_33[] = {0};
+static JJChar jjstrLiteralChars_34[] = {0};
+
+static JJChar jjstrLiteralChars_35[] = {0};
+static JJChar jjstrLiteralChars_36[] = {0};
+static JJChar jjstrLiteralChars_37[] = {0};
+static JJChar jjstrLiteralChars_38[] = {0};
+static JJChar jjstrLiteralChars_39[] = {0};
+static JJChar jjstrLiteralChars_40[] = {0};
+static JJChar jjstrLiteralChars_41[] = {0};
+static JJChar jjstrLiteralChars_42[] = {0};
+static JJChar jjstrLiteralChars_43[] = {0};
+static JJChar jjstrLiteralChars_44[] = {0};
+static JJChar jjstrLiteralChars_45[] = {0};
+static JJChar jjstrLiteralChars_46[] = {0};
+static JJChar jjstrLiteralChars_47[] = {0};
+static JJChar jjstrLiteralChars_48[] = {0};
+
+static JJChar jjstrLiteralChars_49[] = {0};
+static JJChar jjstrLiteralChars_50[] = {0};
+static JJChar jjstrLiteralChars_51[] = {0};
+static JJChar jjstrLiteralChars_52[] = {0};
+static JJChar jjstrLiteralChars_53[] = {0};
+static JJChar jjstrLiteralChars_54[] = {0};
+static JJChar jjstrLiteralChars_55[] = {0};
+static JJChar jjstrLiteralChars_56[] = {0};
+static JJChar jjstrLiteralChars_57[] = {0};
+static JJChar jjstrLiteralChars_58[] = {0};
+static JJChar jjstrLiteralChars_59[] = {0};
+static JJChar jjstrLiteralChars_60[] = {0};
+static JJChar jjstrLiteralChars_61[] = {0};
+static JJChar jjstrLiteralChars_62[] = {0};
+
+static JJChar jjstrLiteralChars_63[] = {0};
+static JJChar jjstrLiteralChars_64[] = {0};
+static JJChar jjstrLiteralChars_65[] = {0};
+static JJChar jjstrLiteralChars_66[] = {0};
+static JJChar jjstrLiteralChars_67[] = {0};
+static JJChar jjstrLiteralChars_68[] = {0};
+static JJChar jjstrLiteralChars_69[] = {0};
+static JJChar jjstrLiteralChars_70[] = {0};
+static JJChar jjstrLiteralChars_71[] = {0};
+static JJChar jjstrLiteralChars_72[] = {0};
+static JJChar jjstrLiteralChars_73[] = {0};
+static JJChar jjstrLiteralChars_74[] = {0};
+static JJChar jjstrLiteralChars_75[] = {0};
+static JJChar jjstrLiteralChars_76[] = {0};
+
+static JJChar jjstrLiteralChars_77[] = {0};
+static JJChar jjstrLiteralChars_78[] = {0};
+static JJChar jjstrLiteralChars_79[] = {0};
+static JJChar jjstrLiteralChars_80[] = {0};
+static JJChar jjstrLiteralChars_81[] = {0};
+static JJChar jjstrLiteralChars_82[] = {0};
+static JJChar jjstrLiteralChars_83[] = {0};
+static JJChar jjstrLiteralChars_84[] = {0};
+static JJChar jjstrLiteralChars_85[] = {0};
+static JJChar jjstrLiteralChars_86[] = {0};
+static JJChar jjstrLiteralChars_87[] = {0};
+static JJChar jjstrLiteralChars_88[] = {0};
+static JJChar jjstrLiteralChars_89[] = {0};
+static JJChar jjstrLiteralChars_90[] = {0};
+
+static JJChar jjstrLiteralChars_91[] = {0};
+static JJChar jjstrLiteralChars_92[] = {0};
+static JJChar jjstrLiteralChars_93[] = {0};
+static JJChar jjstrLiteralChars_94[] = {0};
+static JJChar jjstrLiteralChars_95[] = {0};
+static JJChar jjstrLiteralChars_96[] = {0};
+static JJChar jjstrLiteralChars_97[] = {0};
+static JJChar jjstrLiteralChars_98[] = {0};
+static JJChar jjstrLiteralChars_99[] = {0};
+static JJChar jjstrLiteralChars_100[] = {0};
+static JJChar jjstrLiteralChars_101[] = {0};
+static JJChar jjstrLiteralChars_102[] = {0};
+static JJChar jjstrLiteralChars_103[] = {0};
+static JJChar jjstrLiteralChars_104[] = {0};
+
+static JJChar jjstrLiteralChars_105[] = {0};
+static JJChar jjstrLiteralChars_106[] = {0};
+static JJChar jjstrLiteralChars_107[] = {0};
+static JJChar jjstrLiteralChars_108[] = {0};
+static JJChar jjstrLiteralChars_109[] = {0};
+static JJChar jjstrLiteralChars_110[] = {0};
+static JJChar jjstrLiteralChars_111[] = {0};
+static JJChar jjstrLiteralChars_112[] = {0};
+static JJChar jjstrLiteralChars_113[] = {0};
+static JJChar jjstrLiteralChars_114[] = {0};
+static JJChar jjstrLiteralChars_115[] = {0};
+static JJChar jjstrLiteralChars_116[] = {0};
+static JJChar jjstrLiteralChars_117[] = {0};
+static JJChar jjstrLiteralChars_118[] = {0};
+
+static JJChar jjstrLiteralChars_119[] = {0};
+static JJChar jjstrLiteralChars_120[] = {0};
+static JJChar jjstrLiteralChars_121[] = {0};
+static JJChar jjstrLiteralChars_122[] = {0};
+static JJChar jjstrLiteralChars_123[] = {0};
+static JJChar jjstrLiteralChars_124[] = {0};
+static JJChar jjstrLiteralChars_125[] = {0};
+
+static JJChar jjstrLiteralChars_126[] = {0x26, 0};
+static JJChar jjstrLiteralChars_127[] = {0x27, 0};
+
+static JJChar jjstrLiteralChars_128[] = {0x28, 0};
+static JJChar jjstrLiteralChars_129[] = {0x29, 0};
+
+static JJChar jjstrLiteralChars_130[] = {0x2a, 0x2a, 0};
+static JJChar jjstrLiteralChars_131[] = {0x2a, 0};
+
+static JJChar jjstrLiteralChars_132[] = {0x2b, 0};
+static JJChar jjstrLiteralChars_133[] = {0x2d, 0};
+
+static JJChar jjstrLiteralChars_134[] = {0x2c, 0};
+static JJChar jjstrLiteralChars_135[] = {0x3a, 0x3d, 0};
+
+static JJChar jjstrLiteralChars_136[] = {0x3a, 0};
+static JJChar jjstrLiteralChars_137[] = {0x3b, 0};
+
+static JJChar jjstrLiteralChars_138[] = {0x3c, 0x3d, 0};
+static JJChar jjstrLiteralChars_139[] = {0x3e, 0x3d, 0};
+
+static JJChar jjstrLiteralChars_140[] = {0x3c, 0};
+static JJChar jjstrLiteralChars_141[] = {0x3e, 0};
+
+static JJChar jjstrLiteralChars_142[] = {0x3d, 0};
+static JJChar jjstrLiteralChars_143[] = {0x2f, 0x3d, 0};
+
+static JJChar jjstrLiteralChars_144[] = {0x3d, 0x3e, 0};
+static JJChar jjstrLiteralChars_145[] = {0x3c, 0x3e, 0};
+
+static JJChar jjstrLiteralChars_146[] = {0x3c, 0x3c, 0};
+static JJChar jjstrLiteralChars_147[] = {0x3e, 0x3e, 0};
+
+static JJChar jjstrLiteralChars_148[] = {0x3f, 0x3f, 0};
+static JJChar jjstrLiteralChars_149[] = {0x3f, 0x3e, 0x3d, 0};
+
+static JJChar jjstrLiteralChars_150[] = {0x3f, 0x3c, 0x3d, 0};
+static JJChar jjstrLiteralChars_151[] = {0x3f, 0x3e, 0};
+
+static JJChar jjstrLiteralChars_152[] = {0x3f, 0x3c, 0};
+static JJChar jjstrLiteralChars_153[] = {0x3f, 0x3d, 0};
+
+static JJChar jjstrLiteralChars_154[] = {0x3f, 0x2f, 0x3d, 0};
+static JJChar jjstrLiteralChars_155[] = {0x3f, 0};
+
+static JJChar jjstrLiteralChars_156[] = {0x7c, 0};
+static JJChar jjstrLiteralChars_157[] = {0x2e, 0};
+
+static JJChar jjstrLiteralChars_158[] = {0x2f, 0};
+static JJChar jjstrLiteralChars_159[] = {0x40, 0};
+
+static JJChar jjstrLiteralChars_160[] = {0x5e, 0};
+static JJChar jjstrLiteralChars_161[] = {0x5b, 0};
+
+static JJChar jjstrLiteralChars_162[] = {0x5d, 0};
+static JJChar jjstrLiteralChars_163[] = {0x7b, 0};
+
+static JJChar jjstrLiteralChars_164[] = {0x7d, 0};
+static JJChar jjstrLiteralChars_165[] = {0};
+static JJChar jjstrLiteralChars_166[] = {0};
+static JJChar jjstrLiteralChars_167[] = {0};
+static JJChar jjstrLiteralChars_168[] = {0};
+static JJChar jjstrLiteralChars_169[] = {0};
+static JJChar jjstrLiteralChars_170[] = {0};
+static JJChar jjstrLiteralChars_171[] = {0};
+static JJChar jjstrLiteralChars_172[] = {0};
+static JJChar jjstrLiteralChars_173[] = {0};
+static JJChar jjstrLiteralChars_174[] = {0};
+static JJChar jjstrLiteralChars_175[] = {0};
+static JJChar jjstrLiteralChars_176[] = {0};
+static JJChar jjstrLiteralChars_177[] = {0};
+
+static JJChar jjstrLiteralChars_178[] = {0};
+static JJChar jjstrLiteralChars_179[] = {0};
+static JJChar jjstrLiteralChars_180[] = {0};
+static JJChar jjstrLiteralChars_181[] = {0};
+static JJChar jjstrLiteralChars_182[] = {0};
+static JJChar jjstrLiteralChars_183[] = {0};
+static JJChar jjstrLiteralChars_184[] = {0};
+static JJChar jjstrLiteralChars_185[] = {0};
+static JJChar jjstrLiteralChars_186[] = {0};
+static JJChar jjstrLiteralChars_187[] = {0};
+static JJChar jjstrLiteralChars_188[] = {0};
+static JJChar jjstrLiteralChars_189[] = {0};
+static JJChar jjstrLiteralChars_190[] = {0};
+static const JJString jjstrLiteralImages[] = {
jjstrLiteralChars_0,
jjstrLiteralChars_1,
jjstrLiteralChars_2,
@@ -429,22 +431,23 @@ jjstrLiteralChars_186,
jjstrLiteralChars_187,
jjstrLiteralChars_188,
jjstrLiteralChars_189,
+jjstrLiteralChars_190,
};
/** Lexer state names. */
-static const JAVACC_CHAR_TYPE lexStateNames_arr_0[] =
+static const JJChar lexStateNames_arr_0[] =
{0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0};
-static const JAVACC_STRING_TYPE lexStateNames[] = {
+static const JJString lexStateNames[] = {
lexStateNames_arr_0,
};
static const unsigned long long jjtoToken[] = {
- 0xfffffffffffff801ULL, 0xffffffffffffffffULL, 0x20101fffffffffffULL,
+ 0xfffffffffffff801ULL, 0xffffffffffffffffULL, 0x60101fffffffffffULL,
};
static const unsigned long long jjtoSkip[] = {
0x7deULL, 0x0ULL, 0x0ULL,
};
-void VhdlParserTokenManager::setDebugStream(FILE *ds){ debugStream = ds; }
+ void VhdlParserTokenManager::setDebugStream(FILE *ds){ debugStream = ds; }
int VhdlParserTokenManager::jjStopAtPos(int pos, int kind){
jjmatchedKind = kind;
@@ -2687,7 +2690,7 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
curChar = input_stream->readChar();
curPos = 0;
int startsAt = 0;
- jjnewStateCnt = 81;
+ jjnewStateCnt = 87;
int i = 1;
jjstateSet[0] = startState;
int kind = 0x7fffffff;
@@ -2708,23 +2711,23 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
{
if (kind > 165)
kind = 165;
- { jjCheckNAddStates(0, 10); }
+ { jjCheckNAddStates(0, 12); }
}
else if ((0x100000200ULL & l) != 0L)
{ jjCheckNAddTwoStates(0, 3); }
+ else if (curChar == 39)
+ { jjAddStates(13, 14); }
else if (curChar == 47)
- { jjAddStates(11, 12); }
+ { jjAddStates(15, 16); }
else if (curChar == 45)
- { jjCheckNAddStates(13, 15); }
- else if (curChar == 39)
- jjstateSet[jjnewStateCnt++] = 18;
+ { jjCheckNAddStates(17, 19); }
else if (curChar == 34)
{ jjCheckNAddTwoStates(9, 10); }
if ((0x3ff000000000000ULL & l) != 0L)
{
if (kind > 171)
kind = 171;
- { jjCheckNAdd(20); }
+ { jjCheckNAdd(17); }
}
break;
case 0:
@@ -2736,7 +2739,7 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
break;
if (kind > 6)
kind = 6;
- { jjCheckNAddStates(16, 20); }
+ { jjCheckNAddStates(20, 24); }
break;
case 2:
if (curChar == 45)
@@ -2751,7 +2754,7 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
break;
if (kind > 6)
kind = 6;
- { jjCheckNAddStates(16, 20); }
+ { jjCheckNAddStates(20, 24); }
break;
case 5:
if ((0x2400ULL & l) == 0L)
@@ -2791,265 +2794,285 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
break;
if (kind > 167)
kind = 167;
- { jjAddStates(21, 22); }
+ { jjAddStates(25, 26); }
break;
case 15:
if ((0xfffffffb00000200ULL & l) != 0L)
- { jjAddStates(23, 24); }
+ { jjAddStates(27, 28); }
break;
case 17:
- if (curChar == 39)
- jjstateSet[jjnewStateCnt++] = 18;
- break;
- case 18:
- if ((0xffffffff00000200ULL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 19;
- break;
- case 19:
- if (curChar == 39 && kind > 169)
- kind = 169;
- break;
- case 20:
if ((0x3ff000000000000ULL & l) == 0L)
break;
if (kind > 171)
kind = 171;
- { jjCheckNAdd(20); }
+ { jjCheckNAdd(17); }
break;
- case 22:
+ case 20:
if (curChar == 34)
- { jjCheckNAdd(23); }
+ { jjCheckNAdd(21); }
break;
- case 23:
+ case 21:
if ((0x3ff200000000000ULL & l) != 0L)
- { jjCheckNAddStates(25, 27); }
+ { jjCheckNAddStates(29, 31); }
break;
- case 25:
+ case 23:
if (curChar == 34 && kind > 180)
kind = 180;
break;
- case 27:
+ case 25:
if (curChar == 34)
- { jjCheckNAddTwoStates(28, 29); }
+ { jjCheckNAddTwoStates(26, 27); }
break;
- case 28:
+ case 26:
if ((0xfffffffb00000200ULL & l) != 0L)
- { jjCheckNAddTwoStates(28, 29); }
+ { jjCheckNAddTwoStates(26, 27); }
break;
- case 29:
+ case 27:
if (curChar != 34)
break;
if (kind > 189)
kind = 189;
- { jjCheckNAddTwoStates(27, 30); }
+ { jjCheckNAddTwoStates(25, 28); }
break;
- case 30:
+ case 28:
if ((0xfffffffb00000200ULL & l) == 0L)
break;
if (kind > 189)
kind = 189;
- { jjCheckNAddTwoStates(27, 30); }
+ { jjCheckNAddTwoStates(25, 28); }
break;
- case 31:
+ case 29:
if (curChar == 45)
- { jjCheckNAddStates(13, 15); }
+ { jjCheckNAddStates(17, 19); }
break;
- case 32:
+ case 30:
if (curChar != 35)
break;
if (kind > 7)
kind = 7;
- { jjCheckNAddStates(28, 30); }
+ { jjCheckNAddStates(32, 34); }
break;
- case 33:
+ case 31:
if ((0xffffffffffffdbffULL & l) == 0L)
break;
if (kind > 7)
kind = 7;
- { jjCheckNAddStates(28, 30); }
+ { jjCheckNAddStates(32, 34); }
break;
- case 34:
+ case 32:
if ((0x2400ULL & l) != 0L && kind > 7)
kind = 7;
break;
- case 35:
+ case 33:
if (curChar == 10 && kind > 7)
kind = 7;
break;
- case 36:
+ case 34:
if (curChar == 13)
- jjstateSet[jjnewStateCnt++] = 35;
+ jjstateSet[jjnewStateCnt++] = 33;
break;
- case 37:
+ case 35:
if (curChar == 45)
- jjstateSet[jjnewStateCnt++] = 32;
+ jjstateSet[jjnewStateCnt++] = 30;
break;
- case 38:
+ case 36:
if (curChar != 45)
break;
if (kind > 8)
kind = 8;
- { jjCheckNAddStates(31, 33); }
+ { jjCheckNAddStates(35, 37); }
break;
- case 39:
+ case 37:
if ((0xffffffffffffdbffULL & l) == 0L)
break;
if (kind > 8)
kind = 8;
- { jjCheckNAddStates(31, 33); }
+ { jjCheckNAddStates(35, 37); }
break;
- case 40:
+ case 38:
if ((0x2400ULL & l) != 0L && kind > 8)
kind = 8;
break;
- case 41:
+ case 39:
if (curChar == 10 && kind > 8)
kind = 8;
break;
- case 42:
+ case 40:
if (curChar == 13)
- jjstateSet[jjnewStateCnt++] = 41;
+ jjstateSet[jjnewStateCnt++] = 39;
break;
- case 43:
+ case 41:
if (curChar == 47)
- { jjAddStates(11, 12); }
+ { jjAddStates(15, 16); }
break;
- case 44:
+ case 42:
if (curChar == 33)
- { jjCheckNAddTwoStates(45, 46); }
+ { jjCheckNAddTwoStates(43, 44); }
break;
- case 45:
+ case 43:
if ((0xfffffbffffffffffULL & l) != 0L)
- { jjCheckNAddTwoStates(45, 46); }
+ { jjCheckNAddTwoStates(43, 44); }
break;
- case 46:
+ case 44:
if (curChar == 42)
- { jjCheckNAddStates(34, 36); }
+ { jjCheckNAddStates(38, 40); }
break;
- case 47:
+ case 45:
if ((0xffff7bffffffffffULL & l) != 0L)
- { jjCheckNAddTwoStates(48, 46); }
+ { jjCheckNAddTwoStates(46, 44); }
break;
- case 48:
+ case 46:
if ((0xfffffbffffffffffULL & l) != 0L)
- { jjCheckNAddTwoStates(48, 46); }
+ { jjCheckNAddTwoStates(46, 44); }
break;
- case 49:
+ case 47:
if (curChar == 47 && kind > 9)
kind = 9;
break;
- case 50:
+ case 48:
if (curChar == 42)
- jjstateSet[jjnewStateCnt++] = 44;
+ jjstateSet[jjnewStateCnt++] = 42;
break;
- case 51:
+ case 49:
if (curChar == 42)
- { jjCheckNAddTwoStates(52, 53); }
+ { jjCheckNAddTwoStates(50, 51); }
break;
- case 52:
+ case 50:
if ((0xfffffbffffffffffULL & l) != 0L)
- { jjCheckNAddTwoStates(52, 53); }
+ { jjCheckNAddTwoStates(50, 51); }
break;
- case 53:
+ case 51:
if (curChar == 42)
- { jjCheckNAddStates(37, 39); }
+ { jjCheckNAddStates(41, 43); }
break;
- case 54:
+ case 52:
if ((0xffff7bffffffffffULL & l) != 0L)
- { jjCheckNAddTwoStates(55, 53); }
+ { jjCheckNAddTwoStates(53, 51); }
break;
- case 55:
+ case 53:
if ((0xfffffbffffffffffULL & l) != 0L)
- { jjCheckNAddTwoStates(55, 53); }
+ { jjCheckNAddTwoStates(53, 51); }
break;
- case 56:
+ case 54:
if (curChar == 47 && kind > 10)
kind = 10;
break;
- case 57:
+ case 55:
if ((0x3ff000000000000ULL & l) == 0L)
break;
if (kind > 165)
kind = 165;
- { jjCheckNAddStates(0, 10); }
+ { jjCheckNAddStates(0, 12); }
break;
- case 59:
+ case 57:
if ((0x3ff000000000000ULL & l) == 0L)
break;
if (kind > 165)
kind = 165;
- { jjCheckNAddTwoStates(58, 59); }
+ { jjCheckNAddTwoStates(56, 57); }
break;
- case 61:
+ case 59:
if ((0x3ff000000000000ULL & l) == 0L)
break;
if (kind > 170)
kind = 170;
- { jjCheckNAddStates(40, 43); }
+ { jjCheckNAddStates(44, 47); }
break;
- case 62:
+ case 60:
if (curChar == 46)
- { jjCheckNAdd(63); }
+ { jjCheckNAdd(61); }
break;
- case 63:
+ case 61:
if ((0x3ff000000000000ULL & l) == 0L)
break;
if (kind > 170)
kind = 170;
- { jjCheckNAddStates(44, 46); }
+ { jjCheckNAddStates(48, 50); }
break;
- case 66:
+ case 64:
if ((0x280000000000ULL & l) != 0L)
- { jjCheckNAdd(67); }
+ { jjCheckNAdd(65); }
break;
- case 67:
+ case 65:
if ((0x3ff000000000000ULL & l) == 0L)
break;
if (kind > 170)
kind = 170;
- { jjCheckNAddTwoStates(68, 67); }
+ { jjCheckNAddTwoStates(66, 65); }
break;
- case 70:
+ case 68:
if ((0x3ff000000000000ULL & l) != 0L)
- { jjCheckNAddStates(47, 49); }
+ { jjCheckNAddStates(51, 53); }
break;
- case 71:
+ case 69:
if (curChar == 35)
- { jjCheckNAdd(72); }
+ { jjCheckNAdd(70); }
break;
- case 72:
+ case 70:
if ((0x3ff000000000000ULL & l) != 0L)
- { jjCheckNAddStates(50, 52); }
+ { jjCheckNAddStates(54, 56); }
break;
- case 73:
+ case 71:
if (curChar == 46)
- { jjCheckNAdd(74); }
+ { jjCheckNAdd(72); }
break;
- case 74:
+ case 72:
if ((0x3ff000000000000ULL & l) != 0L)
- { jjCheckNAddTwoStates(74, 75); }
+ { jjCheckNAddTwoStates(72, 73); }
break;
- case 75:
+ case 73:
if (curChar != 35)
break;
if (kind > 172)
kind = 172;
- jjstateSet[jjnewStateCnt++] = 76;
+ jjstateSet[jjnewStateCnt++] = 74;
break;
- case 77:
+ case 75:
if ((0x280000000000ULL & l) != 0L)
- { jjCheckNAdd(78); }
+ { jjCheckNAdd(76); }
break;
- case 78:
+ case 76:
if ((0x3ff000000000000ULL & l) == 0L)
break;
if (kind > 172)
kind = 172;
- { jjCheckNAddTwoStates(79, 78); }
+ { jjCheckNAddTwoStates(77, 76); }
break;
- case 80:
+ case 78:
+ if ((0x3ff000000000000ULL & l) != 0L)
+ { jjCheckNAddStates(57, 59); }
+ break;
+ case 79:
if ((0x3ff000000000000ULL & l) != 0L)
- { jjCheckNAddTwoStates(80, 21); }
+ { jjCheckNAddStates(60, 63); }
+ break;
+ case 80:
+ if (curChar == 39)
+ { jjAddStates(13, 14); }
+ break;
+ case 81:
+ if ((0xffffffff00000200ULL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 82;
+ break;
+ case 82:
+ if (curChar == 39 && kind > 169)
+ kind = 169;
+ break;
+ case 83:
+ if (curChar == 40)
+ jjstateSet[jjnewStateCnt++] = 84;
+ break;
+ case 84:
+ if (curChar == 39)
+ jjstateSet[jjnewStateCnt++] = 85;
+ break;
+ case 85:
+ if ((0xfffffffb00000200ULL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 86;
+ break;
+ case 86:
+ if (curChar == 39 && kind > 190)
+ kind = 190;
break;
default : break;
}
@@ -3068,10 +3091,10 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
{
if (kind > 171)
kind = 171;
- { jjCheckNAdd(20); }
+ { jjCheckNAdd(17); }
}
else if (curChar == 96)
- { jjCheckNAddTwoStates(27, 30); }
+ { jjCheckNAddTwoStates(25, 28); }
else if (curChar == 92)
{ jjCheckNAddTwoStates(15, 16); }
if ((0x7fffffe07fffffeULL & l) != 0L)
@@ -3081,16 +3104,18 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
{ jjCheckNAddTwoStates(12, 13); }
}
if ((0x100801401008014ULL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 22;
+ jjstateSet[jjnewStateCnt++] = 20;
+ else if ((0x280000ULL & l) != 0L)
+ { jjCheckNAddTwoStates(18, 19); }
break;
case 4:
if (kind > 6)
kind = 6;
- { jjAddStates(16, 20); }
+ { jjAddStates(20, 24); }
break;
case 9:
if ((0x7fffffffffffffffULL & l) != 0L)
- { jjAddStates(53, 54); }
+ { jjAddStates(64, 65); }
break;
case 12:
if (curChar == 95)
@@ -3115,107 +3140,115 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
if (curChar == 92 && kind > 168)
kind = 168;
break;
- case 18:
- if ((0x7fffffffffffffffULL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 19;
- break;
- case 20:
+ case 17:
if ((0x7fffffe07fffffeULL & l) == 0L)
break;
if (kind > 171)
kind = 171;
- { jjCheckNAdd(20); }
+ { jjCheckNAdd(17); }
break;
- case 21:
+ case 18:
+ if ((0x280000ULL & l) != 0L)
+ { jjCheckNAddTwoStates(18, 19); }
+ break;
+ case 19:
if ((0x100801401008014ULL & l) != 0L)
- jjstateSet[jjnewStateCnt++] = 22;
+ jjstateSet[jjnewStateCnt++] = 20;
break;
- case 23:
+ case 21:
if ((0x7fffffe07fffffeULL & l) != 0L)
- { jjCheckNAddStates(25, 27); }
+ { jjCheckNAddStates(29, 31); }
break;
- case 24:
+ case 22:
if (curChar == 95)
- { jjCheckNAddTwoStates(24, 23); }
+ { jjCheckNAddTwoStates(22, 21); }
break;
- case 26:
+ case 24:
if (curChar == 96)
- { jjCheckNAddTwoStates(27, 30); }
+ { jjCheckNAddTwoStates(25, 28); }
break;
- case 28:
+ case 26:
if ((0x7fffffffffffffffULL & l) != 0L)
- { jjAddStates(55, 56); }
+ { jjAddStates(66, 67); }
break;
- case 30:
+ case 28:
if ((0x7fffffffffffffffULL & l) == 0L)
break;
if (kind > 189)
kind = 189;
- { jjCheckNAddTwoStates(27, 30); }
+ { jjCheckNAddTwoStates(25, 28); }
break;
- case 33:
+ case 31:
if (kind > 7)
kind = 7;
- { jjAddStates(28, 30); }
+ { jjAddStates(32, 34); }
break;
- case 39:
+ case 37:
if (kind > 8)
kind = 8;
- { jjAddStates(31, 33); }
+ { jjAddStates(35, 37); }
+ break;
+ case 43:
+ { jjCheckNAddTwoStates(43, 44); }
break;
case 45:
- { jjCheckNAddTwoStates(45, 46); }
+ case 46:
+ { jjCheckNAddTwoStates(46, 44); }
break;
- case 47:
- case 48:
- { jjCheckNAddTwoStates(48, 46); }
+ case 50:
+ { jjCheckNAddTwoStates(50, 51); }
break;
case 52:
- { jjCheckNAddTwoStates(52, 53); }
+ case 53:
+ { jjCheckNAddTwoStates(53, 51); }
break;
- case 54:
- case 55:
- { jjCheckNAddTwoStates(55, 53); }
+ case 56:
+ if (curChar == 95)
+ jjstateSet[jjnewStateCnt++] = 57;
break;
case 58:
if (curChar == 95)
jjstateSet[jjnewStateCnt++] = 59;
break;
- case 60:
+ case 62:
if (curChar == 95)
jjstateSet[jjnewStateCnt++] = 61;
break;
- case 64:
- if (curChar == 95)
- jjstateSet[jjnewStateCnt++] = 63;
- break;
- case 65:
+ case 63:
if ((0x2000000020ULL & l) != 0L)
- { jjCheckNAddTwoStates(66, 67); }
+ { jjCheckNAddTwoStates(64, 65); }
break;
- case 68:
+ case 66:
if (curChar == 95)
- { jjCheckNAdd(67); }
+ { jjCheckNAdd(65); }
break;
- case 69:
+ case 67:
if (curChar == 95)
- jjstateSet[jjnewStateCnt++] = 70;
+ jjstateSet[jjnewStateCnt++] = 68;
break;
- case 72:
+ case 70:
if ((0x7fffffe07fffffeULL & l) != 0L)
- { jjCheckNAddStates(50, 52); }
+ { jjCheckNAddStates(54, 56); }
break;
- case 74:
+ case 72:
if ((0x7fffffe07fffffeULL & l) != 0L)
- { jjCheckNAddTwoStates(74, 75); }
+ { jjCheckNAddTwoStates(72, 73); }
break;
- case 76:
+ case 74:
if ((0x2000000020ULL & l) != 0L)
- { jjCheckNAddTwoStates(77, 78); }
+ { jjCheckNAddTwoStates(75, 76); }
break;
- case 79:
+ case 77:
if (curChar == 95)
- { jjCheckNAdd(78); }
+ { jjCheckNAdd(76); }
+ break;
+ case 81:
+ if ((0x7fffffffffffffffULL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 82;
+ break;
+ case 85:
+ if ((0x7fffffffffffffffULL & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 86;
break;
default : break;
}
@@ -3237,62 +3270,66 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
break;
if (kind > 6)
kind = 6;
- { jjAddStates(16, 20); }
+ { jjAddStates(20, 24); }
break;
case 9:
if (jjCanMove_1(hiByte, i1, i2, l1, l2))
- { jjAddStates(53, 54); }
+ { jjAddStates(64, 65); }
break;
case 15:
if (jjCanMove_1(hiByte, i1, i2, l1, l2))
- { jjAddStates(23, 24); }
+ { jjAddStates(27, 28); }
break;
- case 18:
+ case 26:
if (jjCanMove_1(hiByte, i1, i2, l1, l2))
- jjstateSet[jjnewStateCnt++] = 19;
+ { jjAddStates(66, 67); }
break;
case 28:
- if (jjCanMove_1(hiByte, i1, i2, l1, l2))
- { jjAddStates(55, 56); }
- break;
- case 30:
if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
break;
if (kind > 189)
kind = 189;
- { jjAddStates(57, 58); }
+ { jjAddStates(68, 69); }
break;
- case 33:
+ case 31:
if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
break;
if (kind > 7)
kind = 7;
- { jjAddStates(28, 30); }
+ { jjAddStates(32, 34); }
break;
- case 39:
+ case 37:
if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
break;
if (kind > 8)
kind = 8;
- { jjAddStates(31, 33); }
+ { jjAddStates(35, 37); }
+ break;
+ case 43:
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+ { jjCheckNAddTwoStates(43, 44); }
break;
case 45:
+ case 46:
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
- { jjCheckNAddTwoStates(45, 46); }
+ { jjCheckNAddTwoStates(46, 44); }
break;
- case 47:
- case 48:
+ case 50:
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
- { jjCheckNAddTwoStates(48, 46); }
+ { jjCheckNAddTwoStates(50, 51); }
break;
case 52:
+ case 53:
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
- { jjCheckNAddTwoStates(52, 53); }
+ { jjCheckNAddTwoStates(53, 51); }
break;
- case 54:
- case 55:
- if (jjCanMove_0(hiByte, i1, i2, l1, l2))
- { jjCheckNAddTwoStates(55, 53); }
+ case 81:
+ if (jjCanMove_1(hiByte, i1, i2, l1, l2))
+ jjstateSet[jjnewStateCnt++] = 82;
+ break;
+ case 85:
+ if (jjCanMove_1(hiByte, i1, i2, l1, l2))
+ jjstateSet[jjnewStateCnt++] = 86;
break;
default : if (i1 == 0 || l1 == 0 || i2 == 0 || l2 == 0) break; else break;
}
@@ -3305,7 +3342,7 @@ int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){
kind = 0x7fffffff;
}
++curPos;
- if ((i = jjnewStateCnt), (jjnewStateCnt = startsAt), (i == (startsAt = 81 - startsAt)))
+ if ((i = jjnewStateCnt), (jjnewStateCnt = startsAt), (i == (startsAt = 87 - startsAt)))
break;
if (input_stream->endOfInput()) { break; }
curChar = input_stream->readChar();
@@ -3357,12 +3394,12 @@ bool VhdlParserTokenManager::jjCanMove_1(int hiByte, int i1, int i2, unsigned lo
Token * VhdlParserTokenManager::jjFillToken(){
Token *t;
- JAVACC_STRING_TYPE curTokenImage;
+ JJString curTokenImage;
int beginLine = -1;
int endLine = -1;
int beginColumn = -1;
int endColumn = -1;
- JAVACC_STRING_TYPE im = jjstrLiteralImages[jjmatchedKind];
+ JJString im = jjstrLiteralImages[jjmatchedKind];
curTokenImage = (im.length() == 0) ? input_stream->GetImage() : im;
if (input_stream->getTrackLineColumn()) {
beginLine = input_stream->getBeginLine();
@@ -3373,8 +3410,8 @@ Token * VhdlParserTokenManager::jjFillToken(){
t = Token::newToken(jjmatchedKind);
t->kind = jjmatchedKind;
t->image = curTokenImage;
- t->specialToken = NULL;
- t->next = NULL;
+ t->specialToken = nullptr;
+ t->next = nullptr;
if (input_stream->getTrackLineColumn()) {
t->beginLine = beginLine;
@@ -3389,7 +3426,7 @@ const int defaultLexState = 0;
/** Get the next Token. */
Token * VhdlParserTokenManager::getNextToken(){
- Token *matchedToken;
+ Token *matchedToken = nullptr;
int curPos = 0;
for (;;)
@@ -3422,13 +3459,13 @@ Token * VhdlParserTokenManager::getNextToken(){
}
else
{
- SkipLexicalActions(NULL);
+ SkipLexicalActions(nullptr);
goto EOFLoop;
}
}
int error_line = input_stream->getEndLine();
int error_column = input_stream->getEndColumn();
- JAVACC_STRING_TYPE error_after;
+ JJString error_after;
bool EOFSeen = false;
if (input_stream->endOfInput()) {
EOFSeen = true;
@@ -3460,8 +3497,8 @@ void VhdlParserTokenManager::SkipLexicalActions(Token *matchedToken){
image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
{
QCString doc(image.data());
- int count=doc.contains("--!");
- parser->outlineParser()->setMultCommentLine();
+ int count=doc.contains("--!");
+ parser->outlineParser()->setMultCommentLine();
parser->outlineParser()->lineCount(image.data());
if (count == 1)
parser->outlineParser()->oneLineComment(doc);
@@ -3501,6 +3538,11 @@ void VhdlParserTokenManager::SkipLexicalActions(Token *matchedToken){
void VhdlParserTokenManager::TokenLexicalActions(Token *matchedToken){
switch(jjmatchedKind)
{
+ case 14 : {
+ image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
+ parser->outlineParser()->setLineParsed(ALIAS_T);
+ break;
+ }
case 17 : {
image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
parser->outlineParser()->setLineParsed(ARCHITECTURE_T);
@@ -3627,7 +3669,7 @@ void VhdlParserTokenManager::TokenLexicalActions(Token *matchedToken){
}
}
/** Reinitialise parser. */
- void VhdlParserTokenManager::ReInit(JAVACC_CHARSTREAM *stream, int lexState, VhdlParser *parserArg) {
+ void VhdlParserTokenManager::ReInit(JAVACC_CHARSTREAM *stream, int lexState) {
clear();
jjmatchedPos = jjnewStateCnt = 0;
curLexState = lexState;
@@ -3635,22 +3677,20 @@ void VhdlParserTokenManager::TokenLexicalActions(Token *matchedToken){
ReInitRounds();
debugStream = stdout; // init
SwitchTo(lexState);
- parser = parserArg;
errorHandler = new TokenManagerErrorHandler();
- errorHandlerCreated = true;
}
void VhdlParserTokenManager::ReInitRounds() {
int i;
jjround = 0x80000001;
- for (i = 81; i-- > 0;)
+ for (i = 87; i-- > 0;)
jjrounds[i] = 0x80000000;
}
/** Switch to specified lex state. */
void VhdlParserTokenManager::SwitchTo(int lexState) {
if (lexState >= 1 || lexState < 0) {
- JAVACC_STRING_TYPE message;
+ JJString message;
#ifdef WIDE_CHAR
message += L"Error: Ignoring invalid lexical state : ";
message += lexState; message += L". State unchanged.";
@@ -3664,11 +3704,11 @@ void VhdlParserTokenManager::TokenLexicalActions(Token *matchedToken){
}
/** Constructor. */
- VhdlParserTokenManager::VhdlParserTokenManager (JAVACC_CHARSTREAM *stream, int lexState, VhdlParser *parserArg)
+ VhdlParserTokenManager::VhdlParserTokenManager (JAVACC_CHARSTREAM *stream, int lexState)
+ : TokenParser()
{
- input_stream = NULL;
- errorHandlerCreated = false;
- ReInit(stream, lexState, parserArg);
+ input_stream = nullptr;
+ ReInit(stream, lexState);
}
// Destructor
@@ -3681,7 +3721,7 @@ void VhdlParserTokenManager::TokenLexicalActions(Token *matchedToken){
//Since input_stream was generated outside of TokenManager
//TokenManager should not take care of deleting it
//if (input_stream) delete input_stream;
- if (errorHandlerCreated) delete errorHandler;
+ if (errorHandler) delete errorHandler, errorHandler = nullptr;
}
diff --git a/vhdlparser/VhdlParserTokenManager.h b/vhdlparser/VhdlParserTokenManager.h
index 96a2449..2837737 100644
--- a/vhdlparser/VhdlParserTokenManager.h
+++ b/vhdlparser/VhdlParserTokenManager.h
@@ -7,79 +7,52 @@
#include "ErrorHandler.h"
#include "TokenManager.h"
#include "VhdlParserConstants.h"
-#include "VhdlParser.h"
+#include "vhdlstring.h"
+
namespace vhdl {
namespace parser {
class VhdlParser;
/** Token Manager. */
-class VhdlParserTokenManager : public TokenManager {
- public:
+class VhdlParserTokenManager : public TokenManager, public TokenParser {
+public:
- /** Debug output. */
FILE *debugStream;
- /** Set debug output. */
-
-void setDebugStream(FILE *ds);
-
+ void setDebugStream(FILE *ds);
int jjStopAtPos(int pos, int kind);
-
int jjMoveStringLiteralDfa0_0();
-
int jjMoveStringLiteralDfa1_0(unsigned long long active0, unsigned long long active1, unsigned long long active2);
-
int jjMoveStringLiteralDfa2_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1, unsigned long long old2, unsigned long long active2);
-
int jjMoveStringLiteralDfa3_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1, unsigned long long old2, unsigned long long active2);
-
int jjMoveStringLiteralDfa4_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa5_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa6_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa7_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa8_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa9_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa10_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa11_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa12_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa13_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa14_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa15_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa16_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1);
-
int jjMoveStringLiteralDfa17_0(unsigned long long old1, unsigned long long active1);
-
int jjMoveNfa_0(int startState, int curPos);
-
bool jjCanMove_0(int hiByte, int i1, int i2, unsigned long long l1, unsigned long long l2);
-
bool jjCanMove_1(int hiByte, int i1, int i2, unsigned long long l1, unsigned long long l2);
-
Token * jjFillToken();
-public: int curLexState;
-public: int jjnewStateCnt;
-public: int jjround;
-public: int jjmatchedPos;
-public: int jjmatchedKind;
-
+public:
+ int curLexState;
+ int jjnewStateCnt;
+ int jjround;
+ int jjmatchedPos;
+ int jjmatchedKind;
Token * getNextToken();
-
void SkipLexicalActions(Token *matchedToken);
-
void TokenLexicalActions(Token *matchedToken);
#define jjCheckNAdd(state)\
{\
@@ -111,31 +84,33 @@ void TokenLexicalActions(Token *matchedToken);
#ifndef JAVACC_CHARSTREAM
#define JAVACC_CHARSTREAM CharStream
#endif
- private: VhdlParser*parser;
- private: void ReInitRounds();
- public: VhdlParserTokenManager(JAVACC_CHARSTREAM *stream, int lexState = 0, VhdlParser *parserArg = NULL);
- public: virtual ~VhdlParserTokenManager();
- void ReInit(JAVACC_CHARSTREAM *stream, int lexState = 0, VhdlParser *parserArg = NULL);
+
+private:
+ void ReInitRounds();
+
+public:
+ VhdlParserTokenManager(JAVACC_CHARSTREAM *stream, int lexState = 0);
+ virtual ~VhdlParserTokenManager();
+ void ReInit(JAVACC_CHARSTREAM *stream, int lexState = 0);
void SwitchTo(int lexState);
void clear();
- const JAVACC_SIMPLE_STRING jjKindsForBitVector(int i, unsigned long long vec);
- const JAVACC_SIMPLE_STRING jjKindsForStateVector(int lexState, int vec[], int start, int end);
+ const JJSimpleString jjKindsForBitVector(int i, unsigned long long vec);
+ const JJSimpleString jjKindsForStateVector(int lexState, int vec[], int start, int end);
+
JAVACC_CHARSTREAM* input_stream;
- int jjrounds[81];
- int jjstateSet[2 * 81];
- JAVACC_STRING_TYPE jjimage;
- JAVACC_STRING_TYPE image;
+ int jjrounds[87];
+ int jjstateSet[2 * 87];
+ JJString jjimage;
+ JJString image;
int jjimageLen;
int lengthOfMatch;
- JAVACC_CHAR_TYPE curChar;
- TokenManagerErrorHandler* errorHandler;
- bool errorHandlerCreated;
+ JJChar curChar;
+ TokenManagerErrorHandler* errorHandler = nullptr;
public:
void setErrorHandler(TokenManagerErrorHandler *eh) {
- if (errorHandlerCreated && errorHandler != NULL) delete errorHandler;
+ if (errorHandler) delete errorHandler, errorHandler = nullptr;
errorHandler = eh;
- errorHandlerCreated = false;
}
};
diff --git a/vhdlparser/vhdl_adj.py b/vhdlparser/vhdl_adj.py
new file mode 100644
index 0000000..a431970
--- /dev/null
+++ b/vhdlparser/vhdl_adj.py
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+# python script to generate configoptions.cpp and config.doc from config.xml
+#
+# Copyright (C) 1997-2020 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+
+import sys
+
+def main():
+ inputFile = open(sys.argv[1], 'r')
+ outputFile = open(sys.argv[2], 'w')
+ for line in inputFile:
+ outputFile.write(line.replace("assert(false);","assert(false);return \"\";"))
+
+if __name__ == '__main__':
+ main()
+
diff --git a/vhdlparser/vhdlparser.jj b/vhdlparser/vhdlparser.jj
index 7b3f5e7..e263289 100644..100755
--- a/vhdlparser/vhdlparser.jj
+++ b/vhdlparser/vhdlparser.jj
@@ -15,8 +15,10 @@ options {
NAMESPACE = "vhdl::parser";
STATIC=false;
PARSER_INCLUDES="vhdljjparser.h";
- TOKEN_MANAGER_INCLUDES="VhdlParser.h";
-
+ TOKEN_MANAGER_INCLUDES="vhdlstring.h";
+ // TOKEN_MANAGER_USES_PARSER = true;
+ TOKEN_MANAGER_SUPER_CLASS = "TokenParser";
+ // DEBUG_PARSER = true;
//OUTPUT_DIRECTORY = ".";
//DEBUG_PARSER=true;
//DEBUG_LOOKAHEAD=true;
@@ -52,6 +54,9 @@ VHDLOutlineParser *outlineParser() const { return m_outlineParser; }
void setSharedState(SharedState *s) { m_sharedState=s; }
void clearError() { hasError = false; }
+
+
+
//typedef unsigned long long uint64;
//----------------------------------------
@@ -99,8 +104,8 @@ SKIP:
{
{
QCString doc(image.data());
- int count=doc.contains("--!");
- parser->outlineParser()->setMultCommentLine();
+ int count=doc.contains("--!");
+ parser->outlineParser()->setMultCommentLine();
parser->outlineParser()->lineCount(image.data());
if (count == 1)
parser->outlineParser()->oneLineComment(doc);
@@ -138,7 +143,7 @@ TOKEN [IGNORE_CASE] :
<ABS_T: "abs">
| <ACCESS_T: "access">
| <AFTER_T: "after">
-| <ALIAS_T: "alias">
+| <ALIAS_T: "alias"> {parser->outlineParser()->setLineParsed(ALIAS_T);}
| <ALL_T: "all">
| <AND_T: "and">
| <ARCHITECTURE_T: "architecture"> {parser->outlineParser()->setLineParsed(ARCHITECTURE_T);}
@@ -316,7 +321,7 @@ TOKEN:
| < #LETTER: (<UPPER_CASE_LETTER>|<LOWER_CASE_LETTER>) >
| < #UPPER_CASE_LETTER: ["A"-"Z"] >
| <BIT_STRING_LITERAL : (<DIGIT>)*<BASE_SPECIFIER>["\""](<LETTER_OR_DIGIT_OR_STD>((["_"])*<LETTER_OR_DIGIT_OR_STD>)*)["\""] >
- | <#BASE_SPECIFIER:["B","O","X","b","o","x","d","D"]>
+ | <#BASE_SPECIFIER: (<DIGIT>)*(["S","U"])*["B","O","X","b","o","x","d","D"] >
| <#STD_LOGIC:["0","1","L","H","X","Z","W","-","l","h","x","z","w"]>
| < #DIGIT: ["0"-"9"] >
| < #SPECIAL_CHARACTER: ["#","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","_","|"] >
@@ -325,6 +330,7 @@ TOKEN:
| < #LOWER_CASE_LETTER: ["a"-"z"] >
| < #QUOTE: ["\""] >
| <VHDL2008TOOLDIR : ["`"](<GRAPHIC_CHARACTER>|<STRINGLITERAL>)+ >
+ | <SPEC_ATTR: (["'"]["("]["'"](<GRAPHIC_CHARACTER>)["'"]) >
}
@@ -342,6 +348,7 @@ QCString access_type_definition() :
tok=<ACCESS_T> str1=subtype_indication() { str=tok->image.c_str(); return str+str1; }
}
+
QCString actual_designator() :
{QCString str;Token *t=0;}
{
@@ -349,11 +356,13 @@ t=<OPEN_T> { return t->image.c_str(); }
|
LOOKAHEAD(expression())
str=expression() { return str; }
-|
- LOOKAHEAD(name())
- str=name() { return str; }
+ |
+ str=identifier(){return str;}
}
+
+
+
QCString actual_parameter_part() :
{QCString s;}
{
@@ -368,6 +377,7 @@ QCString actual_part() :
|
<BOX_T> { return "<>";}
|
+ LOOKAHEAD(name() <LPAREN_T>)
s=name() <LPAREN_T> s1=actual_designator() <RPAREN_T> {s+="(";s+=s1+")";return s;}
}
@@ -452,11 +462,11 @@ void architecture_statement_part() : {}
QCString array_type_definition (): { QCString s;}
{
- LOOKAHEAD(unconstraint_array_definition())
-
- s=unconstraint_array_definition() {return s;}
- | s=constraint_array_definition() {return s;}
-
+ LOOKAHEAD(<ARRAY_T> index_constraint() <OF_T>)
+ s=constraint_array_definition() {return s;}
+ |
+ s=unconstraint_array_definition() {return s;}
+
}
QCString assertion() : {QCString s,s1,s2;Token *t=0;Token *t1=0;}
@@ -504,11 +514,11 @@ QCString attribute_designator (): {QCString s;Token *tok=0;}
| tok=<RANGE_T> { return tok->image.c_str(); }
}
+
QCString attribute_name (): {QCString s,s1;}
{
- s=identifier() <APOSTROPHE_T> s1=name(){ s+="'"+s1; }[LOOKAHEAD(1)<LPAREN_T>s1=expression() <RPAREN_T> {s+"("+s1+")";}] { return s; }
-}
-
+ s=identifier() <APOSTROPHE_T> (<RANGE_T> | s1=name()) { s+=s1; }[LOOKAHEAD(1)<LPAREN_T>s1=expression() <RPAREN_T> {s+=s1;}] { return s; }
+ }
QCString attribute_specification(): {QCString s,s1,s2;}
{
@@ -580,7 +590,6 @@ void block_configuration() : {}
void block_declarative_item (): {}
{
subprogram_declaration()
-//| subprogram_body()
| type_declaration()
| subtype_declaration()
| constant_declaration()
@@ -616,7 +625,7 @@ void block_header() : {}
void block_specification() : {}
{
- name()[LOOKAHEAD(1) <LPAREN_T> index_specification() <RPAREN_T>]
+ name() [ <LPAREN_T> index_specification() <RPAREN_T> ]
}
void block_statement() : {QCString s;}
@@ -640,7 +649,7 @@ void block_statement_part() : {}
void case_statement() : {QCString s;}
{
-[ identifier() <COLON_T> ]
+[ identifier() [<Q_T>] <COLON_T> ]
<CASE_T> s=expression()
{
QCString ca="case "+s;
@@ -653,7 +662,7 @@ void case_statement() : {QCString s;}
{
FlowChart::moveToPrevLevel();
FlowChart::addFlowChart(FlowChart::END_CASE,"end case",0);
- }
+ }
}
void case_statement_alternative() : {QCString s;}
@@ -674,17 +683,20 @@ QCString character_literal() : {Token *tok=0;}
QCString choice() : {QCString s;}
{
- LOOKAHEAD(discrete_range())
- s=discrete_range(){ return s; }
+ LOOKAHEAD(simple_expression() direction ())
+ s=range() { return s;}
|
LOOKAHEAD(simple_expression())
s=simple_expression(){ return s; }
+ |
+ LOOKAHEAD(discrete_range())
+ s=discrete_range(){ return s; }
|
- LOOKAHEAD(identifier())
- s=identifier(){ return s; }
+ s=identifier(){ return s; }
| <OTHER_T> { return " others "; }
}
+
QCString choices() : {QCString s,s1;}
{
s=choice() (<BAR_T> s1=choice(){s+="|";s+=s1;})* { return s; }
@@ -714,7 +726,7 @@ void component_declaration() : {QCString s;}
void component_instantiation_statement() : {QCString s,s1;}
{
-s=identifier() <COLON_T>
+ s=identifier() <COLON_T>
s1=instantiation_unit()
{
QCString s3;
@@ -771,7 +783,7 @@ block_statement()
LOOKAHEAD([identifier() ":"] [<POSTPONED_T>] <PROCESS_T>)
process_statement()
|
-LOOKAHEAD(generate_statement())
+LOOKAHEAD(3)
generate_statement()
|
case_scheme()
@@ -788,12 +800,7 @@ component_instantiation_statement()
LOOKAHEAD(concurrent_procedure_call_statement())
concurrent_procedure_call_statement()
| <VHDL2008TOOLDIR>
- /*
- catch( ParseException e )
- {
- outlineParser()->error_skipto(SEMI_T, "syntax error in declarative item");
- }
- */
+
}
QCString condition() : {QCString s;}
@@ -823,13 +830,7 @@ waveform()
[ <WHEN_T> condition() ]
}
-// ( waveform() < WHEN_T> condition() <ELSE_T> )*
-// waveform() [ <WHEN_T> condition() ]
-//waveform()
- // ( LOOKAHEAD( <WHEN> condition() <ELSE>)
- // <WHEN> condition() <ELSE> waveform() )*
- //[ <WHEN> condition() ]
void configuration_declaration() : {QCString s,s1;}
{
@@ -888,9 +889,10 @@ QCString constraint_array_definition (): {QCString s,s1;}
<ARRAY_T> s=index_constraint() <OF_T> s1=subtype_indication(){ return s+" "+s1;}
}
+
void context_clause (): {}
{
- (context_item())*
+ (LOOKAHEAD(3) context_item())*
}
QCString constraint () :{QCString s;}
@@ -906,6 +908,8 @@ void context_item() : {}
{
library_clause()
| use_clause()
+| LOOKAHEAD(context_declaration()) context_declaration()
+| context_ref()
}
QCString decimal_literal() : {Token *tok=0;}
@@ -973,15 +977,21 @@ return s1;
}
}
-QCString element_declaration() : {QCString s,s1;}
+QCString element_declaration() : {QCString rec_name,s1,s2;}
{
-s=identifier_list() <COLON_T> s1=subtype_indication() <SEMI_T>
+rec_name=identifier_list() <COLON_T> s1=subtype_indication() <SEMI_T>
{
-
- outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::RECORD,0,s1.data(),Public);
- //outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s1.data(),Public);
- return s+":"+s1;
-}
+ QCString name;
+ QCStringList ql=QCStringList::split(",",rec_name);
+ for (uint j=0;j<ql.count();j++)
+ {
+ name=ql[j]+"~";
+ name+=outlineParser()->getNameID().data();;
+ outlineParser()->addVhdlType(name.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::RECORD,0,s1.data(),Public);
+ }
+ s2=rec_name+":"+s1;
+ return s2;
+ }
}
@@ -1085,13 +1095,15 @@ void entity_header() : {}
[ { m_sharedState->currP=VhdlDocGen::PORT; } port_clause()]
}
-QCString entity_name_list() : {QCString s,s1;}
+QCString entity_name_list() : {QCString s,s1,s2;}
{
-(s1=entity_designator() {s+=s1;})+ { return s;}
+(s1=entity_designator() ) (<COMMA_T> s=entity_designator() { s2+=s; } )* { return s2;}
| <OTHER_T> { return "other";}
| <ALL_T> {return "all";}
}
+
+
QCString entity_specification() : {QCString s,s1;}
{
s=entity_name_list() <COLON_T> s1=entity_class(){ return s+":"+s1;}
@@ -1172,6 +1184,9 @@ QCString factor(): {QCString s,s1;}
s=primary() [LOOKAHEAD(1) <DOUBLEMULT_T> s1=primary(){ s+="**";s+=s1;} ] { return s;}
| <ABS_T> s=primary(){ s1 = "abs "; return s1+s; }
| <NOT_T> s=primary(){s1="not ";return s1+s;}
+| <QQ_T> s=primary(){s1="?? ";return s1;}
+| s=logop() s1=primary() { return s;}
+
}
QCString file_declaration() : {QCString s,s1,s2,s3;}
@@ -1191,7 +1206,7 @@ QCString file_logical_name(): {QCString s;}
QCString file_open_information() : {QCString s,s1,s2;}
{
- [ <OPEN_T> s=expression() ] <IS_T> s1=file_logical_name() {s2="open "+s+" is "+s1; return s2; }
+ [ <OPEN_T> s=expression() ] <IS_T> [inout_stat()] s1=file_logical_name() {s2="open "+s+" is "+s1; return s2; }
}
QCString file_type_definition() : {QCString s,s1;}
@@ -1228,31 +1243,26 @@ QCString full_type_declaration() : { std::shared_ptr<Entry> tmpEntry;QCString s
tmpEntry=m_sharedState->current;
outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::RECORD,0,0,Public);
}
- try
- {
- s2=type_definition()
- }
- catch(...)
- { outlineParser()->error_skipto(SEMI_T); }
+
+ s2=type_definition()
+
<SEMI_T>
{
- if (s2.contains("#")) {
+ if (s2.contains("#")) {
VhdlDocGen::deleteAllChars(s2,'#');
tmpEntry->spec=VhdlDocGen::RECORD;
tmpEntry->type=s2.data();
- //outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(TYPE_T),Entry::VARIABLE_SEC,VhdlDocGen::RECORD,0,s2.data(),Public);
}
else if (s2.contains("%")) {
VhdlDocGen::deleteAllChars(s2,'%');
tmpEntry->spec=VhdlDocGen::UNITS;
tmpEntry->type=s2.data();
- //outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(TYPE_T),Entry::VARIABLE_SEC,VhdlDocGen::UNITS,s2.data(),s2.data(),Public);
- }
+ }
else {
tmpEntry->spec=VhdlDocGen::TYPE;
tmpEntry->type=s2.data();
- //outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(TYPE_T),Entry::VARIABLE_SEC,VhdlDocGen::TYPE,0,s2.data(),Public);
}
+
tmpEntry.reset();
return "type "+s+" is "+s2+";";
}
@@ -1278,7 +1288,7 @@ s=identifier() <COLON_T>
void generate_scheme() : {}
{
<FOR_T> parameter_specification()
-| <IF_T> condition()
+| <IF_T> [LOOKAHEAD(2) identifier() <COLON_T> ] condition()
}
void generic_clause() : {QCString s;}
@@ -1336,7 +1346,7 @@ QCString identifier() : {Token *tok=0;}
QCString identifier_list() : {QCString str,str1;}
{
- str=identifier() (<COMMA_T> str1=identifier() {str+=",";str+=str1;})* { return str; }
+ str=name() (<COMMA_T> str1=name() {str+=",";str+=str1;})* { return str; }
}
void if_statement() : {QCString s,s1;}
@@ -1394,7 +1404,7 @@ QCString index_subtype_definition() : {QCString s;}
s=type_mark() <RANGE_T> <BOX_T> { return s+" range <> ";}
}
-QCString instantiation_unit() : {QCString s,s1,s2;Token *tok;}
+QCString instantiation_unit() : {QCString s,s1,s2;}
{
[ <COMPONENT_T> ] s=identifier() {s1="component "; return s; }
| <ENTITY_T> [LOOKAHEAD(2)<BASIC_IDENTIFIER> <DOT_T>] s2=name() {s="entity|"+s2;} [ <LPAREN_T> s1=identifier() <RPAREN_T> {s+="(";s+=s1;s+=")" ;}] { return s;}
@@ -1423,8 +1433,9 @@ QCString interface_declaration() : {QCString s,s1;}
LOOKAHEAD(5)
s=interface_subprogram_declaration() { return s;}
-
-|interface_package_declaration() { return s;}
+|
+LOOKAHEAD(5)
+interface_package_declaration() { return s;}
|
LOOKAHEAD(5)
s=interface_variable_declaration() { return s;}
@@ -1542,7 +1553,7 @@ QCString library_unit() : {QCString s;}
LOOKAHEAD(2)
primary_unit() { return s; }
| secondary_unit() { return s; }
-| context_declaration()
+
}
@@ -1614,15 +1625,17 @@ tok=<MULT_T> { return tok->image.c_str(); }
}
- QCString name() : {QCString s,s1;}
+QCString name() : {QCString s,s1;}
{
(
- s=operator_symbol()
- | s=identifier()| s=external_name()
+ s=operator_symbol() [LOOKAHEAD(name_ext1()) s1=name_ext1(){ s+=s1;}] { return s; }
+ |s=external_name() [LOOKAHEAD(name_ext1()) s1=name_ext1(){ s+=s1;}] { return s; }
+ | s=identifier() [LOOKAHEAD(name_ext1()) s1=name_ext1(){ s+=s1;}] { return s; }
)
- [LOOKAHEAD(name_ext1()) s1=name_ext1(){ s+=s1;}] { return s; }
+
}
+
QCString name_ext1() : {QCString s,s1,s2;}
{
s=name_ext() (LOOKAHEAD(name_ext()) s1=name_ext(){s+=s1;})* { return s;}
@@ -1633,22 +1646,22 @@ QCString name_ext1() : {QCString s,s1,s2;}
(
LOOKAHEAD(<APOSTROPHE_T><SUBTYPE_T>)
- <APOSTROPHE_T><SUBTYPE_T>{s+="'subtype";}
+ <APOSTROPHE_T><SUBTYPE_T>{s+="'subtype"; return s;}
|
LOOKAHEAD(<DOT_T> suffix())
- <DOT_T> s1=suffix(){s+=".";s+=s1;}
+ <DOT_T> s1=suffix(){s+=".";s+=s1; return s;}
|
LOOKAHEAD(test_att_name())
- s1=test_att_name() { s+=s1;}
+ s1=test_att_name() { s+=s1;return s;}
|
LOOKAHEAD( <LPAREN_T> discrete_range() <RPAREN_T>)
- <LPAREN_T> s1=discrete_range() <RPAREN_T> {s+="(";s+=s1;s+=")";}
+ <LPAREN_T> s1=discrete_range() <RPAREN_T> {s+="(";s+=s1;s+=")";return s;}
|
LOOKAHEAD( "(" expression() ("," expression() )* ")" )
- <LPAREN_T> s1=expression() {s+="(";s+=s1;} (LOOKAHEAD(1) <COMMA_T> s1=expression(){s+=",";s+=s1;})* <RPAREN_T> { s+=")";}
+ <LPAREN_T> s1=expression() {s+="(";s+=s1;} (LOOKAHEAD(1) <COMMA_T> s1=expression(){s+=",";s+=s1;})* <RPAREN_T> { s+=")";return s;}
)
- {return s;}
+
}
QCString test_att_name() : {QCString s,s1;}
@@ -1666,8 +1679,8 @@ QCString name_ext1() : {QCString s,s1,s2;}
QCString next_statement() : {QCString s,s1,s2;Token *t=0;Token *t1=0;}
{
-[LOOKAHEAD(1) s=identifier() t=<COLON_T> ] <NEXT_T> [ s1=identifier() ]
-[LOOKAHEAD(1) t1=<WHEN_T> s2=condition() ] <SEMI_T>
+[ s=identifier() t=<COLON_T> ] <NEXT_T> [ s1=identifier() ]
+[ t1=<WHEN_T> s2=condition() ] <SEMI_T>
{
if(t) s+=":";
FlowChart::addFlowChart(FlowChart::NEXT_NO,"next ",s2.data(),s1.data());
@@ -1726,7 +1739,7 @@ void package_body() : {QCString s;}
void package_body_declarative_item() : {}
{
subprogram_declaration()
-//| subprogram_body()
+
| type_declaration()
| subtype_declaration()
| constant_declaration()
@@ -1745,6 +1758,12 @@ void package_body_declarative_part() : {}
(package_body_declarative_item() )*
}
+void package_header(): {QCString s;}
+{
+ [ generic_clause() [ generic_map_aspect() <SEMI_T> ] ]
+}
+
+
void package_declaration(): {QCString s;}
{
@@ -1761,6 +1780,7 @@ void package_declaration(): {QCString s;}
m_sharedState->current_root->moveToSubEntryAndKeep(clone);
outlineParser()->addVhdlType(s,outlineParser()->getLine(PACKAGE_T),Entry::CLASS_SEC,VhdlDocGen::PACKAGE,0,0,Package);
}
+ package_header()
package_declarative_part()
<END_T> [ <PACKAGE_T>] [ name() ] <SEMI_T>
{ m_sharedState->lastEntity=0;m_sharedState->lastCompound=0; m_sharedState->genLabels.resize(0); }
@@ -1773,8 +1793,7 @@ void geninter():{}
void package_declarative_item() : {}
{
-//LOOKAHEAD(3)
-//interface_subprogram_declaration()
+
subprogram_declaration()
| type_declaration()
| subtype_declaration()
@@ -1816,15 +1835,15 @@ QCString physical_literal() : {QCString s,s1;}
[LOOKAHEAD(abstract_literal()) s=abstract_literal()] s1=name(){s+=" ";s+=s1;s.prepend(" "); return s;}
}
-QCString physical_type_definition() : {QCString s,s1,s2;}
+QCString physical_type_definition() : {QCString s,s1,s2;Token *t=0;}
{
- <UNITS_T>
- s=identifier()<SEMI_T> { outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::UNITS,0,0,Public);}
+ t=<UNITS_T>
+ s=identifier()<SEMI_T> { outlineParser()->addVhdlType(s.data(),t->beginLine,Entry::VARIABLE_SEC,VhdlDocGen::UNITS,0,0,Public);}
(
s1=secondary_unit_declaration()
)*
<END_T> <UNITS_T> [name()]
- { return s+"%";}
+ { return s;}
}
@@ -1863,6 +1882,7 @@ s=literal() { s.prepend(" ");return s;}
LOOKAHEAD(name())
s=name() { return s;}
|
+LOOKAHEAD(allocator())
allocator() { return "";}
|
s=aggregate() { return s; }
@@ -1880,6 +1900,7 @@ package_instantiation_declaration()
LOOKAHEAD(4)
interface_package_declaration()
| package_declaration()
+| context_declaration()
}
@@ -1923,37 +1944,35 @@ QCString process_declarative_part() :{QCString s,s1;}
( s1=process_declarative_item(){s+=s1;} )* { return s;}
}
-void process_statement() : {QCString s,s1,s2;Token *tok=0;}
+void process_statement() : {QCString s,s1,s2;Token *tok=0;Token *tok1=0;}
{
[ s=identifier() <COLON_T> ]
-[ <POSTPONED_T> ]
+[ <POSTPONED_T> ] tok1=<PROCESS_T>
{
- m_sharedState->currP=VhdlDocGen::PROCESS;
- m_sharedState->current->startLine=outlineParser()->getLine();
- m_sharedState->current->bodyLine=outlineParser()->getLine();
- }
- <PROCESS_T>
- //try{
- [ <LPAREN_T> (tok=<ALL_T> | s1=sensitivity_list()) <RPAREN_T> ] [ <IS_T> ]
+ m_sharedState->currP=VhdlDocGen::PROCESS;
+ m_sharedState->current->startLine=tok1->beginLine;
+ m_sharedState->current->bodyLine=tok1->beginLine;
+ }
+
+ [ <LPAREN_T> (s1=sensitivity_list() ) <RPAREN_T>] [ <IS_T> ]
s2=process_declarative_part()
{
if (s2.data())
- FlowChart::addFlowChart(FlowChart::VARIABLE_NO,s2.data(),0);
+ FlowChart::addFlowChart(FlowChart::VARIABLE_NO,s2.data(),0);
FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0);
- }
+ }
<BEGIN_T>
process_statement_part()
<END_T> [ <POSTPONED_T> ]
- // }catch(...){outlineParser()->error_skipto(PROCESS_T);}
- <PROCESS_T> [ identifier() ] <SEMI_T>
+ <PROCESS_T> [ identifier() ] <SEMI_T>
{
if(s.isEmpty())
m_sharedState->currName=VhdlDocGen::getProcessNumber();
else
m_sharedState->currName=s;
-
m_sharedState->current->name=m_sharedState->currName;
m_sharedState->tempEntry=m_sharedState->current;
+ m_sharedState->tempEntry->type="";
m_sharedState->current->endBodyLine=outlineParser()->getLine();
m_sharedState->currP=0;
if(tok)
@@ -2018,6 +2037,13 @@ QCString relation_operator() : {}
|<GREATERTHAN_T> {return ">=";}
|<LESSTHAN_T> {return "<=";}
|<NOTEQU_T> {return "/=";}
+ |<QGT_T> { return "?>=";}
+ |<QLT_T> { return "?<=";}
+ |<QG_T> { return "?>";}
+ |<QL_T> { return "?<";}
+ |<QEQU_T> { return "?=";}
+ |<QNEQU_T> {return "?/="; }
+
}
@@ -2042,9 +2068,9 @@ QCString return_statement() : {QCString s,s1;}
QCString scalar_type_definition() : {QCString s,s1;}
{
-
+LOOKAHEAD(enumeration_type_definition())
s=enumeration_type_definition(){ return s;}
-| s=range_constraint() [LOOKAHEAD( physical_type_definition()) s1=physical_type_definition()] { return s+" "+s1+"%";}
+| s=range_constraint() [ s1=physical_type_definition()] { return s+" "+s1;}
}
void secondary_unit() : {}
@@ -2053,14 +2079,12 @@ architecture_body()
| package_body()
}
-QCString secondary_unit_declaration() : {QCString s,s1;}
+QCString secondary_unit_declaration() : {QCString s,s1;Token *t1=0;}
{
-s=identifier() <EQU_T> s1=physical_literal() <SEMI_T>
+s=identifier() t1=<EQU_T> s1=physical_literal() <SEMI_T>
{
- //printf("\n %s %s [%d]",s.data(),s1.data(),outlineParser()->getLine());
- outlineParser()->addVhdlType(s.data(),outlineParser()->getLine(),Entry::VARIABLE_SEC,VhdlDocGen::UNITS,0,s1.data(),Public);
-
- return s+"="+s1; }
+ outlineParser()->addVhdlType(s.data(),t1->beginLine,Entry::VARIABLE_SEC,VhdlDocGen::UNITS,0,s1.data(),Public);
+ return s+"="+s1; }
}
QCString selected_name() : {QCString s,s1;}
@@ -2089,8 +2113,10 @@ QCString sensitivity_clause() : {QCString s;}
}
}
-QCString sensitivity_list() : {QCString s,s1;}
+QCString sensitivity_list() : {QCString s,s1;Token* tok=0;}
{
+ tok=<ALL_T> { if(tok) return "all" ;}
+ |
s=name() (<COMMA_T> s1=name(){s+=",";s+=s1;} )* { return s;}
}
@@ -2357,11 +2383,17 @@ QCString subtype_declaration() : {QCString s,s1;}
}
}
+QCString reslution_indication(): {QCString s;}
+{
+ <LPAREN_T> s=expression() <RPAREN_T> { return "("+s+")"; }
+ // |s=name() { return s;}
+}
+//[LOOKAHEAD (reslution_indication()) s=reslution_indication()]
+// [ resolution_indication ] type_mark [ constraint ]
QCString subtype_indication() : {QCString s,s1,s2;}
{
- s=name()
- [LOOKAHEAD (name()) s1=name()] [LOOKAHEAD(constraint() ) s2=constraint()]
- { return s+" "+s1+" "+s2; }
+ [LOOKAHEAD(5) s=reslution_indication()] (s1=name())+ [LOOKAHEAD(constraint() ) s2=constraint()]
+ {return s+" "+s1+" "+s2;}
}
QCString suffix() : { QCString s; }
@@ -2579,9 +2611,9 @@ void protected_type_declarative_part() : {}
// VHDL 2008
// -----------------------------------------------------------------
-QCString context_ref() : {QCString s;}
+QCString context_ref() : {QCString s, s1;}
{
- <CONTEXT_T> s=identifier_list() <SEMI_T>
+ <CONTEXT_T> s=identifier() (<DOT_T> s1=identifier() {s+=".";s+=s1;} )* <SEMI_T>
{
return "context "+s ;
}
@@ -2673,17 +2705,31 @@ void ttend(): {}
void generate_statement_body() : {}
{
- <BEGIN_T> generate_statement_body()
+ [(LOOKAHEAD(block_declarative_item())block_declarative_item() )* <BEGIN_T>] (concurrent_statement())*
}
void generate_statement_body1() : {}
{
- // [LOOKAHEAD(block_declarative_item()<BEGIN_T> )(block_declarative_item() )* <BEGIN_T>] (concurrent_statement())*
+ generate_statement_body() generate_scheme_1() [generate_scheme_2()]
+}
+
+void generate_scheme_1() : {}
+{
+ ( generate_scheme_3())*
+}
+
+void generate_scheme_2() : {}
+{
+<ELSE_T> [LOOKAHEAD(2) identifier() <COLON_T> ] <GENERATE_T> generate_statement_body()
+}
- [(LOOKAHEAD(block_declarative_item())block_declarative_item() )* <BEGIN_T>] (concurrent_statement())*
- // | (concurrent_statement())*
+void generate_scheme_3() : {}
+{
+ <ELSIF_T>[LOOKAHEAD(2) identifier() <COLON_T> ] expression() <GENERATE_T> generate_statement_body()
}
+
+
QCString external_name(): {QCString s,s1,s2;}
{
<SLSL_T> s=sig_stat() s1=external_pathname() <COLON_T> s2=subtype_indication() <RSRS_T>
diff --git a/vhdlparser/vhdlstring.h b/vhdlparser/vhdlstring.h
index 4c64440..59e9e22 100644..100755
--- a/vhdlparser/vhdlstring.h
+++ b/vhdlparser/vhdlstring.h
@@ -5,6 +5,26 @@
#include <stdlib.h>
#include <string.h>
+#include "VhdlParser.h"
+// super class for VhdlParserTokenManager
+// is generated in vhdlparser.jj
+// -option TOKEN_MANAGER_SUPER_CLASS = "TokenParser"
+// sets the Vhdlparser in vhdljjparser.cpp
+// tokenManager->setLexParser(vhdlParser);
+
+namespace vhdl {
+ namespace parser {
+ class TokenParser {
+ public:
+ VhdlParser* parser = nullptr;
+ void setLexParser(VhdlParser* p)
+ {
+ parser = p;
+ }
+ };
+ }
+}
+
/** @brief Minimal string class with std::string like behaviour that fulfills the JavaCC
* string requirements.
@@ -38,7 +58,7 @@ class VhdlString
}
VhdlString(const char *s)
{
- m_len = strlen(s);
+ m_len = (int)strlen(s);
m_str=(char*)malloc(m_len+1);
memcpy(m_str,s,m_len+1);
}
@@ -67,7 +87,7 @@ class VhdlString
}
VhdlString& append(const char *s)
{
- return append(s,strlen(s));
+ return append(s,(int)strlen(s));
}
VhdlString& append(const VhdlString &other)
{
@@ -103,9 +123,6 @@ class VhdlString
int m_len;
};
-// declare it static otherwise we will get:
-// multiple definition of `operator+(char const*, VhdlString)'
-// as we are in an include file
-static VhdlString operator+ (const char *s, VhdlString v) { return VhdlString(s).append(v); }
+inline VhdlString operator+ (const char *s, VhdlString v) { return VhdlString(s).append(v); }
#endif